[
  {
    "path": ".gitignore",
    "content": "*.iml\ngradle.properties\n.gradle\n/.idea\n/local.properties\n/greencoffee/build\n/build"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\nAll notable changes to this project are documented in this file.\n\n## [3.6.0] - 2021-02-15\n### Changed\n- Removed JCenter support\n\n## [3.5.0] - 2018-10-01\n### Changed\n- Updated dependencies and build tools\n\n## [3.3.0] - 2018-08-23\n### Changed\n- Updated screenshot interface to allow to pass a custom screenshot provider\n\n## [3.2.1] - 2018-04-13\n### Changed\n- Updated screenshot parameter from path to boolean. When set to `true`, screenshots will be placed in the folder `Android/data/your_package/files/screenshots`\n### Removed\n- Method `grantPermission`. Use `GrantPermissionRule` instead\n\n## [3.0.0] - 2018-02-12\n### Changed\n- Updated to Java 8\n- Updated Android build tools, compile version and Gradle version\n- Updated visibility of some classes and methods\n- Some constructor parameters of the class `ScenarioConfig` are optional\n\n## [2.9.0] - 2017-09-18\n### Changed\n- Using Espresso `3.0.1`\n\n## [2.8.1] - 2017-07-06\n### Added\n- Added method `text()` to `ActionableObject`\n- Added method `onViewWithAll(Matcher<? super View>... matchers)`\n- Added class `TimedIdlingResource`\n\n## [2.8.0] - 2017-07-05\n### Added\n- Added boolean methods for actionable elements\n- Improved data matchers\n\n## [2.7.0] - 2017-07-04\n### Added\n- Added methods `waitFor(long millis)` and `waitFor(long value, TimeUnit timeUnit)`\n- Added class `SpinnerMatcher`\n\n## [2.6.0] - 2017-04-28\n### Added\n- Improvements in `ActionableView` (by @thanhlcm90)\n- Added callback `afterScenarioEnds(Scenario scenario, Locale locale)`\n- Added method `grantPermission(String permission)`\n\n## [2.5.0] - 2017-04-26\n### Added\n- Improvements in `ActionableView` (by @thanhlcm90)\n\n## [2.4.0] - 2017-04-02\n### Changed\n- Using Gradle plugin version 2.3.0\n- Overridden method `toString()` for class `ScenarioConfig` \n\n## [2.2.0] - 2017-03-17\n### Removed\n- Unused third party libraries\n\n## [2.1.1] - 2017-03-02\n### Added\n- Added the helper methods `closeKeyboard()` and `pressBack()`\n- Added method `beforeScenarioStarts(Scenario scenario, Locale locale)`\n\n## [2.0.1] - 2017-02-24\n### Added\n- Support to launch the scenarios with different locales\n- Support to take screenshots during the tests\n- This CHANGELOG\n\n### Changed\n- The constructor of `GreenCoffeeTest`\n- Updated to latest version of [Gherkin java](https://github.com/cucumber/gherkin-java)\n\n### Removed\n- Example app. Moved [here](https://github.com/vndly/green-coffee-example)\n\n## [1.0.0] - 2016-09-04\n### Added\n- First stable version of the library"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 Mauricio Togneri\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "[![License](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/mauriciotogneri/green-coffee/blob/master/LICENSE.md)\n[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-green--coffee-green.svg?style=true)](https://android-arsenal.com/details/1/4313)\n\n# Green Coffee\n**Green Coffee** is a library that allows you to run your acceptance tests written in Gherkin in your Android instrumentation tests using the step definitions that you declare. Visit the [wiki](https://github.com/mauriciotogneri/green-coffee/wiki) for more detailed information.\n\n## Example\n\nGiven the following feature:\n\n```gherkin\nFeature: Login screen to authenticate users\n\n\tScenario: Invalid username and password\n        Given I see an empty login form\n         When I introduce an invalid username\n          And I introduce an invalid password\n          And I press the login button\n         Then I see an error message saying 'Invalid credentials'\n```\n\nFirst, create a class that extends from `GreenCoffeeTest` and declare the Activity, the feature and the step definitions that will be used:\n\n```java\n@RunWith(Parameterized.class)\npublic class LoginFeatureTest extends GreenCoffeeTest\n{\n    @Rule\n    public ActivityTestRule<LoginActivity> activity = new ActivityTestRule<>(LoginActivity.class);\n\n    public LoginFeatureTest(ScenarioConfig scenarioConfig)\n    {\n        super(scenarioConfig);\n    }\n\n    @Parameters(name = \"{0}\")\n    public static Iterable<ScenarioConfig> scenarios() throws IOException\n    {\n        return new GreenCoffeeConfig()\n                        .withFeatureFromAssets(\"assets/login.feature\")\n                        .takeScreenshotOnFail()\n                        .scenarios(\n                            new Locale(\"en\", \"GB\"),\n                            new Locale(\"es\", \"ES\")\n                        ); // the locales used to run the scenarios (optional)\n    }\n\n    @Test\n    public void test()\n    {\n        start(new LoginSteps());\n    }\n}\n```\n\nNext, create a class containing the steps definitions:\n\n```java\npublic class LoginSteps extends GreenCoffeeSteps\n{\n    @Given(\"^I see an empty login form$\")\n    public void iSeeAnEmptyLoginForm()\n    {\n        onViewWithId(R.id.login_input_username).isEmpty();\n        onViewWithId(R.id.login_input_password).isEmpty();\n    }\n\n    @When(\"^I introduce an invalid username$\")\n    public void iIntroduceAnInvalidUsername()\n    {\n        onViewWithId(R.id.login_input_username).type(\"guest\");\n    }\n\n    @When(\"^I introduce an invalid password$\")\n    public void iIntroduceAnInvalidPassword()\n    {\n        onViewWithId(R.id.login_input_password).type(\"1234\");\n    }\n\n    @When(\"^I press the login button$\")\n    public void iPressTheLoginButton()\n    {\n        onViewWithId(R.id.login_button_doLogin).click();\n    }\n\n    @Then(\"^I see an error message saying 'Invalid credentials'$\")\n    public void iSeeAnErrorMessageSayingInvalidCredentials()\n    {\n        onViewWithText(R.string.login_credentials_error).isDisplayed();\n    }\n}\n```\n\nAnd that's it, now you can create your own tests using Green Coffee. This is how it looks when you run a more complex test:\n\n![Example](http://i.imgur.com/4rMK1KK.gif)\n\nYou can see an example applied to a full app [here](https://github.com/vndly/green-coffee-example).\n\n## Installation\n\nAdd the following code to your root `build.gradle`:\n\n```groovy\nallprojects\n{\n    repositories\n    {\n        maven\n        {\n            url 'https://jitpack.io'\n        }\n    }\n}\n```\n\nAdd the following code to your module `build.gradle` file:\n\n```groovy\ndependencies\n{\n    androidTestImplementation 'androidx.test:runner:1.3.0'\n    androidTestImplementation 'androidx.test:rules:1.3.0'\n    androidTestImplementation 'com.github.mauriciotogneri:green-coffee:3.6.0'\n}\n```\n\nAnd the following test instrumentation runner:\n```groovy\ndefaultConfig\n{\n    testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'\n}\n```"
  },
  {
    "path": "build.gradle",
    "content": "buildscript\n{\n    repositories\n    {\n        google()\n        mavenCentral()\n        maven\n        {\n            url 'https://plugins.gradle.org/m2/'\n        }\n    }\n\n    dependencies\n    {\n        classpath 'com.android.tools.build:gradle:4.1.2'\n    }\n}\n\nallprojects\n{\n    repositories\n    {\n        google()\n        mavenCentral()\n        maven\n        {\n            url 'http://maven.aliyun.com/nexus/content/groups/public/'\n        }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Feb 15 21:58:43 CET 2021\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-6.5-all.zip\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "greencoffee/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid\n{\n    compileSdkVersion 30\n    buildToolsVersion '30.0.3'\n\n    defaultConfig\n    {\n        minSdkVersion 14\n        targetSdkVersion 30\n        versionCode 1\n        versionName '3.6.0'\n    }\n\n    dexOptions\n    {\n        javaMaxHeapSize '2g'\n        preDexLibraries true\n    }\n\n    compileOptions\n    {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n}\n\ndependencies\n{\n    implementation 'io.cucumber:gherkin-jvm-deps:1.0.6'\n    implementation 'com.android.support.test.espresso:espresso-core:3.0.2'\n}"
  },
  {
    "path": "greencoffee/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest package=\"com.mauriciotogneri.greencoffee\" />\n"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/GreenCoffeeConfig.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport com.mauriciotogneri.greencoffee.exceptions.InvalidExampleException;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.Map.Entry;\n\nimport gherkin.AstBuilder;\nimport gherkin.Parser;\nimport gherkin.ast.Examples;\nimport gherkin.ast.Feature;\nimport gherkin.ast.GherkinDocument;\nimport gherkin.ast.ScenarioDefinition;\nimport gherkin.ast.ScenarioOutline;\nimport gherkin.ast.Step;\nimport gherkin.ast.TableCell;\nimport gherkin.ast.TableRow;\nimport gherkin.ast.Tag;\n\npublic class GreenCoffeeConfig\n{\n    private final List<Scenario> scenarios;\n    private final ScreenshotProvider screenshotProvider;\n\n    private GreenCoffeeConfig(List<Scenario> scenarios, ScreenshotProvider screenshotProvider)\n    {\n        this.scenarios = scenarios;\n        this.screenshotProvider = screenshotProvider;\n    }\n\n    public GreenCoffeeConfig()\n    {\n        this(new ArrayList<>(), null);\n    }\n\n    public List<ScenarioConfig> scenarios(Locale... locales)\n    {\n        List<ScenarioConfig> scenarioConfigs = new ArrayList<>();\n\n        Locale[] finalLocales = locales;\n\n        if (finalLocales.length == 0)\n        {\n            finalLocales = new Locale[1];\n            finalLocales[0] = Locale.getDefault();\n        }\n\n        for (Locale locale : finalLocales)\n        {\n            for (Scenario scenario : scenarios)\n            {\n                scenarioConfigs.add(new ScenarioConfig(scenario, locale, screenshotProvider));\n            }\n        }\n\n        return scenarioConfigs;\n    }\n\n    public GreenCoffeeConfig takeScreenshotOnFail()\n    {\n        return new GreenCoffeeConfig(scenarios, ScreenshotProvider.getDefault());\n    }\n\n    public GreenCoffeeConfig takeScreenshotOnFail(ScreenshotProvider screenshotProvider)\n    {\n        return new GreenCoffeeConfig(scenarios, screenshotProvider);\n    }\n\n    public GreenCoffeeConfig withTags(String firstTag, String... restTags)\n    {\n        List<String> tagList = new ArrayList<>();\n        tagList.add(firstTag);\n        tagList.addAll(Arrays.asList(restTags));\n\n        List<Scenario> filtered = new ArrayList<>();\n\n        for (Scenario scenario : scenarios)\n        {\n            if (scenario.hasTags(tagList))\n            {\n                filtered.add(scenario);\n            }\n        }\n\n        return new GreenCoffeeConfig(filtered, screenshotProvider);\n    }\n\n    public GreenCoffeeConfig withFeatureFromString(String featureSource)\n    {\n        return new GreenCoffeeConfig(scenarios(featureSource), screenshotProvider);\n    }\n\n    public GreenCoffeeConfig withFeatureFromAssets(String featurePath) throws IOException\n    {\n        InputStream stream = getClass().getClassLoader().getResourceAsStream(featurePath);\n\n        return withFeatureFromInputStream(stream);\n    }\n\n    public GreenCoffeeConfig withFeatureFromUrl(String featureUrl) throws IOException\n    {\n        URL url = new URL(featureUrl);\n        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();\n        urlConnection.setRequestMethod(\"GET\");\n\n        return withFeatureFromInputStream(urlConnection.getInputStream());\n    }\n\n    public GreenCoffeeConfig withFeatureFromInputStream(InputStream featureInput) throws IOException\n    {\n        BufferedReader reader = new BufferedReader(new InputStreamReader(featureInput));\n        StringBuilder builder = new StringBuilder();\n        String line;\n\n        while ((line = reader.readLine()) != null)\n        {\n            builder.append(String.format(\"%s%n\", line));\n        }\n\n        reader.close();\n\n        return new GreenCoffeeConfig(scenarios(builder.toString()), screenshotProvider);\n    }\n\n    private List<Scenario> scenarios(String featureSource)\n    {\n        Parser<GherkinDocument> parser = new Parser<>(new AstBuilder());\n        GherkinDocument gherkinDocument = parser.parse(featureSource);\n        Feature feature = gherkinDocument.getFeature();\n\n        List<ScenarioDefinition> backgrounds = backgrounds(feature);\n        List<ScenarioDefinition> scenarios = scenarios(feature);\n\n        List<Scenario> result = new ArrayList<>();\n\n        for (ScenarioDefinition scenarioDefinition : scenarios)\n        {\n            String name = scenarioDefinition.getName();\n            String description = scenarioDefinition.getDescription();\n            List<Step> steps = new ArrayList<>();\n            List<String> tags = new ArrayList<>();\n\n            for (ScenarioDefinition background : backgrounds)\n            {\n                steps.addAll(background.getSteps());\n            }\n\n            if (isScenarioNormal(scenarioDefinition))\n            {\n                gherkin.ast.Scenario scenarioNormal = (gherkin.ast.Scenario) scenarioDefinition;\n                tags.addAll(tags(scenarioNormal.getTags()));\n            }\n            else if (isScenarioOutline(scenarioDefinition))\n            {\n                ScenarioOutline scenarioOutline = (ScenarioOutline) scenarioDefinition;\n                tags.addAll(tags(scenarioOutline.getTags()));\n            }\n\n            steps.addAll(scenarioDefinition.getSteps());\n\n            result.add(new Scenario(name, description, steps, tags));\n        }\n\n        return result;\n    }\n\n    private List<String> tags(List<Tag> tags)\n    {\n        List<String> result = new ArrayList<>();\n\n        for (Tag tag : tags)\n        {\n            result.add(tag.getName());\n        }\n\n        return result;\n    }\n\n    private List<ScenarioDefinition> backgrounds(Feature feature)\n    {\n        List<ScenarioDefinition> result = new ArrayList<>();\n\n        for (ScenarioDefinition scenario : feature.getChildren())\n        {\n            if (gherkin.ast.Background.class.isInstance(scenario))\n            {\n                result.add(scenario);\n            }\n        }\n\n        return result;\n    }\n\n    private List<ScenarioDefinition> scenarios(Feature feature)\n    {\n        List<ScenarioDefinition> result = new ArrayList<>();\n\n        for (ScenarioDefinition scenario : feature.getChildren())\n        {\n            if (isScenarioNormal(scenario))\n            {\n                result.add(scenario);\n            }\n            else if (isScenarioOutline(scenario))\n            {\n                ScenarioOutline scenarioOutline = (ScenarioOutline) scenario;\n\n                for (Examples examples : scenarioOutline.getExamples())\n                {\n                    for (TableRow row : examples.getTableBody())\n                    {\n                        result.add(concreteScenario(scenarioOutline, parametersMap(examples.getTableHeader(), row)));\n                    }\n                }\n            }\n        }\n\n        return result;\n    }\n\n    private boolean isScenarioNormal(ScenarioDefinition scenario)\n    {\n        return gherkin.ast.Scenario.class.isInstance(scenario);\n    }\n\n    private boolean isScenarioOutline(ScenarioDefinition scenario)\n    {\n        return gherkin.ast.ScenarioOutline.class.isInstance(scenario);\n    }\n\n    private Map<String, String> parametersMap(TableRow header, TableRow row)\n    {\n        List<TableCell> headerCells = header.getCells();\n        List<TableCell> rowCells = row.getCells();\n\n        if (headerCells.size() == rowCells.size())\n        {\n            Map<String, String> parameters = new LinkedHashMap<>();\n\n            for (int i = 0; i < headerCells.size(); i++)\n            {\n                TableCell headerCell = headerCells.get(i);\n                TableCell rowCell = rowCells.get(i);\n\n                parameters.put(headerCell.getValue(), rowCell.getValue());\n            }\n\n            return parameters;\n        }\n        else\n        {\n            throw new InvalidExampleException(header.getLocation().getLine(), header.getLocation().getColumn());\n        }\n    }\n\n    private ScenarioDefinition concreteScenario(ScenarioOutline abstractScenario, Map<String, String> parameters)\n    {\n        List<Step> steps = new ArrayList<>();\n\n        for (Step step : abstractScenario.getSteps())\n        {\n            steps.add(concreteStep(step, parameters));\n        }\n\n        return new gherkin.ast.Scenario(\n                abstractScenario.getTags(),\n                abstractScenario.getLocation(),\n                abstractScenario.getKeyword(),\n                abstractScenario.getName(),\n                abstractScenario.getDescription(),\n                steps);\n    }\n\n    private Step concreteStep(Step abstractStep, Map<String, String> parameters)\n    {\n        String text = abstractStep.getText();\n\n        for (Entry<String, String> entry : parameters.entrySet())\n        {\n            String target = String.format(\"<%s>\", entry.getKey());\n            String replacement = entry.getValue();\n\n            text = text.replace(target, replacement);\n        }\n\n        return new Step(\n                abstractStep.getLocation(),\n                abstractStep.getKeyword(),\n                text,\n                abstractStep.getArgument());\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/GreenCoffeeSteps.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport android.support.annotation.IdRes;\nimport android.support.annotation.StringRes;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.espresso.Espresso;\nimport android.support.test.espresso.UiController;\nimport android.support.test.espresso.ViewAction;\nimport android.support.test.espresso.matcher.ViewMatchers;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.mauriciotogneri.greencoffee.annotations.And;\nimport com.mauriciotogneri.greencoffee.annotations.But;\nimport com.mauriciotogneri.greencoffee.annotations.Given;\nimport com.mauriciotogneri.greencoffee.annotations.Then;\nimport com.mauriciotogneri.greencoffee.annotations.When;\nimport com.mauriciotogneri.greencoffee.exceptions.InvalidStepDefinitionException;\nimport com.mauriciotogneri.greencoffee.interactions.ActionableData;\nimport com.mauriciotogneri.greencoffee.interactions.ActionableObject;\nimport com.mauriciotogneri.greencoffee.interactions.ActionableView;\nimport com.mauriciotogneri.greencoffee.interactions.DataMatcher;\nimport com.mauriciotogneri.greencoffee.interactions.ObjectMatcher;\n\nimport org.hamcrest.Description;\nimport org.hamcrest.Matcher;\nimport org.hamcrest.TypeSafeMatcher;\n\nimport java.io.File;\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.concurrent.TimeUnit;\n\nimport static android.support.test.espresso.Espresso.onData;\nimport static android.support.test.espresso.Espresso.onView;\nimport static android.support.test.espresso.matcher.ViewMatchers.isRoot;\nimport static android.support.test.espresso.matcher.ViewMatchers.withId;\nimport static org.hamcrest.Matchers.allOf;\n\npublic class GreenCoffeeSteps\n{\n    List<StepDefinition> stepDefinitions()\n    {\n        List<StepDefinition> stepDefinitions = new ArrayList<>();\n\n        for (Method method : getClass().getDeclaredMethods())\n        {\n            String pattern = pattern(method);\n\n            if (pattern != null)\n            {\n                StepDefinition stepDefinition = new StepDefinition(pattern, method, this);\n                stepDefinitions.add(stepDefinition);\n            }\n        }\n\n        return stepDefinitions;\n    }\n\n    private String pattern(Method method)\n    {\n        String result = null;\n\n        Given given = method.getAnnotation(Given.class);\n\n        if (given != null)\n        {\n            result = given.value();\n        }\n\n        When when = method.getAnnotation(When.class);\n\n        if (when != null)\n        {\n            checkInvalidStepDefinition(result, method);\n            result = when.value();\n        }\n\n        Then then = method.getAnnotation(Then.class);\n\n        if (then != null)\n        {\n            checkInvalidStepDefinition(result, method);\n            result = then.value();\n        }\n\n        And and = method.getAnnotation(And.class);\n\n        if (and != null)\n        {\n            checkInvalidStepDefinition(result, method);\n            result = and.value();\n        }\n\n        But but = method.getAnnotation(But.class);\n\n        if (but != null)\n        {\n            checkInvalidStepDefinition(result, method);\n            result = but.value();\n        }\n\n        return result;\n    }\n\n    private void checkInvalidStepDefinition(String pattern, Method method)\n    {\n        if (pattern != null)\n        {\n            throw new InvalidStepDefinitionException(method);\n        }\n    }\n\n    protected ActionableObject onViewWithId(@IdRes int resourceId)\n    {\n        return new ActionableView(onView(withId(resourceId)));\n    }\n\n    protected ActionableObject onViewWithId(@IdRes int resourceId, int index)\n    {\n        return new ActionableView(onView(withIndex(withId(resourceId), index)));\n    }\n\n    protected ActionableObject onViewWithText(@StringRes int resourceId)\n    {\n        return new ActionableView(onView(ViewMatchers.withText(resourceId)));\n    }\n\n    protected ActionableObject onViewWithText(@StringRes int resourceId, int index)\n    {\n        return new ActionableView(onView(withIndex(ViewMatchers.withText(resourceId), index)));\n    }\n\n    protected ActionableObject onViewWithText(Object text)\n    {\n        return new ActionableView(onView(ViewMatchers.withText(text.toString())));\n    }\n\n    protected ActionableObject onViewWithText(Object text, int index)\n    {\n        return new ActionableView(onView(withIndex(ViewMatchers.withText(text.toString()), index)));\n    }\n\n    protected ActionableObject onViewWithAll(Matcher<? super View>... matchers)\n    {\n        return new ActionableView(onView(allOf(matchers)));\n    }\n\n    protected <T> ActionableObject onViewWithObject(T object)\n    {\n        return new ActionableData(onData(new ObjectMatcher<>(object)));\n    }\n\n    protected <T> ActionableObject onViewWithObject(@IdRes int resourceId, Class<T> clazz, T object)\n    {\n        return new DataMatcher<>(resourceId, clazz).with(object);\n    }\n\n    protected ActionableObject onViewChildOf(@IdRes int parentViewId, int index)\n    {\n        return new ActionableView(onView(nthChildOf(withId(parentViewId), index)));\n    }\n\n    protected void pressBack()\n    {\n        Espresso.pressBack();\n    }\n\n    protected void closeKeyboard()\n    {\n        Espresso.closeSoftKeyboard();\n    }\n\n    protected String string(@StringRes int stringId)\n    {\n        return InstrumentationRegistry.getTargetContext().getString(stringId);\n    }\n\n    protected Locale locale()\n    {\n        return new Localization(InstrumentationRegistry.getTargetContext()).locale();\n    }\n\n    protected void takeScreenshot(File file)\n    {\n        ScreenCapture screenCapture = new ScreenCapture();\n        screenCapture.takeScreenshot(file);\n    }\n\n    protected Matcher<View> withIndex(Matcher<View> matcher, int index)\n    {\n        return new TypeSafeMatcher<View>()\n        {\n            private int currentIndex;\n            private int viewObjHash;\n\n            @Override\n            public void describeTo(Description description)\n            {\n                description.appendText(String.format(\"with index: %d\", index));\n            }\n\n            @Override\n            public boolean matchesSafely(View view)\n            {\n                if (matcher.matches(view) && (currentIndex++ == index))\n                {\n                    viewObjHash = view.hashCode();\n                }\n\n                return (view.hashCode() == viewObjHash);\n            }\n        };\n    }\n\n    protected Matcher<View> nthChildOf(Matcher<View> parentMatcher, int childPosition)\n    {\n        return new TypeSafeMatcher<View>()\n        {\n            @Override\n            public void describeTo(Description description)\n            {\n                description.appendText(String.format(\"with %d child view of type parentMatcher\", childPosition));\n            }\n\n            @Override\n            public boolean matchesSafely(View view)\n            {\n                if (!(view.getParent() instanceof ViewGroup))\n                {\n                    return parentMatcher.matches(view.getParent());\n                }\n\n                ViewGroup group = (ViewGroup) view.getParent();\n\n                return parentMatcher.matches(view.getParent()) && group.getChildAt(childPosition).equals(view);\n            }\n        };\n    }\n\n    protected void waitFor(long value, TimeUnit timeUnit)\n    {\n        onView(isRoot()).perform(actionWaitFor(value, timeUnit));\n    }\n\n    protected void waitFor(long millis)\n    {\n        waitFor(millis, TimeUnit.MILLISECONDS);\n    }\n\n    private ViewAction actionWaitFor(long value, TimeUnit timeUnit)\n    {\n        long millis = timeUnit.toMillis(value);\n\n        return new ViewAction()\n        {\n            @Override\n            public Matcher<View> getConstraints()\n            {\n                return isRoot();\n            }\n\n            @Override\n            public String getDescription()\n            {\n                return \"Wait for \" + millis + \" milliseconds.\";\n            }\n\n            @Override\n            public void perform(UiController uiController, View view)\n            {\n                uiController.loopMainThreadForAtLeast(millis);\n            }\n        };\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/GreenCoffeeTest.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport com.mauriciotogneri.greencoffee.exceptions.DuplicatedStepDefinitionException;\nimport com.mauriciotogneri.greencoffee.exceptions.NoStepsDefinedException;\nimport com.mauriciotogneri.greencoffee.exceptions.StepDefinitionNotFoundException;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Set;\n\nimport static android.support.test.InstrumentationRegistry.getTargetContext;\nimport gherkin.ast.Node;\nimport gherkin.ast.Step;\n\npublic class GreenCoffeeTest\n{\n    private final ScenarioConfig scenarioConfig;\n    private final TestLog testLog;\n\n    public GreenCoffeeTest(ScenarioConfig scenario)\n    {\n        this.scenarioConfig = scenario;\n        this.testLog = new TestLog();\n\n        beforeScenarioStarts(scenario.scenario(), scenario.locale());\n\n        Localization localization = new Localization(getTargetContext());\n        localization.locale(scenarioConfig.locale());\n    }\n\n    protected void beforeScenarioStarts(Scenario scenario, Locale locale)\n    {\n    }\n\n    protected void afterScenarioEnds(Scenario scenario, Locale locale)\n    {\n    }\n\n    protected void start(GreenCoffeeSteps... targets)\n    {\n        if (targets.length == 0)\n        {\n            throw new NoStepsDefinedException();\n        }\n\n        Scenario scenario = scenarioConfig.scenario();\n\n        testLog.logScenario(scenario);\n\n        List<StepDefinition> stepDefinitions = new ArrayList<>();\n\n        for (GreenCoffeeSteps greenCoffeeSteps : targets)\n        {\n            stepDefinitions.addAll(greenCoffeeSteps.stepDefinitions());\n        }\n\n        validateStepDefinitions(stepDefinitions);\n\n        try\n        {\n            for (Step step : scenario.steps())\n            {\n                processStep(step, stepDefinitions);\n            }\n        }\n        catch (Exception e)\n        {\n            if (scenarioConfig.hasScreenshotProvider())\n            {\n                ScreenshotProvider screenshotProvider = scenarioConfig.screenshotProvider();\n                screenshotProvider.takeScreenshot(scenario);\n            }\n\n            throw e;\n        }\n        finally\n        {\n            afterScenarioEnds(scenarioConfig.scenario(), scenarioConfig.locale());\n        }\n    }\n\n    private void validateStepDefinitions(List<StepDefinition> stepDefinitions)\n    {\n        Set<String> patterns = new HashSet<>();\n\n        for (StepDefinition stepDefinition : stepDefinitions)\n        {\n            String pattern = stepDefinition.pattern();\n\n            if (!patterns.contains(pattern))\n            {\n                patterns.add(pattern);\n            }\n            else\n            {\n                throw new DuplicatedStepDefinitionException(stepDefinition.method(), pattern);\n            }\n        }\n    }\n\n    private void processStep(Step step, List<StepDefinition> stepDefinitions)\n    {\n        String keyword = step.getKeyword().trim();\n        String text = step.getText().trim();\n        Node argument = step.getArgument();\n\n        testLog.logStep(keyword, text);\n\n        for (StepDefinition stepDefinition : stepDefinitions)\n        {\n            if (stepDefinition.matches(text))\n            {\n                stepDefinition.invoke(text, argument);\n                return;\n            }\n        }\n\n        throw new StepDefinitionNotFoundException(keyword, text);\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/Localization.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.res.Configuration;\nimport android.content.res.Resources;\nimport android.os.Build;\nimport android.util.DisplayMetrics;\n\nimport java.util.Locale;\n\npublic class Localization\n{\n    private final Context context;\n\n    public Localization(Context context)\n    {\n        this.context = context;\n    }\n\n    public Locale locale()\n    {\n        return getSystemLocale(configuration(resources()));\n    }\n\n    public boolean locale(Locale newLocale)\n    {\n        Resources resources = resources();\n        DisplayMetrics displayMetrics = resources.getDisplayMetrics();\n        Configuration config = configuration(resources);\n\n        Locale systemLocale = getSystemLocale(config);\n\n        if (!systemLocale.equals(newLocale))\n        {\n            updateSystemLocale(config, newLocale);\n            updateSystemConfiguration(resources, config, displayMetrics);\n\n            return true;\n        }\n        else\n        {\n            return false;\n        }\n    }\n\n    public void reset()\n    {\n        locale(Locale.getDefault());\n    }\n\n    // =============================================================================================\n\n    private Resources resources()\n    {\n        return context.getResources();\n    }\n\n    private Configuration configuration(Resources resources)\n    {\n        return resources.getConfiguration();\n    }\n\n    // =============================================================================================\n\n    private Locale getSystemLocale(Configuration config)\n    {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)\n        {\n            return systemLocale(config);\n        }\n        else\n        {\n            return systemLocaleLegacy(config);\n        }\n    }\n\n    @SuppressWarnings(\"deprecation\")\n    private Locale systemLocaleLegacy(Configuration config)\n    {\n        return config.locale;\n    }\n\n    @TargetApi(Build.VERSION_CODES.N)\n    private Locale systemLocale(Configuration config)\n    {\n        return config.getLocales().get(0);\n    }\n\n    // =============================================================================================\n\n    private void updateSystemLocale(Configuration config, Locale locale)\n    {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)\n        {\n            systemLocale(config, locale);\n        }\n        else\n        {\n            systemLocaleLegacy(config, locale);\n        }\n    }\n\n    @SuppressWarnings(\"deprecation\")\n    private void systemLocaleLegacy(Configuration config, Locale locale)\n    {\n        config.locale = locale;\n    }\n\n    @TargetApi(Build.VERSION_CODES.N)\n    private void systemLocale(Configuration config, Locale locale)\n    {\n        config.setLocale(locale);\n    }\n\n    // =============================================================================================\n\n    @SuppressWarnings(\"deprecation\")\n    private void updateSystemConfiguration(Resources resources, Configuration config, DisplayMetrics displayMetrics)\n    {\n        resources.updateConfiguration(config, displayMetrics);\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/Scenario.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport gherkin.ast.Step;\n\npublic class Scenario\n{\n    private final String name;\n    private final String description;\n    private final List<String> tags;\n    private final List<Step> steps;\n\n    public Scenario(String name, String description, List<Step> steps, List<String> tags)\n    {\n        this.name = name;\n        this.description = description;\n        this.tags = tags;\n        this.steps = Collections.unmodifiableList(steps);\n    }\n\n    public String name()\n    {\n        return name;\n    }\n\n    public String description()\n    {\n        return description;\n    }\n\n    public boolean hasTags(List<String> tagList)\n    {\n        for (String tag : tagList)\n        {\n            if (tags.contains(tag))\n            {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public boolean hasTags(String... tagList)\n    {\n        for (String tag : tagList)\n        {\n            if (tags.contains(tag))\n            {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public List<Step> steps()\n    {\n        return steps;\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/ScenarioConfig.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport java.util.Locale;\n\npublic class ScenarioConfig\n{\n    private final Scenario scenario;\n    private final Locale locale;\n    private final ScreenshotProvider screenshotProvider;\n\n    public ScenarioConfig(Scenario scenario, Locale locale, ScreenshotProvider screenshotProvider)\n    {\n        this.scenario = scenario;\n        this.locale = locale;\n        this.screenshotProvider = screenshotProvider;\n    }\n\n    public ScenarioConfig(Scenario scenario, Locale locale)\n    {\n        this(scenario, locale, ScreenshotProvider.getDefault());\n    }\n\n    public ScenarioConfig(Scenario scenario)\n    {\n        this(scenario, null, ScreenshotProvider.getDefault());\n    }\n\n    public Scenario scenario()\n    {\n        return scenario;\n    }\n\n    public Locale locale()\n    {\n        return (locale != null) ? locale : Locale.getDefault();\n    }\n\n    public Boolean hasScreenshotProvider()\n    {\n        return (screenshotProvider != null);\n    }\n\n    public ScreenshotProvider screenshotProvider()\n    {\n        return screenshotProvider;\n    }\n\n    @Override\n    public String toString()\n    {\n        if (locale != null)\n        {\n            return String.format(\"%s - %s\", scenario.name(), locale.toString());\n        }\n        else\n        {\n            return scenario.name();\n        }\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/ScreenCapture.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport android.app.Activity;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.CompressFormat;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry;\nimport android.support.test.runner.lifecycle.Stage;\nimport android.view.View;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.util.Collection;\nimport java.util.Iterator;\n\nclass ScreenCapture\n{\n    void takeScreenshot(File file)\n    {\n        InstrumentationRegistry.getInstrumentation().runOnMainSync(() ->\n                                                                   {\n                                                                       Collection<Activity> resumedActivities = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED);\n                                                                       Iterator<Activity> iterator = resumedActivities.iterator();\n\n                                                                       if (iterator.hasNext())\n                                                                       {\n                                                                           Activity activity = iterator.next();\n\n                                                                           try\n                                                                           {\n                                                                               takeScreenshot(activity, file);\n                                                                           }\n                                                                           catch (Exception e)\n                                                                           {\n                                                                               // ignore\n                                                                           }\n                                                                       }\n                                                                   });\n    }\n\n    private void takeScreenshot(Activity activity, File file) throws Exception\n    {\n        View view = activity.getWindow().getDecorView().getRootView();\n        view.setDrawingCacheEnabled(true);\n        view.buildDrawingCache(true);\n        Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());\n        view.setDrawingCacheEnabled(false);\n\n        File parentFolder = file.getParentFile();\n\n        if (parentFolder.exists() || parentFolder.mkdirs())\n        {\n            FileOutputStream outputStream = new FileOutputStream(file);\n            bitmap.compress(CompressFormat.JPEG, 100, outputStream);\n            outputStream.flush();\n            outputStream.close();\n        }\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/ScreenshotProvider.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport java.io.File;\nimport java.text.DateFormat;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.Locale;\n\nimport static android.support.test.InstrumentationRegistry.getTargetContext;\n\npublic interface ScreenshotProvider\n{\n    static ScreenshotProvider getDefault()\n    {\n        return new DefaultScreenshotProvider();\n    }\n\n    void takeScreenshot(Scenario scenario);\n\n    class DefaultScreenshotProvider implements ScreenshotProvider\n    {\n        private final ScreenCapture screenCapture;\n\n        DefaultScreenshotProvider()\n        {\n            screenCapture = new ScreenCapture();\n        }\n\n        @Override\n        public void takeScreenshot(Scenario scenario)\n        {\n            DateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\", Locale.getDefault());\n            String fileName = String.format(\"%s - %s.jpg\", scenario.name(), dateFormat.format(new Date()));\n            File file = new File(getTargetContext().getExternalFilesDir(\"screenshots\"), fileName);\n\n            screenCapture.takeScreenshot(file);\n        }\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/StepDefinition.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport com.mauriciotogneri.greencoffee.exceptions.InvalidMethodSignatureException;\nimport com.mauriciotogneri.greencoffee.exceptions.StepFailureException;\n\nimport java.lang.reflect.Method;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport gherkin.ast.DataTable;\nimport gherkin.ast.DocString;\nimport gherkin.ast.Node;\n\nclass StepDefinition\n{\n    private final Pattern pattern;\n    private final Method method;\n    private final Object target;\n\n    StepDefinition(String expression, Method method, Object target)\n    {\n        this.pattern = Pattern.compile(expression);\n        this.method = method;\n        this.target = target;\n    }\n\n    String pattern()\n    {\n        return pattern.pattern();\n    }\n\n    Method method()\n    {\n        return method;\n    }\n\n    boolean matches(String text)\n    {\n        Matcher matcher = pattern.matcher(text);\n\n        return matcher.find();\n    }\n\n    void invoke(String text, Node argument)\n    {\n        Matcher matcher = pattern.matcher(text);\n\n        if (matcher.find())\n        {\n            Object[] parameters;\n\n            try\n            {\n                parameters = parameters(matcher, argument);\n            }\n            catch (Exception e)\n            {\n                throw new InvalidMethodSignatureException(method, pattern.pattern(), text);\n            }\n\n            try\n            {\n                method.invoke(target, parameters);\n            }\n            catch (Exception e)\n            {\n                Throwable cause = e.getCause();\n\n                throw new StepFailureException(method, pattern.pattern(), text, (cause != null) ? cause.toString() : e.toString());\n            }\n        }\n        else\n        {\n            throw new RuntimeException();\n        }\n    }\n\n    private Object[] parameters(Matcher matcher, Node argument)\n    {\n        Object[] parameters = new Object[matcher.groupCount() + ((argument != null) ? 1 : 0)];\n        Class<?>[] types = method.getParameterTypes();\n\n        int limit = (argument != null) ? (parameters.length - 1) : parameters.length;\n\n        for (int i = 0; i < limit; i++)\n        {\n            parameters[i] = castParameter(matcher.group(i + 1), types[i]);\n        }\n\n        if (argument != null)\n        {\n            if (argument.getClass().equals(DocString.class))\n            {\n                DocString docString = (DocString) argument;\n\n                parameters[parameters.length - 1] = docString.getContent();\n            }\n            else if (argument.getClass().equals(DataTable.class))\n            {\n                DataTable dataTable = (DataTable) argument;\n\n                parameters[parameters.length - 1] = dataTable.getRows();\n            }\n        }\n\n        return parameters;\n    }\n\n    private Object castParameter(String value, Class<?> clazz)\n    {\n        if (clazz.equals(int.class) || clazz.equals(Integer.class))\n        {\n            return Integer.parseInt(value);\n        }\n        else if (clazz.equals(long.class) || clazz.equals(Long.class))\n        {\n            return Long.parseLong(value);\n        }\n        else if (clazz.equals(float.class) || clazz.equals(Float.class))\n        {\n            return Float.parseFloat(value);\n        }\n        else if (clazz.equals(double.class) || clazz.equals(Double.class))\n        {\n            return Double.parseDouble(value);\n        }\n        else if (clazz.equals(byte.class) || clazz.equals(Byte.class))\n        {\n            return Byte.parseByte(value);\n        }\n        else if (clazz.equals(short.class) || clazz.equals(Short.class))\n        {\n            return Short.parseShort(value);\n        }\n        else if (clazz.equals(boolean.class) || clazz.equals(Boolean.class))\n        {\n            return Boolean.parseBoolean(value);\n        }\n        else if (clazz.equals(char.class) || clazz.equals(Character.class))\n        {\n            return value.charAt(0);\n        }\n        else\n        {\n            return value;\n        }\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/TestLog.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport android.text.TextUtils;\n\nclass TestLog\n{\n    void logScenario(Scenario scenario)\n    {\n        log(String.format(\"Scenario: %s\", scenario.name()));\n\n        if (!TextUtils.isEmpty(scenario.description()))\n        {\n            for (String line : scenario.description().split(\"\\n\"))\n            {\n                log(String.format(\"\\t%s\", line.trim()));\n            }\n        }\n    }\n\n    void logStep(String keyword, String text)\n    {\n        log(String.format(\"\\t%s %s\", keyword, text));\n    }\n\n    private void log(String message)\n    {\n        System.out.println(message);\n        System.out.flush();\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/TimedIdlingResource.java",
    "content": "package com.mauriciotogneri.greencoffee;\n\nimport android.support.test.espresso.Espresso;\nimport android.support.test.espresso.IdlingResource;\n\nimport java.util.concurrent.TimeUnit;\n\npublic class TimedIdlingResource implements IdlingResource\n{\n    private final long timeout;\n    private ResourceCallback resourceCallback;\n\n    public TimedIdlingResource(long millis)\n    {\n        this.timeout = System.currentTimeMillis() + millis;\n    }\n\n    public TimedIdlingResource(long value, TimeUnit timeUnit)\n    {\n        this.timeout = timeUnit.toMillis(value);\n    }\n\n    @Override\n    public String getName()\n    {\n        return getClass().getName() + \":\" + (timeout - System.currentTimeMillis());\n    }\n\n    @Override\n    public boolean isIdleNow()\n    {\n        boolean idle = System.currentTimeMillis() >= timeout;\n\n        if (idle && (resourceCallback != null))\n        {\n            resourceCallback.onTransitionToIdle();\n        }\n\n        return idle;\n    }\n\n    @Override\n    public void registerIdleTransitionCallback(ResourceCallback resourceCallback)\n    {\n        this.resourceCallback = resourceCallback;\n    }\n\n    public void start()\n    {\n        Espresso.registerIdlingResources(this);\n    }\n\n    public void stop()\n    {\n        Espresso.unregisterIdlingResources(this);\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/annotations/And.java",
    "content": "package com.mauriciotogneri.greencoffee.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.METHOD)\npublic @interface And\n{\n    String value();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/annotations/But.java",
    "content": "package com.mauriciotogneri.greencoffee.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.METHOD)\npublic @interface But\n{\n    String value();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/annotations/Given.java",
    "content": "package com.mauriciotogneri.greencoffee.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.METHOD)\npublic @interface Given\n{\n    String value();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/annotations/Then.java",
    "content": "package com.mauriciotogneri.greencoffee.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.METHOD)\npublic @interface Then\n{\n    String value();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/annotations/When.java",
    "content": "package com.mauriciotogneri.greencoffee.annotations;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.lang.annotation.Target;\n\n@Retention(RetentionPolicy.RUNTIME)\n@Target(ElementType.METHOD)\npublic @interface When\n{\n    String value();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/exceptions/DuplicatedStepDefinitionException.java",
    "content": "package com.mauriciotogneri.greencoffee.exceptions;\n\nimport java.lang.reflect.Method;\n\npublic class DuplicatedStepDefinitionException extends RuntimeException\n{\n    public DuplicatedStepDefinitionException(Method method, String pattern)\n    {\n        super(String.format(\"Duplicated step definition%n%nClass: %s%nMethod: %s%nPattern: \\\"%s\\\"%n\", method.getDeclaringClass().getSimpleName(), method.getName(), pattern));\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/exceptions/InvalidExampleException.java",
    "content": "package com.mauriciotogneri.greencoffee.exceptions;\n\npublic class InvalidExampleException extends RuntimeException\n{\n    public InvalidExampleException(int line, int column)\n    {\n        super(String.format(\"Invalid example format at: [%s, %s]\", line, column));\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/exceptions/InvalidMethodSignatureException.java",
    "content": "package com.mauriciotogneri.greencoffee.exceptions;\n\nimport java.lang.reflect.Method;\n\npublic class InvalidMethodSignatureException extends RuntimeException\n{\n    public InvalidMethodSignatureException(Method method, String pattern, String text)\n    {\n        super(String.format(\"Invalid number of type of parameters%n%nClass: %s%nMethod: %s%nPattern: \\\"%s\\\"%nText matched: \\\"%s\\\"%n\", method.getDeclaringClass().getSimpleName(), method.getName(), pattern, text));\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/exceptions/InvalidStepDefinitionException.java",
    "content": "package com.mauriciotogneri.greencoffee.exceptions;\n\nimport java.lang.reflect.Method;\n\npublic class InvalidStepDefinitionException extends RuntimeException\n{\n    public InvalidStepDefinitionException(Method method)\n    {\n        super(String.format(\"A step definition cannot have more than one annotation%n%nClass: %s%nMethod: %s%n\", method.getDeclaringClass().getSimpleName(), method.getName()));\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/exceptions/NoStepsDefinedException.java",
    "content": "package com.mauriciotogneri.greencoffee.exceptions;\n\npublic class NoStepsDefinedException extends RuntimeException\n{\n    public NoStepsDefinedException()\n    {\n        super(\"No steps defined for the feature\");\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/exceptions/StepDefinitionNotFoundException.java",
    "content": "package com.mauriciotogneri.greencoffee.exceptions;\n\npublic class StepDefinitionNotFoundException extends RuntimeException\n{\n    public StepDefinitionNotFoundException(String keyword, String text)\n    {\n        super(String.format(\"Step definition not found for: '%s: %s'\", keyword, text));\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/exceptions/StepFailureException.java",
    "content": "package com.mauriciotogneri.greencoffee.exceptions;\n\nimport java.lang.reflect.Method;\n\npublic class StepFailureException extends RuntimeException\n{\n    public StepFailureException(Method method, String pattern, String text, String cause)\n    {\n        super(String.format(\"Error processing step%n%nClass: %s%nMethod: %s%nPattern: \\\"%s\\\"%nText matched: \\\"%s\\\"%n%n%s\", method.getDeclaringClass().getSimpleName(), method.getName(), pattern, text, cause));\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/interactions/ActionableData.java",
    "content": "package com.mauriciotogneri.greencoffee.interactions;\n\nimport android.support.test.espresso.DataInteraction;\nimport android.support.test.espresso.UiController;\nimport android.support.test.espresso.ViewAction;\nimport android.support.test.espresso.ViewAssertion;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport org.hamcrest.Matcher;\n\nimport static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;\n\npublic class ActionableData extends ActionableObject\n{\n    private final DataInteraction dataInteraction;\n\n    public ActionableData(DataInteraction dataInteraction)\n    {\n        this.dataInteraction = dataInteraction;\n    }\n\n    @Override\n    public ActionableObject check(ViewAssertion viewAssertion)\n    {\n        return new ActionableView(dataInteraction.check(viewAssertion));\n    }\n\n    @Override\n    public ActionableObject perform(ViewAction viewAction)\n    {\n        return new ActionableView(dataInteraction.perform(viewAction));\n    }\n\n    @Override\n    public String text()\n    {\n        String[] stringHolder = {null};\n\n        dataInteraction.perform(new ViewAction()\n        {\n            @Override\n            public Matcher<View> getConstraints()\n            {\n                return isAssignableFrom(TextView.class);\n            }\n\n            @Override\n            public String getDescription()\n            {\n                return \"getting text from a TextView\";\n            }\n\n            @Override\n            public void perform(UiController uiController, View view)\n            {\n                TextView textView = (TextView) view;\n                stringHolder[0] = textView.getText().toString();\n            }\n        });\n\n        return stringHolder[0];\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/interactions/ActionableObject.java",
    "content": "package com.mauriciotogneri.greencoffee.interactions;\n\nimport android.support.test.espresso.ViewAction;\nimport android.support.test.espresso.ViewAssertion;\nimport android.support.test.espresso.action.ViewActions;\nimport android.support.test.espresso.assertion.ViewAssertions;\nimport android.support.test.espresso.matcher.BoundedMatcher;\nimport android.support.test.espresso.matcher.ViewMatchers;\nimport android.view.View;\nimport android.widget.ImageView;\n\nimport org.hamcrest.Description;\nimport org.hamcrest.Matchers;\n\npublic abstract class ActionableObject\n{\n    public ActionableObject click()\n    {\n        return perform(ViewActions.click());\n    }\n\n    public ActionableObject doubleClick()\n    {\n        return perform(ViewActions.doubleClick());\n    }\n\n    public ActionableObject longClick()\n    {\n        return perform(ViewActions.longClick());\n    }\n\n    public ActionableObject type(String text)\n    {\n        return perform(ViewActions.typeText(text));\n    }\n\n    public ActionableObject clearText()\n    {\n        return perform(ViewActions.clearText());\n    }\n\n    public ActionableObject scrollTo()\n    {\n        return perform(ViewActions.scrollTo());\n    }\n\n    public ActionableObject swipeUp()\n    {\n        return perform(ViewActions.swipeUp());\n    }\n\n    public ActionableObject swipeDown()\n    {\n        return perform(ViewActions.swipeDown());\n    }\n\n    public ActionableObject swipeLeft()\n    {\n        return perform(ViewActions.swipeLeft());\n    }\n\n    public ActionableObject swipeRight()\n    {\n        return perform(ViewActions.swipeRight());\n    }\n\n    public ActionableObject doesNotExist()\n    {\n        return check(ViewAssertions.doesNotExist());\n    }\n\n    public boolean checkIfDoesNotExist()\n    {\n        return checkIf(this::doesNotExist);\n    }\n\n    public ActionableObject contains(Object text)\n    {\n        return check(ViewAssertions.matches(ViewMatchers.withText(Matchers.containsString(text.toString()))));\n    }\n\n    public boolean checkIfContains(Object text)\n    {\n        return checkIf(() -> contains(text));\n    }\n\n    public ActionableObject doesNotContain(Object text)\n    {\n        return check(ViewAssertions.matches(ViewMatchers.withText(Matchers.not(Matchers.containsString(text.toString())))));\n    }\n\n    public boolean checkIfDoesNotContain(Object text)\n    {\n        return checkIf(() -> doesNotContain(text));\n    }\n\n    public ActionableObject isEmpty()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.withText(\"\")));\n    }\n\n    public boolean checkIfIsEmpty()\n    {\n        return checkIf(this::isEmpty);\n    }\n\n    public ActionableObject isNotEmpty()\n    {\n        return check(ViewAssertions.matches(Matchers.not(ViewMatchers.withText(\"\"))));\n    }\n\n    public boolean checkIfIsNotEmpty()\n    {\n        return checkIf(this::isNotEmpty);\n    }\n\n    public ActionableObject hasFocus()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.hasFocus()));\n    }\n\n    public boolean checkIfHasFocus()\n    {\n        return checkIf(this::hasFocus);\n    }\n\n    public ActionableObject doesNotHaveFocus()\n    {\n        return check(ViewAssertions.matches(Matchers.not(ViewMatchers.hasFocus())));\n    }\n\n    public boolean checkIfDoesNotHaveFocus()\n    {\n        return checkIf(this::doesNotHaveFocus);\n    }\n\n    public ActionableObject hasErrorText(Object text)\n    {\n        return check(ViewAssertions.matches(ViewMatchers.hasErrorText(text.toString())));\n    }\n\n    public boolean checkIfHasErrorText(Object text)\n    {\n        return checkIf(() -> hasErrorText(text));\n    }\n\n    public ActionableObject isChecked()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isChecked()));\n    }\n\n    public boolean checkIfIsChecked()\n    {\n        return checkIf(this::isChecked);\n    }\n\n    public ActionableObject isNotChecked()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isNotChecked()));\n    }\n\n    public boolean checkIfIsNotChecked()\n    {\n        return checkIf(this::isNotChecked);\n    }\n\n    public ActionableObject isClickable()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isClickable()));\n    }\n\n    public boolean checkIfIsClickable()\n    {\n        return checkIf(this::isClickable);\n    }\n\n    public ActionableObject isFocusable()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isFocusable()));\n    }\n\n    public boolean checkIfIsFocusable()\n    {\n        return checkIf(this::isFocusable);\n    }\n\n    public ActionableObject isNotFocusable()\n    {\n        return check(ViewAssertions.matches(Matchers.not(ViewMatchers.isFocusable())));\n    }\n\n    public boolean checkIfIsNotFocusable()\n    {\n        return checkIf(this::isNotFocusable);\n    }\n\n    public ActionableObject isEnabled()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isEnabled()));\n    }\n\n    public boolean checkIfIsEnabled()\n    {\n        return checkIf(this::isEnabled);\n    }\n\n    public ActionableObject isDisabled()\n    {\n        return check(ViewAssertions.matches(Matchers.not(ViewMatchers.isEnabled())));\n    }\n\n    public boolean checkIfIsDisabled()\n    {\n        return checkIf(this::isDisabled);\n    }\n\n    public ActionableObject isSelected()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isSelected()));\n    }\n\n    public boolean checkIfIsSelected()\n    {\n        return checkIf(this::isSelected);\n    }\n\n    public ActionableObject isNotSelected()\n    {\n        return check(ViewAssertions.matches(Matchers.not(ViewMatchers.isSelected())));\n    }\n\n    public boolean checkIfIsNotSelected()\n    {\n        return checkIf(this::isNotSelected);\n    }\n\n    public ActionableObject isDisplayed()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isDisplayed()));\n    }\n\n    public boolean checkIfIsDisplayed()\n    {\n        return checkIf(this::isDisplayed);\n    }\n\n    public ActionableObject isCompletelyDisplayed()\n    {\n        return check(ViewAssertions.matches(ViewMatchers.isCompletelyDisplayed()));\n    }\n\n    public boolean checkIfIsCompletelyDisplayed()\n    {\n        return checkIf(this::isCompletelyDisplayed);\n    }\n\n    public ActionableObject isNotDisplayed()\n    {\n        return check(ViewAssertions.matches(Matchers.not(ViewMatchers.isDisplayed())));\n    }\n\n    public boolean checkIfIsNotDisplayed()\n    {\n        return checkIf(this::isNotDisplayed);\n    }\n\n    public ActionableObject hasDrawable()\n    {\n        return check(ViewAssertions.matches(hasDrawableImageView()));\n    }\n\n    public boolean checkIfHasDrawable()\n    {\n        return checkIf(this::hasDrawable);\n    }\n\n    public ActionableObject doesNotHaveDrawable()\n    {\n        return check(ViewAssertions.matches(Matchers.not(hasDrawableImageView())));\n    }\n\n    public boolean checkIfDoesNotHaveDrawable()\n    {\n        return checkIf(this::doesNotHaveDrawable);\n    }\n\n    public abstract ActionableObject check(ViewAssertion viewAssertion);\n\n    public abstract ActionableObject perform(ViewAction viewAction);\n\n    public abstract String text();\n\n    private boolean checkIf(Runnable runnable)\n    {\n        try\n        {\n            runnable.run();\n\n            return true;\n        }\n        catch (Exception e)\n        {\n            return false;\n        }\n    }\n\n    public BoundedMatcher<View, ImageView> hasDrawableImageView()\n    {\n        return new BoundedMatcher<View, ImageView>(ImageView.class)\n        {\n            @Override\n            public void describeTo(Description description)\n            {\n                description.appendText(\"has drawable\");\n            }\n\n            @Override\n            public boolean matchesSafely(ImageView imageView)\n            {\n                return (imageView.getDrawable() != null);\n            }\n        };\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/interactions/ActionableView.java",
    "content": "package com.mauriciotogneri.greencoffee.interactions;\n\nimport android.support.test.espresso.UiController;\nimport android.support.test.espresso.ViewAction;\nimport android.support.test.espresso.ViewAssertion;\nimport android.support.test.espresso.ViewInteraction;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport org.hamcrest.Matcher;\n\nimport static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;\n\npublic class ActionableView extends ActionableObject\n{\n    private final ViewInteraction viewInteraction;\n\n    public ActionableView(ViewInteraction viewInteraction)\n    {\n        this.viewInteraction = viewInteraction;\n    }\n\n    @Override\n    public ActionableObject check(ViewAssertion viewAssertion)\n    {\n        return new ActionableView(viewInteraction.check(viewAssertion));\n    }\n\n    @Override\n    public ActionableObject perform(ViewAction viewAction)\n    {\n        return new ActionableView(viewInteraction.perform(viewAction));\n    }\n\n    @Override\n    public String text()\n    {\n        String[] stringHolder = {null};\n\n        viewInteraction.perform(new ViewAction()\n        {\n            @Override\n            public Matcher<View> getConstraints()\n            {\n                return isAssignableFrom(TextView.class);\n            }\n\n            @Override\n            public String getDescription()\n            {\n                return \"getting text from a TextView\";\n            }\n\n            @Override\n            public void perform(UiController uiController, View view)\n            {\n                TextView textView = (TextView) view;\n                stringHolder[0] = textView.getText().toString();\n            }\n        });\n\n        return stringHolder[0];\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/interactions/DataMatcher.java",
    "content": "package com.mauriciotogneri.greencoffee.interactions;\n\nimport android.support.annotation.IdRes;\nimport android.support.test.espresso.DataInteraction;\nimport android.support.test.espresso.matcher.BoundedMatcher;\n\nimport org.hamcrest.Description;\nimport org.hamcrest.Matcher;\n\nimport static android.support.test.espresso.Espresso.onData;\nimport static android.support.test.espresso.matcher.ViewMatchers.withId;\n\npublic class DataMatcher<T, C>\n{\n    private final int resourceId;\n    private final Class<T> clazz;\n\n    public DataMatcher(@IdRes int resourceId, Class<T> clazz)\n    {\n        this.resourceId = resourceId;\n        this.clazz = clazz;\n    }\n\n    public DataMatcher(Class<T> clazz)\n    {\n        this(0, clazz);\n    }\n\n    public ActionableData with(C content)\n    {\n        DataInteraction dataInteraction = onData(dataMatcher(content));\n\n        if (resourceId != 0)\n        {\n            return new ActionableData(dataInteraction.inAdapterView(withId(resourceId)));\n        }\n        else\n        {\n            return new ActionableData(dataInteraction);\n        }\n    }\n\n    private Matcher<Object> dataMatcher(C content)\n    {\n        DataMatcher<T, C> dataMatcher = this;\n\n        return new BoundedMatcher<Object, T>(clazz)\n        {\n            @Override\n            public boolean matchesSafely(T data)\n            {\n                return dataMatcher.matches(data, content);\n            }\n\n            @Override\n            public void describeTo(Description description)\n            {\n                description.appendText(String.format(\"with content: '%s'\", content));\n            }\n        };\n    }\n\n    public boolean matches(T element, C content)\n    {\n        return element.equals(content);\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/com/mauriciotogneri/greencoffee/interactions/ObjectMatcher.java",
    "content": "package com.mauriciotogneri.greencoffee.interactions;\n\nimport org.hamcrest.BaseMatcher;\nimport org.hamcrest.Description;\n\npublic class ObjectMatcher<T> extends BaseMatcher<T>\n{\n    private final T element;\n\n    public ObjectMatcher(T element)\n    {\n        this.element = element;\n    }\n\n    @Override\n    public boolean matches(Object object)\n    {\n        return element.equals(object);\n    }\n\n    @Override\n    public void describeTo(Description description)\n    {\n        description.appendText(\"Spinner matcher for: \" + element);\n    }\n}"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/AstBuilder.java",
    "content": "package gherkin;\n\nimport gherkin.ast.Background;\nimport gherkin.ast.Comment;\nimport gherkin.ast.DataTable;\nimport gherkin.ast.DocString;\nimport gherkin.ast.Examples;\nimport gherkin.ast.Feature;\nimport gherkin.ast.GherkinDocument;\nimport gherkin.ast.Location;\nimport gherkin.ast.Node;\nimport gherkin.ast.Scenario;\nimport gherkin.ast.ScenarioDefinition;\nimport gherkin.ast.ScenarioOutline;\nimport gherkin.ast.Step;\nimport gherkin.ast.TableCell;\nimport gherkin.ast.TableRow;\nimport gherkin.ast.Tag;\n\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.Deque;\nimport java.util.List;\n\nimport static gherkin.Parser.Builder;\nimport static gherkin.Parser.RuleType;\nimport static gherkin.Parser.TokenType;\nimport static gherkin.StringUtils.join;\n\npublic class AstBuilder implements Builder<GherkinDocument> {\n    private Deque<AstNode> stack;\n    private List<Comment> comments;\n\n    public AstBuilder() {\n        reset();\n    }\n\n    @Override\n    public void reset() {\n        stack = new ArrayDeque<>();\n        stack.push(new AstNode(RuleType.None));\n\n        comments = new ArrayList<>();\n    }\n\n    private AstNode currentNode() {\n        return stack.peek();\n    }\n\n    @Override\n    public void build(Token token) {\n        RuleType ruleType = RuleType.cast(token.matchedType);\n        if (token.matchedType == TokenType.Comment) {\n            comments.add(new Comment(getLocation(token, 0), token.matchedText));\n        } else {\n            currentNode().add(ruleType, token);\n        }\n    }\n\n    @Override\n    public void startRule(RuleType ruleType) {\n        stack.push(new AstNode(ruleType));\n    }\n\n    @Override\n    public void endRule(RuleType ruleType) {\n        AstNode node = stack.pop();\n        Object transformedNode = getTransformedNode(node);\n        currentNode().add(node.ruleType, transformedNode);\n    }\n\n    private Object getTransformedNode(AstNode node) {\n        switch (node.ruleType) {\n            case Step: {\n                Token stepLine = node.getToken(TokenType.StepLine);\n                Node stepArg = node.getSingle(RuleType.DataTable, null);\n                if (stepArg == null) {\n                    stepArg = node.getSingle(RuleType.DocString, null);\n                }\n                return new Step(getLocation(stepLine, 0), stepLine.matchedKeyword, stepLine.matchedText, stepArg);\n            }\n            case DocString: {\n                Token separatorToken = node.getTokens(TokenType.DocStringSeparator).get(0);\n                String contentType = separatorToken.matchedText.length() > 0 ? separatorToken.matchedText : null;\n                List<Token> lineTokens = node.getTokens(TokenType.Other);\n                StringBuilder content = new StringBuilder();\n                boolean newLine = false;\n                for (Token lineToken : lineTokens) {\n                    if (newLine) content.append(\"\\n\");\n                    newLine = true;\n                    content.append(lineToken.matchedText);\n                }\n                return new DocString(getLocation(separatorToken, 0), contentType, content.toString());\n            }\n            case DataTable: {\n                List<TableRow> rows = getTableRows(node);\n                return new DataTable(rows);\n            }\n            case Background: {\n                Token backgroundLine = node.getToken(TokenType.BackgroundLine);\n                String description = getDescription(node);\n                List<Step> steps = getSteps(node);\n                return new Background(getLocation(backgroundLine, 0), backgroundLine.matchedKeyword, backgroundLine.matchedText, description, steps);\n            }\n            case Scenario_Definition: {\n                List<Tag> tags = getTags(node);\n                AstNode scenarioNode = node.getSingle(RuleType.Scenario, null);\n\n                if (scenarioNode != null) {\n                    Token scenarioLine = scenarioNode.getToken(TokenType.ScenarioLine);\n                    String description = getDescription(scenarioNode);\n                    List<Step> steps = getSteps(scenarioNode);\n\n                    return new Scenario(tags, getLocation(scenarioLine, 0), scenarioLine.matchedKeyword, scenarioLine.matchedText, description, steps);\n                } else {\n                    AstNode scenarioOutlineNode = node.getSingle(RuleType.ScenarioOutline, null);\n                    if (scenarioOutlineNode == null) {\n                        throw new RuntimeException(\"Internal grammar error\");\n                    }\n                    Token scenarioOutlineLine = scenarioOutlineNode.getToken(TokenType.ScenarioOutlineLine);\n                    String description = getDescription(scenarioOutlineNode);\n                    List<Step> steps = getSteps(scenarioOutlineNode);\n\n                    List<Examples> examplesList = scenarioOutlineNode.getItems(RuleType.Examples_Definition);\n\n                    return new ScenarioOutline(tags, getLocation(scenarioOutlineLine, 0), scenarioOutlineLine.matchedKeyword, scenarioOutlineLine.matchedText, description, steps, examplesList);\n\n                }\n            }\n            case Examples_Definition: {\n                List<Tag> tags = getTags(node);\n                AstNode examplesNode = node.getSingle(RuleType.Examples, null);\n                Token examplesLine = examplesNode.getToken(TokenType.ExamplesLine);\n                String description = getDescription(examplesNode);\n                List<TableRow> rows = examplesNode.getSingle(RuleType.Examples_Table, null);\n                TableRow tableHeader = rows != null && !rows.isEmpty() ? rows.get(0) : null;\n                List<TableRow> tableBody = rows != null && !rows.isEmpty() ? rows.subList(1, rows.size()) : null;\n                return new Examples(getLocation(examplesLine, 0), tags, examplesLine.matchedKeyword, examplesLine.matchedText, description, tableHeader, tableBody);\n            }\n            case Examples_Table: {\n                return getTableRows(node);\n            }\n            case Description: {\n                List<Token> lineTokens = node.getTokens(TokenType.Other);\n                // Trim trailing empty lines\n                int end = lineTokens.size();\n                while (end > 0 && lineTokens.get(end - 1).matchedText.matches(\"\\\\s*\")) {\n                    end--;\n                }\n                lineTokens = lineTokens.subList(0, end);\n\n                return join(new StringUtils.ToString<Token>() {\n                    @Override\n                    public String toString(Token t) {\n                        return t.matchedText;\n                    }\n                }, \"\\n\", lineTokens);\n            }\n            case Feature: {\n                AstNode header = node.getSingle(RuleType.Feature_Header, new AstNode(RuleType.Feature_Header));\n                if (header == null) return null;\n                List<Tag> tags = getTags(header);\n                Token featureLine = header.getToken(TokenType.FeatureLine);\n                if (featureLine == null) return null;\n                List<ScenarioDefinition> scenarioDefinitions = new ArrayList<>();\n                Background background = node.getSingle(RuleType.Background, null);\n                if (background != null) scenarioDefinitions.add(background);\n                scenarioDefinitions.addAll(node.<ScenarioDefinition>getItems(RuleType.Scenario_Definition));\n                String description = getDescription(header);\n                if (featureLine.matchedGherkinDialect == null) return null;\n                String language = featureLine.matchedGherkinDialect.getLanguage();\n\n                return new Feature(tags, getLocation(featureLine, 0), language, featureLine.matchedKeyword, featureLine.matchedText, description, scenarioDefinitions);\n            }\n            case GherkinDocument: {\n                Feature feature = node.getSingle(RuleType.Feature, null);\n\n                return new GherkinDocument(feature, comments);\n            }\n\n        }\n        return node;\n    }\n\n    private List<TableRow> getTableRows(AstNode node) {\n        List<TableRow> rows = new ArrayList<>();\n        for (Token token : node.getTokens(TokenType.TableRow)) {\n            rows.add(new TableRow(getLocation(token, 0), getCells(token)));\n        }\n        ensureCellCount(rows);\n        return rows;\n    }\n\n    private void ensureCellCount(List<TableRow> rows) {\n        if (rows.isEmpty()) return;\n\n        int cellCount = rows.get(0).getCells().size();\n        for (TableRow row : rows) {\n            if (row.getCells().size() != cellCount) {\n                throw new ParserException.AstBuilderException(\"inconsistent cell count within the table\", row.getLocation());\n            }\n        }\n    }\n\n    private List<TableCell> getCells(Token token) {\n        List<TableCell> cells = new ArrayList<>();\n        for (GherkinLineSpan cellItem : token.mathcedItems) {\n            cells.add(new TableCell(getLocation(token, cellItem.column), cellItem.text));\n        }\n        return cells;\n    }\n\n    private List<Step> getSteps(AstNode node) {\n        return node.getItems(RuleType.Step);\n    }\n\n    private Location getLocation(Token token, int column) {\n        return column == 0 ? token.location : new Location(token.location.getLine(), column);\n    }\n\n    private String getDescription(AstNode node) {\n        return node.getSingle(RuleType.Description, null);\n    }\n\n    private List<Tag> getTags(AstNode node) {\n        AstNode tagsNode = node.getSingle(RuleType.Tags, new AstNode(RuleType.None));\n        if (tagsNode == null)\n            return new ArrayList<>();\n\n        List<Token> tokens = tagsNode.getTokens(TokenType.TagLine);\n        List<Tag> tags = new ArrayList<>();\n        for (Token token : tokens) {\n            for (GherkinLineSpan tagItem : token.mathcedItems) {\n                tags.add(new Tag(getLocation(token, tagItem.column), tagItem.text));\n            }\n        }\n        return tags;\n    }\n\n    @Override\n    public GherkinDocument getResult() {\n        return currentNode().getSingle(RuleType.GherkinDocument, null);\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/AstNode.java",
    "content": "package gherkin;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport static gherkin.Parser.RuleType;\nimport static gherkin.Parser.TokenType;\n\npublic class AstNode {\n    private final Map<RuleType, List<Object>> subItems = new HashMap<RuleType, List<Object>>();\n    public final RuleType ruleType;\n\n    public AstNode(RuleType ruleType) {\n        this.ruleType = ruleType;\n    }\n\n    public void add(RuleType ruleType, Object obj) {\n        List<Object> items = subItems.get(ruleType);\n        if (items == null) {\n            items = new ArrayList<Object>();\n            subItems.put(ruleType, items);\n        }\n        items.add(obj);\n    }\n\n    public <T> T getSingle(RuleType ruleType, T defaultResult) {\n        List<Object> items = getItems(ruleType);\n        return (T) (items.isEmpty() ? defaultResult : items.get(0));\n    }\n\n    public <T> List<T> getItems(RuleType ruleType) {\n        List<T> items = (List<T>) subItems.get(ruleType);\n        if (items == null) {\n            return Collections.emptyList();\n        }\n        return items;\n    }\n\n    public Token getToken(TokenType tokenType) {\n        RuleType ruleType = RuleType.cast(tokenType);\n        return getSingle(ruleType, new Token(null, null));\n    }\n\n    public List<Token> getTokens(TokenType tokenType) {\n        return getItems(RuleType.cast(tokenType));\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/Func.java",
    "content": "package gherkin;\n\npublic interface Func<V> {\n    V call();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/GenerateTokens.java",
    "content": "package gherkin;\n\nimport gherkin.stream.Stdio;\n\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.io.InputStreamReader;\nimport java.io.UnsupportedEncodingException;\n\npublic class GenerateTokens {\n    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {\n        TokenFormatterBuilder builder = new TokenFormatterBuilder();\n        Parser<String> parser = new Parser<>(builder);\n        TokenMatcher matcher = new TokenMatcher();\n        for (String fileName : args) {\n            InputStreamReader in = new InputStreamReader(new FileInputStream(fileName), \"UTF-8\");\n            String result = parser.parse(in, matcher);\n            Stdio.out.print(result);\n            Stdio.out.flush(); // print doesn't autoflush\n        }\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/GherkinDialect.java",
    "content": "package gherkin;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\npublic class GherkinDialect {\n    private final Map<String, List<String>> keywords;\n    private String language;\n\n    public GherkinDialect(String language, Map<String, List<String>> keywords) {\n        this.language = language;\n        this.keywords = keywords;\n    }\n\n    public List<String> getFeatureKeywords() {\n        return keywords.get(\"feature\");\n    }\n\n    public List<String> getScenarioKeywords() {\n        return keywords.get(\"scenario\");\n    }\n\n    public List<String> getStepKeywords() {\n        List<String> result = new ArrayList<>();\n        result.addAll(keywords.get(\"given\"));\n        result.addAll(keywords.get(\"when\"));\n        result.addAll(keywords.get(\"then\"));\n        result.addAll(keywords.get(\"and\"));\n        result.addAll(keywords.get(\"but\"));\n        return result;\n    }\n\n    public List<String> getBackgroundKeywords() {\n        return keywords.get(\"background\");\n    }\n\n    public List<String> getScenarioOutlineKeywords() {\n        return keywords.get(\"scenarioOutline\");\n    }\n\n    public List<String> getExamplesKeywords() {\n        return keywords.get(\"examples\");\n    }\n\n    public String getLanguage() {\n        return language;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/GherkinDialectProvider.java",
    "content": "package gherkin;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport gherkin.ast.Location;\nimport gherkin.deps.com.google.gson.Gson;\n\npublic class GherkinDialectProvider implements IGherkinDialectProvider {\n    private static Map<String, Map<String, List<String>>> DIALECTS;\n    private final String default_dialect_name;\n\n    static {\n        Gson gson = new Gson();\n        try {\n            //Reader dialects = new InputStreamReader(GherkinDialectProvider.class.getResourceAsStream(\"/gherkin/gherkin-languages.json\"), \"UTF-8\");\n            String dialects = \"{\\n\" +\n                    \"  \\\"af\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"En \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Agtergrond\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Maar \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Voorbeelde\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funksie\\\",\\n\" +\n                    \"      \\\"Besigheid Behoefte\\\",\\n\" +\n                    \"      \\\"Vermoë\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Gegewe \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Afrikaans\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Afrikaans\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Situasie\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Situasie Uiteensetting\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dan \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Wanneer \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"am\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Եվ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Կոնտեքստ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Բայց \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Օրինակներ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Ֆունկցիոնալություն\\\",\\n\" +\n                    \"      \\\"Հատկություն\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Դիցուք \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Armenian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"հայերեն\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Սցենար\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Սցենարի կառուցվացքը\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ապա \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Եթե \\\",\\n\" +\n                    \"      \\\"Երբ \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ar\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"و \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"الخلفية\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"لكن \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"امثلة\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"خاصية\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"بفرض \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Arabic\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"العربية\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"سيناريو\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"سيناريو مخطط\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"اذاً \\\",\\n\" +\n                    \"      \\\"ثم \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"متى \\\",\\n\" +\n                    \"      \\\"عندما \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ast\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Y \\\",\\n\" +\n                    \"      \\\"Ya \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Antecedentes\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Peru \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Exemplos\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Carauterística\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dáu \\\",\\n\" +\n                    \"      \\\"Dada \\\",\\n\" +\n                    \"      \\\"Daos \\\",\\n\" +\n                    \"      \\\"Daes \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Asturian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"asturianu\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Casu\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Esbozu del casu\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Entós \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Cuando \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"az\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Və \\\",\\n\" +\n                    \"      \\\"Həm \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Keçmiş\\\",\\n\" +\n                    \"      \\\"Kontekst\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Amma \\\",\\n\" +\n                    \"      \\\"Ancaq \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Nümunələr\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Özəllik\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tutaq ki \\\",\\n\" +\n                    \"      \\\"Verilir \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Azerbaijani\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Azərbaycanca\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Ssenari\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Ssenarinin strukturu\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"O halda \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Əgər \\\",\\n\" +\n                    \"      \\\"Nə vaxt ki \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"bg\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"И \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Предистория\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Но \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Примери\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Функционалност\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Дадено \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Bulgarian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"български\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценарий\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Рамка на сценарий\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"То \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Когато \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"bm\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dan \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Latar Belakang\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tetapi \\\",\\n\" +\n                    \"      \\\"Tapi \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Contoh\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Fungsi\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Diberi \\\",\\n\" +\n                    \"      \\\"Bagi \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Malay\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Bahasa Melayu\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Senario\\\",\\n\" +\n                    \"      \\\"Situasi\\\",\\n\" +\n                    \"      \\\"Keadaan\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Kerangka Senario\\\",\\n\" +\n                    \"      \\\"Kerangka Situasi\\\",\\n\" +\n                    \"      \\\"Kerangka Keadaan\\\",\\n\" +\n                    \"      \\\"Garis Panduan Senario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Maka \\\",\\n\" +\n                    \"      \\\"Kemudian \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Apabila \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"bs\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"I \\\",\\n\" +\n                    \"      \\\"A \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Pozadina\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ali \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Primjeri\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Karakteristika\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dato \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Bosnian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Bosanski\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenariju\\\",\\n\" +\n                    \"      \\\"Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Scenariju-obris\\\",\\n\" +\n                    \"      \\\"Scenario-outline\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Zatim \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kada \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ca\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"I \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Rerefons\\\",\\n\" +\n                    \"      \\\"Antecedents\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Però \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Exemples\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Característica\\\",\\n\" +\n                    \"      \\\"Funcionalitat\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Donat \\\",\\n\" +\n                    \"      \\\"Donada \\\",\\n\" +\n                    \"      \\\"Atès \\\",\\n\" +\n                    \"      \\\"Atesa \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Catalan\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"català\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Escenari\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Esquema de l'escenari\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Aleshores \\\",\\n\" +\n                    \"      \\\"Cal \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Quan \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"cs\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"A také \\\",\\n\" +\n                    \"      \\\"A \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Pozadí\\\",\\n\" +\n                    \"      \\\"Kontext\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ale \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Příklady\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Požadavek\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Pokud \\\",\\n\" +\n                    \"      \\\"Za předpokladu \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Czech\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Česky\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scénář\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Náčrt Scénáře\\\",\\n\" +\n                    \"      \\\"Osnova scénáře\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Pak \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Když \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"cy-GB\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"A \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Cefndir\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ond \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Enghreifftiau\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Arwedd\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Anrhegedig a \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Welsh\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Cymraeg\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Scenario Amlinellol\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Yna \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Pryd \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"da\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Og \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Baggrund\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Men \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Eksempler\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Egenskab\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Givet \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Danish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"dansk\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenarie\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Abstrakt Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Så \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Når \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"de\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Und \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Grundlage\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Aber \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Beispiele\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funktionalität\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Angenommen \\\",\\n\" +\n                    \"      \\\"Gegeben sei \\\",\\n\" +\n                    \"      \\\"Gegeben seien \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"German\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Deutsch\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Szenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Szenariogrundriss\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dann \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Wenn \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"el\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Και \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Υπόβαθρο\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Αλλά \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Παραδείγματα\\\",\\n\" +\n                    \"      \\\"Σενάρια\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Δυνατότητα\\\",\\n\" +\n                    \"      \\\"Λειτουργία\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Δεδομένου \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Greek\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Ελληνικά\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Σενάριο\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Περιγραφή Σεναρίου\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Τότε \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Όταν \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"em\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"\\uD83D\\uDE02\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"\\uD83D\\uDCA4\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"\\uD83D\\uDE14\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"\\uD83D\\uDCD3\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"\\uD83D\\uDCDA\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"\\uD83D\\uDE10\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Emoji\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"\\uD83D\\uDE00\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"\\uD83D\\uDCD5\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"\\uD83D\\uDCD6\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"\\uD83D\\uDE4F\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"\\uD83C\\uDFAC\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"en\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"And \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Background\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"But \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Examples\\\",\\n\" +\n                    \"      \\\"Scenarios\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Feature\\\",\\n\" +\n                    \"      \\\"Business Need\\\",\\n\" +\n                    \"      \\\"Ability\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Given \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"English\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"English\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Scenario Outline\\\",\\n\" +\n                    \"      \\\"Scenario Template\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Then \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"When \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"en-Scouse\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"An \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Dis is what went down\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Buh \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Examples\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Feature\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Givun \\\",\\n\" +\n                    \"      \\\"Youse know when youse got \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Scouse\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Scouse\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"The thing of it is\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Wharrimean is\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dun \\\",\\n\" +\n                    \"      \\\"Den youse gotta \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Wun \\\",\\n\" +\n                    \"      \\\"Youse know like when \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"en-au\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Too right \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"First off\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Yeah nah \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"You'll wanna\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Pretty much\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Y'know \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Australian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Australian\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Awww, look mate\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Reckon it's like\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"But at the end of the day I reckon \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"It's just unbelievable \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"en-lol\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"AN \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"B4\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"BUT \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"EXAMPLZ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"OH HAI\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"I CAN HAZ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"LOLCAT\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"LOLCAT\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"MISHUN\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"MISHUN SRSLY\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"DEN \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"WEN \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"en-old\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ond \\\",\\n\" +\n                    \"      \\\"7 \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Aer\\\",\\n\" +\n                    \"      \\\"Ær\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ac \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Se the\\\",\\n\" +\n                    \"      \\\"Se þe\\\",\\n\" +\n                    \"      \\\"Se ðe\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Hwaet\\\",\\n\" +\n                    \"      \\\"Hwæt\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Thurh \\\",\\n\" +\n                    \"      \\\"Þurh \\\",\\n\" +\n                    \"      \\\"Ðurh \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Old English\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Englisc\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Swa\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Swa hwaer swa\\\",\\n\" +\n                    \"      \\\"Swa hwær swa\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tha \\\",\\n\" +\n                    \"      \\\"Þa \\\",\\n\" +\n                    \"      \\\"Ða \\\",\\n\" +\n                    \"      \\\"Tha the \\\",\\n\" +\n                    \"      \\\"Þa þe \\\",\\n\" +\n                    \"      \\\"Ða ðe \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tha \\\",\\n\" +\n                    \"      \\\"Þa \\\",\\n\" +\n                    \"      \\\"Ða \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"en-pirate\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Aye \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Yo-ho-ho\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Avast! \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Dead men tell no tales\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Ahoy matey!\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Gangway! \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Pirate\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Pirate\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Heave to\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Shiver me timbers\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Let go and haul \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Blimey! \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"eo\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kaj \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Fono\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Sed \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Ekzemploj\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Trajto\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Donitaĵo \\\",\\n\" +\n                    \"      \\\"Komence \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Esperanto\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Esperanto\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenaro\\\",\\n\" +\n                    \"      \\\"Kazo\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Konturo de la scenaro\\\",\\n\" +\n                    \"      \\\"Skizo\\\",\\n\" +\n                    \"      \\\"Kazo-skizo\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Do \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Se \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"es\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Y \\\",\\n\" +\n                    \"      \\\"E \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Antecedentes\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Pero \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Ejemplos\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Característica\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dado \\\",\\n\" +\n                    \"      \\\"Dada \\\",\\n\" +\n                    \"      \\\"Dados \\\",\\n\" +\n                    \"      \\\"Dadas \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Spanish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"español\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Escenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Esquema del escenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Entonces \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Cuando \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"et\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ja \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Taust\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kuid \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Juhtumid\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Omadus\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Eeldades \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Estonian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"eesti keel\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Stsenaarium\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Raamstsenaarium\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Siis \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kui \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"fa\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"و \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"زمینه\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"اما \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"نمونه ها\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"وِیژگی\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"با فرض \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Persian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"فارسی\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"سناریو\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"الگوی سناریو\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"آنگاه \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"هنگامی \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"fi\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ja \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Tausta\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Mutta \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Tapaukset\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Ominaisuus\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Oletetaan \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Finnish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"suomi\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Tapaus\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Tapausaihio\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Niin \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kun \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"fr\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Et que \\\",\\n\" +\n                    \"      \\\"Et qu'\\\",\\n\" +\n                    \"      \\\"Et \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Contexte\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Mais que \\\",\\n\" +\n                    \"      \\\"Mais qu'\\\",\\n\" +\n                    \"      \\\"Mais \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Exemples\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Fonctionnalité\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Soit \\\",\\n\" +\n                    \"      \\\"Etant donné que \\\",\\n\" +\n                    \"      \\\"Etant donné qu'\\\",\\n\" +\n                    \"      \\\"Etant donné \\\",\\n\" +\n                    \"      \\\"Etant donnée \\\",\\n\" +\n                    \"      \\\"Etant donnés \\\",\\n\" +\n                    \"      \\\"Etant données \\\",\\n\" +\n                    \"      \\\"Étant donné que \\\",\\n\" +\n                    \"      \\\"Étant donné qu'\\\",\\n\" +\n                    \"      \\\"Étant donné \\\",\\n\" +\n                    \"      \\\"Étant donnée \\\",\\n\" +\n                    \"      \\\"Étant donnés \\\",\\n\" +\n                    \"      \\\"Étant données \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"French\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"français\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scénario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Plan du scénario\\\",\\n\" +\n                    \"      \\\"Plan du Scénario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Alors \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Quand \\\",\\n\" +\n                    \"      \\\"Lorsque \\\",\\n\" +\n                    \"      \\\"Lorsqu'\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ga\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Agus\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Cúlra\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ach\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Samplaí\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Gné\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Cuir i gcás go\\\",\\n\" +\n                    \"      \\\"Cuir i gcás nach\\\",\\n\" +\n                    \"      \\\"Cuir i gcás gur\\\",\\n\" +\n                    \"      \\\"Cuir i gcás nár\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Irish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Gaeilge\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Cás\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Cás Achomair\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ansin\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Nuair a\\\",\\n\" +\n                    \"      \\\"Nuair nach\\\",\\n\" +\n                    \"      \\\"Nuair ba\\\",\\n\" +\n                    \"      \\\"Nuair nár\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"gj\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"અને \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"બેકગ્રાઉન્ડ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"પણ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"ઉદાહરણો\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"લક્ષણ\\\",\\n\" +\n                    \"      \\\"વ્યાપાર જરૂર\\\",\\n\" +\n                    \"      \\\"ક્ષમતા\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"આપેલ છે \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Gujarati\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"ગુજરાતી\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"સ્થિતિ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"પરિદ્દશ્ય રૂપરેખા\\\",\\n\" +\n                    \"      \\\"પરિદ્દશ્ય ઢાંચો\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"પછી \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ક્યારે \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"gl\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"E \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Contexto\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Mais \\\",\\n\" +\n                    \"      \\\"Pero \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Exemplos\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Característica\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dado \\\",\\n\" +\n                    \"      \\\"Dada \\\",\\n\" +\n                    \"      \\\"Dados \\\",\\n\" +\n                    \"      \\\"Dadas \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Galician\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"galego\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Escenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Esbozo do escenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Entón \\\",\\n\" +\n                    \"      \\\"Logo \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Cando \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"he\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"וגם \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"רקע\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"אבל \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"דוגמאות\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"תכונה\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"בהינתן \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Hebrew\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"עברית\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"תרחיש\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"תבנית תרחיש\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"אז \\\",\\n\" +\n                    \"      \\\"אזי \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"כאשר \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"hi\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"और \\\",\\n\" +\n                    \"      \\\"तथा \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"पृष्ठभूमि\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"पर \\\",\\n\" +\n                    \"      \\\"परन्तु \\\",\\n\" +\n                    \"      \\\"किन्तु \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"उदाहरण\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"रूप लेख\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"अगर \\\",\\n\" +\n                    \"      \\\"यदि \\\",\\n\" +\n                    \"      \\\"चूंकि \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Hindi\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"हिंदी\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"परिदृश्य\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"परिदृश्य रूपरेखा\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"तब \\\",\\n\" +\n                    \"      \\\"तदा \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"जब \\\",\\n\" +\n                    \"      \\\"कदा \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"hr\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"I \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Pozadina\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ali \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Primjeri\\\",\\n\" +\n                    \"      \\\"Scenariji\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Osobina\\\",\\n\" +\n                    \"      \\\"Mogućnost\\\",\\n\" +\n                    \"      \\\"Mogucnost\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Zadan \\\",\\n\" +\n                    \"      \\\"Zadani \\\",\\n\" +\n                    \"      \\\"Zadano \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Croatian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"hrvatski\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenarij\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Skica\\\",\\n\" +\n                    \"      \\\"Koncept\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Onda \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kada \\\",\\n\" +\n                    \"      \\\"Kad \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ht\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ak \\\",\\n\" +\n                    \"      \\\"Epi \\\",\\n\" +\n                    \"      \\\"E \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Kontèks\\\",\\n\" +\n                    \"      \\\"Istorik\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Men \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Egzanp\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Karakteristik\\\",\\n\" +\n                    \"      \\\"Mak\\\",\\n\" +\n                    \"      \\\"Fonksyonalite\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Sipoze \\\",\\n\" +\n                    \"      \\\"Sipoze ke \\\",\\n\" +\n                    \"      \\\"Sipoze Ke \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Creole\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"kreyòl\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Senaryo\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Plan senaryo\\\",\\n\" +\n                    \"      \\\"Plan Senaryo\\\",\\n\" +\n                    \"      \\\"Senaryo deskripsyon\\\",\\n\" +\n                    \"      \\\"Senaryo Deskripsyon\\\",\\n\" +\n                    \"      \\\"Dyagram senaryo\\\",\\n\" +\n                    \"      \\\"Dyagram Senaryo\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Lè sa a \\\",\\n\" +\n                    \"      \\\"Le sa a \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Lè \\\",\\n\" +\n                    \"      \\\"Le \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"hu\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"És \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Háttér\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"De \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Példák\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Jellemző\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Amennyiben \\\",\\n\" +\n                    \"      \\\"Adott \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Hungarian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"magyar\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Forgatókönyv\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Forgatókönyv vázlat\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Akkor \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Majd \\\",\\n\" +\n                    \"      \\\"Ha \\\",\\n\" +\n                    \"      \\\"Amikor \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"id\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dan \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Dasar\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tapi \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Contoh\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Fitur\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dengan \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Indonesian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Bahasa Indonesia\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Skenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Skenario konsep\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Maka \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ketika \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"is\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Og \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Bakgrunnur\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"En \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Dæmi\\\",\\n\" +\n                    \"      \\\"Atburðarásir\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Eiginleiki\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ef \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Icelandic\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Íslenska\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Atburðarás\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Lýsing Atburðarásar\\\",\\n\" +\n                    \"      \\\"Lýsing Dæma\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Þá \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Þegar \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"it\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"E \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Contesto\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ma \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Esempi\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funzionalità\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dato \\\",\\n\" +\n                    \"      \\\"Data \\\",\\n\" +\n                    \"      \\\"Dati \\\",\\n\" +\n                    \"      \\\"Date \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Italian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"italiano\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Schema dello scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Allora \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Quando \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ja\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"かつ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"背景\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"しかし\\\",\\n\" +\n                    \"      \\\"但し\\\",\\n\" +\n                    \"      \\\"ただし\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"例\\\",\\n\" +\n                    \"      \\\"サンプル\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"フィーチャ\\\",\\n\" +\n                    \"      \\\"機能\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"前提\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Japanese\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"日本語\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"シナリオ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"シナリオアウトライン\\\",\\n\" +\n                    \"      \\\"シナリオテンプレート\\\",\\n\" +\n                    \"      \\\"テンプレ\\\",\\n\" +\n                    \"      \\\"シナリオテンプレ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ならば\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"もし\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"jv\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Lan \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Dasar\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tapi \\\",\\n\" +\n                    \"      \\\"Nanging \\\",\\n\" +\n                    \"      \\\"Ananging \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Conto\\\",\\n\" +\n                    \"      \\\"Contone\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Fitur\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Nalika \\\",\\n\" +\n                    \"      \\\"Nalikaning \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Javanese\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Basa Jawa\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Skenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Konsep skenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Njuk \\\",\\n\" +\n                    \"      \\\"Banjur \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Manawa \\\",\\n\" +\n                    \"      \\\"Menawa \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ka\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"და\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"კონტექსტი\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"მაგ\\u00ADრამ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"მაგალითები\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"თვისება\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"მოცემული\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Georgian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"ქართველი\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"სცენარის\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"სცენარის ნიმუში\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"მაშინ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"როდესაც\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"kn\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ಮತ್ತು \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"ಹಿನ್ನೆಲೆ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ಆದರೆ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"ಉದಾಹರಣೆಗಳು\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"ಹೆಚ್ಚಳ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ನೀಡಿದ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Kannada\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"ಕನ್ನಡ\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"ಕಥಾಸಾರಾಂಶ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"ವಿವರಣೆ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ನಂತರ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ಸ್ಥಿತಿಯನ್ನು \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ko\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"그리고\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"배경\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"하지만\\\",\\n\" +\n                    \"      \\\"단\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"예\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"기능\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"조건\\\",\\n\" +\n                    \"      \\\"먼저\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Korean\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"한국어\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"시나리오\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"시나리오 개요\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"그러면\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"만일\\\",\\n\" +\n                    \"      \\\"만약\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"lt\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ir \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Kontekstas\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Bet \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Pavyzdžiai\\\",\\n\" +\n                    \"      \\\"Scenarijai\\\",\\n\" +\n                    \"      \\\"Variantai\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Savybė\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Duota \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Lithuanian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"lietuvių kalba\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenarijus\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Scenarijaus šablonas\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tada \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kai \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"lu\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"an \\\",\\n\" +\n                    \"      \\\"a \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Hannergrond\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"awer \\\",\\n\" +\n                    \"      \\\"mä \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Beispiller\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funktionalitéit\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ugeholl \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Luxemburgish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Lëtzebuergesch\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Szenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Plang vum Szenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"dann \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"wann \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"lv\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Un \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Konteksts\\\",\\n\" +\n                    \"      \\\"Situācija\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Bet \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Piemēri\\\",\\n\" +\n                    \"      \\\"Paraugs\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funkcionalitāte\\\",\\n\" +\n                    \"      \\\"Fīča\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kad \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Latvian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"latviešu\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenārijs\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Scenārijs pēc parauga\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tad \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ja \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"mk-Cyrl\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"И \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Контекст\\\",\\n\" +\n                    \"      \\\"Содржина\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Но \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Примери\\\",\\n\" +\n                    \"      \\\"Сценарија\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Функционалност\\\",\\n\" +\n                    \"      \\\"Бизнис потреба\\\",\\n\" +\n                    \"      \\\"Можност\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Дадено \\\",\\n\" +\n                    \"      \\\"Дадена \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Macedonian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Македонски\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценарио\\\",\\n\" +\n                    \"      \\\"На пример\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Преглед на сценарија\\\",\\n\" +\n                    \"      \\\"Скица\\\",\\n\" +\n                    \"      \\\"Концепт\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Тогаш \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Кога \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"mk-Latn\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"I \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Kontekst\\\",\\n\" +\n                    \"      \\\"Sodrzhina\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"No \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Primeri\\\",\\n\" +\n                    \"      \\\"Scenaria\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funkcionalnost\\\",\\n\" +\n                    \"      \\\"Biznis potreba\\\",\\n\" +\n                    \"      \\\"Mozhnost\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dadeno \\\",\\n\" +\n                    \"      \\\"Dadena \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Macedonian (Latin)\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Makedonski (Latinica)\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\",\\n\" +\n                    \"      \\\"Na primer\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Pregled na scenarija\\\",\\n\" +\n                    \"      \\\"Skica\\\",\\n\" +\n                    \"      \\\"Koncept\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Togash \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Koga \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"mn\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Мөн \\\",\\n\" +\n                    \"      \\\"Тэгээд \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Агуулга\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Гэхдээ \\\",\\n\" +\n                    \"      \\\"Харин \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Тухайлбал\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Функц\\\",\\n\" +\n                    \"      \\\"Функционал\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Өгөгдсөн нь \\\",\\n\" +\n                    \"      \\\"Анх \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Mongolian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"монгол\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценар\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Сценарын төлөвлөгөө\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Тэгэхэд \\\",\\n\" +\n                    \"      \\\"Үүний дараа \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Хэрэв \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"nl\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"En \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Achtergrond\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Maar \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Voorbeelden\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Functionaliteit\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Gegeven \\\",\\n\" +\n                    \"      \\\"Stel \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Dutch\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Nederlands\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Abstract Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dan \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Als \\\",\\n\" +\n                    \"      \\\"Wanneer \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"no\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Og \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Bakgrunn\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Men \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Eksempler\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Egenskap\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Gitt \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Norwegian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"norsk\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Scenariomal\\\",\\n\" +\n                    \"      \\\"Abstrakt Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Så \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Når \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"pa\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ਅਤੇ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"ਪਿਛੋਕੜ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ਪਰ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"ਉਦਾਹਰਨਾਂ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"ਖਾਸੀਅਤ\\\",\\n\" +\n                    \"      \\\"ਮੁਹਾਂਦਰਾ\\\",\\n\" +\n                    \"      \\\"ਨਕਸ਼ ਨੁਹਾਰ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ਜੇਕਰ \\\",\\n\" +\n                    \"      \\\"ਜਿਵੇਂ ਕਿ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Panjabi\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"ਪੰਜਾਬੀ\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"ਪਟਕਥਾ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"ਪਟਕਥਾ ਢਾਂਚਾ\\\",\\n\" +\n                    \"      \\\"ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ਤਦ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ਜਦੋਂ \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"pl\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Oraz \\\",\\n\" +\n                    \"      \\\"I \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Założenia\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ale \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Przykłady\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Właściwość\\\",\\n\" +\n                    \"      \\\"Funkcja\\\",\\n\" +\n                    \"      \\\"Aspekt\\\",\\n\" +\n                    \"      \\\"Potrzeba biznesowa\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Zakładając \\\",\\n\" +\n                    \"      \\\"Mając \\\",\\n\" +\n                    \"      \\\"Zakładając, że \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Polish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"polski\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenariusz\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Szablon scenariusza\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Wtedy \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Jeżeli \\\",\\n\" +\n                    \"      \\\"Jeśli \\\",\\n\" +\n                    \"      \\\"Gdy \\\",\\n\" +\n                    \"      \\\"Kiedy \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"pt\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"E \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Contexto\\\",\\n\" +\n                    \"      \\\"Cenário de Fundo\\\",\\n\" +\n                    \"      \\\"Cenario de Fundo\\\",\\n\" +\n                    \"      \\\"Fundo\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Mas \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Exemplos\\\",\\n\" +\n                    \"      \\\"Cenários\\\",\\n\" +\n                    \"      \\\"Cenarios\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funcionalidade\\\",\\n\" +\n                    \"      \\\"Característica\\\",\\n\" +\n                    \"      \\\"Caracteristica\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dado \\\",\\n\" +\n                    \"      \\\"Dada \\\",\\n\" +\n                    \"      \\\"Dados \\\",\\n\" +\n                    \"      \\\"Dadas \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Portuguese\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"português\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Cenário\\\",\\n\" +\n                    \"      \\\"Cenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Esquema do Cenário\\\",\\n\" +\n                    \"      \\\"Esquema do Cenario\\\",\\n\" +\n                    \"      \\\"Delineação do Cenário\\\",\\n\" +\n                    \"      \\\"Delineacao do Cenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Então \\\",\\n\" +\n                    \"      \\\"Entao \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Quando \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ro\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Si \\\",\\n\" +\n                    \"      \\\"Și \\\",\\n\" +\n                    \"      \\\"Şi \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Context\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Dar \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Exemple\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Functionalitate\\\",\\n\" +\n                    \"      \\\"Funcționalitate\\\",\\n\" +\n                    \"      \\\"Funcţionalitate\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Date fiind \\\",\\n\" +\n                    \"      \\\"Dat fiind \\\",\\n\" +\n                    \"      \\\"Dati fiind \\\",\\n\" +\n                    \"      \\\"Dați fiind \\\",\\n\" +\n                    \"      \\\"Daţi fiind \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Romanian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"română\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenariu\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Structura scenariu\\\",\\n\" +\n                    \"      \\\"Structură scenariu\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Atunci \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Cand \\\",\\n\" +\n                    \"      \\\"Când \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ru\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"И \\\",\\n\" +\n                    \"      \\\"К тому же \\\",\\n\" +\n                    \"      \\\"Также \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Предыстория\\\",\\n\" +\n                    \"      \\\"Контекст\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Но \\\",\\n\" +\n                    \"      \\\"А \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Примеры\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Функция\\\",\\n\" +\n                    \"      \\\"Функциональность\\\",\\n\" +\n                    \"      \\\"Функционал\\\",\\n\" +\n                    \"      \\\"Свойство\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Допустим \\\",\\n\" +\n                    \"      \\\"Дано \\\",\\n\" +\n                    \"      \\\"Пусть \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Russian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"русский\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценарий\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Структура сценария\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"То \\\",\\n\" +\n                    \"      \\\"Затем \\\",\\n\" +\n                    \"      \\\"Тогда \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Если \\\",\\n\" +\n                    \"      \\\"Когда \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"sk\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"A \\\",\\n\" +\n                    \"      \\\"A tiež \\\",\\n\" +\n                    \"      \\\"A taktiež \\\",\\n\" +\n                    \"      \\\"A zároveň \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Pozadie\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ale \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Príklady\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Požiadavka\\\",\\n\" +\n                    \"      \\\"Funkcia\\\",\\n\" +\n                    \"      \\\"Vlastnosť\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Pokiaľ \\\",\\n\" +\n                    \"      \\\"Za predpokladu \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Slovak\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Slovensky\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenár\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Náčrt Scenáru\\\",\\n\" +\n                    \"      \\\"Náčrt Scenára\\\",\\n\" +\n                    \"      \\\"Osnova Scenára\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Tak \\\",\\n\" +\n                    \"      \\\"Potom \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Keď \\\",\\n\" +\n                    \"      \\\"Ak \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"sl\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"In \\\",\\n\" +\n                    \"      \\\"Ter \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Kontekst\\\",\\n\" +\n                    \"      \\\"Osnova\\\",\\n\" +\n                    \"      \\\"Ozadje\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"Toda \\\",\\n\" +\n                    \"      \\\"Ampak \\\",\\n\" +\n                    \"      \\\"Vendar \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Primeri\\\",\\n\" +\n                    \"      \\\"Scenariji\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funkcionalnost\\\",\\n\" +\n                    \"      \\\"Funkcija\\\",\\n\" +\n                    \"      \\\"Možnosti\\\",\\n\" +\n                    \"      \\\"Moznosti\\\",\\n\" +\n                    \"      \\\"Lastnost\\\",\\n\" +\n                    \"      \\\"Značilnost\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"Dano \\\",\\n\" +\n                    \"      \\\"Podano \\\",\\n\" +\n                    \"      \\\"Zaradi \\\",\\n\" +\n                    \"      \\\"Privzeto \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Slovenian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Slovenski\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenarij\\\",\\n\" +\n                    \"      \\\"Primer\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Struktura scenarija\\\",\\n\" +\n                    \"      \\\"Skica\\\",\\n\" +\n                    \"      \\\"Koncept\\\",\\n\" +\n                    \"      \\\"Oris scenarija\\\",\\n\" +\n                    \"      \\\"Osnutek\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"Nato \\\",\\n\" +\n                    \"      \\\"Potem \\\",\\n\" +\n                    \"      \\\"Takrat \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"Ko \\\",\\n\" +\n                    \"      \\\"Ce \\\",\\n\" +\n                    \"      \\\"Če \\\",\\n\" +\n                    \"      \\\"Kadar \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"sr-Cyrl\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"И \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Контекст\\\",\\n\" +\n                    \"      \\\"Основа\\\",\\n\" +\n                    \"      \\\"Позадина\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Али \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Примери\\\",\\n\" +\n                    \"      \\\"Сценарији\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Функционалност\\\",\\n\" +\n                    \"      \\\"Могућност\\\",\\n\" +\n                    \"      \\\"Особина\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"За дато \\\",\\n\" +\n                    \"      \\\"За дате \\\",\\n\" +\n                    \"      \\\"За дати \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Serbian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Српски\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценарио\\\",\\n\" +\n                    \"      \\\"Пример\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Структура сценарија\\\",\\n\" +\n                    \"      \\\"Скица\\\",\\n\" +\n                    \"      \\\"Концепт\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Онда \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Када \\\",\\n\" +\n                    \"      \\\"Кад \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"sr-Latn\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"I \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Kontekst\\\",\\n\" +\n                    \"      \\\"Osnova\\\",\\n\" +\n                    \"      \\\"Pozadina\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ali \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Primeri\\\",\\n\" +\n                    \"      \\\"Scenariji\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Funkcionalnost\\\",\\n\" +\n                    \"      \\\"Mogućnost\\\",\\n\" +\n                    \"      \\\"Mogucnost\\\",\\n\" +\n                    \"      \\\"Osobina\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Za dato \\\",\\n\" +\n                    \"      \\\"Za date \\\",\\n\" +\n                    \"      \\\"Za dati \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Serbian (Latin)\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Srpski (Latinica)\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\",\\n\" +\n                    \"      \\\"Primer\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Struktura scenarija\\\",\\n\" +\n                    \"      \\\"Skica\\\",\\n\" +\n                    \"      \\\"Koncept\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Onda \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Kada \\\",\\n\" +\n                    \"      \\\"Kad \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"sv\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Och \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Bakgrund\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Men \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Exempel\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Egenskap\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Givet \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Swedish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Svenska\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Scenario\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Abstrakt Scenario\\\",\\n\" +\n                    \"      \\\"Scenariomall\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Så \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"När \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ta\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"மேலும்  \\\",\\n\" +\n                    \"      \\\"மற்றும் \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"பின்னணி\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ஆனால்  \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"எடுத்துக்காட்டுகள்\\\",\\n\" +\n                    \"      \\\"காட்சிகள்\\\",\\n\" +\n                    \"      \\\" நிலைமைகளில்\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"அம்சம்\\\",\\n\" +\n                    \"      \\\"வணிக தேவை\\\",\\n\" +\n                    \"      \\\"திறன்\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"கொடுக்கப்பட்ட \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Tamil\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"தமிழ்\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"காட்சி\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"காட்சி சுருக்கம்\\\",\\n\" +\n                    \"      \\\"காட்சி வார்ப்புரு\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"அப்பொழுது \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"எப்போது \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"th\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"และ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"แนวคิด\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"แต่ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"ชุดของตัวอย่าง\\\",\\n\" +\n                    \"      \\\"ชุดของเหตุการณ์\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"โครงหลัก\\\",\\n\" +\n                    \"      \\\"ความต้องการทางธุรกิจ\\\",\\n\" +\n                    \"      \\\"ความสามารถ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"กำหนดให้ \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Thai\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"ไทย\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"เหตุการณ์\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"สรุปเหตุการณ์\\\",\\n\" +\n                    \"      \\\"โครงสร้างของเหตุการณ์\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ดังนั้น \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"เมื่อ \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"tl\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"మరియు \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"నేపథ్యం\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"కాని \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"ఉదాహరణలు\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"గుణము\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"చెప్పబడినది \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Telugu\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"తెలుగు\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"సన్నివేశం\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"కథనం\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"అప్పుడు \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ఈ పరిస్థితిలో \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"tlh\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"'ej \\\",\\n\" +\n                    \"      \\\"latlh \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"mo'\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"'ach \\\",\\n\" +\n                    \"      \\\"'a \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"ghantoH\\\",\\n\" +\n                    \"      \\\"lutmey\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Qap\\\",\\n\" +\n                    \"      \\\"Qu'meH 'ut\\\",\\n\" +\n                    \"      \\\"perbogh\\\",\\n\" +\n                    \"      \\\"poQbogh malja'\\\",\\n\" +\n                    \"      \\\"laH\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"ghu' noblu' \\\",\\n\" +\n                    \"      \\\"DaH ghu' bejlu' \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Klingon\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"tlhIngan\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"lut\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"lut chovnatlh\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"vaj \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"qaSDI' \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"tr\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ve \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Geçmiş\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Fakat \\\",\\n\" +\n                    \"      \\\"Ama \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Örnekler\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Özellik\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Diyelim ki \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Turkish\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Türkçe\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Senaryo\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Senaryo taslağı\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"O zaman \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Eğer ki \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"tt\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Һәм \\\",\\n\" +\n                    \"      \\\"Вә \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Кереш\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ләкин \\\",\\n\" +\n                    \"      \\\"Әмма \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Үрнәкләр\\\",\\n\" +\n                    \"      \\\"Мисаллар\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Мөмкинлек\\\",\\n\" +\n                    \"      \\\"Үзенчәлеклелек\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Әйтик \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Tatar\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Татарча\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценарий\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Сценарийның төзелеше\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Нәтиҗәдә \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Әгәр \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"uk\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"І \\\",\\n\" +\n                    \"      \\\"А також \\\",\\n\" +\n                    \"      \\\"Та \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Передумова\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Але \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Приклади\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Функціонал\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Припустимо \\\",\\n\" +\n                    \"      \\\"Припустимо, що \\\",\\n\" +\n                    \"      \\\"Нехай \\\",\\n\" +\n                    \"      \\\"Дано \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Ukrainian\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Українська\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценарій\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Структура сценарію\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"То \\\",\\n\" +\n                    \"      \\\"Тоді \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Якщо \\\",\\n\" +\n                    \"      \\\"Коли \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"ur\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"اور \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"پس منظر\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"لیکن \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"مثالیں\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"صلاحیت\\\",\\n\" +\n                    \"      \\\"کاروبار کی ضرورت\\\",\\n\" +\n                    \"      \\\"خصوصیت\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"اگر \\\",\\n\" +\n                    \"      \\\"بالفرض \\\",\\n\" +\n                    \"      \\\"فرض کیا \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Urdu\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"اردو\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"منظرنامہ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"منظر نامے کا خاکہ\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"پھر \\\",\\n\" +\n                    \"      \\\"تب \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"جب \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"uz\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Ва \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Тарих\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Лекин \\\",\\n\" +\n                    \"      \\\"Бирок \\\",\\n\" +\n                    \"      \\\"Аммо \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Мисоллар\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Функционал\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Агар \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Uzbek\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Узбекча\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Сценарий\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Сценарий структураси\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Унда \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Агар \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"vi\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Và \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"Bối cảnh\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Nhưng \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"Dữ liệu\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"Tính năng\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Biết \\\",\\n\" +\n                    \"      \\\"Cho \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Vietnamese\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"Tiếng Việt\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"Tình huống\\\",\\n\" +\n                    \"      \\\"Kịch bản\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"Khung tình huống\\\",\\n\" +\n                    \"      \\\"Khung kịch bản\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Thì \\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"Khi \\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"zh-CN\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"而且\\\",\\n\" +\n                    \"      \\\"并且\\\",\\n\" +\n                    \"      \\\"同时\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"背景\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"但是\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"例子\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"功能\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"假如\\\",\\n\" +\n                    \"      \\\"假设\\\",\\n\" +\n                    \"      \\\"假定\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Chinese simplified\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"简体中文\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"场景\\\",\\n\" +\n                    \"      \\\"剧本\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"场景大纲\\\",\\n\" +\n                    \"      \\\"剧本大纲\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"那么\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"当\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  },\\n\" +\n                    \"  \\\"zh-TW\\\": {\\n\" +\n                    \"    \\\"and\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"而且\\\",\\n\" +\n                    \"      \\\"並且\\\",\\n\" +\n                    \"      \\\"同時\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"background\\\": [\\n\" +\n                    \"      \\\"背景\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"but\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"但是\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"examples\\\": [\\n\" +\n                    \"      \\\"例子\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"feature\\\": [\\n\" +\n                    \"      \\\"功能\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"given\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"假如\\\",\\n\" +\n                    \"      \\\"假設\\\",\\n\" +\n                    \"      \\\"假定\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"name\\\": \\\"Chinese traditional\\\",\\n\" +\n                    \"    \\\"native\\\": \\\"繁體中文\\\",\\n\" +\n                    \"    \\\"scenario\\\": [\\n\" +\n                    \"      \\\"場景\\\",\\n\" +\n                    \"      \\\"劇本\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"scenarioOutline\\\": [\\n\" +\n                    \"      \\\"場景大綱\\\",\\n\" +\n                    \"      \\\"劇本大綱\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"then\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"那麼\\\"\\n\" +\n                    \"    ],\\n\" +\n                    \"    \\\"when\\\": [\\n\" +\n                    \"      \\\"* \\\",\\n\" +\n                    \"      \\\"當\\\"\\n\" +\n                    \"    ]\\n\" +\n                    \"  }\\n\" +\n                    \"}\\n\";\n            DIALECTS = gson.fromJson(dialects, Map.class);\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n\n    public GherkinDialectProvider(String default_dialect_name) {\n        this.default_dialect_name = default_dialect_name;\n    }\n\n    public GherkinDialectProvider() {\n        this(\"en\");\n    }\n\n    public GherkinDialect getDefaultDialect() {\n        return getDialect(default_dialect_name, null);\n    }\n\n    @Override\n    public GherkinDialect getDialect(String language, Location location) {\n        Map<String, List<String>> map = DIALECTS.get(language);\n        if (map == null) {\n            throw new ParserException.NoSuchLanguageException(language, location);\n        }\n\n        return new GherkinDialect(language, map);\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/GherkinLanguageConstants.java",
    "content": "package gherkin;\n\npublic interface GherkinLanguageConstants {\n    String TAG_PREFIX = \"@\";\n    String COMMENT_PREFIX = \"#\";\n    String TITLE_KEYWORD_SEPARATOR = \":\";\n    String TABLE_CELL_SEPARATOR = \"|\";\n    String DOCSTRING_SEPARATOR = \"\\\"\\\"\\\"\";\n    String DOCSTRING_ALTERNATIVE_SEPARATOR = \"```\";\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/GherkinLine.java",
    "content": "package gherkin;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Scanner;\n\nimport static gherkin.StringUtils.ltrim;\nimport static gherkin.SymbolCounter.countSymbols;\n\npublic class GherkinLine implements IGherkinLine {\n    private final String lineText;\n    private final String trimmedLineText;\n\n    public GherkinLine(String lineText) {\n        this.lineText = lineText;\n        this.trimmedLineText = ltrim(lineText);\n    }\n\n    @Override\n    public Integer indent() {\n        return countSymbols(lineText) - countSymbols(trimmedLineText);\n    }\n\n    @Override\n    public void detach() {\n\n    }\n\n    @Override\n    public String getLineText(int indentToRemove) {\n        if (indentToRemove < 0 || indentToRemove > indent())\n            return trimmedLineText;\n        return lineText.substring(indentToRemove);\n    }\n\n    @Override\n    public boolean isEmpty() {\n        return trimmedLineText.length() == 0;\n    }\n\n    @Override\n    public boolean startsWith(String prefix) {\n        return trimmedLineText.startsWith(prefix);\n    }\n\n    @Override\n    public String getRestTrimmed(int length) {\n        return trimmedLineText.substring(length).trim();\n    }\n\n    @Override\n    public List<GherkinLineSpan> getTags() {\n        return getSpans(\"\\\\s+\");\n    }\n\n    @Override\n    public boolean startsWithTitleKeyword(String text) {\n        int textLength = text.length();\n        return trimmedLineText.length() > textLength &&\n                trimmedLineText.startsWith(text) &&\n                trimmedLineText.substring(textLength, textLength + GherkinLanguageConstants.TITLE_KEYWORD_SEPARATOR.length())\n                        .equals(GherkinLanguageConstants.TITLE_KEYWORD_SEPARATOR);\n        // TODO aslak: extract startsWithFrom method for clarity\n    }\n\n    @Override\n    public List<GherkinLineSpan> getTableCells() {\n        List<GherkinLineSpan> lineSpans = new ArrayList<GherkinLineSpan>();\n        StringBuilder cell = new StringBuilder();\n        boolean beforeFirst = true;\n        int startCol = 0;\n        for (int col = 0; col < trimmedLineText.length(); col++) {\n            char c = trimmedLineText.charAt(col);\n            if (c == '|') {\n                if (beforeFirst) {\n                    // Skip the first empty span\n                    beforeFirst = false;\n                } else {\n                    int contentStart = 0;\n                    while (contentStart < cell.length() && Character.isWhitespace(cell.charAt(contentStart))) {\n                        contentStart++;\n                    }\n                    if (contentStart == cell.length()) {\n                        contentStart = 0;\n                    }\n                    lineSpans.add(new GherkinLineSpan(indent() + startCol + contentStart + 2, cell.toString().trim()));\n                    startCol = col;\n                }\n                cell = new StringBuilder();\n            } else if (c == '\\\\') {\n                col++;\n                c = trimmedLineText.charAt(col);\n                if (c == 'n') {\n                    cell.append('\\n');\n                } else {\n                    if (c != '|' && c != '\\\\') {\n                        cell.append('\\\\');\n                    }\n                    cell.append(c);\n                }\n            } else {\n                cell.append(c);\n            }\n        }\n\n        return lineSpans;\n    }\n\n    private List<GherkinLineSpan> getSpans(String delimiter) {\n        List<GherkinLineSpan> lineSpans = new ArrayList<GherkinLineSpan>();\n        Scanner scanner = new Scanner(trimmedLineText).useDelimiter(delimiter);\n        while (scanner.hasNext()) {\n            String cell = scanner.next();\n            int column = scanner.match().start() + indent() + 1;\n            lineSpans.add(new GherkinLineSpan(column, cell));\n        }\n        return lineSpans;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/GherkinLineSpan.java",
    "content": "package gherkin;\n\npublic class GherkinLineSpan {\n    // One-based line position\n    public final int column;\n\n    // text part of the line\n    public final String text;\n\n    public GherkinLineSpan(int column, String text) {\n        this.column = column;\n        this.text = text;\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n        GherkinLineSpan that = (GherkinLineSpan) o;\n        return column == that.column && text.equals(that.text);\n\n    }\n\n    @Override\n    public int hashCode() {\n        int result = column;\n        result = 31 * result + text.hashCode();\n        return result;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/IGherkinDialectProvider.java",
    "content": "package gherkin;\n\nimport gherkin.ast.Location;\n\npublic interface IGherkinDialectProvider {\n    GherkinDialect getDefaultDialect();\n\n    GherkinDialect getDialect(String language, Location location);\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/IGherkinLine.java",
    "content": "package gherkin;\n\nimport java.util.List;\n\npublic interface IGherkinLine {\n    Integer indent();\n\n    void detach();\n\n    String getLineText(int indentToRemove);\n\n    boolean isEmpty();\n\n    boolean startsWith(String prefix);\n\n    String getRestTrimmed(int length);\n\n    List<GherkinLineSpan> getTags();\n\n    boolean startsWithTitleKeyword(String keyword);\n\n    List<GherkinLineSpan> getTableCells();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/Parser.java",
    "content": "//      This code was generated by Berp (http://https://github.com/gasparnagy/berp/).\n//\n//      Changes to this file may cause incorrect behavior and will be lost if\n//      the code is regenerated.\n\n\npackage gherkin;\n\nimport java.io.Reader;\nimport java.io.StringReader;\nimport java.util.ArrayDeque;\nimport java.util.ArrayList;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Queue;\n\nimport static java.util.Arrays.asList;\n\npublic class Parser<T> {\n    public enum TokenType {\n        None,\n        EOF,\n        Empty,\n        Comment,\n        TagLine,\n        FeatureLine,\n        BackgroundLine,\n        ScenarioLine,\n        ScenarioOutlineLine,\n        ExamplesLine,\n        StepLine,\n        DocStringSeparator,\n        TableRow,\n        Language,\n        Other,\n        ;\n    }\n\n    public enum RuleType {\n        None,\n        _EOF, // #EOF\n        _Empty, // #Empty\n        _Comment, // #Comment\n        _TagLine, // #TagLine\n        _FeatureLine, // #FeatureLine\n        _BackgroundLine, // #BackgroundLine\n        _ScenarioLine, // #ScenarioLine\n        _ScenarioOutlineLine, // #ScenarioOutlineLine\n        _ExamplesLine, // #ExamplesLine\n        _StepLine, // #StepLine\n        _DocStringSeparator, // #DocStringSeparator\n        _TableRow, // #TableRow\n        _Language, // #Language\n        _Other, // #Other\n        GherkinDocument, // GherkinDocument! := Feature?\n        Feature, // Feature! := Feature_Header Background? Scenario_Definition*\n        Feature_Header, // Feature_Header! := #Language? Tags? #FeatureLine Feature_Description\n        Background, // Background! := #BackgroundLine Background_Description Scenario_Step*\n        Scenario_Definition, // Scenario_Definition! := Tags? (Scenario | ScenarioOutline)\n        Scenario, // Scenario! := #ScenarioLine Scenario_Description Scenario_Step*\n        ScenarioOutline, // ScenarioOutline! := #ScenarioOutlineLine ScenarioOutline_Description ScenarioOutline_Step* Examples_Definition*\n        Examples_Definition, // Examples_Definition! [#Empty|#Comment|#TagLine-&gt;#ExamplesLine] := Tags? Examples\n        Examples, // Examples! := #ExamplesLine Examples_Description Examples_Table?\n        Examples_Table, // Examples_Table! := #TableRow #TableRow*\n        Scenario_Step, // Scenario_Step := Step\n        ScenarioOutline_Step, // ScenarioOutline_Step := Step\n        Step, // Step! := #StepLine Step_Arg?\n        Step_Arg, // Step_Arg := (DataTable | DocString)\n        DataTable, // DataTable! := #TableRow+\n        DocString, // DocString! := #DocStringSeparator #Other* #DocStringSeparator\n        Tags, // Tags! := #TagLine+\n        Feature_Description, // Feature_Description := Description_Helper\n        Background_Description, // Background_Description := Description_Helper\n        Scenario_Description, // Scenario_Description := Description_Helper\n        ScenarioOutline_Description, // ScenarioOutline_Description := Description_Helper\n        Examples_Description, // Examples_Description := Description_Helper\n        Description_Helper, // Description_Helper := #Empty* Description? #Comment*\n        Description, // Description! := #Other+\n        ;\n\n        public static RuleType cast(TokenType tokenType) {\n            return RuleType.values()[tokenType.ordinal()];\n        }\n    }\n\n    private final Builder<T> builder;\n\n    public boolean stopAtFirstError;\n\n    class ParserContext {\n        public final ITokenScanner tokenScanner;\n        public final ITokenMatcher tokenMatcher;\n        public final Queue<Token> tokenQueue;\n        public final List<ParserException> errors;\n\n        ParserContext(ITokenScanner tokenScanner, ITokenMatcher tokenMatcher, Queue<Token> tokenQueue, List<ParserException> errors) {\n            this.tokenScanner = tokenScanner;\n            this.tokenMatcher = tokenMatcher;\n            this.tokenQueue = tokenQueue;\n            this.errors = errors;\n        }\n    }\n\n    public Parser(Builder<T> builder) {\n        this.builder = builder;\n    }\n\n    public T parse(String sourceEvent) {\n        return parse(new StringReader(sourceEvent));\n    }\n\n    public T parse(Reader sourceEvent) {\n        return parse(new TokenScanner(sourceEvent));\n    }\n\n    public T parse(ITokenScanner tokenScanner) {\n        return parse(tokenScanner, new TokenMatcher());\n    }\n\n    public T parse(String sourceEvent, ITokenMatcher tokenMatcher) {\n        return parse(new StringReader(sourceEvent), tokenMatcher);\n    }\n\n    public T parse(Reader sourceEvent, ITokenMatcher tokenMatcher) {\n        return parse(new TokenScanner(sourceEvent), tokenMatcher);\n    }\n\n    public T parse(ITokenScanner tokenScanner, ITokenMatcher tokenMatcher) {\n        builder.reset();\n        tokenMatcher.reset();\n\n        ParserContext context = new ParserContext(\n                tokenScanner,\n                tokenMatcher,\n                new LinkedList<Token>(),\n                new ArrayList<ParserException>()\n        );\n\n        startRule(context, RuleType.GherkinDocument);\n        int state = 0;\n        Token token;\n        do {\n            token = readToken(context);\n            state = matchToken(state, token, context);\n        } while (!token.isEOF());\n\n        endRule(context, RuleType.GherkinDocument);\n\n        if (context.errors.size() > 0) {\n            throw new ParserException.CompositeParserException(context.errors);\n        }\n\n        return builder.getResult();\n    }\n\n    private void addError(ParserContext context, ParserException error) {\n        context.errors.add(error);\n        if (context.errors.size() > 10)\n            throw new ParserException.CompositeParserException(context.errors);\n    }\n\n    private <V> V handleAstError(ParserContext context, final Func<V> action) {\n        return handleExternalError(context, action, null);\n    }\n\n    private <V> V handleExternalError(ParserContext context, Func<V> action, V defaultValue) {\n        if (stopAtFirstError) {\n            return action.call();\n        }\n\n        try {\n            return action.call();\n        } catch (ParserException.CompositeParserException compositeParserException) {\n            for (ParserException error : compositeParserException.errors) {\n                addError(context, error);\n            }\n        } catch (ParserException error) {\n            addError(context, error);\n        }\n        return defaultValue;\n    }\n\n    private void build(final ParserContext context, final Token token) {\n        handleAstError(context, new Func<Void>() {\n            public Void call() {\n                builder.build(token);\n                return null;\n            }\n        });\n    }\n\n    private void startRule(final ParserContext context, final RuleType ruleType) {\n        handleAstError(context, new Func<Void>() {\n            public Void call() {\n                builder.startRule(ruleType);\n                return null;\n            }\n        });\n    }\n\n    private void endRule(final ParserContext context, final RuleType ruleType) {\n        handleAstError(context, new Func<Void>() {\n            public Void call() {\n                builder.endRule(ruleType);\n                return null;\n            }\n        });\n    }\n\n    private Token readToken(ParserContext context) {\n        return context.tokenQueue.size() > 0 ? context.tokenQueue.remove() : context.tokenScanner.read();\n    }\n\n\n    private boolean match_EOF(final ParserContext context, final Token token) {\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_EOF(token);\n            }\n        }, false);\n    }\n\n    private boolean match_Empty(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_Empty(token);\n            }\n        }, false);\n    }\n\n    private boolean match_Comment(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_Comment(token);\n            }\n        }, false);\n    }\n\n    private boolean match_TagLine(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_TagLine(token);\n            }\n        }, false);\n    }\n\n    private boolean match_FeatureLine(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_FeatureLine(token);\n            }\n        }, false);\n    }\n\n    private boolean match_BackgroundLine(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_BackgroundLine(token);\n            }\n        }, false);\n    }\n\n    private boolean match_ScenarioLine(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_ScenarioLine(token);\n            }\n        }, false);\n    }\n\n    private boolean match_ScenarioOutlineLine(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_ScenarioOutlineLine(token);\n            }\n        }, false);\n    }\n\n    private boolean match_ExamplesLine(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_ExamplesLine(token);\n            }\n        }, false);\n    }\n\n    private boolean match_StepLine(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_StepLine(token);\n            }\n        }, false);\n    }\n\n    private boolean match_DocStringSeparator(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_DocStringSeparator(token);\n            }\n        }, false);\n    }\n\n    private boolean match_TableRow(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_TableRow(token);\n            }\n        }, false);\n    }\n\n    private boolean match_Language(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_Language(token);\n            }\n        }, false);\n    }\n\n    private boolean match_Other(final ParserContext context, final Token token) {\n        if (token.isEOF()) return false;\n        return handleExternalError(context, new Func<Boolean>() {\n            public Boolean call() {\n                return context.tokenMatcher.match_Other(token);\n            }\n        }, false);\n    }\n\n    private int matchToken(int state, Token token, ParserContext context) {\n        int newState;\n        switch(state) {\n            case 0:\n                newState = matchTokenAt_0(token, context);\n                break;\n            case 1:\n                newState = matchTokenAt_1(token, context);\n                break;\n            case 2:\n                newState = matchTokenAt_2(token, context);\n                break;\n            case 3:\n                newState = matchTokenAt_3(token, context);\n                break;\n            case 4:\n                newState = matchTokenAt_4(token, context);\n                break;\n            case 5:\n                newState = matchTokenAt_5(token, context);\n                break;\n            case 6:\n                newState = matchTokenAt_6(token, context);\n                break;\n            case 7:\n                newState = matchTokenAt_7(token, context);\n                break;\n            case 8:\n                newState = matchTokenAt_8(token, context);\n                break;\n            case 9:\n                newState = matchTokenAt_9(token, context);\n                break;\n            case 10:\n                newState = matchTokenAt_10(token, context);\n                break;\n            case 11:\n                newState = matchTokenAt_11(token, context);\n                break;\n            case 12:\n                newState = matchTokenAt_12(token, context);\n                break;\n            case 13:\n                newState = matchTokenAt_13(token, context);\n                break;\n            case 14:\n                newState = matchTokenAt_14(token, context);\n                break;\n            case 15:\n                newState = matchTokenAt_15(token, context);\n                break;\n            case 16:\n                newState = matchTokenAt_16(token, context);\n                break;\n            case 17:\n                newState = matchTokenAt_17(token, context);\n                break;\n            case 18:\n                newState = matchTokenAt_18(token, context);\n                break;\n            case 19:\n                newState = matchTokenAt_19(token, context);\n                break;\n            case 20:\n                newState = matchTokenAt_20(token, context);\n                break;\n            case 21:\n                newState = matchTokenAt_21(token, context);\n                break;\n            case 22:\n                newState = matchTokenAt_22(token, context);\n                break;\n            case 23:\n                newState = matchTokenAt_23(token, context);\n                break;\n            case 24:\n                newState = matchTokenAt_24(token, context);\n                break;\n            case 25:\n                newState = matchTokenAt_25(token, context);\n                break;\n            case 26:\n                newState = matchTokenAt_26(token, context);\n                break;\n            case 28:\n                newState = matchTokenAt_28(token, context);\n                break;\n            case 29:\n                newState = matchTokenAt_29(token, context);\n                break;\n            case 30:\n                newState = matchTokenAt_30(token, context);\n                break;\n            case 31:\n                newState = matchTokenAt_31(token, context);\n                break;\n            case 32:\n                newState = matchTokenAt_32(token, context);\n                break;\n            case 33:\n                newState = matchTokenAt_33(token, context);\n                break;\n            default:\n                throw new IllegalStateException(\"Unknown state: \" + state);\n        }\n        return newState;\n    }\n\n\n    // Start\n    private int matchTokenAt_0(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                build(context, token);\n            return 27;\n        }\n        if (match_Language(context, token))\n        {\n                startRule(context, RuleType.Feature);\n                startRule(context, RuleType.Feature_Header);\n                build(context, token);\n            return 1;\n        }\n        if (match_TagLine(context, token))\n        {\n                startRule(context, RuleType.Feature);\n                startRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 2;\n        }\n        if (match_FeatureLine(context, token))\n        {\n                startRule(context, RuleType.Feature);\n                startRule(context, RuleType.Feature_Header);\n                build(context, token);\n            return 3;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 0;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 0;\n        }\n        \n        final String stateComment = \"State: 0 - Start\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Language\", \"#TagLine\", \"#FeatureLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 0;\n\n    }\n\n\n    // GherkinDocument:0>Feature:0>Feature_Header:0>#Language:0\n    private int matchTokenAt_1(Token token, ParserContext context) {\n        if (match_TagLine(context, token))\n        {\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 2;\n        }\n        if (match_FeatureLine(context, token))\n        {\n                build(context, token);\n            return 3;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 1;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 1;\n        }\n        \n        final String stateComment = \"State: 1 - GherkinDocument:0>Feature:0>Feature_Header:0>#Language:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#TagLine\", \"#FeatureLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 1;\n\n    }\n\n\n    // GherkinDocument:0>Feature:0>Feature_Header:1>Tags:0>#TagLine:0\n    private int matchTokenAt_2(Token token, ParserContext context) {\n        if (match_TagLine(context, token))\n        {\n                build(context, token);\n            return 2;\n        }\n        if (match_FeatureLine(context, token))\n        {\n                endRule(context, RuleType.Tags);\n                build(context, token);\n            return 3;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 2;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 2;\n        }\n        \n        final String stateComment = \"State: 2 - GherkinDocument:0>Feature:0>Feature_Header:1>Tags:0>#TagLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#TagLine\", \"#FeatureLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 2;\n\n    }\n\n\n    // GherkinDocument:0>Feature:0>Feature_Header:2>#FeatureLine:0\n    private int matchTokenAt_3(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 3;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 5;\n        }\n        if (match_BackgroundLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Background);\n                build(context, token);\n            return 6;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                startRule(context, RuleType.Description);\n                build(context, token);\n            return 4;\n        }\n        \n        final String stateComment = \"State: 3 - GherkinDocument:0>Feature:0>Feature_Header:2>#FeatureLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Empty\", \"#Comment\", \"#BackgroundLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 3;\n\n    }\n\n\n    // GherkinDocument:0>Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:1>Description:0>#Other:0\n    private int matchTokenAt_4(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Feature_Header);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                endRule(context, RuleType.Description);\n                build(context, token);\n            return 5;\n        }\n        if (match_BackgroundLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Background);\n                build(context, token);\n            return 6;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 4;\n        }\n        \n        final String stateComment = \"State: 4 - GherkinDocument:0>Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:1>Description:0>#Other:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#BackgroundLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 4;\n\n    }\n\n\n    // GherkinDocument:0>Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:2>#Comment:0\n    private int matchTokenAt_5(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 5;\n        }\n        if (match_BackgroundLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Background);\n                build(context, token);\n            return 6;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Feature_Header);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 5;\n        }\n        \n        final String stateComment = \"State: 5 - GherkinDocument:0>Feature:0>Feature_Header:3>Feature_Description:0>Description_Helper:2>#Comment:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#BackgroundLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 5;\n\n    }\n\n\n    // GherkinDocument:0>Feature:1>Background:0>#BackgroundLine:0\n    private int matchTokenAt_6(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Background);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 6;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 8;\n        }\n        if (match_StepLine(context, token))\n        {\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 9;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                startRule(context, RuleType.Description);\n                build(context, token);\n            return 7;\n        }\n        \n        final String stateComment = \"State: 6 - GherkinDocument:0>Feature:1>Background:0>#BackgroundLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Empty\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 6;\n\n    }\n\n\n    // GherkinDocument:0>Feature:1>Background:1>Background_Description:0>Description_Helper:1>Description:0>#Other:0\n    private int matchTokenAt_7(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Background);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                endRule(context, RuleType.Description);\n                build(context, token);\n            return 8;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 9;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 7;\n        }\n        \n        final String stateComment = \"State: 7 - GherkinDocument:0>Feature:1>Background:1>Background_Description:0>Description_Helper:1>Description:0>#Other:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 7;\n\n    }\n\n\n    // GherkinDocument:0>Feature:1>Background:1>Background_Description:0>Description_Helper:2>#Comment:0\n    private int matchTokenAt_8(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Background);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 8;\n        }\n        if (match_StepLine(context, token))\n        {\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 9;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 8;\n        }\n        \n        final String stateComment = \"State: 8 - GherkinDocument:0>Feature:1>Background:1>Background_Description:0>Description_Helper:2>#Comment:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 8;\n\n    }\n\n\n    // GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:0>#StepLine:0\n    private int matchTokenAt_9(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_TableRow(context, token))\n        {\n                startRule(context, RuleType.DataTable);\n                build(context, token);\n            return 10;\n        }\n        if (match_DocStringSeparator(context, token))\n        {\n                startRule(context, RuleType.DocString);\n                build(context, token);\n            return 32;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 9;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 9;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 9;\n        }\n        \n        final String stateComment = \"State: 9 - GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:0>#StepLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#TableRow\", \"#DocStringSeparator\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 9;\n\n    }\n\n\n    // GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0\n    private int matchTokenAt_10(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_TableRow(context, token))\n        {\n                build(context, token);\n            return 10;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 9;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 10;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 10;\n        }\n        \n        final String stateComment = \"State: 10 - GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#TableRow\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 10;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:0>Tags:0>#TagLine:0\n    private int matchTokenAt_11(Token token, ParserContext context) {\n        if (match_TagLine(context, token))\n        {\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Tags);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Tags);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 11;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 11;\n        }\n        \n        final String stateComment = \"State: 11 - GherkinDocument:0>Feature:2>Scenario_Definition:0>Tags:0>#TagLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 11;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:0>#ScenarioLine:0\n    private int matchTokenAt_12(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 12;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 14;\n        }\n        if (match_StepLine(context, token))\n        {\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 15;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                startRule(context, RuleType.Description);\n                build(context, token);\n            return 13;\n        }\n        \n        final String stateComment = \"State: 12 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:0>#ScenarioLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Empty\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 12;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:1>Description:0>#Other:0\n    private int matchTokenAt_13(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                endRule(context, RuleType.Description);\n                build(context, token);\n            return 14;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 15;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 13;\n        }\n        \n        final String stateComment = \"State: 13 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:1>Description:0>#Other:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 13;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:2>#Comment:0\n    private int matchTokenAt_14(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 14;\n        }\n        if (match_StepLine(context, token))\n        {\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 15;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 14;\n        }\n        \n        final String stateComment = \"State: 14 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:1>Scenario_Description:0>Description_Helper:2>#Comment:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 14;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:0>#StepLine:0\n    private int matchTokenAt_15(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_TableRow(context, token))\n        {\n                startRule(context, RuleType.DataTable);\n                build(context, token);\n            return 16;\n        }\n        if (match_DocStringSeparator(context, token))\n        {\n                startRule(context, RuleType.DocString);\n                build(context, token);\n            return 30;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 15;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 15;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 15;\n        }\n        \n        final String stateComment = \"State: 15 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:0>#StepLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#TableRow\", \"#DocStringSeparator\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 15;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0\n    private int matchTokenAt_16(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_TableRow(context, token))\n        {\n                build(context, token);\n            return 16;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 15;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 16;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 16;\n        }\n        \n        final String stateComment = \"State: 16 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#TableRow\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 16;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:0>#ScenarioOutlineLine:0\n    private int matchTokenAt_17(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 19;\n        }\n        if (match_StepLine(context, token))\n        {\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 20;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                startRule(context, RuleType.Description);\n                build(context, token);\n            return 18;\n        }\n        \n        final String stateComment = \"State: 17 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:0>#ScenarioOutlineLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Empty\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 17;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:1>Description:0>#Other:0\n    private int matchTokenAt_18(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                endRule(context, RuleType.Description);\n                build(context, token);\n            return 19;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 20;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.Description);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 18;\n        }\n        \n        final String stateComment = \"State: 18 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:1>Description:0>#Other:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 18;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:2>#Comment:0\n    private int matchTokenAt_19(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 19;\n        }\n        if (match_StepLine(context, token))\n        {\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 20;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 19;\n        }\n        \n        final String stateComment = \"State: 19 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:1>ScenarioOutline_Description:0>Description_Helper:2>#Comment:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#StepLine\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 19;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:0>#StepLine:0\n    private int matchTokenAt_20(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_TableRow(context, token))\n        {\n                startRule(context, RuleType.DataTable);\n                build(context, token);\n            return 21;\n        }\n        if (match_DocStringSeparator(context, token))\n        {\n                startRule(context, RuleType.DocString);\n                build(context, token);\n            return 28;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 20;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 20;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 20;\n        }\n        \n        final String stateComment = \"State: 20 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:0>#StepLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#TableRow\", \"#DocStringSeparator\", \"#StepLine\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 20;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0\n    private int matchTokenAt_21(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_TableRow(context, token))\n        {\n                build(context, token);\n            return 21;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 20;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.DataTable);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 21;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 21;\n        }\n        \n        final String stateComment = \"State: 21 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:0>DataTable:0>#TableRow:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#TableRow\", \"#StepLine\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 21;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:0>Tags:0>#TagLine:0\n    private int matchTokenAt_22(Token token, ParserContext context) {\n        if (match_TagLine(context, token))\n        {\n                build(context, token);\n            return 22;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.Tags);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 22;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 22;\n        }\n        \n        final String stateComment = \"State: 22 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:0>Tags:0>#TagLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#TagLine\", \"#ExamplesLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 22;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:0>#ExamplesLine:0\n    private int matchTokenAt_23(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 23;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 25;\n        }\n        if (match_TableRow(context, token))\n        {\n                startRule(context, RuleType.Examples_Table);\n                build(context, token);\n            return 26;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                startRule(context, RuleType.Description);\n                build(context, token);\n            return 24;\n        }\n        \n        final String stateComment = \"State: 23 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:0>#ExamplesLine:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Empty\", \"#Comment\", \"#TableRow\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 23;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:1>Description:0>#Other:0\n    private int matchTokenAt_24(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                endRule(context, RuleType.Description);\n                build(context, token);\n            return 25;\n        }\n        if (match_TableRow(context, token))\n        {\n                endRule(context, RuleType.Description);\n                startRule(context, RuleType.Examples_Table);\n                build(context, token);\n            return 26;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Description);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 24;\n        }\n        \n        final String stateComment = \"State: 24 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:1>Description:0>#Other:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#TableRow\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 24;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:2>#Comment:0\n    private int matchTokenAt_25(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 25;\n        }\n        if (match_TableRow(context, token))\n        {\n                startRule(context, RuleType.Examples_Table);\n                build(context, token);\n            return 26;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 25;\n        }\n        \n        final String stateComment = \"State: 25 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:1>Examples_Description:0>Description_Helper:2>#Comment:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#Comment\", \"#TableRow\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 25;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:2>Examples_Table:0>#TableRow:0\n    private int matchTokenAt_26(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.Examples_Table);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_TableRow(context, token))\n        {\n                build(context, token);\n            return 26;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.Examples_Table);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.Examples_Table);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.Examples_Table);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.Examples_Table);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.Examples_Table);\n                endRule(context, RuleType.Examples);\n                endRule(context, RuleType.Examples_Definition);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 26;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 26;\n        }\n        \n        final String stateComment = \"State: 26 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:3>Examples_Definition:1>Examples:2>Examples_Table:0>#TableRow:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#TableRow\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 26;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0\n    private int matchTokenAt_28(Token token, ParserContext context) {\n        if (match_DocStringSeparator(context, token))\n        {\n                build(context, token);\n            return 29;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 28;\n        }\n        \n        final String stateComment = \"State: 28 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#DocStringSeparator\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 28;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0\n    private int matchTokenAt_29(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 20;\n        }\n        if (match_TagLine(context, token))\n        {\n            if (lookahead_0(context, token))\n            {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 22;\n            }\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ExamplesLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Examples_Definition);\n                startRule(context, RuleType.Examples);\n                build(context, token);\n            return 23;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.ScenarioOutline);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 29;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 29;\n        }\n        \n        final String stateComment = \"State: 29 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:1>ScenarioOutline:2>ScenarioOutline_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#StepLine\", \"#TagLine\", \"#ExamplesLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 29;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0\n    private int matchTokenAt_30(Token token, ParserContext context) {\n        if (match_DocStringSeparator(context, token))\n        {\n                build(context, token);\n            return 31;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 30;\n        }\n        \n        final String stateComment = \"State: 30 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#DocStringSeparator\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 30;\n\n    }\n\n\n    // GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0\n    private int matchTokenAt_31(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 15;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Scenario);\n                endRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 31;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 31;\n        }\n        \n        final String stateComment = \"State: 31 - GherkinDocument:0>Feature:2>Scenario_Definition:1>__alt0:0>Scenario:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 31;\n\n    }\n\n\n    // GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0\n    private int matchTokenAt_32(Token token, ParserContext context) {\n        if (match_DocStringSeparator(context, token))\n        {\n                build(context, token);\n            return 33;\n        }\n        if (match_Other(context, token))\n        {\n                build(context, token);\n            return 32;\n        }\n        \n        final String stateComment = \"State: 32 - GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:0>#DocStringSeparator:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#DocStringSeparator\", \"#Other\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 32;\n\n    }\n\n\n    // GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0\n    private int matchTokenAt_33(Token token, ParserContext context) {\n        if (match_EOF(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                endRule(context, RuleType.Feature);\n                build(context, token);\n            return 27;\n        }\n        if (match_StepLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                startRule(context, RuleType.Step);\n                build(context, token);\n            return 9;\n        }\n        if (match_TagLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Tags);\n                build(context, token);\n            return 11;\n        }\n        if (match_ScenarioLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.Scenario);\n                build(context, token);\n            return 12;\n        }\n        if (match_ScenarioOutlineLine(context, token))\n        {\n                endRule(context, RuleType.DocString);\n                endRule(context, RuleType.Step);\n                endRule(context, RuleType.Background);\n                startRule(context, RuleType.Scenario_Definition);\n                startRule(context, RuleType.ScenarioOutline);\n                build(context, token);\n            return 17;\n        }\n        if (match_Comment(context, token))\n        {\n                build(context, token);\n            return 33;\n        }\n        if (match_Empty(context, token))\n        {\n                build(context, token);\n            return 33;\n        }\n        \n        final String stateComment = \"State: 33 - GherkinDocument:0>Feature:1>Background:2>Scenario_Step:0>Step:1>Step_Arg:0>__alt1:1>DocString:2>#DocStringSeparator:0\";\n        token.detach();\n        List<String> expectedTokens = asList(\"#EOF\", \"#StepLine\", \"#TagLine\", \"#ScenarioLine\", \"#ScenarioOutlineLine\", \"#Comment\", \"#Empty\");\n        ParserException error = token.isEOF()\n                ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment)\n                : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment);\n        if (stopAtFirstError)\n            throw error;\n\n        addError(context, error);\n        return 33;\n\n    }\n\n\n\n    private boolean lookahead_0(ParserContext context, Token currentToken) {\n        currentToken.detach();\n        Token token;\n        Queue<Token> queue = new ArrayDeque<Token>();\n        boolean match = false;\n        do\n        {\n            token = readToken(context);\n            token.detach();\n            queue.add(token);\n\n            if (false\n                || match_ExamplesLine(context, token)\n            )\n            {\n                match = true;\n                break;\n            }\n        } while (false\n            || match_Empty(context, token)\n            || match_Comment(context, token)\n            || match_TagLine(context, token)\n        );\n\n        context.tokenQueue.addAll(queue);\n\n        return match;\n    }\n\n\n    public interface Builder<T> {\n        void build(Token token);\n        void startRule(RuleType ruleType);\n        void endRule(RuleType ruleType);\n        T getResult();\n        void reset();\n    }\n\n    public interface ITokenScanner {\n        Token read();\n    }\n\n    public interface ITokenMatcher {\n        boolean match_EOF(Token token);\n        boolean match_Empty(Token token);\n        boolean match_Comment(Token token);\n        boolean match_TagLine(Token token);\n        boolean match_FeatureLine(Token token);\n        boolean match_BackgroundLine(Token token);\n        boolean match_ScenarioLine(Token token);\n        boolean match_ScenarioOutlineLine(Token token);\n        boolean match_ExamplesLine(Token token);\n        boolean match_StepLine(Token token);\n        boolean match_DocStringSeparator(Token token);\n        boolean match_TableRow(Token token);\n        boolean match_Language(Token token);\n        boolean match_Other(Token token);\n        void reset();\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ParserException.java",
    "content": "package gherkin;\n\nimport gherkin.ast.Location;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class ParserException extends RuntimeException {\n    public final Location location;\n\n    protected ParserException(String message) {\n        super(message);\n        location = null;\n    }\n\n    protected ParserException(String message, Location location) {\n        super(getMessage(message, location));\n        this.location = location;\n    }\n\n    private static String getMessage(String message, Location location) {\n        return String.format(\"(%s:%s): %s\", location.getLine(), location.getColumn(), message);\n    }\n\n    public static class AstBuilderException extends ParserException {\n        public AstBuilderException(String message, Location location) {\n            super(message, location);\n        }\n    }\n\n    public static class NoSuchLanguageException extends ParserException {\n        public NoSuchLanguageException(String language, Location location) {\n            super(\"Language not supported: \" + language, location);\n        }\n    }\n\n    public static class UnexpectedTokenException extends ParserException {\n        public String stateComment;\n\n        public final Token receivedToken;\n        public final List<String> expectedTokenTypes;\n\n        public UnexpectedTokenException(Token receivedToken, List<String> expectedTokenTypes, String stateComment) {\n            super(getMessage(receivedToken, expectedTokenTypes), getLocation(receivedToken));\n            this.receivedToken = receivedToken;\n            this.expectedTokenTypes = expectedTokenTypes;\n            this.stateComment = stateComment;\n        }\n\n        private static String getMessage(Token receivedToken, List<String> expectedTokenTypes) {\n            return String.format(\"expected: %s, got '%s'\",\n                    StringUtils.join(\", \", expectedTokenTypes),\n                    receivedToken.getTokenValue().trim());\n        }\n\n        private static Location getLocation(Token receivedToken) {\n            return receivedToken.location.getColumn() > 1\n                    ? receivedToken.location\n                    : new Location(receivedToken.location.getLine(), receivedToken.line.indent() + 1);\n        }\n    }\n\n    public static class UnexpectedEOFException extends ParserException {\n        public final String stateComment;\n        public final List<String> expectedTokenTypes;\n\n        public UnexpectedEOFException(Token receivedToken, List<String> expectedTokenTypes, String stateComment) {\n            super(getMessage(expectedTokenTypes), receivedToken.location);\n            this.expectedTokenTypes = expectedTokenTypes;\n            this.stateComment = stateComment;\n        }\n\n        private static String getMessage(List<String> expectedTokenTypes) {\n            return String.format(\"unexpected end of file, expected: %s\",\n                    StringUtils.join(\", \", expectedTokenTypes));\n        }\n    }\n\n    public static class CompositeParserException extends ParserException {\n        public final List<ParserException> errors;\n\n        public CompositeParserException(List<ParserException> errors) {\n            super(getMessage(errors));\n            this.errors = Collections.unmodifiableList(errors);\n        }\n\n        private static String getMessage(List<ParserException> errors) {\n            if (errors == null) throw new NullPointerException(\"errors\");\n\n            StringUtils.ToString<ParserException> exceptionToString = new StringUtils.ToString<ParserException>() {\n                @Override\n                public String toString(ParserException e) {\n                    return e.getMessage();\n                }\n            };\n            return \"Parser errors:\\n\" + StringUtils.join(exceptionToString, \"\\n\", errors);\n        }\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/StringUtils.java",
    "content": "package gherkin;\n\nimport java.util.List;\n\npublic class StringUtils {\n    public static String join(String separator, List<String> items) {\n        return join(ToString.DEFAULT, separator, items);\n    }\n\n    public static <T> String join(ToString<T> toString, String separator, Iterable<T> items) {\n        StringBuilder sb = new StringBuilder();\n        boolean useSeparator = false;\n        for (T item : items) {\n            if (useSeparator) sb.append(separator);\n            useSeparator = true;\n            sb.append(toString.toString(item));\n        }\n        return sb.toString();\n    }\n\n    public static String ltrim(String s) {\n        int i = 0;\n        while (i < s.length() && Character.isWhitespace(s.charAt(i))) {\n            i++;\n        }\n        return s.substring(i);\n    }\n\n    public interface ToString<T> {\n        ToString<String> DEFAULT = new ToString<String>() {\n            @Override\n            public String toString(String o) {\n                return o;\n            }\n        };\n\n        String toString(T o);\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/SymbolCounter.java",
    "content": "package gherkin;\n\n// http://rosettacode.org/wiki/String_length#Java\npublic class SymbolCounter {\n    public static int countSymbols(String string) {\n        return string.codePointCount(0, string.length());\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/Token.java",
    "content": "package gherkin;\n\nimport gherkin.ast.Location;\n\nimport java.util.List;\n\npublic class Token {\n    public final IGherkinLine line;\n    public Parser.TokenType matchedType;\n    public String matchedKeyword;\n    public String matchedText;\n    public List<GherkinLineSpan> mathcedItems;\n    public int matchedIndent;\n    public GherkinDialect matchedGherkinDialect;\n    public Location location;\n\n    public Token(IGherkinLine line, Location location) {\n        this.line = line;\n        this.location = location;\n    }\n\n    public boolean isEOF() {\n        return line == null;\n    }\n\n    public void detach() {\n        if (line != null)\n            line.detach();\n    }\n\n    public String getTokenValue() {\n        return isEOF() ? \"EOF\" : line.getLineText(-1);\n    }\n\n    @Override\n    public String toString() {\n        return String.format(\"%s: %s/%s\", matchedType, matchedKeyword, matchedText);\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/TokenFormatter.java",
    "content": "package gherkin;\n\npublic class TokenFormatter {\n    private static final StringUtils.ToString<GherkinLineSpan> SPAN_TO_STRING = new StringUtils.ToString<GherkinLineSpan>() {\n        @Override\n        public String toString(GherkinLineSpan o) {\n            return o.column + \":\" + o.text;\n        }\n    };\n\n    public String formatToken(Token token) {\n        if (token.isEOF())\n            return \"EOF\";\n\n        return String.format(\"(%s:%s)%s:%s/%s/%s\",\n                toString(token.location.getLine()),\n                toString(token.location.getColumn()),\n                toString(token.matchedType),\n                toString(token.matchedKeyword),\n                toString(token.matchedText),\n                toString(token.mathcedItems == null ? \"\" : StringUtils.join(SPAN_TO_STRING, \",\", token.mathcedItems))\n        );\n    }\n\n    private String toString(Object o) {\n        return o == null ? \"\" : o.toString();\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/TokenFormatterBuilder.java",
    "content": "package gherkin;\n\npublic class TokenFormatterBuilder implements Parser.Builder<String> {\n    private final TokenFormatter formatter = new TokenFormatter();\n    private final StringBuilder tokensTextBuilder = new StringBuilder();\n\n    @Override\n    public void build(Token token) {\n        tokensTextBuilder.append(formatter.formatToken(token)).append(\"\\n\");\n    }\n\n    @Override\n    public void startRule(Parser.RuleType ruleType) {\n    }\n\n    @Override\n    public void endRule(Parser.RuleType ruleType) {\n    }\n\n    @Override\n    public String getResult() {\n        return tokensTextBuilder.toString();\n    }\n\n    @Override\n    public void reset() {\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/TokenMatcher.java",
    "content": "package gherkin;\n\nimport gherkin.ast.Location;\n\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport static gherkin.Parser.ITokenMatcher;\nimport static gherkin.Parser.TokenType;\n\npublic class TokenMatcher implements ITokenMatcher {\n    private static final Pattern LANGUAGE_PATTERN = Pattern.compile(\"^\\\\s*#\\\\s*language\\\\s*:\\\\s*([a-zA-Z\\\\-_]+)\\\\s*$\");\n    private final IGherkinDialectProvider dialectProvider;\n    private GherkinDialect currentDialect;\n    private String activeDocStringSeparator = null;\n    private int indentToRemove = 0;\n\n    public TokenMatcher(IGherkinDialectProvider dialectProvider) {\n        this.dialectProvider = dialectProvider;\n        reset();\n    }\n\n    public TokenMatcher() {\n        this(new GherkinDialectProvider());\n    }\n\n    public TokenMatcher(String default_dialect_name) {\n        this(new GherkinDialectProvider(default_dialect_name));\n    }\n\n    @Override\n    public void reset() {\n        activeDocStringSeparator = null;\n        indentToRemove = 0;\n        currentDialect = dialectProvider.getDefaultDialect();\n    }\n\n    public GherkinDialect getCurrentDialect() {\n        return currentDialect;\n    }\n\n    protected void setTokenMatched(Token token, TokenType matchedType, String text, String keyword, Integer indent, List<GherkinLineSpan> items) {\n        token.matchedType = matchedType;\n        token.matchedKeyword = keyword;\n        token.matchedText = text;\n        token.mathcedItems = items;\n        token.matchedGherkinDialect = getCurrentDialect();\n        token.matchedIndent = indent != null ? indent : (token.line == null ? 0 : token.line.indent());\n        token.location = new Location(token.location.getLine(), token.matchedIndent + 1);\n    }\n\n    @Override\n    public boolean match_EOF(Token token) {\n        if (token.isEOF()) {\n            setTokenMatched(token, TokenType.EOF, null, null, null, null);\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_Other(Token token) {\n        String text = token.line.getLineText(indentToRemove); //take the entire line, except removing DocString indents\n        setTokenMatched(token, TokenType.Other, unescapeDocString(text), null, 0, null);\n        return true;\n    }\n\n    @Override\n    public boolean match_Empty(Token token) {\n        if (token.line.isEmpty()) {\n            setTokenMatched(token, TokenType.Empty, null, null, null, null);\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_Comment(Token token) {\n        if (token.line.startsWith(GherkinLanguageConstants.COMMENT_PREFIX)) {\n            String text = token.line.getLineText(0); //take the entire line\n            setTokenMatched(token, TokenType.Comment, text, null, 0, null);\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_Language(Token token) {\n        Matcher matcher = LANGUAGE_PATTERN.matcher(token.line.getLineText(0));\n        if (matcher.matches()) {\n            String language = matcher.group(1);\n            setTokenMatched(token, TokenType.Language, language, null, null, null);\n\n            currentDialect = dialectProvider.getDialect(language, token.location);\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_TagLine(Token token) {\n        if (token.line.startsWith(GherkinLanguageConstants.TAG_PREFIX)) {\n            setTokenMatched(token, TokenType.TagLine, null, null, null, token.line.getTags());\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_FeatureLine(Token token) {\n        return matchTitleLine(token, TokenType.FeatureLine, currentDialect.getFeatureKeywords());\n    }\n\n    @Override\n    public boolean match_BackgroundLine(Token token) {\n        return matchTitleLine(token, TokenType.BackgroundLine, currentDialect.getBackgroundKeywords());\n    }\n\n    @Override\n    public boolean match_ScenarioLine(Token token) {\n        return matchTitleLine(token, TokenType.ScenarioLine, currentDialect.getScenarioKeywords());\n    }\n\n    @Override\n    public boolean match_ScenarioOutlineLine(Token token) {\n        return matchTitleLine(token, TokenType.ScenarioOutlineLine, currentDialect.getScenarioOutlineKeywords());\n    }\n\n    @Override\n    public boolean match_ExamplesLine(Token token) {\n        return matchTitleLine(token, TokenType.ExamplesLine, currentDialect.getExamplesKeywords());\n    }\n\n    private boolean matchTitleLine(Token token, TokenType tokenType, List<String> keywords) {\n        for (String keyword : keywords) {\n            if (token.line.startsWithTitleKeyword(keyword)) {\n                String title = token.line.getRestTrimmed(keyword.length() + GherkinLanguageConstants.TITLE_KEYWORD_SEPARATOR.length());\n                setTokenMatched(token, tokenType, title, keyword, null, null);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_DocStringSeparator(Token token) {\n        return activeDocStringSeparator == null\n                // open\n                ? match_DocStringSeparator(token, GherkinLanguageConstants.DOCSTRING_SEPARATOR, true) ||\n                match_DocStringSeparator(token, GherkinLanguageConstants.DOCSTRING_ALTERNATIVE_SEPARATOR, true)\n                // close\n                : match_DocStringSeparator(token, activeDocStringSeparator, false);\n    }\n\n    private boolean match_DocStringSeparator(Token token, String separator, boolean isOpen) {\n        if (token.line.startsWith(separator)) {\n            String contentType = null;\n            if (isOpen) {\n                contentType = token.line.getRestTrimmed(separator.length());\n                activeDocStringSeparator = separator;\n                indentToRemove = token.line.indent();\n            } else {\n                activeDocStringSeparator = null;\n                indentToRemove = 0;\n            }\n\n            setTokenMatched(token, TokenType.DocStringSeparator, contentType, null, null, null);\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_StepLine(Token token) {\n        List<String> keywords = currentDialect.getStepKeywords();\n        for (String keyword : keywords) {\n            if (token.line.startsWith(keyword)) {\n                String stepText = token.line.getRestTrimmed(keyword.length());\n                setTokenMatched(token, TokenType.StepLine, stepText, keyword, null, null);\n                return true;\n            }\n        }\n        return false;\n    }\n\n    @Override\n    public boolean match_TableRow(Token token) {\n        if (token.line.startsWith(GherkinLanguageConstants.TABLE_CELL_SEPARATOR)) {\n            setTokenMatched(token, TokenType.TableRow, null, null, null, token.line.getTableCells());\n            return true;\n        }\n        return false;\n    }\n\n    private String unescapeDocString(String text) {\n        return activeDocStringSeparator != null ? text.replace(\"\\\\\\\"\\\\\\\"\\\\\\\"\", \"\\\"\\\"\\\"\") : text;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/TokenScanner.java",
    "content": "package gherkin;\n\nimport gherkin.ast.Location;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.Reader;\nimport java.io.StringReader;\n\n/**\n * <p>\n * The scanner reads a gherkin doc (typically read from a .feature file) and creates a token\n * for each line. The tokens are passed to the parser, which outputs an AST (Abstract Syntax Tree).</p>\n * <p>\n * <p>\n * If the scanner sees a # language header, it will reconfigure itself dynamically to look for\n * Gherkin keywords for the associated language. The keywords are defined in gherkin-languages.json.</p>\n */\npublic class TokenScanner implements Parser.ITokenScanner {\n\n    private final BufferedReader reader;\n    private int lineNumber;\n\n    public TokenScanner(String source) {\n        this(new StringReader(source));\n    }\n\n    public TokenScanner(Reader source) {\n        this.reader = new BufferedReader(source);\n    }\n\n    @Override\n    public Token read() {\n        try {\n            String line = reader.readLine();\n            Location location = new Location(++lineNumber, 0);\n            return line == null ? new Token(null, location) : new Token(new GherkinLine(line), location);\n        } catch (IOException e) {\n            throw new RuntimeException(e);\n        }\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Background.java",
    "content": "package gherkin.ast;\n\nimport java.util.List;\n\npublic class Background extends ScenarioDefinition {\n    public Background(Location location, String keyword, String name, String description, List<Step> steps) {\n        super(location, keyword, name, description, steps);\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Comment.java",
    "content": "package gherkin.ast;\n\npublic class Comment extends Node {\n    private final String text;\n\n    public Comment(Location location, String text) {\n        super(location);\n        this.text = text;\n    }\n\n    public String getText() {\n        return text;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/DataTable.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class DataTable extends Node {\n    private final List<TableRow> rows;\n\n    public DataTable(List<TableRow> rows) {\n        super(rows.get(0).getLocation());\n        this.rows = Collections.unmodifiableList(rows);\n    }\n\n    public List<TableRow> getRows() {\n        return rows;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/DocString.java",
    "content": "package gherkin.ast;\n\npublic class DocString extends Node {\n    private final String contentType;\n    private final String content;\n\n    public DocString(Location location, String contentType, String content) {\n        super(location);\n        this.contentType = contentType;\n        this.content = content;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public String getContentType() {\n        return contentType;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Examples.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class Examples extends Node {\n    private final List<Tag> tags;\n    private final String keyword;\n    private final String name;\n    private final String description;\n    private final TableRow tableHeader;\n    private final List<TableRow> tableBody;\n\n    public Examples(Location location, List<Tag> tags, String keyword, String name, String description, TableRow tableHeader, List<TableRow> tableBody) {\n        super(location);\n        this.tags = Collections.unmodifiableList(tags);\n        this.keyword = keyword;\n        this.name = name;\n        this.description = description;\n        this.tableHeader = tableHeader;\n        this.tableBody = tableBody != null ? Collections.unmodifiableList(tableBody) : null;\n    }\n\n    public String getKeyword() {\n        return keyword;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public List<TableRow> getTableBody() {\n        return tableBody;\n    }\n\n    public TableRow getTableHeader() {\n        return tableHeader;\n    }\n\n    public List<Tag> getTags() {\n        return tags;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Feature.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class Feature extends Node {\n    private final List<Tag> tags;\n    private final String language;\n    private final String keyword;\n    private final String name;\n    private final String description;\n    private final List<ScenarioDefinition> children;\n\n    public Feature(\n            List<Tag> tags,\n            Location location,\n            String language,\n            String keyword,\n            String name,\n            String description,\n            List<ScenarioDefinition> children) {\n        super(location);\n        this.tags = Collections.unmodifiableList(tags);\n        this.language = language;\n        this.keyword = keyword;\n        this.name = name;\n        this.description = description;\n        this.children = Collections.unmodifiableList(children);\n    }\n\n    public List<ScenarioDefinition> getChildren() {\n        return children;\n    }\n\n    public String getLanguage() {\n        return language;\n    }\n\n    public String getKeyword() {\n        return keyword;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public List<Tag> getTags() {\n        return tags;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/GherkinDocument.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class GherkinDocument extends Node {\n    private final Feature feature;\n    private final List<Comment> comments;\n\n    public GherkinDocument(\n            Feature feature,\n            List<Comment> comments) {\n        super(null);\n        this.feature = feature;\n        this.comments = Collections.unmodifiableList(comments);\n    }\n\n    public Feature getFeature() {\n        return feature;\n    }\n\n    public List<Comment> getComments() {\n        return comments;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Location.java",
    "content": "package gherkin.ast;\n\npublic class Location {\n    private final int line;\n    private final int column;\n\n    public Location(int line, int column) {\n        this.line = line;\n        this.column = column;\n    }\n\n    public int getLine() {\n        return line;\n    }\n\n    public int getColumn() {\n        return column;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Node.java",
    "content": "package gherkin.ast;\n\npublic abstract class Node {\n    private final String type = getClass().getSimpleName();\n    private final Location location;\n\n    protected Node(Location location) {\n        this.location = location;\n    }\n\n    public Location getLocation() {\n        return location;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Scenario.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class Scenario extends ScenarioDefinition {\n    private final List<Tag> tags;\n\n    public Scenario(List<Tag> tags, Location location, String keyword, String name, String description, List<Step> steps) {\n        super(location, keyword, name, description, steps);\n        this.tags = Collections.unmodifiableList(tags);\n    }\n\n    public List<Tag> getTags() {\n        return tags;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/ScenarioDefinition.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic abstract class ScenarioDefinition extends Node {\n    private final String keyword;\n    private final String name;\n    private final String description;\n    private final List<Step> steps;\n\n    public ScenarioDefinition(Location location, String keyword, String name, String description, List<Step> steps) {\n        super(location);\n        this.keyword = keyword;\n        this.name = name;\n        this.description = description;\n        this.steps = Collections.unmodifiableList(steps);\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public String getKeyword() {\n        return keyword;\n    }\n\n    public String getDescription() {\n        return description;\n    }\n\n    public List<Step> getSteps() {\n        return steps;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/ScenarioOutline.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class ScenarioOutline extends ScenarioDefinition {\n    private final List<Tag> tags;\n    private final List<Examples> examples;\n\n    public ScenarioOutline(List<Tag> tags, Location location, String keyword, String name, String description, List<Step> steps, List<Examples> examples) {\n        super(location, keyword, name, description, steps);\n        this.tags = Collections.unmodifiableList(tags);\n        this.examples = Collections.unmodifiableList(examples);\n    }\n\n    public List<Tag> getTags() {\n        return tags;\n    }\n\n    public List<Examples> getExamples() {\n        return examples;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Step.java",
    "content": "package gherkin.ast;\n\npublic class Step extends Node {\n    private final String keyword;\n    private final String text;\n    private final Node argument;\n\n    public Step(Location location, String keyword, String text, Node argument) {\n        super(location);\n        this.keyword = keyword;\n        this.text = text;\n        this.argument = argument;\n    }\n\n    public String getText() {\n        return text;\n    }\n\n    public String getKeyword() {\n        return keyword;\n    }\n\n    public Node getArgument() {\n        return argument;\n    }\n\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/TableCell.java",
    "content": "package gherkin.ast;\n\npublic class TableCell extends Node {\n    private final String value;\n\n    public TableCell(Location location, String value) {\n        super(location);\n        this.value = value;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/TableRow.java",
    "content": "package gherkin.ast;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class TableRow extends Node {\n    private final List<TableCell> cells;\n\n    public TableRow(Location location, List<TableCell> cells) {\n        super(location);\n        this.cells = Collections.unmodifiableList(cells);\n    }\n\n    public List<TableCell> getCells() {\n        return cells;\n    }\n\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/ast/Tag.java",
    "content": "package gherkin.ast;\n\npublic class Tag extends Node {\n    private final String name;\n\n    public Tag(Location location, String name) {\n        super(location);\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/cli/Main.java",
    "content": "package gherkin.cli;\n\nimport gherkin.stream.Stdio;\nimport gherkin.deps.com.google.gson.Gson;\nimport gherkin.deps.com.google.gson.GsonBuilder;\nimport gherkin.events.CucumberEvent;\nimport gherkin.events.SourceEvent;\nimport gherkin.stream.GherkinEvents;\nimport gherkin.stream.SourceEvents;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static java.util.Arrays.asList;\n\npublic class Main {\n    public static void main(String[] argv) throws IOException {\n        final Gson gson = new GsonBuilder().create();\n\n        List<String> args = new ArrayList<>(asList(argv));\n        List<String> paths = new ArrayList<>();\n\n        boolean printSource = true;\n        boolean printAst = true;\n        boolean printPickles = true;\n\n        while (!args.isEmpty()) {\n            String arg = args.remove(0).trim();\n\n            switch (arg) {\n                case \"--no-source\":\n                    printSource = false;\n                    break;\n                case \"--no-ast\":\n                    printAst = false;\n                    break;\n                case \"--no-pickles\":\n                    printPickles = false;\n                    break;\n                default:\n                    paths.add(arg);\n            }\n        }\n\n        SourceEvents sourceEvents = new SourceEvents(paths);\n        GherkinEvents gherkinEvents = new GherkinEvents(printSource, printAst, printPickles);\n        for (SourceEvent sourceEventEvent : sourceEvents) {\n            for (CucumberEvent cucumberEvent : gherkinEvents.iterable(sourceEventEvent)) {\n                Stdio.out.write(gson.toJson(cucumberEvent));\n                Stdio.out.write(\"\\n\");\n                Stdio.out.flush();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/events/AttachmentEvent.java",
    "content": "package gherkin.events;\n\npublic class AttachmentEvent implements CucumberEvent {\n    private final String type = \"attachment\";\n    private final SourceRef source;\n    private final String data;\n    private final Media media = new Media();\n\n    public AttachmentEvent(SourceRef source, String data) {\n        this.source = source;\n        this.data = data;\n    }\n\n    public static class SourceRef {\n        private final String uri;\n        private final Location start;\n\n        public SourceRef(String uri, Location start) {\n            this.uri = uri;\n            this.start = start;\n        }\n    }\n\n    public static class Location {\n        private final int line;\n        private final int column;\n\n        public Location(int line, int column) {\n            this.line = line;\n            this.column = column;\n        }\n    }\n\n    public static class Media {\n        private final String encoding = \"utf-8\";\n        private final String type = \"text/vnd.cucumber.stacktrace+plain\";\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/events/CucumberEvent.java",
    "content": "package gherkin.events;\n\npublic interface CucumberEvent {\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/events/GherkinDocumentEvent.java",
    "content": "package gherkin.events;\n\nimport gherkin.ast.GherkinDocument;\n\npublic class GherkinDocumentEvent implements CucumberEvent {\n    private final String type = \"gherkin-document\";\n    public final String uri;\n    public final GherkinDocument document;\n\n    public GherkinDocumentEvent(String uri, GherkinDocument document) {\n        this.uri = uri;\n        this.document = document;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/events/PickleEvent.java",
    "content": "package gherkin.events;\n\nimport gherkin.pickles.Pickle;\n\npublic class PickleEvent implements CucumberEvent {\n    private final String type = \"pickle\";\n    public final String uri;\n    public final Pickle pickle;\n\n    public PickleEvent(String uri, Pickle pickle) {\n        this.uri = uri;\n        this.pickle = pickle;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/events/SourceEvent.java",
    "content": "package gherkin.events;\n\npublic class SourceEvent implements CucumberEvent {\n    private final String type = \"source\";\n    public final String uri;\n    public final String data;\n    private final Media media = new Media();\n\n    public SourceEvent(String uri, String data) {\n        this.uri = uri;\n        this.data = data;\n    }\n\n    public static class Media {\n        private final String encoding = \"utf-8\";\n        private final String type = \"text/vnd.cucumber.gherkin+plain\";\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/Argument.java",
    "content": "package gherkin.pickles;\n\npublic interface Argument {\n    PickleLocation getLocation();\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/Compiler.java",
    "content": "package gherkin.pickles;\n\nimport gherkin.SymbolCounter;\nimport gherkin.ast.Background;\nimport gherkin.ast.DataTable;\nimport gherkin.ast.DocString;\nimport gherkin.ast.Examples;\nimport gherkin.ast.Feature;\nimport gherkin.ast.GherkinDocument;\nimport gherkin.ast.Location;\nimport gherkin.ast.Node;\nimport gherkin.ast.Scenario;\nimport gherkin.ast.ScenarioDefinition;\nimport gherkin.ast.ScenarioOutline;\nimport gherkin.ast.Step;\nimport gherkin.ast.TableCell;\nimport gherkin.ast.TableRow;\nimport gherkin.ast.Tag;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static java.util.Arrays.asList;\nimport static java.util.Collections.emptyList;\nimport static java.util.Collections.singletonList;\nimport static java.util.Collections.unmodifiableList;\n\npublic class Compiler {\n\n    public List<Pickle> compile(GherkinDocument gherkinDocument) {\n        List<Pickle> pickles = new ArrayList<>();\n        Feature feature = gherkinDocument.getFeature();\n        if (feature == null) {\n            return pickles;\n        }\n\n        List<Tag> featureTags = feature.getTags();\n        List<PickleStep> backgroundSteps = new ArrayList<>();\n\n        for (ScenarioDefinition scenarioDefinition : feature.getChildren()) {\n            if (scenarioDefinition instanceof Background) {\n                backgroundSteps = pickleSteps(scenarioDefinition);\n            } else if (scenarioDefinition instanceof Scenario) {\n                compileScenario(pickles, backgroundSteps, (Scenario) scenarioDefinition, featureTags);\n            } else {\n                compileScenarioOutline(pickles, backgroundSteps, (ScenarioOutline) scenarioDefinition, featureTags);\n            }\n        }\n        return pickles;\n    }\n\n    private void compileScenario(List<Pickle> pickles, List<PickleStep> backgroundSteps, Scenario scenario, List<Tag> featureTags) {\n        if (scenario.getSteps().isEmpty())\n            return;\n\n        List<PickleStep> steps = new ArrayList<>();\n        steps.addAll(backgroundSteps);\n\n        List<Tag> scenarioTags = new ArrayList<>();\n        scenarioTags.addAll(featureTags);\n        scenarioTags.addAll(scenario.getTags());\n\n        steps.addAll(pickleSteps(scenario));\n\n        Pickle pickle = new Pickle(\n                scenario.getName(),\n                steps,\n                pickleTags(scenarioTags),\n                singletonList(pickleLocation(scenario.getLocation()))\n        );\n        pickles.add(pickle);\n    }\n\n    private void compileScenarioOutline(List<Pickle> pickles, List<PickleStep> backgroundSteps, ScenarioOutline scenarioOutline, List<Tag> featureTags) {\n        if (scenarioOutline.getSteps().isEmpty())\n            return;\n\n        for (final Examples examples : scenarioOutline.getExamples()) {\n            if (examples.getTableHeader() == null) continue;\n            List<TableCell> variableCells = examples.getTableHeader().getCells();\n            for (final TableRow values : examples.getTableBody()) {\n                List<TableCell> valueCells = values.getCells();\n\n                List<PickleStep> steps = new ArrayList<>();\n                steps.addAll(backgroundSteps);\n\n                List<Tag> tags = new ArrayList<>();\n                tags.addAll(featureTags);\n                tags.addAll(scenarioOutline.getTags());\n                tags.addAll(examples.getTags());\n\n                for (Step scenarioOutlineStep : scenarioOutline.getSteps()) {\n                    String stepText = interpolate(scenarioOutlineStep.getText(), variableCells, valueCells);\n\n                    // TODO: Use an Array of location in DataTable/DocString as well.\n                    // If the Gherkin AST classes supported\n                    // a list of locations, we could just reuse the same classes\n\n                    PickleStep pickleStep = new PickleStep(\n                            stepText,\n                            createPickleArguments(scenarioOutlineStep.getArgument(), variableCells, valueCells),\n                            asList(\n                                    pickleLocation(values.getLocation()),\n                                    pickleStepLocation(scenarioOutlineStep)\n                            )\n                    );\n                    steps.add(pickleStep);\n                }\n\n                Pickle pickle = new Pickle(\n                        interpolate(scenarioOutline.getName(), variableCells, valueCells),\n                        steps,\n                        pickleTags(tags),\n                        asList(\n                                pickleLocation(values.getLocation()),\n                                pickleLocation(scenarioOutline.getLocation())\n                        )\n                );\n\n                pickles.add(pickle);\n            }\n        }\n    }\n\n    private List<Argument> createPickleArguments(Node argument) {\n        List<TableCell> noCells = emptyList();\n        return createPickleArguments(argument, noCells, noCells);\n    }\n\n    private List<Argument> createPickleArguments(Node argument, List<TableCell> variableCells, List<TableCell> valueCells) {\n        List<Argument> result = new ArrayList<>();\n        if (argument == null) return result;\n        if (argument instanceof DataTable) {\n            DataTable t = (DataTable) argument;\n            List<TableRow> rows = t.getRows();\n            List<PickleRow> newRows = new ArrayList<>(rows.size());\n            for (TableRow row : rows) {\n                List<TableCell> cells = row.getCells();\n                List<PickleCell> newCells = new ArrayList<>();\n                for (TableCell cell : cells) {\n                    newCells.add(\n                            new PickleCell(\n                                    pickleLocation(cell.getLocation()),\n                                    interpolate(cell.getValue(), variableCells, valueCells)\n                            )\n                    );\n                }\n                newRows.add(new PickleRow(newCells));\n            }\n            result.add(new PickleTable(newRows));\n        } else if (argument instanceof DocString) {\n            DocString ds = (DocString) argument;\n            result.add(\n                    new PickleString(\n                            pickleLocation(ds.getLocation()),\n                            interpolate(ds.getContent(), variableCells, valueCells)\n                    )\n            );\n        } else {\n            throw new RuntimeException(\"Unexpected argument type: \" + argument);\n        }\n        return result;\n    }\n\n    private List<PickleStep> pickleSteps(ScenarioDefinition scenarioDefinition) {\n        List<PickleStep> result = new ArrayList<>();\n        for (Step step : scenarioDefinition.getSteps()) {\n            result.add(pickleStep(step));\n        }\n        return unmodifiableList(result);\n    }\n\n    private PickleStep pickleStep(Step step) {\n        return new PickleStep(\n                step.getText(),\n                createPickleArguments(step.getArgument()),\n                singletonList(pickleStepLocation(step))\n        );\n    }\n\n    private String interpolate(String name, List<TableCell> variableCells, List<TableCell> valueCells) {\n        int col = 0;\n        for (TableCell variableCell : variableCells) {\n            TableCell valueCell = valueCells.get(col++);\n            String header = variableCell.getValue();\n            String value = valueCell.getValue();\n            name = name.replace(\"<\" + header + \">\", value);\n        }\n        return name;\n    }\n\n    private PickleLocation pickleStepLocation(Step step) {\n        return new PickleLocation(\n                step.getLocation().getLine(),\n                step.getLocation().getColumn() + (step.getKeyword() != null ? SymbolCounter.countSymbols(step.getKeyword()) : 0)\n        );\n    }\n\n    private PickleLocation pickleLocation(Location location) {\n        return new PickleLocation(location.getLine(), location.getColumn());\n    }\n\n    private List<PickleTag> pickleTags(List<Tag> tags) {\n        List<PickleTag> result = new ArrayList<>();\n        for (Tag tag : tags) {\n            result.add(pickleTag(tag));\n        }\n        return result;\n    }\n\n    private PickleTag pickleTag(Tag tag) {\n        return new PickleTag(pickleLocation(tag.getLocation()), tag.getName());\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/Pickle.java",
    "content": "package gherkin.pickles;\n\nimport java.util.List;\n\nimport static java.util.Collections.unmodifiableList;\n\npublic class Pickle {\n    private final String name;\n    private final List<PickleStep> steps;\n    private final List<PickleTag> tags;\n    private final List<PickleLocation> locations;\n\n    public Pickle(String name, List<PickleStep> steps, List<PickleTag> tags, List<PickleLocation> locations) {\n        this.name = name;\n        this.steps = unmodifiableList(steps);\n        this.tags = tags;\n        this.locations = unmodifiableList(locations);\n    }\n\n    public String getName() {\n        return name;\n    }\n\n    public List<PickleStep> getSteps() {\n        return steps;\n    }\n\n    public List<PickleLocation> getLocations() {\n        return locations;\n    }\n\n    public List<PickleTag> getTags() {\n        return tags;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/PickleCell.java",
    "content": "package gherkin.pickles;\n\npublic class PickleCell {\n    private final PickleLocation location;\n    private final String value;\n\n    public PickleCell(PickleLocation location, String value) {\n        this.location = location;\n        this.value = value;\n    }\n\n    public String getValue() {\n        return value;\n    }\n\n    public PickleLocation getLocation() {\n        return location;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/PickleLocation.java",
    "content": "package gherkin.pickles;\n\npublic class PickleLocation {\n    private final int line;\n    private final int column;\n\n    public PickleLocation(int line, int column) {\n        this.line = line;\n        this.column = column;\n    }\n\n    public int getLine() {\n        return line;\n    }\n\n    public int getColumn() {\n        return column;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/PickleRow.java",
    "content": "package gherkin.pickles;\n\nimport java.util.List;\n\nimport static java.util.Collections.unmodifiableList;\n\npublic class PickleRow {\n    private final List<PickleCell> cells;\n\n    public PickleRow(List<PickleCell> cells) {\n        this.cells = unmodifiableList(cells);\n    }\n\n    public List<PickleCell> getCells() {\n        return cells;\n    }\n\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/PickleStep.java",
    "content": "package gherkin.pickles;\n\nimport java.util.List;\n\nimport static java.util.Collections.unmodifiableList;\n\npublic class PickleStep {\n    private final String text;\n    private final List<Argument> arguments;\n    private final List<PickleLocation> locations;\n\n    public PickleStep(String text, List<Argument> arguments, List<PickleLocation> locations) {\n        this.text = text;\n        this.arguments = unmodifiableList(arguments);\n        this.locations = unmodifiableList(locations);\n    }\n\n    public String getText() {\n        return text;\n    }\n\n    public List<PickleLocation> getLocations() {\n        return locations;\n    }\n\n    public List<Argument> getArgument() {\n        return arguments;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/PickleString.java",
    "content": "package gherkin.pickles;\n\npublic class PickleString implements Argument {\n    private final PickleLocation location;\n    private final String content;\n\n    public PickleString(PickleLocation location, String content) {\n        this.location = location;\n        this.content = content;\n    }\n\n    @Override\n    public PickleLocation getLocation() {\n        return location;\n    }\n\n    public String getContent() {\n        return content;\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/PickleTable.java",
    "content": "package gherkin.pickles;\n\nimport java.util.List;\n\nimport static java.util.Collections.unmodifiableList;\n\npublic class PickleTable implements Argument {\n\n    private final List<PickleRow> rows;\n\n    public PickleTable(List<PickleRow> rows) {\n        this.rows = unmodifiableList(rows);\n    }\n\n    public List<PickleRow> getRows() {\n        return rows;\n    }\n\n    @Override\n    public PickleLocation getLocation() {\n        return rows.get(0).getCells().get(0).getLocation();\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/pickles/PickleTag.java",
    "content": "package gherkin.pickles;\n\npublic class PickleTag {\n    private final PickleLocation location;\n    private final String name;\n\n    public PickleTag(PickleLocation location, String name) {\n        this.location = location;\n        this.name = name;\n    }\n\n    public String getName() {\n        return name;\n    }\n\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/stream/GherkinEvents.java",
    "content": "package gherkin.stream;\n\nimport gherkin.AstBuilder;\nimport gherkin.Parser;\nimport gherkin.ParserException;\nimport gherkin.TokenMatcher;\nimport gherkin.ast.GherkinDocument;\nimport gherkin.events.AttachmentEvent;\nimport gherkin.events.CucumberEvent;\nimport gherkin.events.GherkinDocumentEvent;\nimport gherkin.events.PickleEvent;\nimport gherkin.events.SourceEvent;\nimport gherkin.pickles.Compiler;\nimport gherkin.pickles.Pickle;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class GherkinEvents {\n    private final Parser<GherkinDocument> parser = new Parser<>(new AstBuilder());\n    private final TokenMatcher matcher = new TokenMatcher();\n    private final Compiler compiler = new Compiler();\n\n    private final boolean printSource;\n    private final boolean printAst;\n    private final boolean printPickles;\n\n    public GherkinEvents(boolean printSource, boolean printAst, boolean printPickles) {\n        this.printSource = printSource;\n        this.printAst = printAst;\n        this.printPickles = printPickles;\n    }\n\n    public Iterable<? extends CucumberEvent> iterable(SourceEvent sourceEvent) {\n        List<CucumberEvent> cucumberEvents = new ArrayList<>();\n\n        try {\n            GherkinDocument gherkinDocument = parser.parse(sourceEvent.data, matcher);\n\n            if (printSource) {\n                cucumberEvents.add(sourceEvent);\n            }\n            if (printAst) {\n                cucumberEvents.add(new GherkinDocumentEvent(sourceEvent.uri, gherkinDocument));\n            }\n            if (printPickles) {\n                List<Pickle> pickles = compiler.compile(gherkinDocument);\n                for (Pickle pickle : pickles) {\n                    cucumberEvents.add(new PickleEvent(sourceEvent.uri, pickle));\n                }\n            }\n        } catch (ParserException.CompositeParserException e) {\n            for (ParserException error : e.errors) {\n                addErrorAttachment(cucumberEvents, error, sourceEvent.uri);\n            }\n        } catch (ParserException e) {\n            addErrorAttachment(cucumberEvents, e, sourceEvent.uri);\n        }\n        return cucumberEvents;\n    }\n\n    private void addErrorAttachment(List<CucumberEvent> cucumberEvents, ParserException e, String uri) {\n        cucumberEvents.add(new AttachmentEvent(\n                new AttachmentEvent.SourceRef(\n                        uri,\n                        new AttachmentEvent.Location(\n                                e.location.getLine(),\n                                e.location.getColumn()\n                        )\n                ),\n                e.getMessage()\n        ));\n\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/stream/SourceEvents.java",
    "content": "package gherkin.stream;\n\nimport gherkin.events.SourceEvent;\n\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.InputStreamReader;\nimport java.io.Reader;\nimport java.util.Iterator;\nimport java.util.List;\n\npublic class SourceEvents implements Iterable<SourceEvent> {\n    private final List<String> paths;\n\n    public SourceEvents(List<String> paths) {\n        this.paths = paths;\n    }\n\n    @Override\n    public Iterator<SourceEvent> iterator() {\n        final Iterator<String> pathIterator = paths.iterator();\n\n        return new Iterator<SourceEvent>() {\n            @Override\n            public boolean hasNext() {\n                return pathIterator.hasNext();\n            }\n\n            @Override\n            public SourceEvent next() {\n                try {\n                    String path = pathIterator.next();\n                    String data = read(new InputStreamReader(new FileInputStream(path), \"UTF-8\"));\n                    return new SourceEvent(path, data);\n                } catch (IOException e) {\n                    throw new RuntimeException(e);\n                }\n            }\n\n            @Override\n            public void remove() {\n                throw new UnsupportedOperationException();\n            }\n        };\n    }\n\n    private static String read(Reader reader) throws IOException {\n        final char[] buffer = new char[0x10000];\n        StringBuilder sb = new StringBuilder();\n        int read;\n        do {\n            read = reader.read(buffer, 0, buffer.length);\n            if (read > 0) {\n                sb.append(buffer, 0, read);\n            }\n        } while (read >= 0);\n        return sb.toString();\n    }\n}\n"
  },
  {
    "path": "greencoffee/src/main/java/gherkin/stream/Stdio.java",
    "content": "package gherkin.stream;\n\nimport java.io.OutputStreamWriter;\nimport java.io.PrintWriter;\nimport java.nio.charset.Charset;\n\n/**\n * UTF-8 STDOUT and STDERR\n */\npublic class Stdio {\n    public static final PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, Charset.forName(\"UTF-8\")), true);\n    public static final PrintWriter err = new PrintWriter(new OutputStreamWriter(System.err, Charset.forName(\"UTF-8\")), true);\n}\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':greencoffee'"
  }
]