[
  {
    "path": ".codeclimate.yml",
    "content": "engines:\n eslint:\n   enabled: true\n pep8:\n   enabled: true\nratings:\n paths:\n - \"**.js\"\n - \"**.py\"\nexclude_paths:\n- webpack.config.js\n- \"**/resources/**\"\n- js/test/**\n- test/data/**\n- web/lib/**\n- tools/template/*\n- \"**/generated/*\"\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.java text eol=lf\n*.py text eol=lf\n*.js text eol=lf\n*.json text eol=lf\n*.svg text eol=lf\n*.css text eol=lf\n*.mustache text eol=lf"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/beautification-problem.md",
    "content": "---\nname: Beautification problem\nabout: You tried using the beautifier and the resulting format was not what you expected\n\n---\n\n# Description\n<!--\nThis is the default template for bug reports\nNOTE: \n* Do not include screenshots! This library is a text processor, we need text inputs and outputs for debugging and fixing issues. \n* Check the list of open issues before filing a new issue. \n<!--\n\n# Input\nThe code looked like this before beautification:\n```\n<INSERT CODE HERE>\n```\n\n# Expected Output\nThe code should have looked like this after beautification:\n```\n<INSERT CODE HERE>\n```\n\n# Actual Output\nThe  code actually looked like this after beautification:\n```\n<INSERT CODE HERE>\n```\n\n# Steps to Reproduce\n\n\n## Environment\nOS:\n\n\n## Settings\n<!--\nExample:\n```json\n{\n    \"indent_size\": 4,\n    \"indent_char\": \" \",\n    \"indent_level\": 0,\n    \"indent_with_tabs\": false,\n    \"preserve_newlines\": true,\n    \"max_preserve_newlines\": 10,\n    \"jslint_happy\": false,\n    \"space_after_anon_function\": false,\n    \"brace_style\": \"collapse,preserve-inline\",\n    \"keep_array_indentation\": false,\n    \"keep_function_indentation\": false,\n    \"space_before_conditional\": true,\n    \"break_chained_methods\": false,\n    \"eval_code\": false,\n    \"unescape_strings\": false,\n    \"wrap_line_length\": 0\n}\n```\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: You want new functionality added to the beautifier\n\n---\n\n# Description\n<!--\nThis is the default template for feature requests. \nNOTE: \n* Do not include screenshots! This library is a text processor, we need text inputs and outputs for debugging and fixing issues. \n* Check the list of open issues before filing a new issue.\n-->\n\n# Input\nWith this new feature, when I give like this input: \n```\n<INSERT CODE HERE>\n```\n\n# Expected Output\nI'd like to see this output:\n```\n<INSERT CODE HERE>\n```\n\n## Environment\nOS:\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question-about-usage.md",
    "content": "---\nname: Question about usage\nabout: You have a question about how to use the beautifier\n\n---\n\n# **DO NOT FILE USAGE QUESTIONS AS ISSUES**\nReview the [README.md](https://github.com/beautifier/js-beautify/blob/main/README.md).\nIf that does not help, join us on gitter: https://gitter.im/beautifier/js-beautify .\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "# Description\n- [ ] Source branch in your fork has meaningful name (not `main`)\n\n\nFixes Issue: \n\n\n\n# Before Merge Checklist \nThese items can be completed after PR is created.\n\n(Check any items that are not applicable (NA) for this PR)\n\n- [ ] JavaScript implementation\n- [ ] Python implementation (NA if HTML beautifier)\n- [ ] Added Tests to data file(s)\n- [ ] Added command-line option(s) (NA if\n- [ ] README.md documents new feature/option(s)\n\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"npm\" # See documentation for possible values\n    directory: \"/\" # Location of package manifests\n    rebase-strategy: \"disabled\"\n    schedule:\n      interval: \"weekly\"\n    open-pull-requests-limit: 15\n  - package-ecosystem: \"pip\" # See documentation for possible values\n    directory: \"/python\" # Location of package manifests\n    rebase-strategy: \"disabled\"\n    schedule:\n      interval: \"weekly\"\n    open-pull-requests-limit: 15\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    rebase-strategy: \"disabled\"\n    schedule:\n      # Check for updates to GitHub Actions every week\n      interval: \"weekly\"\n    open-pull-requests-limit: 15\n"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "content": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# You may wish to alter this file to override the set of languages analyzed,\n# or to provide custom queries or build logic.\n#\n# ******** NOTE ********\n# We have attempted to detect the languages in your repository. Please check\n# the `language` matrix defined below to confirm you have the correct set of\n# supported CodeQL languages.\n#\nname: \"CodeQL\"\n\non:\n  push:\n    branches: [ main, release, staging/* ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ main ]\n  schedule:\n    - cron: '24 6 * * 1'\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'javascript', 'python' ]\n        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]\n        # Learn more:\n        # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v6\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v4\n      with:\n        languages: ${{ matrix.language }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n        # queries: ./path/to/local/query, your-org/your-repo/queries@main\n\n    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).\n    # If this step fails, then you should remove it and run the build manually (see below)\n    - name: Autobuild\n      uses: github/codeql-action/autobuild@v4\n\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 https://git.io/JvXDl\n\n    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines\n    #    and modify them (or add more) to build your code if your project\n    #    uses a compiled language\n\n    #- run: |\n    #   make bootstrap\n    #   make release\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v4\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "content": "name: CI\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n\n\njobs:\n  build:\n    name: Build ${{ matrix.os }} (Node ${{ matrix.node-version }}, Python ${{ matrix.python-version }} )\n    runs-on: ${{ matrix.os }}-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ ubuntu, windows, macos ]\n        python-version: ['3.10', 3.11]\n        include:\n          - python-version: '3.10' \n            node-version: 16\n          - python-version: 3.11\n            node-version: 18\n          - python-version: 3.11\n            node-version: 20\n    steps:\n      - uses: actions/checkout@v6\n      - name: Set up Node ${{ matrix.node-version }}\n        uses: actions/setup-node@v6\n        with:\n          node-version: ${{ matrix.node-version }}\n      - name: Set up Python ${{ matrix.python-version }}\n        uses: actions/setup-python@v6\n        with:\n          python-version: ${{ matrix.python-version }}\n      - name: Cached node_modules\n        uses: actions/cache@v5\n        with:\n          path: node_modules\n          key: ${{ runner.os }}-node-${{ hashFiles('**/package*.json') }}\n          restore-keys: |\n            ${{ runner.os }}-node-\n      - name: Make all (Windows)\n        if: matrix.os == 'windows'\n        run: make all\n      - name: Make CI (Non-windows)\n        if: matrix.os != 'windows'\n        run: make ci\n"
  },
  {
    "path": ".github/workflows/milestone-publish.yml",
    "content": "# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created\n# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages\n\nname: Release new version\n\non:\n  milestone:\n    types: [closed]\n\n\njobs:\n  publish:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n      - name: Set up Node\n        uses: actions/setup-node@v6\n        with:\n          node-version: 18\n          registry-url: https://registry.npmjs.org/\n      - name: Set up Python\n        uses: actions/setup-python@v6\n        with:\n          python-version: 3.11\n      - name: Set git user\n        run: |\n          git config --global user.email \"github-action@users.noreply.github.com\"\n          git config --global user.name \"GitHub Action\"\n      - name: Fetch beautifier/beautifier.io\n        env:\n          BEAUTIFIER_IO_DEPLOY_KEY: ${{ secrets.BEAUTIFIER_IO_DEPLOY_KEY }}\n          JS_BEAUTIFY_DEPLOY_KEY: ${{ secrets.JS_BEAUTIFY_DEPLOY_KEY }}\n          SSH_AUTH_SOCK: /tmp/ssh_agent.sock\n        run: |\n          mkdir -p ~/.ssh\n          cat .github/workflows/ssh_config.txt > ~/.ssh/config\n          ssh-agent -a $SSH_AUTH_SOCK > /dev/null\n          ssh-keyscan github.com >> ~/.ssh/known_hosts\n          \n          cat > ~/.ssh/deploy_beautifier_io <<< \"${BEAUTIFIER_IO_DEPLOY_KEY}\"\n          cat > ~/.ssh/deploy_js_beautify <<< \"${JS_BEAUTIFY_DEPLOY_KEY}\"\n\n          chmod 400 ~/.ssh/deploy_beautifier_io\n          chmod 400 ~/.ssh/deploy_js_beautify\n\n          ssh-add ~/.ssh/deploy_beautifier_io\n          ssh-add ~/.ssh/deploy_js_beautify\n                    \n          git remote add site git@beautifier-github.com:beautifier/beautifier.io.git\n          git remote add trigger git@js-beautify-github.com:beautifier/js-beautify.git\n          git fetch --all\n      - name: Install python twinE\n        run: pip install twine wheel\n      - name: Run release script for ${{ github.event.milestone.title }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          SSH_AUTH_SOCK: /tmp/ssh_agent.sock\n          MILESTONE_VERSION: ${{ github.event.milestone.title }}\n          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}\n          TWINE_USERNAME: ${{secrets.PYPI_USERNAME}}\n          TWINE_PASSWORD: ${{secrets.PYPI_PASSWORD}}\n        run: |\n          ./tools/release-all.sh ${MILESTONE_VERSION}\n"
  },
  {
    "path": ".github/workflows/pr-staging.yml",
    "content": "# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created\n# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages\n\nname: Release PR\n\non:\n  push:\n    branches:\n      - 'staging/gh-pages'\n      - 'staging/main'\n      - 'staging/release'\n\n\njobs:\n  PR-from-staging:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n      - name: pull-request gh-pages\n        if: github.ref == 'refs/heads/staging/gh-pages'\n        uses: repo-sync/pull-request@v2\n        with:\n          pr_title: \"Pulling staging/gh-pages into gh-pages\"\n          source_branch: \"staging/gh-pages\"\n          destination_branch: \"gh-pages\"\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n      - name: pull-request main\n        if: github.ref == 'refs/heads/staging/main'\n        uses: repo-sync/pull-request@v2\n        with:\n          pr_title: \"Pulling staging/main into main\"\n          source_branch: \"staging/main\"\n          destination_branch: \"main\"\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n      - name: pull-request release\n        if: github.ref == 'refs/heads/staging/release'\n        uses: repo-sync/pull-request@v2\n        with:\n          pr_title: \"Pulling staging/release into release\"\n          source_branch: \"staging/release\"\n          destination_branch: \"release\"\n          github_token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/ssh_config.txt",
    "content": "Host beautifier-github.com\n   HostName github.com\n   IdentityFile ~/.ssh/deploy_beautifier_io\n   IdentitiesOnly yes\n   \n# Other github account: superman\nHost js-beautify-github.com\n   HostName github.com\n   IdentityFile ~/.ssh/deploy_js_beautify\n   IdentitiesOnly yes\n   \n"
  },
  {
    "path": ".gitignore",
    "content": "*.orig\nnode_modules\ngh-pages\ngh\n\n*.pyc\npython/setup.py\npython/*/__pycache__\npython/MANIFEST\npython/build\npython/dist\npython/.eggs/\npython/jsbeautifier.egg-info\npython/cssbeautifier.egg-info\n.nvmrc\n.nvm/\n\ntarget\ndist/\nbuild/\njs/lib/\ngenerated/\n.idea/\n.vscode/\n"
  },
  {
    "path": ".jshintignore",
    "content": "dist/**\njs/bin/**\njs/lib/**\njs/test/resources/**\nnode_modules/**\npython/**\ntarget/**\ntools/**\ntest/resources/*\nweb/lib/**\nbuild/**\n\nweb/google-analytics.js"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"bitwise\": true,\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"noarg\": true,\n  \"nocomma\": true,\n  \"node\": true,\n  \"nonbsp\": true,\n  \"nonew\": true,\n  \"strict\": true,\n  \"unused\": true,\n  \"esversion\": 3\n}\n"
  },
  {
    "path": ".npmignore",
    "content": "# ANY FUTURE CHANGES TO THIS FILE NEED TO BE MANUALLY TESTED LOCALLY\n# USE npm pack AND VERIFY THAT PACKAGE CONTENTS ARE STILL VALID\n# Ignore all files\n*\n\n# Add exceptions\n!js/\n!js/**/*\n!CONTRIBUTING.MD\n# README, LICENSE, CHANGELOG and package.json are always added\n\n"
  },
  {
    "path": ".pylintrc",
    "content": "max-line-length=88"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## v1.15.4\n* Downgrade nopt to v7.x to maintain Node.js v14 compatibility ([#2358](https://github.com/beautifier/js-beautify/issues/2358))\n\n## v1.15.3\n* fix node 18 support by downgrading glob to v10 ([#2350](https://github.com/beautifier/js-beautify/pull/2350))\n\n## v1.15.2\n* Patch SNYK-JS-CROSSSPAWN-8303230 issue brought it through old glob package ([#2328](https://github.com/beautifier/js-beautify/issues/2328))\n* release wheels on pypi ([#2313](https://github.com/beautifier/js-beautify/issues/2313))\n* ModuleNotFoundError: No module named 'setuptools.command.test' as of latest setuptools package release ([#2301](https://github.com/beautifier/js-beautify/issues/2301))\n* [Python]Compatible with setuptools>=72 ([#2300](https://github.com/beautifier/js-beautify/issues/2300))\n\n## v1.15.1\n* Turn new angular templating off by default in html ([#2247](https://github.com/beautifier/js-beautify/pull/2247))\n* Perf regression in latest release (1.15.0) ([#2246](https://github.com/beautifier/js-beautify/issues/2246))\n\n## v1.15.0\n* Fixed #2219 - formatting of new Angular control flow syntax ([#2221](https://github.com/beautifier/js-beautify/pull/2221))\n\n## v1.14.11\n* Editor not working https://beautifier.io/ ([#2201](https://github.com/beautifier/js-beautify/issues/2201))\n* Set nodejs minimum to v14 ([#2169](https://github.com/beautifier/js-beautify/pull/2169))\n* Invalid prettification of object with unicode escape character as object key ([#2159](https://github.com/beautifier/js-beautify/issues/2159))\n* invalid json being generated with wrap\\_line\\_length ([#1932](https://github.com/beautifier/js-beautify/issues/1932))\n\n## v1.14.9\n* Bump semver and editorconfig ([#2161](https://github.com/beautifier/js-beautify/pull/2161))\n* Update editorconfig package ([#2160](https://github.com/beautifier/js-beautify/issues/2160))\n* Allow to configure the \"custom elements as inline elements\" behavior ([#2113](https://github.com/beautifier/js-beautify/issues/2113))\n\n## v1.14.8\n* Require nodejs v12 or greater ([#2151](https://github.com/beautifier/js-beautify/pull/2151))\n* CSS insideNonNestedAtRule generic variable  ([#2147](https://github.com/beautifier/js-beautify/pull/2147))\n* Update dependencies ([#2145](https://github.com/beautifier/js-beautify/pull/2145))\n* Fix CI build ([#2144](https://github.com/beautifier/js-beautify/pull/2144))\n* Fixed #2133 Theme Toggle on without\\_codemirror Mode ([#2138](https://github.com/beautifier/js-beautify/pull/2138))\n* use correct variable name ([#2135](https://github.com/beautifier/js-beautify/pull/2135))\n* docs: Fix a few typos ([#2127](https://github.com/beautifier/js-beautify/pull/2127))\n* Add support for new record types (cont.) ([#2118](https://github.com/beautifier/js-beautify/pull/2118))\n* fix - semicolon followed by block statement doesnt have new line ([#2117](https://github.com/beautifier/js-beautify/pull/2117))\n* Fix formatting related to the <menu> element ([#2114](https://github.com/beautifier/js-beautify/pull/2114))\n* issue prettifying (function(){code();{code}})() ([#1852](https://github.com/beautifier/js-beautify/issues/1852))\n\n## v1.14.7\n* Doc: Updates web browser implementation examples ([#2107](https://github.com/beautifier/js-beautify/pull/2107))\n* HTML formatter breaks layout by introducing newlines ([#1989](https://github.com/beautifier/js-beautify/issues/1989))\n\n## v1.14.6\n* Globs no longer work on Windows in 1.14.5 ([#2093](https://github.com/beautifier/js-beautify/issues/2093))\n\n## v1.14.5\n* Dependency updates and UI tweaks ([#2088](https://github.com/beautifier/js-beautify/pull/2088))\n* Bump terser from 5.12.1 to 5.14.2 ([#2084](https://github.com/beautifier/js-beautify/pull/2084))\n* new layout breaks everything on long lines ([#2071](https://github.com/beautifier/js-beautify/issues/2071))\n* Dark mode ([#2057](https://github.com/beautifier/js-beautify/issues/2057))\n\n## v1.14.4\n* Extra space before `!important` added ([#2056](https://github.com/beautifier/js-beautify/issues/2056))\n* css format removes space after quoted value  ([#2051](https://github.com/beautifier/js-beautify/issues/2051))\n* Add grid-template-areas to NON\\_SEMICOLON\\_NEWLINE\\_PROPERTY list ([#2035](https://github.com/beautifier/js-beautify/pull/2035))\n* CSS formatter removes useful space ([#2024](https://github.com/beautifier/js-beautify/issues/2024))\n* CHANGELOG.md file was wiped out in v1.14.2 ([#2022](https://github.com/beautifier/js-beautify/issues/2022))\n* Fails to recognize Handlebars block with whitespace control, e.g. {{~#if true ~}} ([#1988](https://github.com/beautifier/js-beautify/issues/1988))\n* Support new sass `@use` syntax ([#1976](https://github.com/beautifier/js-beautify/issues/1976))\n* Do not remove whitespace after number ([#1950](https://github.com/beautifier/js-beautify/issues/1950))\n* html formatter doesn't support handlebars partial blocks (`#>`) ([#1869](https://github.com/beautifier/js-beautify/issues/1869))\n* in keyword in class method causes indentation problem ([#1846](https://github.com/beautifier/js-beautify/issues/1846))\n* space\\_after\\_named\\_function not working inside an ES6 class ([#1622](https://github.com/beautifier/js-beautify/issues/1622))\n* Restyle website ([#1444](https://github.com/beautifier/js-beautify/issues/1444))\n* improper line concatenation between 'return' and a prefix expression ([#1095](https://github.com/beautifier/js-beautify/issues/1095))\n\n## v1.14.3\n* [LESS] Fixing issues with spacing when an object literal lives inside a mixin ([#2017](https://github.com/beautifier/js-beautify/pull/2017))\n* Overindentation when using \"class\" as a key in an object ([#1838](https://github.com/beautifier/js-beautify/issues/1838))\n* CSS Grid template formatting is broken when adding track size after line names ([#1817](https://github.com/beautifier/js-beautify/issues/1817))\n* SCSS module system @use problem ([#1798](https://github.com/beautifier/js-beautify/issues/1798))\n* JS \"space\\_in\\_empty\\_paren\" failing for class methods ([#1151](https://github.com/beautifier/js-beautify/issues/1151))\n* LESS mixins gets formatted strangely ([#722](https://github.com/beautifier/js-beautify/issues/722))\n\n## v1.14.2\n* Why put npm in dependencies? ([#2005](https://github.com/beautifier/js-beautify/issues/2005))\n* [Bug] Logical assignments in JS are incorrectly beautified  ([#1991](https://github.com/beautifier/js-beautify/issues/1991))\n\n## v1.14.1\n* feature request: cmd+enter hotkey for mac users ([#1985](https://github.com/beautifier/js-beautify/issues/1985))\n* Wrong indentation when the last line in a case is a right brace ([#1683](https://github.com/beautifier/js-beautify/issues/1683))\n\n## v1.14.0\n* import.meta appears on newline ([#1978](https://github.com/beautifier/js-beautify/issues/1978))\n* Added buttons to website ([#1930](https://github.com/beautifier/js-beautify/pull/1930))\n* Logical assignment operators; Fix parsing of optional chaining ([#1888](https://github.com/beautifier/js-beautify/issues/1888))\n* Numbers should be allowed to contain underscores ([#1836](https://github.com/beautifier/js-beautify/issues/1836))\n* Use native mkdirSync instead of 'mkdirp' package ([#1833](https://github.com/beautifier/js-beautify/pull/1833))\n*  selector\\_separator\\_newline adds erroneous newline on @extend SCSS statements ([#1799](https://github.com/beautifier/js-beautify/issues/1799))\n\n## v1.13.13\n* IE11 compatibility failure v>1.13.5 ([#1918](https://github.com/beautifier/js-beautify/issues/1918))\n\n## v1.13.11\n* Support short PHP tags ([#1840](https://github.com/beautifier/js-beautify/issues/1840))\n\n## v1.13.6\n* Fix space-before-conditional: false to work on switch-case statement ([#1881](https://github.com/beautifier/js-beautify/pull/1881))\n* Optional chaining obj?.[expr] ([#1801](https://github.com/beautifier/js-beautify/issues/1801))\n\n## v1.13.5\n\n## v1.13.1\n* Option 'max\\_preserve\\_newlines' not working on beautify\\_css.js CSS Beautifier ([#1863](https://github.com/beautifier/js-beautify/issues/1863))\n* React Fragment Short Syntax <></> issue ([#1854](https://github.com/beautifier/js-beautify/issues/1854))\n* add  viewport meta tag to index.html ([#1843](https://github.com/beautifier/js-beautify/pull/1843))\n* Add basic smarty templating support ([#1820](https://github.com/beautifier/js-beautify/issues/1820))\n* Tagged Template literals ([#1244](https://github.com/beautifier/js-beautify/issues/1244))\n\n## v1.13.0\n* (internal) Refactor python cssbeautifier to reuse jsbeautifier CLI methods ([#1832](https://github.com/beautifier/js-beautify/pull/1832))\n* (internal) Switch from node-static to serve ([#1831](https://github.com/beautifier/js-beautify/pull/1831))\n* Fixed pip install cssbeautifier ([#1830](https://github.com/beautifier/js-beautify/pull/1830))\n\n## v1.12.0\n* Python jsbeautifier fails for special chars ([#1809](https://github.com/beautifier/js-beautify/issues/1809))\n* pip install cssbeautifier fails ([#1808](https://github.com/beautifier/js-beautify/issues/1808))\n* Add expand brace-style option to css beautifier ([#1796](https://github.com/beautifier/js-beautify/pull/1796))\n* Support nullish-coalescing ([#1794](https://github.com/beautifier/js-beautify/issues/1794))\n* Upgrade ga.js to analytics.js ([#1777](https://github.com/beautifier/js-beautify/issues/1777))\n* Newline rule not working with css-like files ([#1776](https://github.com/beautifier/js-beautify/issues/1776))\n* no new line after self closing tag ([#1718](https://github.com/beautifier/js-beautify/issues/1718))\n* HTML format, no break after <label>? ([#1365](https://github.com/beautifier/js-beautify/issues/1365))\n* Does this extension still supports applying Allman style to CSS? ([#1353](https://github.com/beautifier/js-beautify/issues/1353))\n* Add brace\\_style option for CSS ([#1259](https://github.com/beautifier/js-beautify/issues/1259))\n\n## v1.11.0\n* Please bump mkdirp to fix mkdirp@0.5.1 vulnerability ([#1768](https://github.com/beautifier/js-beautify/issues/1768))\n* Incorrect indentation of Handlebars inline partials ([#1756](https://github.com/beautifier/js-beautify/issues/1756))\n* Support optional-chaining ([#1727](https://github.com/beautifier/js-beautify/issues/1727))\n* Please support es module ([#1706](https://github.com/beautifier/js-beautify/issues/1706))\n* Support new js proposals: optional-chaining & pipeline-operator ([#1530](https://github.com/beautifier/js-beautify/issues/1530))\n* Optional <p> closing not implemented ([#1503](https://github.com/beautifier/js-beautify/issues/1503))\n\n## v1.10.3\n* Unquoted href causes wrong indentation ([#1736](https://github.com/beautifier/js-beautify/issues/1736))\n* Broken private fields in classes (JS) ([#1734](https://github.com/beautifier/js-beautify/issues/1734))\n* Fix for python 2.7 and cli parameters ([#1712](https://github.com/beautifier/js-beautify/pull/1712))\n* Search (ctrl+f) works only in view field in CodeMirror ([#1696](https://github.com/beautifier/js-beautify/issues/1696))\n\n## v1.10.2\n* Please update CodeMirror Addon ([#1695](https://github.com/beautifier/js-beautify/issues/1695))\n* Nested braces indentation ([#223](https://github.com/beautifier/js-beautify/issues/223))\n\n## v1.10.1\n* javascript fails to format when <?php > is first text inside <script> tag ([#1687](https://github.com/beautifier/js-beautify/issues/1687))\n* 414 Request-URI Too Large ([#1640](https://github.com/beautifier/js-beautify/issues/1640))\n\n## v1.10.0\n* beautifying scss selector with colon in it adds space ([#1667](https://github.com/beautifier/js-beautify/issues/1667))\n* Javascript multiline comments duplicates ([#1663](https://github.com/beautifier/js-beautify/issues/1663))\n* Tokenizer crashes if the input terminates with a dot character. ([#1658](https://github.com/beautifier/js-beautify/issues/1658))\n* stop reformatting valid css \\\\! into invalid \\\\ ! ([#1656](https://github.com/beautifier/js-beautify/pull/1656))\n* wrong indent for unclosed <? - need to support disabling templating ([#1647](https://github.com/beautifier/js-beautify/issues/1647))\n* Beautify inserts space before exclamation mark in comment <!-- in css <style> ([#1641](https://github.com/beautifier/js-beautify/issues/1641))\n* 'less' mixins parameter formatting problem ([#1582](https://github.com/beautifier/js-beautify/issues/1582))\n* Change css tests to use 4 space indenting instead of tabs ([#1527](https://github.com/beautifier/js-beautify/issues/1527))\n* Braces after case get pushed onto new line ([#1357](https://github.com/beautifier/js-beautify/issues/1357))\n* Extra space in pseudo-elements and pseudo-classes selectors ([#1233](https://github.com/beautifier/js-beautify/issues/1233))\n* LESS formatting - mixins with multiple variables ([#1018](https://github.com/beautifier/js-beautify/issues/1018))\n* Bug in less format ([#842](https://github.com/beautifier/js-beautify/issues/842))\n\n## v1.9.1\n* nested table not beautified correctly ([#1649](https://github.com/beautifier/js-beautify/issues/1649))\n* Add an option to preserve indentation on empty lines ([#1322](https://github.com/beautifier/js-beautify/issues/1322))\n\n## v1.9.0\n* Incorrect indentation of `^` inverted section tags in Handlebars/Mustache code ([#1623](https://github.com/beautifier/js-beautify/issues/1623))\n* PHP In HTML Attributes ([#1620](https://github.com/beautifier/js-beautify/issues/1620))\n* DeanEdward python unpacker offset problem ([#1616](https://github.com/beautifier/js-beautify/issues/1616))\n* CLI on Windows doesn't accept -f - for stdin? ([#1609](https://github.com/beautifier/js-beautify/issues/1609))\n* HTML type attribute breaks JavaScript beautification? ([#1606](https://github.com/beautifier/js-beautify/issues/1606))\n* Use of global MODE before declaration caused uglify problem ([#1604](https://github.com/beautifier/js-beautify/issues/1604))\n* When building html tags using Mustache variables, extra whitespace is added after opening arrow ([#1602](https://github.com/beautifier/js-beautify/issues/1602))\n* <script type=\"text/html\">isnot abled to be beautified ([#1591](https://github.com/beautifier/js-beautify/issues/1591))\n* \\_get\\_full\\_indent undefined ([#1590](https://github.com/beautifier/js-beautify/issues/1590))\n* Website \"autodetect\" setting doesn't distinguish css vs javascript ([#1565](https://github.com/beautifier/js-beautify/issues/1565))\n* Add setting to keep HTML tag text content unformatted or ignore custom delimiters ([#1560](https://github.com/beautifier/js-beautify/issues/1560))\n* HTML auto formatting using spaces instead of tabs ([#1551](https://github.com/beautifier/js-beautify/issues/1551))\n* Unclosed single quote in php tag causes formatting changes which break php code ([#1377](https://github.com/beautifier/js-beautify/issues/1377))\n* Using tabs when wrapping attributes and wrapping if needed ([#1294](https://github.com/beautifier/js-beautify/issues/1294))\n* HTML --wrap-attributes doesn't respect --wrap-line-length ([#1238](https://github.com/beautifier/js-beautify/issues/1238))\n* Bad indent level(HTML) ([#1213](https://github.com/beautifier/js-beautify/issues/1213))\n* js-beautify produces invalid code for variables with Unicode escape sequences ([#1211](https://github.com/beautifier/js-beautify/issues/1211))\n* support vuejs ([#1154](https://github.com/beautifier/js-beautify/issues/1154))\n* Go templates in HTML ([#881](https://github.com/beautifier/js-beautify/issues/881))\n* Better behavior for javascript --wrap-line-length ([#284](https://github.com/beautifier/js-beautify/issues/284))\n\n## v1.8.9\n* Won't run from CLI - bad option name `files` ([#1583](https://github.com/beautifier/js-beautify/issues/1583))\n* in the .vue file `space\\_after\\_anon\\_function` is invalid ([#1425](https://github.com/beautifier/js-beautify/issues/1425))\n* Add function default\\_options() to beautifier.js ([#1364](https://github.com/beautifier/js-beautify/issues/1364))\n* fix: Missing space before function parentheses ? ([#1077](https://github.com/beautifier/js-beautify/issues/1077))\n* Support globs in CLI ([#787](https://github.com/beautifier/js-beautify/issues/787))\n\n## v1.8.8\n*  async function in object wrong indentation ([#1573](https://github.com/beautifier/js-beautify/issues/1573))\n\n## v1.8.7\n* Add tests for html  `indent\\_scripts` option ([#1518](https://github.com/beautifier/js-beautify/issues/1518))\n* Support dynamic import ([#1197](https://github.com/beautifier/js-beautify/issues/1197))\n* HTML: add an option to preserve manual wrapping of attributes ([#1125](https://github.com/beautifier/js-beautify/issues/1125))\n* js-beautify adds a space between # and include ([#1114](https://github.com/beautifier/js-beautify/issues/1114))\n* space\\_after\\_anon\\_function doesn't work with anon async functions ([#1034](https://github.com/beautifier/js-beautify/issues/1034))\n* Space before function arguments (space-after-function) (space-after-named-function) ([#608](https://github.com/beautifier/js-beautify/issues/608))\n\n## v1.8.6\n* JS beautify break the angular compile ([#1544](https://github.com/beautifier/js-beautify/issues/1544))\n* base64 string is broken with v1.8.4 ([#1535](https://github.com/beautifier/js-beautify/issues/1535))\n* Bookmarklet becomes totally useless ([#1408](https://github.com/beautifier/js-beautify/issues/1408))\n* HTTPS ([#1399](https://github.com/beautifier/js-beautify/issues/1399))\n* Beautify breaks when js starts with space followed by multi-line comment ([#789](https://github.com/beautifier/js-beautify/issues/789))\n\n## v1.8.4\n* Multiple newlines added between empty textarea and \"unformatted\" inline elements  ([#1534](https://github.com/beautifier/js-beautify/issues/1534))\n* unindent\\_chained\\_methods broken ([#1533](https://github.com/beautifier/js-beautify/issues/1533))\n\n## v1.8.3\n* Missing Bower Assets ([#1521](https://github.com/beautifier/js-beautify/issues/1521))\n* Javascript ternary breaked with `await` ([#1519](https://github.com/beautifier/js-beautify/issues/1519))\n* Object property indented after `await` ([#1517](https://github.com/beautifier/js-beautify/issues/1517))\n* Handlebars formatting problems ([#870](https://github.com/beautifier/js-beautify/issues/870))\n* beautify.js doesn't have indent\\_level option ([#724](https://github.com/beautifier/js-beautify/issues/724))\n\n## v1.8.1\n* Why npm is a dependency? ([#1516](https://github.com/beautifier/js-beautify/issues/1516))\n* indent\\_inner\\_html not working in v1.8.0 ([#1514](https://github.com/beautifier/js-beautify/issues/1514))\n\n## v1.8.0\n* list items of nested lists get indented backwards ([#1501](https://github.com/beautifier/js-beautify/issues/1501))\n* Make beautifier auto-convert options with dashes into underscores ([#1497](https://github.com/beautifier/js-beautify/issues/1497))\n* ReferenceError: token is not defined ([#1496](https://github.com/beautifier/js-beautify/issues/1496))\n* Publish v1.8.0 ([#1495](https://github.com/beautifier/js-beautify/issues/1495))\n* still probem #1439 / #1337 ([#1491](https://github.com/beautifier/js-beautify/issues/1491))\n* Duplicating HTML Code Nested In PHP ([#1483](https://github.com/beautifier/js-beautify/issues/1483))\n* Handlebars - `if` tags are broken when using helper with `textarea` ([#1482](https://github.com/beautifier/js-beautify/issues/1482))\n* TypeError: Cannot read property '1' of null ([#1481](https://github.com/beautifier/js-beautify/issues/1481))\n* Space in Self Closing Tag Issue ([#1478](https://github.com/beautifier/js-beautify/issues/1478))\n* Weird Formatting in VSCode ([#1475](https://github.com/beautifier/js-beautify/issues/1475))\n* Indent with tab issue on website ([#1470](https://github.com/beautifier/js-beautify/issues/1470))\n* Contents of hbs tags are converted to lowercase ([#1464](https://github.com/beautifier/js-beautify/issues/1464))\n* HTML tags are indented wrongly when attributes are present ([#1462](https://github.com/beautifier/js-beautify/issues/1462))\n* hbs tags are stripped when there is a comment below or inline ([#1461](https://github.com/beautifier/js-beautify/issues/1461))\n* Spaces added to handlebars with '=' ([#1460](https://github.com/beautifier/js-beautify/issues/1460))\n* jsbeautifier.org don't works ([#1445](https://github.com/beautifier/js-beautify/issues/1445))\n* Commenting code and then beautifying removes line breaks ([#1440](https://github.com/beautifier/js-beautify/issues/1440))\n* Less: Where is my space? ([#1411](https://github.com/beautifier/js-beautify/issues/1411))\n* No newline after @import ([#1406](https://github.com/beautifier/js-beautify/issues/1406))\n* \"html.format.wrapAttributes\": \"force-aligned\" adds empty line on long attributes ([#1403](https://github.com/beautifier/js-beautify/issues/1403))\n* HTML: wrap\\_line\\_length is handled incorrectly ([#1401](https://github.com/beautifier/js-beautify/issues/1401))\n* js-beautify is breaking code by adding space after import ([#1393](https://github.com/beautifier/js-beautify/issues/1393))\n* JS-Beautify should format XML tags inside HTML files ([#1383](https://github.com/beautifier/js-beautify/issues/1383))\n* python unpacker can not handle if radix given as [] and not as a number ([#1381](https://github.com/beautifier/js-beautify/issues/1381))\n* unindent\\_chained\\_methods breaks indentation for if statements without brackets  ([#1378](https://github.com/beautifier/js-beautify/issues/1378))\n* function parameters merged into single line when starting with ! or [ ([#1374](https://github.com/beautifier/js-beautify/issues/1374))\n* CSS selector issue (header > div[class~=\"div-all\"]) in SCSS file ([#1373](https://github.com/beautifier/js-beautify/issues/1373))\n* Add \"Create Issue for Unexpected Output\" button to website ([#1371](https://github.com/beautifier/js-beautify/issues/1371))\n* Add combobox to control type of beautification ([#1370](https://github.com/beautifier/js-beautify/issues/1370))\n* Add Options textbox to website for debugging ([#1369](https://github.com/beautifier/js-beautify/issues/1369))\n\n## v1.7.5\n* Strict mode: js\\_source\\_text is not defined [CSS] ([#1286](https://github.com/beautifier/js-beautify/issues/1286))\n* Made brace\\_style option more inclusive ([#1277](https://github.com/beautifier/js-beautify/pull/1277))\n* White space before\"!important\" tag missing in CSS beautify ([#1273](https://github.com/beautifier/js-beautify/issues/1273))\n\n## v1.7.4\n* Whitespace after ES7 `async` keyword for arrow functions ([#896](https://github.com/beautifier/js-beautify/issues/896))\n\n## v1.7.3\n* Version 1.7.0 fail to install through pip ([#1250](https://github.com/beautifier/js-beautify/issues/1250))\n* Installing js-beautify fails ([#1247](https://github.com/beautifier/js-beautify/issues/1247))\n\n## v1.7.0\n* undindent-chained-methods option. Resolves #482 ([#1240](https://github.com/beautifier/js-beautify/pull/1240))\n* Add test and tools folder to npmignore ([#1239](https://github.com/beautifier/js-beautify/issues/1239))\n* incorrect new-line insertion after \"yield\" ([#1206](https://github.com/beautifier/js-beautify/issues/1206))\n* Do not modify built-in objects ([#1205](https://github.com/beautifier/js-beautify/issues/1205))\n* Fix label checking incorrect box when clicked ([#1169](https://github.com/beautifier/js-beautify/pull/1169))\n* Webpack ([#1149](https://github.com/beautifier/js-beautify/pull/1149))\n* daisy-chain indentation leads to over-indentation ([#482](https://github.com/beautifier/js-beautify/issues/482))\n\n## v1.6.12\n* CSS: Preserve Newlines ([#537](https://github.com/beautifier/js-beautify/issues/537))\n\n## v1.6.11\n* On beautify, new line before next CSS selector ([#1142](https://github.com/beautifier/js-beautify/issues/1142))\n\n## v1.6.10\n\n## v1.6.9\n* Wrong HTML beautification starting with v1.6.5 ([#1115](https://github.com/beautifier/js-beautify/issues/1115))\n* Ignore linebreak when meet handlebar ([#1104](https://github.com/beautifier/js-beautify/pull/1104))\n* Lines are not un-indented correctly when attributes are wrapped ([#1103](https://github.com/beautifier/js-beautify/issues/1103))\n* force-aligned is not aligned when indenting with tabs ([#1102](https://github.com/beautifier/js-beautify/issues/1102))\n* Python package fails to publish  ([#1101](https://github.com/beautifier/js-beautify/issues/1101))\n* Explaination of 'operator\\_position' is absent from README.md ([#1047](https://github.com/beautifier/js-beautify/issues/1047))\n\n## v1.6.8\n* Incorrect indentation after loop with comment ([#1090](https://github.com/beautifier/js-beautify/issues/1090))\n* Extra newline is inserted after beautifying code with anonymous function ([#1085](https://github.com/beautifier/js-beautify/issues/1085))\n* end brace with next comment line make bad indent ([#1043](https://github.com/beautifier/js-beautify/issues/1043))\n* Javascript comment in last line doesn't beautify well ([#964](https://github.com/beautifier/js-beautify/issues/964))\n* indent doesn't work with comment (jsdoc) ([#913](https://github.com/beautifier/js-beautify/issues/913))\n* Wrong indentation, when new line between chained methods ([#892](https://github.com/beautifier/js-beautify/issues/892))\n* Comments in a non-semicolon style have extra indent ([#815](https://github.com/beautifier/js-beautify/issues/815))\n* [bug] Incorrect indentation due to commented line(s) following a function call with a function argument. ([#713](https://github.com/beautifier/js-beautify/issues/713))\n* Wrong indent formatting ([#569](https://github.com/beautifier/js-beautify/issues/569))\n\n## v1.6.7\n* HTML pre code indentation ([#928](https://github.com/beautifier/js-beautify/issues/928))\n* Beautify script/style tags but ignore their inner JS/CSS content ([#906](https://github.com/beautifier/js-beautify/issues/906))\n\n## v1.6.6\n* Wrong indentation for comment after nested unbraced control constructs ([#1079](https://github.com/beautifier/js-beautify/issues/1079))\n* Should prefer breaking the line after operator ? instead of before operator < ([#1073](https://github.com/beautifier/js-beautify/issues/1073))\n* New option \"force-expand-multiline\" for \"wrap\\_attributes\" ([#1070](https://github.com/beautifier/js-beautify/pull/1070))\n* Breaks if html file starts with comment ([#1068](https://github.com/beautifier/js-beautify/issues/1068))\n* collapse-preserve-inline restricts users to collapse brace\\_style ([#1057](https://github.com/beautifier/js-beautify/issues/1057))\n* Parsing failure on numbers with \"e\" ([#1054](https://github.com/beautifier/js-beautify/issues/1054))\n* Issue with Browser Instructions ([#1053](https://github.com/beautifier/js-beautify/issues/1053))\n* Add preserve inline function for expand style braces ([#1052](https://github.com/beautifier/js-beautify/issues/1052))\n* Update years in LICENSE ([#1038](https://github.com/beautifier/js-beautify/issues/1038))\n* JS. Switch with template literals. Unexpected indentation. ([#1030](https://github.com/beautifier/js-beautify/issues/1030))\n* The object with spread object formatted not correctly ([#1023](https://github.com/beautifier/js-beautify/issues/1023))\n* Bad output generator function in class ([#1013](https://github.com/beautifier/js-beautify/issues/1013))\n* Support editorconfig for stdin ([#1012](https://github.com/beautifier/js-beautify/issues/1012))\n* Publish to cdnjs ([#992](https://github.com/beautifier/js-beautify/issues/992))\n* breaks if handlebars comments contain handlebars tags ([#930](https://github.com/beautifier/js-beautify/issues/930))\n* Using jsbeautifyrc is broken ([#929](https://github.com/beautifier/js-beautify/issues/929))\n* Option to put HTML attributes on their own lines, aligned ([#916](https://github.com/beautifier/js-beautify/issues/916))\n* Erroneously changes CRLF to LF on Windows in HTML and CSS ([#899](https://github.com/beautifier/js-beautify/issues/899))\n* Weird space in {get } vs { normal } ([#888](https://github.com/beautifier/js-beautify/issues/888))\n* Bad for-of formatting with constant Array ([#875](https://github.com/beautifier/js-beautify/issues/875))\n* Problems with filter property in css and scss ([#755](https://github.com/beautifier/js-beautify/issues/755))\n* Add \"collapse-one-line\" option for non-collapse brace styles  ([#487](https://github.com/beautifier/js-beautify/issues/487))\n\n## v1.6.4\n* css-beautify sibling combinator space issue ([#1001](https://github.com/beautifier/js-beautify/issues/1001))\n* Bug: Breaks when the source code it found an unclosed multiline comment. ([#996](https://github.com/beautifier/js-beautify/issues/996))\n* CSS: Preserve white space before pseudo-class and pseudo-element selectors ([#985](https://github.com/beautifier/js-beautify/pull/985))\n* Spelling error in token definition ([#984](https://github.com/beautifier/js-beautify/issues/984))\n* collapse-preserve-inline does not preserve simple, single line (\"return\") statements ([#982](https://github.com/beautifier/js-beautify/issues/982))\n* Publish the library via cdn ([#971](https://github.com/beautifier/js-beautify/issues/971))\n* Bug with css calc() function ([#957](https://github.com/beautifier/js-beautify/issues/957))\n* &:first-of-type:not(:last-child) when prettified insert erroneous white character ([#952](https://github.com/beautifier/js-beautify/issues/952))\n* Shorthand generator functions are formatting strangely ([#941](https://github.com/beautifier/js-beautify/issues/941))\n* Add handlebars support on cli for html ([#935](https://github.com/beautifier/js-beautify/pull/935))\n* Do not put a space within `yield*` generator functions. ([#920](https://github.com/beautifier/js-beautify/issues/920))\n* Possible to add an indent\\_inner\\_inner\\_html option? (Prevent indenting second-level tags) ([#917](https://github.com/beautifier/js-beautify/issues/917))\n* Messing up jsx formatting multi-line attribute ([#914](https://github.com/beautifier/js-beautify/issues/914))\n* Bug report: Closing 'body' tag isn't formatted correctly ([#900](https://github.com/beautifier/js-beautify/issues/900))\n* { throw … } not working with collapse-preserve-inline ([#898](https://github.com/beautifier/js-beautify/issues/898))\n* ES6 concise method not propely indented ([#889](https://github.com/beautifier/js-beautify/issues/889))\n* CSS beautify changing symantics ([#883](https://github.com/beautifier/js-beautify/issues/883))\n* Dojo unsupported script types. ([#874](https://github.com/beautifier/js-beautify/issues/874))\n* Readme version comment  ([#868](https://github.com/beautifier/js-beautify/issues/868))\n* Extra space after pseudo-elements within :not() ([#618](https://github.com/beautifier/js-beautify/issues/618))\n* space in media queries after colon &: selectors ([#565](https://github.com/beautifier/js-beautify/issues/565))\n* Integrating editor config ([#551](https://github.com/beautifier/js-beautify/issues/551))\n* Preserve short expressions/statements on single line ([#338](https://github.com/beautifier/js-beautify/issues/338))\n\n## v1.6.3\n* CLI broken when output path is not set ([#933](https://github.com/beautifier/js-beautify/issues/933))\n* huge memory leak ([#909](https://github.com/beautifier/js-beautify/issues/909))\n* don't print unpacking errors on stdout (python) ([#884](https://github.com/beautifier/js-beautify/pull/884))\n* Fix incomplete list of non-positionable operators (python lib) ([#878](https://github.com/beautifier/js-beautify/pull/878))\n* Fix Issue #844 ([#873](https://github.com/beautifier/js-beautify/pull/873))\n* assignment exponentiation operator ([#864](https://github.com/beautifier/js-beautify/issues/864))\n* Bug in Less mixins ([#844](https://github.com/beautifier/js-beautify/issues/844))\n* Can't Nest Conditionals ([#680](https://github.com/beautifier/js-beautify/issues/680))\n* ternary operations ([#670](https://github.com/beautifier/js-beautify/issues/670))\n* Support newline before logical or ternary operator ([#605](https://github.com/beautifier/js-beautify/issues/605))\n* Provide config files for format and linting ([#336](https://github.com/beautifier/js-beautify/issues/336))\n\n## v1.6.2\n* Add missing 'collapse-preserve-inline' option to js module ([#861](https://github.com/beautifier/js-beautify/pull/861))\n\n## v1.6.1\n* Inconsistent formatting for arrays of objects ([#860](https://github.com/beautifier/js-beautify/issues/860))\n* Publish v1.6.1 ([#859](https://github.com/beautifier/js-beautify/issues/859))\n* Space added to \"from++\" due to ES6 keyword  ([#858](https://github.com/beautifier/js-beautify/issues/858))\n* Changelog generator doesn't sort versions above 9 right ([#778](https://github.com/beautifier/js-beautify/issues/778))\n* space-after-anon-function not applied to object properties ([#761](https://github.com/beautifier/js-beautify/issues/761))\n* Separating 'input' elements adds whitespace ([#580](https://github.com/beautifier/js-beautify/issues/580))\n* Inline Format ([#572](https://github.com/beautifier/js-beautify/issues/572))\n* Preserve attributes line break in HTML ([#455](https://github.com/beautifier/js-beautify/issues/455))\n* Multiline Array ([#406](https://github.com/beautifier/js-beautify/issues/406))\n\n## v1.6.0\n* Individual tests pollute options object ([#855](https://github.com/beautifier/js-beautify/issues/855))\n* Object attribute assigned fat arrow function with implicit return of a ternary causes next line to indent ([#854](https://github.com/beautifier/js-beautify/issues/854))\n* Treat php tags as single in html ([#850](https://github.com/beautifier/js-beautify/pull/850))\n* Read piped input by default ([#849](https://github.com/beautifier/js-beautify/pull/849))\n* Replace makefile dependency with bash script ([#848](https://github.com/beautifier/js-beautify/pull/848))\n* list of HTML inline elements incomplete; wraps inappropriately ([#840](https://github.com/beautifier/js-beautify/issues/840))\n* Beautifying bracket-less if/elses ([#838](https://github.com/beautifier/js-beautify/issues/838))\n* <col> elements within a <colgroup> are getting indented incorrectly ([#836](https://github.com/beautifier/js-beautify/issues/836))\n* single attribute breaks jsx beautification ([#834](https://github.com/beautifier/js-beautify/issues/834))\n* Improve Python packaging ([#831](https://github.com/beautifier/js-beautify/pull/831))\n* Erroneously changes CRLF to LF on Windows. ([#829](https://github.com/beautifier/js-beautify/issues/829))\n* Can't deal with XHTML5 ([#828](https://github.com/beautifier/js-beautify/issues/828))\n* HTML after PHP is indented ([#826](https://github.com/beautifier/js-beautify/issues/826))\n* exponentiation operator ([#825](https://github.com/beautifier/js-beautify/issues/825))\n* Add support for script type \"application/ld+json\" ([#821](https://github.com/beautifier/js-beautify/issues/821))\n* package.json: Remove \"preferGlobal\" option ([#820](https://github.com/beautifier/js-beautify/pull/820))\n* Don't use array.indexOf() to support legacy browsers ([#816](https://github.com/beautifier/js-beautify/pull/816))\n* ES6 Object Shortand Indenting Weirdly Sometimes ([#810](https://github.com/beautifier/js-beautify/issues/810))\n* Implicit Return Function on New Line not Preserved ([#806](https://github.com/beautifier/js-beautify/issues/806))\n* Misformating \"0b\" Binary Strings ([#803](https://github.com/beautifier/js-beautify/issues/803))\n* Beautifier breaks ES6 nested template strings ([#797](https://github.com/beautifier/js-beautify/issues/797))\n* Misformating \"0o\" Octal Strings ([#792](https://github.com/beautifier/js-beautify/issues/792))\n* Do not use hardcoded directory for tests ([#788](https://github.com/beautifier/js-beautify/pull/788))\n* Handlebars {{else}} tag not given a newline ([#784](https://github.com/beautifier/js-beautify/issues/784))\n* Wrong indentation for XML header (<?xml version=\"1.0\"?>) ([#783](https://github.com/beautifier/js-beautify/issues/783))\n* is\\_whitespace for loop incrementing wrong variable ([#777](https://github.com/beautifier/js-beautify/pull/777))\n* Newline is inserted after comment with comma\\_first ([#775](https://github.com/beautifier/js-beautify/issues/775))\n* Cannot copy more than 1000 characters out of CodeMirror buffer ([#768](https://github.com/beautifier/js-beautify/issues/768))\n* Missing 'var' in beautify-html.js; breaks strict mode ([#763](https://github.com/beautifier/js-beautify/issues/763))\n* Fix typo in the example javascript code of index.html ([#753](https://github.com/beautifier/js-beautify/pull/753))\n\n## v1.5.10\n* Preserve directive doesn't work as intended ([#723](https://github.com/beautifier/js-beautify/issues/723))\n\n## v1.5.7\n* Support for legacy JavaScript versions (e.g. WSH+JScript & Co) ([#720](https://github.com/beautifier/js-beautify/pull/720))\n* Is \\\\n hard coded into CSS Beautifier logic? ([#715](https://github.com/beautifier/js-beautify/issues/715))\n* Spaces and linebreaks after # and around { } messing up interpolation/mixins (SASS/SCSS) ([#689](https://github.com/beautifier/js-beautify/issues/689))\n* Calls to functions get completely messed up in Sass (*.scss) ([#675](https://github.com/beautifier/js-beautify/issues/675))\n* No new line after selector in scss files ([#666](https://github.com/beautifier/js-beautify/issues/666))\n* using html-beautify on handlebars template deletes unclosed tag if on second line ([#623](https://github.com/beautifier/js-beautify/issues/623))\n* more Extra space after scss pseudo classes ([#557](https://github.com/beautifier/js-beautify/issues/557))\n* Unnecessary spaces in PHP code ([#490](https://github.com/beautifier/js-beautify/issues/490))\n* Some underscore.js template tags are broken ([#417](https://github.com/beautifier/js-beautify/issues/417))\n* Selective ignore using comments (feature request) ([#384](https://github.com/beautifier/js-beautify/issues/384))\n\n## v1.5.6\n* Fix tokenizer's bracket pairs' open stack ([#693](https://github.com/beautifier/js-beautify/pull/693))\n* Indentation is incorrect for HTML5 void tag <source> ([#692](https://github.com/beautifier/js-beautify/issues/692))\n* Line wrapping breaks at the wrong place when the line is indented. ([#691](https://github.com/beautifier/js-beautify/issues/691))\n* Publish v1.5.6 ([#687](https://github.com/beautifier/js-beautify/issues/687))\n* Replace existing file fails using python beautifier ([#686](https://github.com/beautifier/js-beautify/issues/686))\n* Pseudo-classes formatted incorrectly and inconsistently with @page ([#661](https://github.com/beautifier/js-beautify/issues/661))\n* doc: add end\\_with\\_newline option ([#650](https://github.com/beautifier/js-beautify/pull/650))\n* Improve support for xml parts of jsx (React) => spaces, spread attributes and nested objects break the process ([#646](https://github.com/beautifier/js-beautify/issues/646))\n* html-beautify formats handlebars comments but does not format html comments ([#635](https://github.com/beautifier/js-beautify/issues/635))\n* Support for ES7 async ([#630](https://github.com/beautifier/js-beautify/issues/630))\n* css beautify adding an extra newline after a comment line in a css block ([#609](https://github.com/beautifier/js-beautify/issues/609))\n* No option to \"Indent with tabs\" for HTML files ([#587](https://github.com/beautifier/js-beautify/issues/587))\n* Function body is indented when followed by a comment ([#583](https://github.com/beautifier/js-beautify/issues/583))\n* JSX support ([#425](https://github.com/beautifier/js-beautify/issues/425))\n* Alternative Newline Characters ([#260](https://github.com/beautifier/js-beautify/issues/260))\n\n## v1.5.5\n* Add GUI support for `--indent-inner-html`. ([#633](https://github.com/beautifier/js-beautify/pull/633))\n* Publish v1.5.5 ([#629](https://github.com/beautifier/js-beautify/issues/629))\n* CSS: Updating the documentation for the 'newline\\_between\\_rules' ([#615](https://github.com/beautifier/js-beautify/pull/615))\n* Equal Sign Removed from Filter Properties Alpha Opacity Assignment ([#599](https://github.com/beautifier/js-beautify/issues/599))\n* Keep trailing spaces on comments ([#598](https://github.com/beautifier/js-beautify/issues/598))\n* only print the file names of changed files ([#597](https://github.com/beautifier/js-beautify/issues/597))\n*  CSS: support add newline between rules ([#574](https://github.com/beautifier/js-beautify/pull/574))\n* elem[array]++ changes to elem[array] ++ inserting unnecessary gap ([#570](https://github.com/beautifier/js-beautify/issues/570))\n* add support to less functions paramters braces ([#568](https://github.com/beautifier/js-beautify/pull/568))\n* selector\\_separator\\_newline: true for Sass doesn't work ([#563](https://github.com/beautifier/js-beautify/issues/563))\n* yield statements are being beautified to their own newlines since 1.5.2 ([#560](https://github.com/beautifier/js-beautify/issues/560))\n* HTML beautifier inserts extra newline into `<li>`s ending with `<code>` ([#524](https://github.com/beautifier/js-beautify/issues/524))\n* Add wrap\\_attributes option ([#476](https://github.com/beautifier/js-beautify/issues/476))\n* Add or preserve empty line between CSS rules ([#467](https://github.com/beautifier/js-beautify/issues/467))\n* Support comma first style of variable declaration ([#245](https://github.com/beautifier/js-beautify/issues/245))\n\n## v1.5.4\n* TypeScript oddly formatted with 1.5.3 ([#552](https://github.com/beautifier/js-beautify/issues/552))\n* HTML beautifier inserts double spaces between adjacent tags ([#525](https://github.com/beautifier/js-beautify/issues/525))\n* Keep space in font rule ([#491](https://github.com/beautifier/js-beautify/issues/491))\n* [Brackets plug in] Space after </a> disappears ([#454](https://github.com/beautifier/js-beautify/issues/454))\n* Support nested pseudo-classes and parent reference (LESS) ([#427](https://github.com/beautifier/js-beautify/pull/427))\n* Alternate approach: preserve single spacing and treat img as inline element ([#415](https://github.com/beautifier/js-beautify/pull/415))\n\n## v1.5.3\n* [TypeError: Cannot read property 'type' of undefined] ([#548](https://github.com/beautifier/js-beautify/issues/548))\n* Bug with RegExp ([#547](https://github.com/beautifier/js-beautify/issues/547))\n* Odd behaviour on less ([#520](https://github.com/beautifier/js-beautify/issues/520))\n* css beauitify ([#506](https://github.com/beautifier/js-beautify/issues/506))\n* Extra space after scss pseudo classes. ([#500](https://github.com/beautifier/js-beautify/issues/500))\n* Generates invalid scss when formatting ampersand selectors ([#498](https://github.com/beautifier/js-beautify/issues/498))\n* bad formatting of .less files using @variable or &:hover syntax ([#489](https://github.com/beautifier/js-beautify/issues/489))\n* Incorrect beautifying of CSS comment including an url. ([#466](https://github.com/beautifier/js-beautify/issues/466))\n* Handle SASS parent reference &: ([#414](https://github.com/beautifier/js-beautify/issues/414))\n* Js-beautify breaking selectors in less code.  ([#410](https://github.com/beautifier/js-beautify/issues/410))\n* Problem with \"content\" ([#364](https://github.com/beautifier/js-beautify/issues/364))\n* Space gets inserted between function and paren for function in Define  ([#313](https://github.com/beautifier/js-beautify/issues/313))\n* beautify-html returns null on broken html ([#301](https://github.com/beautifier/js-beautify/issues/301))\n* Indentation of functions inside conditionals not passing jslint ([#298](https://github.com/beautifier/js-beautify/issues/298))\n\n## v1.5.2\n* Allow custom elements to be unformatted ([#540](https://github.com/beautifier/js-beautify/pull/540))\n* Need option to ignore brace style ([#538](https://github.com/beautifier/js-beautify/issues/538))\n* Refactor to Output and OutputLine classes ([#536](https://github.com/beautifier/js-beautify/pull/536))\n* Recognize ObjectLiteral on open brace ([#535](https://github.com/beautifier/js-beautify/pull/535))\n* Refactor to fully tokenize before formatting ([#530](https://github.com/beautifier/js-beautify/pull/530))\n* Cleanup checked in six.py file ([#527](https://github.com/beautifier/js-beautify/pull/527))\n* Changelog.md? ([#526](https://github.com/beautifier/js-beautify/issues/526))\n* New line added between each css declaration ([#523](https://github.com/beautifier/js-beautify/issues/523))\n* Kendo Template scripts get messed up! ([#516](https://github.com/beautifier/js-beautify/issues/516))\n* SyntaxError: Unexpected token ++ ([#514](https://github.com/beautifier/js-beautify/issues/514))\n* space appears before open square bracket when the object name is \"set\" ([#508](https://github.com/beautifier/js-beautify/issues/508))\n* Unclosed string problem ([#505](https://github.com/beautifier/js-beautify/issues/505))\n* \"--n\" and \"++n\" are not indented like \"n--\" and \"n++\" are... ([#495](https://github.com/beautifier/js-beautify/issues/495))\n* Allow `<style>` and `<script>` tags to be unformatted ([#494](https://github.com/beautifier/js-beautify/pull/494))\n* Preserve new line at end of file ([#492](https://github.com/beautifier/js-beautify/issues/492))\n* Line wraps breaking numbers (causes syntax error) ([#488](https://github.com/beautifier/js-beautify/issues/488))\n* jsBeautify acts differently when handling different kinds of function expressions ([#485](https://github.com/beautifier/js-beautify/issues/485))\n* AttributeError: 'NoneType' object has no attribute 'groups' ([#479](https://github.com/beautifier/js-beautify/issues/479))\n* installation doco for python need update -- pip install six? ([#478](https://github.com/beautifier/js-beautify/issues/478))\n* Move einars/js-beautify to beautify-web/js-beautify ([#475](https://github.com/beautifier/js-beautify/issues/475))\n* Bring back space\\_after\\_anon\\_function ([#474](https://github.com/beautifier/js-beautify/pull/474))\n* fix for #453, Incompatible handlebar syntax ([#468](https://github.com/beautifier/js-beautify/pull/468))\n* Python: missing explicit dependency on \"six\" package ([#465](https://github.com/beautifier/js-beautify/issues/465))\n* function declaration inside array, adds extra line.  ([#464](https://github.com/beautifier/js-beautify/issues/464))\n* [es6] yield a array ([#458](https://github.com/beautifier/js-beautify/issues/458))\n* Publish v1.5.2 ([#452](https://github.com/beautifier/js-beautify/issues/452))\n* Port css colon character fix to python  ([#446](https://github.com/beautifier/js-beautify/issues/446))\n* Cannot declare object literal properties with unquoted reserved words ([#440](https://github.com/beautifier/js-beautify/issues/440))\n* Do not put a space within `function*` generator functions. ([#428](https://github.com/beautifier/js-beautify/issues/428))\n* beautification of \"nth-child\" css fails csslint ([#418](https://github.com/beautifier/js-beautify/issues/418))\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment include:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at team@beautifier.io. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n\n## Report Issues and Request Changes\nIf you find a bug, please report it, including environment and examples of current behavior and what you believe to be the correct behavior.  The clearer your description and information, the more likely it is someone will be able to make progress on it.  The default issue template will help guide you through this.\n\n## How to Make Changes (Implement Fixes and New Features)\nFixes and enhancements are totally welcome.  We prefer you to file an issue before filing a PR, as this gives us chance to discuss design details, but feel free to dive right in.\n\n### 0. Prerequisites for development\n\n* bash\n* make\n* nodejs - v16.x or greater (with npm)\n* python - v3.7 or greater (with pip)\n\nIf you encounter issues and cannot build, come chat on gitter.im.  We're happy to help.\n\n### 1. Build and Test Locally\nThis repository holds two mostly identical implementations of the beautifiers: a JavaScript implementation and a Python implementation.\nWhile developing, you may locally build and test the JavaScript or Python (or both). The HTML beautifier is only implemented in JavaScript.\n\n* Familiarize yourself with the folder structure and code style before you dive in.\n* Make changes to the implementation of your choice.\n* If working in the JavaScript implementation:\n  * Run `make js` to build and run unit tests\n  * Run `make serve` to manually test changes locally at `http://localhost:8080`\n  * To load a debug (human readable) version of the beautifier source, open `http://localhost:8080/?debug`\n* If working in the Python implementation:\n  * Run `make py` to build and run unit tests \n* Add tests to `/test/data/*/test.js`.\n* Run `make jstest` or `make pytest` to run style checks, and to generate and run tests.\n* Include all changed files in your commit - The generated test files are checked in along with changes to the test data files.\n\n### 2. Ensure Feature Parity\nAny changes made to one implementation must be also made to the other implementation.  **This is required**.  Every time we make an exception to this requirement the project becomes harder to maintain.  This will become painfully clear, should you find yourself unable to port changes from one implementation to the other due to implementations being out of sync. We made this a requirement several years ago and there are **still** open issues for changes that people promised to port \"in the next week or two\".  The entire HTML beautifier is an example of this. :(\n\nThe implementations are already very similar and neither Python nor JavaScript are that hard to understand.  Take the plunge, it is easier than you think.  If you get stuck, go ahead and file a Pull Request and we can discuss how to move forward.\n\n* Run `make` (with no parameters) to run style checks, and to generate and run tests on both implementations.\n* Include all changed files in your commit - The generated test files are checked in along with changes to the test data files.\n\n### 3. Update Documentation and Tools\nUpdate documentation as needed.  This includes files such as the README.md, internal command-line help, and file comments.\nAlso, check if your change needs any tooling updates.  For example, the CDN URLs required additional scripting to update automatically for new releases.\n\n### 4. Submit a Pull Request\n\n* Run `make ci` locally after commit but before creation of Pull Request.  You may start a Pull Request even if this reports errors, but the PR will not be merged until all errors are fixed.\n* Include description of changes. Include examples of input and expected output if possible.\n* Pull requests must pass build checks on all platforms before being merged. We use Travis CI and AppVeyor to run tests on Linux and Windows across multiple versions of Node.js and Python.\n\n\n# Folders\n\n## Root\nSome files related to specific implementations or platforms are found in the root folder, but most are cross-project tools and configuration.\n\n## `js`\nFiles related to the JavaScript implementations of the beautifiers.\n\n## `python`\nFiles related to the Python implementations of the beautifiers.\n\n## `web`\nFiles related to https://beautifier.io/.\n\n## `test`\nTest data files and support files used to generate implementation-specific test files.\n\n\n# Branches and Tags\n\n## Main\nWe use the `main` branch as the primary development branch.\n\n## Release\nWe use the `release` branch to hold releases, including built files for bower and the website.\n\n# Tags\nEach release is has a tag created for it in the `release` branch when it is published.  The latest release is linked from the `README.md`.\n\n## Attic\nThis project has been around for a while.  While some parts have improved significantly over time, others fell\ninto disrepair and were mothballed. All branches named `attic-*` are significantly out of date and kept for reference purposes only.\n\n### PHP\n`attic-php` contains a PHP implementation of the beautifier.\nIf you're interested in using it feel free.\nIf you plan to enhance it, please consider joining this project, and updating this version to match current functionality.\n\n### Other Languages\nVersions of the beautifier adapted to other languages are available on branch `attic-other`.\nTake a look and feel free to resurrect them, but know it's pretty dusty back there.\n\n### Generic Eval Unpacker\nThe `attic-genericeval` branch includes an unpacker that calls `eval` on whatever source is passed to it.\nThis file may be useful when working with source that unpacks itself when `eval` is called on it, but is also very unsafe.\nWe have isolated it on this separate branch to keep it from hurting the other children.\n\n# How to publish a new version\n\nNOTE: Before you publish a release make sure the latest changes have passed the Travis CI build!\n\n## Setup\n\n### Python\n\n1. A PyPI user account from https://pypi.python.org/pypi?%3Aaction=register_form.\n2. Permissions to the jsbeautifier package.  File an issue here on GitHub and the appropriate person will help you.\n\n### Node\n\n1. An npmjs.org user account from https://npmjs.org/signup.\n2. Permissions to the js-beautify module on npmjs.org.  File an issue here on GitHub and the appropriate person will help you.\n\n## Publish to Production\nTo publish a release:\n* Close the Milestone for this release on github\n* Run `./tools/release-all.sh <version>`.\n\nThis is script will:\n\n* Update README.md with correct cdn links\n* Update CHANGLOG.md with the milestone description and a list of closed issues\n* Commit the built files to the `release` branch\n* Publish the python version to PyPI\n* Publish the javascript version to npm\n* Merge the changes and publish them on the gh-pages branch\n\nNOTE: We keep Python and Node version numbers synchronized,\nso if you publish a Python release, you publish a Node release as well.\n\n## Publish to Beta Channel\n\nTo publish a Beta or RC (Release Candidate), add `-beta1` or `-rc1` to the end of the version, incrementing the number on the end as needed.\n\n\n\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "PROJECT_ROOT=$(subst \\,/,$(dir $(realpath $(firstword $(MAKEFILE_LIST)))))\nBUILD_DIR=$(PROJECT_ROOT)build\nSCRIPT_DIR=$(PROJECT_ROOT)tools\nSHELL=/bin/bash\nPYTHON=$(SCRIPT_DIR)/python\nNODE=$(SCRIPT_DIR)/node\nNPM=$(SCRIPT_DIR)/npm\n\nall: depends generate-tests js beautify py package jstest pytest perf\n\nhelp:\n\t@echo \"make <action>\"\n\t@echo \"    all       - build both implementations\"\n\t@echo \"    serve    - serve site locally from localhost:8080\"\n\t@echo \"    js        - build javascript\"\n\t@echo \"    py        - build python\"\n\t@echo \"    alltest   - test both implementations, js and python\"\n\t@echo \"    pytest    - test python implementation\"\n\t@echo \"    jstest    - test javascript implementation\"\n\nci: all git-status-clear\n\nserve: js/lib/*.js\n\t@./node_modules/.bin/serve\n\njs: generate-tests js/lib/*.js\n\t@echo Testing node beautify functionality...\n\t./node_modules/.bin/mocha --recursive js/test && \\\n\t\t./js/test/node-src-index-tests.js\n\npy: generate-tests $(BUILD_DIR)/python\n\t@echo Testing python beautify functionality...\n\t$(SCRIPT_DIR)/python-dev3 black --config=python/pyproject.toml python\n\t$(SCRIPT_DIR)/python-dev python python/js-beautify-test.py || exit 1\n\njstest: depends js build/*.tgz\n\t@echo Testing javascript implementation...\n\t@$(NODE) js/test/node-beautify-tests.js || exit 1\n\t@$(NODE) js/test/amd-beautify-tests.js || exit 1\n\t@$(NODE) --version && \\\n\t\t./js/test/shell-test.sh\n\npytest: depends py python/dist/*\n\t@echo Testing python implementation...\n\t@cd python && \\\n\t\t$(PYTHON) --version && \\\n\t\t./jsbeautifier/tests/shell-test.sh\n\nalltest: jstest pytest\n\npackage: js py build/*.tgz python/dist/*\n\n\nperf:\n\t@echo ----------------------------------------\n\t@echo Testing node js beautify performance...\n\t$(NODE) js/test/node-beautify-perf-tests.js || exit 1\n\t@echo Testing node css beautify performance...\n\t$(NODE) js/test/node-beautify-css-perf-tests.js || exit 1\n\t@echo Testing html-beautify performance...\n\t$(NODE) js/test/node-beautify-html-perf-tests.js || exit 1\n\t@echo Testing python js beautify performance...\n\t$(SCRIPT_DIR)/python-dev python python/test-perf-jsbeautifier.py || exit 1\n\t@echo Testing python css beautify performance...\n\t$(SCRIPT_DIR)/python-dev python python/test-perf-cssbeautifier.py || exit 1\n\t@echo ----------------------------------------\n\ngenerate-tests: $(BUILD_DIR)/generate\n\nbeautify:\n\t$(SCRIPT_DIR)/build.sh beautify\n\n# Build\n#######################################################\n\n# javascript bundle generation\njs/lib/*.js: $(BUILD_DIR)/node $(BUILD_DIR)/generate $(wildcard js/src/*) $(wildcard js/src/**/*) $(wildcard web/*.js) js/index.js tools/template/* webpack.config.js\n\t$(SCRIPT_DIR)/build.sh js\n\n\n# python package generation\npython/dist/*: $(BUILD_DIR)/python $(BUILD_DIR)/generate $(wildcard python/**/*.py) python/jsbeautifier/* python/cssbeautifier/*\n\t@echo Building python package...\n\t@rm -f python/dist/*\n\t@cd python && \\\n\t\tcp setup-css.py setup.py && \\\n\t\t$(PYTHON) setup.py sdist && \\\n\t\trm setup.py\n\t@cd python && \\\n\t\tcp setup-js.py setup.py && \\\n\t\t$(PYTHON) setup.py sdist && \\\n\t\trm setup.py\n\t# Order matters here! Install css then js to make sure the local dist version of js is used\n\t$(SCRIPT_DIR)/python-rel pip install -U python/dist/cssbeautifier*\n\t$(SCRIPT_DIR)/python-rel pip install -U python/dist/jsbeautifier*\n\n# python package generation\nbuild/*.tgz: js/lib/*.js\n\t@echo Building node package...\n\tmkdir -p build/node_modules\n\trm -f build/*.tgz\n\trm -rf node_modules/js-beautify\n\t$(NPM) pack && mv *.tgz build/\n\tcd build && \\\n\t\t$(NPM) install ./*.tgz\n\n# Test generation\n$(BUILD_DIR)/generate: $(BUILD_DIR)/node test/generate-tests.js $(wildcard test/data/**/*)\n\t@echo Generating tests...\n\t$(NODE) test/generate-tests.js\n\t@touch $(BUILD_DIR)/generate\n\n\n# Handling dependencies\n#######################################################\ndepends: $(BUILD_DIR)/node $(BUILD_DIR)/python\n\t@$(NODE) --version\n\t@$(PYTHON) --version\n\n# update dependencies information\nupdate: depends\n\t@rm package-lock.json\n\t$(NPM) update --save\n\n# when we pull dependencies also pull docker image\n# without this images can get stale and out of sync from CI system\n$(BUILD_DIR)/node: package.json package-lock.json | $(BUILD_DIR)\n\t@$(NODE) --version\n\t$(NPM) --version\n\t$(NPM) install \n\t@touch $(BUILD_DIR)/node\n\n$(BUILD_DIR)/python: $(BUILD_DIR)/generate python/setup-js.py python/setup-css.py | $(BUILD_DIR) $(BUILD_DIR)/virtualenv\n\t@$(PYTHON) --version\n\t# Order matters here! Install css then js to make sure the local dist version of js is used\n\t@cp ./python/setup-css.py ./python/setup.py\n\t$(SCRIPT_DIR)/python-dev pip install -e ./python\n\t@cp ./python/setup-js.py ./python/setup.py\n\t$(SCRIPT_DIR)/python-dev pip install -e ./python\n\t@rm ./python/setup.py\n\t@touch $(BUILD_DIR)/python\n\n$(BUILD_DIR)/virtualenv: | $(BUILD_DIR)\n\tvirtualenv --version || pip install virtualenv\n\tvirtualenv build/python-dev\n\tvirtualenv build/python-rel\n\t$(SCRIPT_DIR)/python-dev python -m pip install --upgrade pip || exit 0\n\t$(SCRIPT_DIR)/python-rel python -m pip install --upgrade pip || exit 0\n\t$(SCRIPT_DIR)/python-dev3 pip install black\n\t@touch $(BUILD_DIR)/virtualenv\n\n\n\n# Miscellaneous tasks\n#######################################################\n$(BUILD_DIR):\n\tmkdir -p $(BUILD_DIR)\n\ngit-status-clear:\n\t$(SCRIPT_DIR)/git-status-clear.sh\n\nclean:\n\tgit clean -xfd\n#######################################################\n\n.PHONY: all beautify clean depends generate-tests git-status-clear help serve update\n\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"><img src=\"https://raw.githubusercontent.com/beautifier/js-beautify/7db71fc/web/wordmark-light.svg\" height=\"200px\" align=\"center\" alt=\"JS Beautifier\"/></p>\n\n<p align=\"center\"><a href=\"https://github.com/beautifier/js-beautify/actions/workflows/main.yml\"><img alt=\"CI\" src=\"https://github.com/beautifier/js-beautify/workflows/CI/badge.svg\"/></a>&#32;<a href=\"https://greenkeeper.io/\" target=\"_blank\"><img alt=\"Greenkeeper badge\" src=\"https://badges.greenkeeper.io/beautifier/js-beautify.svg\"/></a></p>\n\n<p align=\"center\"><a href=\"https://pypi.python.org/pypi/jsbeautifier\" target=\"_blank\"><img alt=\"PyPI version\" src=\"https://img.shields.io/pypi/v/jsbeautifier.svg\"/></a>&#32;<a href=\"https://cdnjs.com/libraries/js-beautify\" target=\"_blank\"><img alt=\"CDNJS version\" src=\"https://img.shields.io/cdnjs/v/js-beautify.svg\"/></a>&#32;<a href=\"https://www.npmjs.com/package/js-beautify\" target=\"_blank\"><img alt=\"NPM @latest\" src=\"https://img.shields.io/npm/v/js-beautify.svg\"/></a>&#32;<a href=\"https://www.npmjs.com/package/js-beautify?activeTab=versions\" target=\"_blank\"><img alt=\"NPM @next\" src=\"https://img.shields.io/npm/v/js-beautify/next.svg\"/></a></p>\n\n<p align=\"center\"><a href=\"https://gitter.im/beautifier/js-beautify?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\" target=\"_blank\"><img alt=\"Join the chat at https://gitter.im/beautifier/js-beautify\" src=\"https://badges.gitter.im/Join%20Chat.svg\"></a>&#32;<a href=\"https://twitter.com/intent/user?screen_name=js_beautifier\" target=\"_blank\"><img alt=\"Twitter Follow\" src=\"https://img.shields.io/twitter/follow/js_beautifier.svg?style=social&label=Follow\"/></a></p>\n\n<p align=\"center\"><a href=\"https://www.npmjs.org/package/js-beautify\" target=\"_blank\"><img alt=\"NPM stats\" src=https://nodei.co/npm/js-beautify.svg?downloadRank=true&downloads=true\"/></a></p>\n\nThis little beautifier will reformat and re-indent bookmarklets, ugly\nJavaScript, unpack scripts packed by Dean Edward’s popular packer,\nas well as partly deobfuscate scripts processed by the npm package\n[javascript-obfuscator](https://github.com/javascript-obfuscator/javascript-obfuscator).\n\nOpen [beautifier.io](https://beautifier.io/) to try it out.  Options are available via the UI.\n\n\n# Contributors Needed\nI'm putting this front and center above because existing owners have very limited time to work on this project currently.\nThis is a popular project and widely used but it desperately needs contributors who have time to commit to fixing both\ncustomer facing bugs and underlying problems with the internal design and implementation.\n\nIf you are interested, please take a look at the [CONTRIBUTING.md](https://github.com/beautifier/js-beautify/blob/main/CONTRIBUTING.md) then fix an issue marked with the [\"Good first issue\"](https://github.com/beautifier/js-beautify/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) label and submit a PR. Repeat as often as possible.  Thanks!\n\n\n# Installation\n\nYou can install the beautifier for Node.js or Python.\n\n## Node.js JavaScript\n\nYou may install the NPM package `js-beautify`. When installed globally, it provides an executable `js-beautify` script. As with the Python script, the beautified result is sent to `stdout` unless otherwise configured.\n\n```bash\n$ npm -g install js-beautify\n$ js-beautify foo.js\n```\n\nYou can also use `js-beautify` as a `node` library (install locally, the `npm` default):\n\n```bash\n$ npm install js-beautify\n```\n\n## Node.js JavaScript (vNext)\n\nThe above install the latest stable release. To install beta or RC versions:\n\n```bash\n$ npm install js-beautify@next\n```\n\n## Web Library\nThe beautifier can be added on your page as web library.\n\nJS Beautifier is hosted on two CDN services: [cdnjs](https://cdnjs.com/libraries/js-beautify) and rawgit.\n\nTo pull the latest version from one of these services include one set of the script tags below in your document:\n```html\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify-css.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify-html.js\"></script>\n\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify-css.min.js\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify-html.min.js\"></script>\n```\n\nExample usage of a JS tag in html:\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n  <body>\n\n. . .\n\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-beautify/1.15.4/beautify.min.js\"></script>\n    <script src=\"script.js\"></script>\n  </body>\n</html>\n```\nOlder versions are available by changing the version number.\n\nDisclaimer: These are free services, so there are [no uptime or support guarantees](https://github.com/rgrove/rawgit/wiki/Frequently-Asked-Questions#i-need-guaranteed-100-uptime-should-i-use-cdnrawgitcom).\n\n\n## Python\nTo install the Python version of the beautifier:\n\n```bash\n$ pip install jsbeautifier\n```\nUnlike the JavaScript version, the Python version can only reformat JavaScript. It does not work against HTML or CSS files, but you can install _css-beautify_ for CSS:\n\n```bash\n$ pip install cssbeautifier\n```\n\n# Usage\nYou can beautify JavaScript using JS Beautifier in your web browser, or on the command-line using Node.js or Python.\n\n## Web Browser\nOpen [beautifier.io](https://beautifier.io/).  Options are available via the UI.\n\n## Web Library\nAfter you embed the `<script>` tags in your `html` file, they expose three functions: `js_beautify`, `css_beautify`, and `html_beautify` \n\nExample usage of beautifying a json string:\n\n```js\nconst options = { indent_size: 2, space_in_empty_paren: true }\n\nconst dataObj = {completed: false,id: 1,title: \"delectus aut autem\",userId: 1,}\n\nconst dataJson = JSON.stringify(dataObj)\n\njs_beautify(dataJson, options)\n\n/* OUTPUT\n{\n  \"completed\": false,\n  \"id\": 1,\n  \"title\": \"delectus aut autem\",\n  \"userId\": 1,\n}\n*/\n```\n\n## Node.js JavaScript\n\nWhen installed globally, the beautifier provides an executable `js-beautify` script. The beautified result is sent to `stdout` unless otherwise configured.\n\n```bash\n$ js-beautify foo.js\n```\n\nTo use `js-beautify` as a `node` library (after install locally), import and call the appropriate beautifier method for JavaScript (JS), CSS, or HTML.  All three method signatures are `beautify(code, options)`. `code` is the string of code to be beautified. options is an object with the settings you would like used to beautify the code.\n\nThe configuration option names are the same as the CLI names but with underscores instead of dashes.  For example, `--indent-size 2 --space-in-empty-paren` would be `{ indent_size: 2, space_in_empty_paren: true }`.\n\n```js\nvar beautify = require('js-beautify/js').js,\n    fs = require('fs');\n\nfs.readFile('foo.js', 'utf8', function (err, data) {\n    if (err) {\n        throw err;\n    }\n    console.log(beautify(data, { indent_size: 2, space_in_empty_paren: true }));\n});\n```\n\nIf you are using ESM Imports, you can import `js-beautify` like this:\n\n```js\n// 'beautify' can be any name here.\nimport beautify from 'js-beautify';\n\nbeautify.js(data, options);\nbeautify.html(data, options);\nbeautify.css(data, options);\n```\n\n## Python\nAfter installing, to beautify using Python:\n\n```bash\n$ js-beautify file.js\n```\n\nBeautified output goes to `stdout` by default.\n\nTo use `jsbeautifier` as a library is simple:\n\n```python\nimport jsbeautifier\nres = jsbeautifier.beautify('your JavaScript string')\nres = jsbeautifier.beautify_file('some_file.js')\n```\n\n...or, to specify some options:\n\n```python\nopts = jsbeautifier.default_options()\nopts.indent_size = 2\nopts.space_in_empty_paren = True\nres = jsbeautifier.beautify('some JavaScript', opts)\n```\n\nThe configuration option names are the same as the CLI names but with underscores instead of dashes.  The example above would be set on the command-line as `--indent-size 2 --space-in-empty-paren`.\n\n\n# Options\n\nThese are the command-line flags for both Python and JS scripts:\n\n```text\nCLI Options:\n  -f, --file       Input file(s) (Pass '-' for stdin)\n  -r, --replace    Write output in-place, replacing input\n  -o, --outfile    Write output to file (default stdout)\n  --config         Path to config file\n  --type           [js|css|html] [\"js\"] Select beautifier type (NOTE: Does *not* filter files, only defines which beautifier type to run)\n  -q, --quiet      Suppress logging to stdout\n  -h, --help       Show this help\n  -v, --version    Show the version\n\nBeautifier Options:\n  -s, --indent-size                 Indentation size [4]\n  -c, --indent-char                 Indentation character [\" \"]\n  -t, --indent-with-tabs            Indent with tabs, overrides -s and -c\n  -e, --eol                         Character(s) to use as line terminators.\n                                    [first newline in file, otherwise \"\\n]\n  -n, --end-with-newline            End output with newline\n  --editorconfig                    Use EditorConfig to set up the options\n  -l, --indent-level                Initial indentation level [0]\n  -p, --preserve-newlines           Preserve line-breaks (--no-preserve-newlines disables)\n  -m, --max-preserve-newlines       Number of line-breaks to be preserved in one chunk [10]\n  -P, --space-in-paren              Add padding spaces within paren, ie. f( a, b )\n  -E, --space-in-empty-paren        Add a single space inside empty paren, ie. f( )\n  -j, --jslint-happy                Enable jslint-stricter mode\n  -a, --space-after-anon-function   Add a space before an anonymous function's parens, ie. function ()\n  --space-after-named-function      Add a space before a named function's parens, i.e. function example ()\n  -b, --brace-style                 [collapse|expand|end-expand|none][,preserve-inline] [collapse,preserve-inline]\n  -u, --unindent-chained-methods    Don't indent chained method calls\n  -B, --break-chained-methods       Break chained method calls across subsequent lines\n  -k, --keep-array-indentation      Preserve array indentation\n  -x, --unescape-strings            Decode printable characters encoded in xNN notation\n  -w, --wrap-line-length            Wrap lines that exceed N characters [0]\n  -X, --e4x                         Pass E4X xml literals through untouched\n  --good-stuff                      Warm the cockles of Crockford's heart\n  -C, --comma-first                 Put commas at the beginning of new line instead of end\n  -O, --operator-position           Set operator position (before-newline|after-newline|preserve-newline) [before-newline]\n  --indent-empty-lines              Keep indentation on empty lines\n  --templating                      List of templating languages (auto,django,erb,handlebars,php,smarty,angular) [\"auto\"] auto = none in JavaScript, all in HTML\n```\n\nWhich correspond to the underscored option keys for both library interfaces\n\n**defaults per CLI options**\n```json\n{\n    \"indent_size\": 4,\n    \"indent_char\": \" \",\n    \"indent_with_tabs\": false,\n    \"editorconfig\": false,\n    \"eol\": \"\\n\",\n    \"end_with_newline\": false,\n    \"indent_level\": 0,\n    \"preserve_newlines\": true,\n    \"max_preserve_newlines\": 10,\n    \"space_in_paren\": false,\n    \"space_in_empty_paren\": false,\n    \"jslint_happy\": false,\n    \"space_after_anon_function\": false,\n    \"space_after_named_function\": false,\n    \"brace_style\": \"collapse\",\n    \"unindent_chained_methods\": false,\n    \"break_chained_methods\": false,\n    \"keep_array_indentation\": false,\n    \"unescape_strings\": false,\n    \"wrap_line_length\": 0,\n    \"e4x\": false,\n    \"comma_first\": false,\n    \"operator_position\": \"before-newline\",\n    \"indent_empty_lines\": false,\n    \"templating\": [\"auto\"]\n}\n```\n\n**defaults not exposed in the cli**\n```json\n{\n  \"eval_code\": false,\n  \"space_before_conditional\": true\n}\n```\n\nNotice not all defaults are exposed via the CLI.  Historically, the Python and\nJS APIs have not been 100% identical. There are still a\nfew other additional cases keeping us from 100% API-compatibility.\n\n\n## Loading settings from environment or .jsbeautifyrc (JavaScript-Only)\n\nIn addition to CLI arguments, you may pass config to the JS executable via:\n\n * any `jsbeautify_`-prefixed environment variables\n * a `JSON`-formatted file indicated by the `--config` parameter\n * a `.jsbeautifyrc` file containing `JSON` data at any level of the filesystem above `$PWD`\n\nConfiguration sources provided earlier in this stack will override later ones.\n\n## Setting inheritance and Language-specific overrides\n\nThe settings are a shallow tree whose values are inherited for all languages, but\ncan be overridden.  This works for settings passed directly to the API in either implementation.\nIn the JavaScript implementation, settings loaded from a config file, such as .jsbeautifyrc, can also use inheritance/overriding.\n\nBelow is an example configuration tree showing all the supported locations\nfor language override nodes.  We'll use `indent_size` to discuss how this configuration would behave, but any number of settings can be inherited or overridden:\n\n```json\n{\n    \"indent_size\": 4,\n    \"html\": {\n        \"end_with_newline\": true,\n        \"js\": {\n            \"indent_size\": 2\n        },\n        \"css\": {\n            \"indent_size\": 2\n        }\n    },\n    \"css\": {\n        \"indent_size\": 1\n    },\n    \"js\": {\n       \"preserve-newlines\": true\n    }\n}\n```\n\nUsing the above example would have the following result:\n\n* HTML files\n  * Inherit `indent_size` of 4 spaces from the top-level setting.\n  * The files would also end with a newline.\n  * JavaScript and CSS inside HTML\n    * Inherit the HTML `end_with_newline` setting.\n    * Override their indentation to 2 spaces.\n* CSS files\n  * Override the top-level setting to an `indent_size` of 1 space.\n* JavaScript files\n  * Inherit `indent_size` of 4 spaces from the top-level setting.\n  * Set `preserve-newlines` to `true`.\n\n## CSS & HTML\n\nIn addition to the `js-beautify` executable, `css-beautify` and `html-beautify`\nare also provided as an easy interface into those scripts. Alternatively,\n`js-beautify --css` or `js-beautify --html` will accomplish the same thing, respectively.\n\n```js\n// Programmatic access\nvar beautify_js = require('js-beautify'); // also available under \"js\" export\nvar beautify_css = require('js-beautify').css;\nvar beautify_html = require('js-beautify').html;\n\n// All methods accept two arguments, the string to be beautified, and an options object.\n```\n\nThe CSS & HTML beautifiers are much simpler in scope, and possess far fewer options.\n\n```text\nCSS Beautifier Options:\n  -s, --indent-size                  Indentation size [4]\n  -c, --indent-char                  Indentation character [\" \"]\n  -t, --indent-with-tabs             Indent with tabs, overrides -s and -c\n  -e, --eol                          Character(s) to use as line terminators. (default newline - \"\\\\n\")\n  -n, --end-with-newline             End output with newline\n  -b, --brace-style                  [collapse|expand] [\"collapse\"]\n  -L, --selector-separator-newline   Add a newline between multiple selectors\n  -N, --newline-between-rules        Add a newline between CSS rules\n  --indent-empty-lines               Keep indentation on empty lines\n\nHTML Beautifier Options:\n  -s, --indent-size                  Indentation size [4]\n  -c, --indent-char                  Indentation character [\" \"]\n  -t, --indent-with-tabs             Indent with tabs, overrides -s and -c\n  -e, --eol                          Character(s) to use as line terminators. (default newline - \"\\\\n\")\n  -n, --end-with-newline             End output with newline\n  -p, --preserve-newlines            Preserve existing line-breaks (--no-preserve-newlines disables)\n  -m, --max-preserve-newlines        Maximum number of line-breaks to be preserved in one chunk [10]\n  -I, --indent-inner-html            Indent <head> and <body> sections. Default is false.\n  -b, --brace-style                  [collapse-preserve-inline|collapse|expand|end-expand|none] [\"collapse\"]\n  -S, --indent-scripts               [keep|separate|normal] [\"normal\"]\n  -w, --wrap-line-length             Maximum characters per line (0 disables) [250]\n  -A, --wrap-attributes              Wrap attributes to new lines [auto|force|force-aligned|force-expand-multiline|aligned-multiple|preserve|preserve-aligned] [\"auto\"]\n  -M, --wrap-attributes-min-attrs    Minimum number of html tag attributes for force wrap attribute options [2]\n  -i, --wrap-attributes-indent-size  Indent wrapped attributes to after N characters [indent-size] (ignored if wrap-attributes is \"aligned\")\n  -d, --inline                       List of tags to be considered inline tags\n  --inline_custom_elements           Inline custom elements [true]\n  -U, --unformatted                  List of tags (defaults to inline) that should not be reformatted\n  -T, --content_unformatted          List of tags (defaults to pre) whose content should not be reformatted\n  -E, --extra_liners                 List of tags (defaults to [head,body,/html] that should have an extra newline before them.\n  --editorconfig                     Use EditorConfig to set up the options\n  --indent_scripts                   Sets indent level inside script tags (\"normal\", \"keep\", \"separate\")\n  --unformatted_content_delimiter    Keep text content together between this string [\"\"]\n  --indent-empty-lines               Keep indentation on empty lines\n  --templating                       List of templating languages (auto,none,django,erb,handlebars,php,smarty,angular) [\"auto\"] auto = none in JavaScript, all in html\n```\n\n## Directives\n\nDirectives let you control the behavior of the Beautifier from within your source files. Directives are placed in comments inside the file.  Directives are in the format `/* beautify {name}:{value} */` in CSS and JavaScript. In HTML they are formatted as `<!-- beautify {name}:{value} -->`.\n\n### Ignore directive\n\nThe `ignore` directive makes the beautifier completely ignore part of a file, treating it as literal text that is not parsed.\nThe input below will remain unchanged after beautification:\n\n```js\n// Use ignore when the content is not parsable in the current language, JavaScript in this case.\nvar a =  1;\n/* beautify ignore:start */\n {This is some strange{template language{using open-braces?\n/* beautify ignore:end */\n```\n\n### Preserve directive\n\nNOTE: this directive only works in HTML and JavaScript, not CSS.\n\nThe `preserve` directive makes the Beautifier parse and then keep the existing formatting of a section of code.\n\nThe input below will remain unchanged after beautification:\n\n```js\n// Use preserve when the content is valid syntax in the current language, JavaScript in this case.\n// This will parse the code and preserve the existing formatting.\n/* beautify preserve:start */\n{\n    browserName: 'internet explorer',\n    platform:    'Windows 7',\n    version:     '8'\n}\n/* beautify preserve:end */\n```\n\n# License\n\nYou are free to use this in any way you want, in case you find this useful or working for you but you must keep the copyright notice and license. (MIT)\n\n# Credits\n\n* Created by Einar Lielmanis, <einar@beautifier.io>\n* Python version flourished by Stefano Sanfilippo <a.little.coder@gmail.com>\n* Command-line for node.js by Daniel Stockman <daniel.stockman@gmail.com>\n* Maintained and expanded by Liam Newman <bitwiseman@beautifier.io>\n\nThanks also to Jason Diamond, Patrick Hof, Nochum Sossonko, Andreas Schneider, Dave\nVasilevsky, Vital Batmanov, Ron Baldwin, Gabriel Harrison, Chris J. Shull,\nMathias Bynens, Vittorio Gambaletta and others.\n\n(README.md: js-beautify@1.15.4)\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"js-beautify\",\n  \"main\": [\n    \"./js/lib/beautify.js\",\n    \"./js/lib/beautify-css.js\",\n    \"./js/lib/beautify-html.js\"\n  ],\n  \"ignore\": [\n    \"**/.*\"\n  ]\n}\n"
  },
  {
    "path": "index.html",
    "content": "<!doctype html>\n<html lang=\"en-US\" dir=\"ltr\" prefix=\"og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#\">\n\n<head>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\" /><!-- The <meta> element must be within the first 1024 bytes of the HTML -->\n\n  <!--\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n  -->\n\n  <!-- if you feel an urge to move this to bootstrap or something, you're most welcome -->\n  <title>Online JavaScript beautifier</title>\n  <link rel=\"icon\" href=\"web/favicon.png\" type=\"image/png\">\n\n  <script src=\"https://cdnjs.cloudflare.com/polyfill/v2/polyfill.min.js?features=default&flags=gated\"></script>\n\n  <!-- Codemirror from https://cdnjs.com/libraries/codemirror -->\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css\" integrity=\"sha512-uf06llspW44/LZpHzHT6qBOIVODjWtv4MxCricRxkzvopAlSWnTf6hpZTFxuuZcuNE9CBQhqE0Seu1CoRk84nQ==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" />\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/darcula.min.css\" integrity=\"sha512-kqCOYFDdyQF4JM8RddA6rMBi9oaLdR0aEACdB95Xl1EgaBhaXMIe8T4uxmPitfq4qRmHqo+nBU2d1l+M4zUx1g==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" />\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js\" integrity=\"sha512-OeZ4Yrb/W7d2W4rAMOO0HQ9Ro/aWLtpW9BUSR2UOWnSV2hprXLkkYnnCGc9NeLUxxE4ZG7zN16UuT1Elqq8Opg==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n\n  <!-- Codemirror Modes -->\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/xml/xml.min.js\" integrity=\"sha512-LarNmzVokUmcA7aUDtqZ6oTS+YXmUKzpGdm8DxC46A6AHu+PQiYCUlwEGWidjVYMo/QXZMFMIadZtrkfApYp/g==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/javascript/javascript.min.js\" integrity=\"sha512-Cbz+kvn+l5pi5HfXsEB/FYgZVKjGIhOgYNBwj4W2IHP2y8r3AdyDCQRnEUqIQ+6aJjygKPTyaNT2eIihaykJlw==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/css/css.min.js\" integrity=\"sha512-rQImvJlBa8MV1Tl1SXR5zD2bWfmgCEIzTieFegGg89AAt7j/NBEe50M5CqYQJnRwtkjKMmuYgHBqtD1Ubbk5ww==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/htmlmixed/htmlmixed.min.js\" integrity=\"sha512-HN6cn6mIWeFJFwRN9yetDAMSh+AK9myHF1X9GlSlKmThaat65342Yw8wL7ITuaJnPioG0SYG09gy0qd5+s777w==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/search/search.min.js\" integrity=\"sha512-Mw3RqCUHTyvN3iSp5TSs731TiLqnKrxzyy2UVZv3+tJa524Rj7pBC7Ivv3ka2oDnkQwLOMHNDKU5nMJ16YRgrA==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/search/searchcursor.min.js\" integrity=\"sha512-+ZfZDC9gi1y9Xoxi9UUsSp+5k+AcFE0TRNjI0pfaAHQ7VZTaaoEpBZp9q9OvHdSomOze/7s5w27rcsYpT6xU6g==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/dialog/dialog.min.js\" integrity=\"sha512-NAJeqwfpM7/nfX90EweQhjudb66diK3Y9mkBjb4xJ6wufuVqFVAjHd8mJW//CGHNR9cI8wUfDRJ0jtLzZ9v8Qg==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n  <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/addon/dialog/dialog.min.css\" integrity=\"sha512-Vogm+Cii1SXP5oxWQyPdkA91rHB776209ZVvX4C/i4ypcfBlWVRXZGodoTDAyyZvO36JlTqDqkMhVKAYc7CMjQ==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\" />\n\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js\" integrity=\"sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/js-cookie/3.0.5/js.cookie.min.js\" integrity=\"sha512-nlp9/l96/EpjYBx7EP7pGASVXNe80hGhYAUrjeXnu/fyF5Py0/RXav4BBNs7n5Hx1WFhOEOWSAVjGeC3oKxDVQ==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n  <script src=\"https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js\" integrity=\"sha512-c3Nl8+7g4LMSTdrm621y7kf9v3SDPnhxLNhcjFJbKECVnmZHTdo+IRO05sNLTH/D3vA6u1X32ehoLC7WFVdheg==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n\n  <script src=\"js/lib/unpackers/javascriptobfuscator_unpacker.js\"></script>\n  <script src=\"js/lib/unpackers/urlencode_unpacker.js\"></script>\n  <script src=\"js/lib/unpackers/p_a_c_k_e_r_unpacker.js\"></script>\n  <script src=\"js/lib/unpackers/myobfuscate_unpacker.js\"></script>\n  <script src=\"web/common-function.js\"></script>\n\n  <link rel=\"stylesheet\" href=\"web/common-style.css\">\n</head>\n\n<body class=\"container\">\n\n  <div class=\"title\">\n    <h1 class=\"logo\">\n      <img alt=\"js-beautify\" src=\"web/banner-light.svg\" height=\"54px\" />\n      <span id=\"version-number\"></span>\n    </h1>\n    <div class=\"sub-title\">\n      <p>\n        <strong>Beautify JavaScript, JSON, React.js, HTML, CSS, SCSS, and SASS</strong>\n      </p>\n    </div>\n  </div>\n  <div class=\"options\">\n    <div id=\"theme-toggle-wrapper\">\n      <label id=\"theme-toggle-label\" for=\"theme-toggle-btn\">\n        <input type=\"checkbox\" id=\"theme-toggle-btn\" style=\"display: none\" />\n        <div id=\"theme-toggle-slider\"></div>\n      </label>\n      <span id=\"theme-text\">Enable Light Mode</span>\n    </div>\n    <select name=\"language\" id=\"language\">\n      <option value=\"css\">Beautify CSS</option>\n      <option value=\"html\">Beautify HTML</option>\n      <option value=\"js\">Beautify JavaScript</option>\n    </select>\n\n    <div class=\"buttons-box\">\n      <button class=\"submit\"><strong>Beautify Code</strong> <em>(ctrl&#8209;enter)</em></button>\n      <button class=\"control\" type=\"button\" onclick=\"copyText()\"><strong>Copy to Clipboard</strong></button>\n      <button class=\"control\" type=\"button\" onclick=\"downloadBeautifiedCode()\"><strong>Download</strong></button>\n      <button class=\"control\" type=\"button\" onclick=\"selectAll()\"><strong>Select All</strong></button>\n      <button class=\"control\" type=\"button\" onclick=\"clearAll()\"><strong>Clear</strong></button>\n      <input type=\"file\" onchange=\"changeToFileContent(this)\">\n    </div>\n\n    <div class=\"config-options\">\n      <h2>Options</h2>\n      <div id=\"options\">\n\n        <div class=\"options-select\">\n          <select name=\"tabsize\" id=\"tabsize\">\n            <option value=\"1\">Indent with a tab character</option>\n            <option value=\"2\">Indent with 2 spaces</option>\n            <option value=\"3\">Indent with 3 spaces</option>\n            <option value=\"4\">Indent with 4 spaces</option>\n            <option value=\"8\">Indent with 8 spaces</option>\n          </select>\n          <select name=\"max-preserve-newlines\" id=\"max-preserve-newlines\">\n            <option value=\"-1\">Remove all extra newlines</option>\n            <option value=\"1\">Allow 1 newline between tokens</option>\n            <option value=\"2\">Allow 2 newlines between tokens</option>\n            <option value=\"5\">Allow 5 newlines between tokens</option>\n            <option value=\"10\">Allow 10 newlines between tokens</option>\n            <option value=\"0\">Allow unlimited newlines between tokens</option>\n          </select>\n          <select name=\"wrap-line-length\" id=\"wrap-line-length\">\n            <option value=\"0\">Do not wrap lines</option>\n            <option value=\"40\">Wrap lines near 40 characters</option>\n            <option value=\"70\">Wrap lines near 70 characters</option>\n            <option value=\"80\">Wrap lines near 80 characters</option>\n            <option value=\"110\">Wrap lines near 110 characters</option>\n            <option value=\"120\">Wrap lines near 120 characters</option>\n            <option value=\"160\">Wrap lines near 160 characters</option>\n          </select>\n          <select id=\"brace-style\">\n            <option value=\"collapse\">Braces with control statement</option>\n            <option value=\"expand\">Braces on own line</option>\n            <option value=\"end-expand\">End braces on own line</option>\n            <option value=\"none\">Attempt to keep braces where they are</option>\n          </select>\n          <div>\n            <p style=\"margin:6px 0 0 0\">HTML &lt;style&gt;, &lt;script&gt; formatting:</p>\n            <select id=\"indent-scripts\">\n              <option value=\"keep\">Keep indent level of the tag</option>\n              <option value=\"normal\">Add one indent level</option>\n              <option value=\"separate\">Separate indentation</option>\n            </select>\n          </div>\n        </div>\n\n        <div class=\"options-checkboxes\">\n          <input class=\"checkbox\" type=\"checkbox\" id=\"end-with-newline\">\n          <label for=\"end-with-newline\">End script and style with newline?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"e4x\">\n          <label for=\"e4x\">Support e4x/jsx syntax</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"comma-first\">\n          <label for=\"comma-first\">Use comma-first list style?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"detect-packers\">\n          <label for=\"detect-packers\">Detect packers and obfuscators? (unsafe)</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"brace-preserve-inline\">\n          <label for=\"brace-preserve-inline\">Preserve inline braces/code blocks?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"keep-array-indentation\">\n          <label for=\"keep-array-indentation\">Keep array indentation?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"break-chained-methods\">\n          <label for=\"break-chained-methods\">Break lines on chained methods?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"space-before-conditional\">\n          <label for=\"space-before-conditional\">Space before conditional: \"if(x)\" / \"if (x)\"</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"unescape-strings\">\n          <label for=\"unescape-strings\">Unescape printable chars encoded as \\xNN or \\uNNNN?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"jslint-happy\">\n          <label for=\"jslint-happy\">Use JSLint-happy formatting tweaks?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"indent-inner-html\">\n          <label for=\"indent-inner-html\">Indent &lt;head&gt; and &lt;body&gt; sections?</label>\n          <br>\n          <input class=\"checkbox\" type=\"checkbox\" id=\"indent-empty-lines\">\n          <label for=\"indent-empty-lines\">Keep indentation on empty lines?</label>\n          <br><a href=\"?without-codemirror\" class=\"turn-off-codemirror\">Use a simple textarea for code input?</a>\n        </div>\n\n        <div>\n          <p style=\"margin:6px 0 0 0\">Additional Settings (JSON):</p>\n          <textarea id=\"additional-options\" rows=\"5\">{}</textarea>\n        </div>\n        <p id=\"additional-options-error\" hidden style=\"margin:6px 0 0 0; color:red \">Could Not Parse JSON!</p>\n        <p style=\"margin:6px 0 0 0\">Your Selected Options (JSON):</p>\n        <div>\n          <textarea readonly id=\"options-selected\" rows=\"5\"></textarea>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"contributions\">\n      <p class=\"contributor-sep\">Created by <a href=\"https://github.com/einars\">Einar Lielmanis</a>, maintained and evolved by <a href=\"https://github.com/bitwiseman/\">Liam Newman</a>.</p>\n      </p>\n      <p>\n        All of the source code is completely free and open, available on <a href=\"https://github.com/beautifier/js-beautify\">GitHub</a> under MIT licence,\n        and we have a command-line version, <a href=\"https://pypi.org/project/jsbeautifier/\">python library</a> and a <a href=\"https://npmjs.org/package/js-beautify\">node package</a> as well.\n      </p>\n      <p>We use the wonderful <a href=\"http://codemirror.net\">CodeMirror</a> syntax highlighting editor, written by Marijn Haverbeke.</p>\n      <p class=\"contributors\">Made with a great help of many contributors. Special thanks to:<br>\n        Jason&nbsp;Diamond,\n        Patrick&nbsp;Hof,\n        Nochum&nbsp;Sossonko,\n        Andreas&nbsp;Schneider,\n        Dave&nbsp;Vasilevsky,\n        <a href=\"https://moikrug.ru/vital\">Vital&nbsp;Batmanov</a>,\n        Ron&nbsp;Baldwin,\n        Gabriel&nbsp;Harrison,\n        <a href=\"http://shullian.com\">Chris J. Shull</a>,\n        <a href=\"http://mathiasbynens.be/\">Mathias Bynens</a>,\n        <a href=\"https://www.vittgam.net/\">Vittorio Gambaletta</a>,\n        <a href=\"https://github.com/esseks\">Stefano Sanfilippo</a> and\n        <a href=\"https://github.com/evocateur\">Daniel Stockman</a>.\n      </p>\n    </div>\n  </div>\n\n  <div class=\"editor\">\n    <textarea id=\"source\"></textarea>\n  </div>\n\n  <div class=\"hide\">\n\n    <p id=\"open-issue\" hidden>Not pretty enough for you?\n      <button type=\"button\" onclick=\"submitIssue()\" name=\"issue-button\">Report a problem with this input</button>\n    </p>\n\n    <div class=\"blurb\">\n\n      <h2>Browser extensions and other uses</h2>\n      <div class=\"col-6\">\n        <ul class=\"uses\">\n\n          <li>A\n            <a href=\"javascript:(function(){s=document.getElementsByTagName('SCRIPT');tx='';sr=[];for(i=0;i<s.length;i++){with(s.item(i)){t=text;if(t){tx+=t;}else{sr.push(src)};}};with(window.open()){document.write('<textarea id=&quot;t&quot;>'+(sr.join(&quot;\\n&quot;))+&quot;\\n\\n-----\\n\\n&quot;+tx+'</textarea><script src=&quot;https://beautifier.io/js/lib/beautify.js&quot;></script><script>with(document.getElementById(&quot;t&quot;)){value=js_beautify(value);with(style){width=&quot;99%&quot;;height=&quot;99%&quot;;borderStyle=&quot;none&quot;;}};</script>');document.close();}})();\">\n              <strong>bookmarklet</strong></a>\n            (drag it to your bookmarks) by Ichiro Hiroshi to see all scripts used on the page,\n          </li>\n\n          <li><strong>Chrome</strong>, in case the built-in CSS and javascript formatting isn't enough for you:<br>\n            — <a href=\"https://chrome.google.com/webstore/detail/cfmcghennfbpmhemnnfjhkdmnbidpanb\">Quick source viewer</a> by Tomi Mickelsson (<a href=\"https://github.com/tomimick/chrome-ext-view-src\">github</a>, <a href=\"http://tomicloud.com/2012/07/viewsrc-chrome-ext\">blog</a>),<br>\n            — <a href=\"https://chrome.google.com/webstore/detail/javascript-and-css-code-b/iiglodndmmefofehaibmaignglbpdald\">Javascript and CSS Code beautifier</a> by c7sky,<br>\n            — <a href=\"https://chrome.google.com/webstore/detail/jsbeautify-for-google-chr/kkioiolcacgoihiiekambdciinadbpfk\">jsbeautify-for-chrome</a> by Tom Rix (<a href=\"https://github.com/rixth/jsbeautify-for-chrome\">github</a>),<br>\n            — <a href=\"https://chrome.google.com/webstore/detail/piekbefgpgdecckjcpffhnacjflfoddg\">Pretty Beautiful JavaScript</a> by Will McSweeney<br>\n            — <a href=\"https://chrome.google.com/webstore/detail/stackoverflow-code-beauti/pljeafjjkkbacckkollfejkciddacmeb\">Stackoverflow Code Beautify</a> by Making Odd Edit Studios (<a href=\"https://github.com/MakingOddEdit/CodeBeautify\">github</a>).\n          </li>\n          <li><strong>Firefox</strong>: <a href=\"https://addons.mozilla.org/en-US/firefox/addon/javascript-deminifier/\">Javascript deminifier</a> by Ben Murphy, to be\n            used together with the firebug (<a href=\"https://github.com/benmmurphy/jsdeminifier_xpi/\">github</a>),</li>\n          <li><strong>Safari</strong>: <a href=\"http://spadin.github.com/js-beautify-safari-extension\">Safari extension</a> by Sandro Padin,</li>\n          <li><strong>Opera</strong>: <a href=\"https://addons.opera.com/addons/extensions/details/readable-javascript/\">Readable JavaScript</a>\n            (<a href=\"https://github.com/Dither/readable-javascript\">github</a>) by Dither,</li>\n          <li><strong>Opera</strong>: <a href=\"https://addons.opera.com/addons/extensions/details/source/\">Source</a> extension by Deathamns,</li>\n          <li><strong>Sublime Text 2/3:</strong> <a href=\"https://github.com/akalongman/sublimetext-codeformatter\">CodeFormatter</a>, a python plugin by Avtandil Kikabidze, supports HTML, CSS, JS and a bunch of other languages,</li>\n          <li><strong>Sublime Text 2/3:</strong> <a href=\"https://github.com/victorporof/Sublime-HTMLPrettify\">HTMLPrettify</a>, a javascript plugin by Victor Porof,</li>\n          <li><strong>Sublime Text 2:</strong> <a href=\"https://github.com/jdc0589/JsFormat\">JsFormat</a>, a javascript formatting plugin for this nice editor by Davis\n            Clark,</li>\n          <li><strong>vim:</strong> <a href=\"https://github.com/michalliu/sourcebeautify.vim\">sourcebeautify.vim</a>, a plugin by michalliu (requires node.js, V8, SpiderMonkey\n            or cscript js engine),</li>\n          <li><strong>vim:</strong> <a href=\"https://github.com/maksimr/vim-jsbeautify\">vim-jsbeautify</a>, a plugin by Maksim Ryzhikov (node.js or V8 required),</li>\n\n          <li><strong>Emacs:</strong> <a href=\"https://github.com/yasuyk/web-beautify\">Web-beautify</a> formatting package by Yasuyuki Oka,</li>\n          <li><strong>Komodo IDE:</strong> <a href=\"http://komodoide.com/packages/addons/beautify-js/\">Beautify-js</a> addon by Bob de Haas (<a href=\"https://github.com/babobski/Beautify-js\">github</a>),</li>\n          <li><strong>C#:</strong> ghost6991 <a href=\"https://github.com/ghost6991/Jsbeautifier\">ported the javascript formatter to C#</a>,</li>\n          <li><strong>Go:</strong> ditashi has <a href=\"https://github.com/ditashi/jsbeautifier-go\">ported the javascript formatter to golang</a>,</li>\n        </ul>\n      </div>\n      <div class=\"col-6\">\n        <ul class=\"uses\">\n          <li><a href=\"https://marketplace.visualstudio.com/items/HookyQR.beautify\">Beautify plugin</a> (<a href=\"https://github.com/HookyQR/VSCodeBeautify\">github</a>) by HookyQR for the <a href=\"https://code.visualstudio.com/\">Visual Studio Code</a> IDE,</li>\n          <li><a href=\"http://fiddler2.com/\">Fiddler</a> proxy: <a href=\"http://fiddler2.com/Fiddler2/extensions.asp\">JavaScript Formatter addon</a>,</li>\n          <li><a href=\"https://github.com/nagaozen/gedit-tunnings/\">gEdit tips</a> by Fabio Nagao,</li>\n          <li><a href=\"http://akelpad.sourceforge.net/forum/viewtopic.php?p=11246#11246\">Akelpad extension</a> by Infocatcher,</li>\n          <li>Beautifier in <a href=\"http://sethmason.com/2011/04/28/jsbeautify-in-emacs.html\">Emacs</a> write-up by Seth Mason,</li>\n          <li><a href=\"http://c9.io\">Cloud9</a>, a lovely IDE running in a browser, working in the node/cloud, uses jsbeautifier (<a href=\"https://github.com/ajaxorg/cloud9\">github</a>),</li>\n          <li><a href=\"https://www.comment-devenir-un-hacker.com/app.html\">Devenir Hacker App</a>, a non-free JavaScript packer for Mac,</li>\n          <li><a href=\"http://www.restconsole.com/\">REST Console</a>, a request debugging tool for Chrome, beautifies JSON responses (<a href=\"https://github.com/codeinchaos/rest-console\">github</a>),</li>\n          <li><a href=\"http://mitmproxy.org/\">mitmproxy</a>, a nifty SSL-capable HTTP proxy, provides pretty javascript responses (<a href=\"https://github.com/cortesi/mitmproxy\">github</a>).</li>\n          <li><a href=\"http://www.wakanda.org/\">wakanda</a>, a neat IDE for web and mobile applications has a <a href=\"http://forum.wakanda.org/showthread.php?1483-3-new-extensions-JSLint-Beautifier-and-Snippet\">Beautifier extension</a>\n            (<a href=\"https://github.com/Wakanda/wakanda-extensions/tree/master/Beautifier\">github</a>).</li>\n          <li><a href=\"http://portswigger.net/burp/\">Burp Suite</a> now has a <a href=\"https://github.com/irsdl/BurpSuiteJSBeautifier/\">beautfier extension</a>,\n            thanks to Soroush Dalili,</li>\n          <li><a href=\"http://plugins.netbeans.org/plugin/43263/jsbeautify\">Netbeans jsbeautify</a> plugin by Drew Hamlett\n            (<a href=\"https://github.com/drewhjava/netbeans-jsbeautify\">github</a>).</li>\n          <li><a href=\"https://github.com/drewhjava/brackets-beautify\">brackets-beautify-extension</a> for <a href=\"http://brackets.io\">Adobe Brackets</a> by Drew\n            Hamlett (<a href=\"https://github.com/drewhjava/brackets-beautify\">github</a>),</li>\n          <li><a href=\"http://codecaddy.net/\">codecaddy.net</a>, a collection of webdev-related tools, assembled by Darik Hall,</li>\n          <li><a href=\"http://www.editey.com/\">editey.com</a>, an interesting and free Google-Drive oriented editor uses this beautifier,</li>\n          <li><a href=\"https://github.com/vkadam/grunt-jsbeautifier\">a beautifier plugin for Grunt</a> by Vishal Kadam,</li>\n          <li><a href=\"http://www.uvviewsoft.com/synwrite/\">SynWrite</a> editor has a JsFormat plugin (<a href=\"https://sourceforge.net/projects/synwrite-addons/files/PyPlugins/Alexey.JsFormat/\">rar</a>, <a href=\"http://synwrite.sourceforge.net/forums/viewtopic.php?f=19&t=865\">readme</a>),</li>\n          <li><a href=\"http://liveditor.com/\">LIVEditor</a>, a live-editing HTML/CSS/JS IDE (commercial, Windows-only) uses the library,</li>\n        </ul>\n      </div>\n      <p>Doing anything interesting? Write us to <b>team@beautifier.io</b> so we can add your project to the list.</p>\n\n      <p style=\"text-align:right\">\n        <a href=\"#\" style=\"color: #ccc; border-bottom: 1px dashed #ccc; text-decoration: none;\" onclick=\"run_tests(); return false;\">Run the tests</a>\n      </p>\n      <div id=\"testresults\"></div>\n    </div>\n  </div>\n  <script src=\"web/onload.js\"></script>\n  <script src=\"web/google-analytics.js\"></script>\n</body>\n\n</html>\n"
  },
  {
    "path": "js/bin/css-beautify.js",
    "content": "#!/usr/bin/env node\nvar cli = require('../lib/cli'); cli.interpret();\n\n\n"
  },
  {
    "path": "js/bin/html-beautify.js",
    "content": "#!/usr/bin/env node\nvar cli = require('../lib/cli'); cli.interpret();\n\n\n"
  },
  {
    "path": "js/bin/js-beautify.js",
    "content": "#!/usr/bin/env node\n\nvar cli = require('../lib/cli');\ncli.interpret();"
  },
  {
    "path": "js/config/defaults.json",
    "content": "{\n    \"indent_size\": 4,\n    \"indent_char\": \" \",\n    \"indent_level\": 0,\n    \"indent_with_tabs\": false,\n    \"preserve_newlines\": true,\n    \"max_preserve_newlines\": 10,\n    \"jslint_happy\": false,\n    \"space_after_named_function\": false,\n    \"space_after_anon_function\": false,\n    \"brace_style\": \"collapse\",\n    \"keep_array_indentation\": false,\n    \"keep_function_indentation\": false,\n    \"space_before_conditional\": true,\n    \"break_chained_methods\": false,\n    \"eval_code\": false,\n    \"unescape_strings\": false,\n    \"wrap_line_length\": 0,\n    \"indent_empty_lines\": false,\n    \"templating\": [\"auto\"]\n}\n"
  },
  {
    "path": "js/index.js",
    "content": "/*jshint node:true */\n/* globals define */\n/*\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n*/\n\n'use strict';\n\n/**\nThe following batches are equivalent:\n\nvar beautify_js = require('js-beautify');\nvar beautify_js = require('js-beautify').js;\nvar beautify_js = require('js-beautify').js_beautify;\n\nvar beautify_css = require('js-beautify').css;\nvar beautify_css = require('js-beautify').css_beautify;\n\nvar beautify_html = require('js-beautify').html;\nvar beautify_html = require('js-beautify').html_beautify;\n\nAll methods returned accept two arguments, the source string and an options object.\n**/\n\nfunction get_beautify(js_beautify, css_beautify, html_beautify) {\n  // the default is js\n  var beautify = function(src, config) {\n    return js_beautify.js_beautify(src, config);\n  };\n\n  // short aliases\n  beautify.js = js_beautify.js_beautify;\n  beautify.css = css_beautify.css_beautify;\n  beautify.html = html_beautify.html_beautify;\n\n  // legacy aliases\n  beautify.js_beautify = js_beautify.js_beautify;\n  beautify.css_beautify = css_beautify.css_beautify;\n  beautify.html_beautify = html_beautify.html_beautify;\n\n  return beautify;\n}\n\nif (typeof define === \"function\" && define.amd) {\n  // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n  define([\n    \"./lib/beautify\",\n    \"./lib/beautify-css\",\n    \"./lib/beautify-html\"\n  ], function(js_beautify, css_beautify, html_beautify) {\n    return get_beautify(js_beautify, css_beautify, html_beautify);\n  });\n} else {\n  (function(mod) {\n    var beautifier = require('./src/index');\n    beautifier.js_beautify = beautifier.js;\n    beautifier.css_beautify = beautifier.css;\n    beautifier.html_beautify = beautifier.html;\n\n    mod.exports = get_beautify(beautifier, beautifier, beautifier);\n\n  })(module);\n}"
  },
  {
    "path": "js/src/cli.js",
    "content": "#!/usr/bin/env node\n\n/*\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n  Js-Beautify Command-line for node.js\n  -------------------------------------\n\n  Written by Daniel Stockman (daniel.stockman@gmail.com)\n\n*/\n/*jshint strict:false */\n/*jshint esversion: 6 */\n\nconst { globSync } = require('glob');\n\nvar debug = process.env.DEBUG_JSBEAUTIFY || process.env.JSBEAUTIFY_DEBUG ? function() {\n    console.error.apply(console, arguments);\n} : function() {};\n\nvar fs = require('fs'),\n    cc = require('config-chain'),\n    beautify = require('../index'),\n    nopt = require('nopt'),\n    glob = require(\"glob\");\n\nnopt.invalidHandler = function(key, val) {\n    throw new Error(key + \" was invalid with value \\\"\" + val + \"\\\"\");\n};\n\nnopt.typeDefs.brace_style = {\n    type: \"brace_style\",\n    validate: function(data, key, val) {\n        data[key] = val;\n        // TODO: expand-strict is obsolete, now identical to expand.  Remove in future version\n        // TODO: collapse-preserve-inline is obselete, now identical to collapse,preserve-inline = true. Remove in future version\n        var validVals = [\"collapse\", \"collapse-preserve-inline\", \"expand\", \"end-expand\", \"expand-strict\", \"none\", \"preserve-inline\"];\n        var valSplit = val.split(/[^a-zA-Z0-9_\\-]+/); //Split will always return at least one parameter\n        for (var i = 0; i < valSplit.length; i++) {\n            if (validVals.indexOf(valSplit[i]) === -1) {\n                return false;\n            }\n        }\n        return true;\n    }\n};\nnopt.typeDefs.glob = {\n    type: \"glob\",\n    validate: function(data, key, val) {\n        if (typeof val === 'string' && glob.hasMagic(val)) {\n            // Preserve value if it contains glob magic\n            data[key] = val;\n            return true;\n        } else {\n            // Otherwise validate it as regular path\n            return nopt.typeDefs.path.validate(data, key, val);\n        }\n    }\n};\nvar path = require('path'),\n    editorconfig = require('editorconfig'),\n    knownOpts = {\n        // Beautifier\n        \"indent_size\": Number,\n        \"indent_char\": String,\n        \"eol\": String,\n        \"indent_level\": Number,\n        \"indent_with_tabs\": Boolean,\n        \"preserve_newlines\": Boolean,\n        \"max_preserve_newlines\": Number,\n        \"space_in_paren\": Boolean,\n        \"space_in_empty_paren\": Boolean,\n        \"jslint_happy\": Boolean,\n        \"space_after_anon_function\": Boolean,\n        \"space_after_named_function\": Boolean,\n        \"brace_style\": \"brace_style\", //See above for validation\n        \"unindent_chained_methods\": Boolean,\n        \"break_chained_methods\": Boolean,\n        \"keep_array_indentation\": Boolean,\n        \"unescape_strings\": Boolean,\n        \"wrap_line_length\": Number,\n        \"wrap_attributes\": [\"auto\", \"force\", \"force-aligned\", \"force-expand-multiline\", \"aligned-multiple\", \"preserve\", \"preserve-aligned\"],\n        \"wrap_attributes_min_attrs\": Number,\n        \"wrap_attributes_indent_size\": Number,\n        \"e4x\": Boolean,\n        \"end_with_newline\": Boolean,\n        \"comma_first\": Boolean,\n        \"operator_position\": [\"before-newline\", \"after-newline\", \"preserve-newline\"],\n        \"indent_empty_lines\": Boolean,\n        \"templating\": [String, Array],\n        // CSS-only\n        \"selector_separator_newline\": Boolean,\n        \"newline_between_rules\": Boolean,\n        \"space_around_combinator\": Boolean,\n        //deprecated - replaced with space_around_combinator, remove in future version\n        \"space_around_selector_separator\": Boolean,\n        // HTML-only\n        \"max_char\": Number, // obsolete since 1.3.5\n        \"inline\": [String, Array],\n        \"inline_custom_elements\": [Boolean],\n        \"unformatted\": [String, Array],\n        \"content_unformatted\": [String, Array],\n        \"indent_inner_html\": [Boolean],\n        \"indent_handlebars\": [Boolean],\n        \"indent_scripts\": [\"keep\", \"separate\", \"normal\"],\n        \"extra_liners\": [String, Array],\n        \"unformatted_content_delimiter\": String,\n        // CLI\n        \"version\": Boolean,\n        \"help\": Boolean,\n        \"files\": [\"glob\", Array],\n        \"outfile\": path,\n        \"replace\": Boolean,\n        \"quiet\": Boolean,\n        \"type\": [\"js\", \"css\", \"html\"],\n        \"config\": path,\n        \"editorconfig\": Boolean\n    },\n    // dasherizeShorthands provides { \"indent-size\": [\"--indent_size\"] }\n    // translation, allowing more convenient dashes in CLI arguments\n    shortHands = dasherizeShorthands({\n        // Beautifier\n        \"s\": [\"--indent_size\"],\n        \"c\": [\"--indent_char\"],\n        \"e\": [\"--eol\"],\n        \"l\": [\"--indent_level\"],\n        \"t\": [\"--indent_with_tabs\"],\n        \"p\": [\"--preserve_newlines\"],\n        \"m\": [\"--max_preserve_newlines\"],\n        \"P\": [\"--space_in_paren\"],\n        \"Q\": [\"--space_in_empty_paren\"],\n        \"j\": [\"--jslint_happy\"],\n        \"a\": [\"--space_after_anon_function\"],\n        \"b\": [\"--brace_style\"],\n        \"u\": [\"--unindent_chained_methods\"],\n        \"B\": [\"--break_chained_methods\"],\n        \"k\": [\"--keep_array_indentation\"],\n        \"x\": [\"--unescape_strings\"],\n        \"w\": [\"--wrap_line_length\"],\n        \"X\": [\"--e4x\"],\n        \"n\": [\"--end_with_newline\"],\n        \"C\": [\"--comma_first\"],\n        \"O\": [\"--operator_position\"],\n        // CSS-only\n        \"L\": [\"--selector_separator_newline\"],\n        \"N\": [\"--newline_between_rules\"],\n        // HTML-only\n        \"A\": [\"--wrap_attributes\"],\n        \"M\": [\"--wrap_attributes_min_attrs\"],\n        \"i\": [\"--wrap_attributes_indent_size\"],\n        \"W\": [\"--max_char\"], // obsolete since 1.3.5\n        \"d\": [\"--inline\"],\n        // no shorthand for \"inline_custom_elements\"\n        \"U\": [\"--unformatted\"],\n        \"T\": [\"--content_unformatted\"],\n        \"I\": [\"--indent_inner_html\"],\n        \"H\": [\"--indent_handlebars\"],\n        \"S\": [\"--indent_scripts\"],\n        \"E\": [\"--extra_liners\"],\n        // non-dasherized hybrid shortcuts\n        \"good-stuff\": [\n            \"--keep_array_indentation\",\n            \"--keep_function_indentation\",\n            \"--jslint_happy\"\n        ],\n        \"js\": [\"--type\", \"js\"],\n        \"css\": [\"--type\", \"css\"],\n        \"html\": [\"--type\", \"html\"],\n        // CLI\n        \"v\": [\"--version\"],\n        \"h\": [\"--help\"],\n        \"f\": [\"--files\"],\n        \"file\": [\"--files\"],\n        \"o\": [\"--outfile\"],\n        \"r\": [\"--replace\"],\n        \"q\": [\"--quiet\"]\n        // no shorthand for \"config\"\n        // no shorthand for \"editorconfig\"\n        // no shorthand for \"indent_empty_lines\"\n        // no shorthad for \"templating\"\n    });\n\nfunction verifyExists(fullPath) {\n    return fs.existsSync(fullPath) ? fullPath : null;\n}\n\nfunction findRecursive(dir, fileName) {\n    var fullPath = path.join(dir, fileName);\n    var nextDir = path.dirname(dir);\n    var result = verifyExists(fullPath);\n\n    if (!result && (nextDir !== dir)) {\n        result = findRecursive(nextDir, fileName);\n    }\n\n    return result;\n}\n\nfunction getUserHome() {\n    var user_home = '';\n    try {\n        user_home = process.env.USERPROFILE || process.env.HOME || '';\n    } catch (ex) {}\n    return user_home;\n}\n\nfunction set_file_editorconfig_opts(file, config) {\n    try {\n        var eConfigs = editorconfig.parseSync(file);\n\n        if (eConfigs.indent_style === \"tab\") {\n            config.indent_with_tabs = true;\n        } else if (eConfigs.indent_style === \"space\") {\n            config.indent_with_tabs = false;\n        }\n\n        if (eConfigs.indent_size) {\n            config.indent_size = eConfigs.indent_size;\n        }\n\n        if (eConfigs.max_line_length) {\n            if (eConfigs.max_line_length === \"off\") {\n                config.wrap_line_length = 0;\n            } else {\n                config.wrap_line_length = parseInt(eConfigs.max_line_length, 10);\n            }\n        }\n\n        if (eConfigs.insert_final_newline === true) {\n            config.end_with_newline = true;\n        } else if (eConfigs.insert_final_newline === false) {\n            config.end_with_newline = false;\n        }\n\n        if (eConfigs.end_of_line) {\n            if (eConfigs.end_of_line === 'cr') {\n                config.eol = '\\r';\n            } else if (eConfigs.end_of_line === 'lf') {\n                config.eol = '\\n';\n            } else if (eConfigs.end_of_line === 'crlf') {\n                config.eol = '\\r\\n';\n            }\n        }\n    } catch (e) {\n        debug(e);\n    }\n}\n\n// var cli = require('js-beautify/cli'); cli.interpret();\nvar interpret = exports.interpret = function(argv, slice) {\n    var parsed;\n    try {\n        parsed = nopt(knownOpts, shortHands, argv, slice);\n    } catch (ex) {\n        usage(ex);\n        // console.error(ex);\n        // console.error('Run `' + getScriptName() + ' -h` for help.');\n        process.exit(1);\n    }\n\n\n    if (parsed.version) {\n        console.log(require('../../package.json').version);\n        process.exit(0);\n    } else if (parsed.help) {\n        usage();\n        process.exit(0);\n    }\n\n    var cfg;\n    var configRecursive = findRecursive(process.cwd(), '.jsbeautifyrc');\n    var configHome = verifyExists(path.join(getUserHome() || \"\", \".jsbeautifyrc\"));\n    var configDefault = __dirname + '/../config/defaults.json';\n\n    try {\n        cfg = cc(\n            parsed,\n            cleanOptions(cc.env('jsbeautify_'), knownOpts),\n            parsed.config,\n            configRecursive,\n            configHome,\n            configDefault\n        ).snapshot;\n    } catch (ex) {\n        debug(cfg);\n        // usage(ex);\n        console.error(ex);\n        console.error('Error while loading beautifier configuration.');\n        console.error('Configuration file chain included:');\n        if (parsed.config) {\n            console.error(parsed.config);\n        }\n        if (configRecursive) {\n            console.error(configRecursive);\n        }\n        if (configHome) {\n            console.error(configHome);\n        }\n        console.error(configDefault);\n        console.error('Run `' + getScriptName() + ' -h` for help.');\n        process.exit(1);\n    }\n\n    try {\n        // Verify arguments\n        checkType(cfg);\n        checkFiles(cfg);\n        debug(cfg);\n\n        // Process files synchronously to avoid EMFILE error\n        cfg.files.forEach(processInputSync, {\n            cfg: cfg\n        });\n    } catch (ex) {\n        debug(cfg);\n        // usage(ex);\n        console.error(ex);\n        console.error('Run `' + getScriptName() + ' -h` for help.');\n        process.exit(1);\n    }\n};\n\n// interpret args immediately when called as executable\nif (require.main === module) {\n    interpret();\n}\n\nfunction usage(err) {\n    var scriptName = getScriptName();\n    var msg = [\n        scriptName + '@' + require('../../package.json').version,\n        '',\n        'CLI Options:',\n        '  -f, --file       Input file(s) (Pass \\'-\\' for stdin)',\n        '  -r, --replace    Write output in-place, replacing input',\n        '  -o, --outfile    Write output to file (default stdout)',\n        '  --config         Path to config file',\n        '  --type           [js|css|html] [\"js\"]',\n        '  -q, --quiet      Suppress logging to stdout',\n        '  -h, --help       Show this help',\n        '  -v, --version    Show the version',\n        '',\n        'Beautifier Options:',\n        '  -s, --indent-size                 Indentation size [4]',\n        '  -c, --indent-char                 Indentation character [\" \"]',\n        '  -t, --indent-with-tabs            Indent with tabs, overrides -s and -c',\n        '  -e, --eol                         Character(s) to use as line terminators.',\n        '                                    [first newline in file, otherwise \"\\\\n]',\n        '  -n, --end-with-newline            End output with newline',\n        '  --indent-empty-lines              Keep indentation on empty lines',\n        '  --templating                      List of templating languages (auto,none,angular,django,erb,handlebars,php,smarty)',\n        '                                    [\"auto\", auto = none in JavaScript, auto = all except angular in html (and inline javascript/css)]',\n        '  --editorconfig                    Use EditorConfig to set up the options'\n    ];\n\n    switch (scriptName.split('-').shift()) {\n        case \"js\":\n            msg.push('  -l, --indent-level                Initial indentation level [0]');\n            msg.push('  -p, --preserve-newlines           Preserve line-breaks (--no-preserve-newlines disables)');\n            msg.push('  -m, --max-preserve-newlines       Number of line-breaks to be preserved in one chunk [10]');\n            msg.push('  -P, --space-in-paren              Add padding spaces within paren, ie. f( a, b )');\n            msg.push('  -E, --space-in-empty-paren        Add a single space inside empty paren, ie. f( )');\n            msg.push('  -j, --jslint-happy                Enable jslint-stricter mode');\n            msg.push('  -a, --space-after-anon-function   Add a space before an anonymous function\\'s parens, ie. function ()');\n            msg.push('  --space_after_named_function      Add a space before a named function\\'s parens, ie. function example ()');\n            msg.push('  -b, --brace-style                 [collapse|expand|end-expand|none][,preserve-inline] [collapse,preserve-inline]');\n            msg.push('  -u, --unindent-chained-methods    Don\\'t indent chained method calls');\n            msg.push('  -B, --break-chained-methods       Break chained method calls across subsequent lines');\n            msg.push('  -k, --keep-array-indentation      Preserve array indentation');\n            msg.push('  -x, --unescape-strings            Decode printable characters encoded in xNN notation');\n            msg.push('  -w, --wrap-line-length            Wrap lines that exceed N characters [0]');\n            msg.push('  -X, --e4x                         Pass E4X xml literals through untouched');\n            msg.push('  --good-stuff                      Warm the cockles of Crockford\\'s heart');\n            msg.push('  -C, --comma-first                 Put commas at the beginning of new line instead of end');\n            msg.push('  -O, --operator-position           Set operator position (before-newline|after-newline|preserve-newline) [before-newline]');\n            break;\n        case \"html\":\n            msg.push('  -b, --brace-style                 [collapse|expand|end-expand] [\"collapse\"]');\n            msg.push('  -I, --indent-inner-html           Indent body and head sections. Default is false.');\n            msg.push('  -H, --indent-handlebars           Indent handlebars. Default is false.');\n            msg.push('  -S, --indent-scripts              [keep|separate|normal] [\"normal\"]');\n            msg.push('  -w, --wrap-line-length            Wrap lines that exceed N characters [0]');\n            msg.push('  -A, --wrap-attributes             Wrap html tag attributes to new lines [auto|force|force-aligned|force-expand-multiline|aligned-multiple|preserve|preserve-aligned] [\"auto\"]');\n            msg.push('  -M, --wrap-attributes-min-attrs   Minimum number of html tag attributes for force wrap attribute options [2]');\n            msg.push('  -i, --wrap-attributes-indent-size Indent wrapped tags to after N characters [indent-level]');\n            msg.push('  -p, --preserve-newlines           Preserve line-breaks (--no-preserve-newlines disables)');\n            msg.push('  -m, --max-preserve-newlines       Number of line-breaks to be preserved in one chunk [10]');\n            msg.push('  -U, --unformatted                 List of tags (defaults to inline) that should not be reformatted');\n            msg.push('  -T, --content_unformatted         List of tags (defaults to pre) whose content should not be reformatted');\n            msg.push('  -E, --extra_liners                List of tags (defaults to [head,body,/html] that should have an extra newline');\n            msg.push('  --unformatted_content_delimiter   Keep text content together between this string [\"\"]');\n            break;\n        case \"css\":\n            msg.push('  -b, --brace-style                       [collapse|expand] [\"collapse\"]');\n            msg.push('  -L, --selector-separator-newline        Add a newline between multiple selectors.');\n            msg.push('  -N, --newline-between-rules             Add a newline between CSS rules.');\n    }\n\n    if (err) {\n        msg.push(err);\n        msg.push('');\n        console.error(msg.join('\\n'));\n    } else {\n        console.log(msg.join('\\n'));\n    }\n}\n\n// main iterator, {cfg} passed as thisArg of forEach call\n\nfunction processInputSync(filepath) {\n    var data = null,\n        config = this.cfg,\n        outfile = config.outfile,\n        input;\n\n    // -o passed with no value overwrites\n    if (outfile === true || config.replace) {\n        outfile = filepath;\n    }\n\n    var fileType = getOutputType(outfile, filepath, config.type);\n\n    if (config.editorconfig) {\n        var editorconfig_filepath = filepath;\n\n        if (editorconfig_filepath === '-') {\n            if (outfile) {\n                editorconfig_filepath = outfile;\n            } else {\n                editorconfig_filepath = 'stdin.' + fileType;\n            }\n        }\n\n        debug(\"EditorConfig is enabled for \", editorconfig_filepath);\n        config = cc(config).snapshot;\n        set_file_editorconfig_opts(editorconfig_filepath, config);\n        debug(config);\n    }\n\n    if (filepath === '-') {\n        input = process.stdin;\n\n        input.setEncoding('utf8');\n\n        input.on('error', function() {\n            throw 'Must pipe input or define at least one file.';\n        });\n\n        input.on('data', function(chunk) {\n            data = data || '';\n            data += chunk;\n        });\n\n        input.on('end', function() {\n            if (data === null) {\n                throw 'Must pipe input or define at least one file.';\n            }\n            makePretty(fileType, data, config, outfile, writePretty); // Where things get beautified\n        });\n\n        input.resume();\n\n    } else {\n        data = fs.readFileSync(filepath, 'utf8');\n        makePretty(fileType, data, config, outfile, writePretty);\n    }\n}\n\nfunction makePretty(fileType, code, config, outfile, callback) {\n    try {\n        var pretty = beautify[fileType](code, config);\n\n        callback(null, pretty, outfile, config);\n    } catch (ex) {\n        callback(ex);\n    }\n}\n\nfunction writePretty(err, pretty, outfile, config) {\n    debug('writing ' + outfile);\n    if (err) {\n        console.error(err);\n        process.exit(1);\n    }\n\n    if (outfile) {\n        fs.mkdirSync(path.dirname(outfile), { recursive: true });\n\n        if (isFileDifferent(outfile, pretty)) {\n            try {\n                fs.writeFileSync(outfile, pretty, 'utf8');\n                logToStdout('beautified ' + path.relative(process.cwd(), outfile), config);\n            } catch (ex) {\n                onOutputError(ex);\n            }\n        } else {\n            logToStdout('beautified ' + path.relative(process.cwd(), outfile) + ' - unchanged', config);\n        }\n    } else {\n        process.stdout.write(pretty);\n    }\n}\n\nfunction isFileDifferent(filePath, expected) {\n    try {\n        return fs.readFileSync(filePath, 'utf8') !== expected;\n    } catch (ex) {\n        // failing to read is the same as different\n        return true;\n    }\n}\n\n// workaround the fact that nopt.clean doesn't return the object passed in :P\n\nfunction cleanOptions(data, types) {\n    nopt.clean(data, types);\n    return data;\n}\n\n// error handler for output stream that swallows errors silently,\n// allowing the loop to continue over unwritable files.\n\nfunction onOutputError(err) {\n    if (err.code === 'EACCES') {\n        console.error(err.path + \" is not writable. Skipping!\");\n    } else {\n        console.error(err);\n        process.exit(0);\n    }\n}\n\n// turn \"--foo_bar\" into \"foo-bar\"\n\nfunction dasherizeFlag(str) {\n    return str.replace(/^\\-+/, '').replace(/_/g, '-');\n}\n\n// translate weird python underscored keys into dashed argv,\n// avoiding single character aliases.\n\nfunction dasherizeShorthands(hash) {\n    // operate in-place\n    Object.keys(hash).forEach(function(key) {\n        // each key value is an array\n        var val = hash[key][0];\n        // only dasherize one-character shorthands\n        if (key.length === 1 && val.indexOf('_') > -1) {\n            hash[dasherizeFlag(val)] = val;\n        }\n    });\n\n    return hash;\n}\n\nfunction getOutputType(outfile, filepath, configType) {\n    if (outfile && /\\.(js|css|html)$/.test(outfile)) {\n        return outfile.split('.').pop();\n    } else if (filepath !== '-' && /\\.(js|css|html)$/.test(filepath)) {\n        return filepath.split('.').pop();\n    } else if (configType) {\n        return configType;\n    } else {\n        throw 'Could not determine appropriate beautifier from file paths: ' + filepath;\n    }\n}\n\nfunction getScriptName() {\n    return path.basename(process.argv[1]);\n}\n\nfunction checkType(parsed) {\n    var scriptType = getScriptName().split('-').shift();\n    if (!/^(js|css|html)$/.test(scriptType)) {\n        scriptType = null;\n    }\n\n    debug(\"executable type:\", scriptType);\n\n    var parsedType = parsed.type;\n    debug(\"parsed type:\", parsedType);\n\n    if (!parsedType) {\n        debug(\"type defaulted:\", scriptType);\n        parsed.type = scriptType;\n    }\n}\n\nfunction checkFiles(parsed) {\n    var argv = parsed.argv;\n    var isTTY = true;\n    var file_params = parsed.files || [];\n    var hadGlob = false;\n\n    try {\n        isTTY = process.stdin.isTTY;\n    } catch (ex) {\n        debug(\"error querying for isTTY:\", ex);\n    }\n\n    debug('isTTY: ' + isTTY);\n\n    // assume any remaining args are files\n    file_params = file_params.concat(argv.remain);\n\n    parsed.files = [];\n    // assume any remaining args are files\n    file_params.forEach(function(f) {\n        // strip stdin path eagerly added by nopt in '-f -' case\n        if (f === '-') {\n            return;\n        }\n\n        var foundFiles = [];\n        var isGlob = glob.hasMagic(f);\n\n        // Input was a glob\n        if (isGlob) {\n            hadGlob = true;\n            foundFiles = globSync(f, {\n                absolute: true,\n                ignore: ['**/node_modules/**', '**/.git/**']\n            });\n        } else {\n            // Input was not a glob, add it to an array so we are able to handle it in the same loop below\n            try {\n                testFilePath(f);\n            } catch (err) {\n                // if file is not found, and the resolved path indicates stdin marker\n                if (path.parse(f).base === '-') {\n                    f = '-';\n                } else {\n                    throw err;\n                }\n            }\n            foundFiles = [f];\n        }\n\n        if (foundFiles && foundFiles.length) {\n            // Add files to the parsed.files if it didn't exist in the array yet\n            foundFiles.forEach(function(file) {\n                var filePath = path.resolve(file);\n                if (file === '-') { // case of stdin\n                    parsed.files.push(file);\n                } else if (parsed.files.indexOf(filePath) === -1) {\n                    parsed.files.push(filePath);\n                }\n            });\n        }\n    });\n\n    if ('string' === typeof parsed.outfile && isTTY && !parsed.files.length) {\n        testFilePath(parsed.outfile);\n        // use outfile as input when no other files passed in args\n        parsed.files.push(parsed.outfile);\n        // operation is now an implicit overwrite\n        parsed.replace = true;\n    }\n\n    if (hadGlob || parsed.files.length > 1) {\n        parsed.replace = true;\n    }\n\n    if (!parsed.files.length && !hadGlob) {\n        // read stdin by default\n        parsed.files.push('-');\n    }\n\n    debug('files.length ' + parsed.files.length);\n\n    if (parsed.files.indexOf('-') > -1 && isTTY && !hadGlob) {\n        throw 'Must pipe input or define at least one file.';\n    }\n\n    return parsed;\n}\n\nfunction testFilePath(filepath) {\n    try {\n        if (filepath !== \"-\") {\n            fs.statSync(filepath);\n        }\n    } catch (err) {\n        throw 'Unable to open path \"' + filepath + '\"';\n    }\n}\n\nfunction logToStdout(str, config) {\n    if (typeof config.quiet === \"undefined\" || !config.quiet) {\n        console.log(str);\n    }\n}"
  },
  {
    "path": "js/src/core/directives.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nfunction Directives(start_block_pattern, end_block_pattern) {\n  start_block_pattern = typeof start_block_pattern === 'string' ? start_block_pattern : start_block_pattern.source;\n  end_block_pattern = typeof end_block_pattern === 'string' ? end_block_pattern : end_block_pattern.source;\n  this.__directives_block_pattern = new RegExp(start_block_pattern + / beautify( \\w+[:]\\w+)+ /.source + end_block_pattern, 'g');\n  this.__directive_pattern = / (\\w+)[:](\\w+)/g;\n\n  this.__directives_end_ignore_pattern = new RegExp(start_block_pattern + /\\sbeautify\\signore:end\\s/.source + end_block_pattern, 'g');\n}\n\nDirectives.prototype.get_directives = function(text) {\n  if (!text.match(this.__directives_block_pattern)) {\n    return null;\n  }\n\n  var directives = {};\n  this.__directive_pattern.lastIndex = 0;\n  var directive_match = this.__directive_pattern.exec(text);\n\n  while (directive_match) {\n    directives[directive_match[1]] = directive_match[2];\n    directive_match = this.__directive_pattern.exec(text);\n  }\n\n  return directives;\n};\n\nDirectives.prototype.readIgnored = function(input) {\n  return input.readUntilAfter(this.__directives_end_ignore_pattern);\n};\n\n\nmodule.exports.Directives = Directives;\n"
  },
  {
    "path": "js/src/core/inputscanner.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar regexp_has_sticky = RegExp.prototype.hasOwnProperty('sticky');\n\nfunction InputScanner(input_string) {\n  this.__input = input_string || '';\n  this.__input_length = this.__input.length;\n  this.__position = 0;\n}\n\nInputScanner.prototype.restart = function() {\n  this.__position = 0;\n};\n\nInputScanner.prototype.back = function() {\n  if (this.__position > 0) {\n    this.__position -= 1;\n  }\n};\n\nInputScanner.prototype.hasNext = function() {\n  return this.__position < this.__input_length;\n};\n\nInputScanner.prototype.next = function() {\n  var val = null;\n  if (this.hasNext()) {\n    val = this.__input.charAt(this.__position);\n    this.__position += 1;\n  }\n  return val;\n};\n\nInputScanner.prototype.peek = function(index) {\n  var val = null;\n  index = index || 0;\n  index += this.__position;\n  if (index >= 0 && index < this.__input_length) {\n    val = this.__input.charAt(index);\n  }\n  return val;\n};\n\n// This is a JavaScript only helper function (not in python)\n// Javascript doesn't have a match method\n// and not all implementation support \"sticky\" flag.\n// If they do not support sticky then both this.match() and this.test() method\n// must get the match and check the index of the match.\n// If sticky is supported and set, this method will use it.\n// Otherwise it will check that global is set, and fall back to the slower method.\nInputScanner.prototype.__match = function(pattern, index) {\n  pattern.lastIndex = index;\n  var pattern_match = pattern.exec(this.__input);\n\n  if (pattern_match && !(regexp_has_sticky && pattern.sticky)) {\n    if (pattern_match.index !== index) {\n      pattern_match = null;\n    }\n  }\n\n  return pattern_match;\n};\n\nInputScanner.prototype.test = function(pattern, index) {\n  index = index || 0;\n  index += this.__position;\n\n  if (index >= 0 && index < this.__input_length) {\n    return !!this.__match(pattern, index);\n  } else {\n    return false;\n  }\n};\n\nInputScanner.prototype.testChar = function(pattern, index) {\n  // test one character regex match\n  var val = this.peek(index);\n  pattern.lastIndex = 0;\n  return val !== null && pattern.test(val);\n};\n\nInputScanner.prototype.match = function(pattern) {\n  var pattern_match = this.__match(pattern, this.__position);\n  if (pattern_match) {\n    this.__position += pattern_match[0].length;\n  } else {\n    pattern_match = null;\n  }\n  return pattern_match;\n};\n\nInputScanner.prototype.read = function(starting_pattern, until_pattern, until_after) {\n  var val = '';\n  var match;\n  if (starting_pattern) {\n    match = this.match(starting_pattern);\n    if (match) {\n      val += match[0];\n    }\n  }\n  if (until_pattern && (match || !starting_pattern)) {\n    val += this.readUntil(until_pattern, until_after);\n  }\n  return val;\n};\n\nInputScanner.prototype.readUntil = function(pattern, until_after) {\n  var val = '';\n  var match_index = this.__position;\n  pattern.lastIndex = this.__position;\n  var pattern_match = pattern.exec(this.__input);\n  if (pattern_match) {\n    match_index = pattern_match.index;\n    if (until_after) {\n      match_index += pattern_match[0].length;\n    }\n  } else {\n    match_index = this.__input_length;\n  }\n\n  val = this.__input.substring(this.__position, match_index);\n  this.__position = match_index;\n  return val;\n};\n\nInputScanner.prototype.readUntilAfter = function(pattern) {\n  return this.readUntil(pattern, true);\n};\n\nInputScanner.prototype.get_regexp = function(pattern, match_from) {\n  var result = null;\n  var flags = 'g';\n  if (match_from && regexp_has_sticky) {\n    flags = 'y';\n  }\n  // strings are converted to regexp\n  if (typeof pattern === \"string\" && pattern !== '') {\n    // result = new RegExp(pattern.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'), flags);\n    result = new RegExp(pattern, flags);\n  } else if (pattern) {\n    result = new RegExp(pattern.source, flags);\n  }\n  return result;\n};\n\nInputScanner.prototype.get_literal_regexp = function(literal_string) {\n  return RegExp(literal_string.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'));\n};\n\n/* css beautifier legacy helpers */\nInputScanner.prototype.peekUntilAfter = function(pattern) {\n  var start = this.__position;\n  var val = this.readUntilAfter(pattern);\n  this.__position = start;\n  return val;\n};\n\nInputScanner.prototype.lookBack = function(testVal) {\n  var start = this.__position - 1;\n  return start >= testVal.length && this.__input.substring(start - testVal.length, start)\n    .toLowerCase() === testVal;\n};\n\nmodule.exports.InputScanner = InputScanner;\n"
  },
  {
    "path": "js/src/core/options.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nfunction Options(options, merge_child_field) {\n  this.raw_options = _mergeOpts(options, merge_child_field);\n\n  // Support passing the source text back with no change\n  this.disabled = this._get_boolean('disabled');\n\n  this.eol = this._get_characters('eol', 'auto');\n  this.end_with_newline = this._get_boolean('end_with_newline');\n  this.indent_size = this._get_number('indent_size', 4);\n  this.indent_char = this._get_characters('indent_char', ' ');\n  this.indent_level = this._get_number('indent_level');\n\n  this.preserve_newlines = this._get_boolean('preserve_newlines', true);\n  this.max_preserve_newlines = this._get_number('max_preserve_newlines', 32786);\n  if (!this.preserve_newlines) {\n    this.max_preserve_newlines = 0;\n  }\n\n  this.indent_with_tabs = this._get_boolean('indent_with_tabs', this.indent_char === '\\t');\n  if (this.indent_with_tabs) {\n    this.indent_char = '\\t';\n\n    // indent_size behavior changed after 1.8.6\n    // It used to be that indent_size would be\n    // set to 1 for indent_with_tabs. That is no longer needed and\n    // actually doesn't make sense - why not use spaces? Further,\n    // that might produce unexpected behavior - tabs being used\n    // for single-column alignment. So, when indent_with_tabs is true\n    // and indent_size is 1, reset indent_size to 4.\n    if (this.indent_size === 1) {\n      this.indent_size = 4;\n    }\n  }\n\n  // Backwards compat with 1.3.x\n  this.wrap_line_length = this._get_number('wrap_line_length', this._get_number('max_char'));\n\n  this.indent_empty_lines = this._get_boolean('indent_empty_lines');\n\n  // valid templating languages ['django', 'erb', 'handlebars', 'php', 'smarty', 'angular']\n  // For now, 'auto' = all off for javascript, all except angular on for html (and inline javascript/css).\n  // other values ignored\n  this.templating = this._get_selection_list('templating', ['auto', 'none', 'angular', 'django', 'erb', 'handlebars', 'php', 'smarty'], ['auto']);\n}\n\nOptions.prototype._get_array = function(name, default_value) {\n  var option_value = this.raw_options[name];\n  var result = default_value || [];\n  if (typeof option_value === 'object') {\n    if (option_value !== null && typeof option_value.concat === 'function') {\n      result = option_value.concat();\n    }\n  } else if (typeof option_value === 'string') {\n    result = option_value.split(/[^a-zA-Z0-9_\\/\\-]+/);\n  }\n  return result;\n};\n\nOptions.prototype._get_boolean = function(name, default_value) {\n  var option_value = this.raw_options[name];\n  var result = option_value === undefined ? !!default_value : !!option_value;\n  return result;\n};\n\nOptions.prototype._get_characters = function(name, default_value) {\n  var option_value = this.raw_options[name];\n  var result = default_value || '';\n  if (typeof option_value === 'string') {\n    result = option_value.replace(/\\\\r/, '\\r').replace(/\\\\n/, '\\n').replace(/\\\\t/, '\\t');\n  }\n  return result;\n};\n\nOptions.prototype._get_number = function(name, default_value) {\n  var option_value = this.raw_options[name];\n  default_value = parseInt(default_value, 10);\n  if (isNaN(default_value)) {\n    default_value = 0;\n  }\n  var result = parseInt(option_value, 10);\n  if (isNaN(result)) {\n    result = default_value;\n  }\n  return result;\n};\n\nOptions.prototype._get_selection = function(name, selection_list, default_value) {\n  var result = this._get_selection_list(name, selection_list, default_value);\n  if (result.length !== 1) {\n    throw new Error(\n      \"Invalid Option Value: The option '\" + name + \"' can only be one of the following values:\\n\" +\n      selection_list + \"\\nYou passed in: '\" + this.raw_options[name] + \"'\");\n  }\n\n  return result[0];\n};\n\n\nOptions.prototype._get_selection_list = function(name, selection_list, default_value) {\n  if (!selection_list || selection_list.length === 0) {\n    throw new Error(\"Selection list cannot be empty.\");\n  }\n\n  default_value = default_value || [selection_list[0]];\n  if (!this._is_valid_selection(default_value, selection_list)) {\n    throw new Error(\"Invalid Default Value!\");\n  }\n\n  var result = this._get_array(name, default_value);\n  if (!this._is_valid_selection(result, selection_list)) {\n    throw new Error(\n      \"Invalid Option Value: The option '\" + name + \"' can contain only the following values:\\n\" +\n      selection_list + \"\\nYou passed in: '\" + this.raw_options[name] + \"'\");\n  }\n\n  return result;\n};\n\nOptions.prototype._is_valid_selection = function(result, selection_list) {\n  return result.length && selection_list.length &&\n    !result.some(function(item) { return selection_list.indexOf(item) === -1; });\n};\n\n\n// merges child options up with the parent options object\n// Example: obj = {a: 1, b: {a: 2}}\n//          mergeOpts(obj, 'b')\n//\n//          Returns: {a: 2}\nfunction _mergeOpts(allOptions, childFieldName) {\n  var finalOpts = {};\n  allOptions = _normalizeOpts(allOptions);\n  var name;\n\n  for (name in allOptions) {\n    if (name !== childFieldName) {\n      finalOpts[name] = allOptions[name];\n    }\n  }\n\n  //merge in the per type settings for the childFieldName\n  if (childFieldName && allOptions[childFieldName]) {\n    for (name in allOptions[childFieldName]) {\n      finalOpts[name] = allOptions[childFieldName][name];\n    }\n  }\n  return finalOpts;\n}\n\nfunction _normalizeOpts(options) {\n  var convertedOpts = {};\n  var key;\n\n  for (key in options) {\n    var newKey = key.replace(/-/g, \"_\");\n    convertedOpts[newKey] = options[key];\n  }\n  return convertedOpts;\n}\n\nmodule.exports.Options = Options;\nmodule.exports.normalizeOpts = _normalizeOpts;\nmodule.exports.mergeOpts = _mergeOpts;\n"
  },
  {
    "path": "js/src/core/output.js",
    "content": "/*jshint node:true */\n/*\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nfunction OutputLine(parent) {\n  this.__parent = parent;\n  this.__character_count = 0;\n  // use indent_count as a marker for this.__lines that have preserved indentation\n  this.__indent_count = -1;\n  this.__alignment_count = 0;\n  this.__wrap_point_index = 0;\n  this.__wrap_point_character_count = 0;\n  this.__wrap_point_indent_count = -1;\n  this.__wrap_point_alignment_count = 0;\n\n  this.__items = [];\n}\n\nOutputLine.prototype.clone_empty = function() {\n  var line = new OutputLine(this.__parent);\n  line.set_indent(this.__indent_count, this.__alignment_count);\n  return line;\n};\n\nOutputLine.prototype.item = function(index) {\n  if (index < 0) {\n    return this.__items[this.__items.length + index];\n  } else {\n    return this.__items[index];\n  }\n};\n\nOutputLine.prototype.has_match = function(pattern) {\n  for (var lastCheckedOutput = this.__items.length - 1; lastCheckedOutput >= 0; lastCheckedOutput--) {\n    if (this.__items[lastCheckedOutput].match(pattern)) {\n      return true;\n    }\n  }\n  return false;\n};\n\nOutputLine.prototype.set_indent = function(indent, alignment) {\n  if (this.is_empty()) {\n    this.__indent_count = indent || 0;\n    this.__alignment_count = alignment || 0;\n    this.__character_count = this.__parent.get_indent_size(this.__indent_count, this.__alignment_count);\n  }\n};\n\nOutputLine.prototype._set_wrap_point = function() {\n  if (this.__parent.wrap_line_length) {\n    this.__wrap_point_index = this.__items.length;\n    this.__wrap_point_character_count = this.__character_count;\n    this.__wrap_point_indent_count = this.__parent.next_line.__indent_count;\n    this.__wrap_point_alignment_count = this.__parent.next_line.__alignment_count;\n  }\n};\n\nOutputLine.prototype._should_wrap = function() {\n  return this.__wrap_point_index &&\n    this.__character_count > this.__parent.wrap_line_length &&\n    this.__wrap_point_character_count > this.__parent.next_line.__character_count;\n};\n\nOutputLine.prototype._allow_wrap = function() {\n  if (this._should_wrap()) {\n    this.__parent.add_new_line();\n    var next = this.__parent.current_line;\n    next.set_indent(this.__wrap_point_indent_count, this.__wrap_point_alignment_count);\n    next.__items = this.__items.slice(this.__wrap_point_index);\n    this.__items = this.__items.slice(0, this.__wrap_point_index);\n\n    next.__character_count += this.__character_count - this.__wrap_point_character_count;\n    this.__character_count = this.__wrap_point_character_count;\n\n    if (next.__items[0] === \" \") {\n      next.__items.splice(0, 1);\n      next.__character_count -= 1;\n    }\n    return true;\n  }\n  return false;\n};\n\nOutputLine.prototype.is_empty = function() {\n  return this.__items.length === 0;\n};\n\nOutputLine.prototype.last = function() {\n  if (!this.is_empty()) {\n    return this.__items[this.__items.length - 1];\n  } else {\n    return null;\n  }\n};\n\nOutputLine.prototype.push = function(item) {\n  this.__items.push(item);\n  var last_newline_index = item.lastIndexOf('\\n');\n  if (last_newline_index !== -1) {\n    this.__character_count = item.length - last_newline_index;\n  } else {\n    this.__character_count += item.length;\n  }\n};\n\nOutputLine.prototype.pop = function() {\n  var item = null;\n  if (!this.is_empty()) {\n    item = this.__items.pop();\n    this.__character_count -= item.length;\n  }\n  return item;\n};\n\n\nOutputLine.prototype._remove_indent = function() {\n  if (this.__indent_count > 0) {\n    this.__indent_count -= 1;\n    this.__character_count -= this.__parent.indent_size;\n  }\n};\n\nOutputLine.prototype._remove_wrap_indent = function() {\n  if (this.__wrap_point_indent_count > 0) {\n    this.__wrap_point_indent_count -= 1;\n  }\n};\nOutputLine.prototype.trim = function() {\n  while (this.last() === ' ') {\n    this.__items.pop();\n    this.__character_count -= 1;\n  }\n};\n\nOutputLine.prototype.toString = function() {\n  var result = '';\n  if (this.is_empty()) {\n    if (this.__parent.indent_empty_lines) {\n      result = this.__parent.get_indent_string(this.__indent_count);\n    }\n  } else {\n    result = this.__parent.get_indent_string(this.__indent_count, this.__alignment_count);\n    result += this.__items.join('');\n  }\n  return result;\n};\n\nfunction IndentStringCache(options, baseIndentString) {\n  this.__cache = [''];\n  this.__indent_size = options.indent_size;\n  this.__indent_string = options.indent_char;\n  if (!options.indent_with_tabs) {\n    this.__indent_string = new Array(options.indent_size + 1).join(options.indent_char);\n  }\n\n  // Set to null to continue support for auto detection of base indent\n  baseIndentString = baseIndentString || '';\n  if (options.indent_level > 0) {\n    baseIndentString = new Array(options.indent_level + 1).join(this.__indent_string);\n  }\n\n  this.__base_string = baseIndentString;\n  this.__base_string_length = baseIndentString.length;\n}\n\nIndentStringCache.prototype.get_indent_size = function(indent, column) {\n  var result = this.__base_string_length;\n  column = column || 0;\n  if (indent < 0) {\n    result = 0;\n  }\n  result += indent * this.__indent_size;\n  result += column;\n  return result;\n};\n\nIndentStringCache.prototype.get_indent_string = function(indent_level, column) {\n  var result = this.__base_string;\n  column = column || 0;\n  if (indent_level < 0) {\n    indent_level = 0;\n    result = '';\n  }\n  column += indent_level * this.__indent_size;\n  this.__ensure_cache(column);\n  result += this.__cache[column];\n  return result;\n};\n\nIndentStringCache.prototype.__ensure_cache = function(column) {\n  while (column >= this.__cache.length) {\n    this.__add_column();\n  }\n};\n\nIndentStringCache.prototype.__add_column = function() {\n  var column = this.__cache.length;\n  var indent = 0;\n  var result = '';\n  if (this.__indent_size && column >= this.__indent_size) {\n    indent = Math.floor(column / this.__indent_size);\n    column -= indent * this.__indent_size;\n    result = new Array(indent + 1).join(this.__indent_string);\n  }\n  if (column) {\n    result += new Array(column + 1).join(' ');\n  }\n\n  this.__cache.push(result);\n};\n\nfunction Output(options, baseIndentString) {\n  this.__indent_cache = new IndentStringCache(options, baseIndentString);\n  this.raw = false;\n  this._end_with_newline = options.end_with_newline;\n  this.indent_size = options.indent_size;\n  this.wrap_line_length = options.wrap_line_length;\n  this.indent_empty_lines = options.indent_empty_lines;\n  this.__lines = [];\n  this.previous_line = null;\n  this.current_line = null;\n  this.next_line = new OutputLine(this);\n  this.space_before_token = false;\n  this.non_breaking_space = false;\n  this.previous_token_wrapped = false;\n  // initialize\n  this.__add_outputline();\n}\n\nOutput.prototype.__add_outputline = function() {\n  this.previous_line = this.current_line;\n  this.current_line = this.next_line.clone_empty();\n  this.__lines.push(this.current_line);\n};\n\nOutput.prototype.get_line_number = function() {\n  return this.__lines.length;\n};\n\nOutput.prototype.get_indent_string = function(indent, column) {\n  return this.__indent_cache.get_indent_string(indent, column);\n};\n\nOutput.prototype.get_indent_size = function(indent, column) {\n  return this.__indent_cache.get_indent_size(indent, column);\n};\n\nOutput.prototype.is_empty = function() {\n  return !this.previous_line && this.current_line.is_empty();\n};\n\nOutput.prototype.add_new_line = function(force_newline) {\n  // never newline at the start of file\n  // otherwise, newline only if we didn't just add one or we're forced\n  if (this.is_empty() ||\n    (!force_newline && this.just_added_newline())) {\n    return false;\n  }\n\n  // if raw output is enabled, don't print additional newlines,\n  // but still return True as though you had\n  if (!this.raw) {\n    this.__add_outputline();\n  }\n  return true;\n};\n\nOutput.prototype.get_code = function(eol) {\n  this.trim(true);\n\n  // handle some edge cases where the last tokens\n  // has text that ends with newline(s)\n  var last_item = this.current_line.pop();\n  if (last_item) {\n    if (last_item[last_item.length - 1] === '\\n') {\n      last_item = last_item.replace(/\\n+$/g, '');\n    }\n    this.current_line.push(last_item);\n  }\n\n  if (this._end_with_newline) {\n    this.__add_outputline();\n  }\n\n  var sweet_code = this.__lines.join('\\n');\n\n  if (eol !== '\\n') {\n    sweet_code = sweet_code.replace(/[\\n]/g, eol);\n  }\n  return sweet_code;\n};\n\nOutput.prototype.set_wrap_point = function() {\n  this.current_line._set_wrap_point();\n};\n\nOutput.prototype.set_indent = function(indent, alignment) {\n  indent = indent || 0;\n  alignment = alignment || 0;\n\n  // Next line stores alignment values\n  this.next_line.set_indent(indent, alignment);\n\n  // Never indent your first output indent at the start of the file\n  if (this.__lines.length > 1) {\n    this.current_line.set_indent(indent, alignment);\n    return true;\n  }\n\n  this.current_line.set_indent();\n  return false;\n};\n\nOutput.prototype.add_raw_token = function(token) {\n  for (var x = 0; x < token.newlines; x++) {\n    this.__add_outputline();\n  }\n  this.current_line.set_indent(-1);\n  this.current_line.push(token.whitespace_before);\n  this.current_line.push(token.text);\n  this.space_before_token = false;\n  this.non_breaking_space = false;\n  this.previous_token_wrapped = false;\n};\n\nOutput.prototype.add_token = function(printable_token) {\n  this.__add_space_before_token();\n  this.current_line.push(printable_token);\n  this.space_before_token = false;\n  this.non_breaking_space = false;\n  this.previous_token_wrapped = this.current_line._allow_wrap();\n};\n\nOutput.prototype.__add_space_before_token = function() {\n  if (this.space_before_token && !this.just_added_newline()) {\n    if (!this.non_breaking_space) {\n      this.set_wrap_point();\n    }\n    this.current_line.push(' ');\n  }\n};\n\nOutput.prototype.remove_indent = function(index) {\n  var output_length = this.__lines.length;\n  while (index < output_length) {\n    this.__lines[index]._remove_indent();\n    index++;\n  }\n  this.current_line._remove_wrap_indent();\n};\n\nOutput.prototype.trim = function(eat_newlines) {\n  eat_newlines = (eat_newlines === undefined) ? false : eat_newlines;\n\n  this.current_line.trim();\n\n  while (eat_newlines && this.__lines.length > 1 &&\n    this.current_line.is_empty()) {\n    this.__lines.pop();\n    this.current_line = this.__lines[this.__lines.length - 1];\n    this.current_line.trim();\n  }\n\n  this.previous_line = this.__lines.length > 1 ?\n    this.__lines[this.__lines.length - 2] : null;\n};\n\nOutput.prototype.just_added_newline = function() {\n  return this.current_line.is_empty();\n};\n\nOutput.prototype.just_added_blankline = function() {\n  return this.is_empty() ||\n    (this.current_line.is_empty() && this.previous_line.is_empty());\n};\n\nOutput.prototype.ensure_empty_line_above = function(starts_with, ends_with) {\n  var index = this.__lines.length - 2;\n  while (index >= 0) {\n    var potentialEmptyLine = this.__lines[index];\n    if (potentialEmptyLine.is_empty()) {\n      break;\n    } else if (potentialEmptyLine.item(0).indexOf(starts_with) !== 0 &&\n      potentialEmptyLine.item(-1) !== ends_with) {\n      this.__lines.splice(index + 1, 0, new OutputLine(this));\n      this.previous_line = this.__lines[this.__lines.length - 2];\n      break;\n    }\n    index--;\n  }\n};\n\nmodule.exports.Output = Output;\n"
  },
  {
    "path": "js/src/core/pattern.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nfunction Pattern(input_scanner, parent) {\n  this._input = input_scanner;\n  this._starting_pattern = null;\n  this._match_pattern = null;\n  this._until_pattern = null;\n  this._until_after = false;\n\n  if (parent) {\n    this._starting_pattern = this._input.get_regexp(parent._starting_pattern, true);\n    this._match_pattern = this._input.get_regexp(parent._match_pattern, true);\n    this._until_pattern = this._input.get_regexp(parent._until_pattern);\n    this._until_after = parent._until_after;\n  }\n}\n\nPattern.prototype.read = function() {\n  var result = this._input.read(this._starting_pattern);\n  if (!this._starting_pattern || result) {\n    result += this._input.read(this._match_pattern, this._until_pattern, this._until_after);\n  }\n  return result;\n};\n\nPattern.prototype.read_match = function() {\n  return this._input.match(this._match_pattern);\n};\n\nPattern.prototype.until_after = function(pattern) {\n  var result = this._create();\n  result._until_after = true;\n  result._until_pattern = this._input.get_regexp(pattern);\n  result._update();\n  return result;\n};\n\nPattern.prototype.until = function(pattern) {\n  var result = this._create();\n  result._until_after = false;\n  result._until_pattern = this._input.get_regexp(pattern);\n  result._update();\n  return result;\n};\n\nPattern.prototype.starting_with = function(pattern) {\n  var result = this._create();\n  result._starting_pattern = this._input.get_regexp(pattern, true);\n  result._update();\n  return result;\n};\n\nPattern.prototype.matching = function(pattern) {\n  var result = this._create();\n  result._match_pattern = this._input.get_regexp(pattern, true);\n  result._update();\n  return result;\n};\n\nPattern.prototype._create = function() {\n  return new Pattern(this._input, this);\n};\n\nPattern.prototype._update = function() {};\n\nmodule.exports.Pattern = Pattern;\n"
  },
  {
    "path": "js/src/core/templatablepattern.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Pattern = require('./pattern').Pattern;\n\n\nvar template_names = {\n  django: false,\n  erb: false,\n  handlebars: false,\n  php: false,\n  smarty: false,\n  angular: false\n};\n\n// This lets templates appear anywhere we would do a readUntil\n// The cost is higher but it is pay to play.\nfunction TemplatablePattern(input_scanner, parent) {\n  Pattern.call(this, input_scanner, parent);\n  this.__template_pattern = null;\n  this._disabled = Object.assign({}, template_names);\n  this._excluded = Object.assign({}, template_names);\n\n  if (parent) {\n    this.__template_pattern = this._input.get_regexp(parent.__template_pattern);\n    this._excluded = Object.assign(this._excluded, parent._excluded);\n    this._disabled = Object.assign(this._disabled, parent._disabled);\n  }\n  var pattern = new Pattern(input_scanner);\n  this.__patterns = {\n    handlebars_comment: pattern.starting_with(/{{!--/).until_after(/--}}/),\n    handlebars_unescaped: pattern.starting_with(/{{{/).until_after(/}}}/),\n    handlebars: pattern.starting_with(/{{/).until_after(/}}/),\n    php: pattern.starting_with(/<\\?(?:[= ]|php)/).until_after(/\\?>/),\n    erb: pattern.starting_with(/<%[^%]/).until_after(/[^%]%>/),\n    // django coflicts with handlebars a bit.\n    django: pattern.starting_with(/{%/).until_after(/%}/),\n    django_value: pattern.starting_with(/{{/).until_after(/}}/),\n    django_comment: pattern.starting_with(/{#/).until_after(/#}/),\n    smarty: pattern.starting_with(/{(?=[^}{\\s\\n])/).until_after(/[^\\s\\n]}/),\n    smarty_comment: pattern.starting_with(/{\\*/).until_after(/\\*}/),\n    smarty_literal: pattern.starting_with(/{literal}/).until_after(/{\\/literal}/)\n  };\n}\nTemplatablePattern.prototype = new Pattern();\n\nTemplatablePattern.prototype._create = function() {\n  return new TemplatablePattern(this._input, this);\n};\n\nTemplatablePattern.prototype._update = function() {\n  this.__set_templated_pattern();\n};\n\nTemplatablePattern.prototype.disable = function(language) {\n  var result = this._create();\n  result._disabled[language] = true;\n  result._update();\n  return result;\n};\n\nTemplatablePattern.prototype.read_options = function(options) {\n  var result = this._create();\n  for (var language in template_names) {\n    result._disabled[language] = options.templating.indexOf(language) === -1;\n  }\n  result._update();\n  return result;\n};\n\nTemplatablePattern.prototype.exclude = function(language) {\n  var result = this._create();\n  result._excluded[language] = true;\n  result._update();\n  return result;\n};\n\nTemplatablePattern.prototype.read = function() {\n  var result = '';\n  if (this._match_pattern) {\n    result = this._input.read(this._starting_pattern);\n  } else {\n    result = this._input.read(this._starting_pattern, this.__template_pattern);\n  }\n  var next = this._read_template();\n  while (next) {\n    if (this._match_pattern) {\n      next += this._input.read(this._match_pattern);\n    } else {\n      next += this._input.readUntil(this.__template_pattern);\n    }\n    result += next;\n    next = this._read_template();\n  }\n\n  if (this._until_after) {\n    result += this._input.readUntilAfter(this._until_pattern);\n  }\n  return result;\n};\n\nTemplatablePattern.prototype.__set_templated_pattern = function() {\n  var items = [];\n\n  if (!this._disabled.php) {\n    items.push(this.__patterns.php._starting_pattern.source);\n  }\n  if (!this._disabled.handlebars) {\n    items.push(this.__patterns.handlebars._starting_pattern.source);\n  }\n  if (!this._disabled.angular) {\n    // Handlebars ('{{' and '}}') are also special tokens in Angular)\n    items.push(this.__patterns.handlebars._starting_pattern.source);\n  }\n  if (!this._disabled.erb) {\n    items.push(this.__patterns.erb._starting_pattern.source);\n  }\n  if (!this._disabled.django) {\n    items.push(this.__patterns.django._starting_pattern.source);\n    // The starting pattern for django is more complex because it has different\n    // patterns for value, comment, and other sections\n    items.push(this.__patterns.django_value._starting_pattern.source);\n    items.push(this.__patterns.django_comment._starting_pattern.source);\n  }\n  if (!this._disabled.smarty) {\n    items.push(this.__patterns.smarty._starting_pattern.source);\n  }\n\n  if (this._until_pattern) {\n    items.push(this._until_pattern.source);\n  }\n  this.__template_pattern = this._input.get_regexp('(?:' + items.join('|') + ')');\n};\n\nTemplatablePattern.prototype._read_template = function() {\n  var resulting_string = '';\n  var c = this._input.peek();\n  if (c === '<') {\n    var peek1 = this._input.peek(1);\n    //if we're in a comment, do something special\n    // We treat all comments as literals, even more than preformatted tags\n    // we just look for the appropriate close tag\n    if (!this._disabled.php && !this._excluded.php && peek1 === '?') {\n      resulting_string = resulting_string ||\n        this.__patterns.php.read();\n    }\n    if (!this._disabled.erb && !this._excluded.erb && peek1 === '%') {\n      resulting_string = resulting_string ||\n        this.__patterns.erb.read();\n    }\n  } else if (c === '{') {\n    if (!this._disabled.handlebars && !this._excluded.handlebars) {\n      resulting_string = resulting_string ||\n        this.__patterns.handlebars_comment.read();\n      resulting_string = resulting_string ||\n        this.__patterns.handlebars_unescaped.read();\n      resulting_string = resulting_string ||\n        this.__patterns.handlebars.read();\n    }\n    if (!this._disabled.django) {\n      // django coflicts with handlebars a bit.\n      if (!this._excluded.django && !this._excluded.handlebars) {\n        resulting_string = resulting_string ||\n          this.__patterns.django_value.read();\n      }\n      if (!this._excluded.django) {\n        resulting_string = resulting_string ||\n          this.__patterns.django_comment.read();\n        resulting_string = resulting_string ||\n          this.__patterns.django.read();\n      }\n    }\n    if (!this._disabled.smarty) {\n      // smarty cannot be enabled with django or handlebars enabled\n      if (this._disabled.django && this._disabled.handlebars) {\n        resulting_string = resulting_string ||\n          this.__patterns.smarty_comment.read();\n        resulting_string = resulting_string ||\n          this.__patterns.smarty_literal.read();\n        resulting_string = resulting_string ||\n          this.__patterns.smarty.read();\n      }\n    }\n  }\n  return resulting_string;\n};\n\n\nmodule.exports.TemplatablePattern = TemplatablePattern;\n"
  },
  {
    "path": "js/src/core/token.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nfunction Token(type, text, newlines, whitespace_before) {\n  this.type = type;\n  this.text = text;\n\n  // comments_before are\n  // comments that have a new line before them\n  // and may or may not have a newline after\n  // this is a set of comments before\n  this.comments_before = null; /* inline comment*/\n\n\n  // this.comments_after =  new TokenStream(); // no new line before and newline after\n  this.newlines = newlines || 0;\n  this.whitespace_before = whitespace_before || '';\n  this.parent = null;\n  this.next = null;\n  this.previous = null;\n  this.opened = null;\n  this.closed = null;\n  this.directives = null;\n}\n\n\nmodule.exports.Token = Token;\n"
  },
  {
    "path": "js/src/core/tokenizer.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar InputScanner = require('../core/inputscanner').InputScanner;\nvar Token = require('../core/token').Token;\nvar TokenStream = require('../core/tokenstream').TokenStream;\nvar WhitespacePattern = require('./whitespacepattern').WhitespacePattern;\n\nvar TOKEN = {\n  START: 'TK_START',\n  RAW: 'TK_RAW',\n  EOF: 'TK_EOF'\n};\n\nvar Tokenizer = function(input_string, options) {\n  this._input = new InputScanner(input_string);\n  this._options = options || {};\n  this.__tokens = null;\n\n  this._patterns = {};\n  this._patterns.whitespace = new WhitespacePattern(this._input);\n};\n\nTokenizer.prototype.tokenize = function() {\n  this._input.restart();\n  this.__tokens = new TokenStream();\n\n  this._reset();\n\n  var current;\n  var previous = new Token(TOKEN.START, '');\n  var open_token = null;\n  var open_stack = [];\n  var comments = new TokenStream();\n\n  while (previous.type !== TOKEN.EOF) {\n    current = this._get_next_token(previous, open_token);\n    while (this._is_comment(current)) {\n      comments.add(current);\n      current = this._get_next_token(previous, open_token);\n    }\n\n    if (!comments.isEmpty()) {\n      current.comments_before = comments;\n      comments = new TokenStream();\n    }\n\n    current.parent = open_token;\n\n    if (this._is_opening(current)) {\n      open_stack.push(open_token);\n      open_token = current;\n    } else if (open_token && this._is_closing(current, open_token)) {\n      current.opened = open_token;\n      open_token.closed = current;\n      open_token = open_stack.pop();\n      current.parent = open_token;\n    }\n\n    current.previous = previous;\n    previous.next = current;\n\n    this.__tokens.add(current);\n    previous = current;\n  }\n\n  return this.__tokens;\n};\n\n\nTokenizer.prototype._is_first_token = function() {\n  return this.__tokens.isEmpty();\n};\n\nTokenizer.prototype._reset = function() {};\n\nTokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false\n  this._readWhitespace();\n  var resulting_string = this._input.read(/.+/g);\n  if (resulting_string) {\n    return this._create_token(TOKEN.RAW, resulting_string);\n  } else {\n    return this._create_token(TOKEN.EOF, '');\n  }\n};\n\nTokenizer.prototype._is_comment = function(current_token) { // jshint unused:false\n  return false;\n};\n\nTokenizer.prototype._is_opening = function(current_token) { // jshint unused:false\n  return false;\n};\n\nTokenizer.prototype._is_closing = function(current_token, open_token) { // jshint unused:false\n  return false;\n};\n\nTokenizer.prototype._create_token = function(type, text) {\n  var token = new Token(type, text,\n    this._patterns.whitespace.newline_count,\n    this._patterns.whitespace.whitespace_before_token);\n  return token;\n};\n\nTokenizer.prototype._readWhitespace = function() {\n  return this._patterns.whitespace.read();\n};\n\n\n\nmodule.exports.Tokenizer = Tokenizer;\nmodule.exports.TOKEN = TOKEN;\n"
  },
  {
    "path": "js/src/core/tokenstream.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nfunction TokenStream(parent_token) {\n  // private\n  this.__tokens = [];\n  this.__tokens_length = this.__tokens.length;\n  this.__position = 0;\n  this.__parent_token = parent_token;\n}\n\nTokenStream.prototype.restart = function() {\n  this.__position = 0;\n};\n\nTokenStream.prototype.isEmpty = function() {\n  return this.__tokens_length === 0;\n};\n\nTokenStream.prototype.hasNext = function() {\n  return this.__position < this.__tokens_length;\n};\n\nTokenStream.prototype.next = function() {\n  var val = null;\n  if (this.hasNext()) {\n    val = this.__tokens[this.__position];\n    this.__position += 1;\n  }\n  return val;\n};\n\nTokenStream.prototype.peek = function(index) {\n  var val = null;\n  index = index || 0;\n  index += this.__position;\n  if (index >= 0 && index < this.__tokens_length) {\n    val = this.__tokens[index];\n  }\n  return val;\n};\n\nTokenStream.prototype.add = function(token) {\n  if (this.__parent_token) {\n    token.parent = this.__parent_token;\n  }\n  this.__tokens.push(token);\n  this.__tokens_length += 1;\n};\n\nmodule.exports.TokenStream = TokenStream;\n"
  },
  {
    "path": "js/src/core/whitespacepattern.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Pattern = require('../core/pattern').Pattern;\n\nfunction WhitespacePattern(input_scanner, parent) {\n  Pattern.call(this, input_scanner, parent);\n  if (parent) {\n    this._line_regexp = this._input.get_regexp(parent._line_regexp);\n  } else {\n    this.__set_whitespace_patterns('', '');\n  }\n\n  this.newline_count = 0;\n  this.whitespace_before_token = '';\n}\nWhitespacePattern.prototype = new Pattern();\n\nWhitespacePattern.prototype.__set_whitespace_patterns = function(whitespace_chars, newline_chars) {\n  whitespace_chars += '\\\\t ';\n  newline_chars += '\\\\n\\\\r';\n\n  this._match_pattern = this._input.get_regexp(\n    '[' + whitespace_chars + newline_chars + ']+', true);\n  this._newline_regexp = this._input.get_regexp(\n    '\\\\r\\\\n|[' + newline_chars + ']');\n};\n\nWhitespacePattern.prototype.read = function() {\n  this.newline_count = 0;\n  this.whitespace_before_token = '';\n\n  var resulting_string = this._input.read(this._match_pattern);\n  if (resulting_string === ' ') {\n    this.whitespace_before_token = ' ';\n  } else if (resulting_string) {\n    var matches = this.__split(this._newline_regexp, resulting_string);\n    this.newline_count = matches.length - 1;\n    this.whitespace_before_token = matches[this.newline_count];\n  }\n\n  return resulting_string;\n};\n\nWhitespacePattern.prototype.matching = function(whitespace_chars, newline_chars) {\n  var result = this._create();\n  result.__set_whitespace_patterns(whitespace_chars, newline_chars);\n  result._update();\n  return result;\n};\n\nWhitespacePattern.prototype._create = function() {\n  return new WhitespacePattern(this._input, this);\n};\n\nWhitespacePattern.prototype.__split = function(regexp, input_string) {\n  regexp.lastIndex = 0;\n  var start_index = 0;\n  var result = [];\n  var next_match = regexp.exec(input_string);\n  while (next_match) {\n    result.push(input_string.substring(start_index, next_match.index));\n    start_index = next_match.index + next_match[0].length;\n    next_match = regexp.exec(input_string);\n  }\n\n  if (start_index < input_string.length) {\n    result.push(input_string.substring(start_index, input_string.length));\n  } else {\n    result.push('');\n  }\n\n  return result;\n};\n\n\n\nmodule.exports.WhitespacePattern = WhitespacePattern;\n"
  },
  {
    "path": "js/src/css/beautifier.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Options = require('./options').Options;\nvar Output = require('../core/output').Output;\nvar InputScanner = require('../core/inputscanner').InputScanner;\nvar Directives = require('../core/directives').Directives;\n\nvar directives_core = new Directives(/\\/\\*/, /\\*\\//);\n\nvar lineBreak = /\\r\\n|[\\r\\n]/;\nvar allLineBreaks = /\\r\\n|[\\r\\n]/g;\n\n// tokenizer\nvar whitespaceChar = /\\s/;\nvar whitespacePattern = /(?:\\s|\\n)+/g;\nvar block_comment_pattern = /\\/\\*(?:[\\s\\S]*?)((?:\\*\\/)|$)/g;\nvar comment_pattern = /\\/\\/(?:[^\\n\\r\\u2028\\u2029]*)/g;\n\nfunction Beautifier(source_text, options) {\n  this._source_text = source_text || '';\n  // Allow the setting of language/file-type specific options\n  // with inheritance of overall settings\n  this._options = new Options(options);\n  this._ch = null;\n  this._input = null;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule\n  this.NESTED_AT_RULE = {\n    \"page\": true,\n    \"font-face\": true,\n    \"keyframes\": true,\n    // also in CONDITIONAL_GROUP_RULE below\n    \"media\": true,\n    \"supports\": true,\n    \"document\": true\n  };\n  this.CONDITIONAL_GROUP_RULE = {\n    \"media\": true,\n    \"supports\": true,\n    \"document\": true\n  };\n  this.NON_SEMICOLON_NEWLINE_PROPERTY = [\n    \"grid-template-areas\",\n    \"grid-template\"\n  ];\n\n}\n\nBeautifier.prototype.eatString = function(endChars) {\n  var result = '';\n  this._ch = this._input.next();\n  while (this._ch) {\n    result += this._ch;\n    if (this._ch === \"\\\\\") {\n      result += this._input.next();\n    } else if (endChars.indexOf(this._ch) !== -1 || this._ch === \"\\n\") {\n      break;\n    }\n    this._ch = this._input.next();\n  }\n  return result;\n};\n\n// Skips any white space in the source text from the current position.\n// When allowAtLeastOneNewLine is true, will output new lines for each\n// newline character found; if the user has preserve_newlines off, only\n// the first newline will be output\nBeautifier.prototype.eatWhitespace = function(allowAtLeastOneNewLine) {\n  var result = whitespaceChar.test(this._input.peek());\n  var newline_count = 0;\n  while (whitespaceChar.test(this._input.peek())) {\n    this._ch = this._input.next();\n    if (allowAtLeastOneNewLine && this._ch === '\\n') {\n      if (newline_count === 0 || newline_count < this._options.max_preserve_newlines) {\n        newline_count++;\n        this._output.add_new_line(true);\n      }\n    }\n  }\n  return result;\n};\n\n// Nested pseudo-class if we are insideRule\n// and the next special character found opens\n// a new block\nBeautifier.prototype.foundNestedPseudoClass = function() {\n  var openParen = 0;\n  var i = 1;\n  var ch = this._input.peek(i);\n  while (ch) {\n    if (ch === \"{\") {\n      return true;\n    } else if (ch === '(') {\n      // pseudoclasses can contain ()\n      openParen += 1;\n    } else if (ch === ')') {\n      if (openParen === 0) {\n        return false;\n      }\n      openParen -= 1;\n    } else if (ch === \";\" || ch === \"}\") {\n      return false;\n    }\n    i++;\n    ch = this._input.peek(i);\n  }\n  return false;\n};\n\nBeautifier.prototype.print_string = function(output_string) {\n  this._output.set_indent(this._indentLevel);\n  this._output.non_breaking_space = true;\n  this._output.add_token(output_string);\n};\n\nBeautifier.prototype.preserveSingleSpace = function(isAfterSpace) {\n  if (isAfterSpace) {\n    this._output.space_before_token = true;\n  }\n};\n\nBeautifier.prototype.indent = function() {\n  this._indentLevel++;\n};\n\nBeautifier.prototype.outdent = function() {\n  if (this._indentLevel > 0) {\n    this._indentLevel--;\n  }\n};\n\n/*_____________________--------------------_____________________*/\n\nBeautifier.prototype.beautify = function() {\n  if (this._options.disabled) {\n    return this._source_text;\n  }\n\n  var source_text = this._source_text;\n  var eol = this._options.eol;\n  if (eol === 'auto') {\n    eol = '\\n';\n    if (source_text && lineBreak.test(source_text || '')) {\n      eol = source_text.match(lineBreak)[0];\n    }\n  }\n\n\n  // HACK: newline parsing inconsistent. This brute force normalizes the this._input.\n  source_text = source_text.replace(allLineBreaks, '\\n');\n\n  // reset\n  var baseIndentString = source_text.match(/^[\\t ]*/)[0];\n\n  this._output = new Output(this._options, baseIndentString);\n  this._input = new InputScanner(source_text);\n  this._indentLevel = 0;\n  this._nestedLevel = 0;\n\n  this._ch = null;\n  var parenLevel = 0;\n\n  var insideRule = false;\n  // This is the value side of a property value pair (blue in the following ex)\n  // label { content: blue }\n  var insidePropertyValue = false;\n  var enteringConditionalGroup = false;\n  var insideNonNestedAtRule = false;\n  var insideScssMap = false;\n  var topCharacter = this._ch;\n  var insideNonSemiColonValues = false;\n  var whitespace;\n  var isAfterSpace;\n  var previous_ch;\n\n  while (true) {\n    whitespace = this._input.read(whitespacePattern);\n    isAfterSpace = whitespace !== '';\n    previous_ch = topCharacter;\n    this._ch = this._input.next();\n    if (this._ch === '\\\\' && this._input.hasNext()) {\n      this._ch += this._input.next();\n    }\n    topCharacter = this._ch;\n\n    if (!this._ch) {\n      break;\n    } else if (this._ch === '/' && this._input.peek() === '*') {\n      // /* css comment */\n      // Always start block comments on a new line.\n      // This handles scenarios where a block comment immediately\n      // follows a property definition on the same line or where\n      // minified code is being beautified.\n      this._output.add_new_line();\n      this._input.back();\n\n      var comment = this._input.read(block_comment_pattern);\n\n      // Handle ignore directive\n      var directives = directives_core.get_directives(comment);\n      if (directives && directives.ignore === 'start') {\n        comment += directives_core.readIgnored(this._input);\n      }\n\n      this.print_string(comment);\n\n      // Ensures any new lines following the comment are preserved\n      this.eatWhitespace(true);\n\n      // Block comments are followed by a new line so they don't\n      // share a line with other properties\n      this._output.add_new_line();\n    } else if (this._ch === '/' && this._input.peek() === '/') {\n      // // single line comment\n      // Preserves the space before a comment\n      // on the same line as a rule\n      this._output.space_before_token = true;\n      this._input.back();\n      this.print_string(this._input.read(comment_pattern));\n\n      // Ensures any new lines following the comment are preserved\n      this.eatWhitespace(true);\n    } else if (this._ch === '$') {\n      this.preserveSingleSpace(isAfterSpace);\n\n      this.print_string(this._ch);\n\n      // strip trailing space, if present, for hash property checks\n      var variable = this._input.peekUntilAfter(/[: ,;{}()[\\]\\/='\"]/g);\n\n      if (variable.match(/[ :]$/)) {\n        // we have a variable or pseudo-class, add it and insert one space before continuing\n        variable = this.eatString(\": \").replace(/\\s+$/, '');\n        this.print_string(variable);\n        this._output.space_before_token = true;\n      }\n\n      // might be sass variable\n      if (parenLevel === 0 && variable.indexOf(':') !== -1) {\n        insidePropertyValue = true;\n        this.indent();\n      }\n    } else if (this._ch === '@') {\n      this.preserveSingleSpace(isAfterSpace);\n\n      // deal with less property mixins @{...}\n      if (this._input.peek() === '{') {\n        this.print_string(this._ch + this.eatString('}'));\n      } else {\n        this.print_string(this._ch);\n\n        // strip trailing space, if present, for hash property checks\n        var variableOrRule = this._input.peekUntilAfter(/[: ,;{}()[\\]\\/='\"]/g);\n\n        if (variableOrRule.match(/[ :]$/)) {\n          // we have a variable or pseudo-class, add it and insert one space before continuing\n          variableOrRule = this.eatString(\": \").replace(/\\s+$/, '');\n          this.print_string(variableOrRule);\n          this._output.space_before_token = true;\n        }\n\n        // might be less variable\n        if (parenLevel === 0 && variableOrRule.indexOf(':') !== -1) {\n          insidePropertyValue = true;\n          this.indent();\n\n          // might be a nesting at-rule\n        } else if (variableOrRule in this.NESTED_AT_RULE) {\n          this._nestedLevel += 1;\n          if (variableOrRule in this.CONDITIONAL_GROUP_RULE) {\n            enteringConditionalGroup = true;\n          }\n\n          // might be a non-nested at-rule\n        } else if (parenLevel === 0 && !insidePropertyValue) {\n          insideNonNestedAtRule = true;\n        }\n      }\n    } else if (this._ch === '#' && this._input.peek() === '{') {\n      this.preserveSingleSpace(isAfterSpace);\n      this.print_string(this._ch + this.eatString('}'));\n    } else if (this._ch === '{') {\n      if (insidePropertyValue) {\n        insidePropertyValue = false;\n        this.outdent();\n      }\n\n      // non nested at rule becomes nested\n      insideNonNestedAtRule = false;\n\n      // when entering conditional groups, only rulesets are allowed\n      if (enteringConditionalGroup) {\n        enteringConditionalGroup = false;\n        insideRule = (this._indentLevel >= this._nestedLevel);\n      } else {\n        // otherwise, declarations are also allowed\n        insideRule = (this._indentLevel >= this._nestedLevel - 1);\n      }\n      if (this._options.newline_between_rules && insideRule) {\n        if (this._output.previous_line && this._output.previous_line.item(-1) !== '{') {\n          this._output.ensure_empty_line_above('/', ',');\n        }\n      }\n\n      this._output.space_before_token = true;\n\n      // The difference in print_string and indent order is necessary to indent the '{' correctly\n      if (this._options.brace_style === 'expand') {\n        this._output.add_new_line();\n        this.print_string(this._ch);\n        this.indent();\n        this._output.set_indent(this._indentLevel);\n      } else {\n        // inside mixin and first param is object\n        if (previous_ch === '(') {\n          this._output.space_before_token = false;\n        } else if (previous_ch !== ',') {\n          this.indent();\n        }\n        this.print_string(this._ch);\n      }\n\n      this.eatWhitespace(true);\n      this._output.add_new_line();\n    } else if (this._ch === '}') {\n      this.outdent();\n      this._output.add_new_line();\n      if (previous_ch === '{') {\n        this._output.trim(true);\n      }\n\n      if (insidePropertyValue) {\n        this.outdent();\n        insidePropertyValue = false;\n      }\n      this.print_string(this._ch);\n      insideRule = false;\n      if (this._nestedLevel) {\n        this._nestedLevel--;\n      }\n\n      this.eatWhitespace(true);\n      this._output.add_new_line();\n\n      if (this._options.newline_between_rules && !this._output.just_added_blankline()) {\n        if (this._input.peek() !== '}') {\n          this._output.add_new_line(true);\n        }\n      }\n      if (this._input.peek() === ')') {\n        this._output.trim(true);\n        if (this._options.brace_style === \"expand\") {\n          this._output.add_new_line(true);\n        }\n      }\n    } else if (this._ch === \":\") {\n\n      for (var i = 0; i < this.NON_SEMICOLON_NEWLINE_PROPERTY.length; i++) {\n        if (this._input.lookBack(this.NON_SEMICOLON_NEWLINE_PROPERTY[i])) {\n          insideNonSemiColonValues = true;\n          break;\n        }\n      }\n\n      if ((insideRule || enteringConditionalGroup) && !(this._input.lookBack(\"&\") || this.foundNestedPseudoClass()) && !this._input.lookBack(\"(\") && !insideNonNestedAtRule && parenLevel === 0) {\n        // 'property: value' delimiter\n        // which could be in a conditional group query\n\n        this.print_string(':');\n        if (!insidePropertyValue) {\n          insidePropertyValue = true;\n          this._output.space_before_token = true;\n          this.eatWhitespace(true);\n          this.indent();\n        }\n      } else {\n        // sass/less parent reference don't use a space\n        // sass nested pseudo-class don't use a space\n\n        // preserve space before pseudoclasses/pseudoelements, as it means \"in any child\"\n        if (this._input.lookBack(\" \")) {\n          this._output.space_before_token = true;\n        }\n        if (this._input.peek() === \":\") {\n          // pseudo-element\n          this._ch = this._input.next();\n          this.print_string(\"::\");\n        } else {\n          // pseudo-class\n          this.print_string(':');\n        }\n      }\n    } else if (this._ch === '\"' || this._ch === '\\'') {\n      var preserveQuoteSpace = previous_ch === '\"' || previous_ch === '\\'';\n      this.preserveSingleSpace(preserveQuoteSpace || isAfterSpace);\n      this.print_string(this._ch + this.eatString(this._ch));\n      this.eatWhitespace(true);\n    } else if (this._ch === ';') {\n      insideNonSemiColonValues = false;\n      if (parenLevel === 0) {\n        if (insidePropertyValue) {\n          this.outdent();\n          insidePropertyValue = false;\n        }\n        insideNonNestedAtRule = false;\n        this.print_string(this._ch);\n        this.eatWhitespace(true);\n\n        // This maintains single line comments on the same\n        // line. Block comments are also affected, but\n        // a new line is always output before one inside\n        // that section\n        if (this._input.peek() !== '/') {\n          this._output.add_new_line();\n        }\n      } else {\n        this.print_string(this._ch);\n        this.eatWhitespace(true);\n        this._output.space_before_token = true;\n      }\n    } else if (this._ch === '(') { // may be a url\n      if (this._input.lookBack(\"url\")) {\n        this.print_string(this._ch);\n        this.eatWhitespace();\n        parenLevel++;\n        this.indent();\n        this._ch = this._input.next();\n        if (this._ch === ')' || this._ch === '\"' || this._ch === '\\'') {\n          this._input.back();\n        } else if (this._ch) {\n          this.print_string(this._ch + this.eatString(')'));\n          if (parenLevel) {\n            parenLevel--;\n            this.outdent();\n          }\n        }\n      } else {\n        var space_needed = false;\n        if (this._input.lookBack(\"with\")) {\n          // look back is not an accurate solution, we need tokens to confirm without whitespaces\n          space_needed = true;\n        }\n        this.preserveSingleSpace(isAfterSpace || space_needed);\n        this.print_string(this._ch);\n\n        // handle scss/sass map\n        if (insidePropertyValue && previous_ch === \"$\" && this._options.selector_separator_newline) {\n          this._output.add_new_line();\n          insideScssMap = true;\n        } else {\n          this.eatWhitespace();\n          parenLevel++;\n          this.indent();\n        }\n      }\n    } else if (this._ch === ')') {\n      if (parenLevel) {\n        parenLevel--;\n        this.outdent();\n      }\n      if (insideScssMap && this._input.peek() === \";\" && this._options.selector_separator_newline) {\n        insideScssMap = false;\n        this.outdent();\n        this._output.add_new_line();\n      }\n      this.print_string(this._ch);\n    } else if (this._ch === ',') {\n      this.print_string(this._ch);\n      this.eatWhitespace(true);\n      if (this._options.selector_separator_newline && (!insidePropertyValue || insideScssMap) && parenLevel === 0 && !insideNonNestedAtRule) {\n        this._output.add_new_line();\n      } else {\n        this._output.space_before_token = true;\n      }\n    } else if ((this._ch === '>' || this._ch === '+' || this._ch === '~') && !insidePropertyValue && parenLevel === 0) {\n      //handle combinator spacing\n      if (this._options.space_around_combinator) {\n        this._output.space_before_token = true;\n        this.print_string(this._ch);\n        this._output.space_before_token = true;\n      } else {\n        this.print_string(this._ch);\n        this.eatWhitespace();\n        // squash extra whitespace\n        if (this._ch && whitespaceChar.test(this._ch)) {\n          this._ch = '';\n        }\n      }\n    } else if (this._ch === ']') {\n      this.print_string(this._ch);\n    } else if (this._ch === '[') {\n      this.preserveSingleSpace(isAfterSpace);\n      this.print_string(this._ch);\n    } else if (this._ch === '=') { // no whitespace before or after\n      this.eatWhitespace();\n      this.print_string('=');\n      if (whitespaceChar.test(this._ch)) {\n        this._ch = '';\n      }\n    } else if (this._ch === '!' && !this._input.lookBack(\"\\\\\")) { // !important\n      this._output.space_before_token = true;\n      this.print_string(this._ch);\n    } else {\n      var preserveAfterSpace = previous_ch === '\"' || previous_ch === '\\'';\n      this.preserveSingleSpace(preserveAfterSpace || isAfterSpace);\n      this.print_string(this._ch);\n\n      if (!this._output.just_added_newline() && this._input.peek() === '\\n' && insideNonSemiColonValues) {\n        this._output.add_new_line();\n      }\n    }\n  }\n\n  var sweetCode = this._output.get_code(eol);\n\n  return sweetCode;\n};\n\nmodule.exports.Beautifier = Beautifier;\n"
  },
  {
    "path": "js/src/css/index.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Beautifier = require('./beautifier').Beautifier,\n  Options = require('./options').Options;\n\nfunction css_beautify(source_text, options) {\n  var beautifier = new Beautifier(source_text, options);\n  return beautifier.beautify();\n}\n\nmodule.exports = css_beautify;\nmodule.exports.defaultOptions = function() {\n  return new Options();\n};\n"
  },
  {
    "path": "js/src/css/options.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseOptions = require('../core/options').Options;\n\nfunction Options(options) {\n  BaseOptions.call(this, options, 'css');\n\n  this.selector_separator_newline = this._get_boolean('selector_separator_newline', true);\n  this.newline_between_rules = this._get_boolean('newline_between_rules', true);\n  var space_around_selector_separator = this._get_boolean('space_around_selector_separator');\n  this.space_around_combinator = this._get_boolean('space_around_combinator') || space_around_selector_separator;\n\n  var brace_style_split = this._get_selection_list('brace_style', ['collapse', 'expand', 'end-expand', 'none', 'preserve-inline']);\n  this.brace_style = 'collapse';\n  for (var bs = 0; bs < brace_style_split.length; bs++) {\n    if (brace_style_split[bs] !== 'expand') {\n      // default to collapse, as only collapse|expand is implemented for now\n      this.brace_style = 'collapse';\n    } else {\n      this.brace_style = brace_style_split[bs];\n    }\n  }\n}\nOptions.prototype = new BaseOptions();\n\n\n\nmodule.exports.Options = Options;\n"
  },
  {
    "path": "js/src/css/tokenizer.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n"
  },
  {
    "path": "js/src/html/beautifier.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Options = require('../html/options').Options;\nvar Output = require('../core/output').Output;\nvar Tokenizer = require('../html/tokenizer').Tokenizer;\nvar TOKEN = require('../html/tokenizer').TOKEN;\n\nvar lineBreak = /\\r\\n|[\\r\\n]/;\nvar allLineBreaks = /\\r\\n|[\\r\\n]/g;\n\nvar Printer = function(options, base_indent_string) { //handles input/output and some other printing functions\n\n  this.indent_level = 0;\n  this.alignment_size = 0;\n  this.max_preserve_newlines = options.max_preserve_newlines;\n  this.preserve_newlines = options.preserve_newlines;\n\n  this._output = new Output(options, base_indent_string);\n\n};\n\nPrinter.prototype.current_line_has_match = function(pattern) {\n  return this._output.current_line.has_match(pattern);\n};\n\nPrinter.prototype.set_space_before_token = function(value, non_breaking) {\n  this._output.space_before_token = value;\n  this._output.non_breaking_space = non_breaking;\n};\n\nPrinter.prototype.set_wrap_point = function() {\n  this._output.set_indent(this.indent_level, this.alignment_size);\n  this._output.set_wrap_point();\n};\n\n\nPrinter.prototype.add_raw_token = function(token) {\n  this._output.add_raw_token(token);\n};\n\nPrinter.prototype.print_preserved_newlines = function(raw_token) {\n  var newlines = 0;\n  if (raw_token.type !== TOKEN.TEXT && raw_token.previous.type !== TOKEN.TEXT) {\n    newlines = raw_token.newlines ? 1 : 0;\n  }\n\n  if (this.preserve_newlines) {\n    newlines = raw_token.newlines < this.max_preserve_newlines + 1 ? raw_token.newlines : this.max_preserve_newlines + 1;\n  }\n  for (var n = 0; n < newlines; n++) {\n    this.print_newline(n > 0);\n  }\n\n  return newlines !== 0;\n};\n\nPrinter.prototype.traverse_whitespace = function(raw_token) {\n  if (raw_token.whitespace_before || raw_token.newlines) {\n    if (!this.print_preserved_newlines(raw_token)) {\n      this._output.space_before_token = true;\n    }\n    return true;\n  }\n  return false;\n};\n\nPrinter.prototype.previous_token_wrapped = function() {\n  return this._output.previous_token_wrapped;\n};\n\nPrinter.prototype.print_newline = function(force) {\n  this._output.add_new_line(force);\n};\n\nPrinter.prototype.print_token = function(token) {\n  if (token.text) {\n    this._output.set_indent(this.indent_level, this.alignment_size);\n    this._output.add_token(token.text);\n  }\n};\n\nPrinter.prototype.indent = function() {\n  this.indent_level++;\n};\n\nPrinter.prototype.deindent = function() {\n  if (this.indent_level > 0) {\n    this.indent_level--;\n    this._output.set_indent(this.indent_level, this.alignment_size);\n  }\n};\n\nPrinter.prototype.get_full_indent = function(level) {\n  level = this.indent_level + (level || 0);\n  if (level < 1) {\n    return '';\n  }\n\n  return this._output.get_indent_string(level);\n};\n\nvar get_type_attribute = function(start_token) {\n  var result = null;\n  var raw_token = start_token.next;\n\n  // Search attributes for a type attribute\n  while (raw_token.type !== TOKEN.EOF && start_token.closed !== raw_token) {\n    if (raw_token.type === TOKEN.ATTRIBUTE && raw_token.text === 'type') {\n      if (raw_token.next && raw_token.next.type === TOKEN.EQUALS &&\n        raw_token.next.next && raw_token.next.next.type === TOKEN.VALUE) {\n        result = raw_token.next.next.text;\n      }\n      break;\n    }\n    raw_token = raw_token.next;\n  }\n\n  return result;\n};\n\nvar get_custom_beautifier_name = function(tag_check, raw_token) {\n  var typeAttribute = null;\n  var result = null;\n\n  if (!raw_token.closed) {\n    return null;\n  }\n\n  if (tag_check === 'script') {\n    typeAttribute = 'text/javascript';\n  } else if (tag_check === 'style') {\n    typeAttribute = 'text/css';\n  }\n\n  typeAttribute = get_type_attribute(raw_token) || typeAttribute;\n\n  // For script and style tags that have a type attribute, only enable custom beautifiers for matching values\n  // For those without a type attribute use default;\n  if (typeAttribute.search('text/css') > -1) {\n    result = 'css';\n  } else if (typeAttribute.search(/module|((text|application|dojo)\\/(x-)?(javascript|ecmascript|jscript|livescript|(ld\\+)?json|method|aspect))/) > -1) {\n    result = 'javascript';\n  } else if (typeAttribute.search(/(text|application|dojo)\\/(x-)?(html)/) > -1) {\n    result = 'html';\n  } else if (typeAttribute.search(/test\\/null/) > -1) {\n    // Test only mime-type for testing the beautifier when null is passed as beautifing function\n    result = 'null';\n  }\n\n  return result;\n};\n\nfunction in_array(what, arr) {\n  return arr.indexOf(what) !== -1;\n}\n\nfunction TagFrame(parent, parser_token, indent_level) {\n  this.parent = parent || null;\n  this.tag = parser_token ? parser_token.tag_name : '';\n  this.indent_level = indent_level || 0;\n  this.parser_token = parser_token || null;\n}\n\nfunction TagStack(printer) {\n  this._printer = printer;\n  this._current_frame = null;\n}\n\nTagStack.prototype.get_parser_token = function() {\n  return this._current_frame ? this._current_frame.parser_token : null;\n};\n\nTagStack.prototype.record_tag = function(parser_token) { //function to record a tag and its parent in this.tags Object\n  var new_frame = new TagFrame(this._current_frame, parser_token, this._printer.indent_level);\n  this._current_frame = new_frame;\n};\n\nTagStack.prototype._try_pop_frame = function(frame) { //function to retrieve the opening tag to the corresponding closer\n  var parser_token = null;\n\n  if (frame) {\n    parser_token = frame.parser_token;\n    this._printer.indent_level = frame.indent_level;\n    this._current_frame = frame.parent;\n  }\n\n  return parser_token;\n};\n\nTagStack.prototype._get_frame = function(tag_list, stop_list) { //function to retrieve the opening tag to the corresponding closer\n  var frame = this._current_frame;\n\n  while (frame) { //till we reach '' (the initial value);\n    if (tag_list.indexOf(frame.tag) !== -1) { //if this is it use it\n      break;\n    } else if (stop_list && stop_list.indexOf(frame.tag) !== -1) {\n      frame = null;\n      break;\n    }\n    frame = frame.parent;\n  }\n\n  return frame;\n};\n\nTagStack.prototype.try_pop = function(tag, stop_list) { //function to retrieve the opening tag to the corresponding closer\n  var frame = this._get_frame([tag], stop_list);\n  return this._try_pop_frame(frame);\n};\n\nTagStack.prototype.indent_to_tag = function(tag_list) {\n  var frame = this._get_frame(tag_list);\n  if (frame) {\n    this._printer.indent_level = frame.indent_level;\n  }\n};\n\nfunction Beautifier(source_text, options, js_beautify, css_beautify) {\n  //Wrapper function to invoke all the necessary constructors and deal with the output.\n  this._source_text = source_text || '';\n  options = options || {};\n  this._js_beautify = js_beautify;\n  this._css_beautify = css_beautify;\n  this._tag_stack = null;\n\n  // Allow the setting of language/file-type specific options\n  // with inheritance of overall settings\n  var optionHtml = new Options(options, 'html');\n\n  this._options = optionHtml;\n\n  this._is_wrap_attributes_force = this._options.wrap_attributes.substr(0, 'force'.length) === 'force';\n  this._is_wrap_attributes_force_expand_multiline = (this._options.wrap_attributes === 'force-expand-multiline');\n  this._is_wrap_attributes_force_aligned = (this._options.wrap_attributes === 'force-aligned');\n  this._is_wrap_attributes_aligned_multiple = (this._options.wrap_attributes === 'aligned-multiple');\n  this._is_wrap_attributes_preserve = this._options.wrap_attributes.substr(0, 'preserve'.length) === 'preserve';\n  this._is_wrap_attributes_preserve_aligned = (this._options.wrap_attributes === 'preserve-aligned');\n}\n\nBeautifier.prototype.beautify = function() {\n\n  // if disabled, return the input unchanged.\n  if (this._options.disabled) {\n    return this._source_text;\n  }\n\n  var source_text = this._source_text;\n  var eol = this._options.eol;\n  if (this._options.eol === 'auto') {\n    eol = '\\n';\n    if (source_text && lineBreak.test(source_text)) {\n      eol = source_text.match(lineBreak)[0];\n    }\n  }\n\n  // HACK: newline parsing inconsistent. This brute force normalizes the input.\n  source_text = source_text.replace(allLineBreaks, '\\n');\n\n  var baseIndentString = source_text.match(/^[\\t ]*/)[0];\n\n  var last_token = {\n    text: '',\n    type: ''\n  };\n\n  var last_tag_token = new TagOpenParserToken(this._options);\n\n  var printer = new Printer(this._options, baseIndentString);\n  var tokens = new Tokenizer(source_text, this._options).tokenize();\n\n  this._tag_stack = new TagStack(printer);\n\n  var parser_token = null;\n  var raw_token = tokens.next();\n  while (raw_token.type !== TOKEN.EOF) {\n\n    if (raw_token.type === TOKEN.TAG_OPEN || raw_token.type === TOKEN.COMMENT) {\n      parser_token = this._handle_tag_open(printer, raw_token, last_tag_token, last_token, tokens);\n      last_tag_token = parser_token;\n    } else if ((raw_token.type === TOKEN.ATTRIBUTE || raw_token.type === TOKEN.EQUALS || raw_token.type === TOKEN.VALUE) ||\n      (raw_token.type === TOKEN.TEXT && !last_tag_token.tag_complete)) {\n      parser_token = this._handle_inside_tag(printer, raw_token, last_tag_token, last_token);\n    } else if (raw_token.type === TOKEN.TAG_CLOSE) {\n      parser_token = this._handle_tag_close(printer, raw_token, last_tag_token);\n    } else if (raw_token.type === TOKEN.TEXT) {\n      parser_token = this._handle_text(printer, raw_token, last_tag_token);\n    } else if (raw_token.type === TOKEN.CONTROL_FLOW_OPEN) {\n      parser_token = this._handle_control_flow_open(printer, raw_token);\n    } else if (raw_token.type === TOKEN.CONTROL_FLOW_CLOSE) {\n      parser_token = this._handle_control_flow_close(printer, raw_token);\n    } else {\n      // This should never happen, but if it does. Print the raw token\n      printer.add_raw_token(raw_token);\n    }\n\n    last_token = parser_token;\n\n    raw_token = tokens.next();\n  }\n  var sweet_code = printer._output.get_code(eol);\n\n  return sweet_code;\n};\n\nBeautifier.prototype._handle_control_flow_open = function(printer, raw_token) {\n  var parser_token = {\n    text: raw_token.text,\n    type: raw_token.type\n  };\n  printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);\n  if (raw_token.newlines) {\n    printer.print_preserved_newlines(raw_token);\n  } else {\n    printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);\n  }\n  printer.print_token(raw_token);\n  printer.indent();\n  return parser_token;\n};\n\nBeautifier.prototype._handle_control_flow_close = function(printer, raw_token) {\n  var parser_token = {\n    text: raw_token.text,\n    type: raw_token.type\n  };\n\n  printer.deindent();\n  if (raw_token.newlines) {\n    printer.print_preserved_newlines(raw_token);\n  } else {\n    printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);\n  }\n  printer.print_token(raw_token);\n  return parser_token;\n};\n\nBeautifier.prototype._handle_tag_close = function(printer, raw_token, last_tag_token) {\n  var parser_token = {\n    text: raw_token.text,\n    type: raw_token.type\n  };\n  printer.alignment_size = 0;\n  last_tag_token.tag_complete = true;\n\n  printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);\n  if (last_tag_token.is_unformatted) {\n    printer.add_raw_token(raw_token);\n  } else {\n    if (last_tag_token.tag_start_char === '<') {\n      printer.set_space_before_token(raw_token.text[0] === '/', true); // space before />, no space before >\n      if (this._is_wrap_attributes_force_expand_multiline && last_tag_token.has_wrapped_attrs) {\n        printer.print_newline(false);\n      }\n    }\n    printer.print_token(raw_token);\n\n  }\n\n  if (last_tag_token.indent_content &&\n    !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) {\n    printer.indent();\n\n    // only indent once per opened tag\n    last_tag_token.indent_content = false;\n  }\n\n  if (!last_tag_token.is_inline_element &&\n    !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) {\n    printer.set_wrap_point();\n  }\n\n  return parser_token;\n};\n\nBeautifier.prototype._handle_inside_tag = function(printer, raw_token, last_tag_token, last_token) {\n  var wrapped = last_tag_token.has_wrapped_attrs;\n  var parser_token = {\n    text: raw_token.text,\n    type: raw_token.type\n  };\n\n  printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);\n  if (last_tag_token.is_unformatted) {\n    printer.add_raw_token(raw_token);\n  } else if (last_tag_token.tag_start_char === '{' && raw_token.type === TOKEN.TEXT) {\n    // For the insides of handlebars allow newlines or a single space between open and contents\n    if (printer.print_preserved_newlines(raw_token)) {\n      raw_token.newlines = 0;\n      printer.add_raw_token(raw_token);\n    } else {\n      printer.print_token(raw_token);\n    }\n  } else {\n    if (raw_token.type === TOKEN.ATTRIBUTE) {\n      printer.set_space_before_token(true);\n    } else if (raw_token.type === TOKEN.EQUALS) { //no space before =\n      printer.set_space_before_token(false);\n    } else if (raw_token.type === TOKEN.VALUE && raw_token.previous.type === TOKEN.EQUALS) { //no space before value\n      printer.set_space_before_token(false);\n    }\n\n    if (raw_token.type === TOKEN.ATTRIBUTE && last_tag_token.tag_start_char === '<') {\n      if (this._is_wrap_attributes_preserve || this._is_wrap_attributes_preserve_aligned) {\n        printer.traverse_whitespace(raw_token);\n        wrapped = wrapped || raw_token.newlines !== 0;\n      }\n\n      // Wrap for 'force' options, and if the number of attributes is at least that specified in 'wrap_attributes_min_attrs':\n      // 1. always wrap the second and beyond attributes\n      // 2. wrap the first attribute only if 'force-expand-multiline' is specified\n      if (this._is_wrap_attributes_force &&\n        last_tag_token.attr_count >= this._options.wrap_attributes_min_attrs &&\n        (last_token.type !== TOKEN.TAG_OPEN || // ie. second attribute and beyond\n          this._is_wrap_attributes_force_expand_multiline)) {\n        printer.print_newline(false);\n        wrapped = true;\n      }\n    }\n    printer.print_token(raw_token);\n    wrapped = wrapped || printer.previous_token_wrapped();\n    last_tag_token.has_wrapped_attrs = wrapped;\n  }\n  return parser_token;\n};\n\nBeautifier.prototype._handle_text = function(printer, raw_token, last_tag_token) {\n  var parser_token = {\n    text: raw_token.text,\n    type: 'TK_CONTENT'\n  };\n  if (last_tag_token.custom_beautifier_name) { //check if we need to format javascript\n    this._print_custom_beatifier_text(printer, raw_token, last_tag_token);\n  } else if (last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) {\n    printer.add_raw_token(raw_token);\n  } else {\n    printer.traverse_whitespace(raw_token);\n    printer.print_token(raw_token);\n  }\n  return parser_token;\n};\n\nBeautifier.prototype._print_custom_beatifier_text = function(printer, raw_token, last_tag_token) {\n  var local = this;\n  if (raw_token.text !== '') {\n\n    var text = raw_token.text,\n      _beautifier,\n      script_indent_level = 1,\n      pre = '',\n      post = '';\n    if (last_tag_token.custom_beautifier_name === 'javascript' && typeof this._js_beautify === 'function') {\n      _beautifier = this._js_beautify;\n    } else if (last_tag_token.custom_beautifier_name === 'css' && typeof this._css_beautify === 'function') {\n      _beautifier = this._css_beautify;\n    } else if (last_tag_token.custom_beautifier_name === 'html') {\n      _beautifier = function(html_source, options) {\n        var beautifier = new Beautifier(html_source, options, local._js_beautify, local._css_beautify);\n        return beautifier.beautify();\n      };\n    }\n\n    if (this._options.indent_scripts === \"keep\") {\n      script_indent_level = 0;\n    } else if (this._options.indent_scripts === \"separate\") {\n      script_indent_level = -printer.indent_level;\n    }\n\n    var indentation = printer.get_full_indent(script_indent_level);\n\n    // if there is at least one empty line at the end of this text, strip it\n    // we'll be adding one back after the text but before the containing tag.\n    text = text.replace(/\\n[ \\t]*$/, '');\n\n    // Handle the case where content is wrapped in a comment or cdata.\n    if (last_tag_token.custom_beautifier_name !== 'html' &&\n      text[0] === '<' && text.match(/^(<!--|<!\\[CDATA\\[)/)) {\n      var matched = /^(<!--[^\\n]*|<!\\[CDATA\\[)(\\n?)([ \\t\\n]*)([\\s\\S]*)(-->|]]>)$/.exec(text);\n\n      // if we start to wrap but don't finish, print raw\n      if (!matched) {\n        printer.add_raw_token(raw_token);\n        return;\n      }\n\n      pre = indentation + matched[1] + '\\n';\n      text = matched[4];\n      if (matched[5]) {\n        post = indentation + matched[5];\n      }\n\n      // if there is at least one empty line at the end of this text, strip it\n      // we'll be adding one back after the text but before the containing tag.\n      text = text.replace(/\\n[ \\t]*$/, '');\n\n      if (matched[2] || matched[3].indexOf('\\n') !== -1) {\n        // if the first line of the non-comment text has spaces\n        // use that as the basis for indenting in null case.\n        matched = matched[3].match(/[ \\t]+$/);\n        if (matched) {\n          raw_token.whitespace_before = matched[0];\n        }\n      }\n    }\n\n    if (text) {\n      if (_beautifier) {\n\n        // call the Beautifier if avaliable\n        var Child_options = function() {\n          this.eol = '\\n';\n        };\n        Child_options.prototype = this._options.raw_options;\n        var child_options = new Child_options();\n        text = _beautifier(indentation + text, child_options);\n      } else {\n        // simply indent the string otherwise\n        var white = raw_token.whitespace_before;\n        if (white) {\n          text = text.replace(new RegExp('\\n(' + white + ')?', 'g'), '\\n');\n        }\n\n        text = indentation + text.replace(/\\n/g, '\\n' + indentation);\n      }\n    }\n\n    if (pre) {\n      if (!text) {\n        text = pre + post;\n      } else {\n        text = pre + text + '\\n' + post;\n      }\n    }\n\n    printer.print_newline(false);\n    if (text) {\n      raw_token.text = text;\n      raw_token.whitespace_before = '';\n      raw_token.newlines = 0;\n      printer.add_raw_token(raw_token);\n      printer.print_newline(true);\n    }\n  }\n};\n\nBeautifier.prototype._handle_tag_open = function(printer, raw_token, last_tag_token, last_token, tokens) {\n  var parser_token = this._get_tag_open_token(raw_token);\n\n  if ((last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) &&\n    !last_tag_token.is_empty_element &&\n    raw_token.type === TOKEN.TAG_OPEN && !parser_token.is_start_tag) {\n    // End element tags for unformatted or content_unformatted elements\n    // are printed raw to keep any newlines inside them exactly the same.\n    printer.add_raw_token(raw_token);\n    parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name);\n  } else {\n    printer.traverse_whitespace(raw_token);\n    this._set_tag_position(printer, raw_token, parser_token, last_tag_token, last_token);\n    if (!parser_token.is_inline_element) {\n      printer.set_wrap_point();\n    }\n    printer.print_token(raw_token);\n  }\n\n  // count the number of attributes\n  if (parser_token.is_start_tag && this._is_wrap_attributes_force) {\n    var peek_index = 0;\n    var peek_token;\n    do {\n      peek_token = tokens.peek(peek_index);\n      if (peek_token.type === TOKEN.ATTRIBUTE) {\n        parser_token.attr_count += 1;\n      }\n      peek_index += 1;\n    } while (peek_token.type !== TOKEN.EOF && peek_token.type !== TOKEN.TAG_CLOSE);\n  }\n\n  //indent attributes an auto, forced, aligned or forced-align line-wrap\n  if (this._is_wrap_attributes_force_aligned || this._is_wrap_attributes_aligned_multiple || this._is_wrap_attributes_preserve_aligned) {\n    parser_token.alignment_size = raw_token.text.length + 1;\n  }\n\n  if (!parser_token.tag_complete && !parser_token.is_unformatted) {\n    printer.alignment_size = parser_token.alignment_size;\n  }\n\n  return parser_token;\n};\n\nvar TagOpenParserToken = function(options, parent, raw_token) {\n  this.parent = parent || null;\n  this.text = '';\n  this.type = 'TK_TAG_OPEN';\n  this.tag_name = '';\n  this.is_inline_element = false;\n  this.is_unformatted = false;\n  this.is_content_unformatted = false;\n  this.is_empty_element = false;\n  this.is_start_tag = false;\n  this.is_end_tag = false;\n  this.indent_content = false;\n  this.multiline_content = false;\n  this.custom_beautifier_name = null;\n  this.start_tag_token = null;\n  this.attr_count = 0;\n  this.has_wrapped_attrs = false;\n  this.alignment_size = 0;\n  this.tag_complete = false;\n  this.tag_start_char = '';\n  this.tag_check = '';\n\n  if (!raw_token) {\n    this.tag_complete = true;\n  } else {\n    var tag_check_match;\n\n    this.tag_start_char = raw_token.text[0];\n    this.text = raw_token.text;\n\n    if (this.tag_start_char === '<') {\n      tag_check_match = raw_token.text.match(/^<([^\\s>]*)/);\n      this.tag_check = tag_check_match ? tag_check_match[1] : '';\n    } else {\n      tag_check_match = raw_token.text.match(/^{{~?(?:[\\^]|#\\*?)?([^\\s}]+)/);\n      this.tag_check = tag_check_match ? tag_check_match[1] : '';\n\n      // handle \"{{#> myPartial}}\" or \"{{~#> myPartial}}\"\n      if ((raw_token.text.startsWith('{{#>') || raw_token.text.startsWith('{{~#>')) && this.tag_check[0] === '>') {\n        if (this.tag_check === '>' && raw_token.next !== null) {\n          this.tag_check = raw_token.next.text.split(' ')[0];\n        } else {\n          this.tag_check = raw_token.text.split('>')[1];\n        }\n      }\n    }\n\n    this.tag_check = this.tag_check.toLowerCase();\n\n    if (raw_token.type === TOKEN.COMMENT) {\n      this.tag_complete = true;\n    }\n\n    this.is_start_tag = this.tag_check.charAt(0) !== '/';\n    this.tag_name = !this.is_start_tag ? this.tag_check.substr(1) : this.tag_check;\n    this.is_end_tag = !this.is_start_tag ||\n      (raw_token.closed && raw_token.closed.text === '/>');\n\n    // if whitespace handler ~ included (i.e. {{~#if true}}), handlebars tags start at pos 3 not pos 2\n    var handlebar_starts = 2;\n    if (this.tag_start_char === '{' && this.text.length >= 3) {\n      if (this.text.charAt(2) === '~') {\n        handlebar_starts = 3;\n      }\n    }\n\n    // handlebars tags that don't start with # or ^ are single_tags, and so also start and end.\n    // if they start with # or ^, they are still considered single tags if indenting of handlebars is set to false\n    this.is_end_tag = this.is_end_tag ||\n      (this.tag_start_char === '{' && (!options.indent_handlebars || this.text.length < 3 || (/[^#\\^]/.test(this.text.charAt(handlebar_starts)))));\n  }\n};\n\nBeautifier.prototype._get_tag_open_token = function(raw_token) { //function to get a full tag and parse its type\n  var parser_token = new TagOpenParserToken(this._options, this._tag_stack.get_parser_token(), raw_token);\n\n  parser_token.alignment_size = this._options.wrap_attributes_indent_size;\n\n  parser_token.is_end_tag = parser_token.is_end_tag ||\n    in_array(parser_token.tag_check, this._options.void_elements);\n\n  parser_token.is_empty_element = parser_token.tag_complete ||\n    (parser_token.is_start_tag && parser_token.is_end_tag);\n\n  parser_token.is_unformatted = !parser_token.tag_complete && in_array(parser_token.tag_check, this._options.unformatted);\n  parser_token.is_content_unformatted = !parser_token.is_empty_element && in_array(parser_token.tag_check, this._options.content_unformatted);\n  parser_token.is_inline_element = in_array(parser_token.tag_name, this._options.inline) || (this._options.inline_custom_elements && parser_token.tag_name.includes(\"-\")) || parser_token.tag_start_char === '{';\n\n  return parser_token;\n};\n\nBeautifier.prototype._set_tag_position = function(printer, raw_token, parser_token, last_tag_token, last_token) {\n\n  if (!parser_token.is_empty_element) {\n    if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending\n      parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name); //remove it and all ancestors\n    } else { // it's a start-tag\n      // check if this tag is starting an element that has optional end element\n      // and do an ending needed\n      if (this._do_optional_end_element(parser_token)) {\n        if (!parser_token.is_inline_element) {\n          printer.print_newline(false);\n        }\n      }\n\n      this._tag_stack.record_tag(parser_token); //push it on the tag stack\n\n      if ((parser_token.tag_name === 'script' || parser_token.tag_name === 'style') &&\n        !(parser_token.is_unformatted || parser_token.is_content_unformatted)) {\n        parser_token.custom_beautifier_name = get_custom_beautifier_name(parser_token.tag_check, raw_token);\n      }\n    }\n  }\n\n  if (in_array(parser_token.tag_check, this._options.extra_liners)) { //check if this double needs an extra line\n    printer.print_newline(false);\n    if (!printer._output.just_added_blankline()) {\n      printer.print_newline(true);\n    }\n  }\n\n  if (parser_token.is_empty_element) { //if this tag name is a single tag type (either in the list or has a closing /)\n\n    // if you hit an else case, reset the indent level if you are inside an:\n    // 'if', 'unless', or 'each' block.\n    if (parser_token.tag_start_char === '{' && parser_token.tag_check === 'else') {\n      this._tag_stack.indent_to_tag(['if', 'unless', 'each']);\n      parser_token.indent_content = true;\n      // Don't add a newline if opening {{#if}} tag is on the current line\n      var foundIfOnCurrentLine = printer.current_line_has_match(/{{#if/);\n      if (!foundIfOnCurrentLine) {\n        printer.print_newline(false);\n      }\n    }\n\n    // Don't add a newline before elements that should remain where they are.\n    if (parser_token.tag_name === '!--' && last_token.type === TOKEN.TAG_CLOSE &&\n      last_tag_token.is_end_tag && parser_token.text.indexOf('\\n') === -1) {\n      //Do nothing. Leave comments on same line.\n    } else {\n      if (!(parser_token.is_inline_element || parser_token.is_unformatted)) {\n        printer.print_newline(false);\n      }\n      this._calcluate_parent_multiline(printer, parser_token);\n    }\n  } else if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending\n    var do_end_expand = false;\n\n    // deciding whether a block is multiline should not be this hard\n    do_end_expand = parser_token.start_tag_token && parser_token.start_tag_token.multiline_content;\n    do_end_expand = do_end_expand || (!parser_token.is_inline_element &&\n      !(last_tag_token.is_inline_element || last_tag_token.is_unformatted) &&\n      !(last_token.type === TOKEN.TAG_CLOSE && parser_token.start_tag_token === last_tag_token) &&\n      last_token.type !== 'TK_CONTENT'\n    );\n\n    if (parser_token.is_content_unformatted || parser_token.is_unformatted) {\n      do_end_expand = false;\n    }\n\n    if (do_end_expand) {\n      printer.print_newline(false);\n    }\n  } else { // it's a start-tag\n    parser_token.indent_content = !parser_token.custom_beautifier_name;\n\n    if (parser_token.tag_start_char === '<') {\n      if (parser_token.tag_name === 'html') {\n        parser_token.indent_content = this._options.indent_inner_html;\n      } else if (parser_token.tag_name === 'head') {\n        parser_token.indent_content = this._options.indent_head_inner_html;\n      } else if (parser_token.tag_name === 'body') {\n        parser_token.indent_content = this._options.indent_body_inner_html;\n      }\n    }\n\n    if (!(parser_token.is_inline_element || parser_token.is_unformatted) &&\n      (last_token.type !== 'TK_CONTENT' || parser_token.is_content_unformatted)) {\n      printer.print_newline(false);\n    }\n\n    this._calcluate_parent_multiline(printer, parser_token);\n  }\n};\n\nBeautifier.prototype._calcluate_parent_multiline = function(printer, parser_token) {\n  if (parser_token.parent && printer._output.just_added_newline() &&\n    !((parser_token.is_inline_element || parser_token.is_unformatted) && parser_token.parent.is_inline_element)) {\n    parser_token.parent.multiline_content = true;\n  }\n};\n\n//To be used for <p> tag special case:\nvar p_closers = ['address', 'article', 'aside', 'blockquote', 'details', 'div', 'dl', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hr', 'main', 'menu', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul'];\nvar p_parent_excludes = ['a', 'audio', 'del', 'ins', 'map', 'noscript', 'video'];\n\nBeautifier.prototype._do_optional_end_element = function(parser_token) {\n  var result = null;\n  // NOTE: cases of \"if there is no more content in the parent element\"\n  // are handled automatically by the beautifier.\n  // It assumes parent or ancestor close tag closes all children.\n  // https://www.w3.org/TR/html5/syntax.html#optional-tags\n  if (parser_token.is_empty_element || !parser_token.is_start_tag || !parser_token.parent) {\n    return;\n\n  }\n\n  if (parser_token.tag_name === 'body') {\n    // A head element’s end tag may be omitted if the head element is not immediately followed by a space character or a comment.\n    result = result || this._tag_stack.try_pop('head');\n\n    //} else if (parser_token.tag_name === 'body') {\n    // DONE: A body element’s end tag may be omitted if the body element is not immediately followed by a comment.\n\n  } else if (parser_token.tag_name === 'li') {\n    // An li element’s end tag may be omitted if the li element is immediately followed by another li element or if there is no more content in the parent element.\n    result = result || this._tag_stack.try_pop('li', ['ol', 'ul', 'menu']);\n\n  } else if (parser_token.tag_name === 'dd' || parser_token.tag_name === 'dt') {\n    // A dd element’s end tag may be omitted if the dd element is immediately followed by another dd element or a dt element, or if there is no more content in the parent element.\n    // A dt element’s end tag may be omitted if the dt element is immediately followed by another dt element or a dd element.\n    result = result || this._tag_stack.try_pop('dt', ['dl']);\n    result = result || this._tag_stack.try_pop('dd', ['dl']);\n\n\n  } else if (parser_token.parent.tag_name === 'p' && p_closers.indexOf(parser_token.tag_name) !== -1) {\n    // IMPORTANT: this else-if works because p_closers has no overlap with any other element we look for in this method\n    // check for the parent element is an HTML element that is not an <a>, <audio>, <del>, <ins>, <map>, <noscript>, or <video> element,  or an autonomous custom element.\n    // To do this right, this needs to be coded as an inclusion of the inverse of the exclusion above.\n    // But to start with (if we ignore \"autonomous custom elements\") the exclusion would be fine.\n    var p_parent = parser_token.parent.parent;\n    if (!p_parent || p_parent_excludes.indexOf(p_parent.tag_name) === -1) {\n      result = result || this._tag_stack.try_pop('p');\n    }\n  } else if (parser_token.tag_name === 'rp' || parser_token.tag_name === 'rt') {\n    // An rt element’s end tag may be omitted if the rt element is immediately followed by an rt or rp element, or if there is no more content in the parent element.\n    // An rp element’s end tag may be omitted if the rp element is immediately followed by an rt or rp element, or if there is no more content in the parent element.\n    result = result || this._tag_stack.try_pop('rt', ['ruby', 'rtc']);\n    result = result || this._tag_stack.try_pop('rp', ['ruby', 'rtc']);\n\n  } else if (parser_token.tag_name === 'optgroup') {\n    // An optgroup element’s end tag may be omitted if the optgroup element is immediately followed by another optgroup element, or if there is no more content in the parent element.\n    // An option element’s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element.\n    result = result || this._tag_stack.try_pop('optgroup', ['select']);\n    //result = result || this._tag_stack.try_pop('option', ['select']);\n\n  } else if (parser_token.tag_name === 'option') {\n    // An option element’s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element.\n    result = result || this._tag_stack.try_pop('option', ['select', 'datalist', 'optgroup']);\n\n  } else if (parser_token.tag_name === 'colgroup') {\n    // DONE: A colgroup element’s end tag may be omitted if the colgroup element is not immediately followed by a space character or a comment.\n    // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n    result = result || this._tag_stack.try_pop('caption', ['table']);\n\n  } else if (parser_token.tag_name === 'thead') {\n    // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.\n    // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n    result = result || this._tag_stack.try_pop('caption', ['table']);\n    result = result || this._tag_stack.try_pop('colgroup', ['table']);\n\n    //} else if (parser_token.tag_name === 'caption') {\n    // DONE: A caption element’s end tag may be omitted if the caption element is not immediately followed by a space character or a comment.\n\n  } else if (parser_token.tag_name === 'tbody' || parser_token.tag_name === 'tfoot') {\n    // A thead element’s end tag may be omitted if the thead element is immediately followed by a tbody or tfoot element.\n    // A tbody element’s end tag may be omitted if the tbody element is immediately followed by a tbody or tfoot element, or if there is no more content in the parent element.\n    // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.\n    // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n    result = result || this._tag_stack.try_pop('caption', ['table']);\n    result = result || this._tag_stack.try_pop('colgroup', ['table']);\n    result = result || this._tag_stack.try_pop('thead', ['table']);\n    result = result || this._tag_stack.try_pop('tbody', ['table']);\n\n    //} else if (parser_token.tag_name === 'tfoot') {\n    // DONE: A tfoot element’s end tag may be omitted if there is no more content in the parent element.\n\n  } else if (parser_token.tag_name === 'tr') {\n    // A tr element’s end tag may be omitted if the tr element is immediately followed by another tr element, or if there is no more content in the parent element.\n    // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.\n    // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.\n    result = result || this._tag_stack.try_pop('caption', ['table']);\n    result = result || this._tag_stack.try_pop('colgroup', ['table']);\n    result = result || this._tag_stack.try_pop('tr', ['table', 'thead', 'tbody', 'tfoot']);\n\n  } else if (parser_token.tag_name === 'th' || parser_token.tag_name === 'td') {\n    // A td element’s end tag may be omitted if the td element is immediately followed by a td or th element, or if there is no more content in the parent element.\n    // A th element’s end tag may be omitted if the th element is immediately followed by a td or th element, or if there is no more content in the parent element.\n    result = result || this._tag_stack.try_pop('td', ['table', 'thead', 'tbody', 'tfoot', 'tr']);\n    result = result || this._tag_stack.try_pop('th', ['table', 'thead', 'tbody', 'tfoot', 'tr']);\n  }\n\n  // Start element omission not handled currently\n  // A head element’s start tag may be omitted if the element is empty, or if the first thing inside the head element is an element.\n  // A tbody element’s start tag may be omitted if the first thing inside the tbody element is a tr element, and if the element is not immediately preceded by a tbody, thead, or tfoot element whose end tag has been omitted. (It can’t be omitted if the element is empty.)\n  // A colgroup element’s start tag may be omitted if the first thing inside the colgroup element is a col element, and if the element is not immediately preceded by another colgroup element whose end tag has been omitted. (It can’t be omitted if the element is empty.)\n\n  // Fix up the parent of the parser token\n  parser_token.parent = this._tag_stack.get_parser_token();\n\n  return result;\n};\n\nmodule.exports.Beautifier = Beautifier;\n"
  },
  {
    "path": "js/src/html/index.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Beautifier = require('./beautifier').Beautifier,\n  Options = require('./options').Options;\n\nfunction style_html(html_source, options, js_beautify, css_beautify) {\n  var beautifier = new Beautifier(html_source, options, js_beautify, css_beautify);\n  return beautifier.beautify();\n}\n\nmodule.exports = style_html;\nmodule.exports.defaultOptions = function() {\n  return new Options();\n};\n"
  },
  {
    "path": "js/src/html/options.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseOptions = require('../core/options').Options;\n\nfunction Options(options) {\n  BaseOptions.call(this, options, 'html');\n  if (this.templating.length === 1 && this.templating[0] === 'auto') {\n    this.templating = ['django', 'erb', 'handlebars', 'php'];\n  }\n\n  this.indent_inner_html = this._get_boolean('indent_inner_html');\n  this.indent_body_inner_html = this._get_boolean('indent_body_inner_html', true);\n  this.indent_head_inner_html = this._get_boolean('indent_head_inner_html', true);\n\n  this.indent_handlebars = this._get_boolean('indent_handlebars', true);\n  this.wrap_attributes = this._get_selection('wrap_attributes',\n    ['auto', 'force', 'force-aligned', 'force-expand-multiline', 'aligned-multiple', 'preserve', 'preserve-aligned']);\n  this.wrap_attributes_min_attrs = this._get_number('wrap_attributes_min_attrs', 2);\n  this.wrap_attributes_indent_size = this._get_number('wrap_attributes_indent_size', this.indent_size);\n  this.extra_liners = this._get_array('extra_liners', ['head', 'body', '/html']);\n\n  // Block vs inline elements\n  // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements\n  // https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements\n  // https://www.w3.org/TR/html5/dom.html#phrasing-content\n  this.inline = this._get_array('inline', [\n    'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button', 'canvas', 'cite',\n    'code', 'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'i', 'iframe', 'img',\n    'input', 'ins', 'kbd', 'keygen', 'label', 'map', 'mark', 'math', 'meter', 'noscript',\n    'object', 'output', 'progress', 'q', 'ruby', 's', 'samp', /* 'script', */ 'select', 'small',\n    'span', 'strong', 'sub', 'sup', 'svg', 'template', 'textarea', 'time', 'u', 'var',\n    'video', 'wbr', 'text',\n    // obsolete inline tags\n    'acronym', 'big', 'strike', 'tt'\n  ]);\n  this.inline_custom_elements = this._get_boolean('inline_custom_elements', true);\n  this.void_elements = this._get_array('void_elements', [\n    // HTLM void elements - aka self-closing tags - aka singletons\n    // https://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n    'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen',\n    'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',\n    // NOTE: Optional tags are too complex for a simple list\n    // they are hard coded in _do_optional_end_element\n\n    // Doctype and xml elements\n    '!doctype', '?xml',\n\n    // obsolete tags\n    // basefont: https://www.computerhope.com/jargon/h/html-basefont-tag.htm\n    // isndex: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/isindex\n    'basefont', 'isindex'\n  ]);\n  this.unformatted = this._get_array('unformatted', []);\n  this.content_unformatted = this._get_array('content_unformatted', [\n    'pre', 'textarea'\n  ]);\n  this.unformatted_content_delimiter = this._get_characters('unformatted_content_delimiter');\n  this.indent_scripts = this._get_selection('indent_scripts', ['normal', 'keep', 'separate']);\n\n}\nOptions.prototype = new BaseOptions();\n\n\n\nmodule.exports.Options = Options;\n"
  },
  {
    "path": "js/src/html/tokenizer.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseTokenizer = require('../core/tokenizer').Tokenizer;\nvar BASETOKEN = require('../core/tokenizer').TOKEN;\nvar Directives = require('../core/directives').Directives;\nvar TemplatablePattern = require('../core/templatablepattern').TemplatablePattern;\nvar Pattern = require('../core/pattern').Pattern;\n\nvar TOKEN = {\n  TAG_OPEN: 'TK_TAG_OPEN',\n  TAG_CLOSE: 'TK_TAG_CLOSE',\n  CONTROL_FLOW_OPEN: 'TK_CONTROL_FLOW_OPEN',\n  CONTROL_FLOW_CLOSE: 'TK_CONTROL_FLOW_CLOSE',\n  ATTRIBUTE: 'TK_ATTRIBUTE',\n  EQUALS: 'TK_EQUALS',\n  VALUE: 'TK_VALUE',\n  COMMENT: 'TK_COMMENT',\n  TEXT: 'TK_TEXT',\n  UNKNOWN: 'TK_UNKNOWN',\n  START: BASETOKEN.START,\n  RAW: BASETOKEN.RAW,\n  EOF: BASETOKEN.EOF\n};\n\nvar directives_core = new Directives(/<\\!--/, /-->/);\n\nvar Tokenizer = function(input_string, options) {\n  BaseTokenizer.call(this, input_string, options);\n  this._current_tag_name = '';\n\n  // Words end at whitespace or when a tag starts\n  // if we are indenting handlebars, they are considered tags\n  var templatable_reader = new TemplatablePattern(this._input).read_options(this._options);\n  var pattern_reader = new Pattern(this._input);\n\n  this.__patterns = {\n    word: templatable_reader.until(/[\\n\\r\\t <]/),\n    word_control_flow_close_excluded: templatable_reader.until(/[\\n\\r\\t <}]/),\n    single_quote: templatable_reader.until_after(/'/),\n    double_quote: templatable_reader.until_after(/\"/),\n    attribute: templatable_reader.until(/[\\n\\r\\t =>]|\\/>/),\n    element_name: templatable_reader.until(/[\\n\\r\\t >\\/]/),\n\n    angular_control_flow_start: pattern_reader.matching(/\\@[a-zA-Z]+[^({]*[({]/),\n    handlebars_comment: pattern_reader.starting_with(/{{!--/).until_after(/--}}/),\n    handlebars: pattern_reader.starting_with(/{{/).until_after(/}}/),\n    handlebars_open: pattern_reader.until(/[\\n\\r\\t }]/),\n    handlebars_raw_close: pattern_reader.until(/}}/),\n    comment: pattern_reader.starting_with(/<!--/).until_after(/-->/),\n    cdata: pattern_reader.starting_with(/<!\\[CDATA\\[/).until_after(/]]>/),\n    // https://en.wikipedia.org/wiki/Conditional_comment\n    conditional_comment: pattern_reader.starting_with(/<!\\[/).until_after(/]>/),\n    processing: pattern_reader.starting_with(/<\\?/).until_after(/\\?>/)\n  };\n\n  if (this._options.indent_handlebars) {\n    this.__patterns.word = this.__patterns.word.exclude('handlebars');\n    this.__patterns.word_control_flow_close_excluded = this.__patterns.word_control_flow_close_excluded.exclude('handlebars');\n  }\n\n  this._unformatted_content_delimiter = null;\n\n  if (this._options.unformatted_content_delimiter) {\n    var literal_regexp = this._input.get_literal_regexp(this._options.unformatted_content_delimiter);\n    this.__patterns.unformatted_content_delimiter =\n      pattern_reader.matching(literal_regexp)\n      .until_after(literal_regexp);\n  }\n};\nTokenizer.prototype = new BaseTokenizer();\n\nTokenizer.prototype._is_comment = function(current_token) { // jshint unused:false\n  return false; //current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.UNKNOWN;\n};\n\nTokenizer.prototype._is_opening = function(current_token) {\n  return current_token.type === TOKEN.TAG_OPEN || current_token.type === TOKEN.CONTROL_FLOW_OPEN;\n};\n\nTokenizer.prototype._is_closing = function(current_token, open_token) {\n  return (current_token.type === TOKEN.TAG_CLOSE &&\n    (open_token && (\n      ((current_token.text === '>' || current_token.text === '/>') && open_token.text[0] === '<') ||\n      (current_token.text === '}}' && open_token.text[0] === '{' && open_token.text[1] === '{')))\n  ) || (current_token.type === TOKEN.CONTROL_FLOW_CLOSE &&\n    (current_token.text === '}' && open_token.text.endsWith('{')));\n};\n\nTokenizer.prototype._reset = function() {\n  this._current_tag_name = '';\n};\n\nTokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false\n  var token = null;\n  this._readWhitespace();\n  var c = this._input.peek();\n\n  if (c === null) {\n    return this._create_token(TOKEN.EOF, '');\n  }\n\n  token = token || this._read_open_handlebars(c, open_token);\n  token = token || this._read_attribute(c, previous_token, open_token);\n  token = token || this._read_close(c, open_token);\n  token = token || this._read_script_and_style(c, previous_token);\n  token = token || this._read_control_flows(c, open_token);\n  token = token || this._read_raw_content(c, previous_token, open_token);\n  token = token || this._read_content_word(c, open_token);\n  token = token || this._read_comment_or_cdata(c);\n  token = token || this._read_processing(c);\n  token = token || this._read_open(c, open_token);\n  token = token || this._create_token(TOKEN.UNKNOWN, this._input.next());\n\n  return token;\n};\n\nTokenizer.prototype._read_comment_or_cdata = function(c) { // jshint unused:false\n  var token = null;\n  var resulting_string = null;\n  var directives = null;\n\n  if (c === '<') {\n    var peek1 = this._input.peek(1);\n    // We treat all comments as literals, even more than preformatted tags\n    // we only look for the appropriate closing marker\n    if (peek1 === '!') {\n      resulting_string = this.__patterns.comment.read();\n\n      // only process directive on html comments\n      if (resulting_string) {\n        directives = directives_core.get_directives(resulting_string);\n        if (directives && directives.ignore === 'start') {\n          resulting_string += directives_core.readIgnored(this._input);\n        }\n      } else {\n        resulting_string = this.__patterns.cdata.read();\n      }\n    }\n\n    if (resulting_string) {\n      token = this._create_token(TOKEN.COMMENT, resulting_string);\n      token.directives = directives;\n    }\n  }\n\n  return token;\n};\n\nTokenizer.prototype._read_processing = function(c) { // jshint unused:false\n  var token = null;\n  var resulting_string = null;\n  var directives = null;\n\n  if (c === '<') {\n    var peek1 = this._input.peek(1);\n    if (peek1 === '!' || peek1 === '?') {\n      resulting_string = this.__patterns.conditional_comment.read();\n      resulting_string = resulting_string || this.__patterns.processing.read();\n    }\n\n    if (resulting_string) {\n      token = this._create_token(TOKEN.COMMENT, resulting_string);\n      token.directives = directives;\n    }\n  }\n\n  return token;\n};\n\nTokenizer.prototype._read_open = function(c, open_token) {\n  var resulting_string = null;\n  var token = null;\n  if (!open_token || open_token.type === TOKEN.CONTROL_FLOW_OPEN) {\n    if (c === '<') {\n\n      resulting_string = this._input.next();\n      if (this._input.peek() === '/') {\n        resulting_string += this._input.next();\n      }\n      resulting_string += this.__patterns.element_name.read();\n      token = this._create_token(TOKEN.TAG_OPEN, resulting_string);\n    }\n  }\n  return token;\n};\n\nTokenizer.prototype._read_open_handlebars = function(c, open_token) {\n  var resulting_string = null;\n  var token = null;\n  if (!open_token || open_token.type === TOKEN.CONTROL_FLOW_OPEN) {\n    if ((this._options.templating.includes('angular') || this._options.indent_handlebars) && c === '{' && this._input.peek(1) === '{') {\n      if (this._options.indent_handlebars && this._input.peek(2) === '!') {\n        resulting_string = this.__patterns.handlebars_comment.read();\n        resulting_string = resulting_string || this.__patterns.handlebars.read();\n        token = this._create_token(TOKEN.COMMENT, resulting_string);\n      } else {\n        resulting_string = this.__patterns.handlebars_open.read();\n        token = this._create_token(TOKEN.TAG_OPEN, resulting_string);\n      }\n    }\n  }\n  return token;\n};\n\nTokenizer.prototype._read_control_flows = function(c, open_token) {\n  var resulting_string = '';\n  var token = null;\n  // Only check for control flows if angular templating is set\n  if (!this._options.templating.includes('angular')) {\n    return token;\n  }\n\n  if (c === '@') {\n    resulting_string = this.__patterns.angular_control_flow_start.read();\n    if (resulting_string === '') {\n      return token;\n    }\n\n    var opening_parentheses_count = resulting_string.endsWith('(') ? 1 : 0;\n    var closing_parentheses_count = 0;\n    // The opening brace of the control flow is where the number of opening and closing parentheses equal\n    // e.g. @if({value: true} !== null) { \n    while (!(resulting_string.endsWith('{') && opening_parentheses_count === closing_parentheses_count)) {\n      var next_char = this._input.next();\n      if (next_char === null) {\n        break;\n      } else if (next_char === '(') {\n        opening_parentheses_count++;\n      } else if (next_char === ')') {\n        closing_parentheses_count++;\n      }\n      resulting_string += next_char;\n    }\n    token = this._create_token(TOKEN.CONTROL_FLOW_OPEN, resulting_string);\n  } else if (c === '}' && open_token && open_token.type === TOKEN.CONTROL_FLOW_OPEN) {\n    resulting_string = this._input.next();\n    token = this._create_token(TOKEN.CONTROL_FLOW_CLOSE, resulting_string);\n  }\n  return token;\n};\n\n\nTokenizer.prototype._read_close = function(c, open_token) {\n  var resulting_string = null;\n  var token = null;\n  if (open_token && open_token.type === TOKEN.TAG_OPEN) {\n    if (open_token.text[0] === '<' && (c === '>' || (c === '/' && this._input.peek(1) === '>'))) {\n      resulting_string = this._input.next();\n      if (c === '/') { //  for close tag \"/>\"\n        resulting_string += this._input.next();\n      }\n      token = this._create_token(TOKEN.TAG_CLOSE, resulting_string);\n    } else if (open_token.text[0] === '{' && c === '}' && this._input.peek(1) === '}') {\n      this._input.next();\n      this._input.next();\n      token = this._create_token(TOKEN.TAG_CLOSE, '}}');\n    }\n  }\n\n  return token;\n};\n\nTokenizer.prototype._read_attribute = function(c, previous_token, open_token) {\n  var token = null;\n  var resulting_string = '';\n  if (open_token && open_token.text[0] === '<') {\n\n    if (c === '=') {\n      token = this._create_token(TOKEN.EQUALS, this._input.next());\n    } else if (c === '\"' || c === \"'\") {\n      var content = this._input.next();\n      if (c === '\"') {\n        content += this.__patterns.double_quote.read();\n      } else {\n        content += this.__patterns.single_quote.read();\n      }\n      token = this._create_token(TOKEN.VALUE, content);\n    } else {\n      resulting_string = this.__patterns.attribute.read();\n\n      if (resulting_string) {\n        if (previous_token.type === TOKEN.EQUALS) {\n          token = this._create_token(TOKEN.VALUE, resulting_string);\n        } else {\n          token = this._create_token(TOKEN.ATTRIBUTE, resulting_string);\n        }\n      }\n    }\n  }\n  return token;\n};\n\nTokenizer.prototype._is_content_unformatted = function(tag_name) {\n  // void_elements have no content and so cannot have unformatted content\n  // script and style tags should always be read as unformatted content\n  // finally content_unformatted and unformatted element contents are unformatted\n  return this._options.void_elements.indexOf(tag_name) === -1 &&\n    (this._options.content_unformatted.indexOf(tag_name) !== -1 ||\n      this._options.unformatted.indexOf(tag_name) !== -1);\n};\n\nTokenizer.prototype._read_raw_content = function(c, previous_token, open_token) { // jshint unused:false\n  var resulting_string = '';\n  if (open_token && open_token.text[0] === '{') {\n    resulting_string = this.__patterns.handlebars_raw_close.read();\n  } else if (previous_token.type === TOKEN.TAG_CLOSE &&\n    previous_token.opened.text[0] === '<' && previous_token.text[0] !== '/') {\n    // ^^ empty tag has no content \n    var tag_name = previous_token.opened.text.substr(1).toLowerCase();\n    if (this._is_content_unformatted(tag_name)) {\n\n      resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\\\n\\\\r\\\\t ]*?>', 'ig'));\n    }\n  }\n\n  if (resulting_string) {\n    return this._create_token(TOKEN.TEXT, resulting_string);\n  }\n\n  return null;\n};\n\nTokenizer.prototype._read_script_and_style = function(c, previous_token) { // jshint unused:false \n  if (previous_token.type === TOKEN.TAG_CLOSE && previous_token.opened.text[0] === '<' && previous_token.text[0] !== '/') {\n    var tag_name = previous_token.opened.text.substr(1).toLowerCase();\n    if (tag_name === 'script' || tag_name === 'style') {\n      // Script and style tags are allowed to have comments wrapping their content\n      // or just have regular content.\n      var token = this._read_comment_or_cdata(c);\n      if (token) {\n        token.type = TOKEN.TEXT;\n        return token;\n      }\n      var resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\\\n\\\\r\\\\t ]*?>', 'ig'));\n      if (resulting_string) {\n        return this._create_token(TOKEN.TEXT, resulting_string);\n      }\n    }\n  }\n  return null;\n};\n\nTokenizer.prototype._read_content_word = function(c, open_token) {\n  var resulting_string = '';\n  if (this._options.unformatted_content_delimiter) {\n    if (c === this._options.unformatted_content_delimiter[0]) {\n      resulting_string = this.__patterns.unformatted_content_delimiter.read();\n    }\n  }\n\n  if (!resulting_string) {\n    resulting_string = (open_token && open_token.type === TOKEN.CONTROL_FLOW_OPEN) ? this.__patterns.word_control_flow_close_excluded.read() : this.__patterns.word.read();\n  }\n  if (resulting_string) {\n    return this._create_token(TOKEN.TEXT, resulting_string);\n  }\n  return null;\n};\n\nmodule.exports.Tokenizer = Tokenizer;\nmodule.exports.TOKEN = TOKEN;\n"
  },
  {
    "path": "js/src/index.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar js_beautify = require('./javascript/index');\nvar css_beautify = require('./css/index');\nvar html_beautify = require('./html/index');\n\nfunction style_html(html_source, options, js, css) {\n  js = js || js_beautify;\n  css = css || css_beautify;\n  return html_beautify(html_source, options, js, css);\n}\nstyle_html.defaultOptions = html_beautify.defaultOptions;\n\nmodule.exports.js = js_beautify;\nmodule.exports.css = css_beautify;\nmodule.exports.html = style_html;\n"
  },
  {
    "path": "js/src/javascript/acorn.js",
    "content": "/* jshint node: true, curly: false */\n// Parts of this section of code is taken from acorn.\n//\n// Acorn was written by Marijn Haverbeke and released under an MIT\n// license. The Unicode regexps (for identifiers and whitespace) were\n// taken from [Esprima](http://esprima.org) by Ariya Hidayat.\n//\n// Git repositories for Acorn are available at\n//\n//     http://marijnhaverbeke.nl/git/acorn\n//     https://github.com/marijnh/acorn.git\n\n// ## Character categories\n\n\n'use strict';\n\n// acorn used char codes to squeeze the last bit of performance out\n// Beautifier is okay without that, so we're using regex\n// permit # (23), $ (36), and @ (64). @ is used in ES7 decorators.\n// 65 through 91 are uppercase letters.\n// permit _ (95).\n// 97 through 123 are lowercase letters.\nvar baseASCIIidentifierStartChars = \"\\\\x23\\\\x24\\\\x40\\\\x41-\\\\x5a\\\\x5f\\\\x61-\\\\x7a\";\n\n// inside an identifier @ is not allowed but 0-9 are.\nvar baseASCIIidentifierChars = \"\\\\x24\\\\x30-\\\\x39\\\\x41-\\\\x5a\\\\x5f\\\\x61-\\\\x7a\";\n\n// Big ugly regular expressions that match characters in the\n// whitespace, identifier, and identifier-start categories. These\n// are only applied when a character is found to actually have a\n// code point above 128.\nvar nonASCIIidentifierStartChars = \"\\\\xaa\\\\xb5\\\\xba\\\\xc0-\\\\xd6\\\\xd8-\\\\xf6\\\\xf8-\\\\u02c1\\\\u02c6-\\\\u02d1\\\\u02e0-\\\\u02e4\\\\u02ec\\\\u02ee\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037a-\\\\u037d\\\\u0386\\\\u0388-\\\\u038a\\\\u038c\\\\u038e-\\\\u03a1\\\\u03a3-\\\\u03f5\\\\u03f7-\\\\u0481\\\\u048a-\\\\u0527\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f2\\\\u0620-\\\\u064a\\\\u066e\\\\u066f\\\\u0671-\\\\u06d3\\\\u06d5\\\\u06e5\\\\u06e6\\\\u06ee\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff\\\\u0710\\\\u0712-\\\\u072f\\\\u074d-\\\\u07a5\\\\u07b1\\\\u07ca-\\\\u07ea\\\\u07f4\\\\u07f5\\\\u07fa\\\\u0800-\\\\u0815\\\\u081a\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u0904-\\\\u0939\\\\u093d\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0977\\\\u0979-\\\\u097f\\\\u0985-\\\\u098c\\\\u098f\\\\u0990\\\\u0993-\\\\u09a8\\\\u09aa-\\\\u09b0\\\\u09b2\\\\u09b6-\\\\u09b9\\\\u09bd\\\\u09ce\\\\u09dc\\\\u09dd\\\\u09df-\\\\u09e1\\\\u09f0\\\\u09f1\\\\u0a05-\\\\u0a0a\\\\u0a0f\\\\u0a10\\\\u0a13-\\\\u0a28\\\\u0a2a-\\\\u0a30\\\\u0a32\\\\u0a33\\\\u0a35\\\\u0a36\\\\u0a38\\\\u0a39\\\\u0a59-\\\\u0a5c\\\\u0a5e\\\\u0a72-\\\\u0a74\\\\u0a85-\\\\u0a8d\\\\u0a8f-\\\\u0a91\\\\u0a93-\\\\u0aa8\\\\u0aaa-\\\\u0ab0\\\\u0ab2\\\\u0ab3\\\\u0ab5-\\\\u0ab9\\\\u0abd\\\\u0ad0\\\\u0ae0\\\\u0ae1\\\\u0b05-\\\\u0b0c\\\\u0b0f\\\\u0b10\\\\u0b13-\\\\u0b28\\\\u0b2a-\\\\u0b30\\\\u0b32\\\\u0b33\\\\u0b35-\\\\u0b39\\\\u0b3d\\\\u0b5c\\\\u0b5d\\\\u0b5f-\\\\u0b61\\\\u0b71\\\\u0b83\\\\u0b85-\\\\u0b8a\\\\u0b8e-\\\\u0b90\\\\u0b92-\\\\u0b95\\\\u0b99\\\\u0b9a\\\\u0b9c\\\\u0b9e\\\\u0b9f\\\\u0ba3\\\\u0ba4\\\\u0ba8-\\\\u0baa\\\\u0bae-\\\\u0bb9\\\\u0bd0\\\\u0c05-\\\\u0c0c\\\\u0c0e-\\\\u0c10\\\\u0c12-\\\\u0c28\\\\u0c2a-\\\\u0c33\\\\u0c35-\\\\u0c39\\\\u0c3d\\\\u0c58\\\\u0c59\\\\u0c60\\\\u0c61\\\\u0c85-\\\\u0c8c\\\\u0c8e-\\\\u0c90\\\\u0c92-\\\\u0ca8\\\\u0caa-\\\\u0cb3\\\\u0cb5-\\\\u0cb9\\\\u0cbd\\\\u0cde\\\\u0ce0\\\\u0ce1\\\\u0cf1\\\\u0cf2\\\\u0d05-\\\\u0d0c\\\\u0d0e-\\\\u0d10\\\\u0d12-\\\\u0d3a\\\\u0d3d\\\\u0d4e\\\\u0d60\\\\u0d61\\\\u0d7a-\\\\u0d7f\\\\u0d85-\\\\u0d96\\\\u0d9a-\\\\u0db1\\\\u0db3-\\\\u0dbb\\\\u0dbd\\\\u0dc0-\\\\u0dc6\\\\u0e01-\\\\u0e30\\\\u0e32\\\\u0e33\\\\u0e40-\\\\u0e46\\\\u0e81\\\\u0e82\\\\u0e84\\\\u0e87\\\\u0e88\\\\u0e8a\\\\u0e8d\\\\u0e94-\\\\u0e97\\\\u0e99-\\\\u0e9f\\\\u0ea1-\\\\u0ea3\\\\u0ea5\\\\u0ea7\\\\u0eaa\\\\u0eab\\\\u0ead-\\\\u0eb0\\\\u0eb2\\\\u0eb3\\\\u0ebd\\\\u0ec0-\\\\u0ec4\\\\u0ec6\\\\u0edc-\\\\u0edf\\\\u0f00\\\\u0f40-\\\\u0f47\\\\u0f49-\\\\u0f6c\\\\u0f88-\\\\u0f8c\\\\u1000-\\\\u102a\\\\u103f\\\\u1050-\\\\u1055\\\\u105a-\\\\u105d\\\\u1061\\\\u1065\\\\u1066\\\\u106e-\\\\u1070\\\\u1075-\\\\u1081\\\\u108e\\\\u10a0-\\\\u10c5\\\\u10c7\\\\u10cd\\\\u10d0-\\\\u10fa\\\\u10fc-\\\\u1248\\\\u124a-\\\\u124d\\\\u1250-\\\\u1256\\\\u1258\\\\u125a-\\\\u125d\\\\u1260-\\\\u1288\\\\u128a-\\\\u128d\\\\u1290-\\\\u12b0\\\\u12b2-\\\\u12b5\\\\u12b8-\\\\u12be\\\\u12c0\\\\u12c2-\\\\u12c5\\\\u12c8-\\\\u12d6\\\\u12d8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135a\\\\u1380-\\\\u138f\\\\u13a0-\\\\u13f4\\\\u1401-\\\\u166c\\\\u166f-\\\\u167f\\\\u1681-\\\\u169a\\\\u16a0-\\\\u16ea\\\\u16ee-\\\\u16f0\\\\u1700-\\\\u170c\\\\u170e-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176c\\\\u176e-\\\\u1770\\\\u1780-\\\\u17b3\\\\u17d7\\\\u17dc\\\\u1820-\\\\u1877\\\\u1880-\\\\u18a8\\\\u18aa\\\\u18b0-\\\\u18f5\\\\u1900-\\\\u191c\\\\u1950-\\\\u196d\\\\u1970-\\\\u1974\\\\u1980-\\\\u19ab\\\\u19c1-\\\\u19c7\\\\u1a00-\\\\u1a16\\\\u1a20-\\\\u1a54\\\\u1aa7\\\\u1b05-\\\\u1b33\\\\u1b45-\\\\u1b4b\\\\u1b83-\\\\u1ba0\\\\u1bae\\\\u1baf\\\\u1bba-\\\\u1be5\\\\u1c00-\\\\u1c23\\\\u1c4d-\\\\u1c4f\\\\u1c5a-\\\\u1c7d\\\\u1ce9-\\\\u1cec\\\\u1cee-\\\\u1cf1\\\\u1cf5\\\\u1cf6\\\\u1d00-\\\\u1dbf\\\\u1e00-\\\\u1f15\\\\u1f18-\\\\u1f1d\\\\u1f20-\\\\u1f45\\\\u1f48-\\\\u1f4d\\\\u1f50-\\\\u1f57\\\\u1f59\\\\u1f5b\\\\u1f5d\\\\u1f5f-\\\\u1f7d\\\\u1f80-\\\\u1fb4\\\\u1fb6-\\\\u1fbc\\\\u1fbe\\\\u1fc2-\\\\u1fc4\\\\u1fc6-\\\\u1fcc\\\\u1fd0-\\\\u1fd3\\\\u1fd6-\\\\u1fdb\\\\u1fe0-\\\\u1fec\\\\u1ff2-\\\\u1ff4\\\\u1ff6-\\\\u1ffc\\\\u2071\\\\u207f\\\\u2090-\\\\u209c\\\\u2102\\\\u2107\\\\u210a-\\\\u2113\\\\u2115\\\\u2119-\\\\u211d\\\\u2124\\\\u2126\\\\u2128\\\\u212a-\\\\u212d\\\\u212f-\\\\u2139\\\\u213c-\\\\u213f\\\\u2145-\\\\u2149\\\\u214e\\\\u2160-\\\\u2188\\\\u2c00-\\\\u2c2e\\\\u2c30-\\\\u2c5e\\\\u2c60-\\\\u2ce4\\\\u2ceb-\\\\u2cee\\\\u2cf2\\\\u2cf3\\\\u2d00-\\\\u2d25\\\\u2d27\\\\u2d2d\\\\u2d30-\\\\u2d67\\\\u2d6f\\\\u2d80-\\\\u2d96\\\\u2da0-\\\\u2da6\\\\u2da8-\\\\u2dae\\\\u2db0-\\\\u2db6\\\\u2db8-\\\\u2dbe\\\\u2dc0-\\\\u2dc6\\\\u2dc8-\\\\u2dce\\\\u2dd0-\\\\u2dd6\\\\u2dd8-\\\\u2dde\\\\u2e2f\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303c\\\\u3041-\\\\u3096\\\\u309d-\\\\u309f\\\\u30a1-\\\\u30fa\\\\u30fc-\\\\u30ff\\\\u3105-\\\\u312d\\\\u3131-\\\\u318e\\\\u31a0-\\\\u31ba\\\\u31f0-\\\\u31ff\\\\u3400-\\\\u4db5\\\\u4e00-\\\\u9fcc\\\\ua000-\\\\ua48c\\\\ua4d0-\\\\ua4fd\\\\ua500-\\\\ua60c\\\\ua610-\\\\ua61f\\\\ua62a\\\\ua62b\\\\ua640-\\\\ua66e\\\\ua67f-\\\\ua697\\\\ua6a0-\\\\ua6ef\\\\ua717-\\\\ua71f\\\\ua722-\\\\ua788\\\\ua78b-\\\\ua78e\\\\ua790-\\\\ua793\\\\ua7a0-\\\\ua7aa\\\\ua7f8-\\\\ua801\\\\ua803-\\\\ua805\\\\ua807-\\\\ua80a\\\\ua80c-\\\\ua822\\\\ua840-\\\\ua873\\\\ua882-\\\\ua8b3\\\\ua8f2-\\\\ua8f7\\\\ua8fb\\\\ua90a-\\\\ua925\\\\ua930-\\\\ua946\\\\ua960-\\\\ua97c\\\\ua984-\\\\ua9b2\\\\ua9cf\\\\uaa00-\\\\uaa28\\\\uaa40-\\\\uaa42\\\\uaa44-\\\\uaa4b\\\\uaa60-\\\\uaa76\\\\uaa7a\\\\uaa80-\\\\uaaaf\\\\uaab1\\\\uaab5\\\\uaab6\\\\uaab9-\\\\uaabd\\\\uaac0\\\\uaac2\\\\uaadb-\\\\uaadd\\\\uaae0-\\\\uaaea\\\\uaaf2-\\\\uaaf4\\\\uab01-\\\\uab06\\\\uab09-\\\\uab0e\\\\uab11-\\\\uab16\\\\uab20-\\\\uab26\\\\uab28-\\\\uab2e\\\\uabc0-\\\\uabe2\\\\uac00-\\\\ud7a3\\\\ud7b0-\\\\ud7c6\\\\ud7cb-\\\\ud7fb\\\\uf900-\\\\ufa6d\\\\ufa70-\\\\ufad9\\\\ufb00-\\\\ufb06\\\\ufb13-\\\\ufb17\\\\ufb1d\\\\ufb1f-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40\\\\ufb41\\\\ufb43\\\\ufb44\\\\ufb46-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a\\\\uff66-\\\\uffbe\\\\uffc2-\\\\uffc7\\\\uffca-\\\\uffcf\\\\uffd2-\\\\uffd7\\\\uffda-\\\\uffdc\";\nvar nonASCIIidentifierChars = \"\\\\u0300-\\\\u036f\\\\u0483-\\\\u0487\\\\u0591-\\\\u05bd\\\\u05bf\\\\u05c1\\\\u05c2\\\\u05c4\\\\u05c5\\\\u05c7\\\\u0610-\\\\u061a\\\\u0620-\\\\u0649\\\\u0672-\\\\u06d3\\\\u06e7-\\\\u06e8\\\\u06fb-\\\\u06fc\\\\u0730-\\\\u074a\\\\u0800-\\\\u0814\\\\u081b-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082d\\\\u0840-\\\\u0857\\\\u08e4-\\\\u08fe\\\\u0900-\\\\u0903\\\\u093a-\\\\u093c\\\\u093e-\\\\u094f\\\\u0951-\\\\u0957\\\\u0962-\\\\u0963\\\\u0966-\\\\u096f\\\\u0981-\\\\u0983\\\\u09bc\\\\u09be-\\\\u09c4\\\\u09c7\\\\u09c8\\\\u09d7\\\\u09df-\\\\u09e0\\\\u0a01-\\\\u0a03\\\\u0a3c\\\\u0a3e-\\\\u0a42\\\\u0a47\\\\u0a48\\\\u0a4b-\\\\u0a4d\\\\u0a51\\\\u0a66-\\\\u0a71\\\\u0a75\\\\u0a81-\\\\u0a83\\\\u0abc\\\\u0abe-\\\\u0ac5\\\\u0ac7-\\\\u0ac9\\\\u0acb-\\\\u0acd\\\\u0ae2-\\\\u0ae3\\\\u0ae6-\\\\u0aef\\\\u0b01-\\\\u0b03\\\\u0b3c\\\\u0b3e-\\\\u0b44\\\\u0b47\\\\u0b48\\\\u0b4b-\\\\u0b4d\\\\u0b56\\\\u0b57\\\\u0b5f-\\\\u0b60\\\\u0b66-\\\\u0b6f\\\\u0b82\\\\u0bbe-\\\\u0bc2\\\\u0bc6-\\\\u0bc8\\\\u0bca-\\\\u0bcd\\\\u0bd7\\\\u0be6-\\\\u0bef\\\\u0c01-\\\\u0c03\\\\u0c46-\\\\u0c48\\\\u0c4a-\\\\u0c4d\\\\u0c55\\\\u0c56\\\\u0c62-\\\\u0c63\\\\u0c66-\\\\u0c6f\\\\u0c82\\\\u0c83\\\\u0cbc\\\\u0cbe-\\\\u0cc4\\\\u0cc6-\\\\u0cc8\\\\u0cca-\\\\u0ccd\\\\u0cd5\\\\u0cd6\\\\u0ce2-\\\\u0ce3\\\\u0ce6-\\\\u0cef\\\\u0d02\\\\u0d03\\\\u0d46-\\\\u0d48\\\\u0d57\\\\u0d62-\\\\u0d63\\\\u0d66-\\\\u0d6f\\\\u0d82\\\\u0d83\\\\u0dca\\\\u0dcf-\\\\u0dd4\\\\u0dd6\\\\u0dd8-\\\\u0ddf\\\\u0df2\\\\u0df3\\\\u0e34-\\\\u0e3a\\\\u0e40-\\\\u0e45\\\\u0e50-\\\\u0e59\\\\u0eb4-\\\\u0eb9\\\\u0ec8-\\\\u0ecd\\\\u0ed0-\\\\u0ed9\\\\u0f18\\\\u0f19\\\\u0f20-\\\\u0f29\\\\u0f35\\\\u0f37\\\\u0f39\\\\u0f41-\\\\u0f47\\\\u0f71-\\\\u0f84\\\\u0f86-\\\\u0f87\\\\u0f8d-\\\\u0f97\\\\u0f99-\\\\u0fbc\\\\u0fc6\\\\u1000-\\\\u1029\\\\u1040-\\\\u1049\\\\u1067-\\\\u106d\\\\u1071-\\\\u1074\\\\u1082-\\\\u108d\\\\u108f-\\\\u109d\\\\u135d-\\\\u135f\\\\u170e-\\\\u1710\\\\u1720-\\\\u1730\\\\u1740-\\\\u1750\\\\u1772\\\\u1773\\\\u1780-\\\\u17b2\\\\u17dd\\\\u17e0-\\\\u17e9\\\\u180b-\\\\u180d\\\\u1810-\\\\u1819\\\\u1920-\\\\u192b\\\\u1930-\\\\u193b\\\\u1951-\\\\u196d\\\\u19b0-\\\\u19c0\\\\u19c8-\\\\u19c9\\\\u19d0-\\\\u19d9\\\\u1a00-\\\\u1a15\\\\u1a20-\\\\u1a53\\\\u1a60-\\\\u1a7c\\\\u1a7f-\\\\u1a89\\\\u1a90-\\\\u1a99\\\\u1b46-\\\\u1b4b\\\\u1b50-\\\\u1b59\\\\u1b6b-\\\\u1b73\\\\u1bb0-\\\\u1bb9\\\\u1be6-\\\\u1bf3\\\\u1c00-\\\\u1c22\\\\u1c40-\\\\u1c49\\\\u1c5b-\\\\u1c7d\\\\u1cd0-\\\\u1cd2\\\\u1d00-\\\\u1dbe\\\\u1e01-\\\\u1f15\\\\u200c\\\\u200d\\\\u203f\\\\u2040\\\\u2054\\\\u20d0-\\\\u20dc\\\\u20e1\\\\u20e5-\\\\u20f0\\\\u2d81-\\\\u2d96\\\\u2de0-\\\\u2dff\\\\u3021-\\\\u3028\\\\u3099\\\\u309a\\\\ua640-\\\\ua66d\\\\ua674-\\\\ua67d\\\\ua69f\\\\ua6f0-\\\\ua6f1\\\\ua7f8-\\\\ua800\\\\ua806\\\\ua80b\\\\ua823-\\\\ua827\\\\ua880-\\\\ua881\\\\ua8b4-\\\\ua8c4\\\\ua8d0-\\\\ua8d9\\\\ua8f3-\\\\ua8f7\\\\ua900-\\\\ua909\\\\ua926-\\\\ua92d\\\\ua930-\\\\ua945\\\\ua980-\\\\ua983\\\\ua9b3-\\\\ua9c0\\\\uaa00-\\\\uaa27\\\\uaa40-\\\\uaa41\\\\uaa4c-\\\\uaa4d\\\\uaa50-\\\\uaa59\\\\uaa7b\\\\uaae0-\\\\uaae9\\\\uaaf2-\\\\uaaf3\\\\uabc0-\\\\uabe1\\\\uabec\\\\uabed\\\\uabf0-\\\\uabf9\\\\ufb20-\\\\ufb28\\\\ufe00-\\\\ufe0f\\\\ufe20-\\\\ufe26\\\\ufe33\\\\ufe34\\\\ufe4d-\\\\ufe4f\\\\uff10-\\\\uff19\\\\uff3f\";\n//var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n//var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n\nvar unicodeEscapeOrCodePoint = \"\\\\\\\\u[0-9a-fA-F]{4}|\\\\\\\\u\\\\{[0-9a-fA-F]+\\\\}\";\nvar identifierStart = \"(?:\" + unicodeEscapeOrCodePoint + \"|[\" + baseASCIIidentifierStartChars + nonASCIIidentifierStartChars + \"])\";\nvar identifierChars = \"(?:\" + unicodeEscapeOrCodePoint + \"|[\" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"])*\";\n\nexports.identifier = new RegExp(identifierStart + identifierChars, 'g');\nexports.identifierStart = new RegExp(identifierStart);\nexports.identifierMatch = new RegExp(\"(?:\" + unicodeEscapeOrCodePoint + \"|[\" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"])+\");\n\nvar nonASCIIwhitespace = /[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/; // jshint ignore:line\n\n// Whether a single character denotes a newline.\n\nexports.newline = /[\\n\\r\\u2028\\u2029]/;\n\n// Matches a whole line break (where CRLF is considered a single\n// line break). Used to count lines.\n\n// in javascript, these two differ\n// in python they are the same, different methods are called on them\nexports.lineBreak = new RegExp('\\r\\n|' + exports.newline.source);\nexports.allLineBreaks = new RegExp(exports.lineBreak.source, 'g');\n"
  },
  {
    "path": "js/src/javascript/beautifier.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Output = require('../core/output').Output;\nvar Token = require('../core/token').Token;\nvar acorn = require('./acorn');\nvar Options = require('./options').Options;\nvar Tokenizer = require('./tokenizer').Tokenizer;\nvar line_starters = require('./tokenizer').line_starters;\nvar positionable_operators = require('./tokenizer').positionable_operators;\nvar TOKEN = require('./tokenizer').TOKEN;\n\n\nfunction in_array(what, arr) {\n  return arr.indexOf(what) !== -1;\n}\n\nfunction ltrim(s) {\n  return s.replace(/^\\s+/g, '');\n}\n\nfunction generateMapFromStrings(list) {\n  var result = {};\n  for (var x = 0; x < list.length; x++) {\n    // make the mapped names underscored instead of dash\n    result[list[x].replace(/-/g, '_')] = list[x];\n  }\n  return result;\n}\n\nfunction reserved_word(token, word) {\n  return token && token.type === TOKEN.RESERVED && token.text === word;\n}\n\nfunction reserved_array(token, words) {\n  return token && token.type === TOKEN.RESERVED && in_array(token.text, words);\n}\n// Unsure of what they mean, but they work. Worth cleaning up in future.\nvar special_words = ['case', 'return', 'do', 'if', 'throw', 'else', 'await', 'break', 'continue', 'async'];\n\nvar validPositionValues = ['before-newline', 'after-newline', 'preserve-newline'];\n\n// Generate map from array\nvar OPERATOR_POSITION = generateMapFromStrings(validPositionValues);\n\nvar OPERATOR_POSITION_BEFORE_OR_PRESERVE = [OPERATOR_POSITION.before_newline, OPERATOR_POSITION.preserve_newline];\n\nvar MODE = {\n  BlockStatement: 'BlockStatement', // 'BLOCK'\n  Statement: 'Statement', // 'STATEMENT'\n  ObjectLiteral: 'ObjectLiteral', // 'OBJECT',\n  ArrayLiteral: 'ArrayLiteral', //'[EXPRESSION]',\n  ForInitializer: 'ForInitializer', //'(FOR-EXPRESSION)',\n  Conditional: 'Conditional', //'(COND-EXPRESSION)',\n  Expression: 'Expression' //'(EXPRESSION)'\n};\n\nfunction remove_redundant_indentation(output, frame) {\n  // This implementation is effective but has some issues:\n  //     - can cause line wrap to happen too soon due to indent removal\n  //           after wrap points are calculated\n  // These issues are minor compared to ugly indentation.\n\n  if (frame.multiline_frame ||\n    frame.mode === MODE.ForInitializer ||\n    frame.mode === MODE.Conditional) {\n    return;\n  }\n\n  // remove one indent from each line inside this section\n  output.remove_indent(frame.start_line_index);\n}\n\n// we could use just string.split, but\n// IE doesn't like returning empty strings\nfunction split_linebreaks(s) {\n  //return s.split(/\\x0d\\x0a|\\x0a/);\n\n  s = s.replace(acorn.allLineBreaks, '\\n');\n  var out = [],\n    idx = s.indexOf(\"\\n\");\n  while (idx !== -1) {\n    out.push(s.substring(0, idx));\n    s = s.substring(idx + 1);\n    idx = s.indexOf(\"\\n\");\n  }\n  if (s.length) {\n    out.push(s);\n  }\n  return out;\n}\n\nfunction is_array(mode) {\n  return mode === MODE.ArrayLiteral;\n}\n\nfunction is_expression(mode) {\n  return in_array(mode, [MODE.Expression, MODE.ForInitializer, MODE.Conditional]);\n}\n\nfunction all_lines_start_with(lines, c) {\n  for (var i = 0; i < lines.length; i++) {\n    var line = lines[i].trim();\n    if (line.charAt(0) !== c) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction each_line_matches_indent(lines, indent) {\n  var i = 0,\n    len = lines.length,\n    line;\n  for (; i < len; i++) {\n    line = lines[i];\n    // allow empty lines to pass through\n    if (line && line.indexOf(indent) !== 0) {\n      return false;\n    }\n  }\n  return true;\n}\n\n\nfunction Beautifier(source_text, options) {\n  options = options || {};\n  this._source_text = source_text || '';\n\n  this._output = null;\n  this._tokens = null;\n  this._last_last_text = null;\n  this._flags = null;\n  this._previous_flags = null;\n\n  this._flag_store = null;\n  this._options = new Options(options);\n}\n\nBeautifier.prototype.create_flags = function(flags_base, mode) {\n  var next_indent_level = 0;\n  if (flags_base) {\n    next_indent_level = flags_base.indentation_level;\n    if (!this._output.just_added_newline() &&\n      flags_base.line_indent_level > next_indent_level) {\n      next_indent_level = flags_base.line_indent_level;\n    }\n  }\n\n  var next_flags = {\n    mode: mode,\n    parent: flags_base,\n    last_token: flags_base ? flags_base.last_token : new Token(TOKEN.START_BLOCK, ''), // last token text\n    last_word: flags_base ? flags_base.last_word : '', // last TOKEN.WORD passed\n    declaration_statement: false,\n    declaration_assignment: false,\n    multiline_frame: false,\n    inline_frame: false,\n    if_block: false,\n    else_block: false,\n    class_start_block: false, // class A { INSIDE HERE } or class B extends C { INSIDE HERE }\n    do_block: false,\n    do_while: false,\n    import_block: false,\n    in_case_statement: false, // switch(..){ INSIDE HERE }\n    in_case: false, // we're on the exact line with \"case 0:\"\n    case_body: false, // the indented case-action block\n    case_block: false, // the indented case-action block is wrapped with {}\n    indentation_level: next_indent_level,\n    alignment: 0,\n    line_indent_level: flags_base ? flags_base.line_indent_level : next_indent_level,\n    start_line_index: this._output.get_line_number(),\n    ternary_depth: 0\n  };\n  return next_flags;\n};\n\nBeautifier.prototype._reset = function(source_text) {\n  var baseIndentString = source_text.match(/^[\\t ]*/)[0];\n\n  this._last_last_text = ''; // pre-last token text\n  this._output = new Output(this._options, baseIndentString);\n\n  // If testing the ignore directive, start with output disable set to true\n  this._output.raw = this._options.test_output_raw;\n\n\n  // Stack of parsing/formatting states, including MODE.\n  // We tokenize, parse, and output in an almost purely a forward-only stream of token input\n  // and formatted output.  This makes the beautifier less accurate than full parsers\n  // but also far more tolerant of syntax errors.\n  //\n  // For example, the default mode is MODE.BlockStatement. If we see a '{' we push a new frame of type\n  // MODE.BlockStatement on the the stack, even though it could be object literal.  If we later\n  // encounter a \":\", we'll switch to to MODE.ObjectLiteral.  If we then see a \";\",\n  // most full parsers would die, but the beautifier gracefully falls back to\n  // MODE.BlockStatement and continues on.\n  this._flag_store = [];\n  this.set_mode(MODE.BlockStatement);\n  var tokenizer = new Tokenizer(source_text, this._options);\n  this._tokens = tokenizer.tokenize();\n  return source_text;\n};\n\nBeautifier.prototype.beautify = function() {\n  // if disabled, return the input unchanged.\n  if (this._options.disabled) {\n    return this._source_text;\n  }\n\n  var sweet_code;\n  var source_text = this._reset(this._source_text);\n\n  var eol = this._options.eol;\n  if (this._options.eol === 'auto') {\n    eol = '\\n';\n    if (source_text && acorn.lineBreak.test(source_text || '')) {\n      eol = source_text.match(acorn.lineBreak)[0];\n    }\n  }\n\n  var current_token = this._tokens.next();\n  while (current_token) {\n    this.handle_token(current_token);\n\n    this._last_last_text = this._flags.last_token.text;\n    this._flags.last_token = current_token;\n\n    current_token = this._tokens.next();\n  }\n\n  sweet_code = this._output.get_code(eol);\n\n  return sweet_code;\n};\n\nBeautifier.prototype.handle_token = function(current_token, preserve_statement_flags) {\n  if (current_token.type === TOKEN.START_EXPR) {\n    this.handle_start_expr(current_token);\n  } else if (current_token.type === TOKEN.END_EXPR) {\n    this.handle_end_expr(current_token);\n  } else if (current_token.type === TOKEN.START_BLOCK) {\n    this.handle_start_block(current_token);\n  } else if (current_token.type === TOKEN.END_BLOCK) {\n    this.handle_end_block(current_token);\n  } else if (current_token.type === TOKEN.WORD) {\n    this.handle_word(current_token);\n  } else if (current_token.type === TOKEN.RESERVED) {\n    this.handle_word(current_token);\n  } else if (current_token.type === TOKEN.SEMICOLON) {\n    this.handle_semicolon(current_token);\n  } else if (current_token.type === TOKEN.STRING) {\n    this.handle_string(current_token);\n  } else if (current_token.type === TOKEN.EQUALS) {\n    this.handle_equals(current_token);\n  } else if (current_token.type === TOKEN.OPERATOR) {\n    this.handle_operator(current_token);\n  } else if (current_token.type === TOKEN.COMMA) {\n    this.handle_comma(current_token);\n  } else if (current_token.type === TOKEN.BLOCK_COMMENT) {\n    this.handle_block_comment(current_token, preserve_statement_flags);\n  } else if (current_token.type === TOKEN.COMMENT) {\n    this.handle_comment(current_token, preserve_statement_flags);\n  } else if (current_token.type === TOKEN.DOT) {\n    this.handle_dot(current_token);\n  } else if (current_token.type === TOKEN.EOF) {\n    this.handle_eof(current_token);\n  } else if (current_token.type === TOKEN.UNKNOWN) {\n    this.handle_unknown(current_token, preserve_statement_flags);\n  } else {\n    this.handle_unknown(current_token, preserve_statement_flags);\n  }\n};\n\nBeautifier.prototype.handle_whitespace_and_comments = function(current_token, preserve_statement_flags) {\n  var newlines = current_token.newlines;\n  var keep_whitespace = this._options.keep_array_indentation && is_array(this._flags.mode);\n\n  if (current_token.comments_before) {\n    var comment_token = current_token.comments_before.next();\n    while (comment_token) {\n      // The cleanest handling of inline comments is to treat them as though they aren't there.\n      // Just continue formatting and the behavior should be logical.\n      // Also ignore unknown tokens.  Again, this should result in better behavior.\n      this.handle_whitespace_and_comments(comment_token, preserve_statement_flags);\n      this.handle_token(comment_token, preserve_statement_flags);\n      comment_token = current_token.comments_before.next();\n    }\n  }\n\n  if (keep_whitespace) {\n    for (var i = 0; i < newlines; i += 1) {\n      this.print_newline(i > 0, preserve_statement_flags);\n    }\n  } else {\n    if (this._options.max_preserve_newlines && newlines > this._options.max_preserve_newlines) {\n      newlines = this._options.max_preserve_newlines;\n    }\n\n    if (this._options.preserve_newlines) {\n      if (newlines > 1) {\n        this.print_newline(false, preserve_statement_flags);\n        for (var j = 1; j < newlines; j += 1) {\n          this.print_newline(true, preserve_statement_flags);\n        }\n      }\n    }\n  }\n\n};\n\nvar newline_restricted_tokens = ['async', 'break', 'continue', 'return', 'throw', 'yield'];\n\nBeautifier.prototype.allow_wrap_or_preserved_newline = function(current_token, force_linewrap) {\n  force_linewrap = (force_linewrap === undefined) ? false : force_linewrap;\n\n  // Never wrap the first token on a line\n  if (this._output.just_added_newline()) {\n    return;\n  }\n\n  var shouldPreserveOrForce = (this._options.preserve_newlines && current_token.newlines) || force_linewrap;\n  var operatorLogicApplies = in_array(this._flags.last_token.text, positionable_operators) ||\n    in_array(current_token.text, positionable_operators);\n\n  if (operatorLogicApplies) {\n    var shouldPrintOperatorNewline = (\n        in_array(this._flags.last_token.text, positionable_operators) &&\n        in_array(this._options.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE)\n      ) ||\n      in_array(current_token.text, positionable_operators);\n    shouldPreserveOrForce = shouldPreserveOrForce && shouldPrintOperatorNewline;\n  }\n\n  if (shouldPreserveOrForce) {\n    this.print_newline(false, true);\n  } else if (this._options.wrap_line_length) {\n    if (reserved_array(this._flags.last_token, newline_restricted_tokens)) {\n      // These tokens should never have a newline inserted\n      // between them and the following expression.\n      return;\n    }\n    this._output.set_wrap_point();\n  }\n};\n\nBeautifier.prototype.print_newline = function(force_newline, preserve_statement_flags) {\n  if (!preserve_statement_flags) {\n    if (this._flags.last_token.text !== ';' && this._flags.last_token.text !== ',' && this._flags.last_token.text !== '=' && (this._flags.last_token.type !== TOKEN.OPERATOR || this._flags.last_token.text === '--' || this._flags.last_token.text === '++')) {\n      var next_token = this._tokens.peek();\n      while (this._flags.mode === MODE.Statement &&\n        !(this._flags.if_block && reserved_word(next_token, 'else')) &&\n        !this._flags.do_block) {\n        this.restore_mode();\n      }\n    }\n  }\n\n  if (this._output.add_new_line(force_newline)) {\n    this._flags.multiline_frame = true;\n  }\n};\n\nBeautifier.prototype.print_token_line_indentation = function(current_token) {\n  if (this._output.just_added_newline()) {\n    if (this._options.keep_array_indentation &&\n      current_token.newlines &&\n      (current_token.text === '[' || is_array(this._flags.mode))) {\n      this._output.current_line.set_indent(-1);\n      this._output.current_line.push(current_token.whitespace_before);\n      this._output.space_before_token = false;\n    } else if (this._output.set_indent(this._flags.indentation_level, this._flags.alignment)) {\n      this._flags.line_indent_level = this._flags.indentation_level;\n    }\n  }\n};\n\nBeautifier.prototype.print_token = function(current_token) {\n  if (this._output.raw) {\n    this._output.add_raw_token(current_token);\n    return;\n  }\n\n  if (this._options.comma_first && current_token.previous && current_token.previous.type === TOKEN.COMMA &&\n    this._output.just_added_newline()) {\n    if (this._output.previous_line.last() === ',') {\n      var popped = this._output.previous_line.pop();\n      // if the comma was already at the start of the line,\n      // pull back onto that line and reprint the indentation\n      if (this._output.previous_line.is_empty()) {\n        this._output.previous_line.push(popped);\n        this._output.trim(true);\n        this._output.current_line.pop();\n        this._output.trim();\n      }\n\n      // add the comma in front of the next token\n      this.print_token_line_indentation(current_token);\n      this._output.add_token(',');\n      this._output.space_before_token = true;\n    }\n  }\n\n  this.print_token_line_indentation(current_token);\n  this._output.non_breaking_space = true;\n  this._output.add_token(current_token.text);\n  if (this._output.previous_token_wrapped) {\n    this._flags.multiline_frame = true;\n  }\n};\n\nBeautifier.prototype.indent = function() {\n  this._flags.indentation_level += 1;\n  this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n};\n\nBeautifier.prototype.deindent = function() {\n  if (this._flags.indentation_level > 0 &&\n    ((!this._flags.parent) || this._flags.indentation_level > this._flags.parent.indentation_level)) {\n    this._flags.indentation_level -= 1;\n    this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n  }\n};\n\nBeautifier.prototype.set_mode = function(mode) {\n  if (this._flags) {\n    this._flag_store.push(this._flags);\n    this._previous_flags = this._flags;\n  } else {\n    this._previous_flags = this.create_flags(null, mode);\n  }\n\n  this._flags = this.create_flags(this._previous_flags, mode);\n  this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n};\n\n\nBeautifier.prototype.restore_mode = function() {\n  if (this._flag_store.length > 0) {\n    this._previous_flags = this._flags;\n    this._flags = this._flag_store.pop();\n    if (this._previous_flags.mode === MODE.Statement) {\n      remove_redundant_indentation(this._output, this._previous_flags);\n    }\n    this._output.set_indent(this._flags.indentation_level, this._flags.alignment);\n  }\n};\n\nBeautifier.prototype.start_of_object_property = function() {\n  return this._flags.parent.mode === MODE.ObjectLiteral && this._flags.mode === MODE.Statement && (\n    (this._flags.last_token.text === ':' && this._flags.ternary_depth === 0) || (reserved_array(this._flags.last_token, ['get', 'set'])));\n};\n\nBeautifier.prototype.start_of_statement = function(current_token) {\n  var start = false;\n  start = start || reserved_array(this._flags.last_token, ['var', 'let', 'const']) && current_token.type === TOKEN.WORD;\n  start = start || reserved_word(this._flags.last_token, 'do');\n  start = start || (!(this._flags.parent.mode === MODE.ObjectLiteral && this._flags.mode === MODE.Statement)) && reserved_array(this._flags.last_token, newline_restricted_tokens) && !current_token.newlines;\n  start = start || reserved_word(this._flags.last_token, 'else') &&\n    !(reserved_word(current_token, 'if') && !current_token.comments_before);\n  start = start || (this._flags.last_token.type === TOKEN.END_EXPR && (this._previous_flags.mode === MODE.ForInitializer || this._previous_flags.mode === MODE.Conditional));\n  start = start || (this._flags.last_token.type === TOKEN.WORD && this._flags.mode === MODE.BlockStatement &&\n    !this._flags.in_case &&\n    !(current_token.text === '--' || current_token.text === '++') &&\n    this._last_last_text !== 'function' &&\n    current_token.type !== TOKEN.WORD && current_token.type !== TOKEN.RESERVED);\n  start = start || (this._flags.mode === MODE.ObjectLiteral && (\n    (this._flags.last_token.text === ':' && this._flags.ternary_depth === 0) || reserved_array(this._flags.last_token, ['get', 'set'])));\n\n  if (start) {\n    this.set_mode(MODE.Statement);\n    this.indent();\n\n    this.handle_whitespace_and_comments(current_token, true);\n\n    // Issue #276:\n    // If starting a new statement with [if, for, while, do], push to a new line.\n    // if (a) if (b) if(c) d(); else e(); else f();\n    if (!this.start_of_object_property()) {\n      this.allow_wrap_or_preserved_newline(current_token,\n        reserved_array(current_token, ['do', 'for', 'if', 'while']));\n    }\n    return true;\n  }\n  return false;\n};\n\nBeautifier.prototype.handle_start_expr = function(current_token) {\n  // The conditional starts the statement if appropriate.\n  if (!this.start_of_statement(current_token)) {\n    this.handle_whitespace_and_comments(current_token);\n  }\n\n  var next_mode = MODE.Expression;\n  if (current_token.text === '[') {\n\n    if (this._flags.last_token.type === TOKEN.WORD || this._flags.last_token.text === ')') {\n      // this is array index specifier, break immediately\n      // a[x], fn()[x]\n      if (reserved_array(this._flags.last_token, line_starters)) {\n        this._output.space_before_token = true;\n      }\n      this.print_token(current_token);\n      this.set_mode(next_mode);\n      this.indent();\n      if (this._options.space_in_paren) {\n        this._output.space_before_token = true;\n      }\n      return;\n    }\n\n    next_mode = MODE.ArrayLiteral;\n    if (is_array(this._flags.mode)) {\n      if (this._flags.last_token.text === '[' ||\n        (this._flags.last_token.text === ',' && (this._last_last_text === ']' || this._last_last_text === '}'))) {\n        // ], [ goes to new line\n        // }, [ goes to new line\n        if (!this._options.keep_array_indentation) {\n          this.print_newline();\n        }\n      }\n    }\n\n    if (!in_array(this._flags.last_token.type, [TOKEN.START_EXPR, TOKEN.END_EXPR, TOKEN.WORD, TOKEN.OPERATOR, TOKEN.DOT])) {\n      this._output.space_before_token = true;\n    }\n  } else {\n    if (this._flags.last_token.type === TOKEN.RESERVED) {\n      if (this._flags.last_token.text === 'for') {\n        this._output.space_before_token = this._options.space_before_conditional;\n        next_mode = MODE.ForInitializer;\n      } else if (in_array(this._flags.last_token.text, ['if', 'while', 'switch'])) {\n        this._output.space_before_token = this._options.space_before_conditional;\n        next_mode = MODE.Conditional;\n      } else if (in_array(this._flags.last_word, ['await', 'async'])) {\n        // Should be a space between await and an IIFE, or async and an arrow function\n        this._output.space_before_token = true;\n      } else if (this._flags.last_token.text === 'import' && current_token.whitespace_before === '') {\n        this._output.space_before_token = false;\n      } else if (in_array(this._flags.last_token.text, line_starters) || this._flags.last_token.text === 'catch') {\n        this._output.space_before_token = true;\n      }\n    } else if (this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) {\n      // Support of this kind of newline preservation.\n      // a = (b &&\n      //     (c || d));\n      if (!this.start_of_object_property()) {\n        this.allow_wrap_or_preserved_newline(current_token);\n      }\n    } else if (this._flags.last_token.type === TOKEN.WORD) {\n      this._output.space_before_token = false;\n\n      // function name() vs function name ()\n      // function* name() vs function* name ()\n      // async name() vs async name ()\n      // In ES6, you can also define the method properties of an object\n      // var obj = {a: function() {}}\n      // It can be abbreviated\n      // var obj = {a() {}}\n      // var obj = { a() {}} vs var obj = { a () {}}\n      // var obj = { * a() {}} vs var obj = { * a () {}}\n      var peek_back_two = this._tokens.peek(-3);\n      if (this._options.space_after_named_function && peek_back_two) {\n        // peek starts at next character so -1 is current token\n        var peek_back_three = this._tokens.peek(-4);\n        if (reserved_array(peek_back_two, ['async', 'function']) ||\n          (peek_back_two.text === '*' && reserved_array(peek_back_three, ['async', 'function']))) {\n          this._output.space_before_token = true;\n        } else if (this._flags.mode === MODE.ObjectLiteral) {\n          if ((peek_back_two.text === '{' || peek_back_two.text === ',') ||\n            (peek_back_two.text === '*' && (peek_back_three.text === '{' || peek_back_three.text === ','))) {\n            this._output.space_before_token = true;\n          }\n        } else if (this._flags.parent && this._flags.parent.class_start_block) {\n          this._output.space_before_token = true;\n        }\n      }\n    } else {\n      // Support preserving wrapped arrow function expressions\n      // a.b('c',\n      //     () => d.e\n      // )\n      this.allow_wrap_or_preserved_newline(current_token);\n    }\n\n    // function() vs function ()\n    // yield*() vs yield* ()\n    // function*() vs function* ()\n    if ((this._flags.last_token.type === TOKEN.RESERVED && (this._flags.last_word === 'function' || this._flags.last_word === 'typeof')) ||\n      (this._flags.last_token.text === '*' &&\n        (in_array(this._last_last_text, ['function', 'yield']) ||\n          (this._flags.mode === MODE.ObjectLiteral && in_array(this._last_last_text, ['{', ',']))))) {\n      this._output.space_before_token = this._options.space_after_anon_function;\n    }\n  }\n\n  if (this._flags.last_token.text === ';' || this._flags.last_token.type === TOKEN.START_BLOCK) {\n    this.print_newline();\n  } else if (this._flags.last_token.type === TOKEN.END_EXPR || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.END_BLOCK || this._flags.last_token.text === '.' || this._flags.last_token.type === TOKEN.COMMA) {\n    // do nothing on (( and )( and ][ and ]( and .(\n    // TODO: Consider whether forcing this is required.  Review failing tests when removed.\n    this.allow_wrap_or_preserved_newline(current_token, current_token.newlines);\n  }\n\n  this.print_token(current_token);\n  this.set_mode(next_mode);\n  if (this._options.space_in_paren) {\n    this._output.space_before_token = true;\n  }\n\n  // In all cases, if we newline while inside an expression it should be indented.\n  this.indent();\n};\n\nBeautifier.prototype.handle_end_expr = function(current_token) {\n  // statements inside expressions are not valid syntax, but...\n  // statements must all be closed when their container closes\n  while (this._flags.mode === MODE.Statement) {\n    this.restore_mode();\n  }\n\n  this.handle_whitespace_and_comments(current_token);\n\n  if (this._flags.multiline_frame) {\n    this.allow_wrap_or_preserved_newline(current_token,\n      current_token.text === ']' && is_array(this._flags.mode) && !this._options.keep_array_indentation);\n  }\n\n  if (this._options.space_in_paren) {\n    if (this._flags.last_token.type === TOKEN.START_EXPR && !this._options.space_in_empty_paren) {\n      // () [] no inner space in empty parens like these, ever, ref #320\n      this._output.trim();\n      this._output.space_before_token = false;\n    } else {\n      this._output.space_before_token = true;\n    }\n  }\n  this.deindent();\n  this.print_token(current_token);\n  this.restore_mode();\n\n  remove_redundant_indentation(this._output, this._previous_flags);\n\n  // do {} while () // no statement required after\n  if (this._flags.do_while && this._previous_flags.mode === MODE.Conditional) {\n    this._previous_flags.mode = MODE.Expression;\n    this._flags.do_block = false;\n    this._flags.do_while = false;\n\n  }\n};\n\nBeautifier.prototype.handle_start_block = function(current_token) {\n  this.handle_whitespace_and_comments(current_token);\n\n  // Check if this is should be treated as a ObjectLiteral\n  var next_token = this._tokens.peek();\n  var second_token = this._tokens.peek(1);\n  if (this._flags.last_word === 'switch' && this._flags.last_token.type === TOKEN.END_EXPR) {\n    this.set_mode(MODE.BlockStatement);\n    this._flags.in_case_statement = true;\n  } else if (this._flags.case_body) {\n    this.set_mode(MODE.BlockStatement);\n  } else if (second_token && (\n      (in_array(second_token.text, [':', ',']) && in_array(next_token.type, [TOKEN.STRING, TOKEN.WORD, TOKEN.RESERVED])) ||\n      (in_array(next_token.text, ['get', 'set', '...']) && in_array(second_token.type, [TOKEN.WORD, TOKEN.RESERVED]))\n    )) {\n    // We don't support TypeScript,but we didn't break it for a very long time.\n    // We'll try to keep not breaking it.\n    if (in_array(this._last_last_text, ['class', 'interface']) && !in_array(second_token.text, [':', ','])) {\n      this.set_mode(MODE.BlockStatement);\n    } else {\n      this.set_mode(MODE.ObjectLiteral);\n    }\n  } else if (this._flags.last_token.type === TOKEN.OPERATOR && this._flags.last_token.text === '=>') {\n    // arrow function: (param1, paramN) => { statements }\n    this.set_mode(MODE.BlockStatement);\n  } else if (in_array(this._flags.last_token.type, [TOKEN.EQUALS, TOKEN.START_EXPR, TOKEN.COMMA, TOKEN.OPERATOR]) ||\n    reserved_array(this._flags.last_token, ['return', 'throw', 'import', 'default'])\n  ) {\n    // Detecting shorthand function syntax is difficult by scanning forward,\n    //     so check the surrounding context.\n    // If the block is being returned, imported, export default, passed as arg,\n    //     assigned with = or assigned in a nested object, treat as an ObjectLiteral.\n    this.set_mode(MODE.ObjectLiteral);\n  } else {\n    this.set_mode(MODE.BlockStatement);\n  }\n\n  if (this._flags.last_token) {\n    if (reserved_array(this._flags.last_token.previous, ['class', 'extends'])) {\n      this._flags.class_start_block = true;\n    }\n  }\n\n  var empty_braces = !next_token.comments_before && next_token.text === '}';\n  var empty_anonymous_function = empty_braces && this._flags.last_word === 'function' &&\n    this._flags.last_token.type === TOKEN.END_EXPR;\n\n  if (this._options.brace_preserve_inline) // check for inline, set inline_frame if so\n  {\n    // search forward for a newline wanted inside this block\n    var index = 0;\n    var check_token = null;\n    this._flags.inline_frame = true;\n    do {\n      index += 1;\n      check_token = this._tokens.peek(index - 1);\n      if (check_token.newlines) {\n        this._flags.inline_frame = false;\n        break;\n      }\n    } while (check_token.type !== TOKEN.EOF &&\n      !(check_token.type === TOKEN.END_BLOCK && check_token.opened === current_token));\n  }\n\n  if ((this._options.brace_style === \"expand\" ||\n      (this._options.brace_style === \"none\" && current_token.newlines)) &&\n    !this._flags.inline_frame) {\n    if (this._flags.last_token.type !== TOKEN.OPERATOR &&\n      (empty_anonymous_function ||\n        this._flags.last_token.type === TOKEN.EQUALS ||\n        (reserved_array(this._flags.last_token, special_words) && this._flags.last_token.text !== 'else'))) {\n      this._output.space_before_token = true;\n    } else {\n      this.print_newline(false, true);\n    }\n  } else { // collapse || inline_frame\n    if (is_array(this._previous_flags.mode) && (this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.COMMA)) {\n      if (this._flags.last_token.type === TOKEN.COMMA || this._options.space_in_paren) {\n        this._output.space_before_token = true;\n      }\n\n      if (this._flags.last_token.type === TOKEN.COMMA || (this._flags.last_token.type === TOKEN.START_EXPR && this._flags.inline_frame)) {\n        this.allow_wrap_or_preserved_newline(current_token);\n        this._previous_flags.multiline_frame = this._previous_flags.multiline_frame || this._flags.multiline_frame;\n        this._flags.multiline_frame = false;\n      }\n    }\n    if (this._flags.last_token.type !== TOKEN.OPERATOR && this._flags.last_token.type !== TOKEN.START_EXPR) {\n      if (in_array(this._flags.last_token.type, [TOKEN.START_BLOCK, TOKEN.SEMICOLON]) && !this._flags.inline_frame) {\n        this.print_newline();\n      } else {\n        this._output.space_before_token = true;\n      }\n    }\n  }\n  this.print_token(current_token);\n  this.indent();\n\n  // Except for specific cases, open braces are followed by a new line.\n  if (!empty_braces && !(this._options.brace_preserve_inline && this._flags.inline_frame)) {\n    this.print_newline();\n  }\n};\n\nBeautifier.prototype.handle_end_block = function(current_token) {\n  // statements must all be closed when their container closes\n  this.handle_whitespace_and_comments(current_token);\n\n  while (this._flags.mode === MODE.Statement) {\n    this.restore_mode();\n  }\n\n  var empty_braces = this._flags.last_token.type === TOKEN.START_BLOCK;\n\n  if (this._flags.inline_frame && !empty_braces) { // try inline_frame (only set if this._options.braces-preserve-inline) first\n    this._output.space_before_token = true;\n  } else if (this._options.brace_style === \"expand\") {\n    if (!empty_braces) {\n      this.print_newline();\n    }\n  } else {\n    // skip {}\n    if (!empty_braces) {\n      if (is_array(this._flags.mode) && this._options.keep_array_indentation) {\n        // we REALLY need a newline here, but newliner would skip that\n        this._options.keep_array_indentation = false;\n        this.print_newline();\n        this._options.keep_array_indentation = true;\n\n      } else {\n        this.print_newline();\n      }\n    }\n  }\n  this.restore_mode();\n  this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_word = function(current_token) {\n  if (current_token.type === TOKEN.RESERVED) {\n    if (in_array(current_token.text, ['set', 'get']) && this._flags.mode !== MODE.ObjectLiteral) {\n      current_token.type = TOKEN.WORD;\n    } else if (current_token.text === 'import' && in_array(this._tokens.peek().text, ['(', '.'])) {\n      current_token.type = TOKEN.WORD;\n    } else if (in_array(current_token.text, ['as', 'from']) && !this._flags.import_block) {\n      current_token.type = TOKEN.WORD;\n    } else if (this._flags.mode === MODE.ObjectLiteral) {\n      var next_token = this._tokens.peek();\n      if (next_token.text === ':') {\n        current_token.type = TOKEN.WORD;\n      }\n    }\n  }\n\n  if (this.start_of_statement(current_token)) {\n    // The conditional starts the statement if appropriate.\n    if (reserved_array(this._flags.last_token, ['var', 'let', 'const']) && current_token.type === TOKEN.WORD) {\n      this._flags.declaration_statement = true;\n    }\n  } else if (current_token.newlines && !is_expression(this._flags.mode) &&\n    (this._flags.last_token.type !== TOKEN.OPERATOR || (this._flags.last_token.text === '--' || this._flags.last_token.text === '++')) &&\n    this._flags.last_token.type !== TOKEN.EQUALS &&\n    (this._options.preserve_newlines || !reserved_array(this._flags.last_token, ['var', 'let', 'const', 'set', 'get']))) {\n    this.handle_whitespace_and_comments(current_token);\n    this.print_newline();\n  } else {\n    this.handle_whitespace_and_comments(current_token);\n  }\n\n  if (this._flags.do_block && !this._flags.do_while) {\n    if (reserved_word(current_token, 'while')) {\n      // do {} ## while ()\n      this._output.space_before_token = true;\n      this.print_token(current_token);\n      this._output.space_before_token = true;\n      this._flags.do_while = true;\n      return;\n    } else {\n      // do {} should always have while as the next word.\n      // if we don't see the expected while, recover\n      this.print_newline();\n      this._flags.do_block = false;\n    }\n  }\n\n  // if may be followed by else, or not\n  // Bare/inline ifs are tricky\n  // Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e();\n  if (this._flags.if_block) {\n    if (!this._flags.else_block && reserved_word(current_token, 'else')) {\n      this._flags.else_block = true;\n    } else {\n      while (this._flags.mode === MODE.Statement) {\n        this.restore_mode();\n      }\n      this._flags.if_block = false;\n      this._flags.else_block = false;\n    }\n  }\n\n  if (this._flags.in_case_statement && reserved_array(current_token, ['case', 'default'])) {\n    this.print_newline();\n    if (!this._flags.case_block && (this._flags.case_body || this._options.jslint_happy)) {\n      // switch cases following one another\n      this.deindent();\n    }\n    this._flags.case_body = false;\n\n    this.print_token(current_token);\n    this._flags.in_case = true;\n    return;\n  }\n\n  if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) {\n    if (!this.start_of_object_property() && !(\n        // start of object property is different for numeric values with +/- prefix operators\n        in_array(this._flags.last_token.text, ['+', '-']) && this._last_last_text === ':' && this._flags.parent.mode === MODE.ObjectLiteral)) {\n      this.allow_wrap_or_preserved_newline(current_token);\n    }\n  }\n\n  if (reserved_word(current_token, 'function')) {\n    if (in_array(this._flags.last_token.text, ['}', ';']) ||\n      (this._output.just_added_newline() && !(in_array(this._flags.last_token.text, ['(', '[', '{', ':', '=', ',']) || this._flags.last_token.type === TOKEN.OPERATOR))) {\n      // make sure there is a nice clean space of at least one blank line\n      // before a new function definition\n      if (!this._output.just_added_blankline() && !current_token.comments_before) {\n        this.print_newline();\n        this.print_newline(true);\n      }\n    }\n    if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD) {\n      if (reserved_array(this._flags.last_token, ['get', 'set', 'new', 'export']) ||\n        reserved_array(this._flags.last_token, newline_restricted_tokens)) {\n        this._output.space_before_token = true;\n      } else if (reserved_word(this._flags.last_token, 'default') && this._last_last_text === 'export') {\n        this._output.space_before_token = true;\n      } else if (this._flags.last_token.text === 'declare') {\n        // accomodates Typescript declare function formatting\n        this._output.space_before_token = true;\n      } else {\n        this.print_newline();\n      }\n    } else if (this._flags.last_token.type === TOKEN.OPERATOR || this._flags.last_token.text === '=') {\n      // foo = function\n      this._output.space_before_token = true;\n    } else if (!this._flags.multiline_frame && (is_expression(this._flags.mode) || is_array(this._flags.mode))) {\n      // (function\n    } else {\n      this.print_newline();\n    }\n\n    this.print_token(current_token);\n    this._flags.last_word = current_token.text;\n    return;\n  }\n\n  var prefix = 'NONE';\n\n  if (this._flags.last_token.type === TOKEN.END_BLOCK) {\n\n    if (this._previous_flags.inline_frame) {\n      prefix = 'SPACE';\n    } else if (!reserved_array(current_token, ['else', 'catch', 'finally', 'from'])) {\n      prefix = 'NEWLINE';\n    } else {\n      if (this._options.brace_style === \"expand\" ||\n        this._options.brace_style === \"end-expand\" ||\n        (this._options.brace_style === \"none\" && current_token.newlines)) {\n        prefix = 'NEWLINE';\n      } else {\n        prefix = 'SPACE';\n        this._output.space_before_token = true;\n      }\n    }\n  } else if (this._flags.last_token.type === TOKEN.SEMICOLON && this._flags.mode === MODE.BlockStatement) {\n    // TODO: Should this be for STATEMENT as well?\n    prefix = 'NEWLINE';\n  } else if (this._flags.last_token.type === TOKEN.SEMICOLON && is_expression(this._flags.mode)) {\n    prefix = 'SPACE';\n  } else if (this._flags.last_token.type === TOKEN.STRING) {\n    prefix = 'NEWLINE';\n  } else if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD ||\n    (this._flags.last_token.text === '*' &&\n      (in_array(this._last_last_text, ['function', 'yield']) ||\n        (this._flags.mode === MODE.ObjectLiteral && in_array(this._last_last_text, ['{', ',']))))) {\n    prefix = 'SPACE';\n  } else if (this._flags.last_token.type === TOKEN.START_BLOCK) {\n    if (this._flags.inline_frame) {\n      prefix = 'SPACE';\n    } else {\n      prefix = 'NEWLINE';\n    }\n  } else if (this._flags.last_token.type === TOKEN.END_EXPR) {\n    this._output.space_before_token = true;\n    prefix = 'NEWLINE';\n  }\n\n  if (reserved_array(current_token, line_starters) && this._flags.last_token.text !== ')') {\n    if (this._flags.inline_frame || this._flags.last_token.text === 'else' || this._flags.last_token.text === 'export') {\n      prefix = 'SPACE';\n    } else {\n      prefix = 'NEWLINE';\n    }\n\n  }\n\n  if (reserved_array(current_token, ['else', 'catch', 'finally'])) {\n    if ((!(this._flags.last_token.type === TOKEN.END_BLOCK && this._previous_flags.mode === MODE.BlockStatement) ||\n        this._options.brace_style === \"expand\" ||\n        this._options.brace_style === \"end-expand\" ||\n        (this._options.brace_style === \"none\" && current_token.newlines)) &&\n      !this._flags.inline_frame) {\n      this.print_newline();\n    } else {\n      this._output.trim(true);\n      var line = this._output.current_line;\n      // If we trimmed and there's something other than a close block before us\n      // put a newline back in.  Handles '} // comment' scenario.\n      if (line.last() !== '}') {\n        this.print_newline();\n      }\n      this._output.space_before_token = true;\n    }\n  } else if (prefix === 'NEWLINE') {\n    if (reserved_array(this._flags.last_token, special_words)) {\n      // no newline between 'return nnn'\n      this._output.space_before_token = true;\n    } else if (this._flags.last_token.text === 'declare' && reserved_array(current_token, ['var', 'let', 'const'])) {\n      // accomodates Typescript declare formatting\n      this._output.space_before_token = true;\n    } else if (this._flags.last_token.type !== TOKEN.END_EXPR) {\n      if ((this._flags.last_token.type !== TOKEN.START_EXPR || !reserved_array(current_token, ['var', 'let', 'const'])) && this._flags.last_token.text !== ':') {\n        // no need to force newline on 'var': for (var x = 0...)\n        if (reserved_word(current_token, 'if') && reserved_word(current_token.previous, 'else')) {\n          // no newline for } else if {\n          this._output.space_before_token = true;\n        } else {\n          this.print_newline();\n        }\n      }\n    } else if (reserved_array(current_token, line_starters) && this._flags.last_token.text !== ')') {\n      this.print_newline();\n    }\n  } else if (this._flags.multiline_frame && is_array(this._flags.mode) && this._flags.last_token.text === ',' && this._last_last_text === '}') {\n    this.print_newline(); // }, in lists get a newline treatment\n  } else if (prefix === 'SPACE') {\n    this._output.space_before_token = true;\n  }\n  if (current_token.previous && (current_token.previous.type === TOKEN.WORD || current_token.previous.type === TOKEN.RESERVED)) {\n    this._output.space_before_token = true;\n  }\n  this.print_token(current_token);\n  this._flags.last_word = current_token.text;\n\n  if (current_token.type === TOKEN.RESERVED) {\n    if (current_token.text === 'do') {\n      this._flags.do_block = true;\n    } else if (current_token.text === 'if') {\n      this._flags.if_block = true;\n    } else if (current_token.text === 'import') {\n      this._flags.import_block = true;\n    } else if (this._flags.import_block && reserved_word(current_token, 'from')) {\n      this._flags.import_block = false;\n    }\n  }\n};\n\nBeautifier.prototype.handle_semicolon = function(current_token) {\n  if (this.start_of_statement(current_token)) {\n    // The conditional starts the statement if appropriate.\n    // Semicolon can be the start (and end) of a statement\n    this._output.space_before_token = false;\n  } else {\n    this.handle_whitespace_and_comments(current_token);\n  }\n\n  var next_token = this._tokens.peek();\n  while (this._flags.mode === MODE.Statement &&\n    !(this._flags.if_block && reserved_word(next_token, 'else')) &&\n    !this._flags.do_block) {\n    this.restore_mode();\n  }\n\n  // hacky but effective for the moment\n  if (this._flags.import_block) {\n    this._flags.import_block = false;\n  }\n  this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_string = function(current_token) {\n  if (current_token.text.startsWith(\"`\") && current_token.newlines === 0 && current_token.whitespace_before === '' && (current_token.previous.text === ')' || this._flags.last_token.type === TOKEN.WORD)) {\n    //Conditional for detectign backtick strings\n  } else if (this.start_of_statement(current_token)) {\n    // The conditional starts the statement if appropriate.\n    // One difference - strings want at least a space before\n    this._output.space_before_token = true;\n  } else {\n    this.handle_whitespace_and_comments(current_token);\n    if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD || this._flags.inline_frame) {\n      this._output.space_before_token = true;\n    } else if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) {\n      if (!this.start_of_object_property()) {\n        this.allow_wrap_or_preserved_newline(current_token);\n      }\n    } else if ((current_token.text.startsWith(\"`\") && this._flags.last_token.type === TOKEN.END_EXPR && (current_token.previous.text === ']' || current_token.previous.text === ')') && current_token.newlines === 0)) {\n      this._output.space_before_token = true;\n    } else {\n      this.print_newline();\n    }\n  }\n  this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_equals = function(current_token) {\n  if (this.start_of_statement(current_token)) {\n    // The conditional starts the statement if appropriate.\n  } else {\n    this.handle_whitespace_and_comments(current_token);\n  }\n\n  if (this._flags.declaration_statement) {\n    // just got an '=' in a var-line, different formatting/line-breaking, etc will now be done\n    this._flags.declaration_assignment = true;\n  }\n  this._output.space_before_token = true;\n  this.print_token(current_token);\n  this._output.space_before_token = true;\n};\n\nBeautifier.prototype.handle_comma = function(current_token) {\n  this.handle_whitespace_and_comments(current_token, true);\n\n  this.print_token(current_token);\n  this._output.space_before_token = true;\n  if (this._flags.declaration_statement) {\n    if (is_expression(this._flags.parent.mode)) {\n      // do not break on comma, for(var a = 1, b = 2)\n      this._flags.declaration_assignment = false;\n    }\n\n    if (this._flags.declaration_assignment) {\n      this._flags.declaration_assignment = false;\n      this.print_newline(false, true);\n    } else if (this._options.comma_first) {\n      // for comma-first, we want to allow a newline before the comma\n      // to turn into a newline after the comma, which we will fixup later\n      this.allow_wrap_or_preserved_newline(current_token);\n    }\n  } else if (this._flags.mode === MODE.ObjectLiteral ||\n    (this._flags.mode === MODE.Statement && this._flags.parent.mode === MODE.ObjectLiteral)) {\n    if (this._flags.mode === MODE.Statement) {\n      this.restore_mode();\n    }\n\n    if (!this._flags.inline_frame) {\n      this.print_newline();\n    }\n  } else if (this._options.comma_first) {\n    // EXPR or DO_BLOCK\n    // for comma-first, we want to allow a newline before the comma\n    // to turn into a newline after the comma, which we will fixup later\n    this.allow_wrap_or_preserved_newline(current_token);\n  }\n};\n\nBeautifier.prototype.handle_operator = function(current_token) {\n  var isGeneratorAsterisk = current_token.text === '*' &&\n    (reserved_array(this._flags.last_token, ['function', 'yield']) ||\n      (in_array(this._flags.last_token.type, [TOKEN.START_BLOCK, TOKEN.COMMA, TOKEN.END_BLOCK, TOKEN.SEMICOLON]))\n    );\n  var isUnary = in_array(current_token.text, ['-', '+']) && (\n    in_array(this._flags.last_token.type, [TOKEN.START_BLOCK, TOKEN.START_EXPR, TOKEN.EQUALS, TOKEN.OPERATOR]) ||\n    in_array(this._flags.last_token.text, line_starters) ||\n    this._flags.last_token.text === ','\n  );\n\n  if (this.start_of_statement(current_token)) {\n    // The conditional starts the statement if appropriate.\n  } else {\n    var preserve_statement_flags = !isGeneratorAsterisk;\n    this.handle_whitespace_and_comments(current_token, preserve_statement_flags);\n  }\n\n  // hack for actionscript's import .*;\n  if (current_token.text === '*' && this._flags.last_token.type === TOKEN.DOT) {\n    this.print_token(current_token);\n    return;\n  }\n\n  if (current_token.text === '::') {\n    // no spaces around exotic namespacing syntax operator\n    this.print_token(current_token);\n    return;\n  }\n\n  if (in_array(current_token.text, ['-', '+']) && this.start_of_object_property()) {\n    // numeric value with +/- symbol in front as a property\n    this.print_token(current_token);\n    return;\n  }\n\n  // Allow line wrapping between operators when operator_position is\n  //   set to before or preserve\n  if (this._flags.last_token.type === TOKEN.OPERATOR && in_array(this._options.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE)) {\n    this.allow_wrap_or_preserved_newline(current_token);\n  }\n\n  if (current_token.text === ':' && this._flags.in_case) {\n    this.print_token(current_token);\n\n    this._flags.in_case = false;\n    this._flags.case_body = true;\n    if (this._tokens.peek().type !== TOKEN.START_BLOCK) {\n      this.indent();\n      this.print_newline();\n      this._flags.case_block = false;\n    } else {\n      this._flags.case_block = true;\n      this._output.space_before_token = true;\n    }\n    return;\n  }\n\n  var space_before = true;\n  var space_after = true;\n  var in_ternary = false;\n  if (current_token.text === ':') {\n    if (this._flags.ternary_depth === 0) {\n      // Colon is invalid javascript outside of ternary and object, but do our best to guess what was meant.\n      space_before = false;\n    } else {\n      this._flags.ternary_depth -= 1;\n      in_ternary = true;\n    }\n  } else if (current_token.text === '?') {\n    this._flags.ternary_depth += 1;\n  }\n\n  // let's handle the operator_position option prior to any conflicting logic\n  if (!isUnary && !isGeneratorAsterisk && this._options.preserve_newlines && in_array(current_token.text, positionable_operators)) {\n    var isColon = current_token.text === ':';\n    var isTernaryColon = (isColon && in_ternary);\n    var isOtherColon = (isColon && !in_ternary);\n\n    switch (this._options.operator_position) {\n      case OPERATOR_POSITION.before_newline:\n        // if the current token is : and it's not a ternary statement then we set space_before to false\n        this._output.space_before_token = !isOtherColon;\n\n        this.print_token(current_token);\n\n        if (!isColon || isTernaryColon) {\n          this.allow_wrap_or_preserved_newline(current_token);\n        }\n\n        this._output.space_before_token = true;\n        return;\n\n      case OPERATOR_POSITION.after_newline:\n        // if the current token is anything but colon, or (via deduction) it's a colon and in a ternary statement,\n        //   then print a newline.\n\n        this._output.space_before_token = true;\n\n        if (!isColon || isTernaryColon) {\n          if (this._tokens.peek().newlines) {\n            this.print_newline(false, true);\n          } else {\n            this.allow_wrap_or_preserved_newline(current_token);\n          }\n        } else {\n          this._output.space_before_token = false;\n        }\n\n        this.print_token(current_token);\n\n        this._output.space_before_token = true;\n        return;\n\n      case OPERATOR_POSITION.preserve_newline:\n        if (!isOtherColon) {\n          this.allow_wrap_or_preserved_newline(current_token);\n        }\n\n        // if we just added a newline, or the current token is : and it's not a ternary statement,\n        //   then we set space_before to false\n        space_before = !(this._output.just_added_newline() || isOtherColon);\n\n        this._output.space_before_token = space_before;\n        this.print_token(current_token);\n        this._output.space_before_token = true;\n        return;\n    }\n  }\n\n  if (isGeneratorAsterisk) {\n    this.allow_wrap_or_preserved_newline(current_token);\n    space_before = false;\n    var next_token = this._tokens.peek();\n    space_after = next_token && in_array(next_token.type, [TOKEN.WORD, TOKEN.RESERVED]);\n  } else if (current_token.text === '...') {\n    this.allow_wrap_or_preserved_newline(current_token);\n    space_before = this._flags.last_token.type === TOKEN.START_BLOCK;\n    space_after = false;\n  } else if (in_array(current_token.text, ['--', '++', '!', '~']) || isUnary) {\n    // unary operators (and binary +/- pretending to be unary) special cases\n    if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR) {\n      this.allow_wrap_or_preserved_newline(current_token);\n    }\n\n    space_before = false;\n    space_after = false;\n\n    // http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1\n    // if there is a newline between -- or ++ and anything else we should preserve it.\n    if (current_token.newlines && (current_token.text === '--' || current_token.text === '++' || current_token.text === '~')) {\n      var new_line_needed = reserved_array(this._flags.last_token, special_words) && current_token.newlines;\n      if (new_line_needed && (this._previous_flags.if_block || this._previous_flags.else_block)) {\n        this.restore_mode();\n      }\n      this.print_newline(new_line_needed, true);\n    }\n\n    if (this._flags.last_token.text === ';' && is_expression(this._flags.mode)) {\n      // for (;; ++i)\n      //        ^^^\n      space_before = true;\n    }\n\n    if (this._flags.last_token.type === TOKEN.RESERVED) {\n      space_before = true;\n    } else if (this._flags.last_token.type === TOKEN.END_EXPR) {\n      space_before = !(this._flags.last_token.text === ']' && (current_token.text === '--' || current_token.text === '++'));\n    } else if (this._flags.last_token.type === TOKEN.OPERATOR) {\n      // a++ + ++b;\n      // a - -b\n      space_before = in_array(current_token.text, ['--', '-', '++', '+']) && in_array(this._flags.last_token.text, ['--', '-', '++', '+']);\n      // + and - are not unary when preceeded by -- or ++ operator\n      // a-- + b\n      // a * +b\n      // a - -b\n      if (in_array(current_token.text, ['+', '-']) && in_array(this._flags.last_token.text, ['--', '++'])) {\n        space_after = true;\n      }\n    }\n\n\n    if (((this._flags.mode === MODE.BlockStatement && !this._flags.inline_frame) || this._flags.mode === MODE.Statement) &&\n      (this._flags.last_token.text === '{' || this._flags.last_token.text === ';')) {\n      // { foo; --i }\n      // foo(); --bar;\n      this.print_newline();\n    }\n  }\n\n  this._output.space_before_token = this._output.space_before_token || space_before;\n  this.print_token(current_token);\n  this._output.space_before_token = space_after;\n};\n\nBeautifier.prototype.handle_block_comment = function(current_token, preserve_statement_flags) {\n  if (this._output.raw) {\n    this._output.add_raw_token(current_token);\n    if (current_token.directives && current_token.directives.preserve === 'end') {\n      // If we're testing the raw output behavior, do not allow a directive to turn it off.\n      this._output.raw = this._options.test_output_raw;\n    }\n    return;\n  }\n\n  if (current_token.directives) {\n    this.print_newline(false, preserve_statement_flags);\n    this.print_token(current_token);\n    if (current_token.directives.preserve === 'start') {\n      this._output.raw = true;\n    }\n    this.print_newline(false, true);\n    return;\n  }\n\n  // inline block\n  if (!acorn.newline.test(current_token.text) && !current_token.newlines) {\n    this._output.space_before_token = true;\n    this.print_token(current_token);\n    this._output.space_before_token = true;\n    return;\n  } else {\n    this.print_block_commment(current_token, preserve_statement_flags);\n  }\n};\n\nBeautifier.prototype.print_block_commment = function(current_token, preserve_statement_flags) {\n  var lines = split_linebreaks(current_token.text);\n  var j; // iterator for this case\n  var javadoc = false;\n  var starless = false;\n  var lastIndent = current_token.whitespace_before;\n  var lastIndentLength = lastIndent.length;\n\n  // block comment starts with a new line\n  this.print_newline(false, preserve_statement_flags);\n\n  // first line always indented\n  this.print_token_line_indentation(current_token);\n  this._output.add_token(lines[0]);\n  this.print_newline(false, preserve_statement_flags);\n\n\n  if (lines.length > 1) {\n    lines = lines.slice(1);\n    javadoc = all_lines_start_with(lines, '*');\n    starless = each_line_matches_indent(lines, lastIndent);\n\n    if (javadoc) {\n      this._flags.alignment = 1;\n    }\n\n    for (j = 0; j < lines.length; j++) {\n      if (javadoc) {\n        // javadoc: reformat and re-indent\n        this.print_token_line_indentation(current_token);\n        this._output.add_token(ltrim(lines[j]));\n      } else if (starless && lines[j]) {\n        // starless: re-indent non-empty content, avoiding trim\n        this.print_token_line_indentation(current_token);\n        this._output.add_token(lines[j].substring(lastIndentLength));\n      } else {\n        // normal comments output raw\n        this._output.current_line.set_indent(-1);\n        this._output.add_token(lines[j]);\n      }\n\n      // for comments on their own line or  more than one line, make sure there's a new line after\n      this.print_newline(false, preserve_statement_flags);\n    }\n\n    this._flags.alignment = 0;\n  }\n};\n\n\nBeautifier.prototype.handle_comment = function(current_token, preserve_statement_flags) {\n  if (current_token.newlines) {\n    this.print_newline(false, preserve_statement_flags);\n  } else {\n    this._output.trim(true);\n  }\n\n  this._output.space_before_token = true;\n  this.print_token(current_token);\n  this.print_newline(false, preserve_statement_flags);\n};\n\nBeautifier.prototype.handle_dot = function(current_token) {\n  if (this.start_of_statement(current_token)) {\n    // The conditional starts the statement if appropriate.\n  } else {\n    this.handle_whitespace_and_comments(current_token, true);\n  }\n\n  if (this._flags.last_token.text.match('^[0-9]+$')) {\n    this._output.space_before_token = true;\n  }\n\n  if (reserved_array(this._flags.last_token, special_words)) {\n    this._output.space_before_token = false;\n  } else {\n    // allow preserved newlines before dots in general\n    // force newlines on dots after close paren when break_chained - for bar().baz()\n    this.allow_wrap_or_preserved_newline(current_token,\n      this._flags.last_token.text === ')' && this._options.break_chained_methods);\n  }\n\n  // Only unindent chained method dot if this dot starts a new line.\n  // Otherwise the automatic extra indentation removal will handle the over indent\n  if (this._options.unindent_chained_methods && this._output.just_added_newline()) {\n    this.deindent();\n  }\n\n  this.print_token(current_token);\n};\n\nBeautifier.prototype.handle_unknown = function(current_token, preserve_statement_flags) {\n  this.print_token(current_token);\n\n  if (current_token.text[current_token.text.length - 1] === '\\n') {\n    this.print_newline(false, preserve_statement_flags);\n  }\n};\n\nBeautifier.prototype.handle_eof = function(current_token) {\n  // Unwind any open statements\n  while (this._flags.mode === MODE.Statement) {\n    this.restore_mode();\n  }\n  this.handle_whitespace_and_comments(current_token);\n};\n\nmodule.exports.Beautifier = Beautifier;\n"
  },
  {
    "path": "js/src/javascript/index.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar Beautifier = require('./beautifier').Beautifier,\n  Options = require('./options').Options;\n\nfunction js_beautify(js_source_text, options) {\n  var beautifier = new Beautifier(js_source_text, options);\n  return beautifier.beautify();\n}\n\nmodule.exports = js_beautify;\nmodule.exports.defaultOptions = function() {\n  return new Options();\n};\n"
  },
  {
    "path": "js/src/javascript/options.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar BaseOptions = require('../core/options').Options;\n\nvar validPositionValues = ['before-newline', 'after-newline', 'preserve-newline'];\n\nfunction Options(options) {\n  BaseOptions.call(this, options, 'js');\n\n  // compatibility, re\n  var raw_brace_style = this.raw_options.brace_style || null;\n  if (raw_brace_style === \"expand-strict\") { //graceful handling of deprecated option\n    this.raw_options.brace_style = \"expand\";\n  } else if (raw_brace_style === \"collapse-preserve-inline\") { //graceful handling of deprecated option\n    this.raw_options.brace_style = \"collapse,preserve-inline\";\n  } else if (this.raw_options.braces_on_own_line !== undefined) { //graceful handling of deprecated option\n    this.raw_options.brace_style = this.raw_options.braces_on_own_line ? \"expand\" : \"collapse\";\n    // } else if (!raw_brace_style) { //Nothing exists to set it\n    //   raw_brace_style = \"collapse\";\n  }\n\n  //preserve-inline in delimited string will trigger brace_preserve_inline, everything\n  //else is considered a brace_style and the last one only will have an effect\n\n  var brace_style_split = this._get_selection_list('brace_style', ['collapse', 'expand', 'end-expand', 'none', 'preserve-inline']);\n\n  this.brace_preserve_inline = false; //Defaults in case one or other was not specified in meta-option\n  this.brace_style = \"collapse\";\n\n  for (var bs = 0; bs < brace_style_split.length; bs++) {\n    if (brace_style_split[bs] === \"preserve-inline\") {\n      this.brace_preserve_inline = true;\n    } else {\n      this.brace_style = brace_style_split[bs];\n    }\n  }\n\n  this.unindent_chained_methods = this._get_boolean('unindent_chained_methods');\n  this.break_chained_methods = this._get_boolean('break_chained_methods');\n  this.space_in_paren = this._get_boolean('space_in_paren');\n  this.space_in_empty_paren = this._get_boolean('space_in_empty_paren');\n  this.jslint_happy = this._get_boolean('jslint_happy');\n  this.space_after_anon_function = this._get_boolean('space_after_anon_function');\n  this.space_after_named_function = this._get_boolean('space_after_named_function');\n  this.keep_array_indentation = this._get_boolean('keep_array_indentation');\n  this.space_before_conditional = this._get_boolean('space_before_conditional', true);\n  this.unescape_strings = this._get_boolean('unescape_strings');\n  this.e4x = this._get_boolean('e4x');\n  this.comma_first = this._get_boolean('comma_first');\n  this.operator_position = this._get_selection('operator_position', validPositionValues);\n\n  // For testing of beautify preserve:start directive\n  this.test_output_raw = this._get_boolean('test_output_raw');\n\n  // force this._options.space_after_anon_function to true if this._options.jslint_happy\n  if (this.jslint_happy) {\n    this.space_after_anon_function = true;\n  }\n\n}\nOptions.prototype = new BaseOptions();\n\n\n\nmodule.exports.Options = Options;\n"
  },
  {
    "path": "js/src/javascript/tokenizer.js",
    "content": "/*jshint node:true */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar InputScanner = require('../core/inputscanner').InputScanner;\nvar BaseTokenizer = require('../core/tokenizer').Tokenizer;\nvar BASETOKEN = require('../core/tokenizer').TOKEN;\nvar Directives = require('../core/directives').Directives;\nvar acorn = require('./acorn');\nvar Pattern = require('../core/pattern').Pattern;\nvar TemplatablePattern = require('../core/templatablepattern').TemplatablePattern;\n\n\nfunction in_array(what, arr) {\n  return arr.indexOf(what) !== -1;\n}\n\n\nvar TOKEN = {\n  START_EXPR: 'TK_START_EXPR',\n  END_EXPR: 'TK_END_EXPR',\n  START_BLOCK: 'TK_START_BLOCK',\n  END_BLOCK: 'TK_END_BLOCK',\n  WORD: 'TK_WORD',\n  RESERVED: 'TK_RESERVED',\n  SEMICOLON: 'TK_SEMICOLON',\n  STRING: 'TK_STRING',\n  EQUALS: 'TK_EQUALS',\n  OPERATOR: 'TK_OPERATOR',\n  COMMA: 'TK_COMMA',\n  BLOCK_COMMENT: 'TK_BLOCK_COMMENT',\n  COMMENT: 'TK_COMMENT',\n  DOT: 'TK_DOT',\n  UNKNOWN: 'TK_UNKNOWN',\n  START: BASETOKEN.START,\n  RAW: BASETOKEN.RAW,\n  EOF: BASETOKEN.EOF\n};\n\n\nvar directives_core = new Directives(/\\/\\*/, /\\*\\//);\n\nvar number_pattern = /0[xX][0123456789abcdefABCDEF_]*n?|0[oO][01234567_]*n?|0[bB][01_]*n?|\\d[\\d_]*n|(?:\\.\\d[\\d_]*|\\d[\\d_]*\\.?[\\d_]*)(?:[eE][+-]?[\\d_]+)?/;\n\nvar digit = /[0-9]/;\n\n// Dot \".\" must be distinguished from \"...\" and decimal\nvar dot_pattern = /[^\\d\\.]/;\n\nvar positionable_operators = (\n  \">>> === !== &&= ??= ||= \" +\n  \"<< && >= ** != == <= >> || ?? |> \" +\n  \"< / - + > : & % ? ^ | *\").split(' ');\n\n// IMPORTANT: this must be sorted longest to shortest or tokenizing many not work.\n// Also, you must update possitionable operators separately from punct\nvar punct =\n  \">>>= \" +\n  \"... >>= <<= === >>> !== **= &&= ??= ||= \" +\n  \"=> ^= :: /= << <= == && -= >= >> != -- += ** || ?? ++ %= &= *= |= |> \" +\n  \"= ! ? > < : / ^ - + * & % ~ |\";\n\npunct = punct.replace(/[-[\\]{}()*+?.,\\\\^$|#]/g, \"\\\\$&\");\n// ?. but not if followed by a number \npunct = '\\\\?\\\\.(?!\\\\d) ' + punct;\npunct = punct.replace(/ /g, '|');\n\nvar punct_pattern = new RegExp(punct);\n\n// words which should always start on new line.\nvar line_starters = 'continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,import,export'.split(',');\nvar reserved_words = line_starters.concat(['do', 'in', 'of', 'else', 'get', 'set', 'new', 'catch', 'finally', 'typeof', 'yield', 'async', 'await', 'from', 'as', 'class', 'extends']);\nvar reserved_word_pattern = new RegExp('^(?:' + reserved_words.join('|') + ')$');\n\n// var template_pattern = /(?:(?:<\\?php|<\\?=)[\\s\\S]*?\\?>)|(?:<%[\\s\\S]*?%>)/g;\n\nvar in_html_comment;\n\nvar Tokenizer = function(input_string, options) {\n  BaseTokenizer.call(this, input_string, options);\n\n  this._patterns.whitespace = this._patterns.whitespace.matching(\n    /\\u00A0\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff/.source,\n    /\\u2028\\u2029/.source);\n\n  var pattern_reader = new Pattern(this._input);\n  var templatable = new TemplatablePattern(this._input)\n    .read_options(this._options);\n\n  this.__patterns = {\n    template: templatable,\n    identifier: templatable.starting_with(acorn.identifier).matching(acorn.identifierMatch),\n    number: pattern_reader.matching(number_pattern),\n    punct: pattern_reader.matching(punct_pattern),\n    // comment ends just before nearest linefeed or end of file\n    comment: pattern_reader.starting_with(/\\/\\//).until(/[\\n\\r\\u2028\\u2029]/),\n    //  /* ... */ comment ends with nearest */ or end of file\n    block_comment: pattern_reader.starting_with(/\\/\\*/).until_after(/\\*\\//),\n    html_comment_start: pattern_reader.matching(/<!--/),\n    html_comment_end: pattern_reader.matching(/-->/),\n    include: pattern_reader.starting_with(/#include/).until_after(acorn.lineBreak),\n    shebang: pattern_reader.starting_with(/#!/).until_after(acorn.lineBreak),\n    xml: pattern_reader.matching(/[\\s\\S]*?<(\\/?)([-a-zA-Z:0-9_.]+|{[^}]+?}|!\\[CDATA\\[[^\\]]*?\\]\\]|)(\\s*{[^}]+?}|\\s+[-a-zA-Z:0-9_.]+|\\s+[-a-zA-Z:0-9_.]+\\s*=\\s*('[^']*'|\"[^\"]*\"|{([^{}]|{[^}]+?})+?}))*\\s*(\\/?)\\s*>/),\n    single_quote: templatable.until(/['\\\\\\n\\r\\u2028\\u2029]/),\n    double_quote: templatable.until(/[\"\\\\\\n\\r\\u2028\\u2029]/),\n    template_text: templatable.until(/[`\\\\$]/),\n    template_expression: templatable.until(/[`}\\\\]/)\n  };\n\n};\nTokenizer.prototype = new BaseTokenizer();\n\nTokenizer.prototype._is_comment = function(current_token) {\n  return current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.BLOCK_COMMENT || current_token.type === TOKEN.UNKNOWN;\n};\n\nTokenizer.prototype._is_opening = function(current_token) {\n  return current_token.type === TOKEN.START_BLOCK || current_token.type === TOKEN.START_EXPR;\n};\n\nTokenizer.prototype._is_closing = function(current_token, open_token) {\n  return (current_token.type === TOKEN.END_BLOCK || current_token.type === TOKEN.END_EXPR) &&\n    (open_token && (\n      (current_token.text === ']' && open_token.text === '[') ||\n      (current_token.text === ')' && open_token.text === '(') ||\n      (current_token.text === '}' && open_token.text === '{')));\n};\n\nTokenizer.prototype._reset = function() {\n  in_html_comment = false;\n};\n\nTokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false\n  var token = null;\n  this._readWhitespace();\n  var c = this._input.peek();\n\n  if (c === null) {\n    return this._create_token(TOKEN.EOF, '');\n  }\n\n  token = token || this._read_non_javascript(c);\n  token = token || this._read_string(c);\n  token = token || this._read_pair(c, this._input.peek(1)); // Issue #2062 hack for record type '#{'\n  token = token || this._read_word(previous_token);\n  token = token || this._read_singles(c);\n  token = token || this._read_comment(c);\n  token = token || this._read_regexp(c, previous_token);\n  token = token || this._read_xml(c, previous_token);\n  token = token || this._read_punctuation();\n  token = token || this._create_token(TOKEN.UNKNOWN, this._input.next());\n\n  return token;\n};\n\nTokenizer.prototype._read_word = function(previous_token) {\n  var resulting_string;\n  resulting_string = this.__patterns.identifier.read();\n  if (resulting_string !== '') {\n    resulting_string = resulting_string.replace(acorn.allLineBreaks, '\\n');\n    if (!(previous_token.type === TOKEN.DOT ||\n        (previous_token.type === TOKEN.RESERVED && (previous_token.text === 'set' || previous_token.text === 'get'))) &&\n      reserved_word_pattern.test(resulting_string)) {\n      if ((resulting_string === 'in' || resulting_string === 'of') &&\n        (previous_token.type === TOKEN.WORD || previous_token.type === TOKEN.STRING)) { // hack for 'in' and 'of' operators\n        return this._create_token(TOKEN.OPERATOR, resulting_string);\n      }\n      return this._create_token(TOKEN.RESERVED, resulting_string);\n    }\n    return this._create_token(TOKEN.WORD, resulting_string);\n  }\n\n  resulting_string = this.__patterns.number.read();\n  if (resulting_string !== '') {\n    return this._create_token(TOKEN.WORD, resulting_string);\n  }\n};\n\nTokenizer.prototype._read_singles = function(c) {\n  var token = null;\n  if (c === '(' || c === '[') {\n    token = this._create_token(TOKEN.START_EXPR, c);\n  } else if (c === ')' || c === ']') {\n    token = this._create_token(TOKEN.END_EXPR, c);\n  } else if (c === '{') {\n    token = this._create_token(TOKEN.START_BLOCK, c);\n  } else if (c === '}') {\n    token = this._create_token(TOKEN.END_BLOCK, c);\n  } else if (c === ';') {\n    token = this._create_token(TOKEN.SEMICOLON, c);\n  } else if (c === '.' && dot_pattern.test(this._input.peek(1))) {\n    token = this._create_token(TOKEN.DOT, c);\n  } else if (c === ',') {\n    token = this._create_token(TOKEN.COMMA, c);\n  }\n\n  if (token) {\n    this._input.next();\n  }\n  return token;\n};\n\nTokenizer.prototype._read_pair = function(c, d) {\n  var token = null;\n  if (c === '#' && d === '{') {\n    token = this._create_token(TOKEN.START_BLOCK, c + d);\n  }\n\n  if (token) {\n    this._input.next();\n    this._input.next();\n  }\n  return token;\n};\n\nTokenizer.prototype._read_punctuation = function() {\n  var resulting_string = this.__patterns.punct.read();\n\n  if (resulting_string !== '') {\n    if (resulting_string === '=') {\n      return this._create_token(TOKEN.EQUALS, resulting_string);\n    } else if (resulting_string === '?.') {\n      return this._create_token(TOKEN.DOT, resulting_string);\n    } else {\n      return this._create_token(TOKEN.OPERATOR, resulting_string);\n    }\n  }\n};\n\nTokenizer.prototype._read_non_javascript = function(c) {\n  var resulting_string = '';\n\n  if (c === '#') {\n    if (this._is_first_token()) {\n      resulting_string = this.__patterns.shebang.read();\n\n      if (resulting_string) {\n        return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\\n');\n      }\n    }\n\n    // handles extendscript #includes\n    resulting_string = this.__patterns.include.read();\n\n    if (resulting_string) {\n      return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\\n');\n    }\n\n    c = this._input.next();\n\n    // Spidermonkey-specific sharp variables for circular references. Considered obsolete.\n    var sharp = '#';\n    if (this._input.hasNext() && this._input.testChar(digit)) {\n      do {\n        c = this._input.next();\n        sharp += c;\n      } while (this._input.hasNext() && c !== '#' && c !== '=');\n      if (c === '#') {\n        //\n      } else if (this._input.peek() === '[' && this._input.peek(1) === ']') {\n        sharp += '[]';\n        this._input.next();\n        this._input.next();\n      } else if (this._input.peek() === '{' && this._input.peek(1) === '}') {\n        sharp += '{}';\n        this._input.next();\n        this._input.next();\n      }\n      return this._create_token(TOKEN.WORD, sharp);\n    }\n\n    this._input.back();\n\n  } else if (c === '<' && this._is_first_token()) {\n    resulting_string = this.__patterns.html_comment_start.read();\n    if (resulting_string) {\n      while (this._input.hasNext() && !this._input.testChar(acorn.newline)) {\n        resulting_string += this._input.next();\n      }\n      in_html_comment = true;\n      return this._create_token(TOKEN.COMMENT, resulting_string);\n    }\n  } else if (in_html_comment && c === '-') {\n    resulting_string = this.__patterns.html_comment_end.read();\n    if (resulting_string) {\n      in_html_comment = false;\n      return this._create_token(TOKEN.COMMENT, resulting_string);\n    }\n  }\n\n  return null;\n};\n\nTokenizer.prototype._read_comment = function(c) {\n  var token = null;\n  if (c === '/') {\n    var comment = '';\n    if (this._input.peek(1) === '*') {\n      // peek for comment /* ... */\n      comment = this.__patterns.block_comment.read();\n      var directives = directives_core.get_directives(comment);\n      if (directives && directives.ignore === 'start') {\n        comment += directives_core.readIgnored(this._input);\n      }\n      comment = comment.replace(acorn.allLineBreaks, '\\n');\n      token = this._create_token(TOKEN.BLOCK_COMMENT, comment);\n      token.directives = directives;\n    } else if (this._input.peek(1) === '/') {\n      // peek for comment // ...\n      comment = this.__patterns.comment.read();\n      token = this._create_token(TOKEN.COMMENT, comment);\n    }\n  }\n  return token;\n};\n\nTokenizer.prototype._read_string = function(c) {\n  if (c === '`' || c === \"'\" || c === '\"') {\n    var resulting_string = this._input.next();\n    this.has_char_escapes = false;\n\n    if (c === '`') {\n      resulting_string += this._read_string_recursive('`', true, '${');\n    } else {\n      resulting_string += this._read_string_recursive(c);\n    }\n\n    if (this.has_char_escapes && this._options.unescape_strings) {\n      resulting_string = unescape_string(resulting_string);\n    }\n\n    if (this._input.peek() === c) {\n      resulting_string += this._input.next();\n    }\n\n    resulting_string = resulting_string.replace(acorn.allLineBreaks, '\\n');\n\n    return this._create_token(TOKEN.STRING, resulting_string);\n  }\n\n  return null;\n};\n\nTokenizer.prototype._allow_regexp_or_xml = function(previous_token) {\n  // regex and xml can only appear in specific locations during parsing\n  return (previous_token.type === TOKEN.RESERVED && in_array(previous_token.text, ['return', 'case', 'throw', 'else', 'do', 'typeof', 'yield'])) ||\n    (previous_token.type === TOKEN.END_EXPR && previous_token.text === ')' &&\n      previous_token.opened && previous_token.opened.previous.type === TOKEN.RESERVED && in_array(previous_token.opened.previous.text, ['if', 'while', 'for'])) ||\n    (in_array(previous_token.type, [TOKEN.COMMENT, TOKEN.START_EXPR, TOKEN.START_BLOCK, TOKEN.START,\n      TOKEN.END_BLOCK, TOKEN.OPERATOR, TOKEN.EQUALS, TOKEN.EOF, TOKEN.SEMICOLON, TOKEN.COMMA\n    ]));\n};\n\nTokenizer.prototype._read_regexp = function(c, previous_token) {\n\n  if (c === '/' && this._allow_regexp_or_xml(previous_token)) {\n    // handle regexp\n    //\n    var resulting_string = this._input.next();\n    var esc = false;\n\n    var in_char_class = false;\n    while (this._input.hasNext() &&\n      ((esc || in_char_class || this._input.peek() !== c) &&\n        !this._input.testChar(acorn.newline))) {\n      resulting_string += this._input.peek();\n      if (!esc) {\n        esc = this._input.peek() === '\\\\';\n        if (this._input.peek() === '[') {\n          in_char_class = true;\n        } else if (this._input.peek() === ']') {\n          in_char_class = false;\n        }\n      } else {\n        esc = false;\n      }\n      this._input.next();\n    }\n\n    if (this._input.peek() === c) {\n      resulting_string += this._input.next();\n\n      // regexps may have modifiers /regexp/MOD , so fetch those, too\n      // Only [gim] are valid, but if the user puts in garbage, do what we can to take it.\n      resulting_string += this._input.read(acorn.identifier);\n    }\n    return this._create_token(TOKEN.STRING, resulting_string);\n  }\n  return null;\n};\n\nTokenizer.prototype._read_xml = function(c, previous_token) {\n\n  if (this._options.e4x && c === \"<\" && this._allow_regexp_or_xml(previous_token)) {\n    var xmlStr = '';\n    var match = this.__patterns.xml.read_match();\n    // handle e4x xml literals\n    //\n    if (match) {\n      // Trim root tag to attempt to\n      var rootTag = match[2].replace(/^{\\s+/, '{').replace(/\\s+}$/, '}');\n      var isCurlyRoot = rootTag.indexOf('{') === 0;\n      var depth = 0;\n      while (match) {\n        var isEndTag = !!match[1];\n        var tagName = match[2];\n        var isSingletonTag = (!!match[match.length - 1]) || (tagName.slice(0, 8) === \"![CDATA[\");\n        if (!isSingletonTag &&\n          (tagName === rootTag || (isCurlyRoot && tagName.replace(/^{\\s+/, '{').replace(/\\s+}$/, '}')))) {\n          if (isEndTag) {\n            --depth;\n          } else {\n            ++depth;\n          }\n        }\n        xmlStr += match[0];\n        if (depth <= 0) {\n          break;\n        }\n        match = this.__patterns.xml.read_match();\n      }\n      // if we didn't close correctly, keep unformatted.\n      if (!match) {\n        xmlStr += this._input.match(/[\\s\\S]*/g)[0];\n      }\n      xmlStr = xmlStr.replace(acorn.allLineBreaks, '\\n');\n      return this._create_token(TOKEN.STRING, xmlStr);\n    }\n  }\n\n  return null;\n};\n\nfunction unescape_string(s) {\n  // You think that a regex would work for this\n  // return s.replace(/\\\\x([0-9a-f]{2})/gi, function(match, val) {\n  //         return String.fromCharCode(parseInt(val, 16));\n  //     })\n  // However, dealing with '\\xff', '\\\\xff', '\\\\\\xff' makes this more fun.\n  var out = '',\n    escaped = 0;\n\n  var input_scan = new InputScanner(s);\n  var matched = null;\n\n  while (input_scan.hasNext()) {\n    // Keep any whitespace, non-slash characters\n    // also keep slash pairs.\n    matched = input_scan.match(/([\\s]|[^\\\\]|\\\\\\\\)+/g);\n\n    if (matched) {\n      out += matched[0];\n    }\n\n    if (input_scan.peek() === '\\\\') {\n      input_scan.next();\n      if (input_scan.peek() === 'x') {\n        matched = input_scan.match(/x([0-9A-Fa-f]{2})/g);\n      } else if (input_scan.peek() === 'u') {\n        matched = input_scan.match(/u([0-9A-Fa-f]{4})/g);\n        if (!matched) {\n          matched = input_scan.match(/u\\{([0-9A-Fa-f]+)\\}/g);\n        }\n      } else {\n        out += '\\\\';\n        if (input_scan.hasNext()) {\n          out += input_scan.next();\n        }\n        continue;\n      }\n\n      // If there's some error decoding, return the original string\n      if (!matched) {\n        return s;\n      }\n\n      escaped = parseInt(matched[1], 16);\n\n      if (escaped > 0x7e && escaped <= 0xff && matched[0].indexOf('x') === 0) {\n        // we bail out on \\x7f..\\xff,\n        // leaving whole string escaped,\n        // as it's probably completely binary\n        return s;\n      } else if (escaped >= 0x00 && escaped < 0x20) {\n        // leave 0x00...0x1f escaped\n        out += '\\\\' + matched[0];\n      } else if (escaped > 0x10FFFF) {\n        // If the escape sequence is out of bounds, keep the original sequence and continue conversion\n        out += '\\\\' + matched[0];\n      } else if (escaped === 0x22 || escaped === 0x27 || escaped === 0x5c) {\n        // single-quote, apostrophe, backslash - escape these\n        out += '\\\\' + String.fromCharCode(escaped);\n      } else {\n        out += String.fromCharCode(escaped);\n      }\n    }\n  }\n\n  return out;\n}\n\n// handle string\n//\nTokenizer.prototype._read_string_recursive = function(delimiter, allow_unescaped_newlines, start_sub) {\n  var current_char;\n  var pattern;\n  if (delimiter === '\\'') {\n    pattern = this.__patterns.single_quote;\n  } else if (delimiter === '\"') {\n    pattern = this.__patterns.double_quote;\n  } else if (delimiter === '`') {\n    pattern = this.__patterns.template_text;\n  } else if (delimiter === '}') {\n    pattern = this.__patterns.template_expression;\n  }\n\n  var resulting_string = pattern.read();\n  var next = '';\n  while (this._input.hasNext()) {\n    next = this._input.next();\n    if (next === delimiter ||\n      (!allow_unescaped_newlines && acorn.newline.test(next))) {\n      this._input.back();\n      break;\n    } else if (next === '\\\\' && this._input.hasNext()) {\n      current_char = this._input.peek();\n\n      if (current_char === 'x' || current_char === 'u') {\n        this.has_char_escapes = true;\n      } else if (current_char === '\\r' && this._input.peek(1) === '\\n') {\n        this._input.next();\n      }\n      next += this._input.next();\n    } else if (start_sub) {\n      if (start_sub === '${' && next === '$' && this._input.peek() === '{') {\n        next += this._input.next();\n      }\n\n      if (start_sub === next) {\n        if (delimiter === '`') {\n          next += this._read_string_recursive('}', allow_unescaped_newlines, '`');\n        } else {\n          next += this._read_string_recursive('`', allow_unescaped_newlines, '${');\n        }\n        if (this._input.hasNext()) {\n          next += this._input.next();\n        }\n      }\n    }\n    next += pattern.read();\n    resulting_string += next;\n  }\n\n  return resulting_string;\n};\n\nmodule.exports.Tokenizer = Tokenizer;\nmodule.exports.TOKEN = TOKEN;\nmodule.exports.positionable_operators = positionable_operators.slice();\nmodule.exports.line_starters = line_starters.slice();\n"
  },
  {
    "path": "js/src/unpackers/javascriptobfuscator_unpacker.js",
    "content": "/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n//\n// simple unpacker/deobfuscator for scripts messed up with javascriptobfuscator.com\n// written by Einar Lielmanis <einar@beautifier.io>\n//\n// usage:\n//\n// if (JavascriptObfuscator.detect(some_string)) {\n//     var unpacked = JavascriptObfuscator.unpack(some_string);\n// }\n//\n//\n\n/*jshint strict:false */\n\nvar JavascriptObfuscator = {\n  detect: function(str) {\n    return /^var _0x[a-f0-9]+ ?\\= ?\\[/.test(str);\n  },\n\n  unpack: function(str) {\n    if (JavascriptObfuscator.detect(str)) {\n      var matches = /var (_0x[a-f\\d]+) ?\\= ?\\[(.*?)\\];/.exec(str);\n      if (matches) {\n        var var_name = matches[1];\n        var strings = JavascriptObfuscator._smart_split(matches[2]);\n        str = str.substring(matches[0].length);\n        for (var k in strings) {\n          str = str.replace(new RegExp(var_name + '\\\\[' + k + '\\\\]', 'g'),\n            JavascriptObfuscator._fix_quotes(JavascriptObfuscator._unescape(strings[k])));\n        }\n      }\n    }\n    return str;\n  },\n\n  _fix_quotes: function(str) {\n    var matches = /^\"(.*)\"$/.exec(str);\n    if (matches) {\n      str = matches[1];\n      str = \"'\" + str.replace(/'/g, \"\\\\'\") + \"'\";\n    }\n    return str;\n  },\n\n  _smart_split: function(str) {\n    var strings = [];\n    var pos = 0;\n    while (pos < str.length) {\n      if (str.charAt(pos) === '\"') {\n        // new word\n        var word = '';\n        pos += 1;\n        while (pos < str.length) {\n          if (str.charAt(pos) === '\"') {\n            break;\n          }\n          if (str.charAt(pos) === '\\\\') {\n            word += '\\\\';\n            pos++;\n          }\n          word += str.charAt(pos);\n          pos++;\n        }\n        strings.push('\"' + word + '\"');\n      }\n      pos += 1;\n    }\n    return strings;\n  },\n\n\n  _unescape: function(str) {\n    // inefficient if used repeatedly or on small strings, but wonderful on single large chunk of text\n    for (var i = 32; i < 128; i++) {\n      str = str.replace(new RegExp('\\\\\\\\x' + i.toString(16), 'ig'), String.fromCharCode(i));\n    }\n    str = str.replace(/\\\\x09/g, \"\\t\");\n    return str;\n  },\n\n  run_tests: function(sanity_test) {\n    var t = sanity_test || new SanityTest();\n\n    t.test_function(JavascriptObfuscator._smart_split, \"JavascriptObfuscator._smart_split\");\n    t.expect('', []);\n    t.expect('\"a\", \"b\"', ['\"a\"', '\"b\"']);\n    t.expect('\"aaa\",\"bbbb\"', ['\"aaa\"', '\"bbbb\"']);\n    t.expect('\"a\", \"b\\\\\\\"\"', ['\"a\"', '\"b\\\\\\\"\"']);\n    t.test_function(JavascriptObfuscator._unescape, 'JavascriptObfuscator._unescape');\n    t.expect('\\\\x40', '@');\n    t.expect('\\\\x10', '\\\\x10');\n    t.expect('\\\\x1', '\\\\x1');\n    t.expect(\"\\\\x61\\\\x62\\\\x22\\\\x63\\\\x64\", 'ab\"cd');\n    t.test_function(JavascriptObfuscator.detect, 'JavascriptObfuscator.detect');\n    t.expect('', false);\n    t.expect('abcd', false);\n    t.expect('var _0xaaaa', false);\n    t.expect('var _0xaaaa = [\"a\", \"b\"]', true);\n    t.expect('var _0xaaaa=[\"a\", \"b\"]', true);\n    t.expect('var _0x1234=[\"a\",\"b\"]', true);\n    return t;\n  }\n\n\n};\n"
  },
  {
    "path": "js/src/unpackers/myobfuscate_unpacker.js",
    "content": "/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n//\n// simple unpacker/deobfuscator for scripts messed up with myobfuscate.com\n// You really don't want to obfuscate your scripts there: they're tracking\n// your unpackings, your script gets turned into something like this,\n// as of 2011-04-25:\n/*\n\n    var _escape = 'your_script_escaped';\n    var _111 = document.createElement('script');\n    _111.src = 'http://api.www.myobfuscate.com/?getsrc=ok' +\n        '&ref=' + encodeURIComponent(document.referrer) +\n        '&url=' + encodeURIComponent(document.URL);\n    var 000 = document.getElementsByTagName('head')[0];\n    000.appendChild(_111);\n    document.write(unescape(_escape));\n\n*/\n//\n// written by Einar Lielmanis <einar@beautifier.io>\n//\n// usage:\n//\n// if (MyObfuscate.detect(some_string)) {\n//     var unpacked = MyObfuscate.unpack(some_string);\n// }\n//\n//\n\n/*jshint strict:false */\n\nvar MyObfuscate = {\n  detect: function(str) {\n    if (/^var _?[0O1lI]{3}\\=('|\\[).*\\)\\)\\);/.test(str)) {\n      return true;\n    }\n    if (/^function _?[0O1lI]{3}\\(_/.test(str) && /eval\\(/.test(str)) {\n      return true;\n    }\n    return false;\n  },\n\n  unpack: function(str) {\n    if (MyObfuscate.detect(str)) {\n      var __eval = eval;\n      try {\n        eval = function(unpacked) { // jshint ignore:line\n          if (MyObfuscate.starts_with(unpacked, 'var _escape')) {\n            // fetch the urlencoded stuff from the script,\n            var matches = /'([^']*)'/.exec(unpacked);\n            var unescaped = unescape(matches[1]);\n            if (MyObfuscate.starts_with(unescaped, '<script>')) {\n              unescaped = unescaped.substr(8, unescaped.length - 8);\n            }\n            if (MyObfuscate.ends_with(unescaped, '</script>')) {\n              unescaped = unescaped.substr(0, unescaped.length - 9);\n            }\n            unpacked = unescaped;\n          }\n          // throw to terminate the script\n          unpacked = \"// Unpacker warning: be careful when using myobfuscate.com for your projects:\\n\" +\n            \"// scripts obfuscated by the free online version may call back home.\\n\" +\n            \"\\n//\\n\" + unpacked;\n          throw unpacked;\n        }; // jshint ignore:line\n        __eval(str); // should throw\n      } catch (e) {\n        // well, it failed. we'll just return the original, instead of crashing on user.\n        if (typeof e === \"string\") {\n          str = e;\n        }\n      }\n      eval = __eval; // jshint ignore:line\n    }\n    return str;\n  },\n\n  starts_with: function(str, what) {\n    return str.substr(0, what.length) === what;\n  },\n\n  ends_with: function(str, what) {\n    return str.substr(str.length - what.length, what.length) === what;\n  },\n\n  run_tests: function(sanity_test) {\n    var t = sanity_test || new SanityTest();\n\n    return t;\n  }\n\n\n};\n"
  },
  {
    "path": "js/src/unpackers/p_a_c_k_e_r_unpacker.js",
    "content": "/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n//\n// Unpacker for Dean Edward's p.a.c.k.e.r, a part of javascript beautifier\n//\n// Coincidentally, it can defeat a couple of other eval-based compressors.\n//\n// usage:\n//\n// if (P_A_C_K_E_R.detect(some_string)) {\n//     var unpacked = P_A_C_K_E_R.unpack(some_string);\n// }\n//\n//\n\n/*jshint strict:false */\n\nvar P_A_C_K_E_R = {\n  detect: function(str) {\n    return (P_A_C_K_E_R.get_chunks(str).length > 0);\n  },\n\n  get_chunks: function(str) {\n    var chunks = str.match(/eval\\(\\(?function\\(.*?(,0,\\{\\}\\)\\)|split\\('\\|'\\)\\)\\))($|\\n)/g);\n    return chunks ? chunks : [];\n  },\n\n  unpack: function(str) {\n    var chunks = P_A_C_K_E_R.get_chunks(str),\n      chunk;\n    for (var i = 0; i < chunks.length; i++) {\n      chunk = chunks[i].replace(/\\n$/, '');\n      str = str.split(chunk).join(P_A_C_K_E_R.unpack_chunk(chunk));\n    }\n    return str;\n  },\n\n  unpack_chunk: function(str) {\n    var unpacked_source = '';\n    var __eval = eval;\n    if (P_A_C_K_E_R.detect(str)) {\n      try {\n        eval = function(s) { // jshint ignore:line\n          unpacked_source += s;\n          return unpacked_source;\n        }; // jshint ignore:line\n        __eval(str);\n        if (typeof unpacked_source === 'string' && unpacked_source) {\n          str = unpacked_source;\n        }\n      } catch (e) {\n        // well, it failed. we'll just return the original, instead of crashing on user.\n      }\n    }\n    eval = __eval; // jshint ignore:line\n    return str;\n  },\n\n  run_tests: function(sanity_test) {\n    var t = sanity_test || new SanityTest();\n\n    var pk1 = \"eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))\";\n    var unpk1 = 'var a=1';\n    var pk2 = \"eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p}('0 2=1',3,3,'foo||b'.split('|'),0,{}))\";\n    var unpk2 = 'foo b=1';\n    var pk_broken = \"eval(function(p,a,c,k,e,r){BORKBORK;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))\";\n    var pk3 = \"eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p}('0 2=1{}))',3,3,'var||a'.split('|'),0,{}))\";\n    var unpk3 = 'var a=1{}))';\n\n    t.test_function(P_A_C_K_E_R.detect, \"P_A_C_K_E_R.detect\");\n    t.expect('', false);\n    t.expect('var a = b', false);\n    t.test_function(P_A_C_K_E_R.unpack, \"P_A_C_K_E_R.unpack\");\n    t.expect(pk_broken, pk_broken);\n    t.expect(pk1, unpk1);\n    t.expect(pk2, unpk2);\n    t.expect(pk3, unpk3);\n    t.expect(\"function test (){alert ('This is a test!')}; \" +\n      \"eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String))\" +\n      \"{while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function\" +\n      \"(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp(\" +\n      \"'\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=\\\\\\'{Íâ–+›ï;ã†Ù¥#\\\\\\'',3,3,\" +\n      \"'var||a'.split('|'),0,{}))\",\n      \"function test (){alert ('This is a test!')}; var a='{Íâ–+›ï;ã†Ù¥#'\");\n\n\n    var filler = '\\nfiller\\n';\n    t.expect(filler + pk1 + \"\\n\" + pk_broken + filler + pk2 + filler, filler + unpk1 + \"\\n\" + pk_broken + filler + unpk2 + filler);\n\n    return t;\n  }\n\n\n};\n"
  },
  {
    "path": "js/src/unpackers/urlencode_unpacker.js",
    "content": "/*global unescape */\n/*jshint curly: false, scripturl: true */\n\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n//\n// trivial bookmarklet/escaped script detector for the javascript beautifier\n// written by Einar Lielmanis <einar@beautifier.io>\n//\n// usage:\n//\n// if (Urlencoded.detect(some_string)) {\n//     var unpacked = Urlencoded.unpack(some_string);\n// }\n//\n//\n\n/*jshint strict:false */\n\n\nvar isNode = (typeof module !== 'undefined' && module.exports);\nif (isNode) {\n  var SanityTest = require(__dirname + '/../../test/sanitytest');\n}\n\nvar Urlencoded = {\n  detect: function(str) {\n    // the fact that script doesn't contain any space, but has %20 instead\n    // should be sufficient check for now.\n    if (str.indexOf(' ') === -1) {\n      if (str.indexOf('%2') !== -1) return true;\n      if (str.replace(/[^%]+/g, '').length > 3) return true;\n    }\n    return false;\n  },\n\n  unpack: function(str) {\n    if (Urlencoded.detect(str)) {\n      if (str.indexOf('%2B') !== -1 || str.indexOf('%2b') !== -1) {\n        // \"+\" escaped as \"%2B\"\n        return unescape(str.replace(/\\+/g, '%20'));\n      } else {\n        return unescape(str);\n      }\n    }\n    return str;\n  },\n\n\n\n  run_tests: function(sanity_test) {\n    var t = sanity_test || new SanityTest();\n    t.test_function(Urlencoded.detect, \"Urlencoded.detect\");\n    t.expect('', false);\n    t.expect('var a = b', false);\n    t.expect('var%20a+=+b', true);\n    t.expect('var%20a=b', true);\n    t.expect('var%20%21%22', true);\n    t.expect('javascript:(function(){var%20whatever={init:function(){alert(%22a%22+%22b%22)}};whatever.init()})();', true);\n    t.test_function(Urlencoded.unpack, 'Urlencoded.unpack');\n\n    t.expect('javascript:(function(){var%20whatever={init:function(){alert(%22a%22+%22b%22)}};whatever.init()})();',\n      'javascript:(function(){var whatever={init:function(){alert(\"a\"+\"b\")}};whatever.init()})();'\n    );\n    t.expect('', '');\n    t.expect('abcd', 'abcd');\n    t.expect('var a = b', 'var a = b');\n    t.expect('var%20a=b', 'var a=b');\n    t.expect('var%20a=b+1', 'var a=b+1');\n    t.expect('var%20a=b%2b1', 'var a=b+1');\n    return t;\n  }\n\n\n};\n\nif (isNode) {\n  module.exports = Urlencoded;\n}\n"
  },
  {
    "path": "js/test/amd-beautify-tests.js",
    "content": "/*jshint node:true */\n\n'use strict';\n\nvar requirejs = require('requirejs'),\n  SanityTest = require('./sanitytest'),\n  Urlencoded = require('../lib/unpackers/urlencode_unpacker'),\n  run_javascript_tests = require('./generated/beautify-javascript-tests').run_javascript_tests,\n  run_css_tests = require('./generated/beautify-css-tests').run_css_tests,\n  run_html_tests = require('./generated/beautify-html-tests').run_html_tests;\n\nrequirejs.config({\n  paths: {\n    'beautify': \"..\",\n    'beautify-lib': \"../lib\"\n  }\n});\n\nfunction amd_beautifier_index_tests(name, test_runner) {\n  console.log('Testing ' + name + ' with node.js Require.js (index)...');\n  var results = new SanityTest();\n  var beautify = requirejs('beautify/index');\n\n  test_runner(\n    results,\n    Urlencoded,\n    beautify.js,\n    beautify.html,\n    beautify.css);\n\n  console.log(results.results_raw());\n  return results.get_exitcode();\n}\n\nfunction amd_beautifier_bundle_tests(name, test_runner) {\n  console.log('Testing ' + name + ' with node.js Require.js (bundle)...');\n  var results = new SanityTest();\n  var js_beautify = requirejs('beautify-lib/beautify'),\n    css_beautify = requirejs('beautify-lib/beautify-css'),\n    html_beautify = requirejs('beautify-lib/beautify-html');\n\n  test_runner(\n    results,\n    Urlencoded,\n    js_beautify.js_beautify,\n    html_beautify.html_beautify,\n    css_beautify.css_beautify);\n\n  console.log(results.results_raw());\n  return results.get_exitcode();\n}\n\n\n\nif (require.main === module) {\n  var exit = 0;\n  exit = exit || amd_beautifier_bundle_tests('js-beautifier', run_javascript_tests);\n  exit = exit || amd_beautifier_bundle_tests('cs-beautifier', run_css_tests);\n  exit = exit || amd_beautifier_bundle_tests('html-beautifier', run_html_tests);\n  exit = exit || amd_beautifier_index_tests('js-beautifier', run_javascript_tests);\n  exit = exit || amd_beautifier_index_tests('css-beautifier', run_css_tests);\n  exit = exit || amd_beautifier_index_tests('html-beautifier', run_html_tests);\n\n  process.exit(exit);\n}\n"
  },
  {
    "path": "js/test/core/test_inputscanner.js",
    "content": "/*jshint mocha:true */\n'use strict';\n\nvar assert = require('assert');\nvar InputScanner = require('../../src/core/inputscanner').InputScanner;\n\ndescribe('IndexScanner', function() {\n  describe('new', function() {\n    it('should return empty scanner when input is not present', function() {\n      assert.strictEqual(new InputScanner().hasNext(), false);\n    });\n  });\n\n  describe('next', function() {\n    it('should return the value at current index and increments the index', function() {\n      var value = 'howdy';\n      var inputText = new InputScanner(value);\n      assert.strictEqual(inputText.next(), value[0]);\n      assert.strictEqual(inputText.next(), value[1]);\n    });\n\n    it('should return null if index is at then end of the value', function() {\n      var value = 'howdy';\n      var inputText = new InputScanner(value);\n      inputText.readUntilAfter(/howdy/);\n      assert.strictEqual(inputText.next(), null);\n    });\n  });\n\n  describe('peek', function() {\n    it('should return value at index passed as parameter', function() {\n      var value = 'howdy';\n      var inputText = new InputScanner(value);\n      assert.strictEqual(inputText.peek(3), value[3]);\n      inputText.next();\n      assert.strictEqual(inputText.peek(3), value[4]);\n    });\n\n    it('should return null if index is less than 0 or greater than text length', function() {\n      var value = 'howdy';\n      var inputText = new InputScanner(value);\n      assert.strictEqual(inputText.peek(-2), null);\n      assert.strictEqual(inputText.peek(5), null);\n    });\n  });\n\n  describe('peek without parameters', function() {\n    it('should return value at index 0 if parameter is not present', function() {\n      var value = 'howdy';\n      var inputText = new InputScanner(value);\n      assert.strictEqual(inputText.peek(), value[0]);\n      inputText.next();\n      assert.strictEqual(inputText.peek(3), value[4]);\n    });\n  });\n\n  describe('test', function() {\n    it('should return whether the pattern is matched or not', function() {\n      var value = 'howdy';\n      var pattern = /how/;\n      var index = 0;\n      var inputText = new InputScanner(value);\n      assert.strictEqual(inputText.test(pattern, index), true);\n      inputText.next();\n      assert.strictEqual(inputText.test(pattern, index), false);\n    });\n  });\n\n  describe('testChar', function() {\n    it('should return whether pattern matched or not for particular index', function() {\n      var value = 'howdy';\n      var pattern = /o/;\n      var index = 1;\n      var inputText = new InputScanner(value);\n      assert.strictEqual(inputText.testChar(pattern, index), true);\n    });\n  });\n\n  describe('restart', function() {\n    it('should reset index to 0', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      inputText.next();\n      assert.strictEqual(inputText.peek(), value[1]);\n      inputText.restart();\n      assert.strictEqual(inputText.peek(), value[0]);\n    });\n  });\n\n  describe('back', function() {\n    it('should move the index one place back if current position is not 0', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      inputText.next();\n      assert.strictEqual(inputText.peek(), value[1]);\n      inputText.back();\n      assert.strictEqual(inputText.peek(), value[0]);\n    });\n\n    it('should not move the index back if current position is 0', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      assert.strictEqual(inputText.peek(), value[0]);\n      inputText.back();\n      assert.strictEqual(inputText.peek(), value[0]);\n    });\n  });\n\n  describe('hasNext', function() {\n    it('should return true if index is not at the last position', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      inputText.readUntilAfter(/howd/);\n      assert.strictEqual(inputText.hasNext(), true);\n    });\n\n    it('should return false if index is at the last position', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      inputText.readUntilAfter(/howdy/);\n      assert.strictEqual(inputText.hasNext(), false);\n    });\n  });\n\n  describe('match', function() {\n    it('should return details of pattern match and move index to next position', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      var patternmatch = inputText.match(/how/);\n      assert.strictEqual(inputText.peek(), value[3]);\n      assert.notStrictEqual(patternmatch, null);\n      assert.strictEqual(patternmatch[0], 'how');\n    });\n\n    it('should return null and not move index if there is no match', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      var patternmatch = inputText.match(/test/);\n      assert.strictEqual(inputText.peek(), value[0]);\n      assert.strictEqual(patternmatch, null);\n    });\n  });\n\n  describe('read', function() {\n    it('should return the matched substring', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var patternmatch = inputText.read(/how/);\n      assert.strictEqual(patternmatch, \"how\");\n    });\n\n    it('should return the empty string if there is no match', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var patternmatch = inputText.read(/ow/);\n      assert.strictEqual(patternmatch, \"\");\n    });\n\n    it('should return substring from start to until pattern when unitilAfter is true', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var startPattern = /how/;\n      var untilPattern = /dy/;\n      var untilAfter = true;\n      var patternmatch = inputText.read(startPattern, untilPattern, untilAfter);\n      assert.strictEqual(patternmatch, \"howdy\");\n    });\n\n    it('should return the substring matched for startPattern when untilPattern is given but unitilAfter is false', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var startPattern = /how/;\n      var untilPattern = /dy/;\n      var untilAfter = false;\n      var patternmatch = inputText.read(startPattern, untilPattern, untilAfter);\n      assert.strictEqual(patternmatch, \"how\");\n    });\n\n    it('should return substring matched for untilPattern when startPattern is null', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var startPattern = null;\n      var untilPattern = /how/;\n      var untilAfter = true;\n      var patternmatch = inputText.read(startPattern, untilPattern, untilAfter);\n      assert.strictEqual(patternmatch, \"how\");\n    });\n\n    it('should return substring matched for untilPattern when startPattern is null and untilAfter is false', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var startPattern = null;\n      var untilPattern = /how/;\n      var untilAfter = false;\n      var patternmatch = inputText.read(startPattern, untilPattern, untilAfter);\n      assert.strictEqual(patternmatch, \"\");\n    });\n  });\n\n  describe('readUntil', function() {\n    it('should return substring matched for pattern when untilAfter is true', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var pattern = /how/;\n      var untilAfter = true;\n      var patternmatch = inputText.readUntil(pattern, untilAfter);\n      assert.strictEqual(patternmatch, \"how\");\n    });\n\n    it('should return substring from index 0 to start index of matched substring when untilAfter is false', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var pattern = /wd/;\n      var untilAfter = false;\n      var patternmatch = inputText.readUntil(pattern, untilAfter);\n      assert.strictEqual(patternmatch, \"ho\");\n    });\n\n    it('should return empty string when start index of matched substring is 0 and untilAfter is false', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var pattern = /how/;\n      var untilAfter = false;\n      var patternmatch = inputText.readUntil(pattern, untilAfter);\n      assert.strictEqual(patternmatch, \"\");\n    });\n  });\n\n  describe('readUntilAfter', function() {\n    it('should return matched substring', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var pattern = /how/;\n      var patternmatch = inputText.readUntilAfter(pattern);\n      assert.strictEqual(patternmatch, \"how\");\n    });\n  });\n\n  describe('get_regexp', function() {\n    it('should return regex for string passed', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var pattern = \"ow\";\n      assert.deepStrictEqual(inputText.get_regexp(pattern), /ow/g);\n    });\n\n    it('should return regex pattern with sticky flag when match_from is true', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var matchFrom = true;\n      var pattern = \"ow\";\n      assert.deepStrictEqual(inputText.get_regexp(pattern, matchFrom).toString(), '/ow/y');\n    });\n\n    it('should return pattern with flags appeded when the input is not a string', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var matchFrom = true;\n      var pattern = /ow/;\n      assert.deepStrictEqual(inputText.get_regexp(pattern, matchFrom).toString(), '/ow/y');\n      assert.deepStrictEqual(inputText.get_regexp(pattern), /ow/g);\n    });\n  });\n\n  describe('get_literal_regexp', function() {\n    it('should return pattern for literal string', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var pattern = \"ow$/h\";\n      assert.deepStrictEqual(inputText.get_literal_regexp(pattern), /ow\\$\\/h/);\n    });\n  });\n\n  describe('peekUntilAfter', function() {\n    it('should return matched substring and retain index position', function() {\n      var value = \"howdy\";\n      var inputText = new InputScanner(value);\n      var pattern = /how/;\n      assert.strictEqual(inputText.peek(), value[0]);\n      assert.strictEqual(inputText.peekUntilAfter(pattern), \"how\");\n      assert.strictEqual(inputText.peek(), value[0]);\n    });\n  });\n\n  describe('lookBack', function() {\n    it('should return whether testVal is obtained by shifting index to the left', function() {\n      var inputText = new InputScanner(\"howdy\");\n      var testVal = \"how\";\n      inputText.readUntilAfter(/howd/);\n      assert.strictEqual(inputText.lookBack(testVal), true);\n      testVal = \"ho\";\n      assert.strictEqual(inputText.lookBack(testVal), false);\n    });\n  });\n});\n"
  },
  {
    "path": "js/test/core/test_options.js",
    "content": "/*jshint mocha:true */\n'use strict';\n\nvar assert = require('assert');\nvar options = require('../../src/core/options');\n\ndescribe('Options', function() {\n  describe('mergeOpts', function() {\n    it('should merge child option a with the parent options', function() {\n      assert.deepEqual(options.mergeOpts({\n        a: 1,\n        b: { a: 2 }\n      }, 'b'), {\n        a: 2\n      });\n    });\n    it('should include child option c and d with the parent options', function() {\n      assert.deepEqual(options.mergeOpts({\n        a: 1,\n        b: { c: 2, d: 3 }\n      }, 'b'), {\n        a: 1,\n        c: 2,\n        d: 3\n      });\n    });\n    it('should merge child option a and include c with the parent options', function() {\n      assert.deepEqual(options.mergeOpts({\n        a: 1,\n        b: { a: 2, c: 3 }\n      }, 'b'), {\n        a: 2,\n        c: 3\n      });\n    });\n  });\n\n  describe('normalizeOpts', function() {\n    it('should replace key with - to _', function() {\n      assert.deepEqual(options.normalizeOpts({\n        'a-b': 1\n      }), {\n        a_b: 1\n      });\n    });\n    it('should do nothing', function() {\n      assert.deepEqual(options.mergeOpts({\n        a: 1,\n        b_c: 2\n      }, 'b'), {\n        a: 1,\n        b_c: 2\n      });\n    });\n  });\n\n  describe('_get_boolean', function() {\n    it('should return false with no option and no default', function() {\n      assert.equal(new options.Options()._get_boolean(), false);\n    });\n    it('should return true as default since no option', function() {\n      assert.equal(new options.Options()._get_boolean('a', true), true);\n    });\n    it('should return false as in option', function() {\n      assert.equal(new options.Options({ a: false })._get_boolean('a', true), false);\n    });\n  });\n\n  describe('_get_characters', function() {\n    it('should return \\'\\' with no option', function() {\n      assert.equal(new options.Options()._get_characters(), '');\n    });\n    it('should return \\'character\\' as default since no option', function() {\n      assert.equal(new options.Options()._get_characters('a', 'character'), 'character');\n    });\n    it('should return \\'char\\' as in option', function() {\n      assert.equal(new options.Options({ a: 'char' })._get_characters('a', 'character'), 'char');\n    });\n  });\n\n  describe('_get_number', function() {\n    it('should return 0 with no option', function() {\n      assert.equal(new options.Options()._get_number(), 0);\n    });\n    it('should return 1 as default since no option', function() {\n      assert.equal(new options.Options()._get_number('a', 1), 1);\n    });\n    it('should return 10 as in option', function() {\n      assert.equal(new options.Options({ a: 10 })._get_number('a', 1), 10);\n    });\n    it('should return 0 for NaN as in option', function() {\n      assert.equal(new options.Options({ a: 'abc' })._get_number('a'), 0);\n    });\n    it('should return 0 for NaN as in default', function() {\n      assert.equal(new options.Options()._get_number('a', 'abc'), 0);\n    });\n  });\n\n  describe('_get_array', function() {\n    it('should return [] with no option', function() {\n      assert.deepEqual(new options.Options()._get_array(), []);\n    });\n    it('should return [\\'a\\',\\'b\\'] as default since no option', function() {\n      assert.deepEqual(new options.Options()._get_array('a', ['a', 'b']), ['a', 'b']);\n    });\n    it('should return [\\'c\\',\\'d\\'] as in option', function() {\n      assert.deepEqual(new options.Options({ a: ['c', 'd'] })._get_array('a', ['a', 'b']), ['c', 'd']);\n    });\n    it('should return [\\'c\\',\\'d\\'] as in option comma separated', function() {\n      assert.deepEqual(new options.Options({ a: 'c,d' })._get_array('a', ['a', 'b']), ['c', 'd']);\n    });\n  });\n\n  describe('_is_valid_selection', function() {\n    it('should return false with empty selection', function() {\n      assert.equal(new options.Options()._is_valid_selection(['a', 'b'], []), false);\n    });\n    it('should return false with selection inexistent', function() {\n      assert.equal(new options.Options()._is_valid_selection(['a', 'b'], ['c']), false);\n    });\n    it('should return true with selection existent', function() {\n      assert.equal(new options.Options()._is_valid_selection(['a', 'b'], ['a', 'b']), true);\n    });\n  });\n\n  describe('_get_selection_list', function() {\n    it('should throw error with empty selection', function() {\n      assert.throws(new options.Options()._get_selection_list, /^Error: Selection list cannot be empty.$/);\n    });\n    it('should throw error with invalid default', function() {\n      assert.throws(function() { new options.Options()._get_selection_list('a', ['a', 'b'], ['c']); }, /^Error: Invalid Default Value!$/);\n    });\n    it('should throw error with invalid option', function() {\n      assert.throws(function() { new options.Options({ a: ['c', 'd'] })._get_selection_list('a', ['a', 'b'], ['a']); }, /^Error: Invalid Option Value: The option/);\n    });\n    it('should return [\\'a\\'] as in option', function() {\n      assert.deepEqual(new options.Options({ a: ['a'] })._get_selection_list('a', ['a', 'b'], ['a']), ['a']);\n    });\n  });\n\n  describe('_get_selection', function() {\n    it('should throw error with multiple selection', function() {\n      assert.throws(function() { new options.Options({ a: ['a', 'b'] })._get_selection('a', ['a', 'b'], ['a']); }, /^Error: Invalid Option Value: The option/);\n    });\n    it('should return \\'a\\' as in option ', function() {\n      assert.equal(new options.Options({ a: ['a'] })._get_selection('a', ['a', 'b'], ['a']), 'a');\n    });\n  });\n\n});\n"
  },
  {
    "path": "js/test/node-beautify-css-perf-tests.js",
    "content": "/*global js_beautify: true */\n/*jshint node:true */\n/*jshint unused:false */\n\n'use strict';\n\nvar fs = require('fs'),\n  SanityTest = require('./sanitytest'),\n  Benchmark = require('benchmark'),\n  Urlencoded = require('../lib/unpackers/urlencode_unpacker'),\n  beautifier = require('../src/index');\n\nfunction node_beautifier_html_tests() {\n  console.log('Testing performance...');\n  var github_css = fs.readFileSync(__dirname + '/../../test/resources/github.css', 'utf8');\n  var options = {\n    wrap_line_length: 80\n  };\n\n  //warm-up\n  beautifier.css(github_css, options);\n\n  var suite = new Benchmark.Suite();\n\n  suite.add(\"css-beautify (github.css)\", function() {\n      beautifier.css(github_css, options);\n    })\n    // add listeners\n    .on('cycle', function(event) {\n      console.log(String(event.target));\n    })\n    .on('error', function(event) {\n      return 1;\n    })\n    .on('complete', function(event) {})\n    .run();\n  return 0;\n}\n\n\n\n\nif (require.main === module) {\n  process.exit(node_beautifier_html_tests());\n}\n"
  },
  {
    "path": "js/test/node-beautify-html-perf-tests.js",
    "content": "/*global js_beautify: true */\n/*jshint node:true */\n/*jshint unused:false */\n\n'use strict';\n\nvar fs = require('fs'),\n  SanityTest = require('./sanitytest'),\n  Benchmark = require('benchmark'),\n  Urlencoded = require('../lib/unpackers/urlencode_unpacker'),\n  beautifier = require('../src/index');\n\nfunction node_beautifier_html_tests() {\n  console.log('Testing performance...');\n  var github_html = fs.readFileSync(__dirname + '/../../test/resources/github.html', 'utf8');\n  var index_html = fs.readFileSync(__dirname + '/../../index.html', 'utf8');\n  var data_attr = fs.readFileSync(__dirname + '/../../test/resources/html-with-base64image.html', 'utf8');\n  var options = {\n    wrap_line_length: 80\n  };\n\n  //warm-up\n  beautifier.html(github_html, options);\n  beautifier.html(data_attr, options);\n\n  var suite = new Benchmark.Suite();\n\n  suite.add(\"html-beautify (index.html)\", function() {\n      beautifier.html(index_html, options);\n    })\n    .add(\"html-beautify (base64 image)\", function() {\n      beautifier.html(data_attr, options);\n    })\n    .add(\"html-beautify (github.html)\", function() {\n      beautifier.html(github_html, options);\n    })\n    // add listeners\n    .on('cycle', function(event) {\n      console.log(String(event.target));\n    })\n    .on('error', function(event) {\n      return 1;\n    })\n    .on('complete', function(event) {})\n    .run();\n  return 0;\n}\n\n\n\n\nif (require.main === module) {\n  process.exit(node_beautifier_html_tests());\n}\n"
  },
  {
    "path": "js/test/node-beautify-perf-tests.js",
    "content": "/*global js_beautify: true */\n/*jshint node:true */\n/*jshint unused:false */\n\n'use strict';\n\nvar fs = require('fs'),\n  SanityTest = require('./sanitytest'),\n  Benchmark = require('benchmark'),\n  Urlencoded = require('../lib/unpackers/urlencode_unpacker'),\n  beautifier = require('../src/index');\n\nfunction node_beautifier_tests() {\n  console.log('Testing performance...');\n  var data = fs.readFileSync(__dirname + '/../../test/resources/underscore.js', 'utf8');\n  var data_min = fs.readFileSync(__dirname + '/../../test/resources/underscore-min.js', 'utf8');\n  var github_min = fs.readFileSync(__dirname + '/../../test/resources/github-min.js', 'utf8');\n  var options = {\n    wrap_line_length: 80\n  };\n\n  //warm-up\n  beautifier.js(data, options);\n  beautifier.js(data_min, options);\n\n  var suite = new Benchmark.Suite();\n\n  suite.add(\"js-beautify (underscore)\", function() {\n      beautifier.js(data, options);\n    })\n    .add(\"js-beautify (underscore-min)\", function() {\n      beautifier.js(data_min, options);\n    })\n    .add(\"js-beautify (github-min)\", function() {\n      beautifier.js(github_min, options);\n    })\n    // add listeners\n    .on('cycle', function(event) {\n      console.log(String(event.target));\n    })\n    .on('error', function(event) {\n      return 1;\n    })\n    .on('complete', function(event) {})\n    .run();\n  return 0;\n}\n\n\n\n\nif (require.main === module) {\n  process.exit(node_beautifier_tests());\n}\n"
  },
  {
    "path": "js/test/node-beautify-tests.js",
    "content": "/*jshint node:true */\n\n'use strict';\n\nvar SanityTest = require('./sanitytest'),\n  Urlencoded = require('../lib/unpackers/urlencode_unpacker'),\n  run_javascript_tests = require('./generated/beautify-javascript-tests').run_javascript_tests,\n  run_css_tests = require('./generated/beautify-css-tests').run_css_tests,\n  run_html_tests = require('./generated/beautify-html-tests').run_html_tests;\n\nfunction test_legacy_names() {\n  var beautify = require('../index');\n  var results = new SanityTest();\n\n\n  console.log('Ensure all expected functions are defined');\n  results.expect(typeof beautify.js, 'function');\n  results.expect(typeof beautify.css, 'function');\n  results.expect(typeof beautify.html, 'function');\n\n  console.log('Ensure defaultOptions are defined');\n  results.expect(typeof beautify.js.defaultOptions, 'function');\n  results.expect(typeof beautify.css.defaultOptions, 'function');\n  results.expect(typeof beautify.html.defaultOptions, 'function');\n\n  console.log('Ensure that legacy import names equal the new ones');\n  results.expect(beautify.js, beautify.js_beautify);\n  results.expect(beautify.css, beautify.css_beautify);\n  results.expect(beautify.html, beautify.html_beautify);\n  results.expect(beautify.js.defaultOptions, beautify.js_beautify.defaultOptions);\n  results.expect(beautify.css.defaultOptions, beautify.css_beautify.defaultOptions);\n  results.expect(beautify.html.defaultOptions, beautify.html_beautify.defaultOptions);\n\n  console.log(results.results_raw());\n  return results.get_exitcode();\n}\n\nfunction node_beautifier_index_tests(name, test_runner) {\n  console.log('Testing ' + name + ' with node.js CommonJS (index)...');\n  var beautify = require('../index');\n\n  var results = new SanityTest();\n  test_runner(\n    results,\n    Urlencoded,\n    beautify.js,\n    beautify.html,\n    beautify.css);\n\n  console.log(results.results_raw());\n  return results.get_exitcode();\n}\n\nfunction node_beautifier_bundle_tests(name, test_runner) {\n  console.log('Testing ' + name + ' with node.js CommonJS (bundle)...');\n  var beautify = require('../lib/beautifier');\n\n  var results = new SanityTest();\n  test_runner(\n    results,\n    Urlencoded,\n    beautify.js,\n    beautify.html,\n    beautify.css);\n\n  console.log(results.results_raw());\n  return results.get_exitcode();\n}\n\nif (require.main === module) {\n  var exit = 0;\n  exit = exit || test_legacy_names();\n  exit = exit || node_beautifier_index_tests('js-beautifier', run_javascript_tests);\n  exit = exit || node_beautifier_index_tests('css-beautifier', run_css_tests);\n  exit = exit || node_beautifier_index_tests('html-beautifier', run_html_tests);\n  exit = exit || node_beautifier_bundle_tests('js-beautifier', run_javascript_tests);\n  exit = exit || node_beautifier_bundle_tests('css-beautifier', run_css_tests);\n  exit = exit || node_beautifier_bundle_tests('html-beautifier', run_html_tests);\n\n  process.exit(exit);\n}\n"
  },
  {
    "path": "js/test/node-src-index-tests.js",
    "content": "#!/usr/bin/env node\n\n/*jshint node:true */\n\n'use strict';\n\nvar SanityTest = require('./sanitytest'),\n  Urlencoded = require('../lib/unpackers/urlencode_unpacker'),\n  run_javascript_tests = require('./generated/beautify-javascript-tests').run_javascript_tests,\n  run_css_tests = require('./generated/beautify-css-tests').run_css_tests,\n  run_html_tests = require('./generated/beautify-html-tests').run_html_tests;\n\nfunction test_names() {\n  var beautify = require('../index');\n  var results = new SanityTest();\n\n  console.log('Ensure all expected functions are defined');\n  results.expect(typeof beautify.js, 'function');\n  results.expect(typeof beautify.css, 'function');\n  results.expect(typeof beautify.html, 'function');\n\n  console.log(results.results_raw());\n  return results.get_exitcode();\n}\n\nfunction node_beautifier_index_tests(name, test_runner) {\n  console.log('Testing ' + name + ' with node.js CommonJS (src/index)...');\n  var beautify = require('../src/index');\n\n  var results = new SanityTest();\n  test_runner(\n    results,\n    Urlencoded,\n    beautify.js,\n    beautify.html,\n    beautify.css);\n\n  console.log(results.results_raw());\n  return results.get_exitcode();\n}\n\nif (require.main === module) {\n  var exit = 0;\n  exit = exit || test_names();\n  exit = exit || node_beautifier_index_tests('js-beautifier', run_javascript_tests);\n  exit = exit || node_beautifier_index_tests('css-beautifier', run_css_tests);\n  exit = exit || node_beautifier_index_tests('html-beautifier', run_html_tests);\n\n  process.exit(exit);\n}\n"
  },
  {
    "path": "js/test/resources/configerror/.jsbeautifyrc",
    "content": "{\n    \"indent_size\": 11,\n    \"indent_char\": \" \"\n    \"indent_level\": 0,\n    \"indent_with_tabs\": false\n}\n"
  },
  {
    "path": "js/test/resources/configerror/subDir1/subDir2/empty.txt",
    "content": ""
  },
  {
    "path": "js/test/resources/editorconfig/.editorconfig",
    "content": "root = true\n\n[*.js]\nindent_style = space\nindent_size = 2\ninsert_final_newline = false\n"
  },
  {
    "path": "js/test/resources/editorconfig/cr/.editorconfig",
    "content": "\n[*.js]\nend_of_line = cr\n"
  },
  {
    "path": "js/test/resources/editorconfig/crlf/.editorconfig",
    "content": "\n[*.js]\nend_of_line = crlf\n"
  },
  {
    "path": "js/test/resources/editorconfig/error/.editorconfig",
    "content": "Random stuff in here to cause parse error\n"
  },
  {
    "path": "js/test/resources/editorconfig/example-base.js",
    "content": "function indentMe() {\n    \"no, me!\"; // indent_size 4, will be beautified to 2 with editorconfig\n}\n"
  },
  {
    "path": "js/test/resources/example1.js",
    "content": "function indentMe() {\n\"no, me!\";\n}\n"
  },
  {
    "path": "js/test/resources/indent11chars/.jsbeautifyrc",
    "content": "{\n    \"indent_size\": 11,\n    \"indent_char\": \" \",\n    \"indent_level\": 0,\n    \"indent_with_tabs\": false\n}\n"
  },
  {
    "path": "js/test/resources/indent11chars/subDir1/subDir2/empty.txt",
    "content": ""
  },
  {
    "path": "js/test/run-tests",
    "content": "#!/usr/bin/spidermonkey-1.7 -s\n\n//#!/usr/bin/js\n\n// a little helper for testing from command line\n// just run it, it will output the test results\n\nload('js/lib/beautify.js');\nload('js/test/sanitytest.js')\nload('js/test/beautify-tests.js')\nload('js/lib/unpackers/urlencode_unpacker.js')\n\nprint(run_beautifier_tests(new SanityTest(), Urlencoded, js_beautify).results_raw())\n\n\n// for nodejs use this from the command line from the main directory:\n// node test/beautify-tests.js\n"
  },
  {
    "path": "js/test/sanitytest.js",
    "content": "//\n// simple testing interface\n// written by Einar Lielmanis, einar@beautifier.io\n//\n// usage:\n//\n// var t = new SanityTest(function (x) { return x; }, 'my function');\n// t.expect('input', 'output');\n// t.expect('a', 'a');\n// output_somewhere(t.results()); // good for <pre>, html safe-ish\n// alert(t.results_raw());        // html unescaped\n\nfunction SanityTest(func, name_of_test) {\n  'use strict';\n\n  var test_func = func || function(x) {\n    return x;\n  };\n\n  var test_name = name_of_test || '';\n\n  var n_failed = 0;\n  var n_succeeded = 0;\n\n  var failures = [];\n\n  this.test_function = function(func, name) {\n    test_func = func;\n    test_name = name || '';\n  };\n\n  this.get_exitcode = function() {\n    return n_succeeded === 0 || n_failed !== 0 ? 1 : 0;\n  };\n\n  this.expect = function(parameters, expected_value) {\n    // multi-parameter calls not supported (I don't need them now).\n    var result = test_func(parameters);\n    // proper array checking is a pain. i'll maybe do it later, compare strings representations instead\n    if ((result === expected_value) || (expected_value instanceof Array && result.join(', ') === expected_value.join(', '))) {\n      n_succeeded += 1;\n      return true;\n    } else {\n      n_failed += 1;\n      failures.push([test_name, parameters, expected_value, result]);\n      return false;\n    }\n  };\n\n\n  this.results_raw = function() {\n    var results = '';\n    if (n_failed === 0) {\n      if (n_succeeded === 0) {\n        results = 'No tests run.';\n      } else {\n        results = 'All ' + n_succeeded + ' tests passed.';\n      }\n    } else {\n      for (var i = 0; i < failures.length; i++) {\n        var f = failures[i];\n        if (f[0]) {\n          f[0] = f[0] + ' ';\n        }\n        results += '==== ' + f[0] + '============================================================\\n';\n        results += '---- input -------\\n' + this.prettyprint(f[1]) + '\\n';\n        results += '---- expected ----\\n' + this.prettyprint(f[2]) + '\\n';\n        results += '---- output ------\\n' + this.prettyprint(f[3]) + '\\n';\n        results += '---- expected-ws ------\\n' + this.prettyprint_whitespace(f[2]) + '\\n';\n        results += '---- output-ws ------\\n' + this.prettyprint_whitespace(f[3]) + '\\n';\n        results += '================================================================\\n\\n';\n      }\n      results += n_failed + ' tests failed.\\n';\n    }\n    return results;\n  };\n\n\n  this.results = function() {\n    return this.lazy_escape(this.results_raw());\n  };\n\n  this.prettyprint_whitespace = function(something, quote_strings) {\n    return (this.prettyprint(something, quote_strings)\n      .replace(/\\r\\n/g, '\\\\r\\n')\n      .replace(/\\n/g, '\\\\n\\n')\n      .replace(/\\r/g, '\\\\r\\n')\n      .replace(/ /g, '_')\n      .replace(/\\t/g, '===|'));\n  };\n\n  this.prettyprint = function(something, quote_strings) {\n    var type = typeof something;\n    switch (type.toLowerCase()) {\n      case 'string':\n        if (quote_strings) {\n          return \"'\" + something.replace(\"'\", \"\\\\'\") + \"'\";\n        }\n        return something;\n      case 'number':\n        return '' + something;\n      case 'boolean':\n        return something ? 'true' : 'false';\n      case 'undefined':\n        return 'undefined';\n      case 'object':\n        if (something instanceof Array) {\n          var x = [];\n          var expected_index = 0;\n          for (var k in something) {\n            if (k === expected_index) {\n              x.push(this.prettyprint(something[k], true));\n              expected_index += 1;\n            } else {\n              x.push('\\n' + k + ': ' + this.prettyprint(something[k], true));\n            }\n          }\n          return '[' + x.join(', ') + ']';\n        }\n        return 'object: ' + something;\n      default:\n        return type + ': ' + something;\n    }\n  };\n\n\n  this.lazy_escape = function(str) {\n    return str.replace(/</g, '&lt;').replace(/\\>/g, '&gt;').replace(/\\n/g, '<br />');\n  };\n\n\n  this.log = function() {\n    if (window.console) {\n      if (console.firebug) {\n        console.log.apply(console, Array.prototype.slice.call(arguments));\n      } else {\n        console.log.call(console, Array.prototype.slice.call(arguments));\n      }\n    }\n  };\n\n}\n\nif (typeof module !== 'undefined' && module.exports) {\n  module.exports = SanityTest;\n}\n"
  },
  {
    "path": "js/test/shell-test.sh",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\nPROJECT_DIR=\"`( cd \\\"$SCRIPT_DIR/../..\\\" && pwd )`\"\n\n\ncase \"$OSTYPE\" in\n    darwin*) PLATFORM=\"OSX\" ;;\n    linux*)  PLATFORM=\"LINUX\" ;;\n    bsd*)    PLATFORM=\"BSD\" ;;\n    *)       PLATFORM=\"UNKNOWN\" ;;\nesac\n\n\ntest_cli_common()\n{\n    echo ----------------------------------------\n    echo Testing common cli behavior...\n    CLI_SCRIPT_NAME=${1:?missing_param}.js\n    CLI_SCRIPT=${2:-$SCRIPT_DIR/../bin/$CLI_SCRIPT_NAME}\n    echo Script: $CLI_SCRIPT\n\n    # should find the minimal help output\n    $CLI_SCRIPT 2>&1 < /dev/null | grep -q \"Must pipe input or define at least one file\\.\" || {\n        $CLI_SCRIPT 2>&1 < /dev/null\n        echo \"[$CLI_SCRIPT_NAME] Output should be help message.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT 2> /dev/null < /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME (with no parameters)] Return code should be error.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT -Z 2> /dev/null < /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME -Z] Return code for invalid parameter should be error.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT -h > /dev/null || {\n        echo \"[$CLI_SCRIPT_NAME -h] Return code should be success.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT -v > /dev/null || {\n        echo \"[$CLI_SCRIPT_NAME -v] Return code should be success.\"\n        exit 1\n    }\n\n    MISSING_FILE=\"$SCRIPT_DIR/../../../js/bin/missing_file\"\n    MISSING_FILE_MESSAGE=\"Unable to open path\"\n    $CLI_SCRIPT $MISSING_FILE 2> /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE] Return code should be error.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT $MISSING_FILE 2>&1 | grep -q \"$MISSING_FILE_MESSAGE\" || {\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE] Stderr should have useful message.\"\n        exit 1\n    }\n\n    if [ \"`$CLI_SCRIPT $MISSING_FILE 2> /dev/null`\" != \"\" ]; then\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE] Stdout should have no text.\"\n        exit 1\n    fi\n}\n\nsetup_temp()\n{\n    mkdir -p target\n    TEST_TEMP=$PWD/`mktemp -d target/test_temp_XXXX`\n    echo Created $TEST_TEMP...\n}\n\ncleanup()\n{\n    rm -rf $TEST_TEMP && echo Removed $TEST_TEMP...\n    test -z $1 || exit $1\n}\n\n\ntest_cli_js_beautify()\n{\n    echo ----------------------------------------\n    echo Testing js-beautify cli behavior...\n    CLI_SCRIPT=${1:-$SCRIPT_DIR/../bin/js-beautify.js}\n\n    $CLI_SCRIPT $SCRIPT_DIR/../bin/js-beautify.js > /dev/null || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js was expected succeed.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT $SCRIPT_DIR/../bin/css-beautify.js > /dev/null || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/css-beautify.js was expected succeed.\"\n        exit 1\n    }\n\n    setup_temp\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-file.js $SCRIPT_DIR/../bin/js-beautify.js && diff $TEST_TEMP/js-beautify-file.js $SCRIPT_DIR/../bin/js-beautify.js || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    cat $SCRIPT_DIR/../bin/js-beautify.js | $CLI_SCRIPT -o $TEST_TEMP/js-beautify-pipe.js - && diff $TEST_TEMP/js-beautify-pipe.js $SCRIPT_DIR/../bin/js-beautify.js || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js should have been created in $TEST_TEMP/js-beautify-pipe.js.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT $SCRIPT_DIR/../bin/js-beautify.js | diff $SCRIPT_DIR/../bin/js-beautify.js - || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    node $SCRIPT_DIR/../lib/cli.js $SCRIPT_DIR/../bin/js-beautify.js | diff $SCRIPT_DIR/../bin/js-beautify.js - || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    cat $SCRIPT_DIR/../bin/js-beautify.js | $CLI_SCRIPT | diff $SCRIPT_DIR/../bin/js-beautify.js - || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    cat $SCRIPT_DIR/../bin/js-beautify.js | $CLI_SCRIPT - | diff $SCRIPT_DIR/../bin/js-beautify.js - || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n    \n    cat $SCRIPT_DIR/../bin/js-beautify.js | $CLI_SCRIPT -f - | diff $SCRIPT_DIR/../bin/js-beautify.js - || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $SCRIPT_DIR/../bin/js-beautify.js && diff $SCRIPT_DIR/../bin/js-beautify.js $TEST_TEMP/js-beautify.js || {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/js-beautify.js should have been created in $TEST_TEMP/js-beautify.js.\"\n        cleanup 1\n    }\n\n    # ensure new line settings work\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-n.js -e '\\n' $SCRIPT_DIR/../bin/js-beautify.js\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-rn.js -e '\\r\\n' $TEST_TEMP/js-beautify-n.js\n\n    # ensure eol processed correctly\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-n-dash.js --indent-size 2 --eol '\\n' $TEST_TEMP/js-beautify-n.js\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-rn-dash.js --indent-size 2 --eol '\\r\\n' $TEST_TEMP/js-beautify-n.js\n    diff -q $TEST_TEMP/js-beautify-n-dash.js $TEST_TEMP/js-beautify-rn-dash.js && {\n        diff $TEST_TEMP/js-beautify-n-dash.js $TEST_TEMP/js-beautify-rn-dash.js | cat -t -e\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-n-dash.js and $TEST_TEMP/js-beautify-rn-dash.js was expected to be different.\"\n        cleanup 1\n    }\n\n    diff -q $TEST_TEMP/js-beautify-n.js $TEST_TEMP/js-beautify-rn.js && {\n        diff $TEST_TEMP/js-beautify-n.js $TEST_TEMP/js-beautify-rn.js | cat -t -e\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-n.js and $TEST_TEMP/js-beautify-rn.js was expected to be different.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT $TEST_TEMP/js-beautify-n.js | diff -q $TEST_TEMP/js-beautify-n.js - || {\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-n.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -e 'auto' $TEST_TEMP/js-beautify-rn.js | diff -q $TEST_TEMP/js-beautify-rn.js - || {\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-rn.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    # Glob related tests\n    cp -r $PROJECT_DIR/js/src  $TEST_TEMP/\n    FILE_RCOUNT=$(find $PROJECT_DIR/js/src -name 't*.js' | grep -c .)\n    FILE_COUNT=$(ls $PROJECT_DIR/js/src/*.js | grep -c .)\n    MISSING_FILE_GLOB=\"*/*/missing_file\"\n    $CLI_SCRIPT $MISSING_FILE_GLOB > /dev/null || {\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE_GLOB] Return code should be success for globs.\"\n        exit 1\n    }\n\n\n    if [ \"$FILE_COUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT 'src/*.js' | grep -c .)\" ]; then\n        echo \"js-beautify output for 'src/*.js' was expected have $FILE_COUNT files.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT 'src/*.js')\n        cleanup 1\n    fi\n\n    if [ \"$FILE_COUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/*.js' | grep -c .)\" ]; then\n        echo \"js-beautify output for 'src/*.js' was expected have $FILE_COUNT files.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/*.js')\n        cleanup 1\n    fi\n\n    if [ \"$FILE_COUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/??dex.js' | grep -c .)\" ]; then\n        echo \"js-beautify output for --file 'src/cl?.js' --file 'src/??dex.js' was expected have $FILE_COUNT files.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/??dex.js')\n        cleanup 1\n    fi\n\n    if [ \"1\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/c??.js' 'src/cli.js'  | grep -c .)\" ]; then\n        echo \"js-beautify output for --file 'src/cl?.js' --file 'src/cl?.js' was expected have 1 file.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/c??.js' 'src/cli.js')\n        cleanup 1\n    fi\n\n    if [ \"$FILE_RCOUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT 'src/**/t*.js' | grep -c .)\" ]; then\n        echo \"js-beautify output for 'src/**/t*.js' was expected have $FILE_RCOUNT files.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT 'src/**/t*.js')\n        cleanup 1\n    fi\n\n    # EditorConfig related tests\n    cp -r js/test/resources/editorconfig $TEST_TEMP/\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/example-ec.js --indent-size 2 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/cr/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/cr/example-ec.js --indent-size 2 -e '\\r' $TEST_TEMP/editorconfig/example-base.js\n\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/crlf/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/crlf/example-ec.js --indent-size 2 -e '\\r\\n' $TEST_TEMP/editorconfig/example-base.js\n\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/error/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n\n    pushd $TEST_TEMP/editorconfig\n\n    cd $TEST_TEMP/editorconfig/error\n    $CLI_SCRIPT --editorconfig $TEST_TEMP/js-beautify-n.js \\\n    > /dev/null || {\n        echo \"Invalid editorconfig file should not report error (consistent with the EditorConfig).\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT --editorconfig example.js \\\n    > /dev/null || {\n        echo \"Invalid editorconfig file should not report error (consistent with the EditorConfig).\"\n        cleanup 1\n    }\n\n    # TODO: EditorConfig setting should NOT overide cli setting, but that is\n    # the current by-design behavior, due to code limitations.\n\n    # file input scenario\n    SCENARIO=a\n    cd $TEST_TEMP/editorconfig || exit 1\n    $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js example.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/crlf || exit 1\n    $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js example.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/cr || exit 1\n    $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js example.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    # stdin input to stdout scenario\n    SCENARIO=b\n    cd $TEST_TEMP/editorconfig || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/crlf || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/cr || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n\n    # stdin input to file scenario\n    SCENARIO=c\n    cd $TEST_TEMP/editorconfig || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js - \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/crlf || exit 1\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js - \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/cr || exit 1\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js - \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    popd\n    # End EditorConfig\n\n    # ensure unchanged files are not overwritten\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $SCRIPT_DIR/../bin/js-beautify.js\n    cp -p $TEST_TEMP/js-beautify.js $TEST_TEMP/js-beautify-old.js\n    touch $TEST_TEMP/js-beautify.js\n    sleep 2\n    touch $TEST_TEMP/js-beautify-old.js\n    $CLI_SCRIPT -r $TEST_TEMP/js-beautify.js && test $TEST_TEMP/js-beautify.js -nt $TEST_TEMP/js-beautify-old.js && {\n        echo \"js-beautify should not replace unchanged file $TEST_TEMP/js-beautify.js when using -r\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $TEST_TEMP/js-beautify.js && test $TEST_TEMP/js-beautify.js -nt $TEST_TEMP/js-beautify-old.js && {\n        echo \"js-beautify should not replace unchanged file $TEST_TEMP/js-beautify.js when using -o and same file name\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $TEST_TEMP/js-beautify-old.js && test $TEST_TEMP/js-beautify.js -nt $TEST_TEMP/js-beautify-old.js && {\n        echo \"js-beautify should not replace unchanged file $TEST_TEMP/js-beautify.js when using -o and different file name\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT $SCRIPT_DIR/../bin/css-beautify.js | diff -q $SCRIPT_DIR/../bin/css-beautify.js - && {\n        echo \"js-beautify output for $SCRIPT_DIR/../bin/css-beautify.js was expected to be different.\"\n        cleanup 1\n    }\n\n    unset HOME\n    unset USERPROFILE\n    $CLI_SCRIPT -o $TEST_TEMP/example1-default.js $SCRIPT_DIR/resources/example1.js || exit 1\n\n    $CLI_SCRIPT -o $TEST_TEMP/example1-sanity.js $TEST_TEMP/example1-default.js || exit 1\n    diff -q $TEST_TEMP/example1-default.js $TEST_TEMP/example1-sanity.js || {\n        echo \"js-beautify output for $TEST_TEMP/example1-default.js was expected to be identical after no change in settings.\"\n        cleanup 1\n    }\n\n    cd $SCRIPT_DIR/resources/configerror\n    $CLI_SCRIPT $TEST_TEMP/example1-default.js 2>&1 |  grep -q \"Error while loading beautifier configuration\\.\" || {\n        echo \"js-beautify output for $TEST_TEMP/example1-default.js was expected to be configration load error message.\"\n        cleanup 1\n    }\n\n    cd $SCRIPT_DIR/resources/indent11chars\n    $CLI_SCRIPT $TEST_TEMP/example1-default.js | diff -q $TEST_TEMP/example1-default.js - && {\n        echo \"js-beautify output for $TEST_TEMP/example1-default.js was expected to be different based on CWD settings.\"\n        cleanup 1\n    }\n\n    cd $SCRIPT_DIR/resources/indent11chars/subDir1/subDir2\n    $CLI_SCRIPT $TEST_TEMP/example1-default.js | diff -q $TEST_TEMP/example1-default.js - && {\n        echo \"js-beautify output for $TEST_TEMP/example1-default.js was expected to be different based on CWD parent folder settings.\"\n        cleanup 1\n    }\n    cd $SCRIPT_DIR\n\n    export HOME=$SCRIPT_DIR/resources/indent11chars\n    $CLI_SCRIPT $TEST_TEMP/example1-default.js | diff -q $TEST_TEMP/example1-default.js - && {\n        echo \"js-beautify output for $TEST_TEMP/example1-default.js was expected to be different based on HOME settings.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -o $TEST_TEMP/example1-indent11chars.js $TEST_TEMP/example1-default.js\n\n    unset HOME\n    export USERPROFILE=$SCRIPT_DIR/resources/indent11chars\n    # node -p 'process.env[\"USERPROFILE\"] || process.env[\"HOME\"] || \"unset\"'\n    $CLI_SCRIPT $TEST_TEMP/example1-default.js | diff -q $TEST_TEMP/example1-indent11chars.js - || {\n        echo \"js-beautify output for $TEST_TEMP/example1-default.js was expected to be identical for same HOME and USERPROFILE settings.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT $TEST_TEMP/example1-default.js | diff -q $TEST_TEMP/example1-default.js - && {\n        echo \"js-beautify output for $TEST_TEMP/example1-default.js was expected to be different based on USERPROFILE settings.\"\n        cleanup 1\n    }\n\n    #meta-parameter brace_style\n    $CLI_SCRIPT -b 'invalid' $TEST_TEMP/example1-default.js > /dev/null && {\n    echo \"[$CLI_SCRIPT_NAME -b 'invalid' $TEST_TEMP/example1-default.js] Return code for invalid brace_style meta-parameter should be error.\"\n    cleanup 1\n    }\n    $CLI_SCRIPT -b 'expand,preserve-inline,invalid' $TEST_TEMP/example1-default.js > /dev/null && {\n    echo \"[$CLI_SCRIPT_NAME -b 'expand,preserve-inline,invalid' $TEST_TEMP/example1-default.js] Return code for invalid brace_style meta-parameter should be error.\"\n    cleanup 1\n    }\n    $CLI_SCRIPT -b 'preserve-inline' $TEST_TEMP/example1-default.js > /dev/null || {\n    echo \"[$CLI_SCRIPT_NAME -b 'preserve-inline' $TEST_TEMP/example1-default.js] Return code for only one part of valid brace_style meta-parameter should be success (uses default where it can).\"\n    cleanup 1\n    }\n\n    cleanup\n}\n\nmain() {\n    test_cli_common css-beautify\n    test_cli_common html-beautify\n    test_cli_common js-beautify\n\n    test_cli_common css-beautify $SCRIPT_DIR/../../build/node_modules/.bin/css-beautify\n    test_cli_common html-beautify $SCRIPT_DIR/../../build/node_modules/.bin/html-beautify\n    test_cli_common js-beautify $SCRIPT_DIR/../../build/node_modules/.bin/js-beautify\n\n\n    test_cli_js_beautify\n\n    echo ----------------------------------------\n    echo $0 - PASSED.\n    echo ----------------------------------------\n}\n\n(main $*)\n"
  },
  {
    "path": "jsbeautifyrc",
    "content": "{\n    \"indent_size\": 2,\n    \"indent_char\": \" \",\n    \"indent_level\": 0,\n    \"end-with-newline\": true,\n    \"indent_with_tabs\": false,\n    \"preserve_newlines\": true,\n    \"max_preserve_newlines\": 10,\n    \"jslint_happy\": false,\n    \"space_after_anon_function\": false,\n    \"brace_style\": \"collapse,preserve-inline\",\n    \"keep_array_indentation\": false,\n    \"keep_function_indentation\": false,\n    \"space_before_conditional\": true,\n    \"break_chained_methods\": false,\n    \"eval_code\": false,\n    \"unescape_strings\": false,\n    \"wrap_line_length\": 0,\n    \"css\": {\n        \"selector_separator_newline\": false\n    }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"js-beautify\",\n  \"version\": \"1.15.4\",\n  \"description\": \"beautifier.io for node\",\n  \"main\": \"js/index.js\",\n  \"bin\": {\n    \"css-beautify\": \"./js/bin/css-beautify.js\",\n    \"html-beautify\": \"./js/bin/html-beautify.js\",\n    \"js-beautify\": \"./js/bin/js-beautify.js\"\n  },\n  \"directories\": {\n    \"lib\": \"js/lib\",\n    \"test\": \"js/test\"\n  },\n  \"files\": [\n    \"js/bin/\",\n    \"js/lib/*.js\",\n    \"js/lib/unpackers/\",\n    \"js/index.js\",\n    \"js/src/\"\n  ],\n  \"scripts\": {},\n  \"bugs\": \"https://github.com/beautifier/js-beautify/issues\",\n  \"homepage\": \"https://beautifier.io/\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/beautifier/js-beautify.git\"\n  },\n  \"keywords\": [\n    \"beautify\",\n    \"beautifier\",\n    \"code-quality\"\n  ],\n  \"author\": \"Einar Lielmanis <einar@beautifier.io>\",\n  \"contributors\": [\n    \"Vital Batmanov <vital76@gmail.com>\",\n    \"Chris J. Shull <chrisjshull@gmail.com>\",\n    \"Gian Marco Gherardi <gianmarco.gherardi@gmail.com>\",\n    \"Stan <stasson@orc.ru>\",\n    \"Vittorio Gambaletta <VittGam@vittgam.net>\",\n    \"Daniel Stockman <daniel.stockman@gmail.com>\",\n    \"Harutyun Amirjanyan <amirjanyan@gmail.com>\",\n    \"Nochum Sossonko <nsossonko@hotmail.com>\",\n    \"Liam Newman <bitwiseman@beautifier.io>\"\n  ],\n  \"license\": \"MIT\",\n  \"engines\": {\n    \"node\": \">=14\"\n  },\n  \"browserslist\": \"ie 11\",\n  \"dependencies\": {\n    \"config-chain\": \"^1.1.13\",\n    \"editorconfig\": \"^1.0.4\",\n    \"glob\": \"^10.5.0\",\n    \"js-cookie\": \"^3.0.5\",\n    \"nopt\": \"^7.2.1\"\n  },\n  \"devDependencies\": {\n    \"ansi-regex\": \"^6.0.1\",\n    \"benchmark\": \"^2.1.4\",\n    \"codemirror\": \"^5.65.16\",\n    \"jquery\": \"^3.6.4\",\n    \"jshint\": \"^2.13.6\",\n    \"minimist\": \"^1.2.8\",\n    \"mocha\": \"^11.0.1\",\n    \"mustache\": \"^4.2.0\",\n    \"requirejs\": \"^2.3.6\",\n    \"serve\": \"^14.2.0\",\n    \"strip-ansi\": \"^7.0.1\",\n    \"webpack\": \"^5.81.0\",\n    \"webpack-cli\": \"^7.0.2\"\n  }\n}\n"
  },
  {
    "path": "python/MANIFEST.in",
    "content": "include js-beautify\ninclude js-beautify-test\n"
  },
  {
    "path": "python/__init__.py",
    "content": "# Empty file :)\n"
  },
  {
    "path": "python/css-beautify",
    "content": "#! /usr/bin/env python\n#\n# Stub script to run cssbeautifier\n#\nimport sys\nfrom cssbeautifier import main\nsys.exit(main())\n"
  },
  {
    "path": "python/cssbeautifier/__init__.py",
    "content": "#\n# The MIT License (MIT)\n\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport sys\n\n\ndef default_options():\n    _main = __import__(\"cssbeautifier\", globals(), locals(), [\"_main\"])._main\n    return _main.default_options()\n\n\ndef beautify(string, opts=None):\n    _main = __import__(\"cssbeautifier\", globals(), locals(), [\"_main\"])._main\n    return _main.beautify(string, opts)\n\n\ndef beautify_file(file_name, opts=None):\n    _main = __import__(\"cssbeautifier\", globals(), locals(), [\"_main\"])._main\n    return _main.beautify_file(file_name, opts)\n\n\ndef usage(stream=sys.stdout):\n    _main = __import__(\"cssbeautifier\", globals(), locals(), [\"_main\"])._main\n    return _main._sage(stream)\n\n\ndef main():\n    _main = __import__(\"cssbeautifier\", globals(), locals(), [\"_main\"])._main\n    return _main.main()\n"
  },
  {
    "path": "python/cssbeautifier/__version__.py",
    "content": "__version__ = \"1.15.4\"\n"
  },
  {
    "path": "python/cssbeautifier/_main.py",
    "content": "#\n# The MIT License (MIT)\n\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nfrom __future__ import print_function\nimport sys\nimport os\nimport io\nimport re\nimport copy\nimport getopt\nfrom cssbeautifier.__version__ import __version__\nfrom jsbeautifier.cli import *\nfrom cssbeautifier.css.options import BeautifierOptions\nfrom cssbeautifier.css.beautifier import Beautifier\n\n__all__ = [\"default_options\", \"beautify\", \"beautify_file\", \"usage\", \"main\"]\n\n\ndef default_options():\n    return BeautifierOptions()\n\n\ndef beautify(string, opts=None):\n    b = Beautifier(string, opts)\n    return b.beautify()\n\n\ndef beautify_file(file_name, opts=None):\n    return process_file(file_name, opts, beautify)\n\n\ndef usage(stream=sys.stdout):\n    print(\n        \"cssbeautifier.py@\" + __version__ + \"\"\"\n\nCSS beautifier (https://beautifier.io/)\n\nUsage: cssbeautifier.py [options] <infile>\n\n    <infile> can be \"-\", which means stdin.\n\nInput options:\n\n -i,  --stdin                      Read input from stdin\n\nOutput options:\n\n -s,  --indent-size=NUMBER         Indentation size. (default 4).\n -c,  --indent-char=CHAR           Character to indent with. (default space).\n -e,  --eol=STRING                 Character(s) to use as line terminators.\n                                   (default first newline in file, otherwise \"\\\\n\")\n -t,  --indent-with-tabs           Indent with tabs, overrides -s and -c\n      --preserve-newlines          Preserve existing line breaks.\n      --disable-selector-separator-newline\n                                   Do not print each selector on a separate line.\n -b,  --brace-style=collapse       Brace style (collapse, expand)\n -n,  --end-with-newline           End output with newline\n      --disable-newline-between-rules\n                                   Do not print empty line between rules.\n      --space-around-combinator    Print spaces around combinator.\n      --indent-empty-lines         Keep indentation on empty lines\n -r,  --replace                    Write output in-place, replacing input\n -o,  --outfile=FILE               Specify a file to output to (default stdout)\n\nRarely needed options:\n\n -h,  --help, --usage              Prints this help statement.\n -v,  --version                    Show the version\n\n\"\"\",\n        file=stream,\n    )\n    if stream == sys.stderr:\n        return 1\n    else:\n        return 0\n\n\ndef main():\n    argv = sys.argv[1:]\n\n    try:\n        opts, args = getopt.getopt(\n            argv,\n            \"hvio:rs:c:e:tnb:\",\n            [\n                \"editorconfig\",\n                \"help\",\n                \"usage\",\n                \"version\",\n                \"stdin\",\n                \"outfile=\",\n                \"replace\",\n                \"indent-size=\",\n                \"indent-char=\",\n                \"eol=\",\n                \"indent-with-tabs\",\n                \"preserve-newlines\",\n                \"brace-style=\",\n                \"disable-selector-separator-newline\",\n                \"end-with-newline\",\n                \"disable-newline-between-rules\",\n                \"space-around-combinator\",\n                \"indent-empty-lines\",\n            ],\n        )\n    except getopt.GetoptError as ex:\n        print(ex, file=sys.stderr)\n        return usage(sys.stderr)\n\n    css_options = default_options()\n\n    filepath_params = []\n    filepath_params.extend(args)\n\n    outfile_param = \"stdout\"\n    replace = False\n\n    for opt, arg in opts:\n        if opt in (\"--stdin\", \"-i\"):\n            file = \"-\"\n        elif opt in (\"--outfile\", \"-o\"):\n            outfile = arg\n        elif opt in (\"--replace\", \"-r\"):\n            replace = True\n        elif opt in (\"--version\", \"-v\"):\n            return print(__version__)\n        elif opt in (\"--help\", \"--usage\", \"-h\"):\n            return usage()\n\n        elif opt in (\"--indent-size\", \"-s\"):\n            css_options.indent_size = int(arg)\n        elif opt in (\"--indent-char\", \"-c\"):\n            css_options.indent_char = arg\n        elif opt in (\"--eol\", \"-e\"):\n            css_options.eol = arg\n        elif opt in (\"--indent-with-tabs\", \"-t\"):\n            css_options.indent_with_tabs = True\n        elif opt in (\"--preserve-newlines\",):\n            css_options.preserve_newlines = True\n        elif opt in (\"--disable-selector-separator-newline\",):\n            css_options.selector_separator_newline = False\n        elif opt in (\"--brace-style\", \"-b\"):\n            css_options.brace_style = arg\n        elif opt in (\"--end-with-newline\", \"-n\"):\n            css_options.end_with_newline = True\n        elif opt in (\"--disable-newline-between-rules\",):\n            css_options.newline_between_rules = False\n        elif opt in (\"--space-around-combinator\",):\n            css_options.space_around_combinator = True\n        elif opt in (\"--indent-empty-lines\",):\n            css_options.indent_empty_lines = True\n        elif opt in (\"--editorconfig\",):\n            css_options.editorconfig = True\n\n    try:\n        filepaths, replace = get_filepaths_from_params(filepath_params, replace)\n        for filepath in filepaths:\n            if not replace:\n                outfile = outfile_param\n            else:\n                outfile = filepath\n\n            css_options = integrate_editorconfig_options(\n                filepath, css_options, outfile, \"js\"\n            )\n\n            pretty = beautify_file(filepath, css_options)\n\n            write_beautified_output(pretty, css_options, outfile)\n\n    except MissingInputStreamError:\n        print(\"Must pipe input or define at least one file.\\n\", file=sys.stderr)\n        usage(sys.stderr)\n        return 1\n\n    except UnicodeError as ex:\n        print(\"Error while decoding input or encoding output:\", file=sys.stderr)\n        print(ex, file=sys.stderr)\n        return 1\n\n    except Exception as ex:\n        print(ex, file=sys.stderr)\n        return 1\n\n    # Success\n    return 0\n"
  },
  {
    "path": "python/cssbeautifier/css/__init__.py",
    "content": "# Empty file :)\n"
  },
  {
    "path": "python/cssbeautifier/css/beautifier.py",
    "content": "from __future__ import print_function\nimport sys\nimport re\nimport copy\nfrom .options import BeautifierOptions\nfrom jsbeautifier.core.output import Output\nfrom jsbeautifier.core.inputscanner import InputScanner\nfrom jsbeautifier.core.directives import Directives\nfrom cssbeautifier.__version__ import __version__\n\n# This is not pretty, but given how we did the version import\n# it is the only way to do this without having setup.py fail on a missing\n# six dependency.\nsix = __import__(\"six\")\n\n#\n# The MIT License (MIT)\n\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\n\ndirectives_core = Directives(r\"/\\*\", r\"\\*/\")\n\nwhitespaceChar = re.compile(r\"\\s\")\nwhitespacePattern = re.compile(r\"(?:\\s|\\n)+\")\n\n# WORD_RE = re.compile(\"[\\w$\\-_]\")\n\n\ndef default_options():\n    return BeautifierOptions()\n\n\ndef beautify(string, opts=default_options()):\n    b = Beautifier(string, opts)\n    return b.beautify()\n\n\ndef beautify_file(file_name, opts=default_options()):\n    if file_name == \"-\":  # stdin\n        stream = sys.stdin\n    else:\n        stream = open(file_name)\n    content = \"\".join(stream.readlines())\n    b = Beautifier(content, opts)\n    return b.beautify()\n\n\ndef usage(stream=sys.stdout):\n    print(\n        \"cssbeautifier.py@\" + __version__ + \"\"\"\n\nCSS beautifier (https://beautifier.io/)\n\n\"\"\",\n        file=stream,\n    )\n    if stream == sys.stderr:\n        return 1\n    else:\n        return 0\n\n\nclass Beautifier:\n    def __init__(self, source_text, opts=default_options()):\n        # in javascript, these two differ\n        # in python they are the same, different methods are called on them\n        # IMPORTANT: This string must be run through six to handle \\u chars\n        self.lineBreak = re.compile(six.u(r\"\\r\\n|[\\n\\r]\"))\n        self.allLineBreaks = self.lineBreak\n\n        self.comment_pattern = re.compile(six.u(r\"\\/\\/(?:[^\\n\\r\\u2028\\u2029]*)\"))\n        self.block_comment_pattern = re.compile(r\"\\/\\*(?:[\\s\\S]*?)((?:\\*\\/)|$)\")\n\n        if not source_text:\n            source_text = \"\"\n\n        self.__source_text = source_text\n\n        self._options = BeautifierOptions(opts)\n        self._input = None\n        self._ch = None\n\n        self._indentLevel = 0\n        self._nestedLevel = 0\n        self._output = None\n\n        # https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule\n        # also in CONDITIONAL_GROUP_RULE below\n        self.NESTED_AT_RULE = {\n            \"page\",\n            \"font-face\",\n            \"keyframes\",\n            \"media\",\n            \"supports\",\n            \"document\",\n        }\n        self.CONDITIONAL_GROUP_RULE = {\"media\", \"supports\", \"document\"}\n        self.NON_SEMICOLON_NEWLINE_PROPERTY = [\"grid-template-areas\", \"grid-template\"]\n\n    def eatString(self, endChars):\n        result = \"\"\n        self._ch = self._input.next()\n        while self._ch:\n            result += self._ch\n            if self._ch == \"\\\\\":\n                result += self._input.next()\n            elif self._ch in endChars or self._ch == \"\\n\":\n                break\n            self._ch = self._input.next()\n        return result\n\n    # Skips any white space in the source text from the current position.\n    # When allowAtLeastOneNewLine is true, will output new lines for each\n    # newline character found; if the user has preserve_newlines off, only\n    # the first newline will be output\n    def eatWhitespace(self, allowAtLeastOneNewLine=False):\n        result = whitespaceChar.search(self._input.peek() or \"\") is not None\n        isFirstNewLine = True\n        newline_count = 0\n        while whitespaceChar.search(self._input.peek() or \"\") is not None:\n            self._ch = self._input.next()\n            if allowAtLeastOneNewLine and self._ch == \"\\n\":\n                if (\n                    newline_count == 0\n                    or newline_count < self._options.max_preserve_newlines\n                ):\n                    newline_count += 1\n                    self._output.add_new_line(True)\n        return result\n\n    # Nested pseudo-class if we are insideRule\n    # and the next special character found opens\n    # a new block\n    def foundNestedPseudoClass(self):\n        openParen = 0\n        i = 1\n        ch = self._input.peek(i)\n        while ch:\n            if ch == \"{\":\n                return True\n            elif ch == \"(\":\n                # pseudoclasses can contain ()\n                openParen += 1\n            elif ch == \")\":\n                if openParen == 0:\n                    return False\n                openParen -= 1\n            elif ch == \";\" or ch == \"}\":\n                return False\n            i += 1\n            ch = self._input.peek(i)\n\n        return False\n\n    def indent(self):\n        self._indentLevel += 1\n\n    def outdent(self):\n        if self._indentLevel > 0:\n            self._indentLevel -= 1\n\n    def preserveSingleSpace(self, isAfterSpace):\n        if isAfterSpace:\n            self._output.space_before_token = True\n\n    def print_string(self, output_string):\n        self._output.set_indent(self._indentLevel)\n        self._output.non_breaking_space = True\n        self._output.add_token(output_string)\n\n    def beautify(self):\n        if self._options.disabled:\n            return self.__source_text\n\n        source_text = self.__source_text\n\n        if self._options.eol == \"auto\":\n            self._options.eol = \"\\n\"\n            if self.lineBreak.search(source_text or \"\"):\n                self._options.eol = self.lineBreak.search(source_text).group()\n\n        # HACK: newline parsing inconsistent. This brute force normalizes the\n        # input newlines.\n        source_text = re.sub(self.allLineBreaks, \"\\n\", source_text)\n        baseIndentString = re.search(\"^[\\t ]*\", source_text).group(0)\n\n        self._output = Output(self._options, baseIndentString)\n\n        self._input = InputScanner(source_text)\n\n        self._indentLevel = 0\n        self._nestedLevel = 0\n\n        self._ch = None\n        parenLevel = 0\n\n        insideRule = False\n        insidePropertyValue = False\n        enteringConditionalGroup = False\n        insideNonNestedAtRule = False\n        insideScssMap = False\n        topCharacter = self._ch\n        insideNonSemiColonValues = False\n\n        while True:\n            whitespace = self._input.read(whitespacePattern)\n            isAfterSpace = whitespace != \"\"\n            previous_ch = topCharacter\n            self._ch = self._input.next()\n            if self._ch == \"\\\\\" and self._input.hasNext():\n                self._ch += self._input.next()\n            topCharacter = self._ch\n\n            if not self._ch:\n                break\n            elif self._ch == \"/\" and self._input.peek() == \"*\":\n                # /* css comment */\n                # Always start block comments on a new line.\n                # This handles scenarios where a block comment immediately\n                # follows a property definition on the same line or where\n                # minified code is being beautified.\n                self._output.add_new_line()\n                self._input.back()\n                comment = self._input.read(self.block_comment_pattern)\n\n                # handle ignore directive\n                directives = directives_core.get_directives(comment)\n                if directives and directives.get(\"ignore\") == \"start\":\n                    comment += directives_core.readIgnored(self._input)\n\n                self.print_string(comment)\n\n                # Ensures any new lines following the comment are preserved\n                self.eatWhitespace(True)\n\n                # Block comments are followed by a new line so they don't\n                # share a line with other properties\n                self._output.add_new_line()\n            elif self._ch == \"/\" and self._input.peek() == \"/\":\n                # // single line comment\n                # Preserves the space before a comment\n                # on the same line as a rule\n                self._output.space_before_token = True\n                self._input.back()\n                self.print_string(self._input.read(self.comment_pattern))\n\n                # Ensures any new lines following the comment are preserved\n                self.eatWhitespace(True)\n            elif self._ch == \"$\":\n                self.preserveSingleSpace(isAfterSpace)\n\n                self.print_string(self._ch)\n\n                # strip trailing space, for hash property check\n                variable = self._input.peekUntilAfter(\n                    re.compile(r\"[: ,;{}()[\\]\\/='\\\"]\")\n                )\n\n                if variable[-1] in \": \":\n                    # we have a variable or pseudo-class, add it and\n                    # insert one space before continuing\n                    variable = self.eatString(\": \").rstrip()\n                    self.print_string(variable)\n                    self._output.space_before_token = True\n\n                # might be sass variable\n                if parenLevel == 0 and \":\" in variable:\n                    insidePropertyValue = True\n                    self.indent()\n\n            elif self._ch == \"@\":\n                self.preserveSingleSpace(isAfterSpace)\n\n                # deal with less propery mixins @{...}\n                if self._input.peek() == \"{\":\n                    self.print_string(self._ch + self.eatString(\"}\"))\n                else:\n                    self.print_string(self._ch)\n                    # strip trailing space, for hash property check\n                    variableOrRule = self._input.peekUntilAfter(\n                        re.compile(r\"[: ,;{}()[\\]\\/='\\\"]\")\n                    )\n\n                    if variableOrRule[-1] in \": \":\n                        # we have a variable or pseudo-class, add it and\n                        # insert one space before continuing\n                        variableOrRule = self.eatString(\": \").rstrip()\n                        self.print_string(variableOrRule)\n                        self._output.space_before_token = True\n\n                    # might be less variable\n                    if parenLevel == 0 and \":\" in variableOrRule:\n                        insidePropertyValue = True\n                        self.indent()\n\n                    # might be a nesting at-rule\n                    elif variableOrRule in self.NESTED_AT_RULE:\n                        self._nestedLevel += 1\n                        if variableOrRule in self.CONDITIONAL_GROUP_RULE:\n                            enteringConditionalGroup = True\n\n                    # might be a non-nested at-rule\n                    elif parenLevel == 0 and not insidePropertyValue:\n                        insideNonNestedAtRule = True\n            elif self._ch == \"#\" and self._input.peek() == \"{\":\n                self.preserveSingleSpace(isAfterSpace)\n                self.print_string(self._ch + self.eatString(\"}\"))\n            elif self._ch == \"{\":\n                if insidePropertyValue:\n                    insidePropertyValue = False\n                    self.outdent()\n\n                # non nested at rule becomes nested\n                insideNonNestedAtRule = False\n\n                # when entering conditional groups, only rulesets are\n                # allowed\n                if enteringConditionalGroup:\n                    enteringConditionalGroup = False\n                    insideRule = self._indentLevel >= self._nestedLevel\n                else:\n                    # otherwise, declarations are also allowed\n                    insideRule = self._indentLevel >= self._nestedLevel - 1\n\n                if self._options.newline_between_rules and insideRule:\n                    if (\n                        self._output.previous_line\n                        and not self._output.previous_line.is_empty()\n                        and self._output.previous_line.item(-1) != \"{\"\n                    ):\n                        self._output.ensure_empty_line_above(\"/\", \",\")\n\n                self._output.space_before_token = True\n\n                # The difference in print_string and indent order\n                # is necessary to indent the '{' correctly\n                if self._options.brace_style == \"expand\":\n                    self._output.add_new_line()\n                    self.print_string(self._ch)\n                    self.indent()\n                    self._output.set_indent(self._indentLevel)\n                else:\n                    # inside mixin and first param is object\n                    if previous_ch == \"(\":\n                        self._output.space_before_token = False\n                    elif previous_ch != \",\":\n                        self.indent()\n                    self.print_string(self._ch)\n\n                self.eatWhitespace(True)\n                self._output.add_new_line()\n            elif self._ch == \"}\":\n                self.outdent()\n                self._output.add_new_line()\n                if previous_ch == \"{\":\n                    self._output.trim(True)\n                if insidePropertyValue:\n                    self.outdent()\n                    insidePropertyValue = False\n                self.print_string(self._ch)\n                insideRule = False\n                if self._nestedLevel:\n                    self._nestedLevel -= 1\n\n                self.eatWhitespace(True)\n                self._output.add_new_line()\n\n                if (\n                    self._options.newline_between_rules\n                    and not self._output.just_added_blankline()\n                ):\n                    if self._input.peek() != \"}\":\n                        self._output.add_new_line(True)\n                if self._input.peek() == \")\":\n                    self._output.trim(True)\n                    if self._options.brace_style == \"expand\":\n                        self._output.add_new_line(True)\n            elif self._ch == \":\":\n                for i in range(0, len(self.NON_SEMICOLON_NEWLINE_PROPERTY)):\n                    if self._input.lookBack(self.NON_SEMICOLON_NEWLINE_PROPERTY[i]):\n                        insideNonSemiColonValues = True\n                        break\n\n                if (\n                    (insideRule or enteringConditionalGroup)\n                    and not (self._input.lookBack(\"&\") or self.foundNestedPseudoClass())\n                    and not self._input.lookBack(\"(\")\n                    and not insideNonNestedAtRule\n                    and parenLevel == 0\n                ):\n                    # 'property: value' delimiter\n                    # which could be in a conditional group query\n                    self.print_string(\":\")\n                    if not insidePropertyValue:\n                        insidePropertyValue = True\n                        self._output.space_before_token = True\n                        self.eatWhitespace(True)\n                        self.indent()\n\n                else:\n                    # sass/less parent reference don't use a space\n                    # sass nested pseudo-class don't use a space\n\n                    # preserve space before pseudoclasses/pseudoelements,\n                    # as it means \"in any child\"\n                    if self._input.lookBack(\" \"):\n                        self._output.space_before_token = True\n                    if self._input.peek() == \":\":\n                        # pseudo-element\n                        self._ch = self._input.next()\n                        self.print_string(\"::\")\n                    else:\n                        # pseudo-element\n                        self.print_string(\":\")\n            elif self._ch == '\"' or self._ch == \"'\":\n                preserveQuoteSpace = previous_ch == '\"' or previous_ch == \"'\"\n                self.preserveSingleSpace(preserveQuoteSpace or isAfterSpace)\n                self.print_string(self._ch + self.eatString(self._ch))\n                self.eatWhitespace(True)\n            elif self._ch == \";\":\n                insideNonSemiColonValues = False\n                if parenLevel == 0:\n                    if insidePropertyValue:\n                        self.outdent()\n                        insidePropertyValue = False\n                    insideNonNestedAtRule = False\n                    self.print_string(self._ch)\n                    self.eatWhitespace(True)\n\n                    # This maintains single line comments on the same\n                    # line. Block comments are also affected, but\n                    # a new line is always output before one inside\n                    # that section\n                    if self._input.peek() != \"/\":\n                        self._output.add_new_line()\n                else:\n                    self.print_string(self._ch)\n                    self.eatWhitespace(True)\n                    self._output.space_before_token = True\n            elif self._ch == \"(\":\n                # may be a url\n                if self._input.lookBack(\"url\"):\n                    self.print_string(self._ch)\n                    self.eatWhitespace()\n                    parenLevel += 1\n                    self.indent()\n                    self._ch = self._input.next()\n                    if self._ch in {\")\", '\"', \"'\"}:\n                        self._input.back()\n                    elif self._ch is not None:\n                        self.print_string(self._ch + self.eatString(\")\"))\n                        if parenLevel:\n                            parenLevel -= 1\n                            self.outdent()\n                else:\n                    space_needed = False\n                    if self._input.lookBack(\"with\"):\n                        # look back is not an accurate solution, we need tokens to confirm without whitespaces\n                        space_needed = True\n                    self.preserveSingleSpace(isAfterSpace or space_needed)\n                    self.print_string(self._ch)\n\n                    # handle scss/sass map\n                    if (\n                        insidePropertyValue\n                        and previous_ch == \"$\"\n                        and self._options.selector_separator_newline\n                    ):\n                        self._output.add_new_line()\n                        insideScssMap = True\n                    else:\n                        self.eatWhitespace()\n                        parenLevel += 1\n                        self.indent()\n            elif self._ch == \")\":\n                if parenLevel:\n                    parenLevel -= 1\n                    self.outdent()\n\n                if (\n                    insideScssMap\n                    and self._input.peek() == \";\"\n                    and self._options.selector_separator_newline\n                ):\n                    insideScssMap = False\n                    self.outdent()\n                    self._output.add_new_line()\n                self.print_string(self._ch)\n            elif self._ch == \",\":\n                self.print_string(self._ch)\n                self.eatWhitespace(True)\n                if (\n                    self._options.selector_separator_newline\n                    and (not insidePropertyValue or insideScssMap)\n                    and parenLevel == 0\n                    and not insideNonNestedAtRule\n                ):\n                    self._output.add_new_line()\n                else:\n                    self._output.space_before_token = True\n            elif (\n                (self._ch == \">\" or self._ch == \"+\" or self._ch == \"~\")\n                and not insidePropertyValue\n                and parenLevel == 0\n            ):\n                # handle combinator spacing\n                if self._options.space_around_combinator:\n                    self._output.space_before_token = True\n                    self.print_string(self._ch)\n                    self._output.space_before_token = True\n                else:\n                    self.print_string(self._ch)\n                    self.eatWhitespace()\n                    # squash extra whitespace\n                    if self._ch and bool(whitespaceChar.search(self._ch)):\n                        self._ch = \"\"\n            elif self._ch == \"]\":\n                self.print_string(self._ch)\n            elif self._ch == \"[\":\n                self.preserveSingleSpace(isAfterSpace)\n                self.print_string(self._ch)\n            elif self._ch == \"=\":\n                # no whitespace before or after\n                self.eatWhitespace()\n                self.print_string(\"=\")\n                if bool(whitespaceChar.search(self._ch)):\n                    self._ch = \"\"\n            elif self._ch == \"!\" and not (self._input.lookBack(\"\\\\\")):\n                # !important\n                self._output.space_before_token = True\n                self.print_string(self._ch)\n            else:\n                preserveAfterSpace = previous_ch == '\"' or previous_ch == \"'\"\n                self.preserveSingleSpace(preserveAfterSpace or isAfterSpace)\n                self.print_string(self._ch)\n\n                if (\n                    not self._output.just_added_newline()\n                    and self._input.peek() == \"\\n\"\n                    and insideNonSemiColonValues\n                ):\n                    self._output.add_new_line()\n\n        sweet_code = self._output.get_code(self._options.eol)\n\n        return sweet_code\n"
  },
  {
    "path": "python/cssbeautifier/css/options.py",
    "content": "#\n# The MIT License (MIT)\n\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nfrom jsbeautifier.core.options import Options as BaseOptions\n\n\nclass BeautifierOptions(BaseOptions):\n    def __init__(self, options=None):\n        BaseOptions.__init__(self, options, \"css\")\n\n        self.selector_separator_newline = self._get_boolean(\n            \"selector_separator_newline\", True\n        )\n        self.newline_between_rules = self._get_boolean(\"newline_between_rules\", True)\n\n        brace_style_split = self._get_selection_list(\n            \"brace_style\",\n            [\"collapse\", \"expand\", \"end-expand\", \"none\", \"preserve-inline\"],\n        )\n        self.brace_style = \"collapse\"\n        for bs in brace_style_split:\n            if bs != \"expand\":\n                # default to collapse, as only collapse|expand is implemented for now\n                self.brace_style = \"collapse\"\n            else:\n                self.brace_style = bs\n\n        # deprecated\n        space_around_selector_separator = self._get_boolean(\n            \"space_around_selector_separator\"\n        )\n\n        # Continue to accept deprecated option\n        self.space_around_combinator = (\n            self._get_boolean(\"space_around_combinator\")\n            or space_around_selector_separator\n        )\n        self.keep_quiet = False\n"
  },
  {
    "path": "python/cssbeautifier/tests/__init__.py",
    "content": "# Empty file :)\n"
  },
  {
    "path": "python/debian/.gitignore",
    "content": "/files\n/*.log\n/*.debhelper\n/*.substvars\n/python3-jsbeautifier\n"
  },
  {
    "path": "python/debian/changelog",
    "content": "jsbeautifier (1.5.10-1) smurf; urgency=low\n\n  * source package automatically created by stdeb 0.8.2\n\n -- Matthias Urlichs <matthias@urlichs.de>  Sun, 13 Dec 2015 17:36:34 +0100\n"
  },
  {
    "path": "python/debian/compat",
    "content": "9\n"
  },
  {
    "path": "python/debian/control",
    "content": "Source: jsbeautifier\nMaintainer: Matthias Urlichs <matthias@urlichs.de>\nSection: python\nPriority: optional\nBuild-Depends: python3-all, debhelper (>= 9)\nStandards-Version: 3.9.1\n\nPackage: python3-jsbeautifier\nArchitecture: all\nDepends: ${misc:Depends}, ${python3:Depends}\nDescription: JavaScript unobfuscator and beautifier.\n Beautify, unpack or deobfuscate JavaScript. Handles popular online obfuscators.\n\n"
  },
  {
    "path": "python/debian/rules",
    "content": "#!/usr/bin/make -f\n\n# This file was automatically generated by stdeb 0.8.2 at\n# Sun, 13 Dec 2015 17:36:34 +0100\nexport PYBUILD_NAME=jsbeautifier\n%:\n\tdh $@ --with python3 --buildsystem=pybuild\n\n"
  },
  {
    "path": "python/debian/source/format",
    "content": "3.0 (quilt)\n"
  },
  {
    "path": "python/js-beautify-profile",
    "content": "#! /usr/bin/env python\n\n# To run this: ./js-beautify/tools/python-dev python ./python/js-beautify-profile\n\nimport sys\nimport unittest\nimport pstats\nfrom pstats import SortKey\n\n# Speedup things...\ntry:\n    import cProfile as profile\nexcept ImportError:\n    import profile\nimport os\nimport copy\nimport jsbeautifier\noptions = jsbeautifier.default_options()\noptions.wrap_line_length = 80\n\ndef beautifier_test_github_min():\n    jsbeautifier.beautify(github_min, options)\n\nif __name__ == '__main__':\n    dirname = os.path.dirname(os.path.abspath(__file__))\n    github_min_file = os.path.join(\n        dirname, \"../\", \"test/resources/github-min.js\")\n    github_min = copy.copy(''.join(open( github_min_file).readlines()))\n\n    profile.run('beautifier_test_github_min()',\n        os.path.join(dirname, \"../\", 'build/jsbstats'))\n\n    p = pstats.Stats(os.path.join(dirname, \"../\", 'build/jsbstats'))\n    p.strip_dirs().sort_stats(SortKey.CUMULATIVE).print_stats()\n"
  },
  {
    "path": "python/js-beautify-test",
    "content": "#! /bin/sh\n#\n# Test suite launcher\n#\n\nif [ -z $PYTHON ]; then\n    env python js-beautify-test.py\nelse\n    env $PYTHON js-beautify-test.py\nfi\n"
  },
  {
    "path": "python/js-beautify-test.py",
    "content": "#!/usr/bin/env python\n\nimport sys\nimport unittest\n\n\ndef run_tests():\n    suite = unittest.TestLoader().discover(\"jsbeautifier\", pattern=\"test*.py\")\n    suite.addTests(unittest.TestLoader().discover(\"cssbeautifier\", pattern=\"test*.py\"))\n    return unittest.TextTestRunner(verbosity=2).run(suite)\n\n\nif __name__ == \"__main__\":\n    sys.exit(not run_tests().wasSuccessful())\n"
  },
  {
    "path": "python/jsbeautifier/__init__.py",
    "content": "from __future__ import print_function\nimport sys\nimport os\nimport platform\nimport io\nimport getopt\nimport re\nimport string\nimport errno\nimport copy\nimport glob\nfrom jsbeautifier.__version__ import __version__\nfrom jsbeautifier.cli import *\nfrom jsbeautifier.javascript.options import BeautifierOptions\nfrom jsbeautifier.javascript.beautifier import Beautifier\n\n#\n# The MIT License (MIT)\n\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n#\n# Originally written by Einar Lielmanis et al.,\n# Conversion to python by Einar Lielmanis, einar@beautifier.io,\n# Parsing improvement for brace-less and semicolon-less statements\n#    by Liam Newman <bitwiseman@beautifier.io>\n# Python is not my native language, feel free to push things around.\n#\n# Use either from command line (script displays its usage when run\n# without any parameters),\n#\n#\n# or, alternatively, use it as a module:\n#\n#   import jsbeautifier\n#   res = jsbeautifier.beautify('your javascript string')\n#   res = jsbeautifier.beautify_file('some_file.js')\n#\n#  you may specify some options:\n#\n#   opts = jsbeautifier.default_options()\n#   opts.indent_size = 2\n#   res = jsbeautifier.beautify('some javascript', opts)\n#\n#\n# Here are the available options: (read source)\n\n__all__ = [\n    \"default_options\",\n    \"beautify\",\n    \"beautify_file\",\n    \"usage\",\n    \"main\",\n]\n\n\ndef default_options():\n    return BeautifierOptions()\n\n\ndef beautify(string, opts=default_options()):\n    b = Beautifier()\n    return b.beautify(string, opts)\n\n\ndef beautify_file(file_name, opts=default_options()):\n    return process_file(file_name, opts, beautify)\n\n\ndef usage(stream=sys.stdout):\n    print(\n        \"jsbeautifier.py@\" + __version__ + \"\"\"\n\nJavascript beautifier (https://beautifier.io/)\n\nUsage: jsbeautifier.py [options] <infile>\n\n    <infile> can be \"-\", which means stdin.\n\nInput options:\n\n -i,  --stdin                      Read input from stdin\n\nOutput options:\n\n -s,  --indent-size=NUMBER         Indentation size. (default 4).\n -c,  --indent-char=CHAR           Character to indent with. (default space).\n -e,  --eol=STRING                 Character(s) to use as line terminators.\n                                   (default first newline in file, otherwise \"\\\\n\")\n -t,  --indent-with-tabs           Indent with tabs, overrides -s and -c\n -d,  --disable-preserve-newlines  Do not preserve existing line breaks.\n -P,  --space-in-paren             Add padding spaces within paren, ie. f( a, b )\n -E,  --space-in-empty-paren       Add a single space inside empty paren, ie. f( )\n -j,  --jslint-happy               More jslint-compatible output\n -a,  --space-after-anon-function  Add a space before an anonymous function's parens, ie. function ()\n --space-after-named-function      Add a space before a named function's parens, i.e. function example ()\n -b,  --brace-style=collapse       Brace style (collapse, expand, end-expand, none)(,preserve-inline)\n -k,  --keep-array-indentation     Keep array indentation.\n --quiet                           Suppress info about a file if nothing was changed.\n -r,  --replace                    Write output in-place, replacing input\n -o,  --outfile=FILE               Specify a file to output to (default stdout)\n -f,  --keep-function-indentation  Do not re-indent function bodies defined in var lines.\n -x,  --unescape-strings           Decode printable chars encoded in \\\\xNN notation.\n -X,  --e4x                        Pass E4X xml literals through untouched\n -C,  --comma-first                Put commas at the beginning of new line instead of end.\n -m,\n --max-preserve-newlines=NUMBER    Number of line-breaks to be preserved in one chunk (default 10)\n -O,  --operator-position=STRING   Set operator position (before-newline, after-newline, preserve-newline)\n -w,  --wrap-line-length           Attempt to wrap line when it exceeds this length.\n                                   NOTE: Line continues until next wrap point is found.\n -n,  --end-with-newline           End output with newline\n --indent-empty-lines              Keep indentation on empty lines\n --templating                      List of templating languages (auto,none,django,erb,handlebars,php,smarty,angular) [\"auto\"] auto = none in JavaScript, all in html\n --editorconfig                    Enable setting configuration from EditorConfig\n\nRarely needed options:\n\n --eval-code                       evaluate code if a JS interpreter is\n                                   installed. May be useful with some obfuscated\n                                   script but poses a potential security issue.\n\n -l,  --indent-level=NUMBER        Initial indentation level. (default 0).\n\n -h,  --help, --usage              Prints this help statement.\n -v,  --version                    Show the version\n\n\"\"\",\n        file=stream,\n    )\n    if stream == sys.stderr:\n        return 1\n    else:\n        return 0\n\n\ndef main():\n    argv = sys.argv[1:]\n\n    try:\n        opts, args = getopt.getopt(\n            argv,\n            \"f:s:c:e:o:rdEPjab:kil:xhtvXnCO:w:m:\",\n            [\n                \"brace-style=\",\n                \"comma-first\",\n                \"disable-preserve-newlines\",\n                \"e4x\",\n                \"editorconfig\",\n                \"end-with-newline\",\n                \"eol=\",\n                \"eval-code\",\n                \"file=\",\n                \"help\",\n                \"indent-char=\",\n                \"indent-empty-lines\",\n                \"indent-level=\",\n                \"indent-size=\",\n                \"indent-with-tabs\",\n                \"jslint-happy\",\n                \"keep-array-indentation\",\n                \"keep-function-indentation\",\n                \"max-preserve-newlines=\",\n                \"operator-position=\",\n                \"outfile=\",\n                \"quiet\",\n                \"replace\",\n                \"space-after-anon-function\",\n                \"space-after-named-function\",\n                \"space-in-empty-paren\",\n                \"space-in-paren\",\n                \"stdin\",\n                \"templating=\",\n                \"unescape-strings\",\n                \"usage\",\n                \"version\",\n                \"wrap-line-length\",\n            ],\n        )\n    except getopt.GetoptError as ex:\n        print(ex, file=sys.stderr)\n        return usage(sys.stderr)\n\n    js_options = default_options()\n\n    filepath_params = []\n    filepath_params.extend(args)\n\n    outfile_param = \"stdout\"\n    replace = False\n\n    for opt, arg in opts:\n        if opt in (\"--file\", \"-f\"):\n            filepath_params.append(arg)\n        elif opt in (\"--keep-array-indentation\", \"-k\"):\n            js_options.keep_array_indentation = True\n        elif opt in (\"--keep-function-indentation\",):\n            js_options.keep_function_indentation = True\n        elif opt in (\"--outfile\", \"-o\"):\n            outfile_param = arg\n        elif opt in (\"--replace\", \"-r\"):\n            replace = True\n        elif opt in (\"--indent-size\", \"-s\"):\n            js_options.indent_size = int(arg)\n        elif opt in (\"--indent-char\", \"-c\"):\n            js_options.indent_char = arg\n        elif opt in (\"--eol\", \"-e\"):\n            js_options.eol = arg\n        elif opt in (\"--indent-with-tabs\", \"-t\"):\n            js_options.indent_with_tabs = True\n        elif opt in (\"--disable-preserve-newlines\", \"-d\"):\n            js_options.preserve_newlines = False\n        elif opt in (\"--max-preserve-newlines\", \"-m\"):\n            js_options.max_preserve_newlines = int(arg)\n        elif opt in (\"--space-in-paren\", \"-P\"):\n            js_options.space_in_paren = True\n        elif opt in (\"--space-in-empty-paren\", \"-E\"):\n            js_options.space_in_empty_paren = True\n        elif opt in (\"--jslint-happy\", \"-j\"):\n            js_options.jslint_happy = True\n        elif opt in (\"--space-after-anon-function\", \"-a\"):\n            js_options.space_after_anon_function = True\n        elif opt in (\"--space-after-named-function\",):\n            js_options.space_after_named_function = True\n        elif opt in (\"--eval-code\",):\n            js_options.eval_code = True\n        elif opt in (\"--quiet\",):\n            js_options.keep_quiet = True\n        elif opt in (\"--brace-style\", \"-b\"):\n            js_options.brace_style = arg\n        elif opt in (\"--unescape-strings\", \"-x\"):\n            js_options.unescape_strings = True\n        elif opt in (\"--e4x\", \"-X\"):\n            js_options.e4x = True\n        elif opt in (\"--end-with-newline\", \"-n\"):\n            js_options.end_with_newline = True\n        elif opt in (\"--comma-first\", \"-C\"):\n            js_options.comma_first = True\n        elif opt in (\"--operator-position\", \"-O\"):\n            js_options.operator_position = arg\n        elif opt in (\"--wrap-line-length \", \"-w\"):\n            js_options.wrap_line_length = int(arg)\n        elif opt in (\"--indent-empty-lines\",):\n            js_options.indent_empty_lines = True\n        elif opt in (\"--templating\",):\n            js_options.templating = arg.split(\",\")\n        elif opt in (\"--stdin\", \"-i\"):\n            # stdin is the default if no files are passed\n            filepath_params = []\n        elif opt in (\"--editorconfig\",):\n            js_options.editorconfig = True\n        elif opt in (\"--version\", \"-v\"):\n            return print(__version__)\n        elif opt in (\"--help\", \"--usage\", \"-h\"):\n            return usage()\n\n    try:\n        filepaths, replace = get_filepaths_from_params(filepath_params, replace)\n        for filepath in filepaths:\n            if not replace:\n                outfile = outfile_param\n            else:\n                outfile = filepath\n\n            js_options = integrate_editorconfig_options(\n                filepath, js_options, outfile, \"js\"\n            )\n\n            pretty = beautify_file(filepath, js_options)\n\n            write_beautified_output(pretty, js_options, outfile)\n\n    except MissingInputStreamError:\n        print(\"Must pipe input or define at least one file.\\n\", file=sys.stderr)\n        usage(sys.stderr)\n        return 1\n\n    except UnicodeError as ex:\n        print(\"Error while decoding input or encoding output:\", file=sys.stderr)\n        print(ex, file=sys.stderr)\n        return 1\n\n    except Exception as ex:\n        print(ex, file=sys.stderr)\n        return 1\n\n    # Success\n    return 0\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "python/jsbeautifier/__version__.py",
    "content": "__version__ = \"1.15.4\"\n"
  },
  {
    "path": "python/jsbeautifier/cli/__init__.py",
    "content": "from __future__ import print_function\nimport sys\nimport os\nimport platform\nimport io\nimport getopt\nimport re\nimport string\nimport errno\nimport copy\nimport glob\nfrom jsbeautifier.__version__ import __version__\nfrom jsbeautifier.javascript.options import BeautifierOptions\nfrom jsbeautifier.javascript.beautifier import Beautifier\n\n#\n# The MIT License (MIT)\n\n# Copyright (c) 2007-2020 Einar Lielmanis, Liam Newman, and contributors.\n\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\n__all__ = [\n    \"MissingInputStreamError\",\n    \"process_file\",\n    \"get_filepaths_from_params\",\n    \"integrate_editorconfig_options\",\n    \"write_beautified_output\",\n]\n\n\nclass MissingInputStreamError(Exception):\n    pass\n\n\ndef set_file_editorconfig_opts(filename, js_options):\n    from editorconfig import get_properties, EditorConfigError\n\n    try:\n        _ecoptions = get_properties(os.path.abspath(filename))\n\n        if _ecoptions.get(\"indent_style\") == \"tab\":\n            js_options.indent_with_tabs = True\n        elif _ecoptions.get(\"indent_style\") == \"space\":\n            js_options.indent_with_tabs = False\n\n        if _ecoptions.get(\"indent_size\"):\n            js_options.indent_size = int(_ecoptions[\"indent_size\"])\n\n        if _ecoptions.get(\"max_line_length\"):\n            if _ecoptions.get(\"max_line_length\") == \"off\":\n                js_options.wrap_line_length = 0\n            else:\n                js_options.wrap_line_length = int(_ecoptions[\"max_line_length\"])\n\n        if _ecoptions.get(\"insert_final_newline\") == \"true\":\n            js_options.end_with_newline = True\n        elif _ecoptions.get(\"insert_final_newline\") == \"false\":\n            js_options.end_with_newline = False\n\n        if _ecoptions.get(\"end_of_line\"):\n            if _ecoptions[\"end_of_line\"] == \"cr\":\n                js_options.eol = \"\\r\"\n            elif _ecoptions[\"end_of_line\"] == \"lf\":\n                js_options.eol = \"\\n\"\n            elif _ecoptions[\"end_of_line\"] == \"crlf\":\n                js_options.eol = \"\\r\\n\"\n\n    except EditorConfigError:\n        # do not error on bad editor config\n        print(\"Error loading EditorConfig.  Ignoring.\", file=sys.stderr)\n\n\ndef process_file(file_name, opts, beautify_code):\n    input_string = \"\"\n    if file_name == \"-\":  # stdin\n        if sys.stdin.isatty():\n            raise MissingInputStreamError()\n\n        stream = sys.stdin\n        if platform.platform().lower().startswith(\"windows\"):\n            if sys.version_info.major >= 3:\n                # for python 3 on windows this prevents conversion\n                stream = io.TextIOWrapper(sys.stdin.buffer, newline=\"\")\n            elif platform.architecture()[0] == \"32bit\":\n                # for python 2 x86 on windows this prevents conversion\n                import msvcrt\n\n                msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)\n            else:\n                raise Exception(\n                    \"Pipe to stdin not supported on Windows with Python 2.x 64-bit.\"\n                )\n\n        input_string = stream.read()\n\n        # if you pipe an empty string, that is a failure\n        if input_string == \"\":\n            raise MissingInputStreamError()\n    else:\n        stream = io.open(file_name, \"rt\", newline=\"\", encoding=\"UTF-8\")\n        input_string = stream.read()\n\n    return beautify_code(input_string, opts)\n\n\ndef mkdir_p(path):\n    try:\n        if path:\n            os.makedirs(path)\n    except OSError as exc:  # Python >2.5\n        if exc.errno == errno.EEXIST and os.path.isdir(path):\n            pass\n        else:\n            raise Exception()\n\n\ndef isFileDifferent(filepath, expected):\n    try:\n        return \"\".join(io.open(filepath, \"rt\", newline=\"\").readlines()) != expected\n    except BaseException:\n        return True\n\n\ndef get_filepaths_from_params(filepath_params, replace):\n    filepaths = []\n    if not filepath_params or (len(filepath_params) == 1 and filepath_params[0] == \"-\"):\n        # default to stdin\n        filepath_params = []\n        filepaths.append(\"-\")\n\n    for filepath_param in filepath_params:\n        # ignore stdin setting if files are specified\n        if \"-\" == filepath_param:\n            continue\n\n        # Check if each literal filepath exists\n        if os.path.isfile(filepath_param):\n            filepaths.append(filepath_param)\n        elif \"*\" in filepath_param or \"?\" in filepath_param:\n            # handle globs\n            # empty result is okay\n            if sys.version_info.major == 2 or (\n                sys.version_info.major == 3 and sys.version_info.minor <= 4\n            ):\n                if \"**\" in filepath_param:\n                    raise Exception(\"Recursive globs not supported on Python <= 3.4.\")\n                filepaths.extend(glob.glob(filepath_param))\n            else:\n                filepaths.extend(glob.glob(filepath_param, recursive=True))\n        else:\n            # not a glob and not a file\n            raise OSError(errno.ENOENT, os.strerror(errno.ENOENT), filepath_param)\n\n    if len(filepaths) > 1:\n        replace = True\n    elif filepaths and filepaths[0] == \"-\":\n        replace = False\n\n    # remove duplicates\n    filepaths = set(filepaths)\n\n    return filepaths, replace\n\n\ndef integrate_editorconfig_options(filepath, local_options, outfile, default_file_type):\n    # Editorconfig used only on files, not stdin\n    if getattr(local_options, \"editorconfig\"):\n        editorconfig_filepath = filepath\n\n        if editorconfig_filepath == \"-\":\n            if outfile != \"stdout\":\n                editorconfig_filepath = outfile\n            else:\n                fileType = default_file_type\n                editorconfig_filepath = \"stdin.\" + fileType\n\n        # debug(\"EditorConfig is enabled for \", editorconfig_filepath);\n        local_options = copy.copy(local_options)\n        set_file_editorconfig_opts(editorconfig_filepath, local_options)\n\n    return local_options\n\n\ndef write_beautified_output(pretty, local_options, outfile):\n    if outfile == \"stdout\":\n        stream = sys.stdout\n\n        # python automatically converts newlines in text to \"\\r\\n\" when on windows\n        # switch to binary to prevent this\n        if platform.platform().lower().startswith(\"windows\"):\n            if sys.version_info.major >= 3:\n                # for python 3 on windows this prevents conversion\n                stream = io.TextIOWrapper(sys.stdout.buffer, newline=\"\")\n            elif platform.architecture()[0] == \"32bit\":\n                # for python 2 x86 on windows this prevents conversion\n                import msvcrt\n\n                msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\n            else:\n                raise Exception(\n                    \"Pipe to stdout not supported on Windows with Python 2.x 64-bit.\"\n                )\n\n        stream.write(pretty)\n    else:\n        if isFileDifferent(outfile, pretty):\n            mkdir_p(os.path.dirname(outfile))\n\n            # python automatically converts newlines in text to \"\\r\\n\" when on windows\n            # set newline to empty to prevent this\n            with io.open(outfile, \"wt\", newline=\"\", encoding=\"UTF-8\") as f:\n                if not local_options.keep_quiet:\n                    print(\"beautified \" + outfile, file=sys.stdout)\n\n                try:\n                    f.write(pretty)\n                except TypeError:\n                    # This is not pretty, but given how we did the version import\n                    # it is the only way to do this without having setup.py\n                    # fail on a missing six dependency.\n                    six = __import__(\"six\")\n                    f.write(six.u(pretty))\n        elif not local_options.keep_quiet:\n            print(\"beautified \" + outfile + \" - unchanged\", file=sys.stdout)\n"
  },
  {
    "path": "python/jsbeautifier/core/__init__.py",
    "content": "# Empty file :)\n"
  },
  {
    "path": "python/jsbeautifier/core/directives.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\n\n\nclass Directives:\n    def __init__(self, start_block_pattern, end_block_pattern):\n        self.__directives_block_pattern = re.compile(\n            start_block_pattern + r\" beautify( \\w+[:]\\w+)+ \" + end_block_pattern\n        )\n        self.__directive_pattern = re.compile(r\" (\\w+)[:](\\w+)\")\n\n        self.__directives_end_ignore_pattern = re.compile(\n            start_block_pattern + r\"\\sbeautify\\signore:end\\s\" + end_block_pattern\n        )\n\n    def get_directives(self, text):\n        if not self.__directives_block_pattern.match(text):\n            return None\n\n        directives = {}\n        directive_match = self.__directive_pattern.search(text)\n\n        while directive_match:\n            directives[directive_match.group(1)] = directive_match.group(2)\n            directive_match = self.__directive_pattern.search(\n                text, directive_match.end()\n            )\n\n        return directives\n\n    def readIgnored(self, input):\n        return input.readUntilAfter(self.__directives_end_ignore_pattern)\n"
  },
  {
    "path": "python/jsbeautifier/core/inputscanner.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\n\n\nclass InputScanner:\n    def __init__(self, input_string):\n        self.__six = __import__(\"six\")\n        if input_string is None:\n            input_string = \"\"\n        self.__input = input_string\n        self.__input_length = len(self.__input)\n        self.__position = 0\n\n    def restart(self):\n        self.__position = 0\n\n    def back(self):\n        if self.__position > 0:\n            self.__position -= 1\n\n    def hasNext(self):\n        return self.__position < self.__input_length\n\n    def next(self):\n        val = None\n        if self.hasNext():\n            val = self.__input[self.__position]\n            self.__position += 1\n\n        return val\n\n    def peek(self, index=0):\n        val = None\n        index += self.__position\n        if index >= 0 and index < self.__input_length:\n            val = self.__input[index]\n\n        return val\n\n    def test(self, pattern, index=0):\n        index += self.__position\n        return (\n            index >= 0\n            and index < self.__input_length\n            and bool(pattern.match(self.__input, index))\n        )\n\n    def testChar(self, pattern, index=0):\n        # test one character regex match\n        val = self.peek(index)\n        return val is not None and bool(pattern.match(val))\n\n    def match(self, pattern):\n        pattern_match = None\n        if self.hasNext():\n            pattern_match = pattern.match(self.__input, self.__position)\n            if bool(pattern_match):\n                self.__position = pattern_match.end(0)\n        return pattern_match\n\n    def read(self, starting_pattern, until_pattern=None, until_after=False):\n        val = \"\"\n        pattern_match = None\n        if bool(starting_pattern):\n            pattern_match = self.match(starting_pattern)\n            if bool(pattern_match):\n                val = pattern_match.group(0)\n\n        if bool(until_pattern) and (bool(pattern_match) or not bool(starting_pattern)):\n            val += self.readUntil(until_pattern, until_after)\n\n        return val\n\n    def readUntil(self, pattern, include_match=False):\n        val = \"\"\n        pattern_match = None\n        match_index = self.__position\n        if self.hasNext():\n            pattern_match = pattern.search(self.__input, self.__position)\n            if bool(pattern_match):\n                if include_match:\n                    match_index = pattern_match.end(0)\n                else:\n                    match_index = pattern_match.start(0)\n            else:\n                match_index = self.__input_length\n\n            val = self.__input[self.__position : match_index]\n            self.__position = match_index\n\n        return val\n\n    def readUntilAfter(self, pattern):\n        return self.readUntil(pattern, True)\n\n    def get_regexp(self, pattern, match_from=False):\n        result = None\n        # strings are converted to regexp\n        if isinstance(pattern, self.__six.string_types) and pattern != \"\":\n            result = re.compile(pattern)\n        elif pattern is not None:\n            result = re.compile(pattern.pattern)\n        return result\n\n    # css beautifier legacy helpers\n    def peekUntilAfter(self, pattern):\n        start = self.__position\n        val = self.readUntilAfter(pattern)\n        self.__position = start\n        return val\n\n    def lookBack(self, testVal):\n        start = self.__position - 1\n        return (\n            start >= len(testVal)\n            and self.__input[start - len(testVal) : start].lower() == testVal\n        )\n"
  },
  {
    "path": "python/jsbeautifier/core/options.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport copy\nimport re\nfrom collections import namedtuple\n\n\nclass Options:\n    def __init__(self, options=None, merge_child_field=None):\n        self.css = None\n        self.js = None\n        self.html = None\n\n        self.raw_options = _mergeOpts(options, merge_child_field)\n\n        # Support passing the source text back with no change\n        self.disabled = self._get_boolean(\"disabled\")\n\n        self.eol = self._get_characters(\"eol\", \"auto\")\n        self.end_with_newline = self._get_boolean(\"end_with_newline\")\n        self.indent_size = self._get_number(\"indent_size\", 4)\n        self.indent_char = self._get_characters(\"indent_char\", \" \")\n        self.indent_level = self._get_number(\"indent_level\")\n\n        self.preserve_newlines = self._get_boolean(\"preserve_newlines\", True)\n        self.max_preserve_newlines = self._get_number(\"max_preserve_newlines\", 32786)\n\n        if not self.preserve_newlines:\n            self.max_preserve_newlines = 0\n\n        self.indent_with_tabs = self._get_boolean(\n            \"indent_with_tabs\", self.indent_char == \"\\t\"\n        )\n        if self.indent_with_tabs:\n            self.indent_char = \"\\t\"\n\n            # indent_size behavior changed after 1.8.6\n            # It used to be that indent_size would be\n            # set to 1 for indent_with_tabs. That is no longer needed and\n            # actually doesn't make sense - why not use spaces? Further,\n            # that might produce unexpected behavior - tabs being used\n            # for single-column alignment. So, when indent_with_tabs is true\n            # and indent_size is 1, reset indent_size to 4.\n            if self.indent_size == 1:\n                self.indent_size = 4\n\n        # Backwards compat with 1.3.x\n        self.wrap_line_length = self._get_number(\n            \"wrap_line_length\", self._get_number(\"max_char\")\n        )\n\n        # Support editor config setting\n        self.editorconfig = False\n\n        self.indent_empty_lines = self._get_boolean(\"indent_empty_lines\")\n\n        # valid templating languages ['django', 'erb', 'handlebars', 'php', 'smarty', 'angular']\n        # For now, 'auto' = all off for javascript, all except angular on for html (and inline javascript/css).\n        # other values ignored\n        self.templating = self._get_selection_list(\n            \"templating\",\n            [\"auto\", \"none\", \"angular\", \"django\", \"erb\", \"handlebars\", \"php\", \"smarty\"],\n            [\"auto\"],\n        )\n\n    def _get_array(self, name, default_value=[]):\n        option_value = getattr(self.raw_options, name, default_value)\n        result = []\n        if isinstance(option_value, list):\n            result = copy.copy(option_value)\n        elif isinstance(option_value, str):\n            result = re.compile(r\"[^a-zA-Z0-9_/\\-]+\").split(option_value)\n\n        return result\n\n    def _get_boolean(self, name, default_value=False):\n        option_value = getattr(self.raw_options, name, default_value)\n        result = False\n        try:\n            result = bool(option_value)\n        except ValueError:\n            pass\n\n        return result\n\n    def _get_characters(self, name, default_value=\"\"):\n        option_value = getattr(self.raw_options, name, default_value)\n        result = \"\"\n        if isinstance(option_value, str):\n            result = (\n                option_value.replace(\"\\\\r\", \"\\r\")\n                .replace(\"\\\\n\", \"\\n\")\n                .replace(\"\\\\t\", \"\\t\")\n            )\n\n        return result\n\n    def _get_number(self, name, default_value=0):\n        option_value = getattr(self.raw_options, name, default_value)\n        result = 0\n        try:\n            result = int(option_value)\n        except ValueError:\n            pass\n\n        return result\n\n    def _get_selection(self, name, selection_list, default_value=None):\n        result = self._get_selection_list(name, selection_list, default_value)\n        if len(result) != 1:\n            raise ValueError(\n                \"Invalid Option Value: The option '\"\n                + name\n                + \"' can only be one of the following values:\\n\"\n                + str(selection_list)\n                + \"\\nYou passed in: '\"\n                + str(getattr(self.raw_options, name, None))\n                + \"'\"\n            )\n\n        return result[0]\n\n    def _get_selection_list(self, name, selection_list, default_value=None):\n        if not selection_list:\n            raise ValueError(\"Selection list cannot be empty.\")\n\n        default_value = default_value or [selection_list[0]]\n\n        if not self._is_valid_selection(default_value, selection_list):\n            raise ValueError(\"Invalid Default Value!\")\n\n        result = self._get_array(name, default_value)\n        if not self._is_valid_selection(result, selection_list):\n            raise ValueError(\n                \"Invalid Option Value: The option '\"\n                + name\n                + \"' can contain only the following values:\\n\"\n                + str(selection_list)\n                + \"\\nYou passed in: '\"\n                + str(getattr(self.raw_options, name, None))\n                + \"'\"\n            )\n\n        return result\n\n    def _is_valid_selection(self, result, selection_list):\n        if len(result) == 0 or len(selection_list) == 0:\n            return False\n\n        for item in result:\n            if item not in selection_list:\n                return False\n\n        return True\n\n\n# merges child options up with the parent options object\n# Example: obj = {a: 1, b: {a: 2}}\n#          mergeOpts(obj, 'b')\n#\n#          Returns: {a: 2}\n\n\ndef _mergeOpts(options, childFieldName):\n    if options is None:\n        options = {}\n\n    if isinstance(options, tuple):\n        options = dict(options)\n\n    options = _normalizeOpts(options)\n    finalOpts = copy.copy(options)\n    if isinstance(options, dict):\n        local = finalOpts.get(childFieldName, None)\n        if local:\n            del finalOpts[childFieldName]\n            for key in local:\n                finalOpts[key] = local[key]\n        finalOpts = namedtuple(\"CustomOptions\", finalOpts.keys())(*finalOpts.values())\n\n    if isinstance(options, Options):\n        local = getattr(finalOpts, childFieldName, None)\n        if local:\n            delattr(finalOpts, childFieldName)\n            for key in local:\n                setattr(finalOpts, key, local[key])\n\n    return finalOpts\n\n\ndef _normalizeOpts(options):\n    convertedOpts = copy.copy(options)\n    if isinstance(convertedOpts, dict):\n        option_keys = list(convertedOpts.keys())\n        for key in option_keys:\n            if \"-\" in key:\n                del convertedOpts[key]\n                convertedOpts[key.replace(\"-\", \"_\")] = options[key]\n    else:\n        option_keys = list(getattr(convertedOpts, \"__dict__\", {}))\n        for key in option_keys:\n            if \"-\" in key:\n                delattr(convertedOpts, key)\n                setattr(\n                    convertedOpts, key.replace(\"-\", \"_\"), getattr(options, key, None)\n                )\n\n    return convertedOpts\n"
  },
  {
    "path": "python/jsbeautifier/core/output.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\nimport math\n\n# Using object instead of string to allow for later expansion of info\n# about each line\n\n__all__ = [\"Output\"]\n\n\nclass OutputLine:\n    def __init__(self, parent):\n        self.__parent = parent\n        self.__character_count = 0\n        self.__indent_count = -1\n        self.__alignment_count = 0\n        self.__wrap_point_index = 0\n        self.__wrap_point_character_count = 0\n        self.__wrap_point_indent_count = -1\n        self.__wrap_point_alignment_count = 0\n\n        self.__items = []\n\n    def clone_empty(self):\n        line = OutputLine(self.__parent)\n        line.set_indent(self.__indent_count, self.__alignment_count)\n        return line\n\n    def item(self, index):\n        return self.__items[index]\n\n    def is_empty(self):\n        return len(self.__items) == 0\n\n    def set_indent(self, indent=0, alignment=0):\n        if self.is_empty():\n            self.__indent_count = indent\n            self.__alignment_count = alignment\n            self.__character_count = self.__parent.get_indent_size(\n                self.__indent_count, self.__alignment_count\n            )\n\n    def _set_wrap_point(self):\n        if self.__parent.wrap_line_length:\n            self.__wrap_point_index = len(self.__items)\n            self.__wrap_point_character_count = self.__character_count\n            self.__wrap_point_indent_count = self.__parent.next_line.__indent_count\n            self.__wrap_point_alignment_count = (\n                self.__parent.next_line.__alignment_count\n            )\n\n    def _should_wrap(self):\n        return (\n            self.__wrap_point_index\n            and self.__character_count > self.__parent.wrap_line_length\n            and self.__wrap_point_character_count\n            > self.__parent.next_line.__character_count\n        )\n\n    def _allow_wrap(self):\n        if self._should_wrap():\n            self.__parent.add_new_line()\n            next = self.__parent.current_line\n            next.set_indent(\n                self.__wrap_point_indent_count, self.__wrap_point_alignment_count\n            )\n            next.__items = self.__items[self.__wrap_point_index :]\n            self.__items = self.__items[: self.__wrap_point_index]\n\n            next.__character_count += (\n                self.__character_count - self.__wrap_point_character_count\n            )\n            self.__character_count = self.__wrap_point_character_count\n\n            if next.__items[0] == \" \":\n                next.__items.pop(0)\n                next.__character_count -= 1\n\n            return True\n\n        return False\n\n    def last(self):\n        if not self.is_empty():\n            return self.__items[-1]\n\n        return None\n\n    def push(self, item):\n        self.__items.append(item)\n        last_newline_index = item.rfind(\"\\n\")\n        if last_newline_index != -1:\n            self.__character_count = len(item) - last_newline_index\n        else:\n            self.__character_count += len(item)\n\n    def pop(self):\n        item = None\n        if not self.is_empty():\n            item = self.__items.pop()\n            self.__character_count -= len(item)\n        return item\n\n    def _remove_indent(self):\n        if self.__indent_count > 0:\n            self.__indent_count -= 1\n            self.__character_count -= self.__parent.indent_size\n\n    def _remove_wrap_indent(self):\n        if self.__wrap_point_indent_count > 0:\n            self.__wrap_point_indent_count -= 1\n\n    def trim(self):\n        while self.last() == \" \":\n            self.__items.pop()\n            self.__character_count -= 1\n\n    def toString(self):\n        result = \"\"\n        if self.is_empty():\n            if self.__parent.indent_empty_lines:\n                result = self.__parent.get_indent_string(self.__indent_count)\n        else:\n            result = self.__parent.get_indent_string(\n                self.__indent_count, self.__alignment_count\n            )\n            result += \"\".join(self.__items)\n        return result\n\n\nclass IndentStringCache:\n    def __init__(self, options, base_string):\n        self.__cache = [\"\"]\n        self.__indent_size = options.indent_size\n        self.__indent_string = options.indent_char\n        if not options.indent_with_tabs:\n            self.__indent_string = options.indent_char * options.indent_size\n\n        # Set to null to continue support of auto detection of base indent\n        base_string = base_string or \"\"\n        if options.indent_level > 0:\n            base_string = options.indent_level * self.__indent_string\n\n        self.__base_string = base_string\n        self.__base_string_length = len(base_string)\n\n    def get_indent_size(self, indent, column=0):\n        result = self.__base_string_length\n        if indent < 0:\n            result = 0\n        result += indent * self.__indent_size\n        result += column\n        return result\n\n    def get_indent_string(self, indent_level, column=0):\n        result = self.__base_string\n        if indent_level < 0:\n            indent_level = 0\n            result = \"\"\n        column += indent_level * self.__indent_size\n        self.__ensure_cache(column)\n        result += self.__cache[column]\n        return result\n\n    def __ensure_cache(self, column):\n        while column >= len(self.__cache):\n            self.__add_column()\n\n    def __add_column(self):\n        column = len(self.__cache)\n        indent = 0\n        result = \"\"\n        if self.__indent_size and column >= self.__indent_size:\n            indent = int(math.floor(column / self.__indent_size))\n            column -= indent * self.__indent_size\n            result = indent * self.__indent_string\n        if column:\n            result += column * \" \"\n        self.__cache.append(result)\n\n\nclass Output:\n    def __init__(self, options, baseIndentString=\"\"):\n        self.__indent_cache = IndentStringCache(options, baseIndentString)\n        self.raw = False\n        self._end_with_newline = options.end_with_newline\n        self.indent_size = options.indent_size\n        self.wrap_line_length = options.wrap_line_length\n        self.indent_empty_lines = options.indent_empty_lines\n        self.__lines = []\n        self.previous_line = None\n        self.current_line = None\n        self.next_line = OutputLine(self)\n        self.space_before_token = False\n        self.non_breaking_space = False\n        self.previous_token_wrapped = False\n        # initialize\n        self.__add_outputline()\n\n    def __add_outputline(self):\n        self.previous_line = self.current_line\n        self.current_line = self.next_line.clone_empty()\n        self.__lines.append(self.current_line)\n\n    def get_line_number(self):\n        return len(self.__lines)\n\n    def get_indent_string(self, indent, column=0):\n        return self.__indent_cache.get_indent_string(indent, column)\n\n    def get_indent_size(self, indent, column=0):\n        return self.__indent_cache.get_indent_size(indent, column)\n\n    def is_empty(self):\n        return self.previous_line is None and self.current_line.is_empty()\n\n    def add_new_line(self, force_newline=False):\n        # never newline at the start of file\n        # otherwise, newline only if we didn't just add one or we're forced\n        if self.is_empty() or (not force_newline and self.just_added_newline()):\n            return False\n\n        # if raw output is enabled, don't print additional newlines,\n        # but still return True as though you had\n        if not self.raw:\n            self.__add_outputline()\n        return True\n\n    def get_code(self, eol):\n        self.trim(True)\n\n        # handle some edge cases where the last tokens\n        # has text that ends with newline(s)\n        last_item = self.current_line.pop()\n        if last_item:\n            if last_item[-1] == \"\\n\":\n                last_item = re.sub(r\"[\\n]+$\", \"\", last_item)\n            self.current_line.push(last_item)\n\n        if self._end_with_newline:\n            self.__add_outputline()\n\n        sweet_code = \"\\n\".join(line.toString() for line in self.__lines)\n\n        if not eol == \"\\n\":\n            sweet_code = sweet_code.replace(\"\\n\", eol)\n\n        return sweet_code\n\n    def set_wrap_point(self):\n        self.current_line._set_wrap_point()\n\n    def set_indent(self, indent=0, alignment=0):\n        # Next line stores alignment values\n        self.next_line.set_indent(indent, alignment)\n\n        # Never indent your first output indent at the start of the file\n        if len(self.__lines) > 1:\n            self.current_line.set_indent(indent, alignment)\n            return True\n        self.current_line.set_indent()\n        return False\n\n    def add_raw_token(self, token):\n        for _ in range(token.newlines):\n            self.__add_outputline()\n\n        self.current_line.set_indent(-1)\n        self.current_line.push(token.whitespace_before)\n        self.current_line.push(token.text)\n        self.space_before_token = False\n        self.non_breaking_space = False\n        self.previous_token_wrapped = False\n\n    def add_token(self, printable_token):\n        self.__add_space_before_token()\n        self.current_line.push(printable_token)\n        self.space_before_token = False\n        self.non_breaking_space = False\n        self.previous_token_wrapped = self.current_line._allow_wrap()\n\n    def __add_space_before_token(self):\n        if self.space_before_token and not self.just_added_newline():\n            if not self.non_breaking_space:\n                self.set_wrap_point()\n            self.current_line.push(\" \")\n        self.space_before_token = False\n\n    def remove_indent(self, index):\n        while index < len(self.__lines):\n            self.__lines[index]._remove_indent()\n            index += 1\n        self.current_line._remove_wrap_indent()\n\n    def trim(self, eat_newlines=False):\n        self.current_line.trim()\n\n        while eat_newlines and len(self.__lines) > 1 and self.current_line.is_empty():\n            self.__lines.pop()\n            self.current_line = self.__lines[-1]\n            self.current_line.trim()\n\n        if len(self.__lines) > 1:\n            self.previous_line = self.__lines[-2]\n        else:\n            self.previous_line = None\n\n    def just_added_newline(self):\n        return self.current_line.is_empty()\n\n    def just_added_blankline(self):\n        return self.is_empty() or (\n            self.current_line.is_empty() and self.previous_line.is_empty()\n        )\n\n    def ensure_empty_line_above(self, starts_with, ends_with):\n        index = len(self.__lines) - 2\n        while index >= 0:\n            potentialEmptyLine = self.__lines[index]\n            if potentialEmptyLine.is_empty():\n                break\n            elif (\n                not potentialEmptyLine.item(0).startswith(starts_with)\n                and potentialEmptyLine.item(-1) != ends_with\n            ):\n                self.__lines.insert(index + 1, OutputLine(self))\n                self.previous_line = self.__lines[-2]\n                break\n            index -= 1\n"
  },
  {
    "path": "python/jsbeautifier/core/pattern.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\n__all__ = [\"Pattern\"]\n\n\nclass Pattern:\n    def __init__(self, input_scanner, parent=None):\n        self._input = input_scanner\n        self._starting_pattern = None\n        self._match_pattern = None\n        self._until_pattern = None\n        self._until_after = False\n\n        if parent is not None:\n            self._starting_pattern = self._input.get_regexp(parent._starting_pattern)\n            self._match_pattern = self._input.get_regexp(parent._match_pattern)\n            self._until_pattern = self._input.get_regexp(parent._until_pattern)\n            self._until_after = parent._until_after\n\n    def read(self):\n        result = self._input.read(self._starting_pattern)\n        if (self._starting_pattern is None) or result:\n            result += self._input.read(\n                self._match_pattern, self._until_pattern, self._until_after\n            )\n        return result\n\n    def read_match(self):\n        return self._input.match(self._match_pattern)\n\n    def until_after(self, pattern):\n        result = self._create()\n        result._until_after = True\n        result._until_pattern = self._input.get_regexp(pattern)\n        result._update()\n        return result\n\n    def until(self, pattern):\n        result = self._create()\n        result._until_after = False\n        result._until_pattern = self._input.get_regexp(pattern)\n        result._update()\n        return result\n\n    def starting_with(self, pattern):\n        result = self._create()\n        result._starting_pattern = self._input.get_regexp(pattern)\n        result._update()\n        return result\n\n    def matching(self, pattern):\n        result = self._create()\n        result._match_pattern = self._input.get_regexp(pattern)\n        result._update()\n        return result\n\n    def _create(self):\n        return Pattern(self._input, self)\n\n    def _update(self):\n        pass\n"
  },
  {
    "path": "python/jsbeautifier/core/templatablepattern.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport copy\nfrom ..core.pattern import Pattern\n\n__all__ = [\"TemplatablePattern\"]\n\n\nclass TemplateNames:\n    def __init__(self):\n        self.django = False\n        self.erb = False\n        self.handlebars = False\n        self.php = False\n        self.smarty = False\n        self.angular = False\n\n\nclass TemplatePatterns:\n    def __init__(self, input_scanner):\n        pattern = Pattern(input_scanner)\n        self.handlebars_comment = pattern.starting_with(r\"{{!--\").until_after(r\"--}}\")\n        self.handlebars_unescaped = pattern.starting_with(r\"{{{\").until_after(r\"}}}\")\n        self.handlebars = pattern.starting_with(r\"{{\").until_after(r\"}}\")\n        self.php = pattern.starting_with(r\"<\\?(?:[= ]|php)\").until_after(r\"\\?>\")\n        self.erb = pattern.starting_with(r\"<%[^%]\").until_after(r\"[^%]%>\")\n        # django coflicts with handlebars a bit.\n        self.django = pattern.starting_with(r\"{%\").until_after(r\"%}\")\n        self.django_value = pattern.starting_with(r\"{{\").until_after(r\"}}\")\n        self.django_comment = pattern.starting_with(r\"{#\").until_after(r\"#}\")\n        self.smarty_value = pattern.starting_with(r\"{(?=[^}{\\s\\n])\").until_after(r\"}\")\n        self.smarty_comment = pattern.starting_with(r\"{\\*\").until_after(r\"\\*}\")\n        self.smarty_literal = pattern.starting_with(r\"{literal}\").until_after(\n            r\"{/literal}\"\n        )\n\n\nclass TemplatablePattern(Pattern):\n    def __init__(self, input_scanner, parent=None):\n        Pattern.__init__(self, input_scanner, parent)\n        self.__template_pattern = None\n        self._disabled = TemplateNames()\n        self._excluded = TemplateNames()\n\n        if parent is not None:\n            self.__template_pattern = self._input.get_regexp(parent.__template_pattern)\n            self._disabled = copy.copy(parent._disabled)\n            self._excluded = copy.copy(parent._excluded)\n\n        self.__patterns = TemplatePatterns(input_scanner)\n\n    def _create(self):\n        return TemplatablePattern(self._input, self)\n\n    def _update(self):\n        self.__set_templated_pattern()\n\n    def read_options(self, options):\n        result = self._create()\n        for language in [\"django\", \"erb\", \"handlebars\", \"php\", \"smarty\", \"angular\"]:\n            setattr(result._disabled, language, not (language in options.templating))\n        result._update()\n        return result\n\n    def disable(self, language):\n        result = self._create()\n        setattr(result._disabled, language, True)\n        result._update()\n        return result\n\n    def exclude(self, language):\n        result = self._create()\n        setattr(result._excluded, language, True)\n        result._update()\n        return result\n\n    def read(self):\n        result = \"\"\n        if bool(self._match_pattern):\n            result = self._input.read(self._starting_pattern)\n        else:\n            result = self._input.read(self._starting_pattern, self.__template_pattern)\n\n        next = self._read_template()\n\n        while bool(next):\n            if self._match_pattern is not None:\n                next += self._input.read(self._match_pattern)\n            else:\n                next += self._input.readUntil(self.__template_pattern)\n\n            result += next\n            next = self._read_template()\n\n        if self._until_after:\n            result += self._input.readUntilAfter(self._until_pattern)\n\n        return result\n\n    def __set_templated_pattern(self):\n        items = list()\n\n        if not self._disabled.php:\n            items.append(self.__patterns.php._starting_pattern.pattern)\n\n        if not self._disabled.handlebars:\n            items.append(self.__patterns.handlebars._starting_pattern.pattern)\n\n        if not self._disabled.erb:\n            items.append(self.__patterns.erb._starting_pattern.pattern)\n\n        if not self._disabled.django:\n            items.append(self.__patterns.django._starting_pattern.pattern)\n            # The starting pattern for django is more complex because it has different\n            # patterns for value, comment, and other sections\n            items.append(self.__patterns.django_value._starting_pattern.pattern)\n            items.append(self.__patterns.django_comment._starting_pattern.pattern)\n\n        if not self._disabled.smarty:\n            items.append(self.__patterns.smarty._starting_pattern.pattern)\n\n        if self._until_pattern:\n            items.append(self._until_pattern.pattern)\n\n        self.__template_pattern = self._input.get_regexp(r\"(?:\" + \"|\".join(items) + \")\")\n\n    def _read_template(self):\n        resulting_string = \"\"\n        c = self._input.peek()\n        if c == \"<\":\n            peek1 = self._input.peek(1)\n            if not self._disabled.php and not self._excluded.php and peek1 == \"?\":\n                resulting_string = resulting_string or self.__patterns.php.read()\n\n            if not self._disabled.erb and not self._excluded.erb and peek1 == \"%\":\n                resulting_string = resulting_string or self.__patterns.erb.read()\n        elif c == \"{\":\n            if not self._disabled.handlebars and not self._excluded.handlebars:\n                resulting_string = (\n                    resulting_string or self.__patterns.handlebars_comment.read()\n                )\n                resulting_string = (\n                    resulting_string or self.__patterns.handlebars_unescaped.read()\n                )\n                resulting_string = resulting_string or self.__patterns.handlebars.read()\n            if not self._disabled.django:\n                # django coflicts with handlebars a bit.\n                if not self._excluded.django and not self._excluded.handlebars:\n                    resulting_string = (\n                        resulting_string or self.__patterns.django_value.read()\n                    )\n                if not self._excluded.django:\n                    resulting_string = (\n                        resulting_string or self.__patterns.django_comment.read()\n                    )\n                    resulting_string = resulting_string or self.__patterns.django.read()\n            if not self._disabled.smarty:\n                # smarty cannot be enabled with django or handlebars enabled\n\n                if self._disabled.django and self._disabled.handlebars:\n                    resulting_string = (\n                        resulting_string or self.__patterns.smarty_comment.read()\n                    )\n                    resulting_string = (\n                        resulting_string or self.__patterns.smarty_literal.read()\n                    )\n\n                    resulting_string = resulting_string or self.__patterns.smarty.read()\n\n        return resulting_string\n"
  },
  {
    "path": "python/jsbeautifier/core/token.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\n\nclass Token:\n    def __init__(self, type, text, newlines=0, whitespace_before=\"\"):\n        self.type = type\n        self.text = text\n        self.comments_before = None\n        self.newlines = newlines\n        self.whitespace_before = whitespace_before\n        self.parent = None\n        self.next = None\n        self.previous = None\n        self.opened = None\n        self.closed = None\n        self.directives = None\n"
  },
  {
    "path": "python/jsbeautifier/core/tokenizer.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\nfrom ..core.inputscanner import InputScanner\nfrom ..core.token import Token\nfrom ..core.tokenstream import TokenStream\nfrom ..core.pattern import Pattern\nfrom ..core.whitespacepattern import WhitespacePattern\n\n__all__ = [\"TOKEN\", \"Tokenizer\", \"TokenizerPatterns\", \"TokenTypes\"]\n\n\nclass TokenTypes:\n    START = \"TK_START\"\n    RAW = \"TK_RAW\"\n    EOF = \"TK_EOF\"\n\n    def __init__(self):\n        pass\n\n\nTOKEN = TokenTypes()\n\n\nclass TokenizerPatterns:\n    def __init__(self, input_scanner):\n        self.whitespace = WhitespacePattern(input_scanner)\n\n\nclass Tokenizer:\n    def __init__(self, input_string, options):\n        self._input = InputScanner(input_string)\n        self._options = options\n        self.__tokens = None\n\n        self._patterns = TokenizerPatterns(self._input)\n\n    def tokenize(self):\n        self._input.restart()\n        self.__tokens = TokenStream()\n\n        current = None\n        previous = Token(TOKEN.START, \"\")\n        open_token = None\n        open_stack = []\n        comments = TokenStream()\n\n        while previous.type != TOKEN.EOF:\n            current = self.__get_next_token_with_comments(previous, open_token)\n\n            if self._is_opening(current):\n                open_stack.append(open_token)\n                open_token = current\n            elif open_token is not None and self._is_closing(current, open_token):\n                current.opened = open_token\n                open_token.closed = current\n                open_token = open_stack.pop()\n                current.parent = open_token\n\n            self.__tokens.add(current)\n            previous = current\n        return self.__tokens\n\n    def __get_next_token_with_comments(self, previous, open_token):\n        current = self._get_next_token(previous, open_token)\n\n        if self._is_comment(current):\n            comments = TokenStream()\n            while self._is_comment(current):\n                comments.add(current)\n                current = self._get_next_token(previous, open_token)\n\n            if not comments.isEmpty():\n                current.comments_before = comments\n                comments = TokenStream()\n\n        current.parent = open_token\n        current.previous = previous\n        previous.next = current\n\n        return current\n\n    def _is_first_token(self):\n        return self.__tokens.isEmpty()\n\n    def _reset(self):\n        pass\n\n    def _get_next_token(self, previous_token, open_token):\n        self._readWhitespace()\n        resulting_string = self._input.read(re.compile(r\".+\"))\n        if resulting_string:\n            return self._create_token(TOKEN.RAW, resulting_string)\n        else:\n            return self._create_token(TOKEN.EOF, \"\")\n\n    def _is_comment(self, current_token):\n        return False\n\n    def _is_opening(self, current_token):\n        return False\n\n    def _is_closing(self, current_token, open_token):\n        return False\n\n    def _create_token(self, token_type, text):\n        token = Token(\n            token_type,\n            text,\n            self._patterns.whitespace.newline_count,\n            self._patterns.whitespace.whitespace_before_token,\n        )\n        return token\n\n    def _readWhitespace(self):\n        return self._patterns.whitespace.read()\n"
  },
  {
    "path": "python/jsbeautifier/core/tokenstream.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\nfrom ..core.inputscanner import InputScanner\nfrom ..core.token import Token\n\n\nclass TokenStream:\n    def __init__(self, parent_token=None):\n        self.__tokens = []\n        self.__tokens_length = len(self.__tokens)\n        self.__position = 0\n        self.__parent_token = parent_token\n\n    def restart(self):\n        self.__position = 0\n\n    def isEmpty(self):\n        return self.__tokens_length == 0\n\n    def hasNext(self):\n        return self.__position < self.__tokens_length\n\n    def next(self):\n        if self.hasNext():\n            val = self.__tokens[self.__position]\n            self.__position += 1\n            return val\n        else:\n            raise StopIteration\n\n    def peek(self, index=0):\n        val = None\n        index += self.__position\n        if index >= 0 and index < self.__tokens_length:\n            val = self.__tokens[index]\n\n        return val\n\n    def add(self, token):\n        if self.__parent_token:\n            token.parent = self.__parent_token\n\n        self.__tokens.append(token)\n        self.__tokens_length += 1\n\n    def __iter__(self):\n        self.restart()\n        return self\n\n    def __next__(self):\n        return self.next()\n"
  },
  {
    "path": "python/jsbeautifier/core/whitespacepattern.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\nfrom ..core.pattern import Pattern\n\n__all__ = [\"WhitespacePattern\"]\n\n\nclass WhitespacePattern(Pattern):\n    def __init__(self, input_scanner, parent=None):\n        Pattern.__init__(self, input_scanner, parent)\n\n        if parent is not None:\n            self._newline_regexp = self._input.get_regexp(parent._newline_regexp)\n        else:\n            self.__set_whitespace_patterns(\"\", \"\")\n\n        self.newline_count = 0\n        self.whitespace_before_token = \"\"\n\n    def __set_whitespace_patterns(self, whitespace_chars, newline_chars):\n        whitespace_chars += \"\\\\t \"\n        newline_chars += \"\\\\n\\\\r\"\n\n        self._match_pattern = self._input.get_regexp(\n            \"[\" + whitespace_chars + newline_chars + \"]+\"\n        )\n        self._newline_regexp = self._input.get_regexp(\"\\\\r\\\\n|[\" + newline_chars + \"]\")\n\n    def read(self):\n        self.newline_count = 0\n        self.whitespace_before_token = \"\"\n\n        resulting_string = self._input.read(self._match_pattern)\n        if resulting_string == \" \":\n            self.whitespace_before_token = \" \"\n        elif bool(resulting_string):\n            lines = self._newline_regexp.split(resulting_string)\n            self.newline_count = len(lines) - 1\n            self.whitespace_before_token = lines[-1]\n\n        return resulting_string\n\n    def matching(self, whitespace_chars, newline_chars):\n        result = self._create()\n        result.__set_whitespace_patterns(whitespace_chars, newline_chars)\n        result._update()\n        return result\n\n    def _create(self):\n        return WhitespacePattern(self._input, self)\n"
  },
  {
    "path": "python/jsbeautifier/javascript/__init__.py",
    "content": "# Empty file :)\n"
  },
  {
    "path": "python/jsbeautifier/javascript/acorn.py",
    "content": "import re\n\n# This section of code was translated to python from acorn (javascript).\n#\n# Acorn was written by Marijn Haverbeke and released under an MIT\n# license. The Unicode regexps (for identifiers and whitespace) were\n# taken from [Esprima](http://esprima.org) by Ariya Hidayat.\n#\n# Git repositories for Acorn are available at\n#\n#     http://marijnhaverbeke.nl/git/acorn\n#     https://github.com/marijnh/acorn.git\n\n# This is not pretty, but given how we did the version import\n# it is the only way to do this without having setup.py fail on a missing\n# six dependency.\nsix = __import__(\"six\")\n\n# ## Character categories\n\n# acorn used char codes to squeeze the last bit of performance out\n# Beautifier is okay without that, so we're using regex\n# permit #(23), $ (36), and @ (64). @ is used in ES7 decorators.\n# 65 through 91 are uppercase letters.\n# permit _ (95).\n# 97 through 123 are lowercase letters.\n_baseASCIIidentifierStartChars = six.u(r\"\\x23\\x24\\x40\\x41-\\x5a\\x5f\\x61-\\x7a\")\n\n# inside an identifier @ is not allowed but 0-9 are.\n_baseASCIIidentifierChars = six.u(r\"\\x24\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\")\n\n# Big ugly regular expressions that match characters in the\n# whitespace, identifier, and identifier-start categories. These\n# are only applied when a character is found to actually have a\n# code point above 128.\n# IMPORTANT: These strings must be run through six to handle \\u chars\n_nonASCIIidentifierStartChars = six.u(\n    r\"\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u08a0\\u08a2-\\u08ac\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097f\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c3d\\u0c58\\u0c59\\u0c60\\u0c61\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d60\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f0\\u1700-\\u170c\\u170e-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4b\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1ce9-\\u1cec\\u1cee-\\u1cf1\\u1cf5\\u1cf6\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2e2f\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua697\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua793\\ua7a0-\\ua7aa\\ua7f8-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa80-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uabc0-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc\"\n)\n_nonASCIIidentifierChars = six.u(\n    r\"\\u0300-\\u036f\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u0620-\\u0649\\u0672-\\u06d3\\u06e7-\\u06e8\\u06fb-\\u06fc\\u0730-\\u074a\\u0800-\\u0814\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0840-\\u0857\\u08e4-\\u08fe\\u0900-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962-\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09d7\\u09df-\\u09e0\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2-\\u0ae3\\u0ae6-\\u0aef\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5f-\\u0b60\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c01-\\u0c03\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62-\\u0c63\\u0c66-\\u0c6f\\u0c82\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2-\\u0ce3\\u0ce6-\\u0cef\\u0d02\\u0d03\\u0d46-\\u0d48\\u0d57\\u0d62-\\u0d63\\u0d66-\\u0d6f\\u0d82\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e34-\\u0e3a\\u0e40-\\u0e45\\u0e50-\\u0e59\\u0eb4-\\u0eb9\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f41-\\u0f47\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u1029\\u1040-\\u1049\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u170e-\\u1710\\u1720-\\u1730\\u1740-\\u1750\\u1772\\u1773\\u1780-\\u17b2\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u1920-\\u192b\\u1930-\\u193b\\u1951-\\u196d\\u19b0-\\u19c0\\u19c8-\\u19c9\\u19d0-\\u19d9\\u1a00-\\u1a15\\u1a20-\\u1a53\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1b46-\\u1b4b\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c00-\\u1c22\\u1c40-\\u1c49\\u1c5b-\\u1c7d\\u1cd0-\\u1cd2\\u1d00-\\u1dbe\\u1e01-\\u1f15\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2d81-\\u2d96\\u2de0-\\u2dff\\u3021-\\u3028\\u3099\\u309a\\ua640-\\ua66d\\ua674-\\ua67d\\ua69f\\ua6f0-\\ua6f1\\ua7f8-\\ua800\\ua806\\ua80b\\ua823-\\ua827\\ua880-\\ua881\\ua8b4-\\ua8c4\\ua8d0-\\ua8d9\\ua8f3-\\ua8f7\\ua900-\\ua909\\ua926-\\ua92d\\ua930-\\ua945\\ua980-\\ua983\\ua9b3-\\ua9c0\\uaa00-\\uaa27\\uaa40-\\uaa41\\uaa4c-\\uaa4d\\uaa50-\\uaa59\\uaa7b\\uaae0-\\uaae9\\uaaf2-\\uaaf3\\uabc0-\\uabe1\\uabec\\uabed\\uabf0-\\uabf9\\ufb20-\\ufb28\\ufe00-\\ufe0f\\ufe20-\\ufe26\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f\"\n)\n# _nonASCIIidentifierStart = re.compile(\"[\" + _nonASCIIidentifierStartChars + \"]\")\n# _nonASCIIidentifier = re.compile(\"[\" + _nonASCIIidentifierStartChars + _nonASCIIidentifierChars + \"]\")\n\n_unicodeEscapeOrCodePoint = six.u(r\"\\\\u[0-9a-fA-F]{4}|\\\\u\\{[0-9a-fA-F]+\\}\")\n\n_identifierStart = (\n    six.u(\"(?:\")\n    + _unicodeEscapeOrCodePoint\n    + six.u(\"|[\")\n    + _baseASCIIidentifierStartChars\n    + _nonASCIIidentifierStartChars\n    + six.u(\"])\")\n)\n_identifierChars = (\n    six.u(\"(?:\")\n    + _unicodeEscapeOrCodePoint\n    + six.u(\"|[\")\n    + _baseASCIIidentifierChars\n    + _nonASCIIidentifierStartChars\n    + _nonASCIIidentifierChars\n    + six.u(\"])*\")\n)\n\nidentifier = re.compile(_identifierStart + _identifierChars)\n\nidentifierStart = re.compile(_identifierStart)\nidentifierMatch = re.compile(\n    six.u(\"(?:\")\n    + _unicodeEscapeOrCodePoint\n    + six.u(\"|[\")\n    + _baseASCIIidentifierChars\n    + _nonASCIIidentifierStartChars\n    + _nonASCIIidentifierChars\n    + six.u(\"])+\")\n)\n\n_nonASCIIwhitespace = re.compile(\n    six.u(r\"[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]\")\n)\n\n# Whether a single character denotes a newline.\n# IMPORTANT: This string must be run through six to handle \\u chars\nnewline = re.compile(six.u(r\"[\\n\\r\\u2028\\u2029]\"))\n\n# Matches a whole line break (where CRLF is considered a single\n# line break). Used to count lines.\n\n# in javascript, these two differ\n# in python they are the same, different methods are called on them\n# IMPORTANT: This string must be run through six to handle \\u chars\nlineBreak = re.compile(six.u(r\"\\r\\n|[\\n\\r\\u2028\\u2029]\"))\nallLineBreaks = lineBreak\n"
  },
  {
    "path": "python/jsbeautifier/javascript/beautifier.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\nimport string\nimport copy\nfrom ..core.token import Token\nfrom .tokenizer import Tokenizer\nfrom .tokenizer import TOKEN\nfrom .options import BeautifierOptions\nfrom ..core.output import Output\n\n\ndef default_options():\n    return BeautifierOptions()\n\n\nclass BeautifierFlags:\n    def __init__(self, mode):\n        self.mode = mode\n        self.parent = None\n        self.last_token = Token(TOKEN.START_BLOCK, \"\")\n        self.last_word = \"\"\n        self.declaration_statement = False\n        self.declaration_assignment = False\n        self.multiline_frame = False\n        self.inline_frame = False\n        self.if_block = False\n        self.else_block = False\n        self.class_start_block = False\n        self.do_block = False\n        self.do_while = False\n        self.import_block = False\n        self.in_case = False\n        self.in_case_statement = False\n        self.case_body = False\n        self.case_block = False\n        self.indentation_level = 0\n        self.alignment = 0\n        self.line_indent_level = 0\n        self.start_line_index = 0\n        self.ternary_depth = 0\n\n    def apply_base(self, flags_base, added_newline):\n        next_indent_level = flags_base.indentation_level\n        if not added_newline and flags_base.line_indent_level > next_indent_level:\n            next_indent_level = flags_base.line_indent_level\n\n        self.parent = flags_base\n        self.last_token = flags_base.last_token\n        self.last_word = flags_base.last_word\n        self.indentation_level = next_indent_level\n\n\nOPERATOR_POSITION = {\n    \"before_newline\": \"before-newline\",\n    \"after_newline\": \"after-newline\",\n    \"preserve_newline\": \"preserve-newline\",\n}\nOPERATOR_POSITION_BEFORE_OR_PRESERVE = [\n    OPERATOR_POSITION[\"before_newline\"],\n    OPERATOR_POSITION[\"preserve_newline\"],\n]\n\n\nclass MODE:\n    (\n        BlockStatement,\n        Statement,\n        ObjectLiteral,\n        ArrayLiteral,\n        ForInitializer,\n        Conditional,\n        Expression,\n    ) = range(7)\n\n\ndef remove_redundant_indentation(output, frame):\n    # This implementation is effective but has some issues:\n    #     - can cause line wrap to happen too soon due to indent removal\n    #           after wrap points are calculated\n    # These issues are minor compared to ugly indentation.\n\n    if (\n        frame.multiline_frame\n        or frame.mode == MODE.ForInitializer\n        or frame.mode == MODE.Conditional\n    ):\n        return\n\n    # remove one indent from each line inside this section\n    output.remove_indent(frame.start_line_index)\n\n\ndef reserved_word(token, word):\n    return token and token.type == TOKEN.RESERVED and token.text == word\n\n\ndef reserved_array(token, words):\n    return token and token.type == TOKEN.RESERVED and token.text in words\n\n\n_special_word_set = frozenset(\n    [\n        \"case\",\n        \"return\",\n        \"do\",\n        \"if\",\n        \"throw\",\n        \"else\",\n        \"await\",\n        \"break\",\n        \"continue\",\n        \"async\",\n    ]\n)\n\n\nclass Beautifier:\n    def __init__(self, opts=None):\n        import jsbeautifier.javascript.acorn as acorn\n\n        self.acorn = acorn\n        self._options = BeautifierOptions(opts)\n\n        self._blank_state()\n\n    def _blank_state(self, js_source_text=None):\n        if js_source_text is None:\n            js_source_text = \"\"\n\n        # internal flags\n        self._flags = None\n        self._previous_flags = None\n        self._flag_store = []\n        self._tokens = None\n\n        if self._options.eol == \"auto\":\n            self._options.eol = \"\\n\"\n            if self.acorn.lineBreak.search(js_source_text or \"\"):\n                self._options.eol = self.acorn.lineBreak.search(js_source_text).group()\n\n        baseIndentString = re.search(\"^[\\t ]*\", js_source_text).group(0)\n        self._last_last_text = \"\"  # pre-last token text\n\n        self._output = Output(self._options, baseIndentString)\n        # If testing the ignore directive, start with output disable set to\n        # true\n        self._output.raw = self._options.test_output_raw\n\n        self.set_mode(MODE.BlockStatement)\n        return js_source_text\n\n    def beautify(self, source_text=\"\", opts=None):\n        if opts is not None:\n            self._options = BeautifierOptions(opts)\n\n        source_text = source_text or \"\"\n        if self._options.disabled:\n            return source_text\n\n        source_text = self._blank_state(source_text)\n\n        source_text = self.unpack(source_text, self._options.eval_code)\n\n        self._tokens = Tokenizer(source_text, self._options).tokenize()\n\n        for current_token in self._tokens:\n            self.handle_token(current_token)\n\n            self._last_last_text = self._flags.last_token.text\n            self._flags.last_token = current_token\n\n        sweet_code = self._output.get_code(self._options.eol)\n\n        return sweet_code\n\n    def handle_token(self, current_token, preserve_statement_flags=False):\n        if current_token.type == TOKEN.START_EXPR:\n            self.handle_start_expr(current_token)\n        elif current_token.type == TOKEN.END_EXPR:\n            self.handle_end_expr(current_token)\n        elif current_token.type == TOKEN.START_BLOCK:\n            self.handle_start_block(current_token)\n        elif current_token.type == TOKEN.END_BLOCK:\n            self.handle_end_block(current_token)\n        elif current_token.type == TOKEN.WORD:\n            self.handle_word(current_token)\n        elif current_token.type == TOKEN.RESERVED:\n            self.handle_word(current_token)\n        elif current_token.type == TOKEN.SEMICOLON:\n            self.handle_semicolon(current_token)\n        elif current_token.type == TOKEN.STRING:\n            self.handle_string(current_token)\n        elif current_token.type == TOKEN.EQUALS:\n            self.handle_equals(current_token)\n        elif current_token.type == TOKEN.OPERATOR:\n            self.handle_operator(current_token)\n        elif current_token.type == TOKEN.COMMA:\n            self.handle_comma(current_token)\n        elif current_token.type == TOKEN.BLOCK_COMMENT:\n            self.handle_block_comment(current_token, preserve_statement_flags)\n        elif current_token.type == TOKEN.COMMENT:\n            self.handle_comment(current_token, preserve_statement_flags)\n        elif current_token.type == TOKEN.DOT:\n            self.handle_dot(current_token)\n        elif current_token.type == TOKEN.EOF:\n            self.handle_eof(current_token)\n        elif current_token.type == TOKEN.UNKNOWN:\n            self.handle_unknown(current_token, preserve_statement_flags)\n        else:\n            self.handle_unknown(current_token, preserve_statement_flags)\n\n    def handle_whitespace_and_comments(\n        self, current_token, preserve_statement_flags=False\n    ):\n        newlines = current_token.newlines\n        keep_whitespace = self._options.keep_array_indentation and self.is_array(\n            self._flags.mode\n        )\n\n        if current_token.comments_before is not None:\n            for comment_token in current_token.comments_before:\n                # The cleanest handling of inline comments is to treat them\n                # as though they aren't there.\n                # Just continue formatting and the behavior should be logical.\n                # Also ignore unknown tokens.  Again, this should result in better\n                # behavior.\n                self.handle_whitespace_and_comments(\n                    comment_token, preserve_statement_flags\n                )\n                self.handle_token(comment_token, preserve_statement_flags)\n\n        if keep_whitespace:\n            for i in range(newlines):\n                self.print_newline(i > 0, preserve_statement_flags)\n        else:  # not keep_whitespace\n            if (\n                self._options.max_preserve_newlines != 0\n                and newlines > self._options.max_preserve_newlines\n            ):\n                newlines = self._options.max_preserve_newlines\n\n            if self._options.preserve_newlines and newlines > 1:\n                self.print_newline(False, preserve_statement_flags)\n                for i in range(1, newlines):\n                    self.print_newline(True, preserve_statement_flags)\n\n    def unpack(self, source, evalcode=False):\n        import jsbeautifier.unpackers as unpackers\n\n        try:\n            return unpackers.run(source, evalcode)\n        except unpackers.UnpackingError:\n            return source\n\n    def is_array(self, mode):\n        return mode == MODE.ArrayLiteral\n\n    def is_expression(self, mode):\n        return (\n            mode == MODE.Expression\n            or mode == MODE.ForInitializer\n            or mode == MODE.Conditional\n        )\n\n    _newline_restricted_tokens = frozenset(\n        [\"async\", \"break\", \"continue\", \"return\", \"throw\", \"yield\"]\n    )\n\n    def allow_wrap_or_preserved_newline(self, current_token, force_linewrap=False):\n        # never wrap the first token of a line.\n        if self._output.just_added_newline():\n            return\n\n        shouldPreserveOrForce = (\n            self._options.preserve_newlines and current_token.newlines\n        ) or force_linewrap\n        operatorLogicApplies = (\n            self._flags.last_token.text in Tokenizer.positionable_operators\n            or current_token.text in Tokenizer.positionable_operators\n        )\n\n        if operatorLogicApplies:\n            shouldPrintOperatorNewline = (\n                self._flags.last_token.text in Tokenizer.positionable_operators\n                and self._options.operator_position\n                in OPERATOR_POSITION_BEFORE_OR_PRESERVE\n            ) or current_token.text in Tokenizer.positionable_operators\n            shouldPreserveOrForce = shouldPreserveOrForce and shouldPrintOperatorNewline\n\n        if shouldPreserveOrForce:\n            self.print_newline(preserve_statement_flags=True)\n        elif self._options.wrap_line_length > 0:\n            if reserved_array(self._flags.last_token, self._newline_restricted_tokens):\n                # These tokens should never have a newline inserted between\n                # them and the following expression.\n                return\n            self._output.set_wrap_point()\n\n    def print_newline(self, force_newline=False, preserve_statement_flags=False):\n        if not preserve_statement_flags:\n            if (\n                self._flags.last_token.text != \";\"\n                and self._flags.last_token.text != \",\"\n                and self._flags.last_token.text != \"=\"\n                and (\n                    self._flags.last_token.type != TOKEN.OPERATOR\n                    or self._flags.last_token.text == \"--\"\n                    or self._flags.last_token.text == \"++\"\n                )\n            ):\n                next_token = self._tokens.peek()\n                while (\n                    self._flags.mode == MODE.Statement\n                    and not (self._flags.if_block and reserved_word(next_token, \"else\"))\n                    and not self._flags.do_block\n                ):\n                    self.restore_mode()\n\n        if self._output.add_new_line(force_newline):\n            self._flags.multiline_frame = True\n\n    def print_token_line_indentation(self, current_token):\n        if self._output.just_added_newline():\n            line = self._output.current_line\n            if (\n                self._options.keep_array_indentation\n                and current_token.newlines\n                and (self.is_array(self._flags.mode) or current_token.text == \"[\")\n            ):\n                line.set_indent(-1)\n                line.push(current_token.whitespace_before)\n                self._output.space_before_token = False\n            elif self._output.set_indent(\n                self._flags.indentation_level, self._flags.alignment\n            ):\n                self._flags.line_indent_level = self._flags.indentation_level\n\n    def print_token(self, current_token, s=None):\n        if self._output.raw:\n            self._output.add_raw_token(current_token)\n            return\n\n        if (\n            self._options.comma_first\n            and current_token.previous\n            and current_token.previous.type == TOKEN.COMMA\n            and self._output.just_added_newline()\n        ):\n            if self._output.previous_line.last() == \",\":\n                # if the comma was already at the start of the line,\n                # pull back onto that line and reprint the indentation\n                popped = self._output.previous_line.pop()\n                if self._output.previous_line.is_empty():\n                    self._output.previous_line.push(popped)\n                    self._output.trim(True)\n                    self._output.current_line.pop()\n                    self._output.trim()\n\n                # add the comma in front of the next token\n                self.print_token_line_indentation(current_token)\n                self._output.add_token(\",\")\n                self._output.space_before_token = True\n\n        if s is None:\n            s = current_token.text\n\n        self.print_token_line_indentation(current_token)\n        self._output.non_breaking_space = True\n        self._output.add_token(s)\n        if self._output.previous_token_wrapped:\n            self._flags.multiline_frame = True\n\n    def indent(self):\n        self._flags.indentation_level += 1\n        self._output.set_indent(self._flags.indentation_level, self._flags.alignment)\n\n    def deindent(self):\n        allow_deindent = self._flags.indentation_level > 0 and (\n            (self._flags.parent is None)\n            or self._flags.indentation_level > self._flags.parent.indentation_level\n        )\n\n        if allow_deindent:\n            self._flags.indentation_level -= 1\n\n        self._output.set_indent(self._flags.indentation_level, self._flags.alignment)\n\n    def set_mode(self, mode):\n        if self._flags:\n            self._flag_store.append(self._flags)\n            self._previous_flags = self._flags\n        else:\n            self._previous_flags = BeautifierFlags(mode)\n\n        self._flags = BeautifierFlags(mode)\n        self._flags.apply_base(self._previous_flags, self._output.just_added_newline())\n        self._flags.start_line_index = self._output.get_line_number()\n\n        self._output.set_indent(self._flags.indentation_level, self._flags.alignment)\n\n    def restore_mode(self):\n        if len(self._flag_store) > 0:\n            self._previous_flags = self._flags\n            self._flags = self._flag_store.pop()\n            if self._previous_flags.mode == MODE.Statement:\n                remove_redundant_indentation(self._output, self._previous_flags)\n\n        self._output.set_indent(self._flags.indentation_level, self._flags.alignment)\n\n    def start_of_object_property(self):\n        return (\n            self._flags.parent.mode == MODE.ObjectLiteral\n            and self._flags.mode == MODE.Statement\n            and (\n                (self._flags.last_token.text == \":\" and self._flags.ternary_depth == 0)\n                or (reserved_array(self._flags.last_token, [\"get\", \"set\"]))\n            )\n        )\n\n    def start_of_statement(self, current_token):\n        start = False\n        start = start or (\n            reserved_array(self._flags.last_token, [\"var\", \"let\", \"const\"])\n            and current_token.type == TOKEN.WORD\n        )\n        start = start or reserved_word(self._flags.last_token, \"do\")\n        start = start or (\n            not (\n                self._flags.parent.mode == MODE.ObjectLiteral\n                and self._flags.mode == MODE.Statement\n            )\n            and reserved_array(self._flags.last_token, self._newline_restricted_tokens)\n            and not current_token.newlines\n        )\n        start = start or (\n            reserved_word(self._flags.last_token, \"else\")\n            and not (\n                reserved_word(current_token, \"if\")\n                and current_token.comments_before is None\n            )\n        )\n        start = start or (\n            self._flags.last_token.type == TOKEN.END_EXPR\n            and (\n                self._previous_flags.mode == MODE.ForInitializer\n                or self._previous_flags.mode == MODE.Conditional\n            )\n        )\n        start = start or (\n            self._flags.last_token.type == TOKEN.WORD\n            and self._flags.mode == MODE.BlockStatement\n            and not self._flags.in_case\n            and not (current_token.text == \"--\" or current_token.text == \"++\")\n            and self._last_last_text != \"function\"\n            and current_token.type != TOKEN.WORD\n            and current_token.type != TOKEN.RESERVED\n        )\n        start = start or (\n            self._flags.mode == MODE.ObjectLiteral\n            and (\n                (self._flags.last_token.text == \":\" and self._flags.ternary_depth == 0)\n                or (reserved_array(self._flags.last_token, [\"get\", \"set\"]))\n            )\n        )\n\n        if start:\n            self.set_mode(MODE.Statement)\n            self.indent()\n\n            self.handle_whitespace_and_comments(current_token, True)\n\n            # Issue #276:\n            # If starting a new statement with [if, for, while, do], push to a new line.\n            # if (a) if (b) if(c) d(); else e(); else f();\n            if not self.start_of_object_property():\n                self.allow_wrap_or_preserved_newline(\n                    current_token,\n                    reserved_array(current_token, [\"do\", \"for\", \"if\", \"while\"]),\n                )\n            return True\n        else:\n            return False\n\n    def handle_start_expr(self, current_token):\n        if self.start_of_statement(current_token):\n            # The conditional starts the statement if appropriate.\n            pass\n        else:\n            self.handle_whitespace_and_comments(current_token)\n\n        next_mode = MODE.Expression\n\n        if current_token.text == \"[\":\n            if (\n                self._flags.last_token.type == TOKEN.WORD\n                or self._flags.last_token.text == \")\"\n            ):\n                if reserved_array(self._flags.last_token, Tokenizer.line_starters):\n                    self._output.space_before_token = True\n                self.print_token(current_token)\n                self.set_mode(next_mode)\n                self.indent()\n                if self._options.space_in_paren:\n                    self._output.space_before_token = True\n                return\n\n            next_mode = MODE.ArrayLiteral\n\n            if self.is_array(self._flags.mode):\n                if self._flags.last_token.text == \"[\" or (\n                    self._flags.last_token.text == \",\"\n                    and (self._last_last_text == \"]\" or self._last_last_text == \"}\")\n                ):\n                    # ], [ goes to a new line\n                    # }, [ goes to a new line\n                    if not self._options.keep_array_indentation:\n                        self.print_newline()\n\n            if self._flags.last_token.type not in [\n                TOKEN.START_EXPR,\n                TOKEN.END_EXPR,\n                TOKEN.WORD,\n                TOKEN.OPERATOR,\n                TOKEN.DOT,\n            ]:\n                self._output.space_before_token = True\n\n        else:\n            if self._flags.last_token.type == TOKEN.RESERVED:\n                if self._flags.last_token.text == \"for\":\n                    self._output.space_before_token = (\n                        self._options.space_before_conditional\n                    )\n                    next_mode = MODE.ForInitializer\n                elif self._flags.last_token.text in [\"if\", \"while\", \"switch\"]:\n                    self._output.space_before_token = (\n                        self._options.space_before_conditional\n                    )\n                    next_mode = MODE.Conditional\n                elif self._flags.last_word in [\"await\", \"async\"]:\n                    # Should be a space between await and an IIFE, or async and\n                    # an arrow function\n                    self._output.space_before_token = True\n                elif (\n                    self._flags.last_token.text == \"import\"\n                    and current_token.whitespace_before == \"\"\n                ):\n                    self._output.space_before_token = False\n                elif (\n                    self._flags.last_token.text in Tokenizer.line_starters\n                    or self._flags.last_token.text == \"catch\"\n                ):\n                    self._output.space_before_token = True\n\n            elif self._flags.last_token.type in [TOKEN.EQUALS, TOKEN.OPERATOR]:\n                # Support of this kind of newline preservation:\n                # a = (b &&\n                #     (c || d));\n                if not self.start_of_object_property():\n                    self.allow_wrap_or_preserved_newline(current_token)\n            elif self._flags.last_token.type == TOKEN.WORD:\n                self._output.space_before_token = False\n                # function name() vs function name ()\n                # function* name() vs function* name ()\n                # async name() vs async name ()\n                # In ES6, you can also define the method properties of an object\n                # var obj = {a: function() {}}\n                # It can be abbreviated\n                # var obj = {a() {}}\n                # var obj = { a() {}} vs var obj = { a () {}}\n                # var obj = { * a() {}} vs var obj = { * a () {}}\n                peek_back_two = self._tokens.peek(-3)\n                if self._options.space_after_named_function and peek_back_two:\n                    # peek starts at next character so -1 is current token\n                    peek_back_three = self._tokens.peek(-4)\n                    if reserved_array(peek_back_two, [\"async\", \"function\"]) or (\n                        peek_back_two.text == \"*\"\n                        and reserved_array(peek_back_three, [\"async\", \"function\"])\n                    ):\n                        self._output.space_before_token = True\n                    elif self._flags.mode == MODE.ObjectLiteral:\n                        if (peek_back_two.text == \"{\" or peek_back_two.text == \",\") or (\n                            peek_back_two.text == \"*\"\n                            and (\n                                peek_back_three.text == \"{\"\n                                or peek_back_three.text == \",\"\n                            )\n                        ):\n                            self._output.space_before_token = True\n                    elif self._flags.parent and self._flags.parent.class_start_block:\n                        self._output.space_before_token = True\n            else:\n                # Support preserving wrapped arrow function expressions\n                # a.b('c',\n                #     () => d.e\n                # )\n                self.allow_wrap_or_preserved_newline(current_token)\n\n            # function() vs function (), typeof() vs typeof ()\n            # function*() vs function* (), yield*() vs yield* ()\n            if (\n                self._flags.last_token.type == TOKEN.RESERVED\n                and (\n                    self._flags.last_word == \"function\"\n                    or self._flags.last_word == \"typeof\"\n                )\n            ) or (\n                self._flags.last_token.text == \"*\"\n                and (\n                    self._last_last_text in [\"function\", \"yield\"]\n                    or (\n                        self._flags.mode == MODE.ObjectLiteral\n                        and self._last_last_text in [\"{\", \",\"]\n                    )\n                )\n            ):\n                self._output.space_before_token = (\n                    self._options.space_after_anon_function\n                )\n\n        if (\n            self._flags.last_token.text == \";\"\n            or self._flags.last_token.type == TOKEN.START_BLOCK\n        ):\n            self.print_newline()\n        elif (\n            self._flags.last_token.type\n            in [TOKEN.END_EXPR, TOKEN.START_EXPR, TOKEN.END_BLOCK, TOKEN.COMMA]\n            or self._flags.last_token.text == \".\"\n        ):\n            # do nothing on (( and )( and ][ and ]( and .(\n            # TODO: Consider whether forcing this is required.  Review failing\n            # tests when removed.\n            self.allow_wrap_or_preserved_newline(current_token, current_token.newlines)\n\n        self.print_token(current_token)\n        self.set_mode(next_mode)\n\n        if self._options.space_in_paren:\n            self._output.space_before_token = True\n\n        # In all cases, if we newline while inside an expression it should be\n        # indented.\n        self.indent()\n\n    def handle_end_expr(self, current_token):\n        # statements inside expressions are not valid syntax, but...\n        # statements must all be closed when their container closes\n        while self._flags.mode == MODE.Statement:\n            self.restore_mode()\n\n        self.handle_whitespace_and_comments(current_token)\n\n        if self._flags.multiline_frame:\n            self.allow_wrap_or_preserved_newline(\n                current_token,\n                current_token.text == \"]\"\n                and self.is_array(self._flags.mode)\n                and not self._options.keep_array_indentation,\n            )\n\n        if self._options.space_in_paren:\n            if (\n                self._flags.last_token.type == TOKEN.START_EXPR\n                and not self._options.space_in_empty_paren\n            ):\n                # empty parens are always \"()\" and \"[]\", not \"( )\" or \"[ ]\"\n                self._output.space_before_token = False\n                self._output.trim()\n            else:\n                self._output.space_before_token = True\n\n        self.deindent()\n        self.print_token(current_token)\n        self.restore_mode()\n\n        remove_redundant_indentation(self._output, self._previous_flags)\n\n        # do {} while () // no statement required after\n        if self._flags.do_while and self._previous_flags.mode == MODE.Conditional:\n            self._previous_flags.mode = MODE.Expression\n            self._flags.do_block = False\n            self._flags.do_while = False\n\n    def handle_start_block(self, current_token):\n        self.handle_whitespace_and_comments(current_token)\n\n        # Check if this is a BlockStatement that should be treated as a\n        # ObjectLiteral\n        next_token = self._tokens.peek()\n        second_token = self._tokens.peek(1)\n        if (\n            self._flags.last_word == \"switch\"\n            and self._flags.last_token.type == TOKEN.END_EXPR\n        ):\n            self.set_mode(MODE.BlockStatement)\n            self._flags.in_case_statement = True\n        elif self._flags.case_body:\n            self.set_mode(MODE.BlockStatement)\n        elif second_token is not None and (\n            (\n                second_token.text in [\":\", \",\"]\n                and next_token.type in [TOKEN.STRING, TOKEN.WORD, TOKEN.RESERVED]\n            )\n            or (\n                next_token.text in [\"get\", \"set\", \"...\"]\n                and second_token.type in [TOKEN.WORD, TOKEN.RESERVED]\n            )\n        ):\n            # We don't support TypeScript,but we didn't break it for a very long time.\n            # We'll try to keep not breaking it.\n            if self._last_last_text in [\n                \"class\",\n                \"interface\",\n            ] and second_token.text not in [\":\", \",\"]:\n                self.set_mode(MODE.BlockStatement)\n            else:\n                self.set_mode(MODE.ObjectLiteral)\n        elif (\n            self._flags.last_token.type == TOKEN.OPERATOR\n            and self._flags.last_token.text == \"=>\"\n        ):\n            # arrow function: (param1, paramN) => { statements }\n            self.set_mode(MODE.BlockStatement)\n        elif self._flags.last_token.type in [\n            TOKEN.EQUALS,\n            TOKEN.START_EXPR,\n            TOKEN.COMMA,\n            TOKEN.OPERATOR,\n        ] or reserved_array(\n            self._flags.last_token, [\"return\", \"throw\", \"import\", \"default\"]\n        ):\n            # Detecting shorthand function syntax is difficult by scanning forward,\n            #     so check the surrounding context.\n            # If the block is being returned, imported, export default, passed as arg,\n            # assigned with = or assigned in a nested object, treat as an\n            # ObjectLiteral.\n            self.set_mode(MODE.ObjectLiteral)\n        else:\n            self.set_mode(MODE.BlockStatement)\n\n        if self._flags.last_token:\n            if reserved_array(self._flags.last_token.previous, [\"class\", \"extends\"]):\n                self._flags.class_start_block = True\n\n        empty_braces = (\n            (next_token is not None)\n            and next_token.comments_before is None\n            and next_token.text == \"}\"\n        )\n        empty_anonymous_function = (\n            empty_braces\n            and self._flags.last_word == \"function\"\n            and self._flags.last_token.type == TOKEN.END_EXPR\n        )\n\n        if (\n            self._options.brace_preserve_inline\n        ):  # check for inline, set inline_frame if so\n            # search forward for newline wanted inside this block\n            index = 0\n            check_token = None\n            self._flags.inline_frame = True\n            do_loop = True\n            while do_loop:\n                index += 1\n                check_token = self._tokens.peek(index - 1)\n                if check_token.newlines:\n                    self._flags.inline_frame = False\n\n                do_loop = check_token.type != TOKEN.EOF and not (\n                    check_token.type == TOKEN.END_BLOCK\n                    and check_token.opened == current_token\n                )\n\n        if (\n            self._options.brace_style == \"expand\"\n            or (self._options.brace_style == \"none\" and current_token.newlines)\n        ) and not self._flags.inline_frame:\n            if self._flags.last_token.type != TOKEN.OPERATOR and (\n                empty_anonymous_function\n                or self._flags.last_token.type == TOKEN.EQUALS\n                or (\n                    reserved_array(self._flags.last_token, _special_word_set)\n                    and self._flags.last_token.text != \"else\"\n                )\n            ):\n                self._output.space_before_token = True\n            else:\n                self.print_newline(preserve_statement_flags=True)\n        else:  # collapse || inline_frame\n            if self.is_array(self._previous_flags.mode) and (\n                self._flags.last_token.type == TOKEN.START_EXPR\n                or self._flags.last_token.type == TOKEN.COMMA\n            ):\n                # if we're preserving inline,\n                # allow newline between comma and next brace.\n                if self._flags.inline_frame:\n                    self.allow_wrap_or_preserved_newline(current_token)\n                    self._flags.inline_frame = True\n                    self._previous_flags.multiline_frame = (\n                        self._previous_flags.multiline_frame\n                        or self._flags.multiline_frame\n                    )\n                    self._flags.multiline_frame = False\n                elif self._flags.last_token.type == TOKEN.COMMA:\n                    self._output.space_before_token = True\n\n            elif self._flags.last_token.type not in [TOKEN.OPERATOR, TOKEN.START_EXPR]:\n                if (\n                    self._flags.last_token.type in [TOKEN.START_BLOCK, TOKEN.SEMICOLON]\n                    and not self._flags.inline_frame\n                ):\n                    self.print_newline()\n                else:\n                    self._output.space_before_token = True\n\n        self.print_token(current_token)\n        self.indent()\n\n        # Except for specific cases, open braces are followed by a new line.\n        if not empty_braces and not (\n            self._options.brace_preserve_inline and self._flags.inline_frame\n        ):\n            self.print_newline()\n\n    def handle_end_block(self, current_token):\n        # statements must all be closed when their container closes\n        self.handle_whitespace_and_comments(current_token)\n\n        while self._flags.mode == MODE.Statement:\n            self.restore_mode()\n\n        empty_braces = self._flags.last_token.type == TOKEN.START_BLOCK\n\n        # try inline_frame (only set if opt.braces-preserve-inline) first\n        if self._flags.inline_frame and not empty_braces:\n            self._output.space_before_token = True\n        elif self._options.brace_style == \"expand\":\n            if not empty_braces:\n                self.print_newline()\n        else:\n            # skip {}\n            if not empty_braces:\n                if (\n                    self.is_array(self._flags.mode)\n                    and self._options.keep_array_indentation\n                ):\n                    self._options.keep_array_indentation = False\n                    self.print_newline()\n                    self._options.keep_array_indentation = True\n                else:\n                    self.print_newline()\n\n        self.restore_mode()\n        self.print_token(current_token)\n\n    def handle_word(self, current_token):\n        if current_token.type == TOKEN.RESERVED:\n            if (\n                current_token.text in [\"set\", \"get\"]\n                and self._flags.mode != MODE.ObjectLiteral\n            ):\n                current_token.type = TOKEN.WORD\n            elif current_token.text == \"import\" and self._tokens.peek().text in [\n                \"(\",\n                \".\",\n            ]:\n                current_token.type = TOKEN.WORD\n            elif current_token.text in [\"as\", \"from\"] and not self._flags.import_block:\n                current_token.type = TOKEN.WORD\n            elif self._flags.mode == MODE.ObjectLiteral:\n                next_token = self._tokens.peek()\n                if next_token.text == \":\":\n                    current_token.type = TOKEN.WORD\n\n        if self.start_of_statement(current_token):\n            # The conditional starts the statement if appropriate.\n            if (\n                reserved_array(self._flags.last_token, [\"var\", \"let\", \"const\"])\n                and current_token.type == TOKEN.WORD\n            ):\n                self._flags.declaration_statement = True\n\n        elif (\n            current_token.newlines\n            and not self.is_expression(self._flags.mode)\n            and (\n                self._flags.last_token.type != TOKEN.OPERATOR\n                or (\n                    self._flags.last_token.text == \"--\"\n                    or self._flags.last_token.text == \"++\"\n                )\n            )\n            and self._flags.last_token.type != TOKEN.EQUALS\n            and (\n                self._options.preserve_newlines\n                or not reserved_array(\n                    self._flags.last_token, [\"var\", \"let\", \"const\", \"set\", \"get\"]\n                )\n            )\n        ):\n            self.handle_whitespace_and_comments(current_token)\n            self.print_newline()\n        else:\n            self.handle_whitespace_and_comments(current_token)\n\n        if self._flags.do_block and not self._flags.do_while:\n            if reserved_word(current_token, \"while\"):\n                # do {} ## while ()\n                self._output.space_before_token = True\n                self.print_token(current_token)\n                self._output.space_before_token = True\n                self._flags.do_while = True\n                return\n            else:\n                # do {} should always have while as the next word.\n                # if we don't see the expected while, recover\n                self.print_newline()\n                self._flags.do_block = False\n\n        # if may be followed by else, or not\n        # Bare/inline ifs are tricky\n        # Need to unwind the modes correctly: if (a) if (b) c(); else d(); else\n        # e();\n        if self._flags.if_block:\n            if (not self._flags.else_block) and reserved_word(current_token, \"else\"):\n                self._flags.else_block = True\n            else:\n                while self._flags.mode == MODE.Statement:\n                    self.restore_mode()\n\n                self._flags.if_block = False\n\n        if self._flags.in_case_statement and reserved_array(\n            current_token, [\"case\", \"default\"]\n        ):\n            self.print_newline()\n            if (not self._flags.case_block) and (\n                self._flags.case_body or self._options.jslint_happy\n            ):\n                self.deindent()\n            self._flags.case_body = False\n            self.print_token(current_token)\n            self._flags.in_case = True\n            return\n\n        if self._flags.last_token.type in [\n            TOKEN.COMMA,\n            TOKEN.START_EXPR,\n            TOKEN.EQUALS,\n            TOKEN.OPERATOR,\n        ]:\n            if not self.start_of_object_property() and not (\n                # start of object property is different for numeric values with +/- prefix operators\n                self._flags.last_token.text in [\"+\", \"-\"]\n                and self._last_last_text == \":\"\n                and self._flags.parent.mode == MODE.ObjectLiteral\n            ):\n                self.allow_wrap_or_preserved_newline(current_token)\n\n        if reserved_word(current_token, \"function\"):\n            if self._flags.last_token.text in [\"}\", \";\"] or (\n                self._output.just_added_newline()\n                and not (\n                    self._flags.last_token.text in [\"(\", \"[\", \"{\", \":\", \"=\", \",\"]\n                    or self._flags.last_token.type == TOKEN.OPERATOR\n                )\n            ):\n                # make sure there is a nice clean space of at least one blank line\n                # before a new function definition, except in arrays\n                if (\n                    not self._output.just_added_blankline()\n                    and current_token.comments_before is None\n                ):\n                    self.print_newline()\n                    self.print_newline(True)\n\n            if (\n                self._flags.last_token.type == TOKEN.RESERVED\n                or self._flags.last_token.type == TOKEN.WORD\n            ):\n                if reserved_array(\n                    self._flags.last_token, [\"get\", \"set\", \"new\", \"export\"]\n                ) or reserved_array(\n                    self._flags.last_token, self._newline_restricted_tokens\n                ):\n                    self._output.space_before_token = True\n                elif (\n                    reserved_word(self._flags.last_token, \"default\")\n                    and self._last_last_text == \"export\"\n                ):\n                    self._output.space_before_token = True\n                elif self._flags.last_token.text == \"declare\":\n                    # accomodates Typescript declare function formatting\n                    self._output.space_before_token = True\n                else:\n                    self.print_newline()\n            elif (\n                self._flags.last_token.type == TOKEN.OPERATOR\n                or self._flags.last_token.text == \"=\"\n            ):\n                # foo = function\n                self._output.space_before_token = True\n            elif not self._flags.multiline_frame and (\n                self.is_expression(self._flags.mode) or self.is_array(self._flags.mode)\n            ):\n                # (function\n                pass\n            else:\n                self.print_newline()\n\n            self.print_token(current_token)\n            self._flags.last_word = current_token.text\n            return\n\n        prefix = \"NONE\"\n\n        if self._flags.last_token.type == TOKEN.END_BLOCK:\n            if self._previous_flags.inline_frame:\n                prefix = \"SPACE\"\n            elif not reserved_array(\n                current_token, [\"else\", \"catch\", \"finally\", \"from\"]\n            ):\n                prefix = \"NEWLINE\"\n            else:\n                if self._options.brace_style in [\"expand\", \"end-expand\"] or (\n                    self._options.brace_style == \"none\" and current_token.newlines\n                ):\n                    prefix = \"NEWLINE\"\n                else:\n                    prefix = \"SPACE\"\n                    self._output.space_before_token = True\n        elif (\n            self._flags.last_token.type == TOKEN.SEMICOLON\n            and self._flags.mode == MODE.BlockStatement\n        ):\n            # TODO: Should this be for STATEMENT as well?\n            prefix = \"NEWLINE\"\n        elif self._flags.last_token.type == TOKEN.SEMICOLON and self.is_expression(\n            self._flags.mode\n        ):\n            prefix = \"SPACE\"\n        elif self._flags.last_token.type == TOKEN.STRING:\n            prefix = \"NEWLINE\"\n        elif (\n            self._flags.last_token.type == TOKEN.RESERVED\n            or self._flags.last_token.type == TOKEN.WORD\n            or (\n                self._flags.last_token.text == \"*\"\n                and (\n                    self._last_last_text in [\"function\", \"yield\"]\n                    or (\n                        self._flags.mode == MODE.ObjectLiteral\n                        and self._last_last_text in [\"{\", \",\"]\n                    )\n                )\n            )\n        ):\n            prefix = \"SPACE\"\n        elif self._flags.last_token.type == TOKEN.START_BLOCK:\n            if self._flags.inline_frame:\n                prefix = \"SPACE\"\n            else:\n                prefix = \"NEWLINE\"\n        elif self._flags.last_token.type == TOKEN.END_EXPR:\n            self._output.space_before_token = True\n            prefix = \"NEWLINE\"\n\n        if (\n            reserved_array(current_token, Tokenizer.line_starters)\n            and self._flags.last_token.text != \")\"\n        ):\n            if (\n                self._flags.inline_frame\n                or self._flags.last_token.text == \"else \"\n                or self._flags.last_token.text == \"export\"\n            ):\n                prefix = \"SPACE\"\n            else:\n                prefix = \"NEWLINE\"\n\n        if reserved_array(current_token, [\"else\", \"catch\", \"finally\"]):\n            if (\n                (\n                    not (\n                        self._flags.last_token.type == TOKEN.END_BLOCK\n                        and self._previous_flags.mode == MODE.BlockStatement\n                    )\n                )\n                or self._options.brace_style == \"expand\"\n                or self._options.brace_style == \"end-expand\"\n                or (self._options.brace_style == \"none\" and current_token.newlines)\n            ) and not self._flags.inline_frame:\n                self.print_newline()\n            else:\n                self._output.trim(True)\n                # If we trimmed and there's something other than a close block before us\n                # put a newline back in.  Handles '} // comment' scenario.\n                if self._output.current_line.last() != \"}\":\n                    self.print_newline()\n\n                self._output.space_before_token = True\n\n        elif prefix == \"NEWLINE\":\n            if reserved_array(self._flags.last_token, _special_word_set):\n                # no newline between return nnn\n                self._output.space_before_token = True\n            elif self._flags.last_token.text == \"declare\" and reserved_array(\n                current_token, [\"var\", \"let\", \"const\"]\n            ):\n                # accomodates Typescript declare formatting\n                self._output.space_before_token = True\n            elif self._flags.last_token.type != TOKEN.END_EXPR:\n                if (\n                    self._flags.last_token.type != TOKEN.START_EXPR\n                    or not (reserved_array(current_token, [\"var\", \"let\", \"const\"]))\n                ) and self._flags.last_token.text != \":\":\n                    # no need to force newline on VAR -\n                    # for (var x = 0...\n                    if (\n                        reserved_word(current_token, \"if\")\n                        and self._flags.last_token.text == \"else\"\n                    ):\n                        self._output.space_before_token = True\n                    else:\n                        self.print_newline()\n            elif (\n                reserved_array(current_token, Tokenizer.line_starters)\n                and self._flags.last_token.text != \")\"\n            ):\n                self.print_newline()\n        elif (\n            self._flags.multiline_frame\n            and self.is_array(self._flags.mode)\n            and self._flags.last_token.text == \",\"\n            and self._last_last_text == \"}\"\n        ):\n            self.print_newline()  # }, in lists get a newline\n        elif prefix == \"SPACE\":\n            self._output.space_before_token = True\n\n        if current_token.previous and (\n            current_token.previous.type == TOKEN.WORD\n            or current_token.previous.type == TOKEN.RESERVED\n        ):\n            self._output.space_before_token = True\n\n        self.print_token(current_token)\n        self._flags.last_word = current_token.text\n\n        if current_token.type == TOKEN.RESERVED:\n            if current_token.text == \"do\":\n                self._flags.do_block = True\n            elif current_token.text == \"if\":\n                self._flags.if_block = True\n            elif current_token.text == \"import\":\n                self._flags.import_block = True\n            elif current_token.text == \"from\" and self._flags.import_block:\n                self._flags.import_block = False\n\n    def handle_semicolon(self, current_token):\n        if self.start_of_statement(current_token):\n            # The conditional starts the statement if appropriate.\n            # Semicolon can be the start (and end) of a statement\n            self._output.space_before_token = False\n        else:\n            self.handle_whitespace_and_comments(current_token)\n\n        next_token = self._tokens.peek()\n        while (\n            self._flags.mode == MODE.Statement\n            and not (self._flags.if_block and reserved_word(next_token, \"else\"))\n            and not self._flags.do_block\n        ):\n            self.restore_mode()\n\n        if self._flags.import_block:\n            self._flags.import_block = False\n\n        self.print_token(current_token)\n\n    def handle_string(self, current_token):\n        if (\n            current_token.text[0] == \"`\"\n            and current_token.newlines == 0\n            and current_token.whitespace_before == \"\"\n            and (\n                self._flags.last_token.type == TOKEN.WORD\n                or current_token.previous.text == \")\"\n            )\n        ):\n            # This conditional checks backtick strings and makes no changes\n            pass\n        elif self.start_of_statement(current_token):\n            # The conditional starts the statement if appropriate.\n            # One difference - strings want at least a space before\n            self._output.space_before_token = True\n        else:\n            self.handle_whitespace_and_comments(current_token)\n            if (\n                self._flags.last_token.type in [TOKEN.RESERVED, TOKEN.WORD]\n                or self._flags.inline_frame\n            ):\n                self._output.space_before_token = True\n            elif self._flags.last_token.type in [\n                TOKEN.COMMA,\n                TOKEN.START_EXPR,\n                TOKEN.EQUALS,\n                TOKEN.OPERATOR,\n            ]:\n                if not self.start_of_object_property():\n                    self.allow_wrap_or_preserved_newline(current_token)\n            elif (\n                current_token.text[0] == \"`\"\n                and self._flags.last_token.type == TOKEN.END_EXPR\n                and current_token.previous.text in [\"]\", \")\"]\n                and current_token.newlines == 0\n            ):\n                self._output.space_before_token = True\n            else:\n                self.print_newline()\n\n        self.print_token(current_token)\n\n    def handle_equals(self, current_token):\n        if self.start_of_statement(current_token):\n            # The conditional starts the statement if appropriate.\n            pass\n        else:\n            self.handle_whitespace_and_comments(current_token)\n\n        if self._flags.declaration_statement:\n            # just got an '=' in a var-line, different line breaking rules will\n            # apply\n            self._flags.declaration_assignment = True\n\n        self._output.space_before_token = True\n        self.print_token(current_token)\n        self._output.space_before_token = True\n\n    def handle_comma(self, current_token):\n        self.handle_whitespace_and_comments(current_token, True)\n\n        self.print_token(current_token)\n        self._output.space_before_token = True\n\n        if self._flags.declaration_statement:\n            if self.is_expression(self._flags.parent.mode):\n                # do not break on comma, for ( var a = 1, b = 2\n                self._flags.declaration_assignment = False\n\n            if self._flags.declaration_assignment:\n                self._flags.declaration_assignment = False\n                self.print_newline(preserve_statement_flags=True)\n            elif self._options.comma_first:\n                # for comma-first, we want to allow a newline before the comma\n                # to turn into a newline after the comma, which we will fixup\n                # later\n                self.allow_wrap_or_preserved_newline(current_token)\n\n        elif self._flags.mode == MODE.ObjectLiteral or (\n            self._flags.mode == MODE.Statement\n            and self._flags.parent.mode == MODE.ObjectLiteral\n        ):\n            if self._flags.mode == MODE.Statement:\n                self.restore_mode()\n\n            if not self._flags.inline_frame:\n                self.print_newline()\n        elif self._options.comma_first:\n            # EXPR or DO_BLOCK\n            # for comma-first, we want to allow a newline before the comma\n            # to turn into a newline after the comma, which we will fixup later\n            self.allow_wrap_or_preserved_newline(current_token)\n\n    def handle_operator(self, current_token):\n        isGeneratorAsterisk = current_token.text == \"*\" and (\n            reserved_array(self._flags.last_token, [\"function\", \"yield\"])\n            or (\n                self._flags.last_token.type\n                in [TOKEN.START_BLOCK, TOKEN.COMMA, TOKEN.END_BLOCK, TOKEN.SEMICOLON]\n            )\n        )\n        isUnary = current_token.text in [\"+\", \"-\"] and (\n            self._flags.last_token.type\n            in [TOKEN.START_BLOCK, TOKEN.START_EXPR, TOKEN.EQUALS, TOKEN.OPERATOR]\n            or self._flags.last_token.text in Tokenizer.line_starters\n            or self._flags.last_token.text == \",\"\n        )\n\n        if self.start_of_statement(current_token):\n            # The conditional starts the statement if appropriate.\n            pass\n        else:\n            preserve_statement_flags = not isGeneratorAsterisk\n            self.handle_whitespace_and_comments(current_token, preserve_statement_flags)\n\n        # hack for actionscript's import .*;\n        if current_token.text == \"*\" and self._flags.last_token.type == TOKEN.DOT:\n            self.print_token(current_token)\n            return\n\n        if current_token.text == \"::\":\n            # no spaces around the exotic namespacing syntax operator\n            self.print_token(current_token)\n            return\n\n        if current_token.text in [\"-\", \"+\"] and self.start_of_object_property():\n            # numeric value with +/- symbol in front as a property\n            self.print_token(current_token)\n            return\n\n        # Allow line wrapping between operators when operator_position is\n        #   set to before or preserve\n        if (\n            self._flags.last_token.type == TOKEN.OPERATOR\n            and self._options.operator_position in OPERATOR_POSITION_BEFORE_OR_PRESERVE\n        ):\n            self.allow_wrap_or_preserved_newline(current_token)\n\n        if current_token.text == \":\" and self._flags.in_case:\n            self.print_token(current_token)\n            self._flags.in_case = False\n            self._flags.case_body = True\n            if self._tokens.peek().type != TOKEN.START_BLOCK:\n                self.indent()\n                self.print_newline()\n                self._flags.case_block = False\n            else:\n                self._output.space_before_token = True\n                self._flags.case_block = True\n\n            return\n\n        space_before = True\n        space_after = True\n        in_ternary = False\n\n        if current_token.text == \":\":\n            if self._flags.ternary_depth == 0:\n                # Colon is invalid javascript outside of ternary and object,\n                # but do our best to guess what was meant.\n                space_before = False\n            else:\n                self._flags.ternary_depth -= 1\n                in_ternary = True\n        elif current_token.text == \"?\":\n            self._flags.ternary_depth += 1\n\n        # let's handle the operator_position option prior to any conflicting\n        # logic\n        if (\n            (not isUnary)\n            and (not isGeneratorAsterisk)\n            and self._options.preserve_newlines\n            and current_token.text in Tokenizer.positionable_operators\n        ):\n            isColon = current_token.text == \":\"\n            isTernaryColon = isColon and in_ternary\n            isOtherColon = isColon and not in_ternary\n\n            if self._options.operator_position == OPERATOR_POSITION[\"before_newline\"]:\n                # if the current token is : and it's not a ternary statement\n                # then we set space_before to false\n                self._output.space_before_token = not isOtherColon\n\n                self.print_token(current_token)\n\n                if (not isColon) or isTernaryColon:\n                    self.allow_wrap_or_preserved_newline(current_token)\n\n                self._output.space_before_token = True\n\n                return\n\n            elif self._options.operator_position == OPERATOR_POSITION[\"after_newline\"]:\n                # if the current token is anything but colon, or (via deduction) it's a colon and in a ternary statement,\n                #   then print a newline.\n                self._output.space_before_token = True\n\n                if (not isColon) or isTernaryColon:\n                    if self._tokens.peek().newlines:\n                        self.print_newline(preserve_statement_flags=True)\n                    else:\n                        self.allow_wrap_or_preserved_newline(current_token)\n                else:\n                    self._output.space_before_token = False\n\n                self.print_token(current_token)\n\n                self._output.space_before_token = True\n                return\n\n            elif (\n                self._options.operator_position == OPERATOR_POSITION[\"preserve_newline\"]\n            ):\n                if not isOtherColon:\n                    self.allow_wrap_or_preserved_newline(current_token)\n\n                # if we just added a newline, or the current token is : and it's not a ternary statement,\n                #   then we set space_before to false\n                self._output.space_before_token = not (\n                    self._output.just_added_newline() or isOtherColon\n                )\n\n                self.print_token(current_token)\n\n                self._output.space_before_token = True\n                return\n\n        if isGeneratorAsterisk:\n            self.allow_wrap_or_preserved_newline(current_token)\n            space_before = False\n            next_token = self._tokens.peek()\n            space_after = next_token and next_token.type in [TOKEN.WORD, TOKEN.RESERVED]\n        elif current_token.text == \"...\":\n            self.allow_wrap_or_preserved_newline(current_token)\n            space_before = self._flags.last_token.type == TOKEN.START_BLOCK\n            space_after = False\n        elif current_token.text in [\"--\", \"++\", \"!\", \"~\"] or isUnary:\n            if (\n                self._flags.last_token.type == TOKEN.COMMA\n                or self._flags.last_token.type == TOKEN.START_EXPR\n            ):\n                self.allow_wrap_or_preserved_newline(current_token)\n\n            space_before = False\n            space_after = False\n\n            # http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1\n            # if there is a newline between -- or ++ and anything else we\n            # should preserve it.\n            if current_token.newlines and (\n                current_token.text == \"--\"\n                or current_token.text == \"++\"\n                or current_token.text == \"~\"\n            ):\n                new_line_needed = (\n                    reserved_array(self._flags.last_token, _special_word_set)\n                    and current_token.newlines\n                )\n                if new_line_needed and (\n                    self._previous_flags.if_block or self._previous_flags.else_block\n                ):\n                    self.restore_mode()\n                self.print_newline(new_line_needed, True)\n\n            if self._flags.last_token.text == \";\" and self.is_expression(\n                self._flags.mode\n            ):\n                # for (;; ++i)\n                #         ^^\n                space_before = True\n\n            if self._flags.last_token.type == TOKEN.RESERVED:\n                space_before = True\n            elif self._flags.last_token.type == TOKEN.END_EXPR:\n                space_before = not (\n                    self._flags.last_token.text == \"]\"\n                    and current_token.text in [\"--\", \"++\"]\n                )\n            elif self._flags.last_token.type == TOKEN.OPERATOR:\n                # a++ + ++b\n                # a - -b\n                space_before = current_token.text in [\n                    \"--\",\n                    \"-\",\n                    \"++\",\n                    \"+\",\n                ] and self._flags.last_token.text in [\"--\", \"-\", \"++\", \"+\"]\n                # + and - are not unary when preceeded by -- or ++ operator\n                # a-- + b\n                # a * +b\n                # a - -b\n                if current_token.text in [\"-\", \"+\"] and self._flags.last_token.text in [\n                    \"--\",\n                    \"++\",\n                ]:\n                    space_after = True\n\n            if (\n                (\n                    self._flags.mode == MODE.BlockStatement\n                    and not self._flags.inline_frame\n                )\n                or self._flags.mode == MODE.Statement\n            ) and self._flags.last_token.text in [\"{\", \";\"]:\n                # { foo: --i }\n                # foo(): --bar\n                self.print_newline()\n\n        if space_before:\n            self._output.space_before_token = True\n\n        self.print_token(current_token)\n\n        if space_after:\n            self._output.space_before_token = True\n\n    def handle_block_comment(self, current_token, preserve_statement_flags):\n        if self._output.raw:\n            self._output.add_raw_token(current_token)\n            if (\n                current_token.directives\n                and current_token.directives.get(\"preserve\") == \"end\"\n            ):\n                # If we're testing the raw output behavior, do not allow a\n                # directive to turn it off.\n                self._output.raw = self._options.test_output_raw\n            return\n\n        if current_token.directives:\n            self.print_newline(preserve_statement_flags=preserve_statement_flags)\n            self.print_token(current_token)\n            if current_token.directives.get(\"preserve\") == \"start\":\n                self._output.raw = True\n\n            self.print_newline(preserve_statement_flags=True)\n            return\n\n        # inline block\n        if (\n            not self.acorn.newline.search(current_token.text)\n            and not current_token.newlines\n        ):\n            self._output.space_before_token = True\n            self.print_token(current_token)\n            self._output.space_before_token = True\n            return\n\n        lines = self.acorn.allLineBreaks.split(current_token.text)\n        javadoc = False\n        starless = False\n        last_indent = current_token.whitespace_before\n        last_indent_length = len(last_indent)\n\n        # block comment starts with a new line\n        self.print_newline(preserve_statement_flags=preserve_statement_flags)\n\n        # first line always indented\n        self.print_token(current_token, lines[0])\n        self.print_newline(preserve_statement_flags=preserve_statement_flags)\n\n        if len(lines) > 1:\n            lines = lines[1:]\n            javadoc = not any(\n                l for l in lines if (l.strip() == \"\" or (l.lstrip())[0] != \"*\")\n            )\n            starless = all(l.startswith(last_indent) or l.strip() == \"\" for l in lines)\n\n            if javadoc:\n                self._flags.alignment = 1\n\n            for line in lines:\n                if javadoc:\n                    # javadoc: reformat and re-indent\n                    self.print_token(current_token, line.lstrip())\n                elif starless and len(line) > last_indent_length:\n                    # starless: re-indent non-empty content, avoiding trim\n                    self.print_token(current_token, line[last_indent_length:])\n                else:\n                    # normal comments output raw\n                    self._output.current_line.set_indent(-1)\n                    self._output.add_token(line)\n\n                # for comments on their own line or  more than one line,\n                # make sure there's a new line after\n                self.print_newline(preserve_statement_flags=preserve_statement_flags)\n\n            self._flags.alignment = 0\n\n    def handle_comment(self, current_token, preserve_statement_flags):\n        if current_token.newlines:\n            self.print_newline(preserve_statement_flags=preserve_statement_flags)\n\n        if not current_token.newlines:\n            self._output.trim(True)\n\n        self._output.space_before_token = True\n        self.print_token(current_token)\n        self.print_newline(preserve_statement_flags=preserve_statement_flags)\n\n    def handle_dot(self, current_token):\n        if self.start_of_statement(current_token):\n            # The conditional starts the statement if appropriate.\n            pass\n        else:\n            self.handle_whitespace_and_comments(current_token, True)\n\n        if re.search(\"^([0-9])+$\", self._flags.last_token.text):\n            self._output.space_before_token = True\n\n        if reserved_array(self._flags.last_token, _special_word_set):\n            self._output.space_before_token = False\n        else:\n            # allow preserved newlines before dots in general\n            # force newlines on dots after close paren when break_chained - for\n            # bar().baz()\n            self.allow_wrap_or_preserved_newline(\n                current_token,\n                self._flags.last_token.text == \")\"\n                and self._options.break_chained_methods,\n            )\n\n        # Only unindent chained method dot if this dot starts a new line.\n        # Otherwise the automatic extra indentation removal\n        # will handle any over indent\n        if self._options.unindent_chained_methods and self._output.just_added_newline():\n            self.deindent()\n\n        self.print_token(current_token)\n\n    def handle_unknown(self, current_token, preserve_statement_flags):\n        self.print_token(current_token)\n        if current_token.text[-1] == \"\\n\":\n            self.print_newline(preserve_statement_flags=preserve_statement_flags)\n\n    def handle_eof(self, current_token):\n        # Unwind any open statements\n        while self._flags.mode == MODE.Statement:\n            self.restore_mode()\n\n        self.handle_whitespace_and_comments(current_token)\n"
  },
  {
    "path": "python/jsbeautifier/javascript/options.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\n\nfrom ..core.options import Options as BaseOptions\n\nOPERATOR_POSITION = [\"before-newline\", \"after-newline\", \"preserve-newline\"]\n\n\nclass BeautifierOptions(BaseOptions):\n    def __init__(self, options=None):\n        BaseOptions.__init__(self, options, \"js\")\n\n        self.css = None\n        self.js = None\n        self.html = None\n\n        # compatibility, re\n\n        raw_brace_style = getattr(self.raw_options, \"brace_style\", None)\n        if raw_brace_style == \"expand-strict\":  # graceful handling of deprecated option\n            setattr(self.raw_options, \"brace_style\", \"expand\")\n        elif (\n            raw_brace_style == \"collapse-preserve-inline\"\n        ):  # graceful handling of deprecated option\n            setattr(self.raw_options, \"brace_style\", \"collapse,preserve-inline\")\n        # elif bool(self.raw_options.braces_on_own_line): # graceful handling of deprecated option\n        #     raw_brace_style = \"expand\": \"collapse\"\n        # elif raw_brace_style is None: # Nothing exists to set it\n        #     setattr(self.raw_options, 'brace_style', \"collapse\")\n\n        # preserve-inline in delimited string will trigger brace_preserve_inline, everything\n        # else is considered a brace_style and the last one only will have an effect\n\n        brace_style_split = self._get_selection_list(\n            \"brace_style\",\n            [\"collapse\", \"expand\", \"end-expand\", \"none\", \"preserve-inline\"],\n        )\n\n        # preserve-inline in delimited string will trigger brace_preserve_inline\n        # Everything else is considered a brace_style and the last one only will\n        # have an effect\n        # specify defaults in case one half of meta-option is missing\n        self.brace_preserve_inline = False\n        self.brace_style = \"collapse\"\n\n        for bs in brace_style_split:\n            if bs == \"preserve-inline\":\n                self.brace_preserve_inline = True\n            else:\n                self.brace_style = bs\n\n        self.unindent_chained_methods = self._get_boolean(\"unindent_chained_methods\")\n        self.break_chained_methods = self._get_boolean(\"break_chained_methods\")\n        self.space_in_paren = self._get_boolean(\"space_in_paren\")\n        self.space_in_empty_paren = self._get_boolean(\"space_in_empty_paren\")\n        self.jslint_happy = self._get_boolean(\"jslint_happy\")\n        self.space_after_anon_function = self._get_boolean(\"space_after_anon_function\")\n        self.space_after_named_function = self._get_boolean(\n            \"space_after_named_function\"\n        )\n        self.keep_array_indentation = self._get_boolean(\"keep_array_indentation\")\n        self.space_before_conditional = self._get_boolean(\n            \"space_before_conditional\", True\n        )\n        self.unescape_strings = self._get_boolean(\"unescape_strings\")\n        self.e4x = self._get_boolean(\"e4x\")\n        self.comma_first = self._get_boolean(\"comma_first\")\n        self.operator_position = self._get_selection(\n            \"operator_position\", OPERATOR_POSITION\n        )\n\n        # For testing of beautify preserve:start directive\n        self.test_output_raw = False\n\n        # force opts.space_after_anon_function to true if opts.jslint_happy\n        if self.jslint_happy:\n            self.space_after_anon_function = True\n\n        self.keep_quiet = False\n        self.eval_code = False\n"
  },
  {
    "path": "python/jsbeautifier/javascript/tokenizer.py",
    "content": "# The MIT License (MIT)\n#\n# Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n#\n# Permission is hereby granted, free of charge, to any person\n# obtaining a copy of this software and associated documentation files\n# (the \"Software\"), to deal in the Software without restriction,\n# including without limitation the rights to use, copy, modify, merge,\n# publish, distribute, sublicense, and/or sell copies of the Software,\n# and to permit persons to whom the Software is furnished to do so,\n# subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be\n# included in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport re\nfrom ..core.inputscanner import InputScanner\nfrom ..core.tokenizer import TokenTypes as BaseTokenTypes\nfrom ..core.tokenizer import Tokenizer as BaseTokenizer\nfrom ..core.tokenizer import TokenizerPatterns as BaseTokenizerPatterns\nfrom ..core.directives import Directives\n\nfrom ..core.pattern import Pattern\nfrom ..core.templatablepattern import TemplatablePattern\n\n__all__ = [\"TOKEN\", \"Tokenizer\", \"TokenTypes\"]\n\n\nclass TokenTypes(BaseTokenTypes):\n    START_EXPR = \"TK_START_EXPR\"\n    END_EXPR = \"TK_END_EXPR\"\n    START_BLOCK = \"TK_START_BLOCK\"\n    END_BLOCK = \"TK_END_BLOCK\"\n    WORD = \"TK_WORD\"\n    RESERVED = \"TK_RESERVED\"\n    SEMICOLON = \"TK_SEMICOLON\"\n    STRING = \"TK_STRING\"\n    EQUALS = \"TK_EQUALS\"\n    OPERATOR = \"TK_OPERATOR\"\n    COMMA = \"TK_COMMA\"\n    BLOCK_COMMENT = \"TK_BLOCK_COMMENT\"\n    COMMENT = \"TK_COMMENT\"\n    DOT = \"TK_DOT\"\n    UNKNOWN = \"TK_UNKNOWN\"\n\n    def __init__(self):\n        pass\n\n\nTOKEN = TokenTypes()\n\ndot_pattern = re.compile(r\"[^\\d\\.]\")\n\nnumber_pattern = re.compile(\n    r\"0[xX][0123456789abcdefABCDEF_]*n?|0[oO][01234567_]*n?|0[bB][01_]*n?|\\d[\\d_]*n|(?:\\.\\d[\\d_]*|\\d[\\d_]*\\.?[\\d_]*)(?:[eE][+-]?[\\d_]+)?\"\n)\ndigit = re.compile(r\"[0-9]\")\n\n\npositionable_operators = frozenset(\n    (\n        \">>> === !== &&= ??= ||= \"\n        + \"<< && >= ** != == <= >> || ?? |> \"\n        + \"< / - + > : & % ? ^ | *\"\n    ).split(\" \")\n)\n\npunct = (\n    \">>>= \"\n    + \"... >>= <<= === >>> !== **= &&= ??= ||= \"\n    + \"=> ^= :: /= << <= == && -= >= >> != -- += ** || ?? ++ %= &= *= |= |> \"\n    + \"= ! ? > < : / ^ - + * & % ~ |\"\n)\n\npunct = re.compile(r\"([-[\\]{}()*+?.,\\\\^$|#])\").sub(r\"\\\\\\1\", punct)\n# ?. but not if followed by a number\npunct = \"\\\\?\\\\.(?!\\\\d) \" + punct\npunct = punct.replace(\" \", \"|\")\n\npunct_pattern = re.compile(punct)\n\n# Words which always should start on a new line\nline_starters = frozenset(\n    (\n        \"continue,try,throw,return,var,let,const,if,switch,case,default,for,\"\n        + \"while,break,function,import,export\"\n    ).split(\",\")\n)\nreserved_words = line_starters | frozenset(\n    [\n        \"do\",\n        \"in\",\n        \"of\",\n        \"else\",\n        \"get\",\n        \"set\",\n        \"new\",\n        \"catch\",\n        \"finally\",\n        \"typeof\",\n        \"yield\",\n        \"async\",\n        \"await\",\n        \"from\",\n        \"as\",\n        \"class\",\n        \"extends\",\n    ]\n)\n\nreserved_word_pattern = re.compile(r\"^(?:\" + \"|\".join(reserved_words) + r\")$\")\n\ndirectives_core = Directives(r\"/\\*\", r\"\\*/\")\n\nxmlRegExp = re.compile(\n    r'[\\s\\S]*?<(\\/?)([-a-zA-Z:0-9_.]+|{[^}]+?}|!\\[CDATA\\[[^\\]]*?\\]\\]|)(\\s*{[^}]+?}|\\s+[-a-zA-Z:0-9_.]+|\\s+[-a-zA-Z:0-9_.]+\\s*=\\s*(\\'[^\\']*\\'|\"[^\"]*\"|{([^{}]|{[^}]+?})+?}))*\\s*(\\/?)\\s*>'\n)\n\n\nclass TokenizerPatterns(BaseTokenizerPatterns):\n    def __init__(self, input_scanner, acorn, options):\n        BaseTokenizerPatterns.__init__(self, input_scanner)\n\n        # This is not pretty, but given how we did the version import\n        # it is the only way to do this without having setup.py fail on a missing\n        # six dependency.\n        six = __import__(\"six\")\n\n        # IMPORTANT: This string must be run through six to handle \\u chars\n        self.whitespace = self.whitespace.matching(\n            six.u(r\"\\u00A0\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff\"),\n            six.u(r\"\\u2028\\u2029\"),\n        )\n\n        pattern = Pattern(input_scanner)\n        templatable = TemplatablePattern(input_scanner).read_options(options)\n\n        self.identifier = templatable.starting_with(acorn.identifier).matching(\n            acorn.identifierMatch\n        )\n        self.number = pattern.matching(number_pattern)\n        self.punct = pattern.matching(punct_pattern)\n        self.comment = pattern.starting_with(r\"//\").until(six.u(r\"[\\n\\r\\u2028\\u2029]\"))\n        self.block_comment = pattern.starting_with(r\"/\\*\").until_after(r\"\\*/\")\n        self.html_comment_start = pattern.matching(r\"<!--\")\n        self.html_comment_end = pattern.matching(r\"-->\")\n        self.include = pattern.starting_with(r\"#include\").until_after(acorn.lineBreak)\n        self.shebang = pattern.starting_with(r\"#!\").until_after(acorn.lineBreak)\n\n        self.xml = pattern.matching(xmlRegExp)\n\n        self.single_quote = templatable.until(six.u(r\"['\\\\\\n\\r\\u2028\\u2029]\"))\n        self.double_quote = templatable.until(six.u(r'[\"\\\\\\n\\r\\u2028\\u2029]'))\n        self.template_text = templatable.until(r\"[`\\\\$]\")\n        self.template_expression = templatable.until(r\"[`}\\\\]\")\n\n\nclass Tokenizer(BaseTokenizer):\n    positionable_operators = positionable_operators\n    line_starters = line_starters\n\n    def __init__(self, input_string, opts):\n        BaseTokenizer.__init__(self, input_string, opts)\n\n        import jsbeautifier.javascript.acorn as acorn\n\n        self.acorn = acorn\n\n        self.in_html_comment = False\n        self.has_char_escapes = False\n\n        self._patterns = TokenizerPatterns(self._input, self.acorn, opts)\n\n    def _reset(self):\n        self.in_html_comment = False\n\n    def _is_comment(self, current_token):\n        return (\n            current_token.type == TOKEN.COMMENT\n            or current_token.type == TOKEN.BLOCK_COMMENT\n            or current_token.type == TOKEN.UNKNOWN\n        )\n\n    def _is_opening(self, current_token):\n        return (\n            current_token.type == TOKEN.START_BLOCK\n            or current_token.type == TOKEN.START_EXPR\n        )\n\n    def _is_closing(self, current_token, open_token):\n        return (\n            current_token.type == TOKEN.END_BLOCK\n            or current_token.type == TOKEN.END_EXPR\n        ) and (\n            open_token is not None\n            and (\n                (current_token.text == \"]\" and open_token.text == \"[\")\n                or (current_token.text == \")\" and open_token.text == \"(\")\n                or (current_token.text == \"}\" and open_token.text == \"{\")\n            )\n        )\n\n    def _get_next_token(self, previous_token, open_token):\n        token = None\n        self._readWhitespace()\n\n        c = self._input.peek()\n        if c is None:\n            token = self._create_token(TOKEN.EOF, \"\")\n\n        token = token or self._read_non_javascript(c)\n        token = token or self._read_string(c)\n        token = token or self._read_pair(\n            c, self._input.peek(1)\n        )  # Issue #2062 hack for record type '#{'\n        token = token or self._read_word(previous_token)\n        token = token or self._read_singles(c)\n        token = token or self._read_comment(c)\n        token = token or self._read_regexp(c, previous_token)\n        token = token or self._read_xml(c, previous_token)\n        token = token or self._read_punctuation()\n        token = token or self._create_token(TOKEN.UNKNOWN, self._input.next())\n\n        return token\n\n    def _read_singles(self, c):\n        token = None\n\n        if c == \"(\" or c == \"[\":\n            token = self._create_token(TOKEN.START_EXPR, c)\n        elif c == \")\" or c == \"]\":\n            token = self._create_token(TOKEN.END_EXPR, c)\n        elif c == \"{\":\n            token = self._create_token(TOKEN.START_BLOCK, c)\n        elif c == \"}\":\n            token = self._create_token(TOKEN.END_BLOCK, c)\n        elif c == \";\":\n            token = self._create_token(TOKEN.SEMICOLON, c)\n        elif (\n            c == \".\"\n            and self._input.peek(1) is not None\n            and bool(dot_pattern.match(self._input.peek(1)))\n        ):\n            token = self._create_token(TOKEN.DOT, c)\n        elif c == \",\":\n            token = self._create_token(TOKEN.COMMA, c)\n\n        if token is not None:\n            self._input.next()\n\n        return token\n\n    def _read_pair(self, c, d):\n        token = None\n\n        if c == \"#\" and d == \"{\":\n            token = self._create_token(TOKEN.START_BLOCK, c + d)\n\n        if token is not None:\n            self._input.next()\n            self._input.next()\n\n        return token\n\n    def _read_word(self, previous_token):\n        resulting_string = self._patterns.identifier.read()\n\n        if bool(resulting_string):\n            resulting_string = re.sub(self.acorn.allLineBreaks, \"\\n\", resulting_string)\n            if not (\n                previous_token.type == TOKEN.DOT\n                or (\n                    previous_token.type == TOKEN.RESERVED\n                    and (previous_token.text == \"set\" or previous_token.text == \"get\")\n                )\n            ) and reserved_word_pattern.match(resulting_string):\n                if (resulting_string == \"in\" or resulting_string == \"of\") and (\n                    previous_token.type == TOKEN.WORD\n                    or previous_token.type == TOKEN.STRING\n                ):\n                    # in and of are operators, need to hack\n                    return self._create_token(TOKEN.OPERATOR, resulting_string)\n\n                return self._create_token(TOKEN.RESERVED, resulting_string)\n\n            return self._create_token(TOKEN.WORD, resulting_string)\n\n        resulting_string = self._patterns.number.read()\n        if resulting_string != \"\":\n            return self._create_token(TOKEN.WORD, resulting_string)\n\n    def _read_comment(self, c):\n        token = None\n        if c == \"/\":\n            comment = \"\"\n            if self._input.peek(1) == \"*\":  # peek /* .. */ comment\n                comment = self._patterns.block_comment.read()\n\n                directives = directives_core.get_directives(comment)\n                if directives and directives.get(\"ignore\") == \"start\":\n                    comment += directives_core.readIgnored(self._input)\n                comment = re.sub(self.acorn.allLineBreaks, \"\\n\", comment)\n                token = self._create_token(TOKEN.BLOCK_COMMENT, comment)\n                token.directives = directives\n\n            elif self._input.peek(1) == \"/\":  # peek // comment\n                comment = self._patterns.comment.read()\n                token = self._create_token(TOKEN.COMMENT, comment)\n\n        return token\n\n    def _read_string(self, c):\n        if c == \"`\" or c == \"'\" or c == '\"':\n            resulting_string = self._input.next()\n            self.has_char_escapes = False\n\n            if c == \"`\":\n                resulting_string += self.parse_string(\"`\", True, \"${\")\n            else:\n                resulting_string += self.parse_string(c)\n\n            if self.has_char_escapes and self._options.unescape_strings:\n                resulting_string = self.unescape_string(resulting_string)\n\n            if self._input.peek() == c:\n                resulting_string += self._input.next()\n\n            resulting_string = re.sub(self.acorn.allLineBreaks, \"\\n\", resulting_string)\n\n            return self._create_token(TOKEN.STRING, resulting_string)\n\n        return None\n\n    def _read_regexp(self, c, previous_token):\n        if c == \"/\" and self.allowRegExOrXML(previous_token):\n            # handle regexp\n            resulting_string = self._input.next()\n            esc = False\n\n            in_char_class = False\n            while (\n                self._input.hasNext()\n                and (esc or in_char_class or self._input.peek() != c)\n                and not self._input.testChar(self.acorn.newline)\n            ):\n                resulting_string += self._input.peek()\n                if not esc:\n                    esc = self._input.peek() == \"\\\\\"\n                    if self._input.peek() == \"[\":\n                        in_char_class = True\n                    elif self._input.peek() == \"]\":\n                        in_char_class = False\n                else:\n                    esc = False\n                self._input.next()\n\n            if self._input.peek() == c:\n                resulting_string += self._input.next()\n\n                if c == \"/\":\n                    # regexps may have modifiers /regexp/MOD, so fetch those too\n                    # Only [gim] are valid, but if the user puts in garbage, do\n                    # what we can to take it.\n                    resulting_string += self._input.read(self.acorn.identifier)\n\n            return self._create_token(TOKEN.STRING, resulting_string)\n\n        return None\n\n    def _read_xml(self, c, previous_token):\n        if self._options.e4x and c == \"<\" and self.allowRegExOrXML(previous_token):\n            # handle e4x xml literals\n            xmlStr = \"\"\n            match = self._patterns.xml.read_match()\n            if match and not match.group(1):\n                rootTag = match.group(2)\n                rootTag = re.sub(r\"^{\\s+\", \"{\", re.sub(r\"\\s+}$\", \"}\", rootTag))\n                isCurlyRoot = rootTag.startswith(\"{\")\n                depth = 0\n                while bool(match):\n                    isEndTag = match.group(1)\n                    tagName = match.group(2)\n                    isSingletonTag = (match.groups()[-1] != \"\") or (\n                        match.group(2)[0:8] == \"![CDATA[\"\n                    )\n                    if not isSingletonTag and (\n                        tagName == rootTag\n                        or (\n                            isCurlyRoot\n                            and re.sub(r\"^{\\s+\", \"{\", re.sub(r\"\\s+}$\", \"}\", tagName))\n                        )\n                    ):\n                        if isEndTag:\n                            depth -= 1\n                        else:\n                            depth += 1\n\n                    xmlStr += match.group(0)\n                    if depth <= 0:\n                        break\n\n                    match = self._patterns.xml.read_match()\n\n                # if we didn't close correctly, keep unformatted.\n                if not match:\n                    xmlStr += self._input.match(re.compile(r\"[\\s\\S]*\")).group(0)\n\n                xmlStr = re.sub(self.acorn.allLineBreaks, \"\\n\", xmlStr)\n                return self._create_token(TOKEN.STRING, xmlStr)\n\n        return None\n\n    def _read_non_javascript(self, c):\n        resulting_string = \"\"\n\n        if c == \"#\":\n            # she-bang\n            if self._is_first_token():\n                resulting_string = self._patterns.shebang.read()\n                if resulting_string:\n                    return self._create_token(\n                        TOKEN.UNKNOWN, resulting_string.strip() + \"\\n\"\n                    )\n\n            # handles extendscript #includes\n            resulting_string = self._patterns.include.read()\n\n            if resulting_string:\n                return self._create_token(\n                    TOKEN.UNKNOWN, resulting_string.strip() + \"\\n\"\n                )\n\n            c = self._input.next()\n\n            # Spidermonkey-specific sharp variables for circular references\n            # https://developer.mozilla.org/En/Sharp_variables_in_JavaScript\n            # http://mxr.mozilla.org/mozilla-central/source/js/src/jsscan.cpp\n            # around line 1935\n            sharp = \"#\"\n            if self._input.hasNext() and self._input.testChar(digit):\n                while True:\n                    c = self._input.next()\n                    sharp += c\n                    if (not self._input.hasNext()) or c == \"#\" or c == \"=\":\n                        break\n                if c == \"#\":\n                    pass\n                elif self._input.peek() == \"[\" and self._input.peek(1) == \"]\":\n                    sharp += \"[]\"\n                    self._input.next()\n                    self._input.next()\n                elif self._input.peek() == \"{\" and self._input.peek(1) == \"}\":\n                    sharp += \"{}\"\n                    self._input.next()\n                    self._input.next()\n\n                return self._create_token(TOKEN.WORD, sharp)\n\n            self._input.back()\n\n        elif c == \"<\" and self._is_first_token():\n            if self._patterns.html_comment_start.read():\n                c = \"<!--\"\n                while self._input.hasNext() and not self._input.testChar(\n                    self.acorn.newline\n                ):\n                    c += self._input.next()\n\n                self.in_html_comment = True\n                return self._create_token(TOKEN.COMMENT, c)\n\n        elif (\n            c == \"-\" and self.in_html_comment and self._patterns.html_comment_end.read()\n        ):\n            self.in_html_comment = False\n            return self._create_token(TOKEN.COMMENT, \"-->\")\n\n        return None\n\n    def _read_punctuation(self):\n        token = None\n        resulting_string = self._patterns.punct.read()\n        if resulting_string != \"\":\n            if resulting_string == \"=\":\n                token = self._create_token(TOKEN.EQUALS, resulting_string)\n            elif resulting_string == \"?.\":\n                token = self._create_token(TOKEN.DOT, resulting_string)\n            else:\n                token = self._create_token(TOKEN.OPERATOR, resulting_string)\n\n        return token\n\n    __regexTokens = {\n        TOKEN.COMMENT,\n        TOKEN.START_EXPR,\n        TOKEN.START_BLOCK,\n        TOKEN.START,\n        TOKEN.END_BLOCK,\n        TOKEN.OPERATOR,\n        TOKEN.EQUALS,\n        TOKEN.EOF,\n        TOKEN.SEMICOLON,\n        TOKEN.COMMA,\n    }\n\n    def allowRegExOrXML(self, previous_token):\n        return (\n            (\n                previous_token.type == TOKEN.RESERVED\n                and previous_token.text\n                in {\"return\", \"case\", \"throw\", \"else\", \"do\", \"typeof\", \"yield\"}\n            )\n            or (\n                previous_token.type == TOKEN.END_EXPR\n                and previous_token.text == \")\"\n                and previous_token.opened != None\n                and previous_token.opened.previous.type == TOKEN.RESERVED\n                and previous_token.opened.previous.text in {\"if\", \"while\", \"for\"}\n            )\n            or (previous_token.type in self.__regexTokens)\n        )\n\n    def parse_string(self, delimiter, allow_unescaped_newlines=False, start_sub=None):\n        if delimiter == \"'\":\n            pattern = self._patterns.single_quote\n        elif delimiter == '\"':\n            pattern = self._patterns.double_quote\n        elif delimiter == \"`\":\n            pattern = self._patterns.template_text\n        elif delimiter == \"}\":\n            pattern = self._patterns.template_expression\n        resulting_string = pattern.read()\n        next = \"\"\n        while self._input.hasNext():\n            next = self._input.next()\n            if next == delimiter or (\n                not allow_unescaped_newlines and self.acorn.newline.match(next)\n            ):\n                self._input.back()\n                break\n            elif next == \"\\\\\" and self._input.hasNext():\n                current_char = self._input.peek()\n                if current_char == \"x\" or current_char == \"u\":\n                    self.has_char_escapes = True\n                elif current_char == \"\\r\" and self._input.peek(1) == \"\\n\":\n                    self._input.next()\n\n                next += self._input.next()\n            elif start_sub is not None:\n                if start_sub == \"${\" and next == \"$\" and self._input.peek() == \"{\":\n                    next += self._input.next()\n\n                if start_sub == next:\n                    if delimiter == \"`\":\n                        next += self.parse_string(\"}\", allow_unescaped_newlines, \"`\")\n                    else:\n                        next += self.parse_string(\"`\", allow_unescaped_newlines, \"${\")\n\n                    if self._input.hasNext():\n                        next += self._input.next()\n\n            next += pattern.read()\n            resulting_string += next\n        return resulting_string\n\n    def unescape_string(self, s):\n        # You think that a regex would work for this\n        # return s.replace(/\\\\x([0-9a-f]{2})/gi, function(match, val) {\n        #         return String.fromCharCode(parseInt(val, 16));\n        #     })\n        # However, dealing with '\\xff', '\\\\xff', '\\\\\\xff' makes this more fun.\n        out = self.acorn.six.u(\"\")\n        escaped = 0\n\n        input_scan = InputScanner(s)\n        matched = None\n\n        while input_scan.hasNext():\n            # Keep any whitespace, non-slash characters\n            # also keep slash pairs.\n            matched = input_scan.match(re.compile(r\"([\\s]|[^\\\\]|\\\\\\\\)+\"))\n\n            if matched:\n                out += matched.group(0)\n\n            if input_scan.peek() != \"\\\\\":\n                continue\n\n            input_scan.next()\n            if input_scan.peek() == \"x\":\n                matched = input_scan.match(re.compile(r\"x([0-9A-Fa-f]{2})\"))\n            elif input_scan.peek() == \"u\":\n                matched = input_scan.match(re.compile(r\"u([0-9A-Fa-f]{4})\"))\n                if not matched:\n                    matched = input_scan.match(re.compile(r\"u\\{([0-9A-Fa-f]+)\\}\"))\n            else:\n                out += \"\\\\\"\n                if input_scan.hasNext():\n                    out += input_scan.next()\n                continue\n\n            # If there's some error decoding, return the original string\n            if not matched:\n                return s\n\n            escaped = int(matched.group(1), 16)\n\n            if escaped > 0x7E and escaped <= 0xFF and matched.group(0).startswith(\"x\"):\n                # we bail out on \\x7f..\\xff,\n                # leaving whole string escaped,\n                # as it's probably completely binary\n                return s\n            elif escaped >= 0x00 and escaped < 0x20:\n                # leave 0x00...0x1f escaped\n                out += \"\\\\\" + matched.group(0)\n            elif escaped > 0x10FFFF:\n                # If the escape sequence is out of bounds, keep the original sequence and continue conversion\n                out += \"\\\\\" + matched.group(0)\n            elif escaped == 0x22 or escaped == 0x27 or escaped == 0x5C:\n                # single-quote, apostrophe, backslash - escape these\n                out += \"\\\\\" + chr(escaped)\n            else:\n                out += self.acorn.six.unichr(escaped)\n\n        return out\n"
  },
  {
    "path": "python/jsbeautifier/tests/__init__.py",
    "content": "# Empty file :)\n"
  },
  {
    "path": "python/jsbeautifier/tests/core/__init__.py",
    "content": "# Empty file :)\n"
  },
  {
    "path": "python/jsbeautifier/tests/core/test_inputscanner.py",
    "content": "import re\nimport unittest\nfrom ...core.inputscanner import InputScanner\n\n\nclass TestInputScanner(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        pass\n\n    def setUp(self):\n        self.value = \"howdy\"\n        self.inputscanner = InputScanner(self.value)\n\n    def test_new(self):\n        inputscanner = InputScanner(None)\n        self.assertEqual(inputscanner.hasNext(), False)\n\n    def test_next(self):\n        self.assertEqual(self.inputscanner.next(), self.value[0])\n        self.assertEqual(self.inputscanner.next(), self.value[1])\n\n        # should return None if index is at then end of the value\n        pattern = re.compile(r\"howdy\")\n        self.inputscanner.readUntilAfter(pattern)\n        self.assertEqual(self.inputscanner.next(), None)\n\n    def test_peek(self):\n        self.assertEqual(self.inputscanner.peek(3), self.value[3])\n        self.inputscanner.next()\n        self.assertEqual(self.inputscanner.peek(3), self.value[4])\n\n        # should return None if index is less than 0 or greater than text length\n        self.assertEqual(self.inputscanner.peek(-2), None)\n        self.assertEqual(self.inputscanner.peek(5), None)\n\n    def test_no_param(self):\n        self.assertEqual(self.inputscanner.peek(), self.value[0])\n        self.inputscanner.next()\n        self.assertEqual(self.inputscanner.peek(), self.value[1])\n\n    def test_pattern(self):\n        pattern = re.compile(r\"how\")\n        index = 0\n        self.assertEqual(self.inputscanner.test(pattern, index), True)\n        self.inputscanner.next()\n        self.assertEqual(self.inputscanner.test(pattern, index), False)\n\n    def test_Char(self):\n        pattern = re.compile(r\"o\")\n        index = 1\n        self.assertEqual(self.inputscanner.testChar(pattern, index), True)\n\n    def test_restart(self):\n        # should reset index to 0\n        self.inputscanner.next()\n        self.assertEqual(self.inputscanner.peek(), self.value[1])\n        self.inputscanner.restart()\n        self.assertEqual(self.inputscanner.peek(), self.value[0])\n\n    def test_back(self):\n        # should move the index one place back if current position is not 0\n        self.inputscanner.next()\n        self.assertEqual(self.inputscanner.peek(), self.value[1])\n        self.inputscanner.back()\n        self.assertEqual(self.inputscanner.peek(), self.value[0])\n\n        # should not move the index back if current position is 0\n        self.inputscanner.back()\n        self.assertEqual(self.inputscanner.peek(), self.value[0])\n\n    def test_hasNext(self):\n        # should return true if index is not at the last position\n        pattern = re.compile(r\"howd\")\n        self.inputscanner.readUntilAfter(pattern)\n        self.assertEqual(self.inputscanner.hasNext(), True)\n\n        # should return false if index is at the last position\n        self.inputscanner.next()\n        self.assertEqual(self.inputscanner.hasNext(), False)\n\n    def test_match(self):\n        # should return details of pattern match and move index to next position\n        pattern = re.compile(r\"how\")\n        patternmatch = self.inputscanner.match(pattern)\n        self.assertEqual(self.inputscanner.peek(), self.value[3])\n        self.assertNotEqual(patternmatch, None)\n        self.assertEqual(patternmatch.group(0), \"how\")\n\n        self.inputscanner.restart()\n\n        # should return None and not move index if there is no match\n        pattern = re.compile(r\"test\")\n        patternmatch = self.inputscanner.match(pattern)\n        self.assertEqual(self.inputscanner.peek(), self.value[0])\n        self.assertEqual(patternmatch, None)\n\n    def test_read(self):\n        # should return the matched substring\n        pattern = re.compile(r\"how\")\n        patternmatch = self.inputscanner.read(pattern)\n        self.assertEqual(patternmatch, \"how\")\n\n        self.inputscanner.restart()\n\n        # should return the empty string if there is no match\n        pattern = re.compile(r\"ow\")\n        patternmatch = self.inputscanner.read(pattern)\n        self.assertEqual(patternmatch, \"\")\n\n        self.inputscanner.restart()\n\n        # should return substring from start to until pattern when unitilAfter is true\n        startPattern = re.compile(r\"how\")\n        untilPattern = re.compile(r\"dy\")\n        untilAfter = True\n        patternmatch = self.inputscanner.read(startPattern, untilPattern, untilAfter)\n        self.assertEqual(patternmatch, \"howdy\")\n\n        self.inputscanner.restart()\n\n        # should return the substring matched for startPattern when untilPattern is given but unitilAfter is false\n        startPattern = re.compile(r\"how\")\n        untilPattern = re.compile(r\"dy\")\n        untilAfter = False\n        patternmatch = self.inputscanner.read(startPattern, untilPattern, untilAfter)\n        self.assertEqual(patternmatch, \"how\")\n\n        self.inputscanner.restart()\n\n        # should return substring matched for untilPattern when startPattern is None\n        startPattern = None\n        untilPattern = re.compile(r\"how\")\n        untilAfter = True\n        patternmatch = self.inputscanner.read(startPattern, untilPattern, untilAfter)\n\n        self.inputscanner.restart()\n\n        # should return substring matched for untilPattern when startPattern is None and untilAfter is false\n        startPattern = None\n        untilPattern = re.compile(r\"how\")\n        untilAfter = False\n        patternmatch = self.inputscanner.read(startPattern, untilPattern, untilAfter)\n        self.assertEqual(patternmatch, \"\")\n\n    def test_readUntil(self):\n        # should return substring matched for pattern when untilAfter is true\n        pattern = re.compile(r\"how\")\n        untilAfter = True\n        patternmatch = self.inputscanner.readUntil(pattern, untilAfter)\n        self.assertEqual(patternmatch, \"how\")\n\n        self.inputscanner.restart()\n\n        # should return substring from index 0 to start index of matched substring when untilAfter is false\n        pattern = re.compile(r\"wd\")\n        untilAfter = False\n        patternmatch = self.inputscanner.readUntil(pattern, untilAfter)\n        self.assertEqual(patternmatch, \"ho\")\n\n        self.inputscanner.restart()\n\n        # should return empty string when start index of matched substring is 0 and untilAfter is false\n        pattern = re.compile(r\"how\")\n        untilAfter = False\n        patternmatch = self.inputscanner.readUntil(pattern, untilAfter)\n        self.assertEqual(patternmatch, \"\")\n\n    def test_readUntilAfter(self):\n        # should return matched substring\n        pattern = re.compile(r\"how\")\n        patternmatch = self.inputscanner.readUntilAfter(pattern)\n        self.assertEqual(patternmatch, \"how\")\n\n    def test_get_regexp(self):\n        # should return regex pattern for string passed\n        pattern = re.compile(r\"ow\")\n        self.assertEqual(self.inputscanner.get_regexp(\"ow\"), pattern)\n\n    def test_peekUntilAfter(self):\n        # should return matched substring and retain index position\n        pattern = re.compile(r\"how\")\n        self.assertEqual(self.inputscanner.peek(), self.value[0])\n        self.assertEqual(self.inputscanner.peekUntilAfter(pattern), \"how\")\n        self.assertEqual(self.inputscanner.peek(), self.value[0])\n\n    def test_lookBack(self):\n        # should return whether testVal is obtained by shifting index to the left\n        testVal = \"how\"\n        pattern = re.compile(r\"howd\")\n        self.inputscanner.readUntilAfter(pattern)\n        self.assertEqual(self.inputscanner.lookBack(testVal), True)\n        testVal = \"ho\"\n        self.assertEqual(self.inputscanner.lookBack(testVal), False)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "python/jsbeautifier/tests/core/test_options.py",
    "content": "import re\nimport unittest\nfrom ...core.options import _mergeOpts, _normalizeOpts, Options\n\n\nclass TestOptions(unittest.TestCase):\n    @classmethod\n    def setUpClass(cls):\n        pass\n\n    def test_mergeOpts(self):\n        # should convert tuple to dict and merge child with parent\n        result = _mergeOpts(((\"a\", 1), (\"b\", {\"a\": 2})), \"b\")\n        self.assertEqual(result.a, 2)\n        self.assertNotIn(\"b\", result)\n        # should merge child option a with the parent options (dict)\n        result = _mergeOpts({\"a\": 1, \"b\": {\"a\": 2}}, \"b\")\n        self.assertEqual(result.a, 2)\n        self.assertNotIn(\"b\", result)\n        # should include child option c and d with the parent options (dict)\n        result = _mergeOpts({\"a\": 1, \"b\": {\"c\": 2, \"d\": 3}}, \"b\")\n        self.assertEqual(result.a, 1)\n        self.assertEqual(result.c, 2)\n        self.assertEqual(result.d, 3)\n        self.assertNotIn(\"b\", result)\n        # should merge child option a and include c as parent options (dict)\n        result = _mergeOpts({\"a\": 1, \"b\": {\"a\": 2, \"c\": 3}}, \"b\")\n        self.assertEqual(result.a, 2)\n        self.assertEqual(result.c, 3)\n        self.assertNotIn(\"b\", result)\n        # should merge Options instance with child dict key\n        instance = Options()\n        instance.a = {\"disabled\": True}\n        result = _mergeOpts(instance, \"a\")\n        self.assertEqual(result.disabled, True)\n        self.assertNotIn(\"a\", list(getattr(result, \"__dict__\", {})))\n\n    def test_normalizeOpts(self):\n        # should replace key with - to _ in dict\n        result = _normalizeOpts({\"a-b\": 1})\n        self.assertEqual(result[\"a_b\"], 1)\n        self.assertNotIn(\"a-b\", result)\n        # should replace key with - to _ in Options instance\n        instance = Options()\n        setattr(instance, \"a-b\", 1)\n        result = _normalizeOpts(instance)\n        self.assertEqual(result.a_b, 1)\n        self.assertNotIn(\"a-b\", list(getattr(result, \"__dict__\", {})))\n        # should do nothing\n        result = _normalizeOpts({\"a_b\": 1})\n        self.assertEqual(result[\"a_b\"], 1)\n\n    def test__get_boolean(self):\n        # should return default value since no option\n        self.assertEqual(Options()._get_boolean(\"a\"), False)\n        # should return true as default since no option\n        self.assertEqual(Options()._get_boolean(\"a\", True), True)\n        # should return false as in option\n        self.assertEqual(Options({\"a\": False})._get_boolean(\"a\", True), False)\n\n    def test__get_characters(self):\n        # should return default value since no option\n        self.assertEqual(Options()._get_characters(\"a\"), \"\")\n        # should return \\'character\\' as default since no option\n        self.assertEqual(Options()._get_characters(\"a\", \"character\"), \"character\")\n        # should return \\'char\\' as in option\n        self.assertEqual(\n            Options({\"a\": \"char\"})._get_characters(\"a\", \"character\"), \"char\"\n        )\n\n    def test__get_number(self):\n        # should return default value since no option\n        self.assertEqual(Options()._get_number(\"a\"), 0)\n        # should return 1 as default since no option\n        self.assertEqual(Options()._get_number(\"a\", 1), 1)\n        # should return 10 as in option\n        self.assertEqual(Options({\"a\": 10})._get_number(\"a\", 1), 10)\n        # should return 0 for NaN as in option\n        self.assertEqual(Options({\"a\": \"abc\"})._get_number(\"a\"), 0)\n        # should return 0 for NaN as in default\n        self.assertEqual(Options()._get_number(\"a\", \"abc\"), 0)\n\n    def test__get_array(self):\n        # should return [] with no option\n        self.assertEqual(Options()._get_array(\"a\"), [])\n        # should return [\\'a\\',\\'b\\'] as default since no option\n        self.assertEqual(Options()._get_array(\"a\", [\"a\", \"b\"]), [\"a\", \"b\"])\n        # should return [\\'c\\',\\'d\\'] as in option\n        self.assertEqual(\n            Options({\"a\": [\"c\", \"d\"]})._get_array(\"a\", [\"a\", \"b\"]), [\"c\", \"d\"]\n        )\n        # should return [\\'c\\',\\'d\\'] as in option comma separated\n        self.assertEqual(Options({\"a\": \"c,d\"})._get_array(\"a\", [\"a\", \"b\"]), [\"c\", \"d\"])\n\n    def test__is_valid_selection(self):\n        # should return false with empty selection\n        self.assertEqual(Options()._is_valid_selection([\"a\", \"b\"], []), False)\n        # should return false with selection inexistent\n        self.assertEqual(Options()._is_valid_selection([\"a\", \"b\"], [\"c\"]), False)\n        # should return true with selection existent\n        self.assertEqual(Options()._is_valid_selection([\"a\", \"b\"], [\"a\", \"b\"]), True)\n\n    def test__get_selection_list(self):\n        # should raise error with empty selection\n        with self.assertRaisesRegex(ValueError, \"Selection list cannot\" + \" be empty.\"):\n            Options()._get_selection_list(\"a\", [])\n        # should raise error with invalid default\n        with self.assertRaisesRegex(ValueError, \"Invalid Default Value!\"):\n            Options()._get_selection_list(\"a\", [\"a\", \"b\"], [\"c\"])\n        # should raise error with invalid option\n        with self.assertRaisesRegex(\n            ValueError, \"^Invalid Option Value:\" + \" The option\"\n        ):\n            Options({\"a\": [\"c\", \"d\"]})._get_selection_list(\"a\", [\"a\", \"b\"], [\"a\", \"b\"])\n        # should return [\\'c\\'] as in option\n        opts = Options({\"c\": [\"c\"]})\n        self.assertEqual(opts._get_selection_list(\"c\", [\"c\", \"d\"], [\"c\"]), [\"c\"])\n\n    def test__get_selection(self):\n        # should raise error with multiple selection\n        with self.assertRaisesRegex(\n            ValueError, \"^Invalid Option\" + \" Value: The option\"\n        ):\n            Options({\"a\": [\"a\", \"b\"]})._get_selection(\"a\", [\"a\", \"b\"], [\"a\"])\n        # should return [\\'a\\'] as in option\n        options = Options({\"a\": [\"a\"]})\n        self.assertEqual(options._get_selection(\"a\", [\"a\", \"b\"], [\"a\"]), \"a\")\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "python/jsbeautifier/tests/shell-test.sh",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\nPROJECT_DIR=\"`( cd \\\"$SCRIPT_DIR/../../..\\\" && pwd )`\"\n\ncase \"$OSTYPE\" in\n    darwin*) PLATFORM=\"OSX\" ;;\n    linux*)  PLATFORM=\"LINUX\" ;;\n    bsd*)    PLATFORM=\"BSD\" ;;\n    *)       PLATFORM=\"UNKNOWN\" ;;\nesac\n\n\ntest_cli_common()\n{\n    echo ----------------------------------------\n    echo Testing common cli behavior...\n    CLI_SCRIPT_NAME=${1:?missing_param}\n    CLI_SCRIPT=${2:-$SCRIPT_DIR/../../$CLI_SCRIPT_NAME}\n    echo Script: $CLI_SCRIPT\n\n    # should find the minimal help output\n    $CLI_SCRIPT 2>&1 < /dev/null | grep -q \"Must pipe input or define at least one file\\.\" || {\n        $CLI_SCRIPT 2>&1 < /dev/null\n        echo \"[$CLI_SCRIPT_NAME] Output should be help message.\"\n        exit 1\n    }\n\n    # unicode error - only happens in python\n    # Note: different exceptions are thrown on different platforms.\n    if [[ \"$PLATFORM\" == \"OSX\" || \"$PLATFORM\" == \"BSD\" || \"$PLATFORM\" == \"LINUX\" ]]; then\n        $CLI_SCRIPT ../test/resources/unicode-error.js 2>&1 | grep -q \"Error while decoding input or encoding output:\" || {\n            $CLI_SCRIPT ../test/resources/unicode-error.js 2>&1\n            echo \"[$CLI_SCRIPT_NAME] Output should be unicode error message.\"\n            exit 1\n        }\n    fi\n\n    $CLI_SCRIPT 2> /dev/null < /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME (with no parameters)] Return code should be error.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT -Z 2> /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME -Z] Return code for invalid parameter should be error.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT -h > /dev/null || {\n        echo \"[$CLI_SCRIPT_NAME -h] Return code should be success.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT -v > /dev/null || {\n        echo \"[$CLI_SCRIPT_NAME -v] Return code should be success.\"\n        exit 1\n    }\n\n    MISSING_FILE=\"$SCRIPT_DIR/../../../js/bin/missing_file\"\n    MISSING_FILE_MESSAGE=\"No such file or directory\"\n    $CLI_SCRIPT $MISSING_FILE 2> /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE] Return code should be error.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT $MISSING_FILE 2>&1 | grep -q \"$MISSING_FILE_MESSAGE\" || {\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE] Stderr should have useful message.\"\n        exit 1\n    }\n\n    if [ \"`$CLI_SCRIPT $MISSING_FILE 2> /dev/null`\" != \"\" ]; then\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE] Stdout should have no text.\"\n        exit 1\n    fi\n}\n\nsetup_temp()\n{\n    mkdir -p target\n    TEST_TEMP=$PWD/`mktemp -d target/test_temp_XXXX`\n    echo Created $TEST_TEMP...\n}\n\ncleanup()\n{\n    rm -rf $TEST_TEMP && echo Removed $TEST_TEMP...\n    test -z $1 || exit $1\n}\n\ntest_cli_js_beautify()\n{\n    echo ----------------------------------------\n    echo Testing js-beautify cli behavior...\n    CLI_SCRIPT=${1:-$SCRIPT_DIR/../../js-beautify}\n\n    $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/js-beautify.js > /dev/null || {\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js was expected succeed.\"\n        exit 1\n    }\n\n    $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/css-beautify.js > /dev/null || {\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/css-beautify.js was expected succeed.\"\n        exit 1\n    }\n\n    setup_temp\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-file.js $SCRIPT_DIR/../../../js/bin/js-beautify.js && diff $SCRIPT_DIR/../../../js/bin/js-beautify.js $TEST_TEMP/js-beautify-file.js || {\n        $CLI_SCRIPT -o $TEST_TEMP/js-beautify-file.js $SCRIPT_DIR/../../../js/bin/js-beautify.js && diff $SCRIPT_DIR/../../../js/bin/js-beautify.js $TEST_TEMP/js-beautify-file.js | cat -t -e\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    cat $SCRIPT_DIR/../../../js/bin/js-beautify.js | $CLI_SCRIPT -o $TEST_TEMP/js-beautify-pipe.js - && diff $SCRIPT_DIR/../../../js/bin/js-beautify.js $TEST_TEMP/js-beautify-pipe.js || {\n        cat $SCRIPT_DIR/../../../js/bin/js-beautify.js | $CLI_SCRIPT -o $TEST_TEMP/js-beautify-pipe.js - && diff $SCRIPT_DIR/../../../js/bin/js-beautify.js $TEST_TEMP/js-beautify-pipe.js | cat -t -e\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js should have been created in $TEST_TEMP/js-beautify-pipe.js.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/js-beautify.js | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - || {\n        $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/js-beautify.js | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - | cat -t -e\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    cat $SCRIPT_DIR/../../../js/bin/js-beautify.js | $CLI_SCRIPT | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - || {\n        $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/js-beautify.js | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - | cat -t -e\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    cat $SCRIPT_DIR/../../../js/bin/js-beautify.js | $CLI_SCRIPT - | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - || {\n        $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/js-beautify.js | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - | cat -t -e\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    cat $SCRIPT_DIR/../../../js/bin/js-beautify.js | $CLI_SCRIPT -f - | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - || {\n        $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/js-beautify.js | diff $SCRIPT_DIR/../../../js/bin/js-beautify.js - | cat -t -e\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $SCRIPT_DIR/../../../js/bin/js-beautify.js && diff $SCRIPT_DIR/../../../js/bin/js-beautify.js $TEST_TEMP/js-beautify.js || {\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $SCRIPT_DIR/../../../js/bin/js-beautify.js && diff $SCRIPT_DIR/../../../js/bin/js-beautify.js $TEST_TEMP/js-beautify.js | cat -t -e\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/js-beautify.js should have been created in $TEST_TEMP/js-beautify.js.\"\n        cleanup 1\n    }\n\n\n    # ensure new line settings work\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-n.js -e '\\n' $SCRIPT_DIR/../../../js/bin/js-beautify.js\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-rn.js -e '\\r\\n' $TEST_TEMP/js-beautify-n.js\n\n    # regression check #1925, short option failed due to string search instead of tuple\n    # before fix -n would match inside \"--space-after**-n**amed-function\"\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-eof.js -n -f $TEST_TEMP/js-beautify-n.js\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-eof2.js --end-with-newline -f $TEST_TEMP/js-beautify-n.js\n    diff -q $TEST_TEMP/js-beautify-eof.js $TEST_TEMP/js-beautify-eof2.js || {\n        diff $TEST_TEMP/js-beautify-eof.js $TEST_TEMP/js-beautify-eof2.js | cat -t -e\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-eof.js and $TEST_TEMP/js-beautify-eof2.js was expected to be the same.\"\n        cleanup 1\n    }\n\n    # ensure eol processed correctly\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-n-dash.js --indent-size 2 --eol '\\n' $TEST_TEMP/js-beautify-n.js\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify-rn-dash.js --indent-size 2 --eol '\\r\\n' $TEST_TEMP/js-beautify-n.js\n    diff -q $TEST_TEMP/js-beautify-n-dash.js $TEST_TEMP/js-beautify-rn-dash.js && {\n        diff $TEST_TEMP/js-beautify-n-dash.js $TEST_TEMP/js-beautify-rn-dash.js | cat -t -e\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-n-dash.js and $TEST_TEMP/js-beautify-rn-dash.js was expected to be different.\"\n        cleanup 1\n    }\n\n    diff -q $TEST_TEMP/js-beautify-n.js $TEST_TEMP/js-beautify-rn.js && {\n        diff $TEST_TEMP/js-beautify-n.js $TEST_TEMP/js-beautify-rn.js | cat -t -e\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-n.js and $TEST_TEMP/js-beautify-rn.js was expected to be different.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT $TEST_TEMP/js-beautify-n.js | diff -q $TEST_TEMP/js-beautify-n.js - || {\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-n.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -e 'auto' $TEST_TEMP/js-beautify-rn.js | diff -q $TEST_TEMP/js-beautify-rn.js - || {\n        echo \"js-beautify output for $TEST_TEMP/js-beautify-rn.js was expected to be unchanged.\"\n        cleanup 1\n    }\n\n    # Glob related tests\n    cp -r $PROJECT_DIR/js/src  $TEST_TEMP/\n    FILE_RCOUNT=$(find $PROJECT_DIR/js/src -name 't*.js' | grep -c .)\n    FILE_COUNT=$(ls $PROJECT_DIR/js/src/*.js | grep -c .)\n\n    $CLI_SCRIPT '*/*/missing_file' > /dev/null || {\n        echo \"[$CLI_SCRIPT_NAME $MISSING_FILE_GLOB] Return code should be success for globs.\"\n        exit 1\n    }\n\n\n    if [ \"$FILE_COUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT 'src/*.js' | grep -c .)\" ]; then\n        echo \"js-beautify output for 'src/*.js' was expected have $FILE_COUNT files.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT 'src/*.js')\n        cleanup 1\n    fi\n\n    if [ \"$FILE_COUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/*.js' | grep -c .)\" ]; then\n        echo \"js-beautify output for 'src/*.js' was expected have $FILE_COUNT files.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/*.js')\n        cleanup 1\n    fi\n\n    if [ \"$FILE_COUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/??dex.js' | grep -c .)\" ]; then\n        echo \"js-beautify output for --file 'src/cl?.js' --file 'src/??dex.js' was expected have $FILE_COUNT files.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/??dex.js')\n        cleanup 1\n    fi\n\n    if [ \"1\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/c??.js' 'src/cli.js'  | grep -c .)\" ]; then\n        echo \"js-beautify output for --file 'src/cl?.js' --file 'src/cl?.js' was expected have 1 file.\"\n        echo $(cd $TEST_TEMP && $CLI_SCRIPT --file 'src/cl?.js' --file 'src/c??.js' 'src/cli.js')\n        cleanup 1\n    fi\n\n    # recursive wildcard not supported in python 3.4 or less\n    # only run this test if the script doesn't report failure.\n    $CLI_SCRIPT 'src/**/t*.js' && {\n        if [ \"$FILE_RCOUNT\" != \"$(cd $TEST_TEMP && $CLI_SCRIPT 'src/**/t*.js' | grep -c .)\" ]; then\n            echo \"js-beautify output for 'src/**/t*.js' was expected have $FILE_RCOUNT files.\"\n            echo $(cd $TEST_TEMP && $CLI_SCRIPT 'src/**/t*.js')\n            cleanup 1\n        fi\n    }\n\n    # EditorConfig related tests\n    cp -r ../js/test/resources/editorconfig $TEST_TEMP/\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/example-ec.js --indent-size 2 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/cr/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/cr/example-ec.js --indent-size 2 -e '\\r' $TEST_TEMP/editorconfig/example-base.js\n\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/crlf/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/crlf/example-ec.js --indent-size 2 -e '\\r\\n' $TEST_TEMP/editorconfig/example-base.js\n\n    $CLI_SCRIPT -o $TEST_TEMP/editorconfig/error/example.js --end-with-newline --indent-size 4 -e '\\n' $TEST_TEMP/editorconfig/example-base.js\n\n    pushd $TEST_TEMP/editorconfig\n\n    cd $TEST_TEMP/editorconfig/error\n    $CLI_SCRIPT --editorconfig $TEST_TEMP/js-beautify-n.js \\\n    > /dev/null || {\n        echo \"Invalid editorconfig file should not report error (consistent with the EditorConfig).\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT --editorconfig example.js \\\n    > /dev/null || {\n        echo \"Invalid editorconfig file should not report error (consistent with the EditorConfig).\"\n        cleanup 1\n    }\n\n    # TODO: EditorConfig setting should NOT overide cli setting, but that is\n    # the current by-design behavior, due to code limitations.\n\n    # file input scenario\n    SCENARIO=a\n    cd $TEST_TEMP/editorconfig || exit 1\n    $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js example.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/crlf || exit 1\n    $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js example.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/cr || exit 1\n    $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js example.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    # stdin input to stdout scenario\n    SCENARIO=b\n    cd $TEST_TEMP/editorconfig || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/crlf || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/cr || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig > example-${SCENARIO}.js \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n\n    # stdin input to file scenario\n    SCENARIO=c\n    cd $TEST_TEMP/editorconfig || exit 1\n    echo \"cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js\"\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js - \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/crlf || exit 1\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js - \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    cd $TEST_TEMP/editorconfig/cr || exit 1\n    cat example.js | $CLI_SCRIPT --end-with-newline --indent-size 6 --editorconfig -o example-${SCENARIO}.js - \\\n    && diff -q example-${SCENARIO}.js example-ec.js || {\n        echo \"EditorConfig setting should overide cli setting.\"\n        diff example-${SCENARIO}.js example-ec.js | cat -t -e\n        cleanup 1\n    }\n\n    popd\n    # End EditorConfig\n\n    # ensure unchanged files are not overwritten\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $SCRIPT_DIR/../../../js/bin/js-beautify.js\n    cp -p $TEST_TEMP/js-beautify.js $TEST_TEMP/js-beautify-old.js\n    touch $TEST_TEMP/js-beautify.js\n    sleep 2\n    touch $TEST_TEMP/js-beautify-old.js\n    $CLI_SCRIPT -r $TEST_TEMP/js-beautify.js && test $TEST_TEMP/js-beautify.js -nt $TEST_TEMP/js-beautify-old.js && {\n        echo \"js-beautify should not replace unchanged file $TEST_TEMP/js-beautify.js when using -r\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $TEST_TEMP/js-beautify.js && test $TEST_TEMP/js-beautify.js -nt $TEST_TEMP/js-beautify-old.js && {\n        echo \"js-beautify should not replace unchanged file $TEST_TEMP/js-beautify.js when using -o and same file name\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT -o $TEST_TEMP/js-beautify.js $TEST_TEMP/js-beautify-old.js && test $TEST_TEMP/js-beautify.js -nt $TEST_TEMP/js-beautify-old.js && {\n        echo \"js-beautify should not replace unchanged file $TEST_TEMP/js-beautify.js when using -o and different file name\"\n        cleanup 1\n    }\n\n    $CLI_SCRIPT $SCRIPT_DIR/../../../js/bin/css-beautify.js | diff -q $SCRIPT_DIR/../../../js/bin/css-beautify.js - && {\n        echo \"js-beautify output for $SCRIPT_DIR/../../../js/bin/css-beautify.js was expected to be different.\"\n        cleanup 1\n    }\n\n    #meta-parameter brace_style\n    cp ../js/test/resources/example1.js $TEST_TEMP/example.js\n    $CLI_SCRIPT --brace-style=invalid $TEST_TEMP/example.js > /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME --brace-style=invalid $TEST_TEMP/example.js] Return code for invalid brace_style meta-parameter should be error.\"\n        cleanup 1\n    }\n    $CLI_SCRIPT --brace-style='expand,preserve-inline,invalid' $TEST_TEMP/example.js > /dev/null && {\n        echo \"[$CLI_SCRIPT_NAME --brace-style=expand,preserve-inline,invalid $TEST_TEMP/example.js] Return code for invalid brace_style meta-parameter should be error.\"\n        cleanup 1\n    }\n    $CLI_SCRIPT --brace-style=preserve-inline $TEST_TEMP/example.js > /dev/null || {\n        echo \"[$CLI_SCRIPT_NAME --brace-style=preserve-inline $TEST_TEMP/example.js] Return code for only one part of valid brace_style meta-parameter should be success (uses default where it can).\"\n        cleanup 1\n    }\n\n    cleanup\n}\n\nmain() {\n\n    test_cli_common js-beautify \"$SCRIPT_DIR/../../../tools/python-dev css-beautify\"\n    test_cli_common js-beautify \"$SCRIPT_DIR/../../../tools/python-rel css-beautify\"\n\n    test_cli_common js-beautify \"$SCRIPT_DIR/../../../tools/python-dev js-beautify\"\n    test_cli_common js-beautify \"$SCRIPT_DIR/../../../tools/python-rel js-beautify\"\n\n    test_cli_js_beautify \"$SCRIPT_DIR/../../../tools/python-dev js-beautify\"\n\n    echo ----------------------------------------\n    echo $0 - PASSED.\n    echo ----------------------------------------\n}\n\n(main $*)\n"
  },
  {
    "path": "python/jsbeautifier/tests/testindentation.py",
    "content": "import re\nimport unittest\nimport jsbeautifier\n\n\nclass TestJSBeautifierIndentation(unittest.TestCase):\n    def test_tabs(self):\n        test_fragment = self.decodesto\n\n        self.options.indent_with_tabs = 1\n        test_fragment(\"{tabs()}\", \"{\\n\\ttabs()\\n}\")\n\n    def test_function_indent(self):\n        test_fragment = self.decodesto\n\n        self.options.indent_with_tabs = 1\n        self.options.keep_function_indentation = 1\n        test_fragment(\n            \"var foo = function(){ bar() }();\", \"var foo = function() {\\n\\tbar()\\n}();\"\n        )\n\n        self.options.tabs = 1\n        self.options.keep_function_indentation = 0\n        test_fragment(\n            \"var foo = function(){ baz() }();\", \"var foo = function() {\\n\\tbaz()\\n}();\"\n        )\n\n    def decodesto(self, input, expectation=None):\n        self.assertEqual(\n            jsbeautifier.beautify(input, self.options), expectation or input\n        )\n\n    @classmethod\n    def setUpClass(cls):\n        options = jsbeautifier.default_options()\n        options.indent_size = 4\n        options.indent_char = \" \"\n        options.preserve_newlines = True\n        options.jslint_happy = False\n        options.keep_array_indentation = False\n        options.brace_style = \"collapse\"\n        options.indent_level = 0\n\n        cls.options = options\n        cls.wrapregex = re.compile(\"^(.+)$\", re.MULTILINE)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/README.specs.mkd",
    "content": "# UNPACKERS SPECIFICATIONS\n\nNothing very difficult: an unpacker is a submodule placed in the directory\nwhere this file was found. Each unpacker must define three symbols:\n\n * `PRIORITY`       : integer number expressing the priority in applying this\n                      unpacker. Lower number means higher priority.\n                      Makes sense only if a source file has been packed with\n                      more than one packer.\n * `detect(source)` : returns `True` if source is packed, otherwise, `False`.\n * `unpack(source)` : takes a `source` string and unpacks it. Must always return\n                      valid JavaScript. That is to say, your code should look\n                      like:\n\n```\nif detect(source):\n    return do_your_fancy_things_with(source)\nelse:\n    return source\n```\n\n*You can safely define any other symbol in your module, as it will be ignored.*\n\n`__init__` code will automatically load new unpackers, without any further step\nto be accomplished. Simply drop it in this directory.\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/__init__.py",
    "content": "#\n# General code for JSBeautifier unpackers infrastructure. See README.specs\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n\n\"\"\"General code for JSBeautifier unpackers infrastructure.\"\"\"\n\nimport pkgutil\nimport re\nfrom jsbeautifier.unpackers import evalbased\n\n# NOTE: AT THE MOMENT, IT IS DEACTIVATED FOR YOUR SECURITY: it runs js!\nBLACKLIST = [\"jsbeautifier.unpackers.evalbased\"]\n\n\nclass UnpackingError(Exception):\n    \"\"\"Badly packed source or general error. Argument is a\n    meaningful description.\"\"\"\n\n    pass\n\n\ndef getunpackers():\n    \"\"\"Scans the unpackers dir, finds unpackers and add them to UNPACKERS list.\n    An unpacker will be loaded only if it is a valid python module (name must\n    adhere to naming conventions) and it is not blacklisted (i.e. inserted\n    into BLACKLIST.\"\"\"\n    path = __path__\n    prefix = __name__ + \".\"\n    unpackers = []\n    interface = [\"unpack\", \"detect\", \"PRIORITY\"]\n    for _importer, modname, _ispkg in pkgutil.iter_modules(path, prefix):\n        if \"tests\" not in modname and modname not in BLACKLIST:\n            try:\n                module = __import__(modname, fromlist=interface)\n            except ImportError:\n                raise UnpackingError(\"Bad unpacker: %s\" % modname)\n            else:\n                unpackers.append(module)\n\n    return sorted(unpackers, key=lambda mod: mod.PRIORITY)\n\n\nUNPACKERS = getunpackers()\n\n\ndef run(source, evalcode=False):\n    \"\"\"Runs the applicable unpackers and return unpacked source as a string.\"\"\"\n    for unpacker in [mod for mod in UNPACKERS if mod.detect(source)]:\n        source = unpacker.unpack(source)\n    if evalcode and evalbased.detect(source):\n        source = evalbased.unpack(source)\n    return source\n\n\ndef filtercomments(source):\n    \"\"\"NOT USED: strips trailing comments and put them at the top.\"\"\"\n    trailing_comments = []\n    comment = True\n\n    while comment:\n        if re.search(r\"^\\s*\\/\\*\", source):\n            comment = source[0, source.index(\"*/\") + 2]\n        elif re.search(r\"^\\s*\\/\\/\", source):\n            comment = re.search(r\"^\\s*\\/\\/\", source).group(0)\n        else:\n            comment = None\n\n        if comment:\n            source = re.sub(r\"^\\s+\", \"\", source[len(comment) :])\n            trailing_comments.append(comment)\n\n    return \"\\n\".join(trailing_comments) + source\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/evalbased.py",
    "content": "#\n# Unpacker for eval() based packers, a part of javascript beautifier\n# by Einar Lielmanis <einar@beautifier.io>\n#\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n# usage:\n#\n# if detect(some_string):\n#     unpacked = unpack(some_string)\n#\n\n\"\"\"Unpacker for eval() based packers: runs JS code and returns result.\nWorks only if a JS interpreter (e.g. Mozilla's Rhino) is installed and\nproperly set up on host.\"\"\"\n\nfrom subprocess import PIPE, Popen\n\nPRIORITY = 3\n\n\ndef detect(source):\n    \"\"\"Detects if source is likely to be eval() packed.\"\"\"\n    return source.strip().lower().startswith(\"eval(function(\")\n\n\ndef unpack(source):\n    \"\"\"Runs source and return resulting code.\"\"\"\n    return jseval(\"print %s;\" % source[4:]) if detect(source) else source\n\n\n# In case of failure, we'll just return the original, without crashing on user.\n\n\ndef jseval(script):\n    \"\"\"Run code in the JS interpreter and return output.\"\"\"\n    try:\n        interpreter = Popen([\"js\"], stdin=PIPE, stdout=PIPE)\n    except OSError:\n        return script\n    result, errors = interpreter.communicate(script)\n    if interpreter.poll() or errors:\n        return script\n    return result\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/javascriptobfuscator.py",
    "content": "#\n# simple unpacker/deobfuscator for scripts messed up with\n# javascriptobfuscator.com\n#\n#     written by Einar Lielmanis <einar@beautifier.io>\n#     rewritten in Python by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n# Will always return valid javascript: if `detect()` is false, `code` is\n# returned, unmodified.\n#\n# usage:\n#\n# if javascriptobfuscator.detect(some_string):\n#     some_string = javascriptobfuscator.unpack(some_string)\n#\n\n\"\"\"deobfuscator for scripts messed up with JavascriptObfuscator.com\"\"\"\n\nimport re\n\nPRIORITY = 1\n\n\ndef smartsplit(code):\n    \"\"\"Split `code` at \" symbol, only if it is not escaped.\"\"\"\n    strings = []\n    pos = 0\n    while pos < len(code):\n        if code[pos] == '\"':\n            word = \"\"  # new word\n            pos += 1\n            while pos < len(code):\n                if code[pos] == '\"':\n                    break\n                if code[pos] == \"\\\\\":\n                    word += \"\\\\\"\n                    pos += 1\n                word += code[pos]\n                pos += 1\n            strings.append('\"%s\"' % word)\n        pos += 1\n    return strings\n\n\ndef detect(code):\n    \"\"\"Detects if `code` is JavascriptObfuscator.com packed.\"\"\"\n    # prefer `is not` idiom, so that a true boolean is returned\n    return re.search(r\"^var _0x[a-f0-9]+ ?\\= ?\\[\", code) is not None\n\n\ndef unpack(code):\n    \"\"\"Unpacks JavascriptObfuscator.com packed code.\"\"\"\n    if detect(code):\n        matches = re.search(r\"var (_0x[a-f\\d]+) ?\\= ?\\[(.*?)\\];\", code)\n        if matches:\n            variable = matches.group(1)\n            dictionary = smartsplit(matches.group(2))\n            code = code[len(matches.group(0)) :]\n            for key, value in enumerate(dictionary):\n                code = code.replace(r\"%s[%s]\" % (variable, key), value)\n    return code\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/myobfuscate.py",
    "content": "#\n# deobfuscator for scripts messed up with myobfuscate.com\n# by Einar Lielmanis <einar@beautifier.io>\n#\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n# usage:\n#\n# if detect(some_string):\n#     unpacked = unpack(some_string)\n#\n\n# CAVEAT by Einar Lielmanis\n\n#\n# You really don't want to obfuscate your scripts there: they're tracking\n# your unpackings, your script gets turned into something like this,\n# as of 2011-08-26:\n#\n#   var _escape = 'your_script_escaped';\n#   var _111 = document.createElement('script');\n#   _111.src = 'http://api.www.myobfuscate.com/?getsrc=ok' +\n#              '&ref=' + encodeURIComponent(document.referrer) +\n#              '&url=' + encodeURIComponent(document.URL);\n#   var 000 = document.getElementsByTagName('head')[0];\n#   000.appendChild(_111);\n#   document.write(unescape(_escape));\n#\n\n\"\"\"Deobfuscator for scripts messed up with MyObfuscate.com\"\"\"\n\nimport re\nimport base64\n\n# Python 2 retrocompatibility\n# pylint: disable=F0401\n# pylint: disable=E0611\ntry:\n    from urllib import unquote\nexcept ImportError:\n    from urllib.parse import unquote\n\nfrom jsbeautifier.unpackers import UnpackingError\n\nPRIORITY = 1\n\nCAVEAT = \"\"\"//\n// Unpacker warning: be careful when using myobfuscate.com for your projects:\n// scripts obfuscated by the free online version call back home.\n//\n\n\"\"\"\n\nSIGNATURE = (\n    r'[\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4A\\x4B\\x4C\\x4D\\x4E\\x4F'\n    r\"\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5A\\x61\\x62\\x63\\x64\\x65\"\n    r\"\\x66\\x67\\x68\\x69\\x6A\\x6B\\x6C\\x6D\\x6E\\x6F\\x70\\x71\\x72\\x73\\x74\\x75\"\n    r\"\\x76\\x77\\x78\\x79\\x7A\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2B\"\n    r'\\x2F\\x3D\",\"\",\"\\x63\\x68\\x61\\x72\\x41\\x74\",\"\\x69\\x6E\\x64\\x65\\x78'\n    r'\\x4F\\x66\",\"\\x66\\x72\\x6F\\x6D\\x43\\x68\\x61\\x72\\x43\\x6F\\x64\\x65\",\"'\n    r'\\x6C\\x65\\x6E\\x67\\x74\\x68\"]'\n)\n\n\ndef detect(source):\n    \"\"\"Detects MyObfuscate.com packer.\"\"\"\n    return SIGNATURE in source\n\n\ndef unpack(source):\n    \"\"\"Unpacks js code packed with MyObfuscate.com\"\"\"\n    if not detect(source):\n        return source\n    payload = unquote(_filter(source))\n    match = re.search(r\"^var _escape\\='<script>(.*)<\\/script>'\", payload, re.DOTALL)\n    polished = match.group(1) if match else source\n    return CAVEAT + polished\n\n\ndef _filter(source):\n    \"\"\"Extracts and decode payload (original file) from `source`\"\"\"\n    try:\n        varname = re.search(r\"eval\\(\\w+\\(\\w+\\((\\w+)\\)\\)\\);\", source).group(1)\n        reverse = re.search(r\"var +%s *\\= *'(.*)';\" % varname, source).group(1)\n    except AttributeError:\n        raise UnpackingError(\"Malformed MyObfuscate data.\")\n    try:\n        return base64.b64decode(reverse[::-1].encode(\"utf8\")).decode(\"utf8\")\n    except TypeError:\n        raise UnpackingError(\"MyObfuscate payload is not base64-encoded.\")\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/packer.py",
    "content": "#\n# Unpacker for Dean Edward's p.a.c.k.e.r, a part of javascript beautifier\n# by Einar Lielmanis <einar@beautifier.io>\n#\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n# usage:\n#\n# if detect(some_string):\n#     unpacked = unpack(some_string)\n#\n\n\"\"\"Unpacker for Dean Edward's p.a.c.k.e.r\"\"\"\n\nimport re\nimport string\nimport sys\nfrom jsbeautifier.unpackers import UnpackingError\n\nPRIORITY = 1\n\n\ndef detect(source):\n    global beginstr\n    global endstr\n    beginstr = \"\"\n    endstr = \"\"\n    begin_offset = -1\n    \"\"\"Detects whether `source` is P.A.C.K.E.R. coded.\"\"\"\n    mystr = re.search(\n        r\"eval[ ]*\\([ ]*function[ ]*\\([ ]*p[ ]*,[ ]*a[ ]*,[ ]*c[\"\n        \" ]*,[ ]*k[ ]*,[ ]*e[ ]*,[ ]*\",\n        source,\n    )\n    if mystr:\n        begin_offset = mystr.start()\n        beginstr = source[:begin_offset]\n    if begin_offset != -1:\n        \"\"\"Find endstr\"\"\"\n        source_end = source[begin_offset:]\n        if source_end.split(\"')))\", 1)[0] == source_end:\n            try:\n                endstr = source_end.split(\"}))\", 1)[1]\n            except IndexError:\n                endstr = \"\"\n        else:\n            endstr = source_end.split(\"')))\", 1)[1]\n    return mystr is not None\n\n\ndef unpack(source):\n    \"\"\"Unpacks P.A.C.K.E.R. packed js code.\"\"\"\n    payload, symtab, radix, count = _filterargs(source)\n\n    if count != len(symtab):\n        raise UnpackingError(\"Malformed p.a.c.k.e.r. symtab.\")\n\n    try:\n        unbase = Unbaser(radix)\n    except TypeError:\n        raise UnpackingError(\"Unknown p.a.c.k.e.r. encoding.\")\n\n    def lookup(match):\n        \"\"\"Look up symbols in the synthetic symtab.\"\"\"\n        word = match.group(0)\n        return symtab[unbase(word)] or word\n\n    payload = payload.replace(\"\\\\\\\\\", \"\\\\\").replace(\"\\\\'\", \"'\")\n    if sys.version_info.major == 2:\n        source = re.sub(r\"\\b\\w+\\b\", lookup, payload)\n    else:\n        source = re.sub(r\"\\b\\w+\\b\", lookup, payload, flags=re.ASCII)\n    return _replacestrings(source)\n\n\ndef _filterargs(source):\n    \"\"\"Juice from a source file the four args needed by decoder.\"\"\"\n    juicers = [\n        (r\"}\\('(.*)', *(\\d+|\\[\\]), *(\\d+), *'(.*)'\\.split\\('\\|'\\), *(\\d+), *(.*)\\)\\)\"),\n        (r\"}\\('(.*)', *(\\d+|\\[\\]), *(\\d+), *'(.*)'\\.split\\('\\|'\\)\"),\n    ]\n    for juicer in juicers:\n        args = re.search(juicer, source, re.DOTALL)\n        if args:\n            a = args.groups()\n            if a[1] == \"[]\":\n                a = list(a)\n                a[1] = 62\n                a = tuple(a)\n            try:\n                return a[0], a[3].split(\"|\"), int(a[1]), int(a[2])\n            except ValueError:\n                raise UnpackingError(\"Corrupted p.a.c.k.e.r. data.\")\n\n    # could not find a satisfying regex\n    raise UnpackingError(\n        \"Could not make sense of p.a.c.k.e.r data (unexpected code structure)\"\n    )\n\n\ndef _replacestrings(source):\n    global beginstr\n    global endstr\n    \"\"\"Strip string lookup table (list) and replace values in source.\"\"\"\n    match = re.search(r'var *(_\\w+)\\=\\[\"(.*?)\"\\];', source, re.DOTALL)\n\n    if match:\n        varname, strings = match.groups()\n        startpoint = len(match.group(0))\n        lookup = strings.split('\",\"')\n        variable = \"%s[%%d]\" % varname\n        for index, value in enumerate(lookup):\n            source = source.replace(variable % index, '\"%s\"' % value)\n        return source[startpoint:]\n    return beginstr + source + endstr\n\n\nclass Unbaser(object):\n    \"\"\"Functor for a given base. Will efficiently convert\n    strings to natural numbers.\"\"\"\n\n    ALPHABET = {\n        62: \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\",\n        95: (\n            \" !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n            \"[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\"\n        ),\n    }\n\n    def __init__(self, base):\n        self.base = base\n\n        # fill elements 37...61, if necessary\n        if 36 < base < 62:\n            if not hasattr(self.ALPHABET, self.ALPHABET[62][:base]):\n                self.ALPHABET[base] = self.ALPHABET[62][:base]\n        # attrs = self.ALPHABET\n        # print ', '.join(\"%s: %s\" % item for item in attrs.items())\n        # If base can be handled by int() builtin, let it do it for us\n        if 2 <= base <= 36:\n            self.unbase = lambda string: int(string, base)\n        else:\n            # Build conversion dictionary cache\n            try:\n                self.dictionary = dict(\n                    (cipher, index) for index, cipher in enumerate(self.ALPHABET[base])\n                )\n            except KeyError:\n                raise TypeError(\"Unsupported base encoding.\")\n\n            self.unbase = self._dictunbaser\n\n    def __call__(self, string):\n        return self.unbase(string)\n\n    def _dictunbaser(self, string):\n        \"\"\"Decodes a  value to an integer.\"\"\"\n        ret = 0\n        for index, cipher in enumerate(string[::-1]):\n            ret += (self.base**index) * self.dictionary[cipher]\n        return ret\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/__init__.py",
    "content": "# Empty file :)\n# pylint: disable=C0111\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/test-myobfuscate-input.js",
    "content": "var OO0=[\"\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4A\\x4B\\x4C\\x4D\\x4E\\x4F\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5A\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6A\\x6B\\x6C\\x6D\\x6E\\x6F\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7A\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x2B\\x2F\\x3D\",\"\",\"\\x63\\x68\\x61\\x72\\x41\\x74\",\"\\x69\\x6E\\x64\\x65\\x78\\x4F\\x66\",\"\\x66\\x72\\x6F\\x6D\\x43\\x68\\x61\\x72\\x43\\x6F\\x64\\x65\",\"\\x6C\\x65\\x6E\\x67\\x74\\x68\"];function _1OO(_0IO){var _011=OO0[0];var lOO,O10,_0ll,OlO,_01O,IOO,I01,_001,_11O=0,Ol0=OO0[1];do{OlO=_011[OO0[3]](_0IO[OO0[2]](_11O++));_01O=_011[OO0[3]](_0IO[OO0[2]](_11O++));IOO=_011[OO0[3]](_0IO[OO0[2]](_11O++));I01=_011[OO0[3]](_0IO[OO0[2]](_11O++));_001=OlO<<18|_01O<<12|IOO<<6|I01;lOO=_001>>16&0xff;O10=_001>>8&0xff;_0ll=_001&0xff;if(IOO==64){Ol0+=String[OO0[4]](lOO);}else{if(I01==64){Ol0+=String[OO0[4]](lOO,O10);}else{Ol0+=String[OO0[4]](lOO,O10,_0ll);};};} while(_11O<_0IO[OO0[5]]);return Ol0;};function O0I(O11){var OO1=OO0[1],_11O=0;for(_11O=O11[OO0[5]]-1;_11O>=0;_11O--){OO1+=O11[OO0[2]](_11O);};return OO1;};var _0OO='=sTKpUGchN2cl9FKlBXYjNXZuVHKlRXaydnL05WZtV3YvR2Op80TPhCZslGaDRmblBHch5SMwwmC70FMblyJkFWZodCKl1WYOdWYUlnQzRnbl1WZsVEdldmL05WZtV3YvRGI9ASMwwGIyFmdKsTKMJVVuQnbl1Wdj9GZoQnbl52bw12bDlkUVVGZvNmbltyJ9wmc1ZyJrkiclJnclZWZy5CduVWb1N2bkhCduVmbvBXbvNUSSVVZk92YuV2Kn0jZlJnJnsyJr9WPjJ3c0V2Z/8SbvNmLlRXYjNXdmJ2b51mLpBXYv8iOwRHdodCI9AyYyNnLP90TKsTKnQHcpJ3YzdCK05WZtVGbFVGdhVmcj5CduVWb1N2bkBSPg80TPBichZ3OnU0MlQHcpJ3Yz9yQzUSQwUCR3USQwUCR3UCMyUCMyUCMyUCMyUSQwUiQzUCdwITJuJXd0VmcwITJwITJwITJwITJwITJwITJwITJwITJBBTJCNTJ5ITJlNHbhZGMyUyQyUyNyUyNyUCOyUCdjVGc4VmL0BjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlI0MlkjMlUWdyRHMyUyQyUyNyUSY3ITJ4ITJ0NWZwhXZuQHMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUiQzUSOyUSZzxWYmBjMlMkMlcjMlQ2YidjMlgjMlQ3YlBHel5CdwITJwITJwITJwITJwITJwITJwITJwITJBBTJCNTJ5ITJlVnc0BjMlMkMlcjMlMmYhdjMlgjMlQ3YlBHel5CdwITJwITJwITJwITJwITJwITJwITJwITJBBTJCNTJ5ITJyITJ5ITJhBjMlMkMlY0MlgjMlgGdpd3XzRnchR3cf5iUfV0XL91QfF0XQJjMlAjMlMkMlE2XoRXa391c0JXY0NHOyUibvlGdj5Wdm9FdzVGduQHMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUCR3UCMyUiQzUSOyUyNyUSY3ITJwITJDJTJ0FGa3hjMlgGdpd3XzRnchR3cf5iUfV0XL91QfF0XQBjMl4mc1RXZyBjMlI0NlAjMlkjMlQXYodHOyUibvlGdj5WdmBjMlQ0MlAjMlE2XoRXa391c0JXY0NHMyUichZHMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUSQwUiQzUSOyUyNyUSMENTJhBjMlIXY2djMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlMkMlIjMlkjMlkjMlQ0NlI0NlMkMlAzQyUSOyUyNyUyQ3UyNyUCOyUCdpxGcz5yNyUSYDdTJDdTJyFmd3ITJDJTJzMkMlMzQyUyNyUSMENTJyAjMlAzNyUCOyUCR3UCcwITJuJXd0VmcCNTJ5ITJEVTJjJUNls2QyUSOyUyNyUyZ3ITJDJTJ3ITJiNUNlMUNlMUNlMUNlcjMlsSOyUyY4ITJltyNyUiYDVTJDVTJDVTJDVTJ3ITJ4ITJwhXRnVmUwITJ3Vmb4ITJlNWYsBXZy5CcENTJwljMlQUNlMmQ1Uya4ITJmlWOyUSLtMGOyUSZslGa3J0MlQ0NlEDRzUyYCNTJEdTJ3ITJrc3Q1UyQ1UyQ1UyQ1UyNyUibyVHdlJnQ3USOyUCOyUibvlGdj5WdmR0MlUmQzUCR1UCR3UCR1USZCVTJyBjMl4mc1RXZyJ0NlkjMlUGOyUibvlGdj5WdmJUNlQ0MlsmQzUyYDdTJDdTJEVTJjJUNlsGRzUCR1UyYCVTJyljMl0SLjhjMlUGbph2dCdTJ5ITJ5ITJn5WayR3UDJTJvUUNl8COyUSZjFGbwVmcucjMlcjMlEjMlgjMlYWaCNTJn5WayR3UENTJlJ0NlkjMlI3QyUSZDJTJrNkMlM2QyUSYDJTJwhjMl42bpR3YuVnZ4ITJsFmdlJjMlgjMlQ3YlBHel5CdwITJwITJwITJwITJwITJwITJwITJwITJBBTJCNTJ5ITJ3ITJrNWYw5WduI1XF91SfN0XB9FU3ITJwITJDJTJrNWYw5WduI1XF91SfN0XB9FU4ITJu9Wa0Nmb1Z2X0NXZ05CdwITJwITJwITJwITJwITJwITJwITJwITJBBTJBBTJCNTJ5ITJlVnc0BjMlMkMlcjMlIHMyUyQyUSZwITJDJTJrBjMlMkMlMGMyUyQyUSYwITJDJTJwhjMl42bpR3YuVnZwITJ4ITJwITJsFmdldjMlgjMlQ3YlBHel5CdwITJwITJwITJwITJwITJwITJwITJwITJBBTJCNTJ5ITJlVnc0BjMlMkMlcjMlI3QyUSZDJTJrNkMlM2QyUSYDJTJwhjMl42bpR3YuVnZ4ITJsFmdldjMlgjMlQ3YlBHel5CdwITJwITJwITJwITJwITJwITJwITJwITJBBTJCNTJ5ITJlNHbhZGMyUyQyUyNyUiYwITJENTJwITJhBjMlIXY2djMlgjMlQ3YlBHel5CdwITJwITJwITJwITJwITJwITJwITJwITJBBTJCNTJ5ITJlNHbhZGMyUyQyUyNyUyNyUCOyUCdjVGc4VmL0BjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlI0MlkjMlIjMlQ3YlRXZk5iUfV0XL91QfF0XQJjMlAjMlMkMlQ3YlRXZk5iUfV0XL91QfF0XQhjMl42bpR3YuVnZfR3clRnL0BjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlI0MlkjMlgjMlQ3clRVe0lmbhNFMyUydl5GMyUyQ3UyQ3UCMyUCdzVGdflHdp5WYzBjMlQ0MlAjMlQHMyUichZHMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUiQ3UCMyUSOyUCdzVGdflHdp5WYzhjMlAjMl42bpR3YuVnZwITJBNTJzR3clR3XuVncwITJwITJwITJwITJBBTJBBTJDJTJEdTJwITJwITJwITJwITJBBTJCNTJ0FGa3BjMlQ0MlQ0MlQ0MlAjMlkjMlgGdn5WZs5Cdhh2dwITJDJTJwgjMlIHdzJWdz5ic0NHMyUibyVHdlJHMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUiQ3UCMyUSOyUCdhh2dwITJDJTJyR3c4ITJwITJu9Wa0Nmb1ZGMyUSQzUCa0l2dfNHdyFGdz9FMyUCMyUCMyUCMyUSQwUSQwUyQyUCR3UCMyUCMyUCMyUCMyUSQwUiQzUic0NHMyUibyVHdlJHMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUCR3UCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUCR3UCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUiLyV2c1BjMl42bwITJn5WaoNXYyNGMyUiZvBjMlQWYlR3culGMyUyQyUCbh5WanlmcvBjMlUGa0BjMl4mc1RXZyBjMlQ3c1pGMyUCbsdjMlU2dwITJuQWZslWYmBjMlQXawITJDJTJsxWZ3BjMl8yLwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJBBTJCdTJwITJ5ITJy9mcyVGOyUCMyUCajRXYjBjMlQ0NlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlQ0NlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlI0MlU2YyV3bz9FZlt2YhBnb1BjMlQ0MlAjMlIHdzBjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlI0NlAjMlkjMlU2YyV3bz9FZlt2YhBnb1BjMlYjMlYjMlAjMlcjMlcmbpJHdzdjMlAjMlQ0MlQ0MlAjMlU2YyV3bz9FZlt2YhBnb1BjMlY2blBXe0hjMlAjMlYWawITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJBBTJ5ITJ3ITJCNTJ3ITJwITJrAjMlkjMlQDOyUyZulmc0NnY1NnLyR3cwITJrAjMlcjMlAjMlQ0MlAjMlU2YyV3bz9FZlt2YhBnb1djMlgjMlwWY2VGMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUiQ3UCMyUSeyRHMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUCMyUSQwUiQ3UCMyUSOyUSOyUic0NHOyUCdjVGdlRmLS9VRft0XD9VQfBFOyUCMyUiZpBjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlI0MlcjMlcjMlAjMlQ0MlAjMlU2YyV3bz9FZlt2YhBnb1BjMlIXY2BjMlAjMlAjMlAjMlAjMlAjMlAjMlAjMlEEMlI0NlAjMlkjMlIHdzhjMlAjMl42bpR3YuVnZwITJBNTJrNWYw5WdwITJwITJwITJwITJBBTJBBTJDJTJEdTJwITJwITJwITJwITJBBTJCNTJwITJ5ITJ3ITJ4ITJu9Wa0Nmb1ZGOyUCOyUCbhZXZ3ITJwITJDJTJ5ITJ3ITJ3ITJwITJDJTJn9yKwITJvgjMlU2YhxGclJnL5ITJ4ITJlNXYDJXZ39GTvRnLyR3c4ITJoRXa391c0JXY0N3XuI1XF91SfN0XB9FUwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJwITJBBTJDdTJDdTJwITJ5ITJ3ITJ4ITJu9Wa0Nmb1ZGOyUCbhZXZ3ITJwITJDJTJ5ITJ3ITJ3ITJwITJDJTJn9yKwITJvgjMlU2YhxGclJnL5ITJ4ITJlNXYDJXZ39GTvRnLyR3c4ITJoRXa391c0JXY0N3XuI1XF91SfN0XB9FUwITJuJXd0VmcwITJwITJwITJwITJwITJwITJwITJwITJBBTJCdTJwITJ5ITJyR3c4ITJwITJu9Wa0Nmb1ZGMyUSQzUCdjVGdlRGMyUCMyUCMyUCMyUSQwUiQ3UCMyUCRzUCMyUiUfV0XL91QfF0XQBjMlIXY2FEMlEEMl8yLBBTJv8SQwUCR3UCMyUyLvEEMlI0MlkjMlcmbpJHdz9VZt92c4ITJrNWYw5WduI1XF91SfN0XB9FUwITJENTJwITJkV2ajFGcuVHMyUichZHMyUCMyUCMyUCMyUCMyUyLvEEMlI0NlAjMlkjMlkjMlcmbpJHdz9VZt92c4ITJ0NWZ0VGZuI1XF91SfN0XB9FU4ITJwITJmlGMyUyLvEEMl8yLBBTJBNTJldWYzVHMyUyLvEEMl8yLBBTJuMncvN3clJHct92YwITJkV2chJWLsFmdlBjMlIXZoR3bwITJm9GMyUSZsBXdvNGMyUSYwITJ0FWZmVGZwITJuF2YwITJ0lGMyUyQyUSesxWY05WZkl2Yul2bDBjMl8yLBBTJv8SQwUSRzUyZy9mLyVWamlGd1FWZiNnaAJXYulWZDNTJwITJzlmbh1GbllGTwITJyFmbpVEMyUSeiBjMl4WZ0RXaydHMyUyLvEEMlIXZpZWa0VXYlJGMyUCdwlmcjNXY2FmawITJm9GMyUCdyFGcwITJhBjMlMkMlInLl5yauMmLh5CcwITJzdjMlQmchdHZFBjMl4WYlREMyUicvZGMyUiclt2YhBnbVBjMl8yLBBTJv8SRzUCdwlmcjN3QzUyJ9UGchN2cl9FIyFmd';eval(_1OO(O0I(_0OO)));"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/test-myobfuscate-output.js",
    "content": "//\n// Unpacker warning: be careful when using myobfuscate.com for your projects:\n// scripts obfuscated by the free online version call back home.\n//\n\n//\n// Unpacker for Dean Edward's p.a.c.k.e.r, a part of javascript beautifier\n// written by Einar Lielmanis <einar@jsbeautifier.org>\n//\n// Coincidentally, it can defeat a couple of other eval-based compressors.\n//\n// usage:\n//\n// if (P_A_C_K_E_R.detect(some_string)) {\n//     var unpacked = P_A_C_K_E_R.unpack(some_string);\n// }\n//\n//\n\nvar P_A_C_K_E_R = {\n    detect: function (str) {\n        return P_A_C_K_E_R._starts_with(str.toLowerCase().replace(/ +/g, ''), 'eval(function(') ||\n               P_A_C_K_E_R._starts_with(str.toLowerCase().replace(/ +/g, ''), 'eval((function(') ;\n    },\n\n    unpack: function (str) {\n        var unpacked_source = '';\n        if (P_A_C_K_E_R.detect(str)) {\n            try {\n                eval('unpacked_source = ' + str.substring(4) + ';')\n                if (typeof unpacked_source == 'string' && unpacked_source) {\n                    str = unpacked_source;\n                }\n            } catch (error) {\n                // well, it failed. we'll just return the original, instead of crashing on user.\n            }\n        }\n        return str;\n    },\n\n    _starts_with: function (str, what) {\n        return str.substr(0, what.length) === what;\n    },\n\n    run_tests: function (sanity_test) {\n        var t = sanity_test || new SanityTest();\n        t.test_function(P_A_C_K_E_R.detect, \"P_A_C_K_E_R.detect\");\n        t.expect('', false);\n        t.expect('var a = b', false);\n        t.expect('eval(function(p,a,c,k,e,r', true);\n        t.expect('eval ( function(p, a, c, k, e, r', true);\n\n        t.test_function(P_A_C_K_E_R.unpack, 'P_A_C_K_E_R.unpack');\n        t.expect(\"eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))\",\n            'var a=1');\n\n        var starts_with_a = function(what) { return P_A_C_K_E_R._starts_with(what, 'a'); }\n        t.test_function(starts_with_a, \"P_A_C_K_E_R._starts_with(?, a)\");\n        t.expect('abc', true);\n        t.expect('bcd', false);\n        t.expect('a', true);\n        t.expect('', false);\n        return t;\n    }\n}\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/test-packer-62-input.js",
    "content": "eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('9 H=(j[\"Y\"][\"n\"](\"1h\")!=-1)?s:v;9 I=(j[\"Y\"][\"w\"]()[\"n\"](\"1i\")!=-1)?s:v;9 J=(j[\"K\"][\"n\"](\"1j\")!=-1)?s:v;p Z(){9 a;9 b;9 c;y{b=o z(\"l.l.7\");a=b.P(\"$Q\")}A(c){};i(!a){y{b=o z(\"l.l.6\");a=\"R 6,0,21,0\";b[\"1k\"]=\"1l\";a=b.P(\"$Q\")}A(c){}};i(!a){y{b=o z(\"l.l.3\");a=b.P(\"$Q\")}A(c){}};i(!a){y{b=o z(\"l.l.3\");a=\"R 3,0,18,0\"}A(c){}};i(!a){y{b=o z(\"l.l\");a=\"R 2,0,0,11\"}A(c){a=-1}};m a};p 10(){9 a=-1;i(j[\"t\"]!=12&&j[\"t\"][\"13\"]>0){i(j[\"t\"][\"L M 2.0\"]||j[\"t\"][\"L M\"]){9 b=j[\"t\"][\"L M 2.0\"]?\" 2.0\":\"\";9 c=j[\"t\"][\"L M\"+b][\"1m\"];9 d=c[\"B\"](\" \");9 e=d[2][\"B\"](\".\");9 f=e[0];9 g=e[1];9 h=d[3];i(h==\"\"){h=d[4]};i(h[0]==\"d\"){h=h[\"S\"](1)}k{i(h[0]==\"r\"){h=h[\"S\"](1);i(h[\"n\"](\"d\")>0){h=h[\"S\"](0,h[\"n\"](\"d\"))}}};9 a=f+\".\"+g+\".\"+h}}k{i(j[\"K\"][\"w\"]()[\"n\"](\"T/2.6\")!=-1){a=4}k{i(j[\"K\"][\"w\"]()[\"n\"](\"T/2.5\")!=-1){a=3}k{i(j[\"K\"][\"w\"]()[\"n\"](\"T\")!=-1){a=2}k{i(H&&I&&!J){a=Z()}}}}};m a};p 1n(a,b,c){C=10();i(C==-1){m v}k{i(C!=0){i(H&&I&&!J){14=C[\"B\"](\" \");15=14[1];D=15[\"B\"](\",\")}k{D=C[\"B\"](\".\")};9 d=D[0];9 e=D[1];9 f=D[2];i(d>E(a)){m s}k{i(d==E(a)){i(e>E(b)){m s}k{i(e==E(b)){i(f>=E(c)){m s}}}}};m v}}};p 16(a,b){i(a[\"n\"](\"?\")!=-1){m a[\"1o\"](/\\\\?/,b+\"?\")}k{m a+b}};p U(a,b,c){9 d=\"\";i(H&&I&&!J){d+=\"<17 \";N(9 e V a){d+=e+\"=\"\"+a[e]+\"\" \"};d+=\">\";N(9 e V b){d+=\"<1p 19=\"\"+e+\"\" 1q=\"\"+b[e]+\"\" /> \"};d+=\"</17>\"}k{d+=\"<1a \";N(9 e V c){d+=e+\"=\"\"+c[e]+\"\" \"};d+=\"> </1a>\"};1r[\"1s\"](d)};p 1t(){9 a=W(1b,\".1u\",\"1c\",\"1d:1v-1w-1x-1y-1e\",\"1z/x-1A-1B\");U(a[\"u\"],a[\"F\"],a[\"q\"])};p 1C(){9 a=W(1b,\".1D\",\"X\",\"1d:1E-1F-1G-1H-1e\",12);U(a[\"u\"],a[\"F\"],a[\"q\"])};p W(a,b,c,d,e){9 f=o O();f[\"q\"]=o O();f[\"F\"]=o O();f[\"u\"]=o O();N(9 g=0;g<a[\"13\"];g=g+2){9 h=a[g][\"w\"]();1I(h){8\"1f\":G;8\"1J\":f[\"q\"][a[g]]=a[g+1];G;8\"X\":;8\"1c\":a[g+1]=16(a[g+1],b);f[\"q\"][\"X\"]=a[g+1];f[\"F\"][c]=a[g+1];G;8\"1K\":;8\"1L\":;8\"1M\":;8\"1N\":;8\"1O\":;8\"1P\":;8\"1Q\":;8\"1R\":;8\"1S\":;8\"1T\":;8\"1U\":;8\"1V\":;8\"1W\":;8\"1X\":;8\"1Y\":;8\"1Z\":;8\"20\":;8\"22\":;8\"23\":;8\"24\":;8\"25\":;8\"26\":;8\"27\":;8\"28\":;8\"29\":;8\"2a\":;8\"2b\":;8\"2c\":;8\"2d\":;8\"2e\":;8\"2f\":;8\"2g\":;8\"2h\":;8\"2i\":;8\"2j\":;8\"2k\":;8\"2l\":;8\"1g\":;8\"2m\":;8\"2n\":f[\"u\"][a[g]]=a[g+1];G;8\"2o\":;8\"2p\":;8\"2q\":;8\"2r\":;8\"2s\":;8\"2t\":;8\"2u\":;8\"2v\":;8\"19\":;8\"2w\":f[\"q\"][a[g]]=f[\"u\"][a[g]]=a[g+1];G;2x:f[\"q\"][a[g]]=f[\"F\"][a[g]]=a[g+1]}};f[\"u\"][\"1f\"]=d;i(e){f[\"q\"][\"1g\"]=e};m f};',62,158,'||||||||case|var|||||||||if|navigator|else|ShockwaveFlash|return|indexOf|new|function|embedAttrs||true|plugins|objAttrs|false|toLowerCase||try|ActiveXObject|catch|split|versionStr|versionArray|parseFloat|params|break|isIE|isWin|isOpera|userAgent|Shockwave|Flash|for|Object|GetVariable|version|WIN|substring|webtv|AC_Generateobj|in|AC_GetArgs|src|appVersion|ControlVersion|GetSwfVer||null|length|tempArray|tempString|AC_AddExtension|object||name|embed|arguments|movie|clsid|444553540000|classid|type|MSIE|win|Opera|AllowScriptAccess|always|description|DetectFlashVer|replace|param|value|document|write|AC_FL_RunContent|swf|d27cdb6e|ae6d|11cf|96b8|application|shockwave|flash|AC_SW_RunContent|dcr|166B1BCA|3F9C|11CF|8075|switch|pluginspage|onafterupdate|onbeforeupdate|onblur|oncellchange|onclick|ondblclick|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondrop|onfinish|onfocus|onhelp|onmousedown|onmouseup||onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup|onload|onlosecapture|onpropertychange|onreadystatechange|onrowsdelete|onrowenter|onrowexit|onrowsinserted|onstart|onscroll|onbeforeeditfocus|onactivate|onbeforedeactivate|ondeactivate|codebase|id|width|height|align|vspace|hspace|class|title|accesskey|tabindex|default'.split('|'),0,{}))"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/test-packer-non62-input.js",
    "content": "var isIE=(navigator[\"appVersion\"][\"indexOf\"](\"MSIE\")!=-1)?true:false;var isWin=(navigator[\"appVersion\"][\"toLowerCase\"]()[\"indexOf\"](\"win\")!=-1)?true:false;var isOpera=(navigator[\"userAgent\"][\"indexOf\"](\"Opera\")!=-1)?true:false;function ControlVersion(){var a;var b;var c;try{b=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\");a=b.GetVariable(\"$version\")}catch(c){};if(!a){try{b=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\");a=\"WIN 6,0,21,0\";b[\"AllowScriptAccess\"]=\"always\";a=b.GetVariable(\"$version\")}catch(c){}};if(!a){try{b=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.3\");a=b.GetVariable(\"$version\")}catch(c){}};if(!a){try{b=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.3\");a=\"WIN 3,0,18,0\"}catch(c){}};if(!a){try{b=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\");a=\"WIN 2,0,0,11\"}catch(c){a=-1}};return a};function GetSwfVer(){var a=-1;if(navigator[\"plugins\"]!=null&&navigator[\"plugins\"][\"length\"]>0){if(navigator[\"plugins\"][\"Shockwave Flash 2.0\"]||navigator[\"plugins\"][\"Shockwave Flash\"]){var b=navigator[\"plugins\"][\"Shockwave Flash 2.0\"]?\" 2.0\":\"\";var c=navigator[\"plugins\"][\"Shockwave Flash\"+b][\"description\"];var d=c[\"split\"](\" \");var e=d[2][\"split\"](\".\");var f=e[0];var g=e[1];var h=d[3];if(h==\"\"){h=d[4]};if(h[0]==\"d\"){h=h[\"substring\"](1)}else{if(h[0]==\"r\"){h=h[\"substring\"](1);if(h[\"indexOf\"](\"d\")>0){h=h[\"substring\"](0,h[\"indexOf\"](\"d\"))}}};var a=f+\".\"+g+\".\"+h}}else{if(navigator[\"userAgent\"][\"toLowerCase\"]()[\"indexOf\"](\"webtv/2.6\")!=-1){a=4}else{if(navigator[\"userAgent\"][\"toLowerCase\"]()[\"indexOf\"](\"webtv/2.5\")!=-1){a=3}else{if(navigator[\"userAgent\"][\"toLowerCase\"]()[\"indexOf\"](\"webtv\")!=-1){a=2}else{if(isIE&&isWin&&!isOpera){a=ControlVersion()}}}}};return a};function DetectFlashVer(a,b,c){versionStr=GetSwfVer();if(versionStr==-1){return false}else{if(versionStr!=0){if(isIE&&isWin&&!isOpera){tempArray=versionStr[\"split\"](\" \");tempString=tempArray[1];versionArray=tempString[\"split\"](\",\")}else{versionArray=versionStr[\"split\"](\".\")};var d=versionArray[0];var e=versionArray[1];var f=versionArray[2];if(d>parseFloat(a)){return true}else{if(d==parseFloat(a)){if(e>parseFloat(b)){return true}else{if(e==parseFloat(b)){if(f>=parseFloat(c)){return true}}}}};return false}}};function AC_AddExtension(a,b){if(a[\"indexOf\"](\"?\")!=-1){return a[\"replace\"](/\\?/,b+\"?\")}else{return a+b}};function AC_Generateobj(a,b,c){var d=\"\";if(isIE&&isWin&&!isOpera){d+=\"<object \";for(var e in a){d+=e+\"=\"\"+a[e]+\"\" \"};d+=\">\";for(var e in b){d+=\"<param name=\"\"+e+\"\" value=\"\"+b[e]+\"\" /> \"};d+=\"</object>\"}else{d+=\"<embed \";for(var e in c){d+=e+\"=\"\"+c[e]+\"\" \"};d+=\"> </embed>\"};document[\"write\"](d)};function AC_FL_RunContent(){var a=AC_GetArgs(arguments,\".swf\",\"movie\",\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\",\"application/x-shockwave-flash\");AC_Generateobj(a[\"objAttrs\"],a[\"params\"],a[\"embedAttrs\"])};function AC_SW_RunContent(){var a=AC_GetArgs(arguments,\".dcr\",\"src\",\"clsid:166B1BCA-3F9C-11CF-8075-444553540000\",null);AC_Generateobj(a[\"objAttrs\"],a[\"params\"],a[\"embedAttrs\"])};function AC_GetArgs(a,b,c,d,e){var f=new Object();f[\"embedAttrs\"]=new Object();f[\"params\"]=new Object();f[\"objAttrs\"]=new Object();for(var g=0;g<a[\"length\"];g=g+2){var h=a[g][\"toLowerCase\"]();switch(h){case\"classid\":break;case\"pluginspage\":f[\"embedAttrs\"][a[g]]=a[g+1];break;case\"src\":;case\"movie\":a[g+1]=AC_AddExtension(a[g+1],b);f[\"embedAttrs\"][\"src\"]=a[g+1];f[\"params\"][c]=a[g+1];break;case\"onafterupdate\":;case\"onbeforeupdate\":;case\"onblur\":;case\"oncellchange\":;case\"onclick\":;case\"ondblclick\":;case\"ondrag\":;case\"ondragend\":;case\"ondragenter\":;case\"ondragleave\":;case\"ondragover\":;case\"ondrop\":;case\"onfinish\":;case\"onfocus\":;case\"onhelp\":;case\"onmousedown\":;case\"onmouseup\":;case\"onmouseover\":;case\"onmousemove\":;case\"onmouseout\":;case\"onkeypress\":;case\"onkeydown\":;case\"onkeyup\":;case\"onload\":;case\"onlosecapture\":;case\"onpropertychange\":;case\"onreadystatechange\":;case\"onrowsdelete\":;case\"onrowenter\":;case\"onrowexit\":;case\"onrowsinserted\":;case\"onstart\":;case\"onscroll\":;case\"onbeforeeditfocus\":;case\"onactivate\":;case\"onbeforedeactivate\":;case\"ondeactivate\":;case\"type\":;case\"codebase\":;case\"id\":f[\"objAttrs\"][a[g]]=a[g+1];break;case\"width\":;case\"height\":;case\"align\":;case\"vspace\":;case\"hspace\":;case\"class\":;case\"title\":;case\"accesskey\":;case\"name\":;case\"tabindex\":f[\"embedAttrs\"][a[g]]=f[\"objAttrs\"][a[g]]=a[g+1];break;default:f[\"embedAttrs\"][a[g]]=f[\"params\"][a[g]]=a[g+1]}};f[\"objAttrs\"][\"classid\"]=d;if(e){f[\"embedAttrs\"][\"type\"]=e};return f};"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/testjavascriptobfuscator.py",
    "content": "#\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n\n\"\"\"Tests for JavaScriptObfuscator unpacker.\"\"\"\n\nimport unittest\nfrom jsbeautifier.unpackers.javascriptobfuscator import unpack, detect, smartsplit\n\n# pylint: disable=R0904\n\n\nclass TestJavascriptObfuscator(unittest.TestCase):\n    \"\"\"JavascriptObfuscator.com test case.\"\"\"\n\n    def test_smartsplit(self):\n        \"\"\"Test smartsplit() function.\"\"\"\n        split = smartsplit\n\n        def equals(data, result):\n            return self.assertEqual(split(data), result)\n\n        equals(\"\", [])\n        equals('\"a\", \"b\"', ['\"a\"', '\"b\"'])\n        equals('\"aaa\",\"bbbb\"', ['\"aaa\"', '\"bbbb\"'])\n        equals('\"a\", \"b\\\\\"\"', ['\"a\"', '\"b\\\\\"\"'])\n\n    def test_detect(self):\n        \"\"\"Test detect() function.\"\"\"\n\n        def positive(source):\n            return self.assertTrue(detect(source))\n\n        def negative(source):\n            return self.assertFalse(detect(source))\n\n        negative(\"\")\n        negative(\"abcd\")\n        negative(\"var _0xaaaa\")\n        positive('var _0xaaaa = [\"a\", \"b\"]')\n        positive('var _0xaaaa=[\"a\", \"b\"]')\n        positive('var _0x1234=[\"a\",\"b\"]')\n\n    def test_unpack(self):\n        \"\"\"Test unpack() function.\"\"\"\n\n        def decodeto(ob, original):\n            return self.assertEqual(unpack(ob), original)\n\n        decodeto(\"var _0x8df3=[];var a=10;\", \"var a=10;\")\n        decodeto(\n            'var _0xb2a7=[\"\\x74\\x27\\x65\\x73\\x74\"];var i;for(i=0;i<10;++i)'\n            \"{alert(_0xb2a7[0]);} ;\",\n            \"var i;for(i=0;i<10;++i){alert\" '(\"t\\'est\");} ;',\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/testmyobfuscate.py",
    "content": "#\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n\n\"\"\"Tests for MyObfuscate unpacker.\"\"\"\n\nimport unittest\nimport os\nfrom jsbeautifier.unpackers.myobfuscate import detect, unpack\nfrom jsbeautifier.unpackers.tests import __path__ as path\n\nINPUT = os.path.join(path[0], \"test-myobfuscate-input.js\")\nOUTPUT = os.path.join(path[0], \"test-myobfuscate-output.js\")\n\n# pylint: disable=R0904\n\n\nclass TestMyObfuscate(unittest.TestCase):\n    # pylint: disable=C0103\n    \"\"\"MyObfuscate obfuscator testcase.\"\"\"\n\n    @classmethod\n    def setUpClass(cls):\n        \"\"\"Load source files (encoded and decoded version) for tests.\"\"\"\n        with open(INPUT, \"r\") as data:\n            cls.input = data.read()\n        with open(OUTPUT, \"r\") as data:\n            cls.output = data.read()\n\n    def test_detect(self):\n        \"\"\"Test detect() function.\"\"\"\n\n        def detected(source):\n            return self.assertTrue(detect(source))\n\n        detected(self.input)\n\n    def test_unpack(self):\n        \"\"\"Test unpack() function.\"\"\"\n\n        def check(inp, out):\n            return self.assertEqual(unpack(inp), out)\n\n        check(self.input, self.output)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/testpacker.py",
    "content": "# -*- coding: utf-8 -*-\n#\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n\n\"\"\"Tests for P.A.C.K.E.R. unpacker.\"\"\"\n\nimport unittest\nfrom jsbeautifier.unpackers.packer import detect, unpack\n\n# pylint: disable=R0904\n\n\nclass TestPacker(unittest.TestCase):\n    \"\"\"P.A.C.K.E.R. testcase.\"\"\"\n\n    def test_detect(self):\n        \"\"\"Test detect() function.\"\"\"\n\n        def positive(source):\n            return self.assertTrue(detect(source))\n\n        def negative(source):\n            return self.assertFalse(detect(source))\n\n        negative(\"\")\n        negative(\"var a = b\")\n        positive(\"eval(function(p,a,c,k,e,r\")\n        positive(\"eval ( function(p, a, c, k, e, r\")\n\n    def test_unpack(self):\n        \"\"\"Test unpack() function.\"\"\"\n\n        def check(inp, out):\n            return detect(inp) and self.assertEqual(unpack(inp), out)\n\n        check(\n            \"eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)\"\n            \"){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=\"\n            \"function(){return'\\\\\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(\"\n            \"new RegExp('\\\\\\\\b'+e(c)+'\\\\\\\\b','g'),k[c]);return p}('0 2=1',\"\n            \"62,3,'var||a'.split('|'),0,{}))\",\n            \"var a=1\",\n        )\n\n        check(\n            \"function test (){alert ('This is a test!')}; \"\n            \"eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String))\"\n            \"{while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function\"\n            \"(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp(\"\n            \"'\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=\\\\'{Íâ–+›ï;ã†Ù¥#\\\\'',3,3,\"\n            \"'var||a'.split('|'),0,{}))\",\n            \"function test (){alert ('This is a test!')}; var a='{Íâ–+›ï;ã†Ù¥#'\",\n        )\n\n        check(\n            \"eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c])}}return p}('2 0=\\\"4 3!\\\";2 1=0.5(/b/6);a.9(\\\"8\\\").7=1;',12,12,'str|n|var|W3Schools|Visit|search|i|innerHTML|demo|getElementById|document|w3Schools'.split('|'),0,{}))\",\n            'var str=\"Visit W3Schools!\";var n=str.search(/w3Schools/i);document.getElementById(\"demo\").innerHTML=n;',\n        )\n\n        check(\n            \"a=b;\\r\\nwhile(1){\\ng=h;{return'\\\\w+'};break;eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c])}}return p}('$(5).4(3(){$('.1').0(2);$('.6').0(d);$('.7').0(b);$('.a').0(8);$('.9').0(c)});',14,14,'html|r5e57|8080|function|ready|document|r1655|rc15b|8888|r39b0|r6ae9|3128|65309|80'.split('|'),0,{}))c=abx;\",\n            \"a=b;\\r\\nwhile(1){\\ng=h;{return'\\\\w+'};break;$(document).ready(function(){$('.r5e57').html(8080);$('.r1655').html(80);$('.rc15b').html(3128);$('.r6ae9').html(8888);$('.r39b0').html(65309)});c=abx;\",\n        )\n\n        check(\n            \"eval(function(p,a,c,k,e,r){e=function(c){return c.toString(36)};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[0-9ab]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('$(5).a(6(){ $('.8').0(1); $('.b').0(4); $('.9').0(2); $('.7').0(3)})',[],12,'html|52136|555|65103|8088|document|function|r542c|r8ce6|rb0de|ready|rfab0'.split('|'),0,{}))\",\n            \"$(document).ready(function(){ $('.r8ce6').html(52136); $('.rfab0').html(8088); $('.rb0de').html(555); $('.r542c').html(65103)})\",\n        )\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/tests/testurlencode.py",
    "content": "#\n#     written by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n\n\"\"\"Tests for urlencoded unpacker.\"\"\"\n\nimport unittest\n\nfrom jsbeautifier.unpackers.urlencode import detect, unpack\n\n# pylint: disable=R0904\n\n\nclass TestUrlencode(unittest.TestCase):\n    \"\"\"urlencode test case.\"\"\"\n\n    def test_detect(self):\n        \"\"\"Test detect() function.\"\"\"\n\n        def encoded(source):\n            return self.assertTrue(detect(source))\n\n        def unencoded(source):\n            return self.assertFalse(detect(source))\n\n        unencoded(\"\")\n        unencoded(\"var a = b\")\n        encoded(\"var%20a+=+b\")\n        encoded(\"var%20a=b\")\n        encoded(\"var%20%21%22\")\n\n    def test_unpack(self):\n        \"\"\"Test unpack function.\"\"\"\n\n        def equals(source, result):\n            return self.assertEqual(unpack(source), result)\n\n        equals(\"\", \"\")\n        equals(\"abcd\", \"abcd\")\n        equals(\"var a = b\", \"var a = b\")\n        equals(\"var%20a=b\", \"var a=b\")\n        equals(\"var%20a+=+b\", \"var a = b\")\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "python/jsbeautifier/unpackers/urlencode.py",
    "content": "#\n# Trivial bookmarklet/escaped script detector for the javascript beautifier\n#     written by Einar Lielmanis <einar@beautifier.io>\n#     rewritten in Python by Stefano Sanfilippo <a.little.coder@gmail.com>\n#\n# Will always return valid javascript: if `detect()` is false, `code` is\n# returned, unmodified.\n#\n# usage:\n#\n# some_string = urlencode.unpack(some_string)\n#\n\n\"\"\"Bookmarklet/escaped script unpacker.\"\"\"\n\n# Python 2 retrocompatibility\n# pylint: disable=F0401\n# pylint: disable=E0611\ntry:\n    from urllib import unquote_plus\nexcept ImportError:\n    from urllib.parse import unquote_plus\n\nPRIORITY = 0\n\n\ndef detect(code):\n    \"\"\"Detects if a scriptlet is urlencoded.\"\"\"\n    # the fact that script doesn't contain any space, but has %20 instead\n    # should be sufficient check for now.\n    return \" \" not in code and (\"%20\" in code or code.count(\"%\") > 3)\n\n\ndef unpack(code):\n    \"\"\"URL decode `code` source string.\"\"\"\n    return unquote_plus(code) if detect(code) else code\n"
  },
  {
    "path": "python/pyproject.toml",
    "content": "[tool.black]\ntarget-version = ['py33', 'py36', 'py37', 'py38']\nexclude = '''\n/(\n    \\.eggs\n  | \\.git\n  | \\.hg\n  | \\.mypy_cache\n  | \\.tox\n  | \\.venv\n  | _build\n  | buck-out\n  | build\n  | dist\n  | tests/generated\n)/\n'''\n"
  },
  {
    "path": "python/setup-css.py",
    "content": "#!/usr/bin/env python\n\nfrom setuptools import setup\nfrom cssbeautifier.__version__ import __version__\n\nsetup(\n    name=\"cssbeautifier\",\n    version=__version__,\n    description=\"CSS unobfuscator and beautifier.\",\n    long_description=(\"Beautify, unpack or deobfuscate CSS\"),\n    author=\"Liam Newman, Einar Lielmanis, et al.\",\n    author_email=\"team@beautifier.io\",\n    url=\"https://beautifier.io\",\n    entry_points={\"console_scripts\": [\"css-beautify = cssbeautifier:main\"]},\n    packages=[\n        \"cssbeautifier\",\n        \"cssbeautifier.tests\",\n        \"cssbeautifier.tests.generated\",\n        \"cssbeautifier.css\",\n    ],\n    install_requires=[\"jsbeautifier\", \"six>=1.13.0\", \"editorconfig>=0.12.2\"],\n    license=\"MIT\",\n)\n"
  },
  {
    "path": "python/setup-js.py",
    "content": "#!/usr/bin/env python\n\nfrom setuptools import setup\nfrom jsbeautifier.__version__ import __version__\n\nsetup(\n    name=\"jsbeautifier\",\n    version=__version__,\n    description=\"JavaScript unobfuscator and beautifier.\",\n    long_description=(\n        \"Beautify, unpack or deobfuscate JavaScript. \"\n        \"Handles popular online obfuscators.\"\n    ),\n    author=\"Liam Newman, Einar Lielmanis, et al.\",\n    author_email=\"team@beautifier.io\",\n    url=\"https://beautifier.io\",\n    entry_points={\"console_scripts\": [\"js-beautify = jsbeautifier:main\"]},\n    packages=[\n        \"jsbeautifier\",\n        \"jsbeautifier.tests\",\n        \"jsbeautifier.tests.generated\",\n        \"jsbeautifier.core\",\n        \"jsbeautifier.cli\",\n        \"jsbeautifier.javascript\",\n        \"jsbeautifier.unpackers\",\n        \"jsbeautifier.unpackers.tests\",\n    ],\n    install_requires=[\"six>=1.13.0\", \"editorconfig>=0.12.2\"],\n    license=\"MIT\",\n)\n"
  },
  {
    "path": "python/test-perf-cssbeautifier.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\nimport io\nimport os\nimport copy\nimport cssbeautifier\n\noptions = cssbeautifier.default_options()\noptions.wrap_line_length = 80\ndata = \"\"\n\n\ndef beautifier_test_github_css():\n    cssbeautifier.beautify(data, options)\n\n\ndef report_perf(fn):\n    import timeit\n\n    iter = 5\n    time = timeit.timeit(\n        fn + \"()\", setup=\"from __main__ import \" + fn + \"; gc.enable()\", number=iter\n    )\n    print(fn + \": \" + str(iter / time) + \" cycles/sec\")\n\n\nif __name__ == \"__main__\":\n    dirname = os.path.dirname(os.path.abspath(__file__))\n    github_file = os.path.join(dirname, \"../\", \"test/resources/github.css\")\n    data = copy.copy(\"\".join(io.open(github_file).readlines()))\n\n    # warm up\n    beautifier_test_github_css()\n\n    report_perf(\"beautifier_test_github_css\")\n"
  },
  {
    "path": "python/test-perf-jsbeautifier.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\nimport io\nimport os\nimport copy\nimport jsbeautifier\n\noptions = jsbeautifier.default_options()\noptions.wrap_line_length = 80\ndata = \"\"\ndata_min = \"\"\n\n\ndef beautifier_test_underscore():\n    jsbeautifier.beautify(data, options)\n\n\ndef beautifier_test_underscore_min():\n    jsbeautifier.beautify(data_min, options)\n\n\ndef beautifier_test_github_min():\n    jsbeautifier.beautify(github_min, options)\n\n\ndef report_perf(fn):\n    import timeit\n\n    iter = 5\n    time = timeit.timeit(\n        fn + \"()\", setup=\"from __main__ import \" + fn + \"; gc.enable()\", number=iter\n    )\n    print(fn + \": \" + str(iter / time) + \" cycles/sec\")\n\n\nif __name__ == \"__main__\":\n    dirname = os.path.dirname(os.path.abspath(__file__))\n    underscore_file = os.path.join(dirname, \"../\", \"test/resources/underscore.js\")\n    underscore_min_file = os.path.join(\n        dirname, \"../\", \"test/resources/underscore-min.js\"\n    )\n    github_min_file = os.path.join(dirname, \"../\", \"test/resources/github-min.js\")\n    data = copy.copy(\"\".join(io.open(underscore_file, encoding=\"UTF-8\").readlines()))\n    data_min = copy.copy(\n        \"\".join(io.open(underscore_min_file, encoding=\"UTF-8\").readlines())\n    )\n    github_min = copy.copy(\n        \"\".join(io.open(github_min_file, encoding=\"UTF-8\").readlines())\n    )\n\n    # warm up\n    beautifier_test_underscore()\n    beautifier_test_underscore_min()\n    beautifier_test_github_min()\n\n    report_perf(\"beautifier_test_underscore\")\n    report_perf(\"beautifier_test_underscore_min\")\n    report_perf(\"beautifier_test_github_min\")\n"
  },
  {
    "path": "test/data/css/node.mustache",
    "content": "/*\n{{&header_text}}\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n/*jshint unused:false */\n/*jshint strict:false */\n\nfunction run_css_tests(test_obj, Urlencoded, js_beautify, html_beautify, css_beautify)\n{\n\n    var default_opts = {\n        indent_size: 4,\n        indent_char: ' ',\n        preserve_newlines: true,\n        jslint_happy: false,\n        keep_array_indentation: false,\n        brace_style: 'collapse',\n        space_before_conditional: true,\n        break_chained_methods: false,\n        selector_separator: '\\n',\n        end_with_newline: false\n    };\n    var opts;\n\n{{#default_options}}    default_opts.{{name}} = {{&value}};\n{{/default_options}}\n\n    function reset_options()\n    {\n        opts = JSON.parse(JSON.stringify(default_opts));\n        test_name = 'css-beautify';\n    }\n\n    function test_beautifier(input)\n    {\n        return css_beautify(input, opts);\n    }\n\n    var sanitytest;\n    var test_name = '';\n\n\n    function set_name(name)\n    {\n        name = (name || '').trim();\n        if (name) {\n            test_name = name.replace(/\\r/g, '\\\\r').replace(/\\n/g, '\\\\n');\n        }\n    }\n\n    // test the input on beautifier with the current flag settings\n    // does not check the indentation / surroundings as bt() does\n    function test_fragment(input, expected)\n    {\n        var success = true;\n        sanitytest.test_function(test_beautifier, test_name);\n        expected = expected || expected === '' ? expected : input;\n        success = success && sanitytest.expect(input, expected);\n        // if the expected is different from input, run it again\n        // expected output should be unchanged when run twice.\n        if (success && expected !== input) {\n            success = success && sanitytest.expect(expected, expected);\n        }\n\n        // Everywhere we do newlines, they should be replaced with opts.eol\n        sanitytest.test_function(test_beautifier, 'eol ' + test_name);\n        opts.eol = '\\r\\\\n';\n        expected = expected.replace(/[\\n]/g, '\\r\\n');\n        opts.disabled = true;\n        success = success && sanitytest.expect(input, input || '');\n        success = success && sanitytest.expect('\\n\\n' + expected, '\\n\\n' + expected);\n        opts.disabled = false;\n        success = success && sanitytest.expect(input, expected);\n        if (success && input && input.indexOf('\\n') !== -1) {\n            input = input.replace(/[\\n]/g, '\\r\\n');\n            sanitytest.expect(input, expected);\n            // Ensure support for auto eol detection\n            opts.eol = 'auto';\n            success = success && sanitytest.expect(input, expected);\n        }\n        opts.eol = '\\n';\n        return success;\n    }\n\n    // test css\n    function t(input, expectation)\n    {\n        var success = true;\n        var wrapped_input, wrapped_expectation;\n\n        expectation = expectation || expectation === '' ? expectation : input;\n        success = success && test_fragment(input, expectation);\n\n        return success;\n    }\n\n    function unicode_char(value) {\n        return String.fromCharCode(value);\n    }\n\n    function beautifier_tests()\n    {\n        sanitytest = test_obj;\n\n        reset_options();\n        //============================================================\n        t(\".tabs {}\");\n\n{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}\n        //============================================================\n    {{^matrix}}\n        // {{&name}}\n        reset_options();\n        set_name('{{&name}}');\n        {{#options}}\n        opts.{{name}} = {{&value}};\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}};\n        {{/tests}}\n\n    {{/matrix}}\n    {{#matrix}}\n        // {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})\n        reset_options();\n        set_name('{{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})');\n        {{#options}}\n        opts.{{name}} = {{&value}};\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}};\n        {{/tests}}\n\n    {{/matrix}}\n{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}\n    }\n\n    function beautifier_unconverted_tests()\n    {\n        sanitytest = test_obj;\n\n        reset_options();\n        //============================================================\n        test_fragment(null, '');\n\n        reset_options();\n        //============================================================\n        // Test user pebkac protection, converts dash names to underscored names\n        opts[\"end-with-newline\"] = true;\n        test_fragment(null, '\\n');\n\n        reset_options();\n        //============================================================\n        // test basic css beautifier\n        t(\".tabs {}\");\n        t(\".tabs{color:red;}\", \".tabs {\\n    color: red;\\n}\");\n        t(\".tabs{color:rgb(255, 255, 0)}\", \".tabs {\\n    color: rgb(255, 255, 0)\\n}\");\n        t(\".tabs{background:url('back.jpg')}\", \".tabs {\\n    background: url('back.jpg')\\n}\");\n        t(\"#bla, #foo{color:red}\", \"#bla,\\n#foo {\\n    color: red\\n}\");\n        t(\"@media print {.tab{}}\", \"@media print {\\n    .tab {}\\n}\");\n        t(\"@media print {.tab{background-image:url(foo@2x.png)}}\", \"@media print {\\n    .tab {\\n        background-image: url(foo@2x.png)\\n    }\\n}\");\n\n        t(\"a:before {\\n\" +\n            \"    content: 'a{color:black;}\\\"\\\"\\\\'\\\\'\\\"\\\\n\\\\n\\\\na{color:black}\\';\\n\" +\n            \"}\");\n\n        //lead-in whitespace determines base-indent.\n        // lead-in newlines are stripped.\n        t(\"\\n\\na, img {padding: 0.2px}\", \"a,\\nimg {\\n    padding: 0.2px\\n}\");\n        t(\"   a, img {padding: 0.2px}\", \"   a,\\n   img {\\n       padding: 0.2px\\n   }\");\n        t(\"      \\na, img {padding: 0.2px}\", \"      a,\\n      img {\\n          padding: 0.2px\\n      }\");\n        t(\"\\n\\n     a, img {padding: 0.2px}\", \"a,\\nimg {\\n    padding: 0.2px\\n}\");\n\n        // separate selectors\n        t(\"#bla, #foo{color:red}\", \"#bla,\\n#foo {\\n    color: red\\n}\");\n        t(\"a, img {padding: 0.2px}\", \"a,\\nimg {\\n    padding: 0.2px\\n}\");\n\n        // block nesting\n        t(\"#foo {\\n    background-image: url(foo@2x.png);\\n    @font-face {\\n        font-family: 'Bitstream Vera Serif Bold';\\n        src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\\n    }\\n}\");\n        t(\"@media screen {\\n    #foo:hover {\\n        background-image: url(foo@2x.png);\\n    }\\n    @font-face {\\n        font-family: 'Bitstream Vera Serif Bold';\\n        src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\\n    }\\n}\");\n/*\n@font-face {\n    font-family: 'Bitstream Vera Serif Bold';\n    src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n}\n@media screen {\n    #foo:hover {\n        background-image: url(foo.png);\n    }\n    @media screen and (min-device-pixel-ratio: 2) {\n        @font-face {\n            font-family: 'Helvetica Neue'\n        }\n        #foo:hover {\n            background-image: url(foo@2x.png);\n        }\n    }\n}\n*/\n        t(\"@font-face {\\n    font-family: 'Bitstream Vera Serif Bold';\\n    src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\\n}\\n@media screen {\\n    #foo:hover {\\n        background-image: url(foo.png);\\n    }\\n    @media screen and (min-device-pixel-ratio: 2) {\\n        @font-face {\\n            font-family: 'Helvetica Neue'\\n        }\\n        #foo:hover {\\n            background-image: url(foo@2x.png);\\n        }\\n    }\\n}\");\n\n        // less-css cases\n        t('.well{@well-bg:@bg-color;@well-fg:@fg-color;}','.well {\\n    @well-bg: @bg-color;\\n    @well-fg: @fg-color;\\n}');\n        t('.well {&.active {\\nbox-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;}}',\n            '.well {\\n' +\n            '    &.active {\\n' +\n            '        box-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;\\n' +\n            '    }\\n' +\n            '}');\n        t('a {\\n' +\n            '    color: blue;\\n' +\n            '    &:hover {\\n' +\n            '        color: green;\\n' +\n            '    }\\n' +\n            '    & & &&&.active {\\n' +\n            '        color: green;\\n' +\n            '    }\\n' +\n            '}');\n\n        // Not sure if this is sensible\n        // but I believe it is correct to not remove the space in \"&: hover\".\n        t('a {\\n' +\n            '    &: hover {\\n' +\n            '        color: green;\\n' +\n            '    }\\n' +\n            '}');\n\n        // import\n        t('@import \"test\";');\n\n        // don't break nested pseudo-classes\n        t(\"a:first-child{color:red;div:first-child{color:black;}}\",\n            \"a:first-child {\\n    color: red;\\n    div:first-child {\\n        color: black;\\n    }\\n}\");\n\n        // handle SASS/LESS parent reference\n        t(\"div{&:first-letter {text-transform: uppercase;}}\",\n            \"div {\\n    &:first-letter {\\n        text-transform: uppercase;\\n    }\\n}\");\n\n        //nested modifiers (&:hover etc)\n        t(\".tabs{&:hover{width:10px;}}\", \".tabs {\\n    &:hover {\\n        width: 10px;\\n    }\\n}\");\n        t(\".tabs{&.big{width:10px;}}\", \".tabs {\\n    &.big {\\n        width: 10px;\\n    }\\n}\");\n        t(\".tabs{&>big{width:10px;}}\", \".tabs {\\n    &>big {\\n        width: 10px;\\n    }\\n}\");\n        t(\".tabs{&+.big{width:10px;}}\", \".tabs {\\n    &+.big {\\n        width: 10px;\\n    }\\n}\");\n\n        //nested rules\n        t(\".tabs{.child{width:10px;}}\", \".tabs {\\n    .child {\\n        width: 10px;\\n    }\\n}\");\n\n        //variables\n        t(\"@myvar:10px;.tabs{width:10px;}\", \"@myvar: 10px;\\n.tabs {\\n    width: 10px;\\n}\");\n        t(\"@myvar:10px; .tabs{width:10px;}\", \"@myvar: 10px;\\n.tabs {\\n    width: 10px;\\n}\");\n\n        //mixins\n        t(\"div{.px2rem(width,12);}\", \"div {\\n    .px2rem(width, 12);\\n}\");\n        // mixin next to 'background: url(\"...\")' should not add a line break after the comma\n        t(\"div {\\n    background: url(\\\"//test.com/dummy.png\\\");\\n    .px2rem(width, 12);\\n}\");\n\n        // test options\n        opts.indent_size = 2;\n        opts.indent_char = ' ';\n        opts.selector_separator_newline = false;\n\n        // pseudo-classes and pseudo-elements\n        t(\"#foo:hover {\\n  background-image: url(foo@2x.png)\\n}\");\n        t(\"#foo *:hover {\\n  color: purple\\n}\");\n        t(\"::selection {\\n  color: #ff0000;\\n}\");\n\n        // TODO: don't break nested pseduo-classes\n        t(\"@media screen {.tab,.bat:hover {color:red}}\", \"@media screen {\\n  .tab, .bat:hover {\\n    color: red\\n  }\\n}\");\n\n        // particular edge case with braces and semicolons inside tags that allows custom text\n        t(\"a:not(\\\"foobar\\\\\\\";{}omg\\\"){\\ncontent: 'example\\\\';{} text';\\ncontent: \\\"example\\\\\\\";{} text\\\";}\",\n            \"a:not(\\\"foobar\\\\\\\";{}omg\\\") {\\n  content: 'example\\\\';{} text';\\n  content: \\\"example\\\\\\\";{} text\\\";\\n}\");\n\n        // may not eat the space before \"[\"\n        t('html.js [data-custom=\"123\"] {\\n  opacity: 1.00;\\n}');\n        t('html.js *[data-custom=\"123\"] {\\n  opacity: 1.00;\\n}');\n    }\n\n    beautifier_tests();\n    beautifier_unconverted_tests();\n}\n\nif (typeof exports !== \"undefined\") {\n    exports.run_css_tests = run_css_tests;\n}\n"
  },
  {
    "path": "test/data/css/python.mustache",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n'''\n{{&header_text}}\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n'''\n\nimport unittest\nimport cssbeautifier\nimport copy\n\nclass CSSBeautifierTest(unittest.TestCase):\n\n    options = None\n\n    @classmethod\n    def setUpClass(cls):\n        pass\n\n    def reset_options(self):\n        false = False\n        true = True\n\n        default_options = cssbeautifier.default_options()\n        default_options.indent_size = 4\n        default_options.indent_char = ' '\n        default_options.selector_separator_newline = true\n        default_options.end_with_newline = false\n        default_options.newline_between_rules = false\n\n{{#default_options}}        default_options.{{name}} = {{&value}}\n{{/default_options}}\n\n        self.options = copy.copy(default_options)\n\n    def testGenerated(self):\n        self.reset_options()\n        test_fragment = self.decodesto\n        t = self.decodesto\n\n        false = False\n        true = True\n\n{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}\n        #============================================================\n    {{^matrix}}\n        # {{&name}}\n        self.reset_options()\n        {{#options}}\n        self.options.{{name}} = {{&value}}\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}}\n        {{/tests}}\n\n    {{/matrix}}\n    {{#matrix}}\n        # {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})\n        self.reset_options()\n        {{#options}}\n        self.options.{{name}} = {{&value}}\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}}\n        {{/tests}}\n\n    {{/matrix}}\n{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}\n\n    def testNewline(self):\n        self.reset_options()\n        t = self.decodesto\n\n        self.options.end_with_newline = True\n        t(\"\", \"\\n\")\n        t(\"\\n\", \"\\n\")\n        t(\".tabs{}\\n\", \".tabs {}\\n\")\n        t(\".tabs{}\", \".tabs {}\\n\")\n\n    def testBasics(self):\n        self.reset_options()\n        t = self.decodesto\n\n        self.reset_options()\n        #============================================================\n        t(None, \"\")\n\n        self.reset_options()\n        #============================================================\n        # Test user pebkac protection, converts dash names to underscored names\n        setattr(self.options, 'end-with-newline', True)\n        t(None, '\\n')\n        \n        self.reset_options()\n        #============================================================\n\n        t(\"\", \"\")\n        t(\"\\n\", \"\")\n        t(\".tabs{}\\n\", \".tabs {}\")\n        t(\".tabs{}\", \".tabs {}\")\n        t(\".tabs{color:red}\", \".tabs {\\n    color: red\\n}\")\n        t(\".tabs{color:rgb(255, 255, 0)}\", \".tabs {\\n    color: rgb(255, 255, 0)\\n}\")\n        t(\".tabs{background:url('back.jpg')}\", \".tabs {\\n    background: url('back.jpg')\\n}\")\n        t(\"#bla, #foo{color:red}\", \"#bla,\\n#foo {\\n    color: red\\n}\")\n        t(\"@media print {.tab{}}\", \"@media print {\\n    .tab {}\\n}\")\n        t(\"@media print {.tab{background-image:url(foo@2x.png)}}\", \"@media print {\\n    .tab {\\n        background-image: url(foo@2x.png)\\n    }\\n}\")\n\n        t(\"a:before {\\n\" +\n            \"    content: 'a{color:black;}\\\"\\\"\\\\'\\\\'\\\"\\\\n\\\\n\\\\na{color:black}\\';\\n\" +\n            \"}\")\n\n        # may not eat the space before \"[\"\n        t('html.js [data-custom=\"123\"] {\\n    opacity: 1.00;\\n}')\n        t('html.js *[data-custom=\"123\"] {\\n    opacity: 1.00;\\n}')\n\n        # lead-in whitespace determines base-indent.\n        # lead-in newlines are stripped.\n        t(\"\\n\\na, img {padding: 0.2px}\", \"a,\\nimg {\\n    padding: 0.2px\\n}\")\n        t(\"   a, img {padding: 0.2px}\", \"   a,\\n   img {\\n       padding: 0.2px\\n   }\")\n        t(\"      \\na, img {padding: 0.2px}\", \"      a,\\n      img {\\n          padding: 0.2px\\n      }\")\n        t(\"\\n\\n     a, img {padding: 0.2px}\", \"a,\\nimg {\\n    padding: 0.2px\\n}\")\n\n    def testSeperateSelectors(self):\n        self.reset_options()\n        t = self.decodesto\n\n        t(\"#bla, #foo{color:red}\", \"#bla,\\n#foo {\\n    color: red\\n}\")\n        t(\"a, img {padding: 0.2px}\", \"a,\\nimg {\\n    padding: 0.2px\\n}\")\n\n\n    def testBlockNesting(self):\n        self.reset_options()\n        t = self.decodesto\n\n        t(\"#foo {\\n    background-image: url(foo@2x.png);\\n    @font-face {\\n        font-family: 'Bitstream Vera Serif Bold';\\n        src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\\n    }\\n}\")\n        t(\"@media screen {\\n    #foo:hover {\\n        background-image: url(foo@2x.png);\\n    }\\n    @font-face {\\n        font-family: 'Bitstream Vera Serif Bold';\\n        src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\\n    }\\n}\")\n\n# @font-face {\n#     font-family: 'Bitstream Vera Serif Bold';\n#     src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\n# }\n# @media screen {\n#     #foo:hover {\n#         background-image: url(foo.png);\n#     }\n#     @media screen and (min-device-pixel-ratio: 2) {\n#         @font-face {\n#             font-family: 'Helvetica Neue'\n#         }\n#         #foo:hover {\n#             background-image: url(foo@2x.png);\n#         }\n#     }\n# }\n        t(\"@font-face {\\n    font-family: 'Bitstream Vera Serif Bold';\\n    src: url('http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf');\\n}\\n@media screen {\\n    #foo:hover {\\n        background-image: url(foo.png);\\n    }\\n    @media screen and (min-device-pixel-ratio: 2) {\\n        @font-face {\\n            font-family: 'Helvetica Neue'\\n        }\\n        #foo:hover {\\n            background-image: url(foo@2x.png);\\n        }\\n    }\\n}\")\n\n\n    def testOptions(self):\n        self.reset_options()\n        self.options.indent_size = 2\n        self.options.indent_char = ' '\n        self.options.selector_separator_newline = False\n        t = self.decodesto\n\n        # pseudo-classes and pseudo-elements\n        t(\"#foo:hover {\\n  background-image: url(foo@2x.png)\\n}\")\n        t(\"#foo *:hover {\\n  color: purple\\n}\")\n        t(\"::selection {\\n  color: #ff0000;\\n}\")\n\n        # TODO: don't break nested pseduo-classes\n        t(\"@media screen {.tab,.bat:hover {color:red}}\", \"@media screen {\\n  .tab, .bat:hover {\\n    color: red\\n  }\\n}\")\n\n        # particular edge case with braces and semicolons inside tags that allows custom text\n        t(  \"a:not(\\\"foobar\\\\\\\";{}omg\\\"){\\ncontent: 'example\\\\';{} text';\\ncontent: \\\"example\\\\\\\";{} text\\\";}\",\n            \"a:not(\\\"foobar\\\\\\\";{}omg\\\") {\\n  content: 'example\\\\';{} text';\\n  content: \\\"example\\\\\\\";{} text\\\";\\n}\")\n\n    def testLessCss(self):\n        self.reset_options()\n        t = self.decodesto\n\n        t('.well{   \\n    @well-bg:@bg-color;@well-fg:@fg-color;}','.well {\\n    @well-bg: @bg-color;\\n    @well-fg: @fg-color;\\n}')\n        t('.well {&.active {\\nbox-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;}}',\n            '.well {\\n' +\n            '    &.active {\\n' +\n            '        box-shadow: 0 1px 1px @border-color, 1px 0 1px @border-color;\\n' +\n            '    }\\n' +\n            '}')\n        t('a {\\n' +\n            '    color: blue;\\n' +\n            '    &:hover {\\n' +\n            '        color: green;\\n' +\n            '    }\\n' +\n            '    & & &&&.active {\\n' +\n            '        color: green;\\n' +\n            '    }\\n' +\n            '}')\n\n        # Not sure if this is sensible\n        # but I believe it is correct to not remove the space in \"&: hover\".\n        t('a {\\n' +\n            '    &: hover {\\n' +\n            '        color: green;\\n' +\n            '    }\\n' +\n            '}')\n\n        # import\n        t('@import \"test\";')\n\n        # don't break nested pseudo-classes\n        t(\"a:first-child{color:red;div:first-child{color:black;}}\",\n            \"a:first-child {\\n    color: red;\\n    div:first-child {\\n        color: black;\\n    }\\n}\")\n\n        # handle SASS/LESS parent reference\n        t(\"div{&:first-letter {text-transform: uppercase;}}\",\n            \"div {\\n    &:first-letter {\\n        text-transform: uppercase;\\n    }\\n}\")\n\n        # nested modifiers (&:hover etc)\n        t(\".tabs{&:hover{width:10px;}}\", \".tabs {\\n    &:hover {\\n        width: 10px;\\n    }\\n}\")\n        t(\".tabs{&.big{width:10px;}}\", \".tabs {\\n    &.big {\\n        width: 10px;\\n    }\\n}\")\n        t(\".tabs{&>big{width:10px;}}\", \".tabs {\\n    &>big {\\n        width: 10px;\\n    }\\n}\")\n        t(\".tabs{&+.big{width:10px;}}\", \".tabs {\\n    &+.big {\\n        width: 10px;\\n    }\\n}\")\n\n        # nested rules\n        t(\".tabs{.child{width:10px;}}\", \".tabs {\\n    .child {\\n        width: 10px;\\n    }\\n}\")\n\n        # variables\n        t(\"@myvar:10px;.tabs{width:10px;}\", \"@myvar: 10px;\\n.tabs {\\n    width: 10px;\\n}\")\n        t(\"@myvar:10px; .tabs{width:10px;}\", \"@myvar: 10px;\\n.tabs {\\n    width: 10px;\\n}\")\n\n    def decodesto(self, input, expectation=None):\n        if expectation == None:\n            expectation = input\n\n        self.assertMultiLineEqual(\n            cssbeautifier.beautify(input, self.options), expectation)\n\n        # if the expected is different from input, run it again\n        # expected output should be unchanged when run twice.\n        if not expectation != input:\n            self.assertMultiLineEqual(\n                cssbeautifier.beautify(expectation, self.options), expectation)\n\n        # Everywhere we do newlines, they should be replaced with opts.eol\n        self.options.eol = '\\r\\\\n'\n        expectation = expectation.replace('\\n', '\\r\\n')\n        self.options.disabled = True\n        self.assertMultiLineEqual(\n            cssbeautifier.beautify(input, self.options), input or '')\n        self.assertMultiLineEqual(\n            cssbeautifier.beautify('\\n\\n' + expectation, self.options), '\\n\\n' + expectation)\n        self.options.disabled = False;\n        self.assertMultiLineEqual(\n            cssbeautifier.beautify(input, self.options), expectation)\n        if input and input.find('\\n') != -1:\n            input = input.replace('\\n', '\\r\\n')\n            self.assertMultiLineEqual(\n                cssbeautifier.beautify(input, self.options), expectation)\n            # Ensure support for auto eol detection\n            self.options.eol = 'auto'\n            self.assertMultiLineEqual(\n                cssbeautifier.beautify(input, self.options), expectation)\n        self.options.eol = '\\n'\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "test/data/css/tests.js",
    "content": "/*\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\nexports.test_data = {\n  default_options: [\n    { name: \"indent_size\", value: \"4\" },\n    { name: \"indent_char\", value: \"' '\" },\n    { name: \"selector_separator_newline\", value: \"true\" },\n    { name: \"brace_style\", value: \"'collapse'\" },\n    { name: \"end_with_newline\", value: \"false\" },\n    { name: \"newline_between_rules\", value: \"false\" },\n    { name: \"space_around_combinator\", value: \"false\" },\n    { name: \"preserve_newlines\", value: \"false\" },\n    // deprecated\n    { name: \"space_around_selector_separator\", value: \"false\" }\n  ],\n  groups: [{\n      name: \"End With Newline\",\n      description: \"\",\n      matrix: [{\n        options: [\n          { name: \"end_with_newline\", value: \"true\" }\n        ],\n        eof: '\\\\n'\n      }, {\n        options: [\n          { name: \"end_with_newline\", value: \"false\" }\n        ],\n        eof: ''\n      }],\n      tests: [\n        { fragment: true, input: '', output: '{{eof}}' },\n        { fragment: true, input: '   .tabs{}', output: '   .tabs {}{{eof}}' },\n        { fragment: true, input: '   \\n\\n.tabs{}\\n\\n\\n\\n', output: '   .tabs {}{{eof}}' },\n        { fragment: true, input: '\\n', output: '{{eof}}' }\n      ]\n    }, {\n      name: \"Support Indent Level Options and Base Indent Autodetection\",\n      description: \"If user specifies indent level, use it. If not, autodetect indent level from starting whitespace.\",\n      matrix: [{\n        options: [\n          { name: \"indent_size\", value: \"4\" },\n          { name: \"indent_char\", value: \"' '\" },\n          { name: \"indent_with_tabs\", value: \"false\" }\n        ],\n        input_start_indent: '   ',\n        output_start_of_base: '   ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_size\", value: \"4\" },\n          { name: \"indent_char\", value: \"' '\" },\n          { name: \"indent_with_tabs\", value: \"false\" },\n          { name: \"indent_level\", value: \"0\" }\n        ],\n        input_start_indent: '   ',\n        output_start_of_base: '   ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_size\", value: \"4\" },\n          { name: \"indent_char\", value: \"' '\" },\n          { name: \"indent_with_tabs\", value: \"false\" },\n          { name: \"indent_level\", value: \"1\" }\n        ],\n        input_start_indent: '   ',\n        output_start_of_base: '    ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_size\", value: \"4\" },\n          { name: \"indent_char\", value: \"' '\" },\n          { name: \"indent_with_tabs\", value: \"false\" },\n          { name: \"indent_level\", value: \"2\" }\n        ],\n        input_start_indent: '',\n        output_start_of_base: '        ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_size\", value: \"4\" },\n          { name: \"indent_char\", value: \"' '\" },\n          { name: \"indent_with_tabs\", value: \"true\" },\n          { name: \"indent_level\", value: \"2\" }\n        ],\n        input_start_indent: '',\n        output_start_of_base: '\\t\\t',\n        i: '\\t'\n      }, {\n        options: [\n          { name: \"indent_size\", value: \"4\" },\n          { name: \"indent_char\", value: \"' '\" },\n          { name: \"indent_with_tabs\", value: \"false\" },\n          { name: \"indent_level\", value: \"0\" }\n        ],\n        input_start_indent: '\\t   ',\n        output_start_of_base: '\\t   ',\n        i: '    '\n      }],\n      tests: [\n        { fragment: true, input: '{{input_start_indent}}a', output: '{{output_start_of_base}}a' },\n        {\n          fragment: true,\n          input: [\n            '{{input_start_indent}}.a {',\n            '  text-align: right;',\n            '}'\n          ],\n          output: [\n            '{{output_start_of_base}}.a {',\n            '{{output_start_of_base}}{{i}}text-align: right;',\n            '{{output_start_of_base}}}'\n          ]\n        }, {\n          fragment: true,\n          input: [\n            '{{input_start_indent}}// This is a random comment',\n            '.a {',\n            '  text-align: right;',\n            '}'\n          ],\n          output: [\n            '{{output_start_of_base}}// This is a random comment',\n            '{{output_start_of_base}}.a {',\n            '{{output_start_of_base}}{{i}}text-align: right;',\n            '{{output_start_of_base}}}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Empty braces\",\n      description: \"\",\n      tests: [\n        { input: '.tabs{}', output: '.tabs {}' },\n        { input: '.tabs { }', output: '.tabs {}' },\n        { input: '.tabs    {    }', output: '.tabs {}' },\n        // When we support preserving newlines this will need to change\n        { input: '.tabs    \\n{\\n    \\n  }', output: '.tabs {}' }\n      ]\n    }, {\n      name: \"\",\n      description: \"\",\n      tests: [{\n        input: '#cboxOverlay {\\n    background: url(images/overlay.png) repeat 0 0;\\n    opacity: 0.9;\\n    filter: alpha(opacity = 90);\\n}',\n        output: '#cboxOverlay {\\n    background: url(images/overlay.png) repeat 0 0;\\n    opacity: 0.9;\\n    filter: alpha(opacity=90);\\n}'\n      }, {\n        comment: 'simple data uri base64 test',\n        input: 'a { background: url(data:image/gif;base64,R0lGODlhCwALAJEAAAAAAP///xUVFf///yH5BAEAAAMALAAAAAALAAsAAAIPnI+py+0/hJzz0IruwjsVADs=); }',\n        output: 'a {\\n    background: url(data:image/gif;base64,R0lGODlhCwALAJEAAAAAAP///xUVFf///yH5BAEAAAMALAAAAAALAAsAAAIPnI+py+0/hJzz0IruwjsVADs=);\\n}'\n      }, {\n        comment: 'non-base64 data',\n        input: 'a { background: url(data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E); }',\n        output: 'a {\\n    background: url(data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E);\\n}'\n      }, {\n        comment: 'Beautifier does not fix or mitigate bad data uri',\n        input: 'a { background: url(data:  image/gif   base64,R0lGODlhCwALAJEAAAAAAP///xUVFf///yH5BAEAAAMALAAAAAALAAsAAAIPnI+py+0/hJzz0IruwjsVADs=); }',\n        output: 'a {\\n    background: url(data:  image/gif   base64,R0lGODlhCwALAJEAAAAAAP///xUVFf///yH5BAEAAAMALAAAAAALAAsAAAIPnI+py+0/hJzz0IruwjsVADs=);\\n}'\n      }]\n    }, {\n      name: \"Support simple language specific option inheritance/overriding\",\n      description: \"Support simple language specific option inheritance/overriding\",\n      matrix: [{\n          options: [\n            { name: \"indent_char\", value: \"' '\" },\n            { name: \"indent_size\", value: \"4\" },\n            { name: \"js\", value: \"{ 'indent_size': 3 }\" },\n            { name: \"css\", value: \"{ 'indent_size': 5 }\" }\n          ],\n          c: '     '\n        },\n        {\n          options: [\n            { name: \"indent_char\", value: \"' '\" },\n            { name: \"indent_size\", value: \"4\" },\n            { name: \"html\", value: \"{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 } }\" }\n          ],\n          c: '    '\n        },\n        {\n          options: [\n            { name: \"indent_char\", value: \"' '\" },\n            { name: \"indent_size\", value: \"9\" },\n            { name: \"html\", value: \"{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 8 }, 'indent_size': 2}\" },\n            { name: \"js\", value: \"{ 'indent_size': 5 }\" },\n            { name: \"css\", value: \"{ 'indent_size': 3 }\" }\n          ],\n          c: '   '\n        }\n      ],\n      tests: [{\n        unchanged: [\n          '.selector {',\n          '{{c}}font-size: 12px;',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"Space Around Combinator\",\n      description: \"\",\n      matrix: [{\n        options: [{ name: \"space_around_combinator\", value: \"true\" }],\n        space: ' '\n      }, {\n        options: [{ name: \"space_around_combinator\", value: \"false\" }],\n        space: ''\n      }, {\n        // space_around_selector_separator is deprecated, but needs to keep working for now.\n        options: [{ name: \"space_around_selector_separator\", value: \"true\" }],\n        space: ' '\n      }],\n      tests: [\n        { input: 'a>b{}', output: 'a{{space}}>{{space}}b {}' },\n        { input: 'a~b{}', output: 'a{{space}}~{{space}}b {}' },\n        { input: 'a+b{}', output: 'a{{space}}+{{space}}b {}' },\n        { input: 'a+b>c{}', output: 'a{{space}}+{{space}}b{{space}}>{{space}}c {}' },\n        { input: 'a > b{}', output: 'a{{space}}>{{space}}b {}' },\n        { input: 'a ~ b{}', output: 'a{{space}}~{{space}}b {}' },\n        { input: 'a + b{}', output: 'a{{space}}+{{space}}b {}' },\n        { input: 'a + b > c{}', output: 'a{{space}}+{{space}}b{{space}}>{{space}}c {}' },\n        {\n          input: 'a > b{width: calc(100% + 45px);}',\n          output: [\n            'a{{space}}>{{space}}b {',\n            '    width: calc(100% + 45px);',\n            '}'\n          ]\n        },\n        {\n          input: 'a ~ b{width: calc(100% + 45px);}',\n          output: [\n            'a{{space}}~{{space}}b {',\n            '    width: calc(100% + 45px);',\n            '}'\n          ]\n        },\n        {\n          input: 'a + b{width: calc(100% + 45px);}',\n          output: [\n            'a{{space}}+{{space}}b {',\n            '    width: calc(100% + 45px);',\n            '}'\n          ]\n        },\n        {\n          input: 'a + b > c{width: calc(100% + 45px);}',\n          output: [\n            'a{{space}}+{{space}}b{{space}}>{{space}}c {',\n            '    width: calc(100% + 45px);',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Issue 1373 -- Correct spacing around [attribute~=value]\",\n      description: \"\",\n      tests: [{\n        unchanged: 'header>div[class~=\"div-all\"]'\n      }]\n    }, {\n      name: 'Selector Separator',\n      description: '',\n      matrix: [{\n        options: [\n          { name: 'selector_separator_newline', value: 'false' },\n          { name: 'selector_separator', value: '\" \"' },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        separator: ' ',\n        separator1: ' ',\n        curly_separator: ' ',\n        curly_separator2: ' ',\n        new_rule: '\\n',\n        first_nested_rule: ''\n      }, {\n        options: [\n          { name: 'selector_separator_newline', value: 'false' },\n          { name: 'selector_separator', value: '\" \"' },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        separator: ' ',\n        separator1: ' ',\n        curly_separator: ' ',\n        curly_separator2: ' ',\n        new_rule: '',\n        first_nested_rule: ''\n      }, {\n        options: [\n          { name: 'selector_separator_newline', value: 'false' },\n          { name: 'selector_separator', value: '\"  \"' },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        // BUG: #713\n        separator: ' ',\n        separator1: ' ',\n        curly_separator: ' ',\n        curly_separator2: ' ',\n        new_rule: '',\n        first_nested_rule: ''\n      }, {\n        options: [\n          { name: 'selector_separator_newline', value: 'true' },\n          { name: 'selector_separator', value: '\" \"' },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        separator: '\\\\n',\n        separator1: '\\\\n\\    ',\n        curly_separator: ' ',\n        curly_separator2: ' ',\n        new_rule: '\\n',\n        first_nested_rule: '\\n' // bug #1489\n      }, {\n        options: [\n          { name: 'selector_separator_newline', value: 'true' },\n          { name: 'selector_separator', value: '\" \"' },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        separator: '\\\\n',\n        separator1: '\\\\n\\    ',\n        curly_separator: ' ',\n        curly_separator2: ' ',\n        new_rule: '',\n        first_nested_rule: ''\n      }, {\n        options: [\n          { name: 'selector_separator_newline', value: 'true' },\n          { name: 'selector_separator', value: '\"  \"' },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        separator: '\\\\n',\n        separator1: '\\\\n\\    ',\n        curly_separator: ' ',\n        curly_separator2: ' ',\n        new_rule: '',\n        new_rule_bug: ''\n      }, {\n        options: [\n          { name: 'selector_separator_newline', value: 'true' },\n          { name: 'selector_separator', value: '\"  \"' },\n          { name: 'brace_style', value: '\"expand\"' },\n          { name: 'newline_between_rules', value: 'false' }\n        ],\n        separator: '\\\\n',\n        separator1: '\\\\n\\    ',\n        curly_separator: '\\\\n',\n        curly_separator2: '\\\\n    ',\n        new_rule: '',\n        new_rule_bug: ''\n      }],\n      tests: [{\n          input: '#bla, #foo{color:green}',\n          output: '#bla,{{separator}}#foo{{curly_separator}}{\\n    color: green\\n}'\n        },\n        {\n          input: '#bla, #foo{color:green}\\n#bla, #foo{color:green}',\n          output: [\n            '#bla,{{separator}}#foo{{curly_separator}}{',\n            '    color: green',\n            '}{{new_rule}}',\n            '#bla,{{separator}}#foo{{curly_separator}}{',\n            '    color: green',\n            '}'\n          ]\n        },\n        {\n          input: '@media print {.tab{}}',\n          output: '@media print{{curly_separator}}{\\n    .tab{{curly_separator2}}{}\\n}'\n        },\n        {\n          comment: 'This is bug #1489',\n          input: '@media print {.tab,.bat{}}',\n          output: '@media print{{curly_separator}}{\\n{{first_nested_rule}}    .tab,{{separator1}}.bat{{curly_separator2}}{}\\n}'\n        },\n        {\n          comment: 'This is bug #1489',\n          input: '@media print {// comment\\n//comment 2\\n.bat{}}',\n          output: [\n            '@media print{{curly_separator}}{',\n            '{{new_rule}}    // comment',\n            '    //comment 2',\n            '    .bat{{curly_separator2}}{}',\n            '}'\n          ]\n        },\n        {\n          input: '#bla, #foo{color:black}',\n          output: '#bla,{{separator}}#foo{{curly_separator}}{\\n    color: black\\n}'\n        },\n        {\n          input: 'a:first-child,a:first-child{color:red;div:first-child,div:hover{color:black;}}\\na:first-child,a:first-child{color:red;div:first-child,div:hover{color:black;}}',\n          output: [\n            'a:first-child,{{separator}}a:first-child{{curly_separator}}{',\n            '    color: red;{{new_rule}}',\n            '    div:first-child,{{separator1}}div:hover{{curly_separator2}}{',\n            '        color: black;',\n            '    }',\n            '}',\n            '{{new_rule}}a:first-child,{{separator}}a:first-child{{curly_separator}}{',\n            '    color: red;{{new_rule}}',\n            '    div:first-child,{{separator1}}div:hover{{curly_separator2}}{',\n            '        color: black;',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Preserve Newlines\",\n      description: \"\",\n      matrix: [{\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" }\n        ],\n        separator_input: '\\\\n\\\\n',\n        separator_output: '\\\\n\\\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" }\n        ],\n        separator_input: '\\\\n\\\\n',\n        separator_output: '\\\\n'\n      }],\n      tests: [\n        { input: '.div {}{{separator_input}}.span {}', output: '.div {}{{separator_output}}.span {}' },\n        { input: '#bla, #foo{\\n    color:black;{{separator_input}}    font-size: 12px;\\n}', output: '#bla,\\n#foo {\\n    color: black;{{separator_output}}    font-size: 12px;\\n}' }\n      ]\n    },\n    {\n      name: \"Preserve Newlines and newline_between_rules\",\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"newline_between_rules\", value: \"true\" }\n      ],\n      tests: [\n        { input: '.div {}.span {}', output: '.div {}\\n\\n.span {}' },\n        { input: '#bla, #foo{\\n    color:black;\\n    font-size: 12px;\\n}', output: '#bla,\\n#foo {\\n    color: black;\\n    font-size: 12px;\\n}' },\n        { input: '#bla, #foo{\\n    color:black;\\n\\n\\n    font-size: 12px;\\n}', output: '#bla,\\n#foo {\\n    color: black;\\n\\n\\n    font-size: 12px;\\n}' },\n        { unchanged: '#bla,\\n\\n#foo {\\n    color: black;\\n    font-size: 12px;\\n}' },\n        { unchanged: 'a {\\n    b: c;\\n\\n\\n    d: {\\n        e: f;\\n    }\\n}' },\n        { unchanged: '.div {}\\n\\n.span {}' },\n        { unchanged: 'html {}\\n\\n/*this is a comment*/' },\n        { unchanged: '.div {\\n    a: 1;\\n\\n\\n    b: 2;\\n}\\n\\n\\n\\n.span {\\n    a: 1;\\n}' },\n        { unchanged: '.div {\\n\\n\\n    a: 1;\\n\\n\\n    b: 2;\\n}\\n\\n\\n\\n.span {\\n    a: 1;\\n}' },\n        { unchanged: '@media screen {\\n    .div {\\n        a: 1;\\n\\n\\n        b: 2;\\n    }\\n\\n\\n\\n    .span {\\n        a: 1;\\n    }\\n}\\n\\n.div {}\\n\\n.span {}' }\n      ]\n    }, {\n      name: \"Preserve Newlines and add tabs\",\n      options: [{ name: \"preserve_newlines\", value: \"true\" }],\n      description: \"\",\n      tests: [{\n        input: '.tool-tip {\\n    position: relative;\\n\\n        \\n    .tool-tip-content {\\n        &>* {\\n            margin-top: 0;\\n        }\\n        \\n\\n        .mixin-box-shadow(.2rem .2rem .5rem rgba(0, 0, 0, .15));\\n        padding: 1rem;\\n        position: absolute;\\n        z-index: 10;\\n    }\\n}',\n        output: '.tool-tip {\\n    position: relative;\\n\\n\\n    .tool-tip-content {\\n        &>* {\\n            margin-top: 0;\\n        }\\n\\\\n\\\\n        .mixin-box-shadow(.2rem .2rem .5rem rgba(0, 0, 0, .15));\\n        padding: 1rem;\\n        position: absolute;\\n        z-index: 10;\\n    }\\n}'\n      }]\n    }, {\n      name: \"Issue #1338 -- Preserve Newlines within CSS rules\",\n      options: [{ name: \"preserve_newlines\", value: \"true\" }],\n      description: \"\",\n      tests: [{\n        unchanged: 'body {\\n    grid-template-areas:\\n        \"header header\"\\n        \"main   sidebar\"\\n        \"footer footer\";\\n}'\n      }]\n    }, {\n      name: \"Newline Between Rules\",\n      description: \"\",\n      matrix: [{\n        options: [\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        new_rule: '\\n'\n      }, {\n        options: [\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        new_rule: ''\n      }],\n      tests: [\n        { input: '.div {}\\n.span {}', output: '.div {}\\n{{new_rule}}.span {}' },\n        { input: '.div{}\\n   \\n.span{}', output: '.div {}\\n{{new_rule}}.span {}' },\n        { input: '.div {}    \\n  \\n.span { } \\n', output: '.div {}\\n{{new_rule}}.span {}' },\n        { input: '.div {\\n    \\n} \\n  .span {\\n }  ', output: '.div {}\\n{{new_rule}}.span {}' },\n        {\n          input: '.selector1 {\\n    margin: 0; /* This is a comment including an url http://domain.com/path/to/file.ext */\\n}\\n.div{height:15px;}',\n          output: '.selector1 {\\n    margin: 0;\\n    /* This is a comment including an url http://domain.com/path/to/file.ext */\\n}\\n{{new_rule}}.div {\\n    height: 15px;\\n}'\n        },\n        { input: '.tabs{width:10px;//end of line comment\\nheight:10px;//another\\n}\\n.div{height:15px;}', output: '.tabs {\\n    width: 10px; //end of line comment\\n    height: 10px; //another\\n}\\n{{new_rule}}.div {\\n    height: 15px;\\n}' },\n        { input: '#foo {\\n    background-image: url(foo@2x.png);\\n    @font-face {\\n        font-family: \"Bitstream Vera Serif Bold\";\\n        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");\\n    }\\n}\\n.div{height:15px;}', output: '#foo {\\n    background-image: url(foo@2x.png);\\n{{new_rule}}    @font-face {\\n        font-family: \"Bitstream Vera Serif Bold\";\\n        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");\\n    }\\n}\\n{{new_rule}}.div {\\n    height: 15px;\\n}' },\n        { input: '@media screen {\\n    #foo:hover {\\n        background-image: url(foo@2x.png);\\n    }\\n    @font-face {\\n        font-family: \"Bitstream Vera Serif Bold\";\\n        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");\\n    }\\n}\\n.div{height:15px;}', output: '@media screen {\\n    #foo:hover {\\n        background-image: url(foo@2x.png);\\n    }\\n{{new_rule}}    @font-face {\\n        font-family: \"Bitstream Vera Serif Bold\";\\n        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");\\n    }\\n}\\n{{new_rule}}.div {\\n    height: 15px;\\n}' },\n        { input: '@font-face {\\n    font-family: \"Bitstream Vera Serif Bold\";\\n    src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");\\n}\\n@media screen {\\n    #foo:hover {\\n        background-image: url(foo.png);\\n    }\\n    @media screen and (min-device-pixel-ratio: 2) {\\n        @font-face {\\n            font-family: \"Helvetica Neue\"\\n        }\\n        #foo:hover {\\n            background-image: url(foo@2x.png);\\n        }\\n    }\\n}', output: '@font-face {\\n    font-family: \"Bitstream Vera Serif Bold\";\\n    src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");\\n}\\n{{new_rule}}@media screen {\\n    #foo:hover {\\n        background-image: url(foo.png);\\n    }\\n{{new_rule}}    @media screen and (min-device-pixel-ratio: 2) {\\n        @font-face {\\n            font-family: \"Helvetica Neue\"\\n        }\\n{{new_rule}}        #foo:hover {\\n            background-image: url(foo@2x.png);\\n        }\\n    }\\n}' },\n        { input: 'a:first-child{color:red;div:first-child{color:black;}}\\n.div{height:15px;}', output: 'a:first-child {\\n    color: red;\\n{{new_rule}}    div:first-child {\\n        color: black;\\n    }\\n}\\n{{new_rule}}.div {\\n    height: 15px;\\n}' },\n        { input: 'a:first-child{color:red;div:not(.peq){color:black;}}\\n.div{height:15px;}', output: 'a:first-child {\\n    color: red;\\n{{new_rule}}    div:not(.peq) {\\n        color: black;\\n    }\\n}\\n{{new_rule}}.div {\\n    height: 15px;\\n}' },\n        {\n          input_: [\n            '.list-group {',\n            '    .list-group-item {',\n            '    }',\n            '',\n            '    .list-group-icon {',\n            '    }',\n            '}',\n            '',\n            '.list-group-condensed {',\n            '}'\n          ],\n          output: [\n            '.list-group {',\n            '    .list-group-item {}',\n            '{{new_rule}}    .list-group-icon {}',\n            '}',\n            '{{new_rule}}.list-group-condensed {}'\n          ]\n        },\n        {\n          input_: [\n            '.list-group {',\n            '    .list-group-item {',\n            '        a:1',\n            '    }',\n            '    .list-group-item {',\n            '        a:1',\n            '    }',\n            '    .list-group-icon {',\n            '    }',\n            '    .list-group-icon {',\n            '    }',\n            '}',\n            '.list-group-condensed {',\n            '}'\n          ],\n          output: [\n            '.list-group {',\n            '    .list-group-item {',\n            '        a: 1',\n            '    }',\n            '{{new_rule}}    .list-group-item {',\n            '        a: 1',\n            '    }',\n            '{{new_rule}}    .list-group-icon {}',\n            '{{new_rule}}    .list-group-icon {}',\n            '}',\n            '{{new_rule}}.list-group-condensed {}'\n          ]\n        },\n        {\n          input_: [\n            '.list-group {',\n            '    .list-group-item {',\n            '        a:1',\n            '    }',\n            '    //this is my pre-comment',\n            '    .list-group-item {',\n            '        a:1',\n            '    }',\n            '    //this is a comment',\n            '    .list-group-icon {',\n            '    }',\n            '    //this is also a comment',\n            '    .list-group-icon {',\n            '    }',\n            '}',\n            '.list-group-condensed {',\n            '}'\n          ],\n          output: [\n            '.list-group {',\n            '    .list-group-item {',\n            '        a: 1',\n            '    }',\n            '{{new_rule}}    //this is my pre-comment',\n            '    .list-group-item {',\n            '        a: 1',\n            '    }',\n            '{{new_rule}}    //this is a comment',\n            '    .list-group-icon {}',\n            '{{new_rule}}    //this is also a comment',\n            '    .list-group-icon {}',\n            '}',\n            '{{new_rule}}.list-group-condensed {}'\n          ]\n        },\n        {\n          input_: [\n            '.list-group {',\n            '    color: #38a0e5;',\n            '    .list-group-item {',\n            '        a:1',\n            '    }',\n            '    color: #38a0e5;',\n            '    .list-group-item {',\n            '        a:1',\n            '    }',\n            'color: #38a0e5;',\n            '    .list-group-icon {',\n            '    }',\n            '    color: #38a0e5;',\n            '    .list-group-icon {',\n            '    }',\n            '}',\n            'color: #38a0e5;',\n            '.list-group-condensed {',\n            '}'\n          ],\n          output: [\n            '.list-group {',\n            '    color: #38a0e5;',\n            '{{new_rule}}    .list-group-item {',\n            '        a: 1',\n            '    }',\n            '{{new_rule}}    color: #38a0e5;',\n            '{{new_rule}}    .list-group-item {',\n            '        a: 1',\n            '    }',\n            '{{new_rule}}    color: #38a0e5;',\n            '{{new_rule}}    .list-group-icon {}',\n            '{{new_rule}}    color: #38a0e5;',\n            '{{new_rule}}    .list-group-icon {}',\n            '}',\n            '{{new_rule}}color: #38a0e5;',\n            '{{new_rule}}.list-group-condensed {}'\n          ]\n        },\n        {\n          input_: [\n            '@media only screen and (max-width: 40em) {',\n            'header {',\n            '    margin: 0 auto;',\n            '    padding: 10px;',\n            '    background: red;',\n            '    }',\n            'main {',\n            '    margin: 20px auto;',\n            '    padding: 4px;',\n            '    background: blue;',\n            '    }',\n            '}'\n          ],\n          output: [\n            '@media only screen and (max-width: 40em) {',\n            '    header {',\n            '        margin: 0 auto;',\n            '        padding: 10px;',\n            '        background: red;',\n            '    }',\n            '{{new_rule}}    main {',\n            '        margin: 20px auto;',\n            '        padding: 4px;',\n            '        background: blue;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          input_: [\n            '.preloader {',\n            '    height: 20px;',\n            '    .line {',\n            '        width: 1px;',\n            '        height: 12px;',\n            '        background: #38a0e5;',\n            '        margin: 0 1px;',\n            '        display: inline-block;',\n            '        &.line-1 {',\n            '            animation-delay: 800ms;',\n            '        }',\n            '        &.line-2 {',\n            '            animation-delay: 600ms;',\n            '        }',\n            '    }',\n            '    div {',\n            '        color: #38a0e5;',\n            '        font-family: \"Arial\", sans-serif;',\n            '        font-size: 10px;',\n            '        margin: 5px 0;',\n            '    }',\n            '}'\n          ],\n          output: [\n            '.preloader {',\n            '    height: 20px;',\n            '{{new_rule}}    .line {',\n            '        width: 1px;',\n            '        height: 12px;',\n            '        background: #38a0e5;',\n            '        margin: 0 1px;',\n            '        display: inline-block;',\n            '{{new_rule}}        &.line-1 {',\n            '            animation-delay: 800ms;',\n            '        }',\n            '{{new_rule}}        &.line-2 {',\n            '            animation-delay: 600ms;',\n            '        }',\n            '    }',\n            '{{new_rule}}    div {',\n            '        color: #38a0e5;',\n            '        font-family: \"Arial\", sans-serif;',\n            '        font-size: 10px;',\n            '        margin: 5px 0;',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Functions braces\",\n      description: \"\",\n      tests: [\n        { input: '.tabs(){}', output: '.tabs() {}' },\n        { input: '.tabs (){}', output: '.tabs () {}' },\n        { input: '.tabs (pa, pa(1,2)), .cols { }', output: '.tabs (pa, pa(1, 2)),\\n.cols {}' },\n        { input: '.tabs(pa, pa(1,2)), .cols { }', output: '.tabs(pa, pa(1, 2)),\\n.cols {}' },\n        { input: '.tabs (   )   {    }', output: '.tabs () {}' },\n        { input: '.tabs(   )   {    }', output: '.tabs() {}' },\n        { input: '.tabs  (t, t2)  \\n{\\n  key: val(p1  ,p2);  \\n  }', output: '.tabs (t, t2) {\\n    key: val(p1, p2);\\n}' },\n        { unchanged: '.box-shadow(@shadow: 0 1px 3px rgba(0, 0, 0, .25)) {\\n    -webkit-box-shadow: @shadow;\\n    -moz-box-shadow: @shadow;\\n    box-shadow: @shadow;\\n}' }\n      ]\n    }, {\n      name: \"Beautify preserve formatting\",\n      description: \"Allow beautifier to preserve sections\",\n      options: [\n        { name: \"indent_size\", value: \"4\" },\n        { name: \"indent_char\", value: \"' '\" },\n        { name: \"preserve_newlines\", value: \"true\" }\n      ],\n      tests: [\n        // Preserve not yet supported\n        // { unchanged: \"/* beautify preserve:start */\\n/* beautify preserve:end */\" },\n        // { unchanged: \"/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\" },\n        // { unchanged: \"var a = 1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\" },\n        // { unchanged: \"/* beautify preserve:start */     {asdklgh;y;;{}dd2d}/* beautify preserve:end */\" },\n        // {\n        //   input_: \"var a =  1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\",\n        //   output: \"var a = 1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\"\n        // },\n        // {\n        //   input_: \"var a = 1;\\n /* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\",\n        //   output: \"var a = 1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\"\n        // },\n        // {\n        //   unchanged: [\n        //     'var a = {',\n        //     '    /* beautify preserve:start */',\n        //     '    one   :  1',\n        //     '    two   :  2,',\n        //     '    three :  3,',\n        //     '    ten   : 10',\n        //     '    /* beautify preserve:end */',\n        //     '};'\n        //   ]\n        // },\n        // {\n        //   input: [\n        //     'var a = {',\n        //     '/* beautify preserve:start */',\n        //     '    one   :  1,',\n        //     '    two   :  2,',\n        //     '    three :  3,',\n        //     '    ten   : 10',\n        //     '/* beautify preserve:end */',\n        //     '};'\n        //   ],\n        //   output: [\n        //     'var a = {',\n        //     '    /* beautify preserve:start */',\n        //     '    one   :  1,',\n        //     '    two   :  2,',\n        //     '    three :  3,',\n        //     '    ten   : 10',\n        //     '/* beautify preserve:end */',\n        //     '};'\n        //   ]\n        // },\n        // {\n        //   comment: 'one space before and after required, only single spaces inside.',\n        //   input: [\n        //     'var a = {',\n        //     '/*  beautify preserve:start  */',\n        //     '    one   :  1,',\n        //     '    two   :  2,',\n        //     '    three :  3,',\n        //     '    ten   : 10',\n        //     '};'\n        //   ],\n        //   output: [\n        //     'var a = {',\n        //     '    /*  beautify preserve:start  */',\n        //     '    one: 1,',\n        //     '    two: 2,',\n        //     '    three: 3,',\n        //     '    ten: 10',\n        //     '};'\n        //   ]\n        // },\n        // {\n        //   input: [\n        //     'var a = {',\n        //     '/*beautify preserve:start*/',\n        //     '    one   :  1,',\n        //     '    two   :  2,',\n        //     '    three :  3,',\n        //     '    ten   : 10',\n        //     '};'\n        //   ],\n        //   output: [\n        //     'var a = {',\n        //     '    /*beautify preserve:start*/',\n        //     '    one: 1,',\n        //     '    two: 2,',\n        //     '    three: 3,',\n        //     '    ten: 10',\n        //     '};'\n        //   ]\n        // },\n        // {\n        //   input: [\n        //     'var a = {',\n        //     '/*beautify  preserve:start*/',\n        //     '    one   :  1,',\n        //     '    two   :  2,',\n        //     '    three :  3,',\n        //     '    ten   : 10',\n        //     '};'\n        //   ],\n        //   output: [\n        //     'var a = {',\n        //     '    /*beautify  preserve:start*/',\n        //     '    one: 1,',\n        //     '    two: 2,',\n        //     '    three: 3,',\n        //     '    ten: 10',\n        //     '};'\n        //   ]\n        // },\n\n        {\n          comment: 'Directive: ignore',\n          unchanged: \"/* beautify ignore:start */\\n/* beautify ignore:end */\"\n        },\n        { unchanged: \"/* beautify ignore:start */\\n   var a,,,{ 1;\\n .div {}/* beautify ignore:end */\" },\n        { unchanged: \".div {}\\n\\n/* beautify ignore:start */\\n   .div {}var a = 1;\\n/* beautify ignore:end */\" },\n        {\n          comment: 'ignore starts _after_ the start comment, ends after the end comment',\n          unchanged: \"/* beautify ignore:start */     {asdklgh;y;+++;dd2d}/* beautify ignore:end */\"\n        },\n        { unchanged: \"/* beautify ignore:start */  {asdklgh;y;+++;dd2d}    /* beautify ignore:end */\" },\n        {\n          input_: \".div {}/* beautify ignore:start */\\n   .div {}var a,,,{ 1;\\n/*beautify ignore:end*/\",\n          output: \".div {}\\n/* beautify ignore:start */\\n   .div {}var a,,,{ 1;\\n/*beautify ignore:end*/\"\n        },\n        {\n          input_: \".div {}\\n  /* beautify ignore:start */\\n   .div {}var a,,,{ 1;\\n/* beautify ignore:end */\",\n          output: \".div {}\\n/* beautify ignore:start */\\n   .div {}var a,,,{ 1;\\n/* beautify ignore:end */\"\n        },\n        {\n          unchanged: [\n            '.div {',\n            '    /* beautify ignore:start */',\n            '    one   :  1',\n            '    two   :  2,',\n            '    three :  {',\n            '    ten   : 10',\n            '    /* beautify ignore:end */',\n            '}'\n          ]\n        },\n        {\n          input: [\n            '.div {',\n            '/* beautify ignore:start */',\n            '    one   :  1',\n            '    two   :  2,',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '}'\n          ],\n          output: [\n            '.div {',\n            '    /* beautify ignore:start */',\n            '    one   :  1',\n            '    two   :  2,',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '}'\n          ]\n        },\n        // {\n        //   comment: 'Directives - multiple and interacting',\n        //   input: [\n        //     'var a = {',\n        //     '/* beautify preserve:start */',\n        //     '/* beautify preserve:start */',\n        //     '    one   :  1,',\n        //     '  /* beautify preserve:end */',\n        //     '    two   :  2,',\n        //     '    three :  3,',\n        //     '/* beautify preserve:start */',\n        //     '    ten   : 10',\n        //     '/* beautify preserve:end */',\n        //     '};'\n        //   ],\n        //   output: [\n        //     'var a = {',\n        //     '    /* beautify preserve:start */',\n        //     '/* beautify preserve:start */',\n        //     '    one   :  1,',\n        //     '  /* beautify preserve:end */',\n        //     '    two: 2,',\n        //     '    three: 3,',\n        //     '    /* beautify preserve:start */',\n        //     '    ten   : 10',\n        //     '/* beautify preserve:end */',\n        //     '};'\n        //   ]\n        // },\n        {\n          input: [\n            '.div {',\n            '/* beautify ignore:start */',\n            '    one   :  1',\n            ' /* beautify ignore:end */',\n            '    two   :  2,',\n            '/* beautify ignore:start */',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '}'\n          ],\n          output: [\n            '.div {',\n            '    /* beautify ignore:start */',\n            '    one   :  1',\n            ' /* beautify ignore:end */',\n            '    two : 2,',\n            '    /* beautify ignore:start */',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '}'\n          ]\n        }\n        // ,{\n        //   comment: 'Starts can occur together, ignore:end must occur alone.',\n        //   input: [\n        //     '.div {',\n        //     '/* beautify ignore:start */',\n        //     '    one   :  1',\n        //     '    NOTE: ignore end block does not support starting other directives',\n        //     '    This does not match the ending the ignore...',\n        //     ' /* beautify ignore:end preserve:start */',\n        //     '    two   :  2,',\n        //     '/* beautify ignore:start */',\n        //     '    three :  {',\n        //     '    ten   : 10',\n        //     '    ==The next comment ends the starting ignore==',\n        //     '/* beautify ignore:end */',\n        //     '}'\n        //   ],\n        //   output: [\n        //     '.div {',\n        //     '    /* beautify ignore:start */',\n        //     '    one   :  1',\n        //     '    NOTE: ignore end block does not support starting other directives',\n        //     '    This does not match the ending the ignore...',\n        //     ' /* beautify ignore:end preserve:start */',\n        //     '    two   :  2,',\n        //     '/* beautify ignore:start */',\n        //     '    three :  {',\n        //     '    ten   : 10',\n        //     '    ==The next comment ends the starting ignore==',\n        //     '/* beautify ignore:end */',\n        //     '}'\n        //   ]\n        // },\n        // {\n        //   input: [\n        //     '.div {',\n        //     '/* beautify ignore:start preserve:start */',\n        //     '    one   :  {',\n        //     ' /* beautify ignore:end */',\n        //     '    two   :  2,',\n        //     '  /* beautify ignore:start */',\n        //     '    three :  {',\n        //     '/* beautify ignore:end */',\n        //     '    ten   : 10',\n        //     '   // This is all preserved',\n        //     '}'\n        //   ],\n        //   output: [\n        //     '.div {',\n        //     '    /* beautify ignore:start preserve:start */',\n        //     '    one   :  {',\n        //     ' /* beautify ignore:end */',\n        //     '    two   :  2,',\n        //     '  /* beautify ignore:start */',\n        //     '    three :  {',\n        //     '/* beautify ignore:end */',\n        //     '    ten   : 10',\n        //     '   // This is all preserved',\n        //     '}'\n        //   ]\n        // },\n        // {\n        //   input: [\n        //     'var a = {',\n        //     '/* beautify ignore:start preserve:start */',\n        //     '    one   :  {',\n        //     ' /* beautify ignore:end */',\n        //     '    two   :  2,',\n        //     '  /* beautify ignore:start */',\n        //     '    three :  {',\n        //     '/* beautify ignore:end */',\n        //     '    ten   : 10,',\n        //     '/* beautify preserve:end */',\n        //     '     eleven: 11',\n        //     '};'\n        //   ],\n        //   output: [\n        //     'var a = {',\n        //     '    /* beautify ignore:start preserve:start */',\n        //     '    one   :  {',\n        //     ' /* beautify ignore:end */',\n        //     '    two   :  2,',\n        //     '  /* beautify ignore:start */',\n        //     '    three :  {',\n        //     '/* beautify ignore:end */',\n        //     '    ten   : 10,',\n        //     '/* beautify preserve:end */',\n        //     '    eleven: 11',\n        //     '};'\n        //   ]\n        // }\n      ]\n    },\n    {\n      name: \"Comments\",\n      description: \"With preserve newlines option on\",\n      template: \"< >\",\n      matrix: [{\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        i: '',\n        i1: '\\n',\n        o: '\\n',\n        new_rule: '\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        i: '\\n\\n\\n',\n        i1: '\\n\\n\\n',\n        o: '\\n',\n        new_rule: '\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        i: '\\n        \\n    \\n',\n        i1: '\\n            \\n   \\n',\n        o: '\\n',\n        new_rule: '\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        i: '',\n        i1: '\\n',\n        o: '\\n',\n        new_rule: '\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        i: '\\n',\n        i1: '\\n',\n        o: '\\n',\n        new_rule: '\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        i: '\\n        \\n    \\n',\n        i1: '\\n            \\n   \\n',\n        o: '\\n\\n\\n',\n        new_rule: '\\n\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"false\" }\n        ],\n        i: '\\n\\n\\n',\n        i1: '\\n\\n\\n',\n        o: '\\n\\n\\n',\n        new_rule: '\\n\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        i: '',\n        i1: '\\n',\n        o: '\\n',\n        new_rule: '\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        i: '\\n\\n\\n',\n        i1: '\\n\\n\\n',\n        o: '\\n',\n        new_rule: '\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        i: '\\n        \\n    \\n',\n        i1: '\\n            \\n   \\n',\n        o: '\\n',\n        new_rule: '\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        i: '',\n        i1: '\\n',\n        o: '\\n',\n        new_rule: '\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        i: '\\n',\n        i1: '\\n',\n        o: '\\n',\n        new_rule: '\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        i: '\\n\\n\\n',\n        i1: '\\n\\n\\n',\n        o: '\\n\\n\\n',\n        new_rule: '\\n\\n\\n'\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        i: '\\n        \\n    \\n',\n        i1: '\\n            \\n   \\n',\n        o: '\\n\\n\\n',\n        new_rule: '\\n\\n\\n'\n      }],\n      tests: [\n        { unchanged: '/* header comment newlines on */' },\n        {\n          input: [\n            '@import \"custom.css\";<i>.rule{}'\n          ],\n          output: [\n            '@import \"custom.css\";<new_rule>.rule {}'\n          ]\n        },\n        { input: '.tabs{<i>/* test */<i>}', output: '.tabs {<o>    /* test */<o>}' },\n        {\n          comment: '#1185',\n          input: '/* header */<i>.tabs{}',\n          output: '/* header */<o>.tabs {}'\n        },\n        { input: '.tabs {<i>/* non-header */<i>width:10px;<i>}', output: '.tabs {<o>    /* non-header */<o>    width: 10px;<o>}' },\n        { unchanged: '/* header' },\n        { unchanged: '// comment' },\n        { unchanged: '/*' },\n        { unchanged: '//' },\n        {\n          input: '.selector1 {<i>margin: 0;<i>/* This is a comment including an url http://domain.com/path/to/file.ext */<i>}',\n          output: '.selector1 {<o>    margin: 0;<o>    /* This is a comment including an url http://domain.com/path/to/file.ext */<o>}'\n        },\n\n        {\n          comment: \"single line comment support (less/sass)\",\n          input: '.tabs{<i>// comment<i1>width:10px;<i>}',\n          output: '.tabs {<o>    // comment<o>    width: 10px;<o>}'\n        },\n        { input: '.tabs{<i>// comment<i1>width:10px;<i>}', output: '.tabs {<o>    // comment<o>    width: 10px;<o>}' },\n        { input: '//comment<i1>.tabs{<i>width:10px;<i>}', output: '//comment<o>.tabs {<o>    width: 10px;<o>}' },\n        { input: '.tabs{<i>//comment<i1>//2nd single line comment<i1>width:10px;<i>}', output: '.tabs {<o>    //comment<o>    //2nd single line comment<o>    width: 10px;<o>}' },\n        { input: '.tabs{<i>width:10px;//end of line comment<i1>}', output: '.tabs {<o>    width: 10px; //end of line comment<o>}' },\n        { input: '.tabs{<i>width:10px;//end of line comment<i1>height:10px;<i>}', output: '.tabs {<o>    width: 10px; //end of line comment<o>    height: 10px;<o>}' },\n        { input: '.tabs{<i>width:10px;//end of line comment<i1>height:10px;//another nl<i1>}', output: '.tabs {<o>    width: 10px; //end of line comment<o>    height: 10px; //another nl<o>}' },\n        {\n          input: '.tabs{<i>width: 10px;   // comment follows rule<i1>// another comment new line<i1>}',\n          output: '.tabs {<o>    width: 10px; // comment follows rule<o>    // another comment new line<o>}'\n        },\n        {\n          comment: '#1165',\n          input: '.tabs{<i>width: 10px;<i1>        // comment follows rule<i1>// another comment new line<i1>}',\n          output: '.tabs {<o>    width: 10px;<o>    // comment follows rule<o>    // another comment new line<o>}'\n        },\n\n        {\n          comment: \"#736\",\n          input: '/*\\n * comment\\n */<i>/* another comment */<i>body{}<i>',\n          output: '/*\\n * comment\\n */<o>/* another comment */<o>body {}'\n        },\n        {\n          comment: \"#1348\",\n          input: '.demoa1 {<i>text-align:left; //demoa1 instructions for LESS note visibility only<i1>}<i>.demob {<i>text-align: right;<i>}',\n          output: '.demoa1 {<o>    text-align: left; //demoa1 instructions for LESS note visibility only<o>}<new_rule>.demob {<o>    text-align: right;<o>}'\n        },\n        {\n          comment: \"#1440\",\n          input: [\n            '#search-text {',\n            '  width: 43%;',\n            '  // height: 100%;',\n            '  border: none;',\n            '}'\n          ],\n          output: [\n            '#search-text {',\n            '    width: 43%;',\n            '    // height: 100%;',\n            '    border: none;',\n            '}'\n          ]\n        },\n        {\n          input: '.demoa2 {<i>text-align:left;<i>}<i>//demob instructions for LESS note visibility only<i1>.demob {<i>text-align: right}',\n          output: '.demoa2 {<o>    text-align: left;<o>}<new_rule>//demob instructions for LESS note visibility only<o>.demob {<o>    text-align: right\\n}'\n        },\n        {\n          comment: 'new lines between rules - #531 and #857',\n          input: '.div{}<i1>.span {<i>}',\n          output: '.div {}<new_rule>.span {}'\n        },\n        {\n          input: '/**/<i>/**/<i>//<i1>/**/<i>.div{}<i>/**/<i>/**/<i>//<i1>/**/<i>.span {<i>}',\n          output: '/**/<o>/**/<o>//<o>/**/<o>.div {}<new_rule>/**/<o>/**/<o>//<o>/**/<o>.span {}'\n        },\n        {\n          input: '//<i1>.div{}<i>//<i1>.span {<i>}',\n          output: '//<o>.div {}<new_rule>//<o>.span {}'\n        },\n        {\n          input: '.selector1 {<i>margin: 0; <i>/* This is a comment including an url http://domain.com/path/to/file.ext */<i>}<i1>.div{<i>height:15px;<i>}',\n          output: '.selector1 {<o>    margin: 0;<o>    /* This is a comment including an url http://domain.com/path/to/file.ext */<o>}<new_rule>.div {<o>    height: 15px;<o>}'\n        },\n        {\n          input: '.tabs{<i>width:10px;//end of line comment<i1>height:10px;//another<i1>}<i>.div{<i>height:15px;<i>}',\n          output: '.tabs {<o>    width: 10px; //end of line comment<o>    height: 10px; //another<o>}<new_rule>.div {<o>    height: 15px;<o>}'\n        },\n        {\n          input: '#foo {<i>background-image: url(foo@2x.png);<i>    @font-face {<i>        font-family: \"Bitstream Vera Serif Bold\";<i>        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");<i>    }<i>}<i>.div{<i>height:15px;<i>}',\n          output: '#foo {<o>    background-image: url(foo@2x.png);<new_rule>    @font-face {<o>        font-family: \"Bitstream Vera Serif Bold\";<o>        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");<o>    }<o>}<new_rule>.div {<o>    height: 15px;<o>}'\n        },\n        {\n          input: '@media screen {<i>    #foo:hover {<i>        background-image: url(foo@2x.png);<i>    }<i>    @font-face {<i>        font-family: \"Bitstream Vera Serif Bold\";<i>        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");<i>    }<i>}<i>.div{<i>height:15px;<i>}',\n          output: '@media screen {<o>    #foo:hover {<o>        background-image: url(foo@2x.png);<o>    }<new_rule>    @font-face {<o>        font-family: \"Bitstream Vera Serif Bold\";<o>        src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");<o>    }<o>}<new_rule>.div {<o>    height: 15px;<o>}'\n        },\n        {\n          input: '@font-face {<i>    font-family: \"Bitstream Vera Serif Bold\";<i>    src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");<i>}<i1>@media screen {<i>    #foo:hover {<i>        background-image: url(foo.png);<i>    }<i>    @media screen and (min-device-pixel-ratio: 2) {<i>        @font-face {<i>            font-family: \"Helvetica Neue\";<i>        }<i>        #foo:hover {<i>            background-image: url(foo@2x.png);<i>        }<i>    }<i>}',\n          output: '@font-face {<o>    font-family: \"Bitstream Vera Serif Bold\";<o>    src: url(\"http://developer.mozilla.org/@api/deki/files/2934/=VeraSeBd.ttf\");<o>}<new_rule>@media screen {<o>    #foo:hover {<o>        background-image: url(foo.png);<o>    }<new_rule>    @media screen and (min-device-pixel-ratio: 2) {<o>        @font-face {<o>            font-family: \"Helvetica Neue\";<o>        }<new_rule>        #foo:hover {<o>            background-image: url(foo@2x.png);<o>        }<o>    }<o>}'\n        },\n        {\n          input: 'a:first-child{<i>color:red;<i>div:first-child{<i>color:black;<i>}<i>}<i>.div{<i>height:15px;<i>}',\n          output: 'a:first-child {<o>    color: red;<new_rule>    div:first-child {<o>        color: black;<o>    }<o>}<new_rule>.div {<o>    height: 15px;<o>}'\n        },\n        {\n          input: 'a:first-child{<i>color:red;<i>div:not(.peq){<i>color:black;<i>}<i>}<i>.div{<i>height:15px;<i>}',\n          output: 'a:first-child {<o>    color: red;<new_rule>    div:not(.peq) {<o>        color: black;<o>    }<o>}<new_rule>.div {<o>    height: 15px;<o>}'\n        }\n      ]\n    },\n    {\n      name: \"Handle LESS property name interpolation\",\n      description: \"\",\n      tests: [\n        { unchanged: 'tag {\\n    @{prop}: none;\\n}' },\n        { input: 'tag{@{prop}:none;}', output: 'tag {\\n    @{prop}: none;\\n}' },\n        { input: 'tag{ @{prop}: none;}', output: 'tag {\\n    @{prop}: none;\\n}' },\n        {\n          comment: \"can also be part of property name\",\n          unchanged: 'tag {\\n    dynamic-@{prop}: none;\\n}'\n        },\n        { input: 'tag{dynamic-@{prop}:none;}', output: 'tag {\\n    dynamic-@{prop}: none;\\n}' },\n        { input: 'tag{ dynamic-@{prop}: none;}', output: 'tag {\\n    dynamic-@{prop}: none;\\n}' }\n      ]\n    }, {\n      name: \"Handle LESS property name interpolation, test #631\",\n      description: \"\",\n      tests: [\n        { unchanged: '.generate-columns(@n, @i: 1) when (@i =< @n) {\\n    .column-@{i} {\\n        width: (@i * 100% / @n);\\n    }\\n    .generate-columns(@n, (@i + 1));\\n}' },\n        {\n          input: '.generate-columns(@n,@i:1) when (@i =< @n){.column-@{i}{width:(@i * 100% / @n);}.generate-columns(@n,(@i + 1));}',\n          output: '.generate-columns(@n, @i: 1) when (@i =< @n) {\\n    .column-@{i} {\\n        width: (@i * 100% / @n);\\n    }\\n    .generate-columns(@n, (@i + 1));\\n}'\n        }\n      ]\n    }, {\n      name: \"Handle LESS function parameters\",\n      description: \"\",\n      tests: [\n        { input: 'div{.px2rem(width,12);}', output: 'div {\\n    .px2rem(width, 12);\\n}' },\n        //mixin next to 'background: url(\"...\")' should not add a linebreak after the comma\n        { unchanged: 'div {\\n    background: url(\"//test.com/dummy.png\");\\n    .px2rem(width, 12);\\n}' }\n      ]\n    }, {\n      name: \"Psuedo-classes vs Variables\",\n      description: \"\",\n      tests: [\n        { unchanged: '@page :first {}' }, {\n          comment: \"Assume the colon goes with the @name. If we're in LESS, this is required regardless of the at-string.\",\n          input: '@page:first {}',\n          output: '@page: first {}'\n        },\n        { unchanged: '@page: first {}' }\n      ]\n    }, {\n      name: \"Issue 1411 -- LESS Variable Assignment Spacing\",\n      description: \"\",\n      tests: [{\n          unchanged: [\n            '@set: {',\n            '    one: blue;',\n            '    two: green;',\n            '    three: red;',\n            '}',\n            '.set {',\n            '    each(@set, {',\n            '        @{key}-@{index}: @value;',\n            '    });',\n            '}'\n          ]\n        },\n        { unchanged: '@light-blue: @nice-blue + #111;' }\n      ]\n    }, {\n      name: \"SASS/SCSS\",\n      description: \"\",\n      tests: [{\n          comment: \"Basic Interpolation\",\n          unchanged: 'p {\\n    $font-size: 12px;\\n    $line-height: 30px;\\n    font: #{$font-size}/#{$line-height};\\n}'\n        },\n        { unchanged: 'p.#{$name} {}' }, {\n          unchanged: [\n            '@mixin itemPropertiesCoverItem($items, $margin) {',\n            '    width: calc((100% - ((#{$items} - 1) * #{$margin}rem)) / #{$items});',\n            '    margin: 1.6rem #{$margin}rem 1.6rem 0;',\n            '}'\n          ]\n        },\n        {\n          comment: \"Multiple filed issues in LESS due to not(:blah)\",\n          unchanged: '&:first-of-type:not(:last-child) {}'\n        },\n        {\n          comment: \"#1236 - maps standard\",\n          unchanged: [\n            '$theme-colors: (',\n            '    primary: $blue,',\n            '    secondary: \"gray-600\"',\n            ');'\n          ]\n        },\n        {\n          comment: \"#1236 - maps single line\",\n          input: '$theme-colors:(primary: $blue,     secondary: \"$gray-600\");',\n          output: [\n            '$theme-colors: (',\n            '    primary: $blue,',\n            '    secondary: \"$gray-600\"',\n            ');'\n          ]\n        },\n        {\n          comment: \"#1236 - maps with functions\",\n          input: [\n            '$maps:(x: 80px,     y: \"something\",    ',\n            'z: calc(10 + 10)',\n            ');'\n          ],\n          output: [\n            '$maps: (',\n            '    x: 80px,',\n            '    y: \"something\",',\n            '    z: calc(10 + 10)',\n            ');'\n          ]\n        },\n        {\n          unchanged: [\n            'div {',\n            '    &:not(:first-of-type) {',\n            '        background: red;',\n            '    }',\n            '}'\n          ]\n        }\n\n      ]\n    }, {\n      name: \"Proper handling of colon in selectors\",\n      description: \"Space before a colon in a selector must be preserved, as it means pseudoclass/pseudoelement on any child\",\n      options: [{ name: \"selector_separator_newline\", value: \"false\" }],\n      tests: [\n        { unchanged: 'a :b {}' },\n        { unchanged: 'a ::b {}' },\n        { unchanged: 'a:b {}' },\n        { unchanged: 'a::b {}' },\n        {\n          input: 'a {}, a::b {}, a   ::b {}, a:b {}, a   :b {}',\n          output: 'a {}\\n, a::b {}\\n, a ::b {}\\n, a:b {}\\n, a :b {}'\n        },\n        {\n          unchanged: [\n            '.card-blue ::-webkit-input-placeholder {',\n            '    color: #87D1FF;',\n            '}'\n          ]\n        },\n        {\n          unchanged: [\n            'div [attr] :not(.class) {',\n            '    color: red;',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1233\",\n          unchanged: [\n            '.one {',\n            '    color: #FFF;',\n            '    // pseudo-element',\n            '    span:not(*::selection) {',\n            '        margin-top: 0;',\n            '    }',\n            '}',\n            '.two {',\n            '    color: #000;',\n            '    // pseudo-class',\n            '    span:not(*:active) {',\n            '        margin-top: 0;',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Regresssion Tests\",\n      description: \"General Regression tests for known issues\",\n      options: [{ name: \"selector_separator_newline\", value: \"false\" }],\n      tests: [{\n        unchanged: [\n          '@media(min-width:768px) {',\n          '    .selector::after {',\n          '        /* property: value */',\n          '    }',\n          '    .other-selector {',\n          '        /* property: value */',\n          '    }',\n          '}'\n        ]\n      }, {\n        comment: \"#1236 - SCSS/SASS Maps with selector_separator_newline = false\",\n        unchanged: '$font-weights: (\"regular\": 400, \"medium\": 500, \"bold\": 700);'\n      }, {\n        unchanged: [\n          '.fa-rotate-270 {',\n          '    filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);',\n          '}'\n        ]\n      }, {\n        comment: \"#2056 - Extra space before !important added\",\n        unchanged: [\n          '.x {',\n          '    $d: a !default;',\n          '}'\n        ]\n      }, {\n        unchanged: [\n          '.x {',\n          '    $d: a !default;',\n          '    @if $x !=0 {',\n          '        color: $var !important;',\n          '    }',\n          '}'\n        ]\n      }, {\n        comment: \"#2051 - css format removes space after quoted value\",\n        unchanged: [\n          'q {',\n          '    quotes: \\\\\\'\"\\\\\\' \\\\\\'\"\\\\\\' \"\\\\\\'\" \"\\\\\\'\";',\n          '    quotes: \"some\" \\\\\\'thing\\\\\\' \"different\";',\n          '    quotes: \\\\\\'some\\\\\\' \"thing\" \\\\\\'different\\\\\\';',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"Regression tests - with default options\",\n      description: \"\",\n      tests: [{\n        comment: \"Issue #1798 - space after strings in preserved\",\n        unchanged: '@use \"variables\" as *;'\n      }, {\n        comment: \"Issue #1976 - support the new @forwards syntax\",\n        input: [\n          '@forwards \"a\" with (',\n          '   $a: 2',\n          ');'\n        ],\n        output: '@forwards \"a\" with ($a: 2);'\n      }]\n    }, {\n      name: \"Issue #1817\",\n      description: \"\",\n      tests: [{\n        comment: \"ensure that properties that are expected to have multiline values persist new lines\",\n        unchanged: [\n          '.grid {',\n          '    grid-template:',\n          '        \"top-bar top-bar\" 100px',\n          '        \"left-bar center\" 100px;',\n          '}'\n        ]\n      }, {\n        comment: \"property values that have string followed by other identifiers should persist spacing\",\n        input: [\n          '.grid {grid-template: \"top-bar\" 100px;}'\n        ],\n        output: [\n          '.grid {',\n          '    grid-template: \"top-bar\" 100px;',\n          '}'\n        ]\n      }, {\n        input: [\n          'div {',\n          'grid-template-areas: \"a\"',\n          ' \"b\" ',\n          '                    \"c\";',\n          '}'\n        ],\n        output: [\n          'div {',\n          '    grid-template-areas: \"a\"',\n          '        \"b\"',\n          '        \"c\";',\n          '}'\n        ]\n      }, {\n        input: [\n          'div {',\n          'grid-template: \"a a a\" 20%',\n          ' [main-top] \"b b b\" 1fr',\n          '                    \"b b b\" auto;',\n          '}'\n        ],\n        output: [\n          'div {',\n          '    grid-template: \"a a a\" 20%',\n          '        [main-top] \"b b b\" 1fr',\n          '        \"b b b\" auto;',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"Issue #645, #1233\",\n      description: \"\",\n      options: [\n        { name: \"selector_separator_newline\", value: \"true\" },\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"newline_between_rules\", value: \"true\" }\n\n      ],\n      tests: [{\n          unchanged: [\n            '/* Comment above first rule */',\n            '',\n            'body {',\n            '    display: none;',\n            '}',\n            '',\n            '/* Comment between rules */',\n            '',\n            'ul,',\n            '',\n            '/* Comment between selectors */',\n            '',\n            'li {',\n            '    display: none;',\n            '}',\n            '',\n            '/* Comment after last rule */'\n          ]\n        },\n        {\n          input: [\n            '.one  {',\n            '    color: #FFF;',\n            '    // pseudo-element',\n            '    span:not(*::selection) {',\n            '        margin-top: 0;',\n            '    }',\n            '}',\n            '.two {',\n            '    color: #000;',\n            '    // pseudo-class',\n            '    span:not(*:active) {',\n            '        margin-top: 0;',\n            '    }',\n            '}'\n          ],\n          output: [\n            '.one {',\n            '    color: #FFF;',\n            '',\n            '    // pseudo-element',\n            '    span:not(*::selection) {',\n            '        margin-top: 0;',\n            '    }',\n            '}',\n            '',\n            '.two {',\n            '    color: #000;',\n            '',\n            '    // pseudo-class',\n            '    span:not(*:active) {',\n            '        margin-top: 0;',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Extend Tests\",\n      description: \"Test for '@extend'\",\n      options: [],\n      tests: [{\n        unchanged: [\n          '.btn-group-radios {',\n          '    .btn:hover {',\n          '        &:hover,',\n          '        &:focus {',\n          '            @extend .btn-blue:hover;',\n          '        }',\n          '    }',\n          '}'\n        ]\n      }, {\n        unchanged: [\n          '.item-warning {',\n          '    @extend btn-warning:hover;',\n          '}',\n          '.item-warning-wrong {',\n          '    @extend btn-warning: hover;',\n          '}'\n        ]\n      }, {\n        unchanged: [\n          '.item-warning {',\n          '    @extend .color1, .hover2;',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"Import Tests\",\n      description: \"Test for '@import'\",\n      options: [],\n      tests: [{\n        input: [\n          '@import \"custom.css\";.rule{}',\n          'a, p {}'\n        ],\n        output: [\n          '@import \"custom.css\";',\n          '.rule {}',\n          'a,',\n          'p {}'\n        ]\n      }, {\n        input: [\n          '@import url(\"bluish.css\") projection,tv;.rule{}',\n          'a, p {}'\n        ],\n        output: [\n          '@import url(\"bluish.css\") projection, tv;',\n          '.rule {}',\n          'a,',\n          'p {}'\n        ]\n      }]\n    }, {\n      name: \"Important\",\n      description: \"Spacing of !important\",\n      options: [],\n      tests: [{\n        input: 'a {\\n    color: blue  !important;\\n}',\n        output: 'a {\\n    color: blue !important;\\n}'\n      }, {\n        input: 'a {\\n    color: blue!important;\\n}',\n        output: 'a {\\n    color: blue !important;\\n}'\n      }, {\n        unchanged: 'a {\\n    color: blue !important;\\n}'\n      }, {\n        unchanged: '.blue\\\\\\\\! {\\n    color: blue !important;\\n}'\n      }]\n    }, {\n      name: \"Escape\",\n      description: \"\",\n      options: [],\n      tests: [{\n        unchanged: 'a:not(.color\\\\\\\\:blue) {\\n    color: blue !important;\\n}'\n      }, {\n        unchanged: '.blue\\\\\\\\:very {\\n    color: blue !important;\\n}'\n      }, {\n        fragment: true,\n        unchanged: 'a:not(.color\\\\\\\\'\n      }, {\n        fragment: true,\n        unchanged: 'a:not\\\\\\\\'\n      }]\n    }, {\n      name: \"indent_empty_lines true\",\n      description: \"\",\n      options: [\n        { name: \"indent_empty_lines\", value: \"true\" },\n        //Necessary to test\n        { name: \"preserve_newlines\", value: \"true\" }\n      ],\n      tests: [{\n        fragment: true,\n        input: [\n          'a {',\n          '',\n          'width: auto;',\n          '',\n          'height: auto;',\n          '',\n          '}'\n        ],\n        output: [\n          'a {',\n          '    ',\n          '    width: auto;',\n          '    ',\n          '    height: auto;',\n          '    ',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"indent_empty_lines false\",\n      description: \"\",\n      options: [\n        { name: \"indent_empty_lines\", value: \"false\" },\n        //Necessary to test\n        { name: \"preserve_newlines\", value: \"true\" }\n      ],\n      tests: [{\n        fragment: true,\n        unchanged: [\n          'a {',\n          '',\n          '    width: auto;',\n          '',\n          '    height: auto;',\n          '',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"brace_style = expand\",\n      description: \"\",\n      matrix: [{\n        options: [\n          { name: \"brace_style\", value: \"'expand'\" },\n          { name: \"selector_separator_newline\", value: \"false\" },\n          { name: \"newline_between_rules\", value: \"true\" }\n        ],\n        empty_line_indent: '',\n        newline: '\\n'\n      }, {\n        options: [\n          { name: \"brace_style\", value: \"'expand'\" },\n          { name: \"indent_empty_lines\", value: \"true\" },\n          { name: \"selector_separator_newline\", value: \"false\" },\n          { name: \"preserve_newlines\", value: \"true\" }\n        ],\n        empty_line_indent: '    \\\\n',\n        newline: ''\n      }, {\n        options: [\n          { name: \"brace_style\", value: \"'expand'\" },\n          { name: \"indent_empty_lines\", value: \"false\" },\n          { name: \"selector_separator_newline\", value: \"false\" },\n          { name: \"preserve_newlines\", value: \"true\" }\n        ],\n        empty_line_indent: '\\\\n',\n        newline: ''\n      }],\n\n      tests: [{\n        input: [\n          'a, b, .c {',\n          '    width: auto;',\n          '  ',\n          '    height: auto;',\n          '}'\n        ],\n        output: [\n          'a, b, .c',\n          '{',\n          '    width: auto;',\n          '{{empty_line_indent}}    height: auto;',\n          '}'\n        ]\n      }, {\n        comment: 'edge case - empty line after { should not be indented without indent_empty_lines',\n        input: [\n          'a, b, .c {',\n          '',\n          '    width: auto;',\n          '}'\n        ],\n        output: [\n          'a, b, .c',\n          '{',\n          '{{empty_line_indent}}    width: auto;',\n          '}'\n        ]\n      }, {\n        comment: 'mixins call with object notation, and brace_style=\"expand\"',\n        input: [\n          '.example({',\n          '    color:red;',\n          '});'\n        ],\n        output: [\n          '.example(',\n          '    {',\n          '        color:red;',\n          '    }',\n          ');'\n        ]\n      }, {\n        comment: 'integration test of newline_between_rules, imports, and brace_style=\"expand\"',\n        input: '.a{} @import \"custom.css\";.rule{}',\n        output: [\n          '.a',\n          '{}',\n          '{{newline}}@import \"custom.css\";',\n          '{{newline}}.rule',\n          '{}'\n        ]\n      }]\n    }, {\n      name: \"LESS mixins\",\n      description: \"\",\n      tests: [{\n        unchanged: [\n          '.btn {',\n          '    .generate-animation(@mykeyframes, 1.4s, .5s, 1, ease-out);',\n          '}',\n          '.mymixin(@color: #ccc; @border-width: 1px) {',\n          '    border: @border-width solid @color;',\n          '}',\n          'strong {',\n          '    &:extend(a:hover);',\n          '}'\n        ]\n      }, {\n        unchanged: [\n          '.test {',\n          '    .example({',\n          '        color:red;',\n          '    });',\n          '}'\n        ]\n      }, {\n        unchanged: [\n          '.example2({',\n          '    display:none;',\n          '});'\n        ]\n      }, {\n        unchanged: [\n          '.aa {',\n          '    .mq-medium(a, {',\n          '        background: red;',\n          '    });',\n          '}'\n        ]\n      }, {\n        unchanged: [\n          '@selectors: blue, green, red;',\n          'each(@selectors, {',\n          '    .sel-@{value} {',\n          '        a: b;',\n          '    }',\n          '});'\n        ]\n      }, {\n        comment: 'Ensure simple closing parens do not break behavior',\n        unchanged: [\n          'strong {',\n          '    &:extend(a:hover));',\n          '}',\n          '.btn {',\n          '    .generate-animation(@mykeyframes, 1.4s, .5s, 1, ease-out);',\n          '}',\n          '.mymixin(@color: #ccc; @border-width: 1px) {',\n          '    border: @border-width solid @color;',\n          '}',\n          'strong {',\n          '    &:extend(a:hover);',\n          '}'\n        ]\n      }, {\n        comment: 'indent multi-line parens',\n        unchanged: [\n          '.btn {',\n          '    .generate-animation(@mykeyframes, 1.4s,',\n          '        .5s, 1, ease-out);',\n          '}',\n          '.mymixin(@color: #ccc;',\n          '    @border-width: 1px) {',\n          '    border: @border-width solid @color;',\n          '}'\n        ]\n      }, {\n        comment: 'format inside mixin parens',\n        input: [\n          '.btn {',\n          '    .generate-animation(@mykeyframes,1.4s,.5s,1,ease-out);',\n          '}',\n          '.mymixin(@color:#ccc;@border-width:1px) {',\n          '    border:@border-width solid @color;',\n          '}'\n        ],\n        output: [\n          '.btn {',\n          '    .generate-animation(@mykeyframes, 1.4s, .5s, 1, ease-out);',\n          '}',\n          '.mymixin(@color: #ccc; @border-width: 1px) {',\n          '    border: @border-width solid @color;',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"Preserve Newlines and max number of new lines\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"max_preserve_newlines\", value: \"2\" }\n      ],\n      description: \"\",\n      tests: [{\n        input: 'p {\\n\\n\\n\\n    color: blue;\\n}',\n        output: 'p {\\n\\n    color: blue;\\n}'\n      }, {\n        unchanged: 'p {\\n\\n    color: blue;\\n}'\n      }, {\n        unchanged: 'p {\\n    color: blue;\\n}'\n      }]\n    }, {\n      name: \"Issue #2012, #2147\",\n      description: \"Avoid whitespace between first colon and next character in non nested at-rules\",\n      options: [],\n      tests: [{\n        unchanged: '@extend .btn-blue:hover;'\n      }, {\n        unchanged: '@import url(\"chrome://communicator/skin/\");'\n      }, {\n        unchanged: '@apply w-4 lg:w-10 space-y-3 lg:space-x-12;'\n      }, {\n        unchanged: [\n          'h3 {',\n          '    @apply flex flex-col lg:flex-row space-y-3 lg:space-x-12 items-start;',\n          '}'\n        ]\n      }]\n    }, {\n\n    }\n  ]\n};\n"
  },
  {
    "path": "test/data/html/node.mustache",
    "content": "/*\n{{&header_text}}\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n/*jshint unused:false */\n/*jshint strict:false */\n\nfunction run_html_tests(test_obj, Urlencoded, js_beautify, html_beautify, css_beautify)\n{\n\n    var default_opts = {\n        indent_size: 4,\n        indent_char: ' ',\n        preserve_newlines: true,\n        jslint_happy: false,\n        keep_array_indentation: false,\n        brace_style: 'collapse',\n        space_before_conditional: true,\n        break_chained_methods: false,\n        selector_separator: '\\n',\n        end_with_newline: false\n    };\n    var opts;\n\n{{#default_options}}    default_opts.{{name}} = {{&value}};\n{{/default_options}}\n\n    function reset_options()\n    {\n        opts = JSON.parse(JSON.stringify(default_opts));\n        test_name = 'html-beautify';\n    }\n\n    function test_beautifier(input)\n    {\n        return html_beautify(input, opts);\n    }\n\n    var sanitytest;\n    var test_name = '';\n\n    function set_name(name)\n    {\n        name = (name || '').trim();\n        if (name) {\n            test_name = name.replace(/\\r/g, '\\\\r').replace(/\\n/g, '\\\\n');\n        }\n    }\n\n    // test the input on beautifier with the current flag settings\n    // does not check the indentation / surroundings as bt() does\n    function test_fragment(input, expected)\n    {\n        var success = true;\n        sanitytest.test_function(test_beautifier, test_name);\n        expected = expected || expected === '' ? expected : input;\n        success = success && sanitytest.expect(input, expected);\n        // if the expected is different from input, run it again\n        // expected output should be unchanged when run twice.\n        if (success && expected !== input) {\n            success = success && sanitytest.expect(expected, expected);\n        }\n\n        // Everywhere we do newlines, they should be replaced with opts.eol\n        sanitytest.test_function(test_beautifier, 'eol ' + test_name);\n        opts.eol = '\\r\\\\n';\n        expected = expected.replace(/[\\n]/g, '\\r\\n');\n        opts.disabled = true;\n        success = success && sanitytest.expect(input, input || '');\n        success = success && sanitytest.expect('\\n\\n' + expected, '\\n\\n' + expected);\n        opts.disabled = false;\n        success = success && sanitytest.expect(input, expected);\n        if (success && input && input.indexOf('\\n') !== -1) {\n            input = input.replace(/[\\n]/g, '\\r\\n');\n            sanitytest.expect(input, expected);\n            // Ensure support for auto eol detection\n            opts.eol = 'auto';\n            success = success && sanitytest.expect(input, expected);\n        }\n        opts.eol = '\\n';\n        return success;\n    }\n\n    // test html\n    function bth(input, expectation)\n    {\n        var success = true;\n\n        var wrapped_input, wrapped_expectation, field_input, field_expectation;\n\n        expectation = expectation || expectation === '' ? expectation : input;\n        success = success && test_fragment(input, expectation);\n\n        if (opts.indent_size === 4 && input) {\n          var indent_string = opts.indent_with_tabs ? '\\t' : '    ';\n            wrapped_input = '<div>\\n' + input.replace(/^(.+)$/mg, indent_string + '$1') + '\\n' + indent_string + '<span>inline</span>\\n</div>';\n            wrapped_expectation = '<div>\\n' + expectation.replace(/^(.+)$/mg, indent_string + '$1') + '\\n' + indent_string + '<span>inline</span>\\n</div>';\n            success = success && test_fragment(wrapped_input, wrapped_expectation);\n        }\n        return success;\n    }\n\n    function unicode_char(value) {\n        return String.fromCharCode(value);\n    }\n\n    function beautifier_tests()\n    {\n        sanitytest = test_obj;\n\n        reset_options();\n        //============================================================\n        bth('');\n\n{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}\n        //============================================================\n    {{^matrix}}\n        // {{&name}}\n        reset_options();\n        set_name('{{&name}}');\n        {{#options}}\n        opts.{{name}} = {{&value}};\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}};\n        {{/tests}}\n\n    {{/matrix}}\n    {{#matrix}}\n        // {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})\n        reset_options();\n        set_name('{{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})');\n        {{#options}}\n        opts.{{name}} = {{&value}};\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}};\n        {{/tests}}\n\n    {{/matrix}}\n{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}\n    }\n\n    function beautifier_unconverted_tests()\n    {\n        sanitytest = test_obj;\n\n        reset_options();\n        //============================================================\n        test_fragment(null, '');\n\n        reset_options();\n        //============================================================\n        // Test user pebkac protection, converts dash names to underscored names\n        opts[\"end-with-newline\"] = true;\n        test_fragment(null, '\\n');\n\n        reset_options();\n        //============================================================\n        set_name('end_with_newline = true');\n        opts.end_with_newline = true;\n\n        test_fragment('', '\\n');\n        test_fragment('<div></div>\\n');\n        test_fragment('<div></div>\\n\\n\\n', '<div></div>\\n');\n        test_fragment('<head>\\n' +\n            '    <script>\\n' +\n            '        mocha.setup(\"bdd\");\\n' +\n            '\\n' +\n            '    </script>\\n' +\n            '</head>\\n');\n\n\n        reset_options();\n        //============================================================\n        set_name('Error cases');\n        // error cases need love too\n        bth('<img title=\"Bad food!\" src=\"foo.jpg\" alt=\"Evil\" \">');\n        bth(\"<!-- don't blow up if a comment is not complete\"); // -->\n\n        reset_options();\n        //============================================================\n        set_name('Basic beautify');\n\n        test_fragment(\n            '<head>\\n' +\n            '    <script>\\n' +\n            '        mocha.setup(\"bdd\");\\n' +\n            '    </script>\\n' +\n            '</head>');\n\n        test_fragment('<div></div>\\n', '<div></div>');\n        bth('<div></div>');\n        bth('<div>content</div>');\n        bth('<div><div></div></div>',\n            '<div>\\n' +\n            '    <div></div>\\n' +\n            '</div>');\n        bth('<div><div>content</div></div>',\n            '<div>\\n' +\n            '    <div>content</div>\\n' +\n            '</div>');\n        bth('<div>\\n' +\n            '    <span>content</span>\\n' +\n            '</div>');\n        bth('<div>\\n' +\n            '</div>');\n        bth('<div>\\n' +\n            '    content\\n' +\n            '</div>');\n        bth('<div>\\n' +\n            '    </div>',\n            '<div>\\n' +\n            '</div>');\n        test_fragment('   <div>\\n' +\n            '    </div>',\n            '   <div>\\n' +\n            '   </div>');\n        bth('<div>\\n' +\n            '</div>\\n' +\n            '    <div>\\n' +\n            '    </div>',\n            '<div>\\n' +\n            '</div>\\n' +\n            '<div>\\n' +\n            '</div>');\n        test_fragment('   <div>\\n' +\n            '</div>',\n            '   <div>\\n' +\n            '   </div>');\n        bth('<div        >content</div>',\n            '<div>content</div>');\n        bth('<div     thinger=\"preserve  space  here\"   ></div  >',\n            '<div thinger=\"preserve  space  here\"></div>');\n        bth('content\\n' +\n            '    <div>\\n' +\n            '    </div>\\n' +\n            'content',\n            'content\\n' +\n            '<div>\\n' +\n            '</div>\\n' +\n            'content');\n        bth('<li>\\n' +\n            '    <div>\\n' +\n            '    </div>\\n' +\n            '</li>');\n        bth('<li>\\n' +\n            '<div>\\n' +\n            '</div>\\n' +\n            '</li>',\n            '<li>\\n' +\n            '    <div>\\n' +\n            '    </div>\\n' +\n            '</li>');\n        bth('<li>\\n' +\n            '    content\\n' +\n            '</li>\\n' +\n            '<li>\\n' +\n            '    content\\n' +\n            '</li>');\n\n        bth('<img>content');\n        bth('<img> content');\n        bth('<img>   content', '<img> content');\n\n        bth('<img><img>content');\n        bth('<img> <img>content');\n        bth('<img>   <img>content', '<img> <img>content');\n\n        bth('<img><b>content</b>');\n        bth('<img> <b>content</b>');\n        bth('<img>   <b>content</b>', '<img> <b>content</b>');\n\n        bth('<div>content<img>content</div>');\n        bth('<div> content <img> content</div>');\n        bth('<div>    content <img>    content </div>',\n            '<div> content <img> content </div>');\n        bth('Text <a href=\"#\">Link</a> Text');\n\n        reset_options();\n        //============================================================\n        set_name('content_unformatted = [\"script\", \"style\"]');\n        var content_unformatted = opts.content_unformatted;\n        opts.content_unformatted = ['script', 'style'];\n        bth('<script id=\"javascriptTemplate\" type=\"text/x-kendo-template\">\\n' +\n            '  <ul>\\n' +\n            '  # for (var i = 0; i < data.length; i++) { #\\n' +\n            '    <li>#= data[i] #</li>\\n' +\n            '  # } #\\n' +\n            '  </ul>\\n' +\n            '</script>');\n        bth('<style>\\n' +\n            '  body {background-color:lightgrey}\\n' +\n            '  h1   {color:blue}\\n' +\n            '</style>');\n\n        reset_options();\n        //============================================================\n        set_name('inline = [\"custom-element\"]');\n\n        inline_tags = opts.inline;\n        opts.inline = ['custom-element'];\n        test_fragment('<div>should <custom-element>not</custom-element>' +\n                      ' insert newlines</div>',\n                      '<div>should <custom-element>not</custom-element>' +\n                      ' insert newlines</div>');\n        opts.inline = inline_tags;\n\n\n        reset_options();\n        //============================================================\n        set_name('line wrap tests');\n\n        bth('<div><span>content</span></div>');\n\n        opts.wrap_line_length = 0;\n        //...---------1---------2---------3---------4---------5---------6---------7\n        //...1234567890123456789012345678901234567890123456789012345678901234567890\n        bth('<div>Some text that should not wrap at all.</div>',\n            /* expected */\n            '<div>Some text that should not wrap at all.</div>');\n\n        // A value of 0 means no max line length, and should not wrap.\n        //...---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        //...12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n        bth('<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>',\n            /* expected */\n            '<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>');\n\n        opts.wrap_line_length = \"0\";\n        //...---------1---------2---------3---------4---------5---------6---------7\n        //...1234567890123456789012345678901234567890123456789012345678901234567890\n        bth('<div>Some text that should not wrap at all.</div>',\n            /* expected */\n            '<div>Some text that should not wrap at all.</div>');\n\n        // A value of \"0\" means no max line length, and should not wrap\n        //...---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        //...12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890\n        bth('<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>',\n            /* expected */\n            '<div>Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all. Some text that should not wrap at all.</div>');\n\n        opts.wrap_line_length = 40;\n        //...---------1---------2---------3---------4---------5---------6---------7\n        //...1234567890123456789012345678901234567890123456789012345678901234567890\n        bth('<div>Some test text that should wrap_inside_this section here__.</div>',\n            /* expected */\n            '<div>Some test text that should\\n' +\n            '    wrap_inside_this section here__.\\n' +\n            '</div>');\n\n        // Support passing string of number\n        opts.wrap_line_length = \"40\";\n        //...---------1---------2---------3---------4---------5---------6---------7\n        //...1234567890123456789012345678901234567890123456789012345678901234567890\n        bth('<div>Some test text that should wrap_inside_this section here__.</div>',\n            /* expected */\n            '<div>Some test text that should\\n' +\n            '    wrap_inside_this section here__.\\n' +\n            '</div>');\n\n        reset_options();\n        //============================================================\n\n    }\n\n    beautifier_tests();\n    beautifier_unconverted_tests();\n}\n\nif (typeof exports !== \"undefined\") {\n    exports.run_html_tests = run_html_tests;\n}\n"
  },
  {
    "path": "test/data/html/tests.js",
    "content": "/*\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\nexports.test_data = {\n  default_options: [\n    { name: \"indent_size\", value: \"4\" },\n    { name: \"indent_char\", value: \"' '\" },\n    { name: \"indent_with_tabs\", value: \"false\" },\n    { name: \"preserve_newlines\", value: \"true\" },\n    { name: \"jslint_happy\", value: \"false\" },\n    { name: \"keep_array_indentation\", value: \"false\" },\n    { name: \"brace_style\", value: \"'collapse'\" },\n    { name: \"extra_liners\", value: \"['html', 'head', '/html']\" }\n  ],\n  groups: [{\n    name: \"Unicode Support\",\n    description: \"\",\n    tests: [{\n      unchanged: \"<p>Hello' + unicode_char(160) + unicode_char(3232) + '_' + unicode_char(3232) + 'world!</p>\"\n    }]\n  }, {\n    name: \"Handle inline and block elements differently\",\n    description: \"\",\n    matrix: [{}],\n    tests: [{\n      fragment: true,\n      input: '<body><h1>Block</h1></body>',\n      output: [\n        '<body>',\n        '    <h1>Block</h1>',\n        '</body>'\n      ]\n    }, {\n      fragment: true,\n      unchanged: '<body><i>Inline</i></body>'\n    }, {\n      // Issue #1718 - Empty, non-inline tags with newlines should break parent ending tag into another line\n      input: [\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"none\" x=\"0\" y=\"0\" viewBox=\"0 0 900 710\" width=\"100%\" height=\"100%\">',\n        '<circle id=\"mycircle\" ',\n        'cx=\"182.901\" cy=\"91.4841\" ',\n        'style=\"fill:rosybrown;stroke:black;stroke-width:1px;\" r=\"48\" /></svg>'\n      ],\n      output: [\n        '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"none\" x=\"0\" y=\"0\" viewBox=\"0 0 900 710\" width=\"100%\" height=\"100%\">',\n        '    <circle id=\"mycircle\" cx=\"182.901\" cy=\"91.4841\" style=\"fill:rosybrown;stroke:black;stroke-width:1px;\" r=\"48\" />',\n        '</svg>'\n      ]\n    }, {\n      // Issue #1365 -- Inline tags with newlines should break block parent ending tags into another line\n      input: [\n        '<div class=\"col-xs-2\">',\n        '<input type=\"radio\" class=\"control-label\" ng-disabled=\"!col\" ng-model=\"col\" value=\"2\" class=\"form-control\" id=\"coli\" name=\"coli\" />',\n        '<label for=\"coli\" class=\"control-label\">Collision</label></div>'\n      ],\n      output: [\n        '<div class=\"col-xs-2\">',\n        '    <input type=\"radio\" class=\"control-label\" ng-disabled=\"!col\" ng-model=\"col\" value=\"2\" class=\"form-control\" id=\"coli\" name=\"coli\" />',\n        '    <label for=\"coli\" class=\"control-label\">Collision</label>',\n        '</div>'\n      ]\n    }, {\n      // Issue #1365 -- Inline tags with newlines should not break inline parent ending tags into another line\n      input: [\n        '<label class=\"col-xs-2\">Collision',\n        '<input type=\"radio\" class=\"control-label\" ng-disabled=\"!col\" ng-model=\"col\" value=\"2\" class=\"form-control\" id=\"coli\" name=\"coli\" /></label>'\n      ],\n      output: [\n        '<label class=\"col-xs-2\">Collision',\n        '    <input type=\"radio\" class=\"control-label\" ng-disabled=\"!col\" ng-model=\"col\" value=\"2\" class=\"form-control\" id=\"coli\" name=\"coli\" /></label>'\n      ]\n    }, {\n      // Issue #1365 -- Inline tags with newlines should not break inline parent ending tags into another line\n      input: [\n        '<div class=\"col-xs-2\">Collision',\n        '<input type=\"radio\" class=\"control-label\" ng-disabled=\"!col\" ng-model=\"col\" value=\"2\" class=\"form-control\" id=\"coli\" name=\"coli\" /></div>'\n      ],\n      output: [\n        '<div class=\"col-xs-2\">Collision',\n        '    <input type=\"radio\" class=\"control-label\" ng-disabled=\"!col\" ng-model=\"col\" value=\"2\" class=\"form-control\" id=\"coli\" name=\"coli\" />',\n        '</div>'\n      ]\n    }]\n  }, {\n    name: \"End With Newline\",\n    description: \"\",\n    matrix: [{\n        options: [\n          { name: \"end_with_newline\", value: \"true\" }\n        ],\n        eof: '\\n'\n      }, {\n        options: [\n          { name: \"end_with_newline\", value: \"false\" }\n        ],\n        eof: ''\n      }\n\n    ],\n    tests: [\n      { fragment: true, input: '', output: '{{eof}}' },\n      { fragment: true, input: '<div></div>', output: '<div></div>{{eof}}' },\n      // { fragment: true, input: '   \\n\\n<div></div>\\n\\n\\n\\n', output: '   <div></div>{{eof}}' },\n      { fragment: true, input: '\\n', output: '{{eof}}' }\n    ]\n  }, {\n    name: \"Support Indent Level Options and Base Indent Autodetection\",\n    description: \"If user specifies indent level, use it; otherwise start at zero indent.\",\n    matrix: [{\n      options: [],\n      input_start_indent: '   ',\n      output_start_of_base: '   ',\n      i: '    '\n    }, {\n      options: [\n        { name: \"indent_level\", value: \"0\" }\n      ],\n      input_start_indent: '   ',\n      output_start_of_base: '   ',\n      i: '    '\n    }, {\n      options: [\n        { name: \"indent_level\", value: \"1\" }\n      ],\n      input_start_indent: '   ',\n      output_start_of_base: '    ',\n      i: '    '\n    }, {\n      options: [\n        { name: \"indent_level\", value: \"2\" }\n      ],\n      input_start_indent: '',\n      output_start_of_base: '        ',\n      i: '    '\n    }, {\n      options: [\n        { name: \"indent_with_tabs\", value: \"true\" },\n        { name: \"indent_level\", value: \"2\" }\n      ],\n      input_start_indent: '',\n      output_start_of_base: '\\t\\t',\n      i: '\\t'\n    }, {\n      options: [\n        { name: \"indent_level\", value: \"0\" }\n      ],\n      input_start_indent: '\\t   ',\n      output_start_of_base: '\\t   ',\n      i: '    '\n    }],\n    tests: [\n      { fragment: true, input: '{{input_start_indent}}a', output: '{{output_start_of_base}}a' },\n      {\n        fragment: true,\n        input: [\n          '{{input_start_indent}}<div>',\n          '  <p>This is my sentence.</p>',\n          '</div>'\n        ],\n        output: [\n          '{{output_start_of_base}}<div>',\n          '{{output_start_of_base}}{{i}}<p>This is my sentence.</p>',\n          '{{output_start_of_base}}</div>'\n        ]\n      }, {\n        fragment: true,\n        input: [\n          '{{input_start_indent}}// This is a random comment',\n          '<div>',\n          '  <p>This is my sentence.</p>',\n          '</div>'\n        ],\n        output: [\n          '{{output_start_of_base}}// This is a random comment',\n          '{{output_start_of_base}}<div>',\n          '{{output_start_of_base}}{{i}}<p>This is my sentence.</p>',\n          '{{output_start_of_base}}</div>'\n        ]\n      }\n    ]\n  }, {\n    name: \"Custom Extra Liners (empty)\",\n    description: \"\",\n    matrix: [{\n        options: [\n          { name: \"extra_liners\", value: \"[]\" }\n        ]\n      }\n\n    ],\n    tests: [{\n      fragment: true,\n      input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',\n      output: '<html>\\n<head>\\n    <meta>\\n</head>\\n<body>\\n    <div>\\n        <p>x</p>\\n    </div>\\n</body>\\n</html>'\n    }]\n  }, {\n    name: \"Custom Extra Liners (default)\",\n    description: \"\",\n    matrix: [{\n        options: [\n          { name: \"extra_liners\", value: \"null\" }\n        ]\n      }\n\n    ],\n    tests: [{\n      fragment: true,\n      input: '<html><head></head><body></body></html>',\n      output: '<html>\\n\\n<head></head>\\n\\n<body></body>\\n\\n</html>'\n    }]\n  }, {\n    name: \"Custom Extra Liners (p, string)\",\n    description: \"\",\n    matrix: [{\n        options: [\n          { name: \"extra_liners\", value: \"'p,/p'\" }\n        ]\n      }\n\n    ],\n    tests: [{\n      fragment: true,\n      input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',\n      output: '<html>\\n<head>\\n    <meta>\\n</head>\\n<body>\\n    <div>\\n\\n        <p>x\\n\\n        </p>\\n    </div>\\n</body>\\n</html>'\n    }]\n  }, {\n    name: \"Custom Extra Liners (p)\",\n    description: \"\",\n    matrix: [{\n        options: [\n          { name: \"extra_liners\", value: \"['p', '/p']\" }\n        ]\n      }\n\n    ],\n    tests: [{\n      fragment: true,\n      input: '<html><head><meta></head><body><div><p>x</p></div></body></html>',\n      output: '<html>\\n<head>\\n    <meta>\\n</head>\\n<body>\\n    <div>\\n\\n        <p>x\\n\\n        </p>\\n    </div>\\n</body>\\n</html>'\n    }]\n  }, {\n    name: \"Tests for script and style Commented and cdata wapping (#1641)\",\n    description: \"Repect comment and cdata wrapping regardless of beautifier\",\n    options: [\n      { name: \"templating\", value: \"'php'\" }\n    ],\n    tests: [{\n      input: [\n        '<style><!----></style>'\n      ],\n      output: [\n        '<style>',\n        '    <!--',\n        '    -->',\n        '</style>'\n      ]\n    }, {\n      input: [\n        '<style><!--',\n        '--></style>'\n      ],\n      output: [\n        '<style>',\n        '    <!--',\n        '    -->',\n        '</style>'\n      ]\n    }, {\n      input: [\n        '<style><!-- the rest of this   line is   ignored',\n        '',\n        '',\n        '',\n        '--></style>'\n      ],\n      output: [\n        '<style>',\n        '    <!-- the rest of this   line is   ignored',\n        '    -->',\n        '</style>'\n      ]\n    }, {\n      input: [\n        '<style type=\"test/null\"><!--',\n        '',\n        '\\t  ',\n        '',\n        '--></style>'\n      ],\n      output: [\n        '<style type=\"test/null\">',\n        '    <!--',\n        '    -->',\n        '</style>'\n      ]\n    }, {\n      input: [\n        '<script><!--',\n        'console.log(\"</script>\" + \"</style>\");',\n        '--></script>'\n      ],\n      output: [\n        '<script>',\n        '    <!--',\n        '    console.log(\"</script>\" + \"</style>\");',\n        '    -->',\n        '</script>'\n      ]\n    }, {\n      fragment: true,\n      comment: 'If wrapping is incomplete, print remaining unchanged.',\n      input: [\n        '<div>',\n        '<script><!--',\n        'console.log(\"</script>\" + \"</style>\");',\n        ' </script>',\n        '</div>'\n      ],\n      output: [\n        '<div>',\n        '    <script><!--',\n        'console.log(\"</script>\" + \"</style>\");',\n        ' </script>',\n        '</div>'\n      ]\n    }, {\n      input: [\n        '<style><!--',\n        '.selector {',\n        '    font-family: \"</script></style>\";',\n        '    }',\n        '--></style>'\n      ],\n      output: [\n        '<style>',\n        '    <!--',\n        '    .selector {',\n        '        font-family: \"</script></style>\";',\n        '    }',\n        '    -->',\n        '</style>'\n      ]\n    }, {\n      input: [\n        '<script type=\"test/null\">',\n        '    <!--',\n        '   console.log(\"</script>\" + \"</style>\");',\n        '    console.log(\"</script>\" + \"</style>\");',\n        '--></script>'\n      ],\n      output: [\n        '<script type=\"test/null\">',\n        '    <!--',\n        '    console.log(\"</script>\" + \"</style>\");',\n        '     console.log(\"</script>\" + \"</style>\");',\n        '    -->',\n        '</script>'\n      ]\n    }, {\n      input: [\n        '<script type=\"test/null\"><!--',\n        ' console.log(\"</script>\" + \"</style>\");',\n        '      console.log(\"</script>\" + \"</style>\");',\n        '--></script>'\n      ],\n      output: [\n        '<script type=\"test/null\">',\n        '    <!--',\n        '    console.log(\"</script>\" + \"</style>\");',\n        '         console.log(\"</script>\" + \"</style>\");',\n        '    -->',\n        '</script>'\n      ]\n    }, {\n      input: [\n        '<script><![CDATA[',\n        'console.log(\"</script>\" + \"</style>\");',\n        ']]></script>'\n      ],\n      output: [\n        '<script>',\n        '    <![CDATA[',\n        '    console.log(\"</script>\" + \"</style>\");',\n        '    ]]>',\n        '</script>'\n      ]\n    }, {\n      input: [\n        '<style><![CDATA[',\n        '.selector {',\n        '    font-family: \"</script></style>\";',\n        '    }',\n        ']]></style>'\n      ],\n      output: [\n        '<style>',\n        '    <![CDATA[',\n        '    .selector {',\n        '        font-family: \"</script></style>\";',\n        '    }',\n        '    ]]>',\n        '</style>'\n      ]\n    }, {\n      input: [\n        '<script type=\"test/null\">',\n        '    <![CDATA[',\n        '   console.log(\"</script>\" + \"</style>\");',\n        '    console.log(\"</script>\" + \"</style>\");',\n        ']]></script>'\n      ],\n      output: [\n        '<script type=\"test/null\">',\n        '    <![CDATA[',\n        '    console.log(\"</script>\" + \"</style>\");',\n        '     console.log(\"</script>\" + \"</style>\");',\n        '    ]]>',\n        '</script>'\n      ]\n    }, {\n      input: [\n        '<script type=\"test/null\"><![CDATA[',\n        ' console.log(\"</script>\" + \"</style>\");',\n        '      console.log(\"</script>\" + \"</style>\");',\n        ']]></script>'\n      ],\n      output: [\n        '<script type=\"test/null\">',\n        '    <![CDATA[',\n        '    console.log(\"</script>\" + \"</style>\");',\n        '         console.log(\"</script>\" + \"</style>\");',\n        '    ]]>',\n        '</script>'\n      ]\n    }, {\n      comment: \"Issue #1687 - start with <?php ?>\",\n      input: [\n        '<script>',\n        '<?php ?>',\n        'var b={',\n        'a:function _test( ){',\n        'return 1;',\n        '}',\n        '}',\n        '</script>'\n      ],\n      output: [\n        '<script>',\n        '    <?php ?>',\n        '    var b = {',\n        '        a: function _test() {',\n        '            return 1;',\n        '        }',\n        '    }',\n        '</script>'\n      ]\n    }]\n  }, {\n    name: \"Tests for script and style types (issue 453, 821)\",\n    description: \"Only format recognized script types\",\n    tests: [{\n        unchanged: '<script type=\"text/unknown\"><div></div></script>'\n      }, {\n        unchanged: '<script type=\"text/unknown\">Blah Blah Blah</script>'\n      }, {\n        input: '<script type=\"text/unknown\">    Blah Blah Blah   </script>',\n        output: '<script type=\"text/unknown\"> Blah Blah Blah   </script>'\n      }, {\n        input: '<script type=\"text/javascript\"><div></div></script>',\n        output: [\n          '<script type=\"text/javascript\">',\n          '    < div > < /div>',\n          '</script>'\n        ]\n      }, {\n        input: '<script><div></div></script>',\n        output: [\n          '<script>',\n          '    < div > < /div>',\n          '</script>'\n        ]\n      }, {\n        comment: 'text/html should beautify as html',\n        input: '<script type=\"text/html\">\\n<div>\\n<div></div><div></div></div></script>',\n        output: [\n          '<script type=\"text/html\">',\n          '    <div>',\n          '        <div></div>',\n          '        <div></div>',\n          '    </div>',\n          '</script>'\n        ]\n      }, {\n        comment: 'null beatifier behavior - should still indent',\n        fragment: true,\n        input: '<script type=\"test/null\">\\n    <div>\\n  <div></div><div></div></div></script>',\n        output: [\n          '<script type=\"test/null\">',\n          '    <div>',\n          '      <div></div><div></div></div>',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"test/null\">\\n   <div>\\n     <div></div><div></div></div></script>',\n        output: [\n          '<script type=\"test/null\">',\n          '    <div>',\n          '      <div></div><div></div></div>',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"test/null\">\\n<div>\\n<div></div><div></div></div></script>',\n        output: [\n          '<script type=\"test/null\">',\n          '    <div>',\n          '    <div></div><div></div></div>',\n          '</script>'\n        ]\n      }, {\n        input: '<script>var foo = \"bar\";</script>',\n        output: [\n          '<script>',\n          '    var foo = \"bar\";',\n          '</script>'\n        ]\n      }, {\n        comment: 'Issue #1606 - type attribute on other element',\n        input: [\n          '<script>',\n          'console.log(1  +  1);',\n          '</script>',\n          '',\n          '<input type=\"submit\"></input>'\n        ],\n        output: [\n          '<script>',\n          '    console.log(1 + 1);',\n          '</script>',\n          '',\n          '<input type=\"submit\"></input>'\n        ]\n      }, {\n        input: '<script type=\"text/javascript\">console.log(1  +  1);</script>',\n        output: [\n          '<script type=\"text/javascript\">',\n          '    console.log(1 + 1);',\n          '</script>'\n        ]\n      }, {\n        comment: 'Issue #1706 - es script module',\n        input: '<script type=\"module\">console.log(1  +  1);</script>',\n        output: [\n          '<script type=\"module\">',\n          '    console.log(1 + 1);',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"application/javascript\">var foo = \"bar\";</script>',\n        output: [\n          '<script type=\"application/javascript\">',\n          '    var foo = \"bar\";',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"application/javascript;version=1.8\">var foo = \"bar\";</script>',\n        output: [\n          '<script type=\"application/javascript;version=1.8\">',\n          '    var foo = \"bar\";',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"application/x-javascript\">var foo = \"bar\";</script>',\n        output: [\n          '<script type=\"application/x-javascript\">',\n          '    var foo = \"bar\";',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"application/ecmascript\">var foo = \"bar\";</script>',\n        output: [\n          '<script type=\"application/ecmascript\">',\n          '    var foo = \"bar\";',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"dojo/aspect\">this.domNode.style.display=\"none\";</script>',\n        output: [\n          '<script type=\"dojo/aspect\">',\n          '    this.domNode.style.display = \"none\";',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"dojo/method\">this.domNode.style.display=\"none\";</script>',\n        output: [\n          '<script type=\"dojo/method\">',\n          '    this.domNode.style.display = \"none\";',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"text/javascript1.5\">var foo = \"bar\";</script>',\n        output: [\n          '<script type=\"text/javascript1.5\">',\n          '    var foo = \"bar\";',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"application/json\">{\"foo\":\"bar\"}</script>',\n        output: [\n          '<script type=\"application/json\">',\n          '    {',\n          '        \"foo\": \"bar\"',\n          '    }',\n          '</script>'\n        ]\n      }, {\n        input: '<script type=\"application/ld+json\">{\"foo\":\"bar\"}</script>',\n        output: [\n          '<script type=\"application/ld+json\">',\n          '    {',\n          '        \"foo\": \"bar\"',\n          '    }',\n          '</script>'\n        ]\n      }, {\n        unchanged: '<style type=\"text/unknown\"><tag></tag></style>'\n      }, {\n        input: '<style type=\"text/css\"><tag></tag></style>',\n        output: [\n          '<style type=\"text/css\">',\n          '    <tag></tag>',\n          '</style>'\n        ]\n      }, {\n        input: '<style><tag></tag></style>',\n        output: [\n          '<style>',\n          '    <tag></tag>',\n          '</style>'\n        ]\n      }, {\n        input: '<style>.selector {font-size:12px;}</style>',\n        output: [\n          '<style>',\n          '    .selector {',\n          '        font-size: 12px;',\n          '    }',\n          '</style>'\n        ]\n      }, {\n        input: '<style type=\"text/css\">.selector {font-size:12px;}</style>',\n        output: [\n          '<style type=\"text/css\">',\n          '    .selector {',\n          '        font-size: 12px;',\n          '    }',\n          '</style>'\n        ]\n      }\n\n    ]\n  }, {\n    name: \"Attribute Wrap alignment with spaces and tabs\",\n    description: \"Ensure attributes are internally aligned with spaces when the indent_character is set to tab\",\n    template: \"^^^ $$$\",\n    matrix: [{\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" },\n        { name: \"indent_with_tabs\", value: \"true\" }\n      ],\n      indent_attr: '\\t   ',\n      indent_div_attr: '\\t '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force'\" },\n        { name: \"indent_with_tabs\", value: \"true\" }\n      ],\n      indent_attr: '\\t',\n      indent_div_attr: '\\t'\n    }],\n    tests: [{\n        fragment: true,\n        input: '<div><div a=\"1\" b=\"2\"><div>test</div></div></div>',\n        output: '<div>\\n\\t<div a=\"1\"\\n\\t^^^indent_div_attr$$$b=\"2\">\\n\\t\\t<div>test</div>\\n\\t</div>\\n</div>'\n      },\n      {\n        fragment: true,\n        unchanged: [\n          '<input type=\"radio\"',\n          '^^^indent_attr$$$name=\"garage\"',\n          '^^^indent_attr$$$id=\"garage-02\"',\n          '^^^indent_attr$$$class=\"ns-e-togg__radio ns-js-form-binding\"',\n          '^^^indent_attr$$$value=\"02\"',\n          '^^^indent_attr$$${{#ifCond data.antragsart \"05\"}}',\n          '^^^indent_attr$$$checked=\"checked\"',\n          '^^^indent_attr$$${{/ifCond}}>'\n        ]\n      },\n      {\n        fragment: true,\n        unchanged: [\n          '<div>',\n          '\\t<input type=\"radio\"',\n          '\\t^^^indent_attr$$$name=\"garage\"',\n          '\\t^^^indent_attr$$$id=\"garage-02\"',\n          '\\t^^^indent_attr$$$class=\"ns-e-togg__radio ns-js-form-binding\"',\n          '\\t^^^indent_attr$$$value=\"02\"',\n          '\\t^^^indent_attr$$${{#ifCond data.antragsart \"05\"}}',\n          '\\t^^^indent_attr$$$checked=\"checked\"',\n          '\\t^^^indent_attr$$${{/ifCond}}>',\n          '</div>'\n        ]\n      },\n      {\n        fragment: true,\n        unchanged: [\n          '---',\n          'layout: mainLayout.html',\n          'page: default.html',\n          '---',\n          '',\n          '<div>',\n          '\\t{{> componentXYZ my.data.key}}',\n          '\\t{{> componentABC my.other.data.key}}',\n          '\\t<span>Hello World</span>',\n          '\\t<p>Your paragraph</p>',\n          '</div>'\n        ]\n      }\n    ]\n  }, {\n    name: \"Attribute Wrap de-indent\",\n    description: \"Tags de-indent when attributes are wrapped\",\n    matrix: [{\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" },\n        { name: \"indent_with_tabs\", value: \"false\" }\n      ]\n    }],\n    tests: [{\n        input: '<div a=\"1\" b=\"2\"><div>test</div></div>',\n        output: '<div a=\"1\"\\n     b=\"2\">\\n    <div>test</div>\\n</div>'\n      },\n      {\n        input: '<p>\\n    <a href=\"/test/\" target=\"_blank\"><img src=\"test.jpg\" /></a><a href=\"/test/\" target=\"_blank\"><img src=\"test.jpg\" /></a>\\n</p>',\n        output: '<p>\\n    <a href=\"/test/\"\\n       target=\"_blank\"><img src=\"test.jpg\" /></a><a href=\"/test/\"\\n       target=\"_blank\"><img src=\"test.jpg\" /></a>\\n</p>'\n      },\n      {\n        input: '<p>\\n    <span data-not-a-href=\"/test/\" data-totally-not-a-target=\"_blank\"><img src=\"test.jpg\" /></span><span data-not-a-href=\"/test/\" data-totally-not-a-target=\"_blank\"><img src=\"test.jpg\" /></span>\\n</p>',\n        output: '<p>\\n    <span data-not-a-href=\"/test/\"\\n          data-totally-not-a-target=\"_blank\"><img src=\"test.jpg\" /></span><span data-not-a-href=\"/test/\"\\n          data-totally-not-a-target=\"_blank\"><img src=\"test.jpg\" /></span>\\n</p>'\n      }\n    ]\n  }, {\n    name: \"Issue #1403 -- no extra newlines in force-aligned wrap_attributes\",\n    description: \"\",\n    matrix: [{\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" }\n      ]\n    }],\n    tests: [{\n      fragment: true,\n      input: '<button class=\"btn btn-primary\" ng-click=\"shipment.editSendDate = false;sampleTracking.updateShipmentDates({shipment_id: shipment.shipment_id, sent_timestamp: shipment.sending_date})\" type=\"button\">Save</button>',\n      output: [\n        '<button class=\"btn btn-primary\"',\n        '        ng-click=\"shipment.editSendDate = false;sampleTracking.updateShipmentDates({shipment_id: shipment.shipment_id, sent_timestamp: shipment.sending_date})\"',\n        '        type=\"button\">Save</button>'\n      ]\n    }]\n  }, {\n    name: \"unformatted_content_delimiter ^^\",\n    description: \"keep delimited together\",\n    options: [\n      { name: \"wrap_line_length\", value: \"80\" },\n      { name: \"unformatted_content_delimiter\", value: \"'^^'\" }\n    ],\n    tests: [{\n      fragment: true,\n      input: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 ^^09 0010 0011 0012 0013 0014 0015 ^^16 0017 0018 0019 0020</span>',\n      output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008\\n    ^^09 0010 0011 0012 0013 0014 0015 ^^16 0017 0018 0019 0020</span>'\n    }, {\n      fragment: true,\n      input: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020</span>',\n      output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014\\n    0015 0016 0017 0018 0019 0020</span>'\n    }, {\n      fragment: true,\n      input: '<span>0   0001   0002   0003   0004   0005   0006   0007   0008   0009   ^^10   0011   0012   0013   0014   0015   0016   0^^7   0018   0019   0020</span>',\n      output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009\\n    ^^10   0011   0012   0013   0014   0015   0016   0^^7 0018 0019 0020</span>'\n    }, {\n      fragment: true,\n      input: '<span>0   0001   0002   0003   0004   0005   0006   0007   0008   0009   0^^0   0011   0012   0013   0014   0015   0016   0^^7   0018   0019   0020</span>',\n      output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0^^0 0011 0012 0013 0014\\n    0015 0016 0^^7 0018 0019 0020</span>'\n    }]\n  }, {\n    name: \"Attribute Wrap\",\n    description: \"Wraps attributes inside of html tags\",\n    matrix: [{\n      options: [\n        { name: \"wrap_attributes\", value: \"'force'\" }\n      ],\n      indent_attr: '\\n    ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n    '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force'\" },\n        { name: \"wrap_line_length\", value: \"80\" }\n      ],\n      indent_attr: '\\n    ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: '\\n    ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: '\\n    ',\n      indent_over80: '\\n    '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force'\" },\n        { name: \"wrap_attributes_indent_size\", value: \"8\" }\n      ],\n      indent_attr: '\\n        ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n        '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'auto'\" },\n        { name: \"wrap_line_length\", value: \"80\" },\n        { name: \"wrap_attributes_indent_size\", value: \"0\" }\n      ],\n      indent_attr: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: '\\n',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: '\\n    ',\n      indent_content80: '\\n    ',\n      indent_over80: '\\n'\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'auto'\" },\n        { name: \"wrap_line_length\", value: \"80\" },\n        { name: \"wrap_attributes_indent_size\", value: \"4\" }\n      ],\n      indent_attr: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: '\\n    ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: '\\n    ',\n      indent_content80: '\\n    ',\n      indent_over80: '\\n    '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'auto'\" },\n        { name: \"wrap_line_length\", value: \"0\" }\n      ],\n      indent_attr: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" }\n      ],\n      indent_attr: '\\n     ',\n      indent_attr_faligned: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n     '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" },\n        { name: \"wrap_line_length\", value: \"80\" }\n      ],\n      indent_attr: '\\n     ',\n      indent_attr_faligned: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: '\\n    ',\n      indent_over80: '\\n     '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'aligned-multiple'\" },\n        { name: \"wrap_line_length\", value: \"80\" }\n      ],\n      indent_attr: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_attr_aligned: ' ',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: '\\n    ',\n      indent_content80: '\\n    ',\n      indent_over80: '\\n     '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'aligned-multiple'\" }\n      ],\n      indent_attr: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" },\n        { name: \"wrap_attributes_indent_size\", value: \"8\" }\n      ],\n      indent_attr: '\\n     ',\n      indent_attr_faligned: ' ',\n      indent_attr_first: ' ',\n      indent_attr_first_link: ' ',\n      indent_end: '',\n      indent_end_selfclosing: ' ',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n     '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_attributes_indent_size\", value: \"4\" }\n      ],\n      indent_attr: '\\n    ',\n      indent_attr_first: '\\n    ',\n      indent_attr_first_link: '\\n    ',\n      indent_end: '\\n',\n      indent_end_selfclosing: '\\n',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n    '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_attributes_indent_size\", value: \"4\" },\n        { name: \"wrap_line_length\", value: \"80\" }\n      ],\n      indent_attr: '\\n    ',\n      indent_attr_first: '\\n    ',\n      indent_attr_first_link: '\\n    ',\n      indent_end: '\\n',\n      indent_end_selfclosing: '\\n',\n      indent_content80_selfclosing: ' ',\n      indent_content80: '\\n    ',\n      indent_over80: '\\n    '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_attributes_indent_size\", value: \"8\" }\n      ],\n      indent_attr: '\\n        ',\n      indent_attr_first: '\\n        ',\n      indent_attr_first_link: '\\n        ',\n      indent_end: '\\n',\n      indent_end_selfclosing: '\\n',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n        '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_attributes_indent_size\", value: \"4\" },\n        { name: \"indent_with_tabs\", value: 'true' }\n      ],\n      indent_attr: '\\n\\t',\n      indent_attr_first: '\\n\\t',\n      indent_attr_first_link: '\\n\\t',\n      indent_end: '\\n',\n      indent_end_selfclosing: '\\n',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n\\t'\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_attributes_indent_size\", value: \"7\" },\n        { name: \"indent_with_tabs\", value: 'true' }\n      ],\n      indent_attr: '\\n\\t   ',\n      indent_attr_first: '\\n\\t   ',\n      indent_attr_first_link: '\\n\\t   ',\n      indent_end: '\\n',\n      indent_end_selfclosing: '\\n',\n      indent_content80_selfclosing: ' ',\n      indent_content80: ' ',\n      indent_over80: '\\n\\t   '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_line_length\", value: \"80\" },\n        { name: \"indent_with_tabs\", value: 'true' }\n      ],\n      indent_attr: '\\n\\t',\n      indent_attr_first: '\\n\\t',\n      indent_attr_first_link: '\\n\\t',\n      indent_end: '\\n',\n      indent_end_selfclosing: '\\n',\n      indent_content80_selfclosing: ' ',\n      indent_content80: '\\n\\t',\n      indent_over80: '\\n\\t'\n    }],\n    tests: [{\n        input: '<div  >This is some text</div>',\n        output: '<div>This is some text</div>'\n      }, {\n        fragment: true,\n        input: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020</span>',\n        output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014{{indent_content80}}0015 0016 0017 0018 0019 0020</span>'\n      }, {\n        fragment: true,\n        input: '<span>0   0001   0002   0003   0004   0005   0006   0007   0008   0009   0010   0011   0012   0013   0014   0015   0016   0017   0018   0019   0020</span>',\n        output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014{{indent_content80}}0015 0016 0017 0018 0019 0020</span>'\n      }, {\n        fragment: true,\n        input: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014\\t0015 0016 0017 0018 0019 0020</span>',\n        output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014{{indent_content80}}0015 0016 0017 0018 0019 0020</span>'\n      }, {\n        comment: \"issue #869\",\n        fragment: true,\n        input: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014&nbsp;0015 0016 0017 0018 0019 0020</span>',\n        output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013{{indent_content80}}0014&nbsp;0015 0016 0017 0018 0019 0020</span>'\n      }, {\n        comment: \"issue #1324\",\n        fragment: true,\n        input: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009  0010 <span>&nbsp;</span>&nbsp;0015 0016 0017 0018 0019 0020</span>',\n        output: '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010{{indent_content80}}<span>&nbsp;</span>&nbsp;0015 0016 0017 0018 0019 0020</span>'\n      }, {\n        comment: \"issue #1496 - respect unicode non-breaking space\",\n        fragment: true,\n        input: \"<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011  unic 0013 0014' + unicode_char(160) + '0015 0016 0017 0018 0019 0020</span>\",\n        output: \"<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 unic 0013{{indent_content80}}0014' + unicode_char(160) + '0015 0016 0017 0018 0019 0020</span>\"\n      }, {\n        comment: \"issue #1496 and #1324 - respect unicode non-breaking space\",\n        fragment: true,\n        input: \"<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011  unic <span>' + unicode_char(160) + '</span>' + unicode_char(160) + '0015 0016 0017 0018 0019 0020</span>\",\n        output: \"<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 unic{{indent_content80}}<span>' + unicode_char(160) + '</span>' + unicode_char(160) + '0015 0016 0017 0018 0019 0020</span>\"\n      }, {\n        fragment: true,\n        comment: 'Issue 1222 -- P tags are formatting correctly',\n        input: '<p>Our forms for collecting address-related information follow a standard design. Specific input elements willl vary according to the form’s audience and purpose.</p>',\n        output: '<p>Our forms for collecting address-related information follow a standard{{indent_content80}}design. Specific input elements willl vary according to the form’s audience{{indent_content80}}and purpose.</p>'\n      }, {\n        input: '<div attr=\"123\"  >This is some text</div>',\n        output: '<div attr=\"123\">This is some text</div>'\n      }, {\n        fragment: true,\n        input: '<div attr0 attr1=\"123\" data-attr2=\"hello    t here\">This is some text</div>',\n        output: '<div{{indent_attr_first}}attr0{{indent_attr}}attr1=\"123\"{{indent_attr}}data-attr2=\"hello    t here\"{{indent_end}}>This is some text</div>'\n      }, {\n        fragment: true,\n        input: '<div lookatthissuperduperlongattributenamewhoahcrazy0=\"true\" attr0 attr1=\"123\" data-attr2=\"hello    t here\" heymanimreallylongtoowhocomesupwiththesenames=\"false\">This is text</div>',\n        output: '<div{{indent_attr_first}}lookatthissuperduperlongattributenamewhoahcrazy0=\"true\"{{indent_attr}}attr0{{indent_attr}}attr1=\"123\"{{indent_over80}}data-attr2=\"hello    t here\"{{indent_over80}}heymanimreallylongtoowhocomesupwiththesenames=\"false\"{{indent_end}}>This is text</div>'\n      }, {\n        fragment: true,\n        input: '<img attr0 attr1=\"123\" data-attr2=\"hello    t here\"/>',\n        output: '<img{{indent_attr_first}}attr0{{indent_attr}}attr1=\"123\"{{indent_attr}}data-attr2=\"hello    t here\"{{indent_end_selfclosing}}/>'\n      }, {\n        fragment: true,\n        input: '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><root attr1=\"foo\" attr2=\"bar\"/>',\n        output: '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\\n<root{{indent_attr_first}}attr1=\"foo\"{{indent_attr}}{{indent_attr_faligned}}attr2=\"bar\"{{indent_end_selfclosing}}/>'\n      }, {\n        comment: \"Issue #1094 - Beautify correctly without quotes and with extra spaces\",\n        fragment: true,\n        input: '<div lookatthissuperduperlongattributenamewhoahcrazy0 =    \"true\" attr0 attr1=  12345 data-attr2   =\"hello    t here\" heymanimreallylongtoowhocomesupwiththesenames=\"false\">This is text</div>',\n        output: '<div{{indent_attr_first}}lookatthissuperduperlongattributenamewhoahcrazy0=\"true\"{{indent_attr}}attr0{{indent_attr}}attr1=12345{{indent_over80}}data-attr2=\"hello    t here\"{{indent_over80}}heymanimreallylongtoowhocomesupwiththesenames=\"false\"{{indent_end}}>This is text</div>'\n      },\n      {\n        fragment: true,\n        input: '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><root attr1   =   foo12   attr2  =\"bar\"    />',\n        output: '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\\n<root{{indent_attr_first}}attr1=foo12{{indent_attr}}{{indent_attr_faligned}}attr2=\"bar\"{{indent_end_selfclosing}}/>'\n      },\n      // Not ready\n      // {\n      //   fragment: true,\n      //   input: '<?xml version=    \"1.0\"    encoding = \"UTF-8\" ?><root attr1   =   foo   attr2=\"bar\"/>',\n      //   output: '<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\\n<root{{indent_attr_first}}attr1=foo{{indent_attr}}{{indent_attr_faligned}}attr2=\"bar\"{{indent_end_selfclosing}}/>'\n      // },\n      {\n        input: '<link href=\"//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&amp;subset=latin\" rel=\"stylesheet\" type=\"text/css\">',\n        output: '<link{{indent_attr_first_link}}href=\"//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&amp;subset=latin\"{{indent_over80}}{{indent_attr_faligned}}{{indent_attr_aligned}}rel=\"stylesheet\"{{indent_attr}}{{indent_attr_faligned}}type=\"text/css\"{{indent_end}}>'\n      }\n    ]\n  }, {\n    name: \"Issue #1335 -- <button> Bug with force-expand-multiline formatting\",\n    description: \"\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" }\n    ],\n    tests: [{\n      fragment: true,\n      unchanged: [\n        '<button',\n        '    class=\"my-class\"',\n        '    id=\"id1\"',\n        '>',\n        '    Button 1',\n        '</button>',\n        '',\n        '<button',\n        '    class=\"my-class\"',\n        '    id=\"id2\"',\n        '>',\n        '    Button 2',\n        '</button>'\n      ]\n    }, {\n      input_: [\n        '<button>',\n        '    <span>foo</span>',\n        '<p>bar</p>',\n        '</button>'\n      ],\n      output: [\n        '<button>',\n        '    <span>foo</span>',\n        '    <p>bar</p>',\n        '</button>'\n      ]\n    }]\n  }, {\n    name: \"Issue #1125 -- Add preserve and preserve_aligned attribute options\",\n    description: \"\",\n    template: \"^^^ $$$\",\n    matrix: [{\n      options: [\n        { name: \"wrap_attributes\", value: \"'preserve-aligned'\" }\n      ],\n      indent_attr: '       '\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'preserve'\" }\n      ],\n      indent_attr: '    '\n    }],\n    tests: [{\n      input: [\n        '<input type=\"text\"     class=\"form-control\"  autocomplete=\"off\"',\n        '[(ngModel)]=\"myValue\"          [disabled]=\"isDisabled\" [placeholder]=\"placeholder\"',\n        '[typeahead]=\"suggestionsSource\" [typeaheadOptionField]=\"suggestionValueField\" [typeaheadItemTemplate]=\"suggestionTemplate\"   [typeaheadWaitMs]=\"300\"',\n        '(typeaheadOnSelect)=\"onSuggestionSelected($event)\" />'\n      ],\n      output: [\n        '<input type=\"text\" class=\"form-control\" autocomplete=\"off\"',\n        '^^^indent_attr$$$[(ngModel)]=\"myValue\" [disabled]=\"isDisabled\" [placeholder]=\"placeholder\"',\n        '^^^indent_attr$$$[typeahead]=\"suggestionsSource\" [typeaheadOptionField]=\"suggestionValueField\" [typeaheadItemTemplate]=\"suggestionTemplate\" [typeaheadWaitMs]=\"300\"',\n        '^^^indent_attr$$$(typeaheadOnSelect)=\"onSuggestionSelected($event)\" />'\n      ]\n    }]\n  }, {\n    name: \"Test wrap_attributes_min_attrs with force/force-xx options\",\n    description: \"\",\n    matrix: [{\n      options: [\n        { name: \"wrap_attributes\", value: \"'force'\" },\n        { name: \"wrap_attributes_min_attrs\", value: \"4\" }\n      ],\n      indent_attr: '    ',\n      indent_attr_first: ' ',\n      indent_end: ' ',\n      newline_end: ''\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" },\n        { name: \"wrap_attributes_min_attrs\", value: \"4\" }\n      ],\n      indent_attr: '       ',\n      indent_attr_first: ' ',\n      indent_end: ' ',\n      newline_end: ''\n    }, {\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_attributes_min_attrs\", value: \"4\" }\n      ],\n      indent_attr: '    ',\n      indent_attr_first: '\\n    ',\n      indent_end: '\\n',\n      newline_end: '\\n'\n    }],\n    tests: [{\n      input: [\n        '<input type=\"four attributes should wrap\"     class=\"form-control\"  autocomplete=\"off\"',\n        '[(ngModel)]=\"myValue\" />'\n      ],\n      output: [\n        '<input{{indent_attr_first}}type=\"four attributes should wrap\"',\n        '{{indent_attr}}class=\"form-control\"',\n        '{{indent_attr}}autocomplete=\"off\"',\n        '{{indent_attr}}[(ngModel)]=\"myValue\"{{indent_end}}/>'\n      ]\n    }, {\n      input: [\n        '<input type=\"three attributes should not wrap\"    autocomplete=\"off\"',\n        '[(ngModel)]=\"myValue\" />'\n      ],\n      output: '<input type=\"three attributes should not wrap\" autocomplete=\"off\" [(ngModel)]=\"myValue\" />'\n    }, {\n      input: [\n        '<cmpnt v-bind:xx=\"four attributes with valueless attribute should wrap\"  ' +\n        '@someevent=\"dosomething\"  someprop',\n        'class=\"xx-button\">',\n        '<div class=\"alert alert-info\" style=\"margin-left: 1px;\" role=\"alert\">lorem ipsum</div>',\n        '</cmpnt>'\n      ],\n      output: [\n        '<cmpnt{{indent_attr_first}}v-bind:xx=\"four attributes with valueless attribute should wrap\"',\n        '{{indent_attr}}@someevent=\"dosomething\"',\n        '{{indent_attr}}someprop',\n        '{{indent_attr}}class=\"xx-button\"{{newline_end}}>',\n        '    <div class=\"alert alert-info\" style=\"margin-left: 1px;\" role=\"alert\">lorem ipsum</div>',\n        '</cmpnt>'\n      ]\n    }]\n  }, {\n    name: \"Test wrap_attributes_min_attrs = 1 with force/force-xx options\",\n    description: \"\",\n    matrix: [{\n      // Should not wrap, by design\n      options: [\n        { name: \"wrap_attributes\", value: \"'force'\" },\n        { name: \"wrap_attributes_min_attrs\", value: \"1\" }\n      ],\n      indent_attr: ' ',\n      newline_end: ' '\n    }, {\n      // Should not wrap, by design\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-aligned'\" },\n        { name: \"wrap_attributes_min_attrs\", value: \"1\" }\n      ],\n      indent_attr: ' ',\n      newline_end: ' '\n    }, {\n      // Should wrap\n      options: [\n        { name: \"wrap_attributes\", value: \"'force-expand-multiline'\" },\n        { name: \"wrap_attributes_min_attrs\", value: \"1\" }\n      ],\n      indent_attr: '\\n    ',\n      newline_end: '\\n'\n    }],\n    tests: [{\n      input: [\n        '<input type=\"one attribute\"/>'\n      ],\n      output: '<input{{indent_attr}}type=\"one attribute\"{{newline_end}}/>'\n    }]\n  }, {\n    name: \"Handlebars Indenting Off\",\n    description: \"Test handlebar behavior when indenting is off\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"indent_handlebars\", value: \"false\" }\n    ],\n    tests: [{\n        fragment: true,\n        input_: '{{#if 0}}\\n' + '    <div>\\n' + '    </div>\\n' + '{{/if}}',\n        output: '{{#if 0}}\\n' + '<div>\\n' + '</div>\\n' + '{{/if}}'\n      }, {\n        fragment: true,\n        input_: '<div>\\n' + '{{#each thing}}\\n' + '    {{name}}\\n' + '{{/each}}\\n' + '</div>',\n        output: '<div>\\n' + '    {{#each thing}}\\n' + '    {{name}}\\n' + '    {{/each}}\\n' + '</div>'\n      },\n      {\n        input_: [\n          '{{em-input label=\"Some Labe\" property=\"amt\" type=\"text\" placeholder=\"\"}}',\n          '   {{em-input label=\"Type*\" property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '       {{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}'\n        ],\n        output: [\n          '{{em-input label=\"Some Labe\" property=\"amt\" type=\"text\" placeholder=\"\"}}',\n          '{{em-input label=\"Type*\" property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '{{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}'\n        ]\n      },\n      {\n        comment: \"Issue #1469 - preserve newlines inside handlebars, including first one. Just treated as text here.\",\n        input_: [\n          '{{em-input',\n          '  label=\"Some Labe\" property=\"amt\"',\n          '  type=\"text\" placeholder=\"\"}}',\n          '   {{em-input label=\"Type*\"',\n          'property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '       {{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}'\n        ],\n        output: [\n          '{{em-input',\n          '  label=\"Some Labe\" property=\"amt\"',\n          '  type=\"text\" placeholder=\"\"}}',\n          '{{em-input label=\"Type*\"',\n          'property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '{{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}'\n        ]\n      },\n      {\n        input_: [\n          '<div>',\n          '{{em-input',\n          '  label=\"Some Labe\" property=\"amt\"',\n          '  type=\"text\" placeholder=\"\"}}',\n          '   {{em-input label=\"Type*\"',\n          'property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '       {{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}',\n          '</div>'\n        ],\n        output: [\n          '<div>',\n          '    {{em-input',\n          '  label=\"Some Labe\" property=\"amt\"',\n          '  type=\"text\" placeholder=\"\"}}',\n          '    {{em-input label=\"Type*\"',\n          'property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '    {{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}',\n          '</div>'\n        ]\n      },\n      {\n        input_: [\n          '{{#if callOn}}',\n          '{{#unless callOn}}',\n          '      {{translate \"onText\"}}',\n          '   {{else}}',\n          '{{translate \"offText\"}}',\n          '{{/unless callOn}}',\n          '   {{else if (eq callOn false)}}',\n          '{{translate \"offText\"}}',\n          '        {{/if}}'\n        ],\n        output: [\n          '{{#if callOn}}',\n          '{{#unless callOn}}',\n          '{{translate \"onText\"}}',\n          '{{else}}',\n          '{{translate \"offText\"}}',\n          '{{/unless callOn}}',\n          '{{else if (eq callOn false)}}',\n          '{{translate \"offText\"}}',\n          '{{/if}}'\n        ]\n      }\n    ]\n  }, {\n    name: \"Handlebars Indenting On\",\n    description: \"Test handlebar formatting\",\n    template: \"^^^ $$$\",\n    matrix: [{\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{field}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{em-input label=\"Some Labe\" property=\"amt\" type=\"text\" placeholder=\"\"}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{! comment}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{!-- comment--}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{{unescaped_variable}}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{Hello \"woRld\"}} {{!-- comment--}} {{heLloWorlD}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{pre{{field1}} {{field2}} {{field3}}post',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{! \\n mult-line\\ncomment  \\n     with spacing\\n}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{!-- \\n mult-line\\ncomment  \\n     with spacing\\n--}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" }\n      ],\n      content: '{{!-- \\n mult-line\\ncomment \\n{{#> component}}\\n mult-line\\ncomment  \\n     with spacing\\n {{/ component}}--}}',\n      indent_over80: ' '\n    }, {\n      options: [\n        { name: \"indent_handlebars\", value: \"true\" },\n        { name: \"wrap_line_length\", value: \"80\" }\n      ],\n      content: 'content',\n      indent_over80: '\\n    ',\n      wrap_over80: '\\n    ',\n      wrap_content_over80: '\\n        '\n    }],\n    tests: [\n      { unchanged: '{{page-title}}' },\n      {\n        unchanged: [\n          '{{page-title}}',\n          '{{a}}',\n          '{{value-title}}'\n        ]\n      },\n      {\n        input: [\n          '{{textarea value=someContent}}',\n          '',\n          '^^^&content$$$',\n          '{{#if condition}}',\n          '    <div  class=\"some\">{{helper \"hello\"}}<strong>{{helper \"world\"}}</strong></div>',\n          '{{/if}}',\n          '^^^&content$$$'\n        ],\n        output: [\n          '{{textarea value=someContent}}',\n          '',\n          '^^^&content$$$',\n          '{{#if condition}}',\n          '    <div class=\"some\">{{helper \"hello\"}}<strong>{{helper \"world\"}}</strong>^^^wrap_over80$$$</div>',\n          '{{/if}}',\n          '^^^&content$$$'\n        ]\n      },\n      {\n        input: [\n          '{{textarea value=someContent}}',\n          '',\n          '^^^&content$$$',\n          '{{#if condition}}',\n          '    <div  class=\"some-class-detail\">{{helper \"hello\"}}<strong>{{helper \"world\"}}</strong>{{helper \"hello\"}}<strong>{{helper \"world\"}}</strong></div>',\n          '{{/if}}',\n          '^^^&content$$$'\n        ],\n        output: [\n          '{{textarea value=someContent}}',\n          '',\n          '^^^&content$$$',\n          '{{#if condition}}',\n          '    <div class=\"some-class-detail\">^^^wrap_content_over80$$${{helper \"hello\"}}<strong>{{helper \"world\"}}</strong>{{helper \"hello\"}}<strong>{{helper \"world\"}}</strong>^^^wrap_over80$$$</div>',\n          '{{/if}}',\n          '^^^&content$$$'\n        ]\n      },\n      {\n        comment: \"error case\",\n        unchanged: [\n          '{{page-title}}',\n          '{{ myHelper someValue}}',\n          '^^^&content$$$',\n          '{{value-title}}'\n        ]\n      },\n      {\n        comment: \"Issue #1469 - preserve newlines inside handlebars, including first one. BUG: does not fix indenting inside handlebars.\",\n        input_: [\n          '{{em-input',\n          '  label=\"Some Labe\" property=\"amt\"',\n          '  type=\"text\" placeholder=\"\"}}',\n          '^^^&content$$$',\n          '   {{em-input label=\"Type*\"',\n          'property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '       {{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}'\n        ],\n        output: [\n          '{{em-input',\n          '  label=\"Some Labe\" property=\"amt\"',\n          '  type=\"text\" placeholder=\"\"}}',\n          '^^^&content$$$',\n          '{{em-input label=\"Type*\"',\n          'property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '{{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}'\n        ]\n      },\n      {\n        unchanged: [\n          '{{em-input label=\"Some Labe\" property=\"amt\" type=\"text\" placeholder=\"\"}}',\n          '^^^&content$$$',\n          '{{em-input label=\"Type*\" property=\"type\" type=\"text\" placeholder=\"(LTD)\"}}',\n          '{{em-input label=\"Place*\" property=\"place\" type=\"text\" placeholder=\"\"}}'\n        ]\n      },\n      { unchanged: '{{#if 0}}{{/if}}' },\n      { unchanged: '{{#if 0}}^^^&content$$${{/if}}' },\n      { unchanged: '{{#if 0}}\\n{{/if}}' }, {\n        input_: '{{#if     words}}{{/if}}',\n        output: '{{#if words}}{{/if}}'\n      }, {\n        input_: '{{#if     words}}^^^&content$$${{/if}}',\n        output: '{{#if words}}^^^&content$$${{/if}}'\n      }, {\n        input_: '{{#if     words}}^^^&content$$${{/if}}',\n        output: '{{#if words}}^^^&content$$${{/if}}'\n      }, {\n        unchanged: '{{#if 1}}\\n' + '    <div>\\n' + '    </div>\\n' + '{{/if}}'\n      }, {\n        input_: '{{#if 1}}\\n' + '<div>\\n' + '</div>\\n' + '{{/if}}',\n        output: '{{#if 1}}\\n' + '    <div>\\n' + '    </div>\\n' + '{{/if}}'\n      }, {\n        unchanged: '<div>\\n' + '    {{#if 1}}\\n' + '    {{/if}}\\n' + '</div>'\n      }, {\n        input_: '<div>\\n' + '{{#if 1}}\\n' + '{{/if}}\\n' + '</div>',\n        output: '<div>\\n' + '    {{#if 1}}\\n' + '    {{/if}}\\n' + '</div>'\n      }, {\n        input_: '{{#if}}\\n' + '{{#each}}\\n' + '{{#if}}\\n' + '^^^&content$$$\\n' + '{{/if}}\\n' + '{{#if}}\\n' + '^^^&content$$$\\n' + '{{/if}}\\n' + '{{/each}}\\n' + '{{/if}}',\n        output: '{{#if}}\\n' + '    {{#each}}\\n' + '        {{#if}}\\n' + '            ^^^&content$$$\\n' + '        {{/if}}\\n' + '        {{#if}}\\n' + '            ^^^&content$$$\\n' + '        {{/if}}\\n' + '    {{/each}}\\n' + '{{/if}}'\n      }, {\n        unchanged: '{{#if 1}}\\n' + '    <div>\\n' + '    </div>\\n' + '{{/if}}'\n      },\n\n      // Issue #576 -- Indent Formatting with Handlebars\n      {\n        input_: [\n          '<div>',\n          '    <small>SMALL TEXT</small>',\n          '    <span>',\n          '        {{#if isOwner}}',\n          '    <span><i class=\"fa fa-close\"></i></span>',\n          '        {{else}}',\n          '            <span><i class=\"fa fa-bolt\"></i></span>',\n          '        {{/if}}',\n          '    </span>',\n          '    <strong>{{userName}}:&nbsp;</strong>{{text}}',\n          '</div>'\n        ],\n        output: [\n          '<div>',\n          '    <small>SMALL TEXT</small>',\n          '    <span>',\n          '        {{#if isOwner}}',\n          '            <span><i class=\"fa fa-close\"></i></span>',\n          '        {{else}}',\n          '            <span><i class=\"fa fa-bolt\"></i></span>',\n          '        {{/if}}',\n          '    </span>',\n          '    <strong>{{userName}}:&nbsp;</strong>{{text}}',\n          '</div>'\n        ]\n      }, {\n        unchanged: [\n          '<div>',\n          '    <small>SMALL TEXT</small>',\n          '    <span>',\n          '        {{#if isOwner}}',\n          '            <span><i class=\"fa fa-close\"></i></span>',\n          '        {{else}}',\n          '            <span><i class=\"fa fa-bolt\"></i></span>',\n          '        {{/if}}',\n          '    </span>',\n          '    <strong>{{userName}}:&nbsp;</strong>{{text}}',\n          '</div>'\n        ]\n      },\n\n      // Issue #1040 -- Ignore expressions in handlebar tags\n      {\n        unchanged: [\n          '{{#if `this.customerSegment == \"Active\"`}}',\n          '    ...',\n          '{{/if}}'\n        ]\n      },\n\n      // Issue #1415 -- Indent Formatting with Handlebars and &nbsp\n      {\n        input_: [\n          '{{#isDealLink}}',\n          '&nbsp;&nbsp;<a target=\"_blank\" href=\"{{dealLink}}\" class=\"weak\">See</a>',\n          '{{/isDealLink}}'\n        ],\n        output: [\n          '{{#isDealLink}}',\n          '    &nbsp;&nbsp;<a target=\"_blank\" href=\"{{dealLink}}\" class=\"weak\">See</a>',\n          '{{/isDealLink}}'\n        ]\n      },\n\n      // Test {{else}} aligned with {{#if}} and {{/if}}\n      {\n        input_: '{{#if 1}}\\n' + '    ^^^&content$$$\\n' + '    {{else}}\\n' + '    ^^^&content$$$\\n' + '{{/if}}',\n        output: '{{#if 1}}\\n' + '    ^^^&content$$$\\n' + '{{else}}\\n' + '    ^^^&content$$$\\n' + '{{/if}}'\n      }, {\n        input_: '{{#if 1}}\\n' + '    {{else}}\\n' + '    {{/if}}',\n        output: '{{#if 1}}\\n' + '{{else}}\\n' + '{{/if}}'\n      }, {\n        input_: '{{#if thing}}\\n' + '{{#if otherthing}}\\n' + '    ^^^&content$$$\\n' + '    {{else}}\\n' + '^^^&content$$$\\n' + '    {{/if}}\\n' + '       {{else}}\\n' + '^^^&content$$$\\n' + '{{/if}}',\n        output: '{{#if thing}}\\n' + '    {{#if otherthing}}\\n' + '        ^^^&content$$$\\n' + '    {{else}}\\n' + '        ^^^&content$$$\\n' + '    {{/if}}\\n' + '{{else}}\\n' + '    ^^^&content$$$\\n' + '{{/if}}'\n      },\n      {\n        comment: 'ISSUE #800 and #1123: else if and #unless',\n        input_: [\n          '{{#if callOn}}',\n          '{{#unless callOn}}',\n          '      ^^^&content$$$',\n          '   {{else}}',\n          '{{translate \"offText\"}}',\n          '{{/unless callOn}}',\n          '   {{else if (eq callOn false)}}',\n          '^^^&content$$$',\n          '        {{/if}}'\n        ],\n        output: [\n          '{{#if callOn}}',\n          '    {{#unless callOn}}',\n          '        ^^^&content$$$',\n          '    {{else}}',\n          '        {{translate \"offText\"}}',\n          '    {{/unless callOn}}',\n          '{{else if (eq callOn false)}}',\n          '    ^^^&content$$$',\n          '{{/if}}'\n        ]\n      },\n      // Test {{}} inside of <> tags, which should be separated by spaces\n      // for readability, unless they are inside a string.\n      {\n        input_: '<div {{someStyle}}>  </div>',\n        output: '<div {{someStyle}}> </div>'\n      }, {\n        comment: 'only partial support for complex templating in attributes',\n        input_: '<dIv {{#if test}}class=\"foo\"{{/if}}>^^^&content$$$</dIv>',\n        output: '<dIv {{#if test}}class=\"foo\" {{/if}}>^^^&content$$$</dIv>'\n      }, {\n        fragment: true,\n        input_: '<diV {{#if thing}}{{somestyle}}class_spacing_for=\"{{class}}\"{{else}}class=\"{{class2}}\"{{/if}}>^^^&content$$$</diV>',\n        output: '<diV {{#if thing}}{{somestyle}}class_spacing_for=\"{{class}}\"^^^&indent_over80$$${{else}}class=\"{{class2}}\" {{/if}}>^^^&content$$$</diV>'\n      },\n      // {\n      //   fragment: true,\n      //   input_: '<div>\\n<diV{{#if thing}}{{somestyle}}class_spacing_for=\"{{class}}\"{{else}}class=\"{{class2}}\"{{/if}}>^^^&content$$$</diV>\\n<span />\\n</div>',\n      //   output: '<div>\\n    <diV {{#if thing}} {{somestyle}} class_spacing_for=\"{{class}}\" {{else}}^^^&indent_over80$$$class=\"{{class2}}\" {{/if}}>^^^&content$$$</diV>\\n    <span />\\n</div>'\n      // },\n      {\n        comment: 'partiial support for templating in attributes',\n        input_: '<span {{#if condition}}class=\"foo\"{{/if}}>^^^&content$$$</span>',\n        output: '<span {{#if condition}}class=\"foo\" {{/if}}>^^^&content$$$</span>'\n      }, {\n        unchanged: '<{{ele}} unformatted=\"{{#if}}^^^&content$$${{/if}}\">^^^&content$$$</{{ele}}>'\n      }, {\n        unchanged: '<div unformatted=\"{{#if}}^^^&content$$${{/if}}\">^^^&content$$$</div>'\n      }, {\n        unchanged: '<div unformatted=\"{{#if  }}    ^^^&content$$${{/if}}\">^^^&content$$$</div>'\n      },\n\n      // Quotes found inside of Handlebars expressions inside of quoted\n      // strings themselves should not be considered string delimiters.\n      {\n        unchanged: '<div class=\"{{#if thingIs \"value\"}}^^^&content$$${{/if}}\"></div>'\n      }, {\n        unchanged: '<div class=\"{{#if thingIs \\\\\\'value\\\\\\'}}^^^&content$$${{/if}}\"></div>'\n      }, {\n        unchanged: '<div class=\\\\\\'{{#if thingIs \"value\"}}^^^&content$$${{/if}}\\\\\\'></div>'\n      }, {\n        unchanged: '<div class=\\\\\\'{{#if thingIs \\\\\\'value\\\\\\'}}^^^&content$$${{/if}}\\\\\\'></div>'\n      }, {\n        unchanged: '<span>{{condition < 0 ? \"result1\" : \"result2\"}}</span>'\n      }, {\n        unchanged: '<span>{{condition1 && condition2 && condition3 && condition4 < 0 ? \"resForTrue\" : \"resForFalse\"}}</span>'\n      }\n    ]\n  }, {\n    name: \"Handlebars Else If, Each, and Inverted Section tag indenting\",\n    description: \"Handlebar Else If, Each, and Inverted Section handling tags should be newlined after formatted tags\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"indent_handlebars\", value: \"true\" }\n    ],\n    tests: [{\n        input_: '{{#if test}}<div></div>{{else}}<div></div>{{/if}}',\n        output: '{{#if test}}\\n' + '    <div></div>\\n' + '{{else}}\\n' + '    <div></div>\\n' + '{{/if}}'\n      }, {\n        unchanged: '{{#if test}}<span></span>{{else}}<span></span>{{/if}}'\n      },\n      // Else if handling\n      {\n        input: ['<a class=\"navbar-brand\">',\n          '    {{#if connected}}',\n          '        <i class=\"fa fa-link\" style=\"color:green\"></i> {{else if sleep}}',\n          '        <i class=\"fa fa-sleep\" style=\"color:yellow\"></i>',\n          '    {{else}}',\n          '        <i class=\"fa fa-unlink\" style=\"color:red\"></i>',\n          '    {{/if}}',\n          '</a>'\n        ],\n        output: ['<a class=\"navbar-brand\">',\n          '    {{#if connected}}',\n          '        <i class=\"fa fa-link\" style=\"color:green\"></i>',\n          '    {{else if sleep}}',\n          '        <i class=\"fa fa-sleep\" style=\"color:yellow\"></i>',\n          '    {{else}}',\n          '        <i class=\"fa fa-unlink\" style=\"color:red\"></i>',\n          '    {{/if}}',\n          '</a>'\n        ]\n      },\n      // Each handling\n      {\n        unchanged: [\n          '{{#each clinics as |clinic|}}',\n          '    <p>{{clinic.name}}</p>',\n          '{{else}}',\n          '    <p>Unfortunately no clinics found.</p>',\n          '{{/each}}'\n        ]\n      },\n      // Inverted section handling.\n      {\n        comment: \"Issue #1623 - Fix indentation of `^` inverted section tags in Handlebars/Mustache code\",\n        unchanged: [\n          '{{^inverted-condition}}',\n          '    <p>Unfortunately this condition is false.</p>',\n          '{{/inverted-condition}}'\n        ]\n      },\n      // Indentation of partials\n      {\n        comment: \"Issue #1756 - Fix indentation of partials\",\n        unchanged: [\n          '{{#*inline \"myPartial\"}}',\n          '    <p>Unfortunately this condition is false.</p>',\n          '{{/inline}}'\n        ]\n      },\n      {\n        unchanged: [\n          '{{#> myPartial}}',\n          '    <p>Unfortunately this condition is false.</p>',\n          '{{/myPartial}}'\n        ]\n      },\n      {\n        comment: \"Issue #1946 - Indentation of partial blocks with whitespace following partial name\",\n        unchanged: [\n          '{{#> myPartial }}',\n          '    <p>Unfortunately this condition is false.</p>',\n          '{{/myPartial}}'\n        ]\n      },\n      {\n        comment: \"Issue #1946 - Indentation of partial blocks with parameters\",\n        unchanged: [\n          '{{#> myPartial param=\"test\"}}',\n          '    <p>Unfortunately this condition is false.</p>',\n          '{{/myPartial}}'\n        ]\n      },\n      {\n        comment: \"Issue #1946 - Indentation of inline partials with parameters\",\n        unchanged: [\n          '{{#*inline \"myPartial\" param=\"test\"}}',\n          '    <p>Unfortunately this condition is false.</p>',\n          '{{/inline}}'\n        ]\n      }\n    ]\n  }, {\n    name: \"Unclosed html elements\",\n    description: \"Unclosed elements should not indent\",\n    options: [],\n    tests: [\n      { unchanged: '<source>\\n<source>' },\n      { unchanged: '<br>\\n<br>' },\n      { unchanged: '<input>\\n<input>' },\n      { unchanged: '<meta>\\n<meta>' },\n      { unchanged: '<link>\\n<link>' },\n      { unchanged: '<colgroup>\\n    <col>\\n    <col>\\n</colgroup>' },\n      { input: '<source>\\n    <source>', output: '<source>\\n<source>' },\n      { input: '<br>\\n    <br>', output: '<br>\\n<br>' },\n      { input: '<input>\\n    <input>', output: '<input>\\n<input>' },\n      { input: '<meta>\\n    <meta>', output: '<meta>\\n<meta>' },\n      { input: '<link>\\n    <link>', output: '<link>\\n<link>' },\n      { input: '<colgroup>\\n        <col>\\n        <col>\\n</colgroup>', output: '<colgroup>\\n    <col>\\n    <col>\\n</colgroup>' }\n    ]\n  }, {\n    name: \"Optional html elements\",\n    description: \"Optional elements should not indent\",\n    options: [],\n    tests: [{\n      fragment: true,\n      unchanged: [\n        '<li>test content',\n        '<li>test content',\n        '<li>test content'\n      ]\n    }, {\n      unchanged: [\n        '<ol>',\n        '    <li>test content',\n        '    <li>test content',\n        '    <li>test content',\n        '</ol>'\n      ]\n    }, {\n      unchanged: [\n        '<menu>',\n        '    <li>test content',\n        '    <li>test content',\n        '    <li>test content',\n        '</menu>'\n      ]\n    }, {\n      unchanged: [\n        '<ol>',\n        '    <li>',\n        '        test content',\n        '    <li>',\n        '        <ul>',\n        '            <li> extra text',\n        '            <li> depth check',\n        '        </ul>',\n        '    <li> test content',\n        '    <li>',\n        '        test content',\n        '</ol>'\n      ]\n    }, {\n      unchanged: [\n        '<menu>',\n        '    <li>',\n        '        test content',\n        '    <li>',\n        '        <ol>',\n        '            <li> level 1 check',\n        '            <li>',\n        '                <menu>',\n        '                    <li> level 2 check',\n        '                    <li>',\n        '                        <ul>',\n        '                            <li> level 3 check',\n        '                        </ul>',\n        '                    <li>',\n        '                        test content',\n        '                </menu>',\n        '        </ol>',\n        '    <li> test content',\n        '    <li>',\n        '        test content',\n        '</menu>'\n      ]\n    }, {\n      unchanged: [\n        '<dl>',\n        '    <dt>',\n        '        test content',\n        '    <dt>',\n        '        test content',\n        '    <dd>',\n        '        test content',\n        '    <dd>',\n        '        test content',\n        '    <dt>',\n        '        test content',\n        '    <dd>',\n        '        <dl>',\n        '            <dt>',\n        '                test content',\n        '            <dt>',\n        '                test content',\n        '            <dd>',\n        '                test content',\n        '        </dl>',\n        '</dl>'\n      ]\n    }, {\n      unchanged: [\n        '<select>',\n        '    <optgroup>',\n        '        test content',\n        '    <optgroup>',\n        '        test content',\n        '        <option>',\n        '            test content',\n        '        <option>',\n        '            test content',\n        '    <optgroup>',\n        '        test content',\n        '        <option>',\n        '            <p>test content',\n        '        <option>',\n        '            test content',\n        '</select>'\n      ]\n    }, {\n      comment: \"Regression test for #1649\",\n      unchanged: [\n        '<table>',\n        '    <tbody>',\n        '        <tr>',\n        '            <td>',\n        '                <table>',\n        '                    <thead>',\n        '                        <th>',\n        '                        </th>',\n        '                    </thead>',\n        '                    <tbody>',\n        '                        <tr>',\n        '                            <td>',\n        '                            </td>',\n        '                        </tr>',\n        '                    </tbody>',\n        '                </table>',\n        '            </td>',\n        '        </tr>',\n        '    </tbody>',\n        '</table>'\n      ]\n    }, {\n      unchanged: [\n        '<table>',\n        '    <caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)',\n        '    <colgroup>',\n        '        <col>',\n        '        <col>',\n        '        <col>',\n        '    <thead>',\n        '        <tr>',\n        '            <th>Function',\n        '            <th>Control Unit',\n        '            <th>Central Station',\n        '    <tbody>',\n        '        <tr>',\n        '            <td>Headlights',\n        '            <td>✔',\n        '            <td>✔',\n        '        <tr>',\n        '            <td>Interior Lights',\n        '            <td>✔',\n        '            <td>✔',\n        '        <tr>',\n        '            <td>Electric locomotive operating sounds',\n        '            <td>✔',\n        '                <table>',\n        '                    <caption>37547 TEE Electric Powered Rail Car Train Functions (Abbreviated)',\n        '                    <colgroup>',\n        '                        <col>',\n        '                        <col>',\n        '                        <col>',\n        '                    <thead>',\n        '                        <tr>',\n        '                            <th>Function',\n        '                            <th>',\n        '                                <p>Control Unit',\n        '                            <th>Central Station',\n        '                    <tbody>',\n        '                        <tr>',\n        '                            <td>Headlights',\n        '                            <td>✔',\n        '                            <td>✔',\n        '                        <tr>',\n        '                            <td>Interior Lights',\n        '                            <td>✔',\n        '                            <td>✔',\n        '                        <tr>',\n        '                            <td>Electric locomotive operating sounds',\n        '                            <td>✔',\n        '                            <td>✔',\n        '                        <tr>',\n        '                            <td>Engineer’s cab lighting',\n        '                            <td>',\n        '                            <td>✔',\n        '                        <tr>',\n        '                            <td>Station Announcements - Swiss',\n        '                            <td>',\n        '                            <td>✔',\n        '                    <tfoot>',\n        '                        <tr>',\n        '                            <td>Station Announcements - Swiss',\n        '                            <td>',\n        '                            <td>✔',\n        '                </table>',\n        '            <td>✔',\n        '        <tr>',\n        '            <td>Engineer’s cab lighting',\n        '            <td>',\n        '            <td>✔',\n        '        <tr>',\n        '            <td>Station Announcements - Swiss',\n        '            <td>',\n        '            <td>✔',\n        '    <tfoot>',\n        '        <tr>',\n        '            <td>Station Announcements - Swiss',\n        '            <td>',\n        '            <td>✔',\n        '</table>'\n      ]\n    }, {\n      comment: 'Regression test for #1213',\n      input: [\n        '<ul><li>ab<li>cd</li><li>cd</li></ul><dl><dt>ef<dt>gh</dt><dt>gh</dt></dl>',\n        '<ul><li>ab</li><li>cd<li>cd</li></ul><dl><dt>ef</dt><dt>gh<dt>gh</dt></dl>'\n      ],\n      output: [\n        '<ul>',\n        '    <li>ab',\n        '    <li>cd</li>',\n        '    <li>cd</li>',\n        '</ul>',\n        '<dl>',\n        '    <dt>ef',\n        '    <dt>gh</dt>',\n        '    <dt>gh</dt>',\n        '</dl>',\n        '<ul>',\n        '    <li>ab</li>',\n        '    <li>cd',\n        '    <li>cd</li>',\n        '</ul>',\n        '<dl>',\n        '    <dt>ef</dt>',\n        '    <dt>gh',\n        '    <dt>gh</dt>',\n        '</dl>'\n      ]\n    }, {\n      comment: 'P element optional closing tag - #1503',\n      input: [\n        '<p><p><dl><dt>ef<dt><p>gh</dt><dt>gh</dt></dl><p><h3>headers are outside paragraphs</h3>',\n        '<p>.<textarea><p><p>.</textarea><textarea><p><p>.</textarea><p>.<p>.</p>'\n      ],\n      output: [\n        '<p>',\n        '<p>',\n        '<dl>',\n        '    <dt>ef',\n        '    <dt>',\n        '        <p>gh',\n        '    </dt>',\n        '    <dt>gh</dt>',\n        '</dl>',\n        '<p>',\n        '<h3>headers are outside paragraphs</h3>',\n        '<p>.<textarea><p><p>.</textarea><textarea><p><p>.</textarea>',\n        '<p>.',\n        '<p>.</p>'\n      ]\n    }]\n  }, {\n    name: \"Unformatted tags\",\n    description: \"Unformatted tag behavior\",\n    options: [],\n    tests: [{\n        input: '<ol>\\n    <li>b<pre>c</pre></li>\\n</ol>',\n        output: [\n          '<ol>',\n          '    <li>b',\n          '        <pre>c</pre>',\n          '    </li>',\n          '</ol>'\n        ]\n      },\n      { unchanged: '<ol>\\n    <li>b<code>c</code></li>\\n</ol>' },\n      { unchanged: '<ul>\\n    <li>\\n        <span class=\"octicon octicon-person\"></span>\\n        <a href=\"/contact/\">Kontakt</a>\\n    </li>\\n</ul>' },\n      { unchanged: '<div class=\"searchform\"><input type=\"text\" value=\"\" name=\"s\" id=\"s\" /><input type=\"submit\" id=\"searchsubmit\" value=\"Search\" /></div>' },\n      { unchanged: '<div class=\"searchform\"><input type=\"text\" value=\"\" name=\"s\" id=\"s\"><input type=\"submit\" id=\"searchsubmit\" value=\"Search\"></div>' },\n      { unchanged: '<p>\\n    <a href=\"/test/\"><img src=\"test.jpg\" /></a>\\n</p>' },\n      { unchanged: '<p>\\n    <a href=\"/test/\"><img src=\"test.jpg\" /></a><a href=\"/test/\"><img src=\"test.jpg\" /></a>\\n</p>' },\n      { unchanged: '<p>\\n    <a href=\"/test/\"><img src=\"test.jpg\" /></a><a href=\"/test/\"><img src=\"test.jpg\" /></a><a href=\"/test/\"><img src=\"test.jpg\" /></a><a href=\"/test/\"><img src=\"test.jpg\" /></a>\\n</p>' },\n      { unchanged: '<p>\\n    <span>image: <img src=\"test.jpg\" /></span><span>image: <img src=\"test.jpg\" /></span>\\n</p>' },\n      { unchanged: '<p>\\n    <strong>image: <img src=\"test.jpg\" /></strong><strong>image: <img src=\"test.jpg\" /></strong>\\n</p>' }\n    ]\n  }, {\n    name: \"File starting with comment\",\n    description: \"Unformatted tag behavior\",\n    options: [],\n    tests: [{\n      unchanged: [\n        '<!--sample comment -->',\n        '',\n        '<html>',\n        '<body>',\n        '    <span>a span</span>',\n        '</body>',\n        '',\n        '</html>'\n      ]\n    }]\n  }, {\n    name: \"ISSUE #545 and #944 Ignore directive works in html\",\n    description: \"\",\n    options: [],\n    tests: [{\n      comment: 'ignore starts _after_ the start comment, ends after the end comment',\n      unchanged: [\n        '<div>',\n        '    <!-- beautify ignore:start -->',\n        '@{',\n        '',\n        '    ViewBag.Title = \"Dashboard\";',\n        '    string firstName = string.Empty;',\n        '    string userId = ViewBag.UserId;',\n        '',\n        '    if( !string.IsNullOrEmpty(ViewBag.FirstName ) ) {',\n        '',\n        '         firstName = \"<h2>Hi \" + ViewBag.FirstName + \"</h2>\";',\n        '',\n        '    }',\n        '',\n        '}',\n        ' <!-- beautify ignore:end -->',\n        '',\n        '    <header class=\"layout-header\">',\n        '',\n        '        <h2 id=\"logo\"><a href=\"/\">Logo</a></h2>',\n        '',\n        '        <ul class=\"social\">',\n        '',\n        '            <li class=\"facebook\"><a href=\"#\">Facebook</a></li>',\n        '            <li class=\"twitter\"><a href=\"#\">Twitter</a></li>',\n        '',\n        '        </ul>',\n        '',\n        '    </header>',\n        '</div>'\n      ]\n    }]\n  }, {\n    name: \"Issue 1478 - Space handling inside self closing tag\",\n    description: \"Properly indent following text after self closing tags regardless of space\",\n    options: [],\n    tests: [{\n      input: [\n        '<div>',\n        '    <br/>',\n        '    <br />',\n        '</div>'\n      ],\n      output: [\n        '<div>',\n        '    <br />',\n        '    <br />',\n        '</div>'\n      ]\n    }]\n  }, {\n    name: \"Single line comment after closing tag\",\n    description: \"Keep single line comments as they are after closing tags\",\n    options: [],\n    tests: [{\n      input: [\n        '<div class=\"col\">',\n        '    <div class=\"row\">',\n        '        <div class=\"card\">',\n        '',\n        '            <h1>Some heading</h1>',\n        '            <p>Some text for the card.</p>',\n        '            <img src=\"some/image.jpg\" alt=\"\">',\n        '',\n        '            </div>    <!-- /.card -->',\n        '    </div>',\n        '            <!-- /.row -->',\n        '</div> <!-- /.col -->'\n      ],\n      output: [\n        '<div class=\"col\">',\n        '    <div class=\"row\">',\n        '        <div class=\"card\">',\n        '',\n        '            <h1>Some heading</h1>',\n        '            <p>Some text for the card.</p>',\n        '            <img src=\"some/image.jpg\" alt=\"\">',\n        '',\n        '        </div> <!-- /.card -->',\n        '    </div>',\n        '    <!-- /.row -->',\n        '</div> <!-- /.col -->'\n      ]\n    }]\n  }, {\n    name: \"Regression Tests\",\n    description: \"Regression Tests\",\n    options: [],\n    tests: [{\n        comment: '#1202',\n        unchanged: '<a class=\"js-open-move-from-header\" href=\"#\">5A - IN-SPRINT TESTING</a>'\n      },\n      { fragment: true, unchanged: '<a \">9</a\">' },\n      { unchanged: '<a href=\"javascript:;\" id=\"_h_url_paid_pro3\" onmousedown=\"_h_url_click_paid_pro(this);\" rel=\"nofollow\" class=\"pro-title\" itemprop=\"name\">WA GlassKote</a>' },\n      { unchanged: '<a href=\"/b/yergey-brewing-a-beer-has-no-name/1745600\">\"A Beer Has No Name\"</a>' },\n      {\n        comment: '#1304',\n        unchanged: '<label>Every</label><input class=\"scheduler__minutes-input\" type=\"text\">'\n      },\n      {\n        comment: '#1377',\n        unchanged: [\n          '<a href=\\\\\\'\\\\\\' onclick=\\\\\\'doIt(\"<?php echo str_replace(\"\\\\\\'\", \"\\\\\\\\ \", $var); ?>  \"); \\\\\\'>',\n          '    Test',\n          '</a>',\n          '',\n          '<?php include_once $_SERVER[\\\\\\'DOCUMENT_ROOT\\\\\\'] . \"/shared/helpModal.php\";  ?>'\n        ]\n      }, {\n        comment: '#1736 - unquoted attribute with slashes',\n        unchanged: [\n          '<div>',\n          '    <a href=http://www.example.com></a>',\n          '</div>'\n        ]\n      }\n    ]\n  }, {\n    name: \"minimal template handling\",\n    description: \"treated as content.\",\n    template: \"^^^ $$$\",\n    matrix: [\n\n      // Php (<?php ... ?> and <?= ... ?>) =.\n      {\n        s: '<?php',\n        e: '?>'\n      },\n      {\n        s: '<?=',\n        e: '?>'\n      },\n      {\n        s: '<? ',\n        e: '?>'\n      },\n      // erb, ejs, asp: <% ... %>\n      {\n        s: '<%',\n        e: '%>'\n      },\n      // django {{ ... }} and {# ... #} and {% ... %}\n      {\n        s: '{{',\n        e: '}}'\n      },\n      {\n        s: '{#',\n        e: '#}'\n      },\n      {\n        s: '{%',\n        e: '%}'\n      },\n      // smarty {...} and {/* ... */} and {literal} ... {/literal}\n      {\n        options: [\n          { name: \"templating\", value: \"'smarty'\" }\n        ],\n        s: '{a',\n        e: 'a}'\n      },\n      {\n        options: [\n          { name: \"templating\", value: \"'smarty'\" }\n        ],\n        s: '{*',\n        e: '*}'\n      },\n      {\n        options: [\n          { name: \"templating\", value: \"'smarty'\" }\n        ],\n        s: '{literal}',\n        e: '{/literal}'\n      },\n      // handlebars {{ ... }} and {{# ... }} and {{! ... }} and {{!-- --}}\n      {\n        options: [\n          { name: \"indent_handlebars\", value: \"false\" }\n        ],\n        s: '{{',\n        e: '}}'\n      },\n      {\n        options: [\n          { name: \"indent_handlebars\", value: \"false\" }\n        ],\n        s: '{{#',\n        e: '}}'\n      },\n      {\n        options: [\n          { name: \"indent_handlebars\", value: \"false\" }\n        ],\n        s: '{{!',\n        e: '}}'\n      },\n      {\n        options: [\n          { name: \"indent_handlebars\", value: \"false\" }\n        ],\n        s: '{{!--',\n        e: '--}}'\n      }\n\n    ],\n    tests: [{\n      input: '<h1  class=\"content-page-header\">^^^s$$$$view[\"name\"]; ^^^e$$$</h1>',\n      output: '<h1 class=\"content-page-header\">^^^s$$$$view[\"name\"]; ^^^e$$$</h1>'\n    }, {\n      unchanged: [\n        '^^^s$$$',\n        'for($i = 1; $i <= 100; $i++;) {',\n        '    #count to 100!',\n        '    echo($i . \"</br>\");',\n        '}',\n        '^^^e$$$'\n      ]\n    }, {\n      fragment: true,\n      unchanged: [\n        '^^^s$$$ ^^^e$$$',\n        '<!DOCTYPE html>',\n        '',\n        '<html>',\n        '',\n        '<head></head>',\n        '',\n        '<body></body>',\n        '',\n        '</html>'\n      ]\n    }, {\n      unchanged: [\n        '^^^s$$$ \"A\" ^^^e$$$abc^^^s$$$ \"D\" ^^^e$$$',\n        '^^^s$$$ \"B\" ^^^e$$$',\n        '^^^s$$$ \"C\" ^^^e$$$'\n      ]\n    }, {\n      unchanged: [\n        '^^^s$$$',\n        'echo \"A\";',\n        '^^^e$$$',\n        '<span>Test</span>'\n      ]\n    }, {\n      unchanged: [\n        '<^^^s$$$ html_element(); ^^^e$$$ ^^^s$$$language_attributes();^^^e$$$>abc</^^^s$$$ html_element(); ^^^e$$$>'\n      ]\n    }, {\n      unchanged: [\n        '<input type=\"text\" value=\"^^^s$$$$x[\"test\"] . $x[\\\\\\'test\\\\\\']^^^e$$$\">'\n      ]\n    }]\n  }, {\n    name: \"Support simple language specific option inheritance/overriding\",\n    description: \"Support simple language specific option inheritance/overriding\",\n    matrix: [{\n        options: [\n          { name: \"js\", value: \"{ 'indent_size': 3 }\" },\n          { name: \"css\", value: \"{ 'indent_size': 5 }\" }\n        ],\n        h: '    ',\n        c: '     ',\n        j: '   ',\n        dhc: '    ',\n        dhj: '    ',\n        dc: '     ',\n        dj: '   '\n      },\n      {\n        options: [\n          { name: \"html\", value: \"{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 } }\" }\n        ],\n        h: '    ',\n        c: '     ',\n        j: '   ',\n        dhc: '    ',\n        dhj: '    ',\n        dc: '     ',\n        dj: '   '\n      },\n      {\n        options: [\n          { name: \"indent_size\", value: \"9\" },\n          { name: \"js\", value: \"{ 'indent_size': 5 }\" },\n          { name: \"css\", value: \"{ 'indent_size': 3 }\" }\n        ],\n        h: '         ',\n        c: '   ',\n        j: '     ',\n        dhc: '         ',\n        dhj: '         ',\n        dc: '   ',\n        dj: '     '\n      },\n      {\n        options: [\n          { name: \"indent_size\", value: \"9\" },\n          { name: \"js\", value: \"{ 'indent_size': 5, 'disabled': true }\" },\n          { name: \"css\", value: \"{ 'indent_size': 3 }\" }\n        ],\n        h: '         ',\n        c: '   ',\n        j: '     ',\n        dhc: '         ',\n        dhj: '',\n        dc: '   ',\n        dj: ''\n      },\n      {\n        options: [\n          { name: \"indent_size\", value: \"9\" },\n          { name: \"js\", value: \"{ 'indent_size': 5 }\" },\n          { name: \"css\", value: \"{ 'indent_size': 3, 'disabled': true }\" }\n        ],\n        h: '         ',\n        c: '   ',\n        j: '     ',\n        dhc: '',\n        dhj: '         ',\n        dc: '',\n        dj: '     '\n      },\n      {\n        options: [\n          { name: \"indent_size\", value: \"9\" },\n          { name: \"html\", value: \"{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 }, 'indent_size': 2}\" },\n          { name: \"js\", value: \"{ 'indent_size': 5 }\" },\n          { name: \"css\", value: \"{ 'indent_size': 3 }\" }\n        ],\n        h: '  ',\n        c: '     ',\n        j: '   ',\n        dhc: '  ',\n        dhj: '  ',\n        dc: '     ',\n        dj: '   '\n      },\n      {\n        options: [\n          { name: \"indent_size\", value: \"9\" },\n          { name: \"html\", value: \"{ 'js': { 'indent_size': 3, 'disabled': true }, 'css': { 'indent_size': 5 }, 'indent_size': 2}\" },\n          { name: \"js\", value: \"{ 'indent_size': 5 }\" },\n          { name: \"css\", value: \"{ 'indent_size': 3 }\" }\n        ],\n        h: '  ',\n        c: '     ',\n        j: '   ',\n        dhc: '  ',\n        dhj: '',\n        dc: '     ',\n        dj: ''\n      }\n    ],\n    tests: [{\n        fragment: true,\n        unchanged: [\n          '<head>',\n          '{{h}}<script>',\n          '{{h}}{{h}}if (a == b) {',\n          '{{h}}{{h}}{{j}}test();',\n          '{{h}}{{h}}}',\n          '{{h}}</script>',\n          '{{h}}<style>',\n          '{{h}}{{h}}.selector {',\n          '{{h}}{{h}}{{c}}font-size: 12px;',\n          '{{h}}{{h}}}',\n          '{{h}}</style>',\n          '</head>'\n        ]\n      }, {\n        fragment: true,\n        input: [\n          '<head>',\n          '<script>',\n          'if (a == b) {',\n          'test();',\n          '}',\n          '</script>',\n          '<style>',\n          '.selector {',\n          'font-size: 12px;',\n          '}',\n          '</style>',\n          '</head>'\n        ],\n        output: [\n          '<head>',\n          '{{h}}<script>',\n          '{{h}}{{h}}if (a == b) {',\n          '{{dhj}}{{dhj}}{{dj}}test();',\n          '{{dhj}}{{dhj}}}',\n          '{{h}}</script>',\n          '{{h}}<style>',\n          '{{h}}{{h}}.selector {',\n          '{{dhc}}{{dhc}}{{dc}}font-size: 12px;',\n          '{{dhc}}{{dhc}}}',\n          '{{h}}</style>',\n          '</head>'\n        ]\n      },\n      {\n        fragment: true,\n        unchanged: [\n          '<body>',\n          '{{h}}<script src=\"one.js\"></script> <!-- one -->',\n          '{{h}}<script src=\"two.js\"></script> <!-- two-->',\n          '</body>'\n        ]\n      }\n    ]\n  }, {\n    name: \"Tests script indent behavior\",\n    description: \"Tests script indenting behavior\",\n    matrix: [{\n        options: [\n          { name: \"indent_scripts\", value: \"'normal'\" }\n        ],\n        h: '    ',\n        c: '    ',\n        j: '    ',\n        hscript: '        '\n      },\n      {\n        options: [\n          { name: \"indent_scripts\", value: \"'keep'\" }\n        ],\n        h: '    ',\n        c: '    ',\n        j: '    ',\n        hscript: '    '\n      },\n      {\n        options: [\n          { name: \"indent_scripts\", value: \"'separate'\" }\n        ],\n        h: '    ',\n        c: '    ',\n        j: '    ',\n        hscript: ''\n      }\n    ],\n    tests: [{\n        fragment: true,\n        input: [\n          '<head>',\n          '<script>',\n          'if (a == b) {',\n          'test();',\n          '}',\n          '</script>',\n          '<style>',\n          '.selector {',\n          'font-size: 12px;',\n          '}',\n          '</style>',\n          '</head>'\n        ],\n        output: [\n          '<head>',\n          '{{h}}<script>',\n          '{{hscript}}if (a == b) {',\n          '{{hscript}}{{j}}test();',\n          '{{hscript}}}',\n          '{{h}}</script>',\n          '{{h}}<style>',\n          '{{hscript}}.selector {',\n          '{{hscript}}{{c}}font-size: 12px;',\n          '{{hscript}}}',\n          '{{h}}</style>',\n          '</head>'\n        ]\n      },\n      {\n        fragment: true,\n        unchanged: [\n          '<body>',\n          '{{h}}<script src=\"one.js\"></script> <!-- one -->',\n          '{{h}}<script src=\"two.js\"></script> <!-- two-->',\n          '</body>'\n        ]\n      }\n    ]\n  }, {\n    name: \"ASP(X) and JSP directives <%@ indent formatting\",\n    description: \"\",\n    options: [],\n    tests: [{\n      unchanged: [\n        '<%@Master language=\"C#\"%>',\n        '<%@Register TagPrefix=\"a\" Namespace=\"a\" Assembly=\"a\"%>',\n        '<%@Register TagPrefix=\"b\" Namespace=\"a\" Assembly=\"a\"%>',\n        '<%@Register TagPrefix=\"c\" Namespace=\"a\" Assembly=\"a\"%>',\n        '<!DOCTYPE html>',\n        '',\n        '<html>',\n        '',\n        '<some-content />',\n        '',\n        '</html>'\n      ]\n    }]\n  }, {\n    name: \"Issue #1027 -- Formatting SVG files\",\n    description: \"\",\n    options: [],\n    tests: [{\n      input: [\n        '<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"',\n        '     viewBox=\"0 0 36 36\" style=\"enable-background:new 0 0 36 36;\" xml:space=\"preserve\">',\n        '                    <rect id=\"XMLID_20_\" x=\"-7\"',\n        '                          class=\"st0\"',\n        '                          width=\"49\" height=\"36\"/>',\n        '</svg>'\n      ],\n      output: [\n        '<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 36 36\" style=\"enable-background:new 0 0 36 36;\" xml:space=\"preserve\">',\n        '    <rect id=\"XMLID_20_\" x=\"-7\" class=\"st0\" width=\"49\" height=\"36\" />',\n        '</svg>'\n      ]\n    }]\n  }, {\n    name: \"Linewrap length\",\n    description: \"\",\n    options: [{ name: \"wrap_line_length\", value: \"80\" }],\n    tests: [{\n        comment: \"This test shows how line wrapping is still not correct.\",\n        fragment: true,\n        input: [\n          '<body>',\n          '    <div>',\n          '        <div>',\n          '            <p>Reconstruct the schematic editor the EDA system <a href=\"http://www.jedat.co.jp/eng/products.html\"><i>AlphaSX</i></a> series</p>',\n          '        </div>',\n          '    </div>',\n          '</body>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<body>',\n          '    <div>',\n          '        <div>',\n          '            <p>Reconstruct the schematic editor the EDA system <a',\n          '                    href=\"http://www.jedat.co.jp/eng/products.html\"><i>AlphaSX</i></a>',\n          '                series</p>',\n          '        </div>',\n          '    </div>',\n          '</body>'\n        ]\n      }, {\n        fragment: true,\n        input: [\n          '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020</span>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<span>0 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014',\n          '    0015 0016 0017 0018 0019 0020</span>'\n        ]\n      }, {\n        fragment: true,\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        unchanged: [\n          '<div>----1---------2---------3---------4---------5---------6---------7----</div>'\n        ]\n      }, {\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        unchanged: [\n          '<span>----1---------2---------3---------4---------5---------6---------7----</span>'\n        ]\n      }, {\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        unchanged: [\n          '<span>----1---------2---------3---------4---------5---------6---------7----<br /></span>'\n        ]\n      }, {\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7-----</div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>----1---------2---------3---------4---------5---------6---------7-----',\n          '</div>'\n        ]\n      }, {\n        fragment: true,\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7-----<br /></div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>',\n          '    ----1---------2---------3---------4---------5---------6---------7-----<br />',\n          '</div>'\n        ]\n      }, {\n        fragment: true,\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7-----<hr /></div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>----1---------2---------3---------4---------5---------6---------7-----',\n          '    <hr />',\n          '</div>'\n        ]\n      }, {\n        fragment: true,\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7-----<hr />-</div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>----1---------2---------3---------4---------5---------6---------7-----',\n          '    <hr />-',\n          '</div>'\n        ]\n      }, {\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7 --------81 ----2---------3---------4---------5---------6---------7-----</div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>----1---------2---------3---------4---------5---------6---------7',\n          '    --------81 ----2---------3---------4---------5---------6---------7-----',\n          '</div>'\n        ]\n      }, {\n        input: [\n          '<span>---1---------2---------3---------4---------5---------6---------7 --------81 ----2---------3---------4---------5---------6</span>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<span>---1---------2---------3---------4---------5---------6---------7',\n          '    --------81 ----2---------3---------4---------5---------6</span>'\n        ]\n      }, {\n        input: [\n          '<p>---------1---------2---------3---------4 ---------1---------2---------3---------4</p>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          // BUGBUG Input should result in this, but doesn't\n          // '<p>---------1---------2---------3---------4',\n          // '    ---------1---------2---------3---------4',\n          // '</p>'\n          '<p>---------1---------2---------3---------4',\n          '    ---------1---------2---------3---------4</p>'\n        ]\n      }, {\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7 --------81 ----2---------3---------4---------5---------6</div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          // BUGBUG Input should result in this, but doesn't\n          // '<div>----1---------2---------3---------4---------5---------6---------7',\n          // '    --------81 ----2---------3---------4---------5---------6',\n          // '</div>'\n          '<div>----1---------2---------3---------4---------5---------6---------7',\n          '    --------81 ----2---------3---------4---------5---------6</div>'\n        ]\n      }, {\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7 --------81 ----2---------3---------4---------5---------6<br /></div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          // BUGBUG Input should result in this, but doesn't\n          // '<div>----1---------2---------3---------4---------5---------6---------7',\n          // '    --------81 ----2---------3---------4---------5---------6<br />',\n          // '</div>'\n          '<div>----1---------2---------3---------4---------5---------6---------7',\n          '    --------81 ----2---------3---------4---------5---------6<br /></div>'\n        ]\n      }, {\n        input: [\n          '<div>----1---------2---------3---------4---------5---------6---------7 --------81 ----2---------3---------4---------5---------6<hr /></div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>----1---------2---------3---------4---------5---------6---------7',\n          '    --------81 ----2---------3---------4---------5---------6',\n          '    <hr />',\n          '</div>'\n        ]\n      },\n      {\n        comment: \"#1238  Fixed\",\n        input: [\n          '<span uib-tooltip=\"[[firstName]] [[lastName]]\" tooltip-enable=\"showToolTip\">',\n          '   <ng-letter-avatar charCount=\"2\" data=\"[[data]]\"',\n          '        shape=\"round\" fontsize=\"[[font]]\" height=\"[[height]]\" width=\"[[width]]\"',\n          '   avatarcustombgcolor=\"[[bgColor]]\" dynamic=\"true\"></ng-letter-avatar>',\n          '     </span>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<span uib-tooltip=\"[[firstName]] [[lastName]]\" tooltip-enable=\"showToolTip\">',\n          '    <ng-letter-avatar charCount=\"2\" data=\"[[data]]\" shape=\"round\"',\n          '        fontsize=\"[[font]]\" height=\"[[height]]\" width=\"[[width]]\"',\n          '        avatarcustombgcolor=\"[[bgColor]]\" dynamic=\"true\"></ng-letter-avatar>',\n          '</span>'\n        ]\n      }, {\n        comment: \"Issue #1122\",\n        fragment: true,\n        input: [\n          '<div>',\n          '<div>',\n          '<p>',\n          '    В РАБОЧЕМ РЕЖИМЕ, после ввода параметров опыта (номер, шаг отсчетов и глубина зондирования), текущие',\n          '    отсчеты сохраняются в контроллере при нажатии кнопки «ПУСК». Одновременно, они распечатываются',\n          '    на минипринтере. Управлять контроллером для записи данных зондирования можно при помощи <link_row to=\"РК.05.01.01\">Радиокнопки РК-11</link_row>.',\n          '</p>',\n          '</div>',\n          '</div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>',\n          '    <div>',\n          '        <p>',\n          '            В РАБОЧЕМ РЕЖИМЕ, после ввода параметров опыта (номер, шаг отсчетов',\n          '            и глубина зондирования), текущие',\n          '            отсчеты сохраняются в контроллере при нажатии кнопки «ПУСК».',\n          '            Одновременно, они распечатываются',\n          '            на минипринтере. Управлять контроллером для записи данных',\n          '            зондирования можно при помощи <link_row to=\"РК.05.01.01\">Радиокнопки',\n          '                РК-11</link_row>.',\n          '        </p>',\n          '    </div>',\n          '</div>'\n        ]\n      }, {\n        comment: \"Issue #1122\",\n        fragment: true,\n        input: [\n          '<div>',\n          '<div>',\n          '<p>',\n          '    В РАБОЧЕМ РЕЖИМЕ, после ввода параметров опыта (номер, шаг отсчетов и глубина зондирования), текущие отсчеты сохраняются в контроллере при нажатии кнопки «ПУСК». Одновременно, они распечатываются на минипринтере. Управлять контроллером для записи данных зондирования можно при помощи <link_row to=\"РК.05.01.01\">Радиокнопки РК-11</link_row>.',\n          '</p>',\n          '</div>',\n          '</div>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<div>',\n          '    <div>',\n          '        <p>',\n          '            В РАБОЧЕМ РЕЖИМЕ, после ввода параметров опыта (номер, шаг отсчетов',\n          '            и глубина зондирования), текущие отсчеты сохраняются в контроллере',\n          '            при нажатии кнопки «ПУСК». Одновременно, они распечатываются на',\n          '            минипринтере. Управлять контроллером для записи данных зондирования',\n          '            можно при помощи <link_row to=\"РК.05.01.01\">Радиокнопки РК-11',\n          '            </link_row>.',\n          '        </p>',\n          '    </div>',\n          '</div>'\n        ]\n      }, {\n        comment: \"#607 - preserve-newlines makes this look a bit odd now, but it much better\",\n        fragment: true,\n        input: [\n          '<p>В РАБОЧЕМ РЕЖИМЕ, после ввода параметров опыта (номер, шаг отсчетов и глубина зондирования), текущие',\n          '    отсчеты сохраняются в контроллере при нажатии кнопки «ПУСК». Одновременно, они распечатываются',\n          '    на минипринтере. Управлять контроллером для записи данных зондирования можно при помощи <link_row to=\"РК.05.01.01\">Радиокнопки РК-11</link_row>.</p>'\n        ],\n        //.---------1---------2---------3---------4---------5---------6---------7---------8---------9--------10--------11--------12--------13--------14--------15--------16--------17--------18--------19--------20--------21--------22--------23--------24--------25--------26--------27--------28--------29\n        output: [\n          '<p>В РАБОЧЕМ РЕЖИМЕ, после ввода параметров опыта (номер, шаг отсчетов и глубина',\n          '    зондирования), текущие',\n          '    отсчеты сохраняются в контроллере при нажатии кнопки «ПУСК». Одновременно,',\n          '    они распечатываются',\n          '    на минипринтере. Управлять контроллером для записи данных зондирования можно',\n          '    при помощи <link_row to=\"РК.05.01.01\">Радиокнопки РК-11</link_row>.</p>'\n        ]\n      }\n    ]\n  }, {\n    name: \"Indent with tabs\",\n    description: \"Use one tab instead of several spaces for indentation\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"indent_with_tabs\", value: \"true\" }\n    ],\n    tests: [{\n      fragment: true,\n      input_: '<div>\\n' +\n        '<div>\\n' +\n        '</div>\\n' +\n        '</div>',\n      output: '<div>\\n' +\n        '\\t<div>\\n' +\n        '\\t</div>\\n' +\n        '</div>'\n    }]\n  }, {\n    name: \"Indent without tabs\",\n    description: \"Use several spaces for indentation\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"indent_with_tabs\", value: \"false\" }\n    ],\n    tests: [{\n      fragment: true,\n      input_: '<div>\\n' + '<div>\\n' + '</div>\\n' + '</div>',\n      output: '<div>\\n' + '    <div>\\n' + '    </div>\\n' + '</div>'\n    }]\n  }, {\n    name: \"Do not indent html inner html by default\",\n    description: \"\",\n    tests: [{\n      fragment: true,\n      input: '<html>\\n<body>\\n<div></div>\\n</body>\\n\\n</html>',\n      output: '<html>\\n<body>\\n    <div></div>\\n</body>\\n\\n</html>'\n    }]\n  }, {\n    name: \"indent_inner_html set to true indents html inner html\",\n    description: \"\",\n    options: [\n      { name: 'indent_inner_html', value: \"true\" }\n    ],\n    tests: [{\n      fragment: true,\n      unchanged: '<html>\\n    <body>\\n        <div></div>\\n    </body>\\n\\n</html>'\n    }]\n  }, {\n    name: \"Indent body inner html by default\",\n    description: \"\",\n    tests: [{\n      fragment: true,\n      input: '<html>\\n<body>\\n<div></div>\\n</body>\\n\\n</html>',\n      output: '<html>\\n<body>\\n    <div></div>\\n</body>\\n\\n</html>'\n    }]\n  }, {\n    name: \"indent_body_inner_html set to false prevents indent of body inner html\",\n    description: \"\",\n    options: [\n      { name: 'indent_body_inner_html', value: \"false\" }\n    ],\n    tests: [{\n      fragment: true,\n      unchanged: '<html>\\n<body>\\n<div></div>\\n</body>\\n\\n</html>'\n    }]\n  }, {\n    name: \"Indent head inner html by default\",\n    description: \"\",\n    tests: [{\n      fragment: true,\n      input: '<html>\\n\\n<head>\\n<meta>\\n</head>\\n\\n</html>',\n      output: '<html>\\n\\n<head>\\n    <meta>\\n</head>\\n\\n</html>'\n    }]\n  }, {\n    name: \"indent_head_inner_html set to false prevents indent of head inner html\",\n    description: \"\",\n    options: [\n      { name: 'indent_head_inner_html', value: \"false\" }\n    ],\n    tests: [{\n      fragment: true,\n      unchanged: '<html>\\n\\n<head>\\n<meta>\\n</head>\\n\\n</html>'\n    }]\n  }, {\n    name: \"Inline tags formatting\",\n    description: \"\",\n    template: \"^^^ $$$\",\n    tests: [{\n      input: '<div><span></span></div><span><div></div></span>',\n      output: '<div><span></span></div><span>\\n    <div></div>\\n</span>'\n    }, {\n      input: '<div><div><span><span>Nested spans</span></span></div></div>',\n      output: [\n        '<div>',\n        '    <div><span><span>Nested spans</span></span></div>',\n        '</div>'\n      ]\n    }, {\n      input: '<p>Should remove <span><span \\n\\nclass=\"some-class\">attribute</span></span> newlines</p>',\n      output: [\n        '<p>Should remove <span><span class=\"some-class\">attribute</span></span> newlines</p>'\n      ]\n    }, {\n      unchanged: '<div><span>All</span> on <span>one</span> line</div>'\n    }, {\n      unchanged: '<span class=\"{{class_name}}\">{{content}}</span>'\n    }, {\n      unchanged: '{{#if 1}}<span>{{content}}</span>{{/if}}'\n    }]\n  }, {\n    name: \"Preserve newlines false\",\n    description: \"\",\n    options: [\n      { name: 'indent_size', value: \"2\" },\n      { name: 'preserve_newlines', value: \"false\" }\n    ],\n    tests: [{\n      input: '<div>\\n\\tfoo\\n</div>',\n      output: '<div> foo </div>'\n    }, {\n      input_: '<div>Should not</div>\\n\\n\\n' + '<div>preserve newlines</div>',\n      output: '<div>Should not</div>\\n' + '<div>preserve newlines</div>'\n    }, {\n      input: [\n        '<header>',\n        '  <h1>',\n        '',\n        '',\n        '    <ul>',\n        '',\n        '      <li class=\"menuactive menuparent\">',\n        '        <a>',\n        '          <span>Anita Koppe</span>',\n        '        </a>',\n        '',\n        '',\n        '      </li>',\n        '    </ul>',\n        '  </h1>',\n        '</header>'\n      ],\n      output: [\n        '<header>',\n        '  <h1>',\n        '    <ul>',\n        '      <li class=\"menuactive menuparent\">',\n        '        <a>',\n        '          <span>Anita Koppe</span>',\n        '        </a>',\n        '      </li>',\n        '    </ul>',\n        '  </h1>',\n        '</header>'\n      ]\n    }]\n  }, {\n    name: \"Preserve newlines true\",\n    description: \"\",\n    options: [\n      { name: 'indent_size', value: \"1\" },\n      { name: 'indent_char', value: '\"\\t\"' },\n      { name: 'preserve_newlines', value: \"true\" }\n    ],\n    tests: [{\n      fragment: true,\n      unchanged: '<div>\\n\\tfoo\\n</div>'\n    }]\n  }, {\n    name: \"Preserve newlines true with zero max newline\",\n    description: \"\",\n    options: [\n      { name: 'preserve_newlines', value: \"true\" },\n      { name: 'max_preserve_newlines', value: \"0\" },\n      { name: 'indent_size', value: \"2\" }\n    ],\n    tests: [{\n      input_: '<div>Should</div>\\n\\n\\n' + '<div>preserve zero newlines</div>',\n      output: '<div>Should</div>\\n' + '<div>preserve zero newlines</div>'\n    }, {\n      input: [\n        '<header>',\n        '  <h1>',\n        '',\n        '',\n        '    <ul>',\n        '',\n        '      <li class=\"menuactive menuparent\">',\n        '        <a>',\n        '          <span>Anita Koppe</span>',\n        '        </a>',\n        '',\n        '',\n        '      </li>',\n        '    </ul>',\n        '  </h1>',\n        '</header>'\n      ],\n      output: [\n        '<header>',\n        '  <h1>',\n        '    <ul>',\n        '      <li class=\"menuactive menuparent\">',\n        '        <a>',\n        '          <span>Anita Koppe</span>',\n        '        </a>',\n        '      </li>',\n        '    </ul>',\n        '  </h1>',\n        '</header>'\n      ]\n    }]\n  }, {\n    name: \"Preserve newlines true with 1 max newline\",\n    description: \"\",\n    options: [\n      { name: 'preserve_newlines', value: \"true\" },\n      { name: 'indent_size', value: \"2\" },\n      { name: 'max_preserve_newlines', value: \"1\" }\n    ],\n    tests: [{\n      input_: '<div>Should</div>\\n\\n\\n' + '<div>preserve one newline</div>',\n      output: '<div>Should</div>\\n\\n' + '<div>preserve one newline</div>'\n    }, {\n      input: [\n        '<header>',\n        '  <h1>',\n        '',\n        '',\n        '    <ul>',\n        '',\n        '      <li class=\"menuactive menuparent\">',\n        '        <a>',\n        '          <span>Anita Koppe</span>',\n        '        </a>',\n        '',\n        '',\n        '      </li>',\n        '    </ul>',\n        '  </h1>',\n        '</header>'\n      ],\n      output: [\n        '<header>',\n        '  <h1>',\n        '',\n        '    <ul>',\n        '',\n        '      <li class=\"menuactive menuparent\">',\n        '        <a>',\n        '          <span>Anita Koppe</span>',\n        '        </a>',\n        '',\n        '      </li>',\n        '    </ul>',\n        '  </h1>',\n        '</header>'\n      ]\n    }]\n  }, {\n    name: \"Preserve newlines true with null max newline\",\n    description: \"\",\n    options: [\n      { name: 'preserve_newlines', value: \"true\" },\n      { name: 'indent_size', value: \"2\" },\n      { name: 'max_preserve_newlines', value: \"null\" }\n    ],\n    tests: [{\n      unchanged: '<div>Should</div>\\n\\n\\n' + '<div>preserve zero newlines</div>'\n    }, {\n      unchanged: [\n        '<header>',\n        '  <h1>',\n        '',\n        '',\n        '    <ul>',\n        '',\n        '      <li class=\"menuactive menuparent\">',\n        '        <a>',\n        '          <span>Anita Koppe</span>',\n        '        </a>',\n        '',\n        '',\n        '      </li>',\n        '    </ul>',\n        '  </h1>',\n        '</header>'\n      ]\n    }]\n  }, {\n    name: \"unformatted to prevent formatting changes\",\n    description: \"\",\n    options: [\n      { name: 'unformatted', value: \"['h1', 'br', 'u', 'span', 'textarea']\" }\n    ],\n    tests: [{\n      unchanged: '<u><div><div>Ignore block tags in unformatted regions</div></div></u>'\n    }, {\n      unchanged: '<div><u>Do not wrap unformatted regions with extra newlines</u></div>'\n    }, {\n      input: [\n        '<div>',\n        '<u>Do not wrap unformatted regions with extra newlines</u></div>'\n      ],\n      output: [\n        '<div>',\n        '    <u>Do not wrap unformatted regions with extra newlines</u>',\n        '</div>'\n      ]\n    }, {\n      unchanged: '<div><br /></div>'\n    }, {\n      input: [\n        '<div>',\n        '<br /></div>'\n      ],\n      output: [\n        '<div>',\n        '    <br />',\n        '</div>'\n      ]\n    }, {\n      unchanged: '<div><h1 /></div>'\n    }, {\n      input: [\n        '<div>',\n        '<h1 /></div>'\n      ],\n      output: [\n        '<div>',\n        '    <h1 />',\n        '</div>'\n      ]\n    }, {\n      unchanged: '<label><br /></label>'\n    }, {\n      comment: \"Inline parent should not add newline unlike block\",\n      input: [\n        '<label>',\n        '<br /></label>'\n      ],\n      output: [\n        '<label>',\n        '    <br /></label>'\n      ]\n    }, {\n      comment: \"Inline parent with unformatted non-inline child\",\n      unchanged: '<label><h1>Unformatted non-inline</h1></label>'\n    }, {\n      comment: \"Inline parent with unformatted non-inline child\",\n      input: [\n        '<label>',\n        '<h1>Unformatted non-inline</h1></label>'\n      ],\n      output: [\n        '<label>',\n        '    <h1>Unformatted non-inline</h1></label>'\n      ]\n    }, {\n      comment: \"Inline parent with unformatted non-inline empty child\",\n      unchanged: '<label><h1 /></label>'\n    }, {\n      comment: \"Inline parent with unformatted non-inline empty child\",\n      input: [\n        '<label>',\n        '<h1 /></label>'\n      ],\n      output: [\n        '<label>',\n        '    <h1 /></label>'\n      ]\n    }, {\n      input_: '<u>  \\n\\n\\n  Ignore extra \"\"\"whitespace mostly  \\n\\n\\n  </u>',\n      output: '<u>\\n\\n\\n  Ignore extra \"\"\"whitespace mostly  \\n\\n\\n  </u>'\n    }, {\n      unchanged: '<u><div \\n\\t\\nclass=\"\"\">Ignore whitespace in attributes\\t</div></u>'\n    }, {\n      comment: 'Regression test #1534 - interaction between unformatted, content_unformatted, and inline',\n      unchanged: [\n        '<div>',\n        '    <textarea></textarea>',\n        '    <textarea>',\n        '',\n        '</textarea>',\n        '    <span></span>',\n        '    <span>',\n        '',\n        '</span>',\n        '</div>'\n      ]\n    }, {\n      input_: '<u \\n\\n\\t\\t  class=\"\">Ignore whitespace\\nin\\tattributes</u>',\n      output: '<u\\n\\n\\t\\t  class=\"\">Ignore whitespace\\nin\\tattributes</u>'\n    }]\n  }, {\n    name: \"content_unformatted to prevent formatting content\",\n    description: \"NOTE: for this test textarea is still content_unformatted but pre is not\",\n    options: [\n\n      { name: 'content_unformatted', value: \"['?php', 'script', 'style', 'p', 'span', 'br', 'meta', 'textarea']\" }\n    ],\n    tests: [{\n      fragment: true,\n      input: '<html><body><h1>A</h1><script>if(1){f();}</script><style>.a{display:none;}</style></body></html>',\n      output: [\n        '<html>',\n        '<body>',\n        '    <h1>A</h1>',\n        '    <script>if(1){f();}</script>',\n        '    <style>.a{display:none;}</style>',\n        '</body>',\n        '',\n        '</html>'\n      ]\n    }, {\n      input: '<div><p>Beautify me</p></div><p><div>But not me</div></p>',\n      output: [\n        '<div>',\n        '    <p>Beautify me</p>',\n        '</div>',\n        '<p><div>But not me</div></p>'\n      ]\n    }, {\n      input: '<div><p\\n  class=\"beauty-me\"\\n>Beautify me</p></div><p><div\\n  class=\"iamalreadybeauty\"\\n>But not me</div></p>',\n      output: [\n        '<div>',\n        '    <p class=\"beauty-me\">Beautify me</p>',\n        '</div>',\n        '<p><div',\n        '  class=\"iamalreadybeauty\"',\n        '>But not me</div></p>'\n      ]\n    }, {\n      unchanged: '<div><span>blabla<div>something here</div></span></div>'\n    }, {\n      unchanged: '<div><br /></div>'\n    }, {\n      unchanged: '<div><br></div>'\n    }, {\n      input: [\n        '<div>',\n        '<br>',\n        '<br />',\n        '<br></div>'\n      ],\n      output: [\n        '<div>',\n        '    <br>',\n        '    <br />',\n        '    <br>',\n        '</div>'\n      ]\n    }, {\n      comment: 'Regression test #1534 - interaction between unformatted, content_unformatted, and inline',\n      unchanged: [\n        '<div>',\n        '    <textarea></textarea>',\n        '    <textarea>',\n        '',\n        '</textarea>',\n        '    <span></span>',\n        '    <span>',\n        '',\n        '</span>',\n        '</div>'\n      ]\n    }, {\n      input: [\n        '<div>',\n        '<meta>',\n        '<meta />',\n        '<meta></div>'\n      ],\n      output: [\n        '<div>',\n        '    <meta>',\n        '    <meta />',\n        '    <meta>',\n        '</div>'\n      ]\n    }, {\n      input: '<div><pre>var a=1;\\nvar b=a;</pre></div>',\n      output: [\n        '<div>',\n        '    <pre>var a=1;',\n        '        var b=a;</pre>',\n        '</div>'\n      ]\n    }, {\n      unchanged: [\n        '<?php',\n        '/**',\n        ' * Comment',\n        ' */',\n        '',\n        '?>',\n        '<div class=\"\">',\n        '',\n        '</div>'\n      ]\n    }, {\n      input: '<div><pre>\\nvar a=1;\\nvar b=a;\\n</pre></div>',\n      output: [\n        '<div>',\n        '    <pre>',\n        '        var a=1;',\n        '        var b=a;',\n        '    </pre>',\n        '</div>'\n      ]\n    }]\n  }, {\n    name: \"default content_unformatted and inline element test\",\n    description: \"\",\n    options: [],\n    tests: [{\n      fragment: true,\n      input: '<html><body><h1>A</h1><script>if(1){f();}</script><style>.a{display:none;}</style></body></html>',\n      output: [\n        '<html>',\n        '<body>',\n        '    <h1>A</h1>',\n        '    <script>',\n        '        if (1) {',\n        '            f();',\n        '        }',\n        '    </script>',\n        '    <style>',\n        '        .a {',\n        '            display: none;',\n        '        }',\n        '    </style>',\n        '</body>',\n        '',\n        '</html>'\n      ]\n    }, {\n      input: '<div><p>Beautify me</p></div><p><p>But not me</p></p>',\n      output: [\n        '<div>',\n        '    <p>Beautify me</p>',\n        '</div>',\n        '<p>',\n        '<p>But not me</p>',\n        '</p>'\n      ]\n    }, {\n      input: '<div><p\\n  class=\"beauty-me\"\\n>Beautify me</p></div><p><p\\n  class=\"iamalreadybeauty\"\\n>But not me</p></p>',\n      output: [\n        '<div>',\n        '    <p class=\"beauty-me\">Beautify me</p>',\n        '</div>',\n        '<p>',\n        '<p class=\"iamalreadybeauty\">But not me</p>',\n        '</p>'\n      ]\n    }, {\n      unchanged: '<div><span>blabla<div>something here</div></span></div>'\n    }, {\n      unchanged: '<div><br /></div>'\n    }, {\n      comment: 'Regression test #1534 - interaction between unformatted, content_unformatted, and inline',\n      unchanged: [\n        '<div>',\n        '    <textarea></textarea>',\n        '    <textarea>',\n        '',\n        '</textarea>',\n        '    <span></span>',\n        '    <span>',\n        '',\n        '    </span>',\n        '</div>'\n      ]\n    }, {\n      input: '<div><pre>var a=1;\\nvar b=a;</pre></div>',\n      output: [\n        '<div>',\n        '    <pre>var a=1;',\n        'var b=a;</pre>',\n        '</div>'\n      ]\n    }, {\n      input: '<div><pre>\\nvar a=1;\\nvar b=a;\\n</pre></div>',\n      output: [\n        '<div>',\n        '    <pre>',\n        'var a=1;',\n        'var b=a;',\n        '</pre>',\n        '</div>'\n      ]\n    }, {\n      comment: \"Test for #1041\",\n      input: [\n        '<p><span class=\"foo\">foo <span class=\"bar\">bar</span></span></p>',\n        '',\n        '<aside><p class=\"foo\">foo <span class=\"bar\">bar</span></p></aside>',\n        '<p class=\"foo\"><span class=\"bar\">bar</span></p>'\n      ],\n      output: [\n        '<p><span class=\"foo\">foo <span class=\"bar\">bar</span></span></p>',\n        '',\n        '<aside>',\n        '    <p class=\"foo\">foo <span class=\"bar\">bar</span></p>',\n        '</aside>',\n        '<p class=\"foo\"><span class=\"bar\">bar</span></p>'\n      ]\n    }, {\n      comment: \"Test for #869 - not exactly what the user wants but no longer horrible\",\n      unchanged: [\n        '<div><input type=\"checkbox\" id=\"j\" name=\"j\" value=\"foo\">&nbsp;<label for=\"j\">Foo</label></div>'\n      ]\n    }, {\n      comment: \"Test for #1167\",\n      unchanged: [\n        '<span>',\n        '    <span><img src=\"images/off.svg\" alt=\"\"></span>',\n        '    <span><img src=\"images/on.svg\" alt=\"\"></span>',\n        '</span>'\n      ]\n    }, {\n      comment: \"Test for #882\",\n      input: '<tr><th><h3>Name</h3></th><td class=\"full-width\"></td></tr>',\n      output: [\n        '<tr>',\n        '    <th>',\n        '        <h3>Name</h3>',\n        '    </th>',\n        '    <td class=\"full-width\"></td>',\n        '</tr>'\n      ]\n    }, {\n      comment: \"Test for #1184\",\n      input: '<div><div></div>Connect</div>',\n      output: [\n        '<div>',\n        '    <div></div>Connect',\n        '</div>'\n      ]\n    }, {\n      comment: \"Test for #1383\",\n      input: [\n        '<p class=\"newListItem\">',\n        '  <svg height=\"40\" width=\"40\">',\n        '              <circle cx=\"20\" cy=\"20\" r=\"18\" stroke=\"black\" stroke-width=\"0\" fill=\"#bddffa\" />',\n        '              <text x=\"50%\" y=\"50%\" text-anchor=\"middle\" stroke=\"#1b97f3\" stroke-width=\"2px\" dy=\".3em\">1</text>',\n        '            </svg> This is a paragraph after an SVG shape.',\n        '</p>'\n      ],\n      output: [\n        '<p class=\"newListItem\">',\n        '    <svg height=\"40\" width=\"40\">',\n        '        <circle cx=\"20\" cy=\"20\" r=\"18\" stroke=\"black\" stroke-width=\"0\" fill=\"#bddffa\" />',\n        '        <text x=\"50%\" y=\"50%\" text-anchor=\"middle\" stroke=\"#1b97f3\" stroke-width=\"2px\" dy=\".3em\">1</text>',\n        '    </svg> This is a paragraph after an SVG shape.',\n        '</p>'\n      ]\n    }]\n  }, {\n    name: \"indent_empty_lines true\",\n    description: \"\",\n    options: [\n      { name: \"indent_empty_lines\", value: \"true\" }\n    ],\n    tests: [{\n      fragment: true,\n      input: [\n        '<div>',\n        '',\n        '    <div>',\n        '',\n        '    </div>',\n        '',\n        '</div>'\n      ],\n      output: [\n        '<div>',\n        '    ',\n        '    <div>',\n        '        ',\n        '    </div>',\n        '    ',\n        '</div>'\n      ]\n    }]\n  }, {\n    name: \"indent_empty_lines false\",\n    description: \"\",\n    options: [\n      { name: \"indent_empty_lines\", value: \"false\" }\n    ],\n    tests: [{\n      fragment: true,\n      unchanged: [\n        '<div>',\n        '',\n        '    <div>',\n        '',\n        '    </div>',\n        '',\n        '</div>'\n      ]\n    }]\n  }, {\n    name: \"Smarty tests for extra whitespace in nested quotes\",\n    description: \"Check beautifier adds extra whitespace in nested quotes by assuming as the end of the attribute\",\n    options: [\n      { name: \"templating\", value: \"'smarty'\" }\n    ],\n    tests: [{\n      unchanged: '<div class=\"foo{if $bar==\"1\"} bar{/if}\">foo</div>'\n    }, {\n      unchanged: '<input type=\"radio\" name=\"foo\" {if $bar==\"\"}checked{/if}>'\n    }]\n  }, {\n    name: \"Smarty tests for script\",\n    description: \"\",\n    options: [\n      { name: \"templating\", value: \"'smarty'\" }\n    ],\n    tests: [{\n      unchanged: [\n        '<script>',\n        '    var foo = {$bar|json_encode};',\n        '</script>'\n      ]\n    }]\n  }, {\n    name: \"Recognize handlebars with whitespace control\",\n    description: \"Maintains handlebar properties even when whitespace control ~ is at the start of handlebar statements\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"indent_handlebars\", value: \"true\" }\n    ],\n    tests: [{\n      input: [\n        '{{#if true}}<div><div>',\n        '{{~#if true ~}}<p>true</p>{{/if}}',\n        '</div></div>{{/if}}'\n      ],\n      output: [\n        '{{#if true}}',\n        '    <div>',\n        '        <div>',\n        '            {{~#if true ~}}',\n        '                <p>true</p>',\n        '            {{/if}}',\n        '        </div>',\n        '    </div>',\n        '{{/if}}'\n      ]\n    }, {\n      input: [\n        '{{~#*inline \"MyInlinePartial\"}}',\n        '{{MyIdentifier}}',\n        '{{/inline}}'\n      ],\n      output: [\n        '{{~#*inline \"MyInlinePartial\"}}',\n        '    {{MyIdentifier}}',\n        '{{/inline}}'\n      ]\n    }, {\n      input: [\n        '{{~#> myPartial }}',\n        '<span>format correctly</span>',\n        '{{/myPartial}}'\n      ],\n      output: [\n        '{{~#> myPartial }}',\n        '    <span>format correctly</span>',\n        '{{/myPartial}}'\n      ]\n    }, {\n      unchanged: [\n        '{{#if callOn}}',\n        '    {{translate \"onText\"}}',\n        '{{~else if (eq callOn false)}}',\n        '    {{translate \"offText\"}}',\n        '{{/if}}'\n      ]\n    }, {\n      unchanged: [\n        '{{~#if callOn}}',\n        '    {{translate \"onText\"}}',\n        '{{~else if (eq callOn false)}}',\n        '    {{translate \"offText\"}}',\n        '{{/if}}'\n      ]\n    }]\n  }, {\n    name: \"Corrects Partial Behavior Involving Whitespace\",\n    description: \"Handles partials that do not have a space before the tag\",\n    template: \"^^^ $$$\",\n    tests: [{\n      input: [\n        '{{#>row}}',\n        '    {{#>column}}',\n        '        <span>content</span>',\n        '        {{/column}}',\n        '        {{/row}}'\n      ],\n      output: [\n        '{{#>row}}',\n        '    {{#>column}}',\n        '        <span>content</span>',\n        '    {{/column}}',\n        '{{/row}}'\n      ]\n    }, {\n      input: [\n        '{{~#>row}}',\n        '{{#>column}}',\n        '<p>content</p>',\n        '{{/column}}',\n        '{{/row}}'\n      ],\n      output: [\n        '{{~#>row}}',\n        '    {{#>column}}',\n        '        <p>content</p>',\n        '    {{/column}}',\n        '{{/row}}'\n      ]\n    }, {\n      unchanged: [\n        '{{#>row}}',\n        '    {{#>column}}',\n        '        <span>content</span>',\n        '    {{/column}}',\n        '{{/row}}'\n      ]\n    }, {\n      unchanged: [\n        '{{#> row}}',\n        '    {{#> column}}',\n        '        <span>content</span>',\n        '    {{/column}}',\n        '{{/row}}'\n      ]\n    }]\n  }, {\n    name: \"Does not add whitespace around custom elements \",\n    description: \"Regression test for https://github.com/beautifier/js-beautify/issues/1989\",\n    tests: [{\n      input: [\n        '<span>',\n        '    <span>',\n        '        <span>The time for this result is 1:02</span',\n        '        ><div>.</div',\n        '        ><section>27</section>',\n        '    </span>',\n        '</span>'\n      ],\n      output: [\n        '<span>',\n        '    <span>',\n        '        <span>The time for this result is 1:02</span>',\n        '        <div>.</div>',\n        '        <section>27</section>',\n        '    </span>',\n        '</span>'\n      ]\n    }, {\n      input: [\n        '<span>',\n        '    <span>',\n        '        <span>The time for this result is 1:02</span',\n        '        ><time-dot>.</time-dot',\n        '        ><time-decimals>27</time-decimals>',\n        '    </span>',\n        '</span>'\n      ],\n      output: [\n        '<span>',\n        '    <span>',\n        '        <span>The time for this result is 1:02</span><time-dot>.</time-dot><time-decimals>27</time-decimals>',\n        '    </span>',\n        '</span>'\n      ]\n    }]\n  }, {\n    name: \"Disables custom elements inlining with inline_custom_elements=false\",\n    description: \"https://github.com/beautifier/js-beautify/issues/2113\",\n    options: [\n      { name: \"inline_custom_elements\", value: \"false\" }\n    ],\n    tests: [{\n      input: [\n        '<span>',\n        '    <span>',\n        '        <span>The time for this result is 1:02</span',\n        '        ><time-dot>.</time-dot',\n        '        ><time-decimals>27</time-decimals>',\n        '    </span>',\n        '</span>'\n      ],\n      output: [\n        '<span>',\n        '    <span>',\n        '        <span>The time for this result is 1:02</span>',\n        '        <time-dot>.</time-dot>',\n        '        <time-decimals>27</time-decimals>',\n        '    </span>',\n        '</span>'\n      ]\n    }]\n  }, {\n    name: \"Indenting angular control flow with indent size 2\",\n    description: \"https://github.com/beautify-web/js-beautify/issues/2219\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"templating\", value: \"'angular'\" },\n      { name: \"indent_size\", value: \"2\" }\n    ],\n    tests: [{\n      input: [\n        '@if (a > b) {',\n        '{{a}} is greater than {{b}}',\n        '}',\n        '',\n        '@if (a > b) {',\n        '{{a}} is greater than {{b}}',\n        '} @else if (b > a) {',\n        '{{a}} is less than {{b}}',\n        '} @else {',\n        '{{a}} is equal to {{b}}',\n        '}',\n        '',\n        '@for (item of items; track item.name) {',\n        '<li> {{ item.name }} </li>',\n        '} @empty {',\n        '<li> There are no items. </li>',\n        '}',\n        '',\n        '@switch (condition) {',\n        '@case (caseA) { ',\n        'Case A.',\n        '}',\n        '@case (caseB) {',\n        'Case B.',\n        '}',\n        '@default {',\n        'Default case.',\n        '}',\n        '}'\n      ],\n      output: [\n        '@if (a > b) {',\n        '  {{a}} is greater than {{b}}',\n        '}',\n        '',\n        '@if (a > b) {',\n        '  {{a}} is greater than {{b}}',\n        '} @else if (b > a) {',\n        '  {{a}} is less than {{b}}',\n        '} @else {',\n        '  {{a}} is equal to {{b}}',\n        '}',\n        '',\n        '@for (item of items; track item.name) {',\n        '  <li> {{ item.name }} </li>',\n        '} @empty {',\n        '  <li> There are no items. </li>',\n        '}',\n        '',\n        '@switch (condition) {',\n        '  @case (caseA) {',\n        '    Case A.',\n        '  }',\n        '  @case (caseB) {',\n        '    Case B.',\n        '  }',\n        '  @default {',\n        '    Default case.',\n        '  }',\n        '}'\n      ]\n    }]\n  }, {\n    name: \"Indenting angular control flow with default indent size\",\n    description: \"https://github.com/beautify-web/js-beautify/issues/2219\",\n    template: \"^^^ $$$\",\n    options: [\n      { name: \"templating\", value: \"'angular'\" }\n    ],\n    tests: [{\n      input: [\n        '@if (a > b) {',\n        '{{a}} is greater than {{b}}',\n        '}',\n        '',\n        '@if (a > b) {',\n        '{{a}} is greater than {{b}}',\n        '} @else if (b > a) {',\n        '{{a}} is less than {{b}}',\n        '} @else {',\n        '{{a}} is equal to {{b}}',\n        '}',\n        '',\n        '@for (item of items; track item.name) {',\n        '<li> {{ item.name }} </li>',\n        '} @empty {',\n        '<li> There are no items. </li>',\n        '}',\n        '',\n        '@switch (condition) {',\n        '@case (caseA) { ',\n        'Case A.',\n        '}',\n        '@case (caseB) {',\n        'Case B.',\n        '}',\n        '@default {',\n        'Default case.',\n        '}',\n        '}'\n      ],\n      output: [\n        '@if (a > b) {',\n        '    {{a}} is greater than {{b}}',\n        '}',\n        '',\n        '@if (a > b) {',\n        '    {{a}} is greater than {{b}}',\n        '} @else if (b > a) {',\n        '    {{a}} is less than {{b}}',\n        '} @else {',\n        '    {{a}} is equal to {{b}}',\n        '}',\n        '',\n        '@for (item of items; track item.name) {',\n        '    <li> {{ item.name }} </li>',\n        '} @empty {',\n        '    <li> There are no items. </li>',\n        '}',\n        '',\n        '@switch (condition) {',\n        '    @case (caseA) {',\n        '        Case A.',\n        '    }',\n        '    @case (caseB) {',\n        '        Case B.',\n        '    }',\n        '    @default {',\n        '        Default case.',\n        '    }',\n        '}'\n      ]\n    }, {\n      input: [\n        '@if (a > b) {',\n        '       {{a}} is greater than {{b}}',\n        '     }',\n        '',\n        '   @if (a > b) {',\n        ' {{a}} is greater than {{b}}',\n        '     } @else if (b > a) {',\n        '       {{a}} is less than {{b}}',\n        '     } @else {',\n        '       {{a}} is equal to {{b}}',\n        '}',\n        '',\n        '   @for (item of items; track item.name) {',\n        '             <li> {{ item.name }} </li>',\n        '       } @empty {',\n        '     <li> There are no items. </li>',\n        '   }',\n        '',\n        ' @switch (condition) {',\n        '@case (caseA) { ',\n        'Case A.',\n        '       }',\n        '       @case (caseB) {',\n        'Case B.',\n        '   }',\n        ' @default {',\n        'Default case.',\n        '}',\n        '     }'\n      ],\n      output: [\n        '@if (a > b) {',\n        '    {{a}} is greater than {{b}}',\n        '}',\n        '',\n        '@if (a > b) {',\n        '    {{a}} is greater than {{b}}',\n        '} @else if (b > a) {',\n        '    {{a}} is less than {{b}}',\n        '} @else {',\n        '    {{a}} is equal to {{b}}',\n        '}',\n        '',\n        '@for (item of items; track item.name) {',\n        '    <li> {{ item.name }} </li>',\n        '} @empty {',\n        '    <li> There are no items. </li>',\n        '}',\n        '',\n        '@switch (condition) {',\n        '    @case (caseA) {',\n        '        Case A.',\n        '    }',\n        '    @case (caseB) {',\n        '        Case B.',\n        '    }',\n        '    @default {',\n        '        Default case.',\n        '    }',\n        '}'\n      ]\n    }, {\n      input: [\n        '@if( {value: true}; as val) {',\n        '<div>{{val.value}}</div>',\n        '}'\n      ],\n      output: [\n        '@if( {value: true}; as val) {',\n        '    <div>{{val.value}}</div>',\n        '}'\n      ]\n    }, {\n      input: [\n        '@if( {value: true}; as val) {',\n        '<div>',\n        '@defer {',\n        '{{val.value}}',\n        '}',\n        '</div>',\n        '}'\n      ],\n      output: [\n        '@if( {value: true}; as val) {',\n        '    <div>',\n        '        @defer {',\n        '            {{val.value}}',\n        '        }',\n        '    </div>',\n        '}'\n      ]\n    }, {\n      unchanged: [\n        '<div> @if(true) { {{\"{}\" + \" }\"}} } </div>'\n      ]\n    }, {\n      input: [\n        '<div>',\n        '@for (item of items; track item.id; let idx = $index, e = $even) {',\n        'Item #{{ idx }}: {{ item.name }}',\n        '<p>',\n        'Item #{{ idx }}: {{ item.name }}',\n        '</p>',\n        '}',\n        '</div>'\n      ],\n      output: [\n        '<div>',\n        '    @for (item of items; track item.id; let idx = $index, e = $even) {',\n        '        Item #{{ idx }}: {{ item.name }}',\n        '        <p>',\n        '            Item #{{ idx }}: {{ item.name }}',\n        '        </p>',\n        '    }',\n        '</div>'\n      ]\n    }, {\n      input: [\n        '<div>',\n        '@for (item of items; track item.id; let idx = $index, e = $even) {',\n        '{{{value: true} | json}}',\n        '<p>',\n        'Item #{{ idx }}: {{ item.name }}',\n        '</p>',\n        '{{ {value: true} }}',\n        '<div>',\n        '@if(true) {',\n        '{{ {value: true} }}',\n        ' }',\n        '',\n        'Placeholder',\n        '</div>',\n        '}',\n        '</div>'\n      ],\n      output: [\n        '<div>',\n        '    @for (item of items; track item.id; let idx = $index, e = $even) {',\n        '        {{{value: true} | json}}',\n        '        <p>',\n        '            Item #{{ idx }}: {{ item.name }}',\n        '        </p>',\n        '        {{ {value: true} }}',\n        '        <div>',\n        '            @if(true) {',\n        '                {{ {value: true} }}',\n        '            }',\n        '',\n        '            Placeholder',\n        '        </div>',\n        '    }',\n        '</div>'\n      ]\n    }, {\n      comment: 'If no whitespace before @, then don\\'t indent',\n      input: [\n        'My email is loremipsum@if.com (only for work).',\n        'loremipsum@if {',\n        '<p>',\n        'Text',\n        '</p>',\n        '}'\n      ],\n      output: [\n        'My email is loremipsum@if.com (only for work).',\n        'loremipsum@if {',\n        '<p>',\n        '    Text',\n        '</p>',\n        '}'\n      ]\n    }, {\n      comment: 'Check if control flow is indented well if we have oneliners with no space before the closing token',\n      input: [\n        '{{b}} @if (a > b) {is less than}@else{is greater than or equal to} {{a}}',\n        '<div>',\n        'Hello there',\n        '</div>',\n        '<div>',\n        '{{b}} @if (a > b) {is less than}@else{',\n        'is greater than or equal to} {{a}}',\n        'Hello there',\n        '</div>'\n      ],\n      output: [\n        '{{b}} @if (a > b) {is less than}@else{is greater than or equal to} {{a}}',\n        '<div>',\n        '    Hello there',\n        '</div>',\n        '<div>',\n        '    {{b}} @if (a > b) {is less than}@else{',\n        '        is greater than or equal to} {{a}}',\n        '    Hello there',\n        '</div>'\n      ]\n    }, {\n      comment: 'Multiline conditions should also be recognized and indented correctly',\n      input: [\n        '@if(',\n        'condition1',\n        '&& condition2',\n        ') {',\n        'Text inside if',\n        '}'\n      ],\n      output: [\n        '@if(',\n        'condition1',\n        '&& condition2',\n        ') {',\n        '    Text inside if',\n        '}'\n      ]\n    }, {\n      comment: 'Indentation should work if opening brace is in new line',\n      input: [\n        '@if( condition )',\n        '{',\n        'Text inside if',\n        '}'\n      ],\n      output: [\n        '@if( condition )',\n        '{',\n        '    Text inside if',\n        '}'\n      ]\n    }, {\n      comment: 'Indentation should work if condition is in new line',\n      input: [\n        '@if',\n        '( condition )',\n        '{',\n        'Text inside if',\n        '} @else if',\n        '(condition2)',\n        '{',\n        '<div>',\n        'Text',\n        '</div>',\n        '}'\n      ],\n      output: [\n        '@if',\n        '( condition )',\n        '{',\n        '    Text inside if',\n        '} @else if',\n        '(condition2)',\n        '{',\n        '    <div>',\n        '        Text',\n        '    </div>',\n        '}'\n      ]\n    }, {\n      comment: 'CSS @media should remain unchanged',\n      unchanged: [\n        '<style type=\"text/css\">',\n        '    @media only screen and (min-width:480px) {',\n        '        .mj-column-per-100 {',\n        '            width: 100% !important;',\n        '            max-width: 100%;',\n        '        }',\n        '    }',\n        '</style>'\n      ]\n    }, {\n      comment: 'CSS @media, the inside of <script> tag and control flows should be indented correctly',\n      fragment: true,\n      input: [\n        '<head>',\n        '<style type=\"text/css\">',\n        '@media only screen and (min-width:480px) {',\n        '.mj-column-per-100 {',\n        'width: 100% !important;',\n        'max-width: 100%;',\n        '}',\n        '}',\n        '</style>',\n        '<script>',\n        'if(someExpression) {',\n        'callFunc();',\n        '}',\n        '</script>',\n        '</head>',\n        '<body>',\n        '<div>',\n        '@if(someOtherExpression) {',\n        'Text',\n        '}',\n        '</div>',\n        '</body>'\n      ],\n      output: [\n        '<head>',\n        '    <style type=\"text/css\">',\n        '        @media only screen and (min-width:480px) {',\n        '            .mj-column-per-100 {',\n        '                width: 100% !important;',\n        '                max-width: 100%;',\n        '            }',\n        '        }',\n        '    </style>',\n        '    <script>',\n        '        if (someExpression) {',\n        '            callFunc();',\n        '        }',\n        '    </script>',\n        '</head>',\n        '<body>',\n        '    <div>',\n        '        @if(someOtherExpression) {',\n        '            Text',\n        '        }',\n        '    </div>',\n        '</body>'\n      ]\n    }]\n  }, {\n    name: \"No indenting for angular control flow should be done if angular templating is not set\",\n    description: \"https://github.com/beautify-web/js-beautify/issues/2219\",\n    template: \"^^^ $$$\",\n    tests: [{\n      unchanged: [\n        '@if (a > b) {',\n        '{{a}} is greater than {{b}}',\n        '}',\n        '',\n        '@if (a > b) {',\n        '{{a}} is greater than {{b}}',\n        '} @else if (b > a) {',\n        '{{a}} is less than {{b}}',\n        '} @else {',\n        '{{a}} is equal to {{b}}',\n        '}',\n        '',\n        '@for (item of items; track item.name) {',\n        '<li> {{ item.name }} </li>',\n        '} @empty {',\n        '<li> There are no items. </li>',\n        '}',\n        '',\n        '@switch (condition) {',\n        '@case (caseA) {',\n        'Case A.',\n        '}',\n        '@case (caseB) {',\n        'Case B.',\n        '}',\n        '@default {',\n        'Default case.',\n        '}',\n        '}'\n      ]\n    }, {\n      unchanged: [\n        '@if( {value: true}; as val) {',\n        '<div>{{val.value}}</div>',\n        '}'\n      ]\n    }, {\n      input: [\n        '@if( {value: true}; as val) {',\n        '<div>',\n        '@defer {',\n        '{{val.value}}',\n        '}',\n        '</div>',\n        '}'\n      ],\n      output: [\n        '@if( {value: true}; as val) {',\n        '<div>',\n        '    @defer {',\n        '    {{val.value}}',\n        '    }',\n        '</div>',\n        '}'\n      ]\n    }, {\n      unchanged: [\n        '<div> @if(true) { {{\"{}\" + \" }\"}} } </div>'\n      ]\n    }, {\n      input: [\n        '<div>',\n        '@for (item of items; track item.id; let idx = $index, e = $even) {',\n        'Item #{{ idx }}: {{ item.name }}',\n        '<p>',\n        'Item #{{ idx }}: {{ item.name }}',\n        '</p>',\n        '}',\n        '</div>'\n      ],\n      output: [\n        '<div>',\n        '    @for (item of items; track item.id; let idx = $index, e = $even) {',\n        '    Item #{{ idx }}: {{ item.name }}',\n        '    <p>',\n        '        Item #{{ idx }}: {{ item.name }}',\n        '    </p>',\n        '    }',\n        '</div>'\n      ]\n    }, {\n      comment: 'CSS @media should remain unchanged',\n      unchanged: [\n        '<style type=\"text/css\">',\n        '    @media only screen and (min-width:480px) {',\n        '        .mj-column-per-100 {',\n        '            width: 100% !important;',\n        '            max-width: 100%;',\n        '        }',\n        '    }',\n        '</style>'\n      ]\n    }]\n  }, {\n    name: \"New Test Suite\"\n  }]\n};\n"
  },
  {
    "path": "test/data/javascript/inputlib.js",
    "content": "//--------//\n// Inputs //\n//--------//\n\nvar operator_position = {\n  sanity: [\n    'var res = a + b - c / d * e % f;',\n    'var res = g & h | i ^ j |> console.log;',\n    'var res = (k && l || m) ? n ?? nn : o;',\n    'var res = p >> q << r >>> s;',\n    'var res = t === u !== v != w == x >= y <= z > aa < ab;',\n    'res ??= a;',\n    'res ||= b;',\n    'res &&= c;',\n    'ac + -ad'\n  ],\n  comprehensive: [\n    'var res = a + b',\n    '- c /',\n    'd  *     e',\n    '%',\n    'f;',\n    '   var res = g & h',\n    '| i ^',\n    'j',\n    '|> console.log;',\n    'var res = (k &&',\n    'l',\n    '|| m) ?',\n    'n',\n    '?? nn',\n    ': o',\n    ';',\n    'var res = p',\n    '>> q <<',\n    'r',\n    '>>> s;',\n    'var res',\n    '  = t',\n    '',\n    ' === u !== v',\n    ' !=',\n    'w',\n    '== x >=',\n    'y <= z > aa <',\n    'ab;',\n    'res??=a;res||=b;res&&=c;',\n    'ac +',\n    '-ad'\n  ],\n  colon_special_case: [\n    'var a = {',\n    '    b',\n    ': bval,',\n    '    c:',\n    'cval',\n    '    ,d: dval',\n    '};',\n    'var e = f ? g',\n    ': h;',\n    'var i = j ? k :',\n    'l;'\n  ],\n  catch_all: [\n    'var d = 1;',\n    'if (a === b',\n    '    && c) {',\n    '    d = (c * everything',\n    '            / something_else) %',\n    '        b;',\n    '    e',\n    '        += d;',\n    '',\n    '} else if (!(complex && simple) ||',\n    '    (emotion && emotion.name === \"happy\")) {',\n    '    cryTearsOfJoy(many ||',\n    '        anOcean',\n    '        || aRiver);',\n    '}'\n  ]\n};\n\n\n//---------//\n// Exports //\n//---------//\n\nmodule.exports = {\n  operator_position: operator_position\n};\n"
  },
  {
    "path": "test/data/javascript/node.mustache",
    "content": "/*\n{{&header_text}}\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n/*jshint unused:false */\n/*jshint strict:false */\n\nfunction run_javascript_tests(test_obj, Urlencoded, js_beautify, html_beautify, css_beautify)\n{\n\n    var default_opts = {\n        indent_size: 4,\n        indent_char: ' ',\n        preserve_newlines: true,\n        jslint_happy: false,\n        space_before_conditional: true,\n        break_chained_methods: false,\n        selector_separator: '\\n',\n        end_with_newline: false\n    };\n    var opts;\n\n{{#default_options}}    default_opts.{{name}} = {{&value}};\n{{/default_options}}\n\n    function reset_options()\n    {\n        opts = JSON.parse(JSON.stringify(default_opts));\n        test_name = 'js-beautify';\n    }\n\n    function test_beautifier(input)\n    {\n        return js_beautify(input, opts);\n    }\n\n    var sanitytest;\n    var test_name = '';\n\n    function set_name(name)\n    {\n        name = (name || '').trim();\n        if (name) {\n            test_name = name.replace(/\\r/g, '\\\\r').replace(/\\n/g, '\\\\n');\n        }\n    }\n\n    // test the input on beautifier with the current flag settings\n    // does not check the indentation / surroundings as bt() does\n    function test_fragment(input, expected)\n    {\n        var success = true;\n        sanitytest.test_function(test_beautifier, test_name);\n        expected = expected || expected === '' ? expected : input;\n        success = success && sanitytest.expect(input, expected);\n        // if the expected is different from input, run it again\n        // expected output should be unchanged when run twice.\n        if (success && expected !== input) {\n            success = success && sanitytest.expect(expected, expected);\n        }\n\n        // Everywhere we do newlines, they should be replaced with opts.eol\n        sanitytest.test_function(test_beautifier, 'eol ' + test_name);\n        opts.eol = '\\r\\\\n';\n        expected = expected.replace(/[\\n]/g, '\\r\\n');\n        opts.disabled = true;\n        success = success && sanitytest.expect(input, input || '');\n        success = success && sanitytest.expect('\\n\\n' + expected, '\\n\\n' + expected);\n        opts.disabled = false;\n        success = success && sanitytest.expect(input, expected);\n        if (success && input && input.indexOf('\\n') !== -1) {\n            input = input.replace(/[\\n]/g, '\\r\\n');\n            sanitytest.expect(input, expected);\n            // Ensure support for auto eol detection\n            opts.eol = 'auto';\n            success = success && sanitytest.expect(input, expected);\n        }\n        opts.eol = '\\n';\n        return success;\n    }\n\n\n    // test the input on beautifier with the current flag settings\n    // test both the input as well as { input } wrapping\n    function bt(input, expectation)\n    {\n        var success = true;\n\n        var wrapped_input, wrapped_expectation;\n\n        expectation = expectation || expectation === '' ? expectation : input;\n        success = success && test_fragment(input, expectation);\n\n        // If we set raw, input should be unchanged\n        opts.test_output_raw = true;\n        if (!opts.end_with_newline) {\n            success = success && test_fragment(input, input);\n        }\n        opts.test_output_raw = false;\n\n        // test also the returned indentation\n        // e.g if input = \"asdf();\"\n        // then test that this remains properly formatted as well:\n        // {\n        //     asdf();\n        //     indent;\n        // }\n\n        var current_indent_size = opts.js ? opts.js.indent_size : null;\n        current_indent_size = current_indent_size ? current_indent_size : opts.indent_size;\n        if (current_indent_size === 4 && input) {\n            wrapped_input = '{\\n' + input.replace(/^(.+)$/mg, '    $1') + '\\n    foo = bar;\\n}';\n            wrapped_expectation = '{\\n' + expectation.replace(/^(.+)$/mg, '    $1') + '\\n    foo = bar;\\n}';\n            success = success && test_fragment(wrapped_input, wrapped_expectation);\n\n            // If we set raw, input should be unchanged\n            opts.test_output_raw = true;\n            if (!opts.end_with_newline) {\n                success = success && test_fragment(wrapped_input, wrapped_input);\n            }\n            opts.test_output_raw = false;\n        }\n        return success;\n    }\n\n    // run all tests for the given brace style (\"collapse\", \"expand\", \"end-expand\", or \"none\").\n    // uses various whitespace combinations before and after opening and closing braces,\n    // respectively, for most of the tests' inputs.\n    function beautify_brace_tests(brace_style) {\n\n        var indent_on_wrap_str = '    '; // could use Array(opts.indent_size + 1).join(' '); if we wanted to replace _all_ of the hardcoded 4-space in the test and expectation strings\n\n        function permute_brace_tests(expect_open_white, expect_close_white) {\n\n            // run the tests that need permutation against a specific combination of\n            // pre-opening-brace and pre-closing-brace whitespace\n            function run_brace_permutation(test_open_white, test_close_white) {\n                var to = test_open_white,\n                    tc = test_close_white,\n                    eo = expect_open_white ? expect_open_white : to === '' ? ' ' : to,\n                    ec = expect_close_white ? expect_close_white : tc === '' ? ' ' : tc,\n                    i = eo === '\\n' ? indent_on_wrap_str: '';\n\n                bt( '//case 1\\nif (a == 1)' + to + '{}\\n//case 2\\nelse if (a == 2)' + to + '{}',\n                    '//case 1\\nif (a == 1)' + eo + '{}\\n//case 2\\nelse if (a == 2)' + eo + '{}');\n                bt( 'if(1)' + to + '{2}' + tc + 'else' + to + '{3}',\n                    'if (1)' + eo + '{\\n    2\\n}' + ec + 'else' + eo + '{\\n    3\\n}');\n                bt( 'try' + to + '{a();}' + tc +\n                    'catch(b)' + to + '{c();}' + tc +\n                    'catch(d)' + to + '{}' + tc +\n                    'finally' + to + '{e();}',\n                    // expected\n                    'try' + eo + '{\\n    a();\\n}' + ec +\n                    'catch (b)' + eo + '{\\n    c();\\n}' + ec +\n                    'catch (d)' + eo + '{}' + ec +\n                    'finally' + eo + '{\\n    e();\\n}');\n                bt( 'if(a)' + to + '{b();}' + tc + 'else if(c) foo();',\n                    'if (a)' + eo + '{\\n    b();\\n}' + ec + 'else if (c) foo();');\n                // if/else statement with empty body\n                bt( 'if (a)' + to + '{\\n// comment\\n}' + tc + 'else' + to + '{\\n// comment\\n}',\n                    'if (a)' + eo + '{\\n    // comment\\n}' + ec + 'else' + eo + '{\\n    // comment\\n}');\n                bt( 'if (x)' + to + '{y}' + tc + 'else' + to + '{ if (x)' + to + '{y}}',\n                    'if (x)' + eo + '{\\n    y\\n}' + ec + 'else' + eo + '{\\n    if (x)' + eo + i + '{\\n        y\\n    }\\n}');\n                bt( 'if (a)' + to + '{\\nb;\\n}' + tc + 'else' + to + '{\\nc;\\n}',\n                    'if (a)' + eo + '{\\n    b;\\n}' + ec + 'else' + eo + '{\\n    c;\\n}');\n                test_fragment('    /*\\n* xx\\n*/\\n// xx\\nif (foo)' + to + '{\\n    bar();\\n}',\n                              '    /*\\n     * xx\\n     */\\n    // xx\\n    if (foo)' + eo + i + '{\\n        bar();\\n    }');\n                bt( 'if (foo)' + to + '{}' + tc + 'else /regex/.test();',\n                    'if (foo)' + eo + '{}' + ec + 'else /regex/.test();');\n                test_fragment('if (foo)' + to + '{', 'if (foo)' + eo + '{');\n                test_fragment('foo' + to + '{', 'foo' + eo + '{');\n                test_fragment('return;' + to + '{', 'return;\\n{');\n                bt( 'function x()' + to + '{\\n    foo();\\n}zzz', 'function x()' + eo +'{\\n    foo();\\n}\\nzzz');\n                bt( 'var a = new function a()' + to + '{};', 'var a = new function a()' + eo + '{};');\n                bt( 'var a = new function a()' + to + '    {},\\n    b = new function b()' + to + '    {};',\n                    'var a = new function a()' + eo + i + '{},\\n    b = new function b()' + eo + i + '{};');\n                bt(\"foo(\" + to + \"{\\n    'a': 1\\n},\\n10);\",\n                   \"foo(\" + (eo === ' ' ? '' : eo) + i + \"{\\n        'a': 1\\n    },\\n    10);\"); // \"foo( {...\" is a weird case\n                bt('([\"foo\",\"bar\"]).each(function(i)' + to + '{return i;});',\n                   '([\"foo\", \"bar\"]).each(function(i)' + eo + '{\\n    return i;\\n});');\n                bt('(function(i)' + to + '{return i;})();', '(function(i)' + eo + '{\\n    return i;\\n})();');\n\n                bt( \"test( /*Argument 1*/\" + to + \"{\\n\" +\n                    \"    'Value1': '1'\\n\" +\n                    \"}, /*Argument 2\\n\" +\n                    \" */ {\\n\" +\n                    \"    'Value2': '2'\\n\" +\n                    \"});\",\n                    // expected\n                    \"test( /*Argument 1*/\" + eo + i + \"{\\n\" +\n                    \"        'Value1': '1'\\n\" +\n                    \"    },\\n\" +\n                    \"    /*Argument 2\\n\" +\n                    \"     */\\n\" +\n                    \"    {\\n\" +\n                    \"        'Value2': '2'\\n\" +\n                    \"    });\");\n\n                bt( \"test( /*Argument 1*/\" + to + \"{\\n\" +\n                    \"    'Value1': '1'\\n\" +\n                    \"}, /*Argument 2\\n\" +\n                    \" */\\n\" +\n                    \"{\\n\" +\n                    \"    'Value2': '2'\\n\" +\n                    \"});\",\n                    // expected\n                    \"test( /*Argument 1*/\" + eo + i + \"{\\n\" +\n                    \"        'Value1': '1'\\n\" +\n                    \"    },\\n\" +\n                    \"    /*Argument 2\\n\" +\n                    \"     */\\n\" +\n                    \"    {\\n\" +\n                    \"        'Value2': '2'\\n\" +\n                    \"    });\");\n            }\n\n            run_brace_permutation('\\n', '\\n');\n            run_brace_permutation('\\n', ' ');\n            run_brace_permutation(' ', ' ');\n            run_brace_permutation(' ', '\\n');\n            run_brace_permutation('','');\n\n            // brace tests that don't make sense to permutate\n            test_fragment('return {'); // return needs the brace.\n            test_fragment('return /* inline */ {');\n            bt('throw {}');\n            bt('throw {\\n    foo;\\n}');\n            bt( 'var foo = {}');\n            test_fragment('a: do {} while (); xxx', 'a: do {} while ();\\nxxx');\n            bt( '{a: do {} while (); xxx}', '{\\n    a: do {} while ();xxx\\n}');\n            bt( 'var a = new function() {};');\n            bt( 'var a = new function()\\n{};', 'var a = new function() {};');\n            bt( \"test(\\n\" +\n                \"/*Argument 1*/ {\\n\" +\n                \"    'Value1': '1'\\n\" +\n                \"},\\n\" +\n                \"/*Argument 2\\n\" +\n                \" */ {\\n\" +\n                \"    'Value2': '2'\\n\" +\n                \"});\",\n                // expected\n                \"test(\\n\" +\n                \"    /*Argument 1*/\\n\" +\n                \"    {\\n\" +\n                \"        'Value1': '1'\\n\" +\n                \"    },\\n\" +\n                \"    /*Argument 2\\n\" +\n                \"     */\\n\" +\n                \"    {\\n\" +\n                \"        'Value2': '2'\\n\" +\n                \"    });\");\n        }\n\n        reset_options();\n        opts.brace_style = brace_style;\n\n        switch(opts.brace_style) {\n        case 'collapse':\n            permute_brace_tests(' ', ' ');\n            break;\n        case 'expand':\n            permute_brace_tests('\\n', '\\n');\n            break;\n        case 'end-expand':\n            permute_brace_tests(' ', '\\n');\n            break;\n        case 'none':\n            permute_brace_tests();\n            break;\n        }\n    }\n\n    function unicode_char(value) {\n        return String.fromCharCode(value);\n    }\n\n    function beautifier_tests()\n    {\n        sanitytest = test_obj;\n\n        //============================================================\n        // Line wrap test inputs\n        //...---------1---------2---------3---------4---------5---------6---------7\n        //...1234567890123456789012345678901234567890123456789012345678901234567890\n        var wrap_input_1=(\n            'foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));\\n' +\n            'Test_very_long_variable_name_this_should_never_wrap\\n.but_this_can\\n' +\n            'return between_return_and_expression_should_never_wrap.but_this_can\\n' +\n            'throw between_throw_and_expression_should_never_wrap.but_this_can\\n' +\n            'if (wraps_can_occur && inside_an_if_block) that_is_\\n.okay();\\n' +\n            'object_literal = {\\n' +\n            '    propertx: first_token + 12345678.99999E-6,\\n' +\n            '    property: first_token_should_never_wrap + but_this_can,\\n' +\n            '    propertz: first_token_should_never_wrap + !but_this_can,\\n' +\n            '    proper: \"first_token_should_never_wrap\" + \"but_this_can\"\\n' +\n            '}');\n\n        //...---------1---------2---------3---------4---------5---------6---------7\n        //...1234567890123456789012345678901234567890123456789012345678901234567890\n        var wrap_input_2=(\n            '{\\n' +\n            '    foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));\\n' +\n            '    Test_very_long_variable_name_this_should_never_wrap\\n.but_this_can\\n' +\n            '    return between_return_and_expression_should_never_wrap.but_this_can\\n' +\n            '    throw between_throw_and_expression_should_never_wrap.but_this_can\\n' +\n            '    if (wraps_can_occur && inside_an_if_block) that_is_\\n.okay();\\n' +\n            '    object_literal = {\\n' +\n            '        propertx: first_token + 12345678.99999E-6,\\n' +\n            '        property: first_token_should_never_wrap + but_this_can,\\n' +\n            '        propertz: first_token_should_never_wrap + !but_this_can,\\n' +\n            '        proper: \"first_token_should_never_wrap\" + \"but_this_can\"\\n' +\n            '    }' +\n            '}');\n\n{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}\n        //============================================================\n    {{^matrix}}\n        // {{&name}}\n        reset_options();\n        set_name('{{&name}}');\n        {{#options}}\n        opts.{{name}} = {{&value}};\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}};\n        {{/tests}}\n\n    {{/matrix}}\n    {{#matrix}}\n        // {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})\n        reset_options();\n        set_name('{{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})');\n        {{#options}}\n        opts.{{name}} = {{&value}};\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}};\n        {{/tests}}\n\n    {{/matrix}}\n{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}\n    }\n\n    function beautifier_unconverted_tests()\n    {\n        sanitytest = test_obj;\n\n        reset_options();\n        //============================================================\n        test_fragment(null, '');\n\n        reset_options();\n        //============================================================\n        // Test user pebkac protection, converts dash names to underscored names\n        opts[\"end-with-newline\"] = true;\n        test_fragment(null, '\\n');\n\n        reset_options();\n        //============================================================\n        opts.indent_size = 1;\n        opts.indent_char = ' ';\n        bt('{ one_char() }', \"{\\n one_char()\\n}\");\n\n        bt('var a,b=1,c=2', 'var a, b = 1,\\n c = 2');\n\n        opts.indent_size = 4;\n        opts.indent_char = ' ';\n        bt('{ one_char() }', \"{\\n    one_char()\\n}\");\n\n        opts.indent_size = 1;\n        opts.indent_char = \"\\t\";\n        bt('{ one_char() }', \"{\\n\\tone_char()\\n}\");\n        bt('x = a ? b : c; x;', 'x = a ? b : c;\\nx;');\n\n        //set to something else than it should change to, but with tabs on, should override\n        opts.indent_size = 5;\n        opts.indent_char = ' ';\n        opts.indent_with_tabs = true;\n\n        bt('{ one_char() }', \"{\\n\\tone_char()\\n}\");\n        bt('x = a ? b : c; x;', 'x = a ? b : c;\\nx;');\n\n        opts.indent_size = 4;\n        opts.indent_char = ' ';\n        opts.indent_with_tabs = false;\n\n        reset_options();\n        //============================================================\n        // tests for brace positioning\n        beautify_brace_tests('expand');\n        beautify_brace_tests('collapse');\n        beautify_brace_tests('end-expand');\n        beautify_brace_tests('none');\n\n\n        bt('\"foo\"\"bar\"\"baz\"', '\"foo\"\\n\"bar\"\\n\"baz\"');\n        bt(\"'foo''bar''baz'\", \"'foo'\\n'bar'\\n'baz'\");\n\n        bt(\"{\\n    get foo() {}\\n}\");\n        bt(\"{\\n    var a = get\\n    foo();\\n}\");\n        bt(\"{\\n    set foo() {}\\n}\");\n        bt(\"{\\n    var a = set\\n    foo();\\n}\");\n        bt(\"var x = {\\n    get function()\\n}\");\n        bt(\"var x = {\\n    set function()\\n}\");\n\n        // According to my current research get/set have no special meaning outside of an object literal\n        bt(\"var x = set\\n\\na() {}\", \"var x = set\\n\\na() {}\");\n        bt(\"var x = set\\n\\nfunction() {}\", \"var x = set\\n\\nfunction() {}\");\n\n        bt('for () /abc/.test()');\n        bt('if (k) /aaa/m.test(v) && l();');\n        bt('switch (true) {\\n    case /swf/i.test(foo):\\n        bar();\\n}');\n        bt('createdAt = {\\n    type: Date,\\n    default: Date.now\\n}');\n        bt('switch (createdAt) {\\n    case a:\\n        Date,\\n    default:\\n        Date.now\\n}');\n\n        reset_options();\n        //============================================================\n        opts.preserve_newlines = true;\n        bt(\"var a = 'foo' +\\n    'bar';\");\n\n\n        reset_options();\n        //============================================================\n        opts.unescape_strings = false;\n        bt('\"\\\\\\\\s\"'); // == \"\\\\s\" in the js source\n        bt(\"'\\\\\\\\s'\"); // == '\\\\s' in the js source\n        bt(\"'\\\\\\\\\\\\s'\"); // == '\\\\\\s' in the js source\n        bt(\"'\\\\s'\"); // == '\\s' in the js source\n        bt('\"•\"');\n        bt('\"—\"');\n        bt('\"\\\\x41\\\\x42\\\\x43\\\\x01\"', '\"\\\\x41\\\\x42\\\\x43\\\\x01\"');\n        bt('\"\\\\u2022\"', '\"\\\\u2022\"');\n        bt('\"\\\\u{2022}\"', '\"\\\\u{2022}\"');\n        bt('a = /\\s+/');\n        // bt('a = /\\\\x41/','a = /A/');\n        bt('\"\\\\u2022\";a = /\\s+/;\"\\\\x41\\\\x42\\\\x43\\\\x01\".match(/\\\\x41/);','\"\\\\u2022\";\\na = /\\s+/;\\n\"\\\\x41\\\\x42\\\\x43\\\\x01\".match(/\\\\x41/);');\n\n        test_fragment('\"\\\\x41\\\\x42\\\\x01\\\\x43\"');\n        test_fragment('\"\\\\x41\\\\x42\\\\u0001\\\\x43\"');\n        test_fragment('\"\\\\x41\\\\x42\\\\u{0001}\\\\x43\"');\n        test_fragment('\"\\\\x20\\\\x40\\\\x4a\"');\n        test_fragment('\"\\\\xff\\\\x40\\\\x4a\"');\n        test_fragment('\"\\\\u0072\\\\u016B\\\\u0137\\\\u012B\\\\u0074\\\\u0069\\\\u0073\"');\n        test_fragment('\"\\\\u{0072}\\\\u{016B}\\\\u{110000}\\\\u{137}\\\\u012B\\\\x74\\\\u{0000069}\\\\u{073}\"');\n        test_fragment('\"Google Chrome est\\\\u00E1 actualizado.\"');\n        test_fragment(\n            '\"\\\\x22\\\\x27\",\\'\\\\x22\\\\x27\\',\"\\\\x5c\",\\'\\\\x5c\\',\"\\\\xff and \\\\xzz\",\"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"',\n            '\"\\\\x22\\\\x27\", \\'\\\\x22\\\\x27\\', \"\\\\x5c\", \\'\\\\x5c\\', \"\\\\xff and \\\\xzz\", \"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"');\n\n        opts.unescape_strings = true;\n        \n        test_fragment('\"\\\\x41\\\\x42\\\\x01\\\\x43\"', '\"AB\\\\x01C\"');\n        test_fragment('\"\\\\x41\\\\x42\\\\u0001\\\\x43\"', '\"AB\\\\u0001C\"');\n        test_fragment('\"\\\\x41\\\\x42\\\\u{0001}\\\\x43\"', '\"AB\\\\u{0001}C\"');\n        test_fragment('\"\\\\x20\\\\x40\\\\x4a\"', '\" @J\"');\n        test_fragment('\"\\\\xff\\\\x40\\\\x4a\"');\n        test_fragment('\"\\\\u0072\\\\u016B\\\\u0137\\\\u012B\\\\u0074\\\\u0069\\\\u0073\"', '\"\\u0072\\u016B\\u0137\\u012B\\u0074\\u0069\\u0073\"');\n        test_fragment('\"\\\\u{0072}\\\\u{016B}\\\\u{110000}\\\\u{137}\\\\u012B\\\\x74\\\\u{0000069}\\\\u{073}\"', '\"\\u0072\\u016B\\\\u{110000}\\u0137\\u012B\\u0074\\u0069\\u0073\"');\n        test_fragment('\"Google Chrome est\\\\u00E1 actualizado.\"', '\"Google Chrome está actualizado.\"');\n        test_fragment(\n            '\"\\\\x22\\\\x27\",\\'\\\\x22\\\\x27\\',\"\\\\x5c\",\\'\\\\x5c\\',\"\\\\xff and \\\\xzz\",\"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff\"',\n            '\"\\\\\"\\\\\\'\", \\'\\\\\"\\\\\\'\\', \"\\\\\\\\\", \\'\\\\\\\\\\', \"\\\\xff and \\\\xzz\", \"unicode \\\\u0000 \\\\\" \\\\\\' \\\\\\\\ ' + unicode_char(0xffff) + '\"');\n\n        // For error case, return the string unchanged\n        test_fragment(\n            '\"\\\\x22\\\\x27\",\\'\\\\x22\\\\x27\\',\"\\\\x5c\",\\'\\\\x5c\\',\"\\\\xff and \\\\xzz\",\"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"',\n            '\"\\\\\"\\\\\\'\", \\'\\\\\"\\\\\\'\\', \"\\\\\\\\\", \\'\\\\\\\\\\', \"\\\\xff and \\\\xzz\", \"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"');\n\n        reset_options();\n        //============================================================\n        Urlencoded.run_tests(sanitytest);\n    }\n\n    beautifier_tests();\n    beautifier_unconverted_tests();\n}\n\nif (typeof exports !== \"undefined\") {\n    exports.run_javascript_tests = run_javascript_tests;\n}\n"
  },
  {
    "path": "test/data/javascript/python.mustache",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n'''\n{{&header_text}}\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n'''\n\nimport re\nimport unittest\nimport jsbeautifier\nimport six\nimport copy\n\nclass TestJSBeautifier(unittest.TestCase):\n    options = None\n\n    @classmethod\n    def setUpClass(cls):\n        pass\n        cls.wrapregex = re.compile('^(.+)$', re.MULTILINE)\n\n    def reset_options(self):\n        true = True\n        false = False\n\n        default_options = jsbeautifier.default_options()\n        default_options.indent_size = 4\n        default_options.indent_char = ' '\n        default_options.preserve_newlines = true\n        default_options.jslint_happy = false\n        default_options.indent_level = 0\n        default_options.break_chained_methods = false\n        default_options.eol = '\\n'\n\n{{#default_options}}        default_options.{{name}} = {{&value}}\n{{/default_options}}\n\n        self.options = copy.copy(default_options)\n\n    def test_unescape(self):\n        # Test cases contributed by <chrisjshull on GitHub.com>\n        test_fragment = self.decodesto\n        self.reset_options()\n        bt = self.bt\n\n        def unicode_char(value):\n            return six.unichr(value)\n\n        bt('\"\\\\\\\\s\"') # == \"\\\\s\" in the js source\n        bt(\"'\\\\\\\\s'\") # == '\\\\s' in the js source\n        bt(\"'\\\\\\\\\\\\s'\") # == '\\\\\\s' in the js source\n        bt(\"'\\\\s'\") # == '\\s' in the js source\n        bt('\"•\"')\n        bt('\"—\"')\n        bt('\"\\\\x41\\\\x42\\\\x43\\\\x01\"', '\"\\\\x41\\\\x42\\\\x43\\\\x01\"')\n        bt('\"\\\\u2022\"', '\"\\\\u2022\"')\n        bt('\"\\\\u{2022}\"', '\"\\\\u{2022}\"')\n        bt('a = /\\\\s+/')\n        #bt('a = /\\\\x41/','a = /A/')\n        bt('\"\\\\u2022\";a = /\\\\s+/;\"\\\\x41\\\\x42\\\\x43\\\\x01\".match(/\\\\x41/);','\"\\\\u2022\";\\na = /\\\\s+/;\\n\"\\\\x41\\\\x42\\\\x43\\\\x01\".match(/\\\\x41/);')\n\n        test_fragment('\"\\\\x41\\\\x42\\\\x01\\\\x43\"')\n        test_fragment('\"\\\\x41\\\\x42\\\\u0001\\\\x43\"')\n        test_fragment('\"\\\\x41\\\\x42\\\\u{0001}\\\\x43\"')\n        test_fragment('\"\\\\x20\\\\x40\\\\x4a\"')\n        test_fragment('\"\\\\xff\\\\x40\\\\x4a\"')\n        test_fragment('\"\\\\u0072\\\\u016B\\\\u0137\\\\u012B\\\\u0074\\\\u0069\\\\u0073\"')\n        test_fragment('\"\\\\u{0072}\\\\u{016B}\\\\u{110000}\\\\u{137}\\\\u012B\\\\x74\\\\u{0000069}\\\\u{073}\"')\n        test_fragment('\"Google Chrome est\\\\u00E1 actualizado.\"')\n        test_fragment(\n            '\"\\\\x22\\\\x27\",\\'\\\\x22\\\\x27\\',\"\\\\x5c\",\\'\\\\x5c\\',\"\\\\xff and \\\\xzz\",\"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"',\n            '\"\\\\x22\\\\x27\", \\'\\\\x22\\\\x27\\', \"\\\\x5c\", \\'\\\\x5c\\', \"\\\\xff and \\\\xzz\", \"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"')\n\n        self.options.unescape_strings = True\n\n        bt('\"\\\\x41\\\\x42\\\\x01\\\\x43\"', '\"AB\\\\x01C\"')\n        bt('\"\\\\x41\\\\x42\\\\u0001\\\\x43\"', '\"AB\\\\u0001C\"')\n        bt('\"\\\\x41\\\\x42\\\\u{0001}\\\\x43\"', '\"AB\\\\u{0001}C\"')\n        test_fragment('\"\\\\x20\\\\x40\\\\x4a\"', '\" @J\"')\n        test_fragment('\"\\\\xff\\\\x40\\\\x4a\"')\n        test_fragment('\"\\\\u0072\\\\u016B\\\\u0137\\\\u012B\\\\u0074\\\\u0069\\\\u0073\"', six.u('\"\\u0072\\u016B\\u0137\\u012B\\u0074\\u0069\\u0073\"'))\n        test_fragment('\"\\\\u{0072}\\\\u{016B}\\\\u{110000}\\\\u{137}\\\\u012B\\\\x74\\\\u{0000069}\\\\u{073}\"', six.u('\"\\u0072\\u016B\\\\u{110000}\\u0137\\u012B\\u0074\\u0069\\u0073\"'))\n\n        bt('a = /\\\\s+/')\n        test_fragment('\"\\\\x22\\\\x27\",\\'\\\\x22\\\\x27\\',\"\\\\x5c\",\\'\\\\x5c\\',\"\\\\xff\",\"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff\"',\n           '\"\\\\\"\\\\\\'\", \\'\\\\\"\\\\\\'\\', \"\\\\\\\\\", \\'\\\\\\\\\\', \"\\\\xff\", \"unicode \\\\u0000 \\\\\" \\\\\\' \\\\\\\\ ' + unicode_char(0xffff) + '\"')\n\n        # For error case, return the string unchanged\n        test_fragment('\"\\\\x22\\\\x27\",\\'\\\\x22\\\\x27\\',\"\\\\x5c\",\\'\\\\x5c\\',\"\\\\xff and \\\\xzz\",\"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"',\n            '\"\\\\\"\\\\\\'\", \\'\\\\\"\\\\\\'\\', \"\\\\\\\\\", \\'\\\\\\\\\\', \"\\\\xff and \\\\xzz\", \"unicode \\\\u0000 \\\\u0022 \\\\u0027 \\\\u005c \\\\uffff \\\\uzzzz\"')\n\n        self.options.unescape_strings = False\n\n    def test_beautifier(self):\n        test_fragment = self.decodesto\n        bt = self.bt\n\n        true = True\n        false = False\n\n        def unicode_char(value):\n            return six.unichr(value)\n\n        ##============================================================\n        # Line wrap test inputs\n        #....---------1---------2---------3---------4---------5---------6---------7\n        #....1234567890123456789012345678901234567890123456789012345678901234567890\n        wrap_input_1=(\n            'foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));\\n' +\n            'Test_very_long_variable_name_this_should_never_wrap\\n.but_this_can\\n' +\n            'return between_return_and_expression_should_never_wrap.but_this_can\\n' +\n            'throw between_throw_and_expression_should_never_wrap.but_this_can\\n' +\n            'if (wraps_can_occur && inside_an_if_block) that_is_\\n.okay();\\n' +\n            'object_literal = {\\n' +\n            '    propertx: first_token + 12345678.99999E-6,\\n' +\n            '    property: first_token_should_never_wrap + but_this_can,\\n' +\n            '    propertz: first_token_should_never_wrap + !but_this_can,\\n' +\n            '    proper: \"first_token_should_never_wrap\" + \"but_this_can\"\\n' +\n            '}');\n\n        #....---------1---------2---------3---------4---------5---------6---------7\n        #....1234567890123456789012345678901234567890123456789012345678901234567890\n        wrap_input_2=(\n            '{\\n' +\n            '    foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));\\n' +\n            '    Test_very_long_variable_name_this_should_never_wrap\\n.but_this_can\\n' +\n            '    return between_return_and_expression_should_never_wrap.but_this_can\\n' +\n            '    throw between_throw_and_expression_should_never_wrap.but_this_can\\n' +\n            '    if (wraps_can_occur && inside_an_if_block) that_is_\\n.okay();\\n' +\n            '    object_literal = {\\n' +\n            '        propertx: first_token + 12345678.99999E-6,\\n' +\n            '        property: first_token_should_never_wrap + but_this_can,\\n' +\n            '        propertz: first_token_should_never_wrap + !but_this_can,\\n' +\n            '        proper: \"first_token_should_never_wrap\" + \"but_this_can\"\\n' +\n            '    }' +\n            '}');\n\n{{#groups}}{{#set_mustache_tags}}.{{/set_mustache_tags}}\n        #============================================================\n    {{^matrix}}\n        # {{&name}}\n        self.reset_options()\n        {{#options}}\n        self.options.{{name}} = {{&value}}\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}}\n        {{/tests}}\n\n    {{/matrix}}\n    {{#matrix}}\n        # {{&name}} - ({{#matrix_context_string}}.{{/matrix_context_string}})\n        self.reset_options()\n        {{#options}}\n        self.options.{{name}} = {{&value}}\n        {{/options}}\n        {{#tests}}\n        {{#test_line}}.{{/test_line}}\n        {{/tests}}\n\n    {{/matrix}}\n{{#unset_mustache_tags}}.{{/unset_mustache_tags}}{{/groups}}\n\n    def test_beautifier_unconverted(self):\n        test_fragment = self.decodesto\n        bt = self.bt\n\n        self.reset_options()\n        #============================================================\n        bt(None, \"\")\n\n        self.reset_options()\n        #============================================================\n        # Test user pebkac protection, converts dash names to underscored names\n        setattr(self.options, 'end-with-newline', True)\n        test_fragment(None, '\\n')\n\n        self.reset_options()\n        #============================================================\n        # Test passing dictionary or tuple\n        self.options = {'end_with_newline': True, 'eol': '\\r\\n' }\n        test_fragment(None, '\\r\\n')\n\n        self.options = {'end-with-newline': True}\n        test_fragment(None, '\\n')\n\n        self.options = {'end-with-newline': False}\n        test_fragment(None, '')\n\n        self.options = ( ('end-with-newline', True), ('eol', '\\r') )\n        test_fragment(None, '\\r')\n\n        self.reset_options()\n        #============================================================\n        self.options.indent_size = 1\n        self.options.indent_char = ' '\n        bt('{ one_char() }', \"{\\n one_char()\\n}\")\n\n        bt('var a,b=1,c=2', 'var a, b = 1,\\n c = 2')\n\n        self.options.indent_size = 4\n        self.options.indent_char = ' '\n        bt('{ one_char() }', \"{\\n    one_char()\\n}\")\n\n        self.options.indent_size = 1\n        self.options.indent_char = \"\\t\"\n        bt('{ one_char() }', \"{\\n\\tone_char()\\n}\")\n        bt('x = a ? b : c; x;', 'x = a ? b : c;\\nx;')\n\n        #set to something else than it should change to, but with tabs on, should override\n        self.options.indent_size = 5\n        self.options.indent_char = ' '\n        self.options.indent_with_tabs = True\n\n        bt('{ one_char() }', \"{\\n\\tone_char()\\n}\")\n        bt('x = a ? b : c; x;', 'x = a ? b : c;\\nx;')\n\n\n        self.reset_options()\n        #============================================================\n        self.options.preserve_newlines = False\n        bt('var\\na=dont_preserve_newlines;', 'var a = dont_preserve_newlines;')\n\n        # make sure the blank line between function definitions stays\n        # even when preserve_newlines = False\n        bt('function foo() {\\n    return 1;\\n}\\n\\nfunction foo() {\\n    return 1;\\n}')\n        bt('function foo() {\\n    return 1;\\n}\\nfunction foo() {\\n    return 1;\\n}',\n        'function foo() {\\n    return 1;\\n}\\n\\nfunction foo() {\\n    return 1;\\n}'\n        )\n        bt('function foo() {\\n    return 1;\\n}\\n\\n\\nfunction foo() {\\n    return 1;\\n}',\n        'function foo() {\\n    return 1;\\n}\\n\\nfunction foo() {\\n    return 1;\\n}'\n        )\n\n\n        self.options.preserve_newlines = True\n        bt('var\\na=do_preserve_newlines;', 'var\\n    a = do_preserve_newlines;')\n        bt('if (foo) //  comment\\n{\\n    bar();\\n}')\n\n\n        self.reset_options()\n        #============================================================\n        # START tests for brace positioning\n\n        # If this is ever supported, update tests for each brace style.\n        # test_fragment('return\\n{', 'return\\n{') # can't support this?, but that's an improbable and extreme case anyway.\n\n        self.options.brace_style = 'expand'\n\n        bt('//case 1\\nif (a == 1)\\n{}\\n//case 2\\nelse if (a == 2)\\n{}')\n        bt('if(1){2}else{3}', \"if (1)\\n{\\n    2\\n}\\nelse\\n{\\n    3\\n}\")\n        bt('try{a();}catch(b){c();}catch(d){}finally{e();}',\n            \"try\\n{\\n    a();\\n}\\ncatch (b)\\n{\\n    c();\\n}\\ncatch (d)\\n{}\\nfinally\\n{\\n    e();\\n}\")\n        bt('if(a){b();}else if(c) foo();',\n            \"if (a)\\n{\\n    b();\\n}\\nelse if (c) foo();\")\n        bt(\"if (a) {\\n// comment\\n}else{\\n// comment\\n}\",\n            \"if (a)\\n{\\n    // comment\\n}\\nelse\\n{\\n    // comment\\n}\") # if/else statement with empty body\n        bt('if (x) {y} else { if (x) {y}}',\n            'if (x)\\n{\\n    y\\n}\\nelse\\n{\\n    if (x)\\n    {\\n        y\\n    }\\n}')\n        bt('if (a)\\n{\\nb;\\n}\\nelse\\n{\\nc;\\n}',\n            'if (a)\\n{\\n    b;\\n}\\nelse\\n{\\n    c;\\n}')\n        test_fragment('    /*\\n* xx\\n*/\\n// xx\\nif (foo) {\\n    bar();\\n}',\n                      '    /*\\n     * xx\\n     */\\n    // xx\\n    if (foo)\\n    {\\n        bar();\\n    }')\n        bt('if (foo)\\n{}\\nelse /regex/.test();')\n        test_fragment('if (foo) {', 'if (foo)\\n{')\n        test_fragment('foo {', 'foo\\n{')\n        test_fragment('return {', 'return {') # return needs the brace.\n        test_fragment('return /* inline */ {', 'return /* inline */ {')\n        test_fragment('return;\\n{', 'return;\\n{')\n        bt(\"throw {}\")\n        bt(\"throw {\\n    foo;\\n}\")\n        bt('var foo = {}')\n        bt('function x() {\\n    foo();\\n}zzz', 'function x()\\n{\\n    foo();\\n}\\nzzz')\n        test_fragment('a: do {} while (); xxx', 'a: do {} while ();\\nxxx')\n        bt('{a: do {} while (); xxx}', '{\\n    a: do {} while ();xxx\\n}')\n        bt('var a = new function() {};')\n        bt('var a = new function a() {};', 'var a = new function a()\\n{};')\n        bt('var a = new function()\\n{};', 'var a = new function() {};')\n        bt('var a = new function a()\\n{};')\n        bt('var a = new function a()\\n    {},\\n    b = new function b()\\n    {};')\n        bt(\"foo({\\n    'a': 1\\n},\\n10);\",\n            \"foo(\\n    {\\n        'a': 1\\n    },\\n    10);\")\n        bt('([\"foo\",\"bar\"]).each(function(i) {return i;});',\n            '([\"foo\", \"bar\"]).each(function(i)\\n{\\n    return i;\\n});')\n        bt('(function(i) {return i;})();',\n            '(function(i)\\n{\\n    return i;\\n})();')\n        bt( \"test( /*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/\\n\" +\n            \"    {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test(\\n\" +\n            \"/*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"},\\n\" +\n            \"/*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test(\\n\" +\n            \"    /*Argument 1*/\\n\" +\n            \"    {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test( /*Argument 1*/\\n\" +\n            \"{\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */\\n\" +\n            \"{\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/\\n\" +\n            \"    {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n\n        self.options.brace_style = 'collapse'\n\n        bt('//case 1\\nif (a == 1) {}\\n//case 2\\nelse if (a == 2) {}')\n        bt('if(1){2}else{3}', \"if (1) {\\n    2\\n} else {\\n    3\\n}\")\n        bt('try{a();}catch(b){c();}catch(d){}finally{e();}',\n             \"try {\\n    a();\\n} catch (b) {\\n    c();\\n} catch (d) {} finally {\\n    e();\\n}\")\n        bt('if(a){b();}else if(c) foo();',\n            \"if (a) {\\n    b();\\n} else if (c) foo();\")\n        bt(\"if (a) {\\n// comment\\n}else{\\n// comment\\n}\",\n            \"if (a) {\\n    // comment\\n} else {\\n    // comment\\n}\") # if/else statement with empty body\n        bt('if (x) {y} else { if (x) {y}}',\n            'if (x) {\\n    y\\n} else {\\n    if (x) {\\n        y\\n    }\\n}')\n        bt('if (a)\\n{\\nb;\\n}\\nelse\\n{\\nc;\\n}',\n            'if (a) {\\n    b;\\n} else {\\n    c;\\n}')\n        test_fragment('    /*\\n* xx\\n*/\\n// xx\\nif (foo) {\\n    bar();\\n}',\n                      '    /*\\n     * xx\\n     */\\n    // xx\\n    if (foo) {\\n        bar();\\n    }')\n        bt('if (foo) {} else /regex/.test();')\n        test_fragment('if (foo) {', 'if (foo) {')\n        test_fragment('foo {', 'foo {')\n        test_fragment('return {', 'return {') # return needs the brace.\n        test_fragment('return /* inline */ {', 'return /* inline */ {')\n        test_fragment('return;\\n{', 'return;\\n{')\n        bt(\"throw {}\")\n        bt(\"throw {\\n    foo;\\n}\")\n        bt('var foo = {}')\n        bt('function x() {\\n    foo();\\n}zzz', 'function x() {\\n    foo();\\n}\\nzzz')\n        test_fragment('a: do {} while (); xxx', 'a: do {} while ();\\nxxx')\n        bt('{a: do {} while (); xxx}', '{\\n    a: do {} while ();xxx\\n}')\n        bt('var a = new function() {};')\n        bt('var a = new function a() {};')\n        bt('var a = new function()\\n{};', 'var a = new function() {};')\n        bt('var a = new function a()\\n{};', 'var a = new function a() {};')\n        bt('var a = new function a()\\n    {},\\n    b = new function b()\\n    {};', 'var a = new function a() {},\\n    b = new function b() {};')\n        bt(\"foo({\\n    'a': 1\\n},\\n10);\",\n            \"foo({\\n        'a': 1\\n    },\\n    10);\")\n        bt('([\"foo\",\"bar\"]).each(function(i) {return i;});',\n            '([\"foo\", \"bar\"]).each(function(i) {\\n    return i;\\n});')\n        bt('(function(i) {return i;})();',\n            '(function(i) {\\n    return i;\\n})();')\n        bt( \"test( /*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/ {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test(\\n\" +\n            \"/*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"},\\n\" +\n            \"/*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test(\\n\" +\n            \"    /*Argument 1*/\\n\" +\n            \"    {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test( /*Argument 1*/\\n\" +\n            \"{\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */\\n\" +\n            \"{\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/ {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n\n        self.options.brace_style = \"end-expand\"\n\n        bt('//case 1\\nif (a == 1) {}\\n//case 2\\nelse if (a == 2) {}')\n        bt('if(1){2}else{3}', \"if (1) {\\n    2\\n}\\nelse {\\n    3\\n}\")\n        bt('try{a();}catch(b){c();}catch(d){}finally{e();}',\n            \"try {\\n    a();\\n}\\ncatch (b) {\\n    c();\\n}\\ncatch (d) {}\\nfinally {\\n    e();\\n}\")\n        bt('if(a){b();}else if(c) foo();',\n            \"if (a) {\\n    b();\\n}\\nelse if (c) foo();\")\n        bt(\"if (a) {\\n// comment\\n}else{\\n// comment\\n}\",\n            \"if (a) {\\n    // comment\\n}\\nelse {\\n    // comment\\n}\") # if/else statement with empty body\n        bt('if (x) {y} else { if (x) {y}}',\n            'if (x) {\\n    y\\n}\\nelse {\\n    if (x) {\\n        y\\n    }\\n}')\n        bt('if (a)\\n{\\nb;\\n}\\nelse\\n{\\nc;\\n}',\n            'if (a) {\\n    b;\\n}\\nelse {\\n    c;\\n}')\n        test_fragment('    /*\\n* xx\\n*/\\n// xx\\nif (foo) {\\n    bar();\\n}',\n                      '    /*\\n     * xx\\n     */\\n    // xx\\n    if (foo) {\\n        bar();\\n    }')\n        bt('if (foo) {}\\nelse /regex/.test();')\n        test_fragment('if (foo) {', 'if (foo) {')\n        test_fragment('foo {', 'foo {')\n        test_fragment('return {', 'return {') # return needs the brace.\n        test_fragment('return /* inline */ {', 'return /* inline */ {')\n        test_fragment('return;\\n{', 'return;\\n{')\n        bt(\"throw {}\")\n        bt(\"throw {\\n    foo;\\n}\")\n        bt('var foo = {}')\n        bt('function x() {\\n    foo();\\n}zzz', 'function x() {\\n    foo();\\n}\\nzzz')\n        test_fragment('a: do {} while (); xxx', 'a: do {} while ();\\nxxx')\n        bt('{a: do {} while (); xxx}', '{\\n    a: do {} while ();xxx\\n}')\n        bt('var a = new function() {};')\n        bt('var a = new function a() {};')\n        bt('var a = new function()\\n{};', 'var a = new function() {};')\n        bt('var a = new function a()\\n{};', 'var a = new function a() {};')\n        bt('var a = new function a()\\n    {},\\n    b = new function b()\\n    {};', 'var a = new function a() {},\\n    b = new function b() {};')\n        bt(\"foo({\\n    'a': 1\\n},\\n10);\",\n            \"foo({\\n        'a': 1\\n    },\\n    10);\")\n        bt('([\"foo\",\"bar\"]).each(function(i) {return i;});',\n            '([\"foo\", \"bar\"]).each(function(i) {\\n    return i;\\n});')\n        bt('(function(i) {return i;})();',\n            '(function(i) {\\n    return i;\\n})();')\n        bt( \"test( /*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/ {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test(\\n\" +\n            \"/*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"},\\n\" +\n            \"/*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test(\\n\" +\n            \"    /*Argument 1*/\\n\" +\n            \"    {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test( /*Argument 1*/\\n\" +\n            \"{\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */\\n\" +\n            \"{\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/ {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n\n        self.options.brace_style = 'none'\n\n        bt('//case 1\\nif (a == 1)\\n{}\\n//case 2\\nelse if (a == 2)\\n{}')\n        bt('if(1){2}else{3}', \"if (1) {\\n    2\\n} else {\\n    3\\n}\")\n        bt('try{a();}catch(b){c();}catch(d){}finally{e();}',\n            \"try {\\n    a();\\n} catch (b) {\\n    c();\\n} catch (d) {} finally {\\n    e();\\n}\")\n        bt('if(a){b();}else if(c) foo();',\n            \"if (a) {\\n    b();\\n} else if (c) foo();\")\n        bt(\"if (a) {\\n// comment\\n}else{\\n// comment\\n}\",\n            \"if (a) {\\n    // comment\\n} else {\\n    // comment\\n}\") # if/else statement with empty body\n        bt('if (x) {y} else { if (x) {y}}',\n            'if (x) {\\n    y\\n} else {\\n    if (x) {\\n        y\\n    }\\n}')\n        bt('if (a)\\n{\\nb;\\n}\\nelse\\n{\\nc;\\n}',\n            'if (a)\\n{\\n    b;\\n}\\nelse\\n{\\n    c;\\n}')\n        test_fragment('    /*\\n* xx\\n*/\\n// xx\\nif (foo) {\\n    bar();\\n}',\n                      '    /*\\n     * xx\\n     */\\n    // xx\\n    if (foo) {\\n        bar();\\n    }')\n        bt('if (foo)\\n{}\\nelse /regex/.test();')\n        test_fragment('if (foo) {')\n        test_fragment('foo {')\n        test_fragment('return {') # return needs the brace.\n        test_fragment('return /* inline */ {')\n        test_fragment('return;\\n{')\n        bt(\"throw {}\")\n        bt(\"throw {\\n    foo;\\n}\")\n        bt('var foo = {}')\n        bt('function x() {\\n    foo();\\n}zzz', 'function x() {\\n    foo();\\n}\\nzzz')\n        test_fragment('a: do {} while (); xxx', 'a: do {} while ();\\nxxx')\n        bt('{a: do {} while (); xxx}', '{\\n    a: do {} while ();xxx\\n}')\n        bt('var a = new function() {};')\n        bt('var a = new function a() {};')\n        bt('var a = new function()\\n{};', 'var a = new function() {};')\n        bt('var a = new function a()\\n{};')\n        bt('var a = new function a()\\n    {},\\n    b = new function b()\\n    {};')\n        bt(\"foo({\\n    'a': 1\\n},\\n10);\",\n            \"foo({\\n        'a': 1\\n    },\\n    10);\")\n        bt('([\"foo\",\"bar\"]).each(function(i) {return i;});',\n            '([\"foo\", \"bar\"]).each(function(i) {\\n    return i;\\n});')\n        bt('(function(i) {return i;})();',\n            '(function(i) {\\n    return i;\\n})();')\n        bt( \"test( /*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/ {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test(\\n\" +\n            \"/*Argument 1*/ {\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"},\\n\" +\n            \"/*Argument 2\\n\" +\n            \" */ {\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test(\\n\" +\n            \"    /*Argument 1*/\\n\" +\n            \"    {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        bt( \"test( /*Argument 1*/\\n\" +\n            \"{\\n\" +\n            \"    'Value1': '1'\\n\" +\n            \"}, /*Argument 2\\n\" +\n            \" */\\n\" +\n            \"{\\n\" +\n            \"    'Value2': '2'\\n\" +\n            \"});\",\n            # expected\n            \"test( /*Argument 1*/\\n\" +\n            \"    {\\n\" +\n            \"        'Value1': '1'\\n\" +\n            \"    },\\n\" +\n            \"    /*Argument 2\\n\" +\n            \"     */\\n\" +\n            \"    {\\n\" +\n            \"        'Value2': '2'\\n\" +\n            \"    });\")\n        # END tests for brace position\n\n        self.reset_options()\n        #============================================================\n        self.options.preserve_newlines = True\n        bt(\"var a = 'foo' +\\n    'bar';\")\n\n        bt('\"foo\"\"bar\"\"baz\"', '\"foo\"\\n\"bar\"\\n\"baz\"')\n        bt(\"'foo''bar''baz'\", \"'foo'\\n'bar'\\n'baz'\")\n        bt(\"{\\n    get foo() {}\\n}\")\n        bt(\"{\\n    var a = get\\n    foo();\\n}\")\n        bt(\"{\\n    set foo() {}\\n}\")\n        bt(\"{\\n    var a = set\\n    foo();\\n}\")\n        bt(\"var x = {\\n    get function()\\n}\")\n        bt(\"var x = {\\n    set function()\\n}\")\n\n        # According to my current research get/set have no special meaning outside of an object literal\n        bt(\"var x = set\\n\\na() {}\", \"var x = set\\n\\na() {}\")\n        bt(\"var x = set\\n\\nfunction() {}\", \"var x = set\\n\\nfunction() {}\")\n\n        bt('for () /abc/.test()')\n        bt('if (k) /aaa/m.test(v) && l();')\n        bt('switch (true) {\\n    case /swf/i.test(foo):\\n        bar();\\n}')\n        bt('createdAt = {\\n    type: Date,\\n    default: Date.now\\n}')\n        bt('switch (createdAt) {\\n    case a:\\n        Date,\\n    default:\\n        Date.now\\n}')\n\n        self.reset_options()\n        #============================================================\n\n\n    def decodesto(self, input, expectation=None):\n        if expectation is None:\n            expectation = input\n\n        self.assertMultiLineEqual(\n            jsbeautifier.beautify(input, self.options), expectation)\n\n        # if the expected is different from input, run it again\n        # expected output should be unchanged when run twice.\n        if not expectation is None:\n            self.assertMultiLineEqual(\n                jsbeautifier.beautify(expectation, self.options), expectation)\n\n        if self.options is None or not isinstance(self.options, (dict, tuple)):\n            # Everywhere we do newlines, they should be replaced with opts.eol\n            self.options.eol = '\\r\\\\n'\n            expectation = expectation.replace('\\n', '\\r\\n')\n            self.options.disabled = True\n            self.assertMultiLineEqual(\n                jsbeautifier.beautify(input, self.options), input or '')\n            self.assertMultiLineEqual(\n                jsbeautifier.beautify('\\n\\n' + expectation, self.options), '\\n\\n' + expectation)\n            self.options.disabled = False;\n            self.assertMultiLineEqual(\n                jsbeautifier.beautify(input, self.options), expectation)\n            if input and input.find('\\n') != -1:\n                input = input.replace('\\n', '\\r\\n')\n                self.assertMultiLineEqual(\n                    jsbeautifier.beautify(input, self.options), expectation)\n                # Ensure support for auto eol detection\n                self.options.eol = 'auto'\n                self.assertMultiLineEqual(\n                    jsbeautifier.beautify(input, self.options), expectation)\n            self.options.eol = '\\n'\n\n    def wrap(self, text):\n        return self.wrapregex.sub('    \\\\1', text)\n\n    def bt(self, input, expectation=None):\n        if expectation is None:\n            expectation = input\n\n        self.decodesto(input, expectation)\n        # If we set raw, input should be unchanged\n        self.options.test_output_raw = True\n        if self.options.end_with_newline:\n            self.decodesto(input, input)\n        self.options.test_output_raw = False\n\n        current_indent_size = None\n        if self.options.js and self.options.js['indent_size']:\n            current_indent_size = self.options.js['indent_size']\n\n        if not current_indent_size:\n            current_indent_size = self.options.indent_size\n\n        if current_indent_size == 4 and input:\n            wrapped_input = '{\\n%s\\n    foo = bar;\\n}' % self.wrap(input)\n            wrapped_expect = '{\\n%s\\n    foo = bar;\\n}' % self.wrap(expectation)\n            self.decodesto(wrapped_input, wrapped_expect)\n\n            # If we set raw, input should be unchanged\n            self.options.test_output_raw = True\n            if self.options.end_with_newline:\n                self.decodesto(wrapped_input, wrapped_input)\n            self.options.test_output_raw = False\n\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "test/data/javascript/tests.js",
    "content": "/*\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\nvar inputlib = require('./inputlib');\n\nvar templating_matrix = [\n  // Php (<?php ... ?> and <?= ... ?>) =.\n  {\n    s: '<?php',\n    e: '?>'\n  },\n  {\n    s: '<?=',\n    e: '?>'\n  },\n  // erb, ejs, asp: <% ... %>\n  {\n    s: '<%',\n    e: '%>'\n  },\n  {\n    s: '<%=',\n    e: '%>'\n  },\n  // django {{ ... }} and {# ... #} and {% ... %}\n  {\n    s: '{{',\n    e: '}}'\n  },\n  {\n    s: '{#',\n    e: '#}'\n  },\n  {\n    s: '{%',\n    e: '%}'\n  },\n  // handlebars {{{ ... }}} and {{ ... }} and {{# ... }} and {{! ... }} and {{!-- --}} \n  // mustache adds {{^ ... }}\n  {\n    // options: [\n    //   { name: \"indent_handlebars\", value: \"false\" }\n    // ],\n    s: '{{',\n    e: '}}'\n  },\n  {\n    // options: [\n    //   { name: \"indent_handlebars\", value: \"false\" }\n    // ],\n    s: '{{{',\n    e: '}}}'\n  },\n  {\n    // options: [\n    //   { name: \"indent_handlebars\", value: \"false\" }\n    // ],\n    s: '{{^',\n    e: '}}'\n  },\n  {\n    // options: [\n    //   { name: \"indent_handlebars\", value: \"false\" }\n    // ],\n    s: '{{#',\n    e: '}}'\n  },\n  {\n    //   options: [\n    //     { name: \"indent_handlebars\", value: \"false\" }\n    //   ],\n    s: '{{!',\n    e: '}}'\n  },\n  {\n    //   options: [\n    //     { name: \"indent_handlebars\", value: \"false\" }\n    //   ],\n    s: '{{!--',\n    e: '--}}'\n  }\n];\n\nexports.test_data = {\n  default_options: [\n    { name: \"indent_size\", value: \"4\" },\n    { name: \"indent_char\", value: \"' '\" },\n    { name: \"preserve_newlines\", value: \"true\" },\n    { name: \"jslint_happy\", value: \"false\" }\n  ],\n  groups: [{\n      name: \"Unicode Support\",\n      description: \"\",\n      tests: [{\n        unchanged: \"var ' + unicode_char(3232) + '_' + unicode_char(3232) + ' = \\\"hi\\\";\"\n      }, {\n        unchanged: [\n          \"var ' + unicode_char(228) + 'x = {\",\n          \"    ' + unicode_char(228) + 'rgerlich: true\",\n          \"};\"\n        ]\n      }, {\n        unchanged: [\n          \"var \\\\\\\\u00E4\\\\\\\\u0ca0\\\\\\\\u0cA0\\\\\\\\u0Ca0 = {\",\n          \"    \\\\\\\\u0ca0rgerlich: true\",\n          \"};\"\n        ]\n      }, {\n        unchanged: [\n          \"var \\\\\\\\u00E4add\\\\\\\\u0025 = {\",\n          \"    \\\\\\\\u0044rgerlich\\\\\\\\u0ca0: true\",\n          \"};\"\n        ]\n      }, {\n        input_: \"var' + unicode_char(160) + unicode_char(3232) + '_' + unicode_char(3232) + ' = \\\"hi\\\";\",\n        output: \"var ' + unicode_char(3232) + '_' + unicode_char(3232) + ' = \\\"hi\\\";\"\n      }, {\n        comment: 'Issue #2159: Invalid prettification of object with unicode escape character as object key - test scenario: object with unicode as key',\n        input: '{\\\\\\\\u{1d4b6}:\"ascr\"}',\n        output: [\n          '{',\n          '    \\\\\\\\u{1d4b6}: \"ascr\"',\n          '}'\n        ]\n      }, {\n        unchanged: [\n          \"var \\\\\\\\u{E4}\\\\\\\\u{ca0}\\\\\\\\u{0cA0}\\\\\\\\u{000000Ca0} = {\",\n          \"    \\\\\\\\u{ca0}rgerlich: true\",\n          \"};\"\n        ]\n      }]\n    }, {\n      name: \"Test template and continuation strings\",\n      description: \"\",\n      tests: [\n        { unchanged: '`This is a ${template} string.`' },\n        { unchanged: '`This\\n  is\\n  a\\n  ${template}\\n  string.`' },\n        { unchanged: 'a = `This is a continuation\\\\\\\\\\nstring.`' },\n        { unchanged: 'a = \"This is a continuation\\\\\\\\\\nstring.\"' },\n        { unchanged: '`SELECT\\n  nextval(\\\\\\'${this.options.schema ? `${this.options.schema}.` : \\\\\\'\\\\\\'}\"${this.tableName}_${this.autoIncrementField}_seq\"\\\\\\'::regclass\\n  ) nextval;`' },\n        {\n          comment: 'Tests for #1030',\n          unchanged: [\n            'const composeUrl = (host) => {',\n            '    return `${host `test`}`;',\n            '};'\n          ]\n        }, {\n          unchanged: [\n            'const composeUrl = (host, api, key, data) => {',\n            '    switch (api) {',\n            '        case \"Init\":',\n            '            return `${host}/vwapi/Init?VWID=${key}&DATA=${encodeURIComponent(',\n            '                Object.keys(data).map((k) => `${k}=${ data[k]}` ).join(\";\")',\n            '            )}`;',\n            '        case \"Pay\":',\n            '            return `${host}/vwapi/Pay?SessionId=${par}`;',\n            '    };',\n            '};'\n          ]\n        }\n      ]\n    }, {\n      name: \"Private Class Fields\",\n      description: \"Permit private class fields which are declared with a leading \\\"#\\\".\",\n      tests: [\n        { unchanged: '#foo' },\n        {\n          unchanged: [\n            'class X {',\n            '    #foo = null;',\n            '    get foo() {',\n            '        return this.#foo;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          input: 'class X {#foo=null;}',\n          output: [\n            'class X {',\n            '    #foo = null;',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"ES7 Decorators\",\n      description: \"Permit ES7 decorators, which are invoked with a leading \\\"@\\\".\",\n      tests: [\n        { unchanged: '@foo' },\n        { unchanged: '@foo(bar)' },\n        {\n          unchanged: [\n            '@foo(function(k, v) {',\n            '    implementation();',\n            '})'\n          ]\n        }\n      ]\n    }, {\n      name: \"ES7 exponential\",\n      description: \"ES7 exponential\",\n      tests: [\n        { unchanged: 'x ** 2' },\n        { unchanged: 'x ** -2' }\n      ]\n    }, {\n      name: \"Spread operator\",\n      description: \"Spread operator\",\n      options: [\n        { name: 'brace_style', value: '\"collapse,preserve-inline\"' }\n      ],\n      tests: [\n        { unchanged: 'const m = { ...item, c: 3 };' },\n        { unchanged: 'const m = {\\n    ...item,\\n    c: 3\\n};' },\n        { unchanged: 'const m = { c: 3, ...item };' },\n        { unchanged: 'const m = [...item, 3];' },\n        { unchanged: 'const m = [3, ...item];' }\n      ]\n    }, {\n      name: \"Object literal shorthand functions\",\n      description: \"Object literal shorthand functions\",\n      tests: [\n        { unchanged: 'return {\\n    foo() {\\n        return 42;\\n    }\\n}' },\n        {\n          unchanged: [\n            'var foo = {',\n            '    * bar() {',\n            '        yield 42;',\n            '    }',\n            '};'\n          ]\n        },\n        {\n          input: 'var foo = {bar(){return 42;},*barGen(){yield 42;}};',\n          output: ['var foo = {',\n            '    bar() {',\n            '        return 42;',\n            '    },',\n            '    * barGen() {',\n            '        yield 42;',\n            '    }',\n            '};'\n          ]\n        }, {\n          comment: 'also handle generator shorthand in class - #1013',\n          unchanged: [\n            'class A {',\n            '    fn() {',\n            '        return true;',\n            '    }',\n            '',\n            '    * gen() {',\n            '        return true;',\n            '    }',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'class A {',\n            '    * gen() {',\n            '        return true;',\n            '    }',\n            '',\n            '    fn() {',\n            '        return true;',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"End With Newline\",\n      description: \"\",\n      matrix: [{\n          options: [\n            { name: \"end_with_newline\", value: \"true\" }\n          ],\n          eof: '\\n'\n        }, {\n          options: [\n            { name: \"end_with_newline\", value: \"false\" }\n          ],\n          eof: ''\n        }\n\n      ],\n      tests: [\n        { fragment: true, input: '', output: '{{eof}}' },\n        { fragment: true, input: '   return .5', output: '   return .5{{eof}}' },\n        { fragment: true, input: '   \\n\\nreturn .5\\n\\n\\n\\n', output: '   return .5{{eof}}' },\n        { fragment: true, input: '\\n', output: '{{eof}}' }\n      ]\n    }, {\n      name: \"Support Indent Level Options and Base Indent Autodetection\",\n      description: \"If user specifies indent level, use it. If not, autodetect indent level from starting whitespace.\",\n      matrix: [{\n        options: [],\n        input_start_indent: '   ',\n        output_start_of_base: '   ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_level\", value: \"0\" }\n        ],\n        input_start_indent: '   ',\n        output_start_of_base: '   ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_level\", value: \"1\" }\n        ],\n        input_start_indent: '   ',\n        output_start_of_base: '    ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_level\", value: \"2\" }\n        ],\n        input_start_indent: '',\n        output_start_of_base: '        ',\n        i: '    '\n      }, {\n        options: [\n          { name: \"indent_with_tabs\", value: \"true\" },\n          { name: \"indent_level\", value: \"2\" }\n        ],\n        input_start_indent: '',\n        output_start_of_base: '\\t\\t',\n        i: '\\t'\n      }, {\n        options: [\n          { name: \"indent_level\", value: \"0\" }\n        ],\n        input_start_indent: '\\t   ',\n        output_start_of_base: '\\t   ',\n        i: '    '\n      }],\n      tests: [\n        { fragment: true, input: '{{input_start_indent}}a', output: '{{output_start_of_base}}a' },\n        {\n          fragment: true,\n          input: [\n            '{{input_start_indent}}function test(){',\n            '  console.log(\"this is a test\");',\n            '}'\n          ],\n          output: [\n            '{{output_start_of_base}}function test() {',\n            '{{output_start_of_base}}{{i}}console.log(\"this is a test\");',\n            '{{output_start_of_base}}}'\n          ]\n        }, {\n          fragment: true,\n          input: [\n            '{{input_start_indent}}// This is a random comment',\n            'function test(){',\n            '  console.log(\"this is a test\");',\n            '}'\n          ],\n          output: [\n            '{{output_start_of_base}}// This is a random comment',\n            '{{output_start_of_base}}function test() {',\n            '{{output_start_of_base}}{{i}}console.log(\"this is a test\");',\n            '{{output_start_of_base}}}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Support simple language specific option inheritance/overriding\",\n      description: \"Support simple language specific option inheritance/overriding\",\n      matrix: [{\n          options: [\n            { name: \"js\", value: \"{ 'indent_size': 3 }\" },\n            { name: \"css\", value: \"{ 'indent_size': 5 }\" }\n          ],\n          j: '   '\n        },\n        {\n          options: [\n            { name: \"html\", value: \"{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 } }\" }\n          ],\n          j: '    '\n        },\n        {\n          options: [\n            { name: \"indent_size\", value: \"9\" },\n            { name: \"html\", value: \"{ 'js': { 'indent_size': 3 }, 'css': { 'indent_size': 5 }, 'indent_size': 2}\" },\n            { name: \"js\", value: \"{ 'indent_size': 4 }\" },\n            { name: \"css\", value: \"{ 'indent_size': 3 }\" }\n          ],\n          j: '    '\n        }\n      ],\n      tests: [{\n        unchanged: [\n          'if (a == b) {',\n          '{{j}}test();',\n          '}'\n        ]\n      }]\n    }, {\n      name: \"Brace style permutations\",\n      description: \"\",\n      template: \"< >\",\n      matrix: [\n        // brace_style collapse,preserve-inline - Should preserve if no newlines\n        {\n          options: [\n            { name: \"brace_style\", value: \"'collapse,preserve-inline'\" }\n          ],\n          ibo: '',\n          iao: '',\n          ibc: '',\n          iac: '',\n          obo: ' ',\n          oao: ' ',\n          obc: ' ',\n          oac: ' '\n        },\n        {\n          options: [\n            { name: \"brace_style\", value: \"'collapse,preserve-inline'\" }\n          ],\n          ibo: '\\n',\n          iao: '\\n',\n          ibc: '\\n',\n          iac: '\\n',\n          obo: ' ',\n          oao: '\\n    ',\n          obc: '\\n',\n          oac: ' '\n        },\n\n        // brace_style collapse - Shouldn't preserve if no newlines (uses collapse styling)\n        {\n          options: [],\n          ibo: '',\n          iao: '',\n          ibc: '',\n          iac: '',\n          obo: ' ',\n          oao: '\\n    ',\n          obc: '\\n',\n          oac: ' '\n        },\n        {\n          options: [\n            { name: \"brace_style\", value: \"'collapse'\" }\n          ],\n          ibo: '',\n          iao: '',\n          ibc: '',\n          iac: '',\n          obo: ' ',\n          oao: '\\n    ',\n          obc: '\\n',\n          oac: ' '\n        },\n        {\n          options: [\n            { name: \"brace_style\", value: \"'collapse'\" }\n          ],\n          ibo: '\\n',\n          iao: '\\n',\n          ibc: '\\n',\n          iac: '\\n',\n          obo: ' ',\n          oao: '\\n    ',\n          obc: '\\n',\n          oac: ' '\n        }\n      ],\n      tests: [{\n          input: 'var a =<ibo>{<iao>a: 2<ibc>}<iac>;\\nvar a =<ibo>{<iao>a: 2<ibc>}<iac>;',\n          output: 'var a =<obo>{<oao>a: 2<obc>};\\nvar a =<obo>{<oao>a: 2<obc>};'\n        },\n        // {\n        //     input: 'var a =<ibo>{<iao>a:<ibo>{<iao>a:<ibo>{<iao>a:2<ibc>}<iac><ibc>}<iac>}<iac>;\\nvar a =<ibo>{<iao>a:<ibo>{<iao>a:<ibo>{<iao>a:2<ibc>}<iac><ibc>}<iac>}<iac>;',\n        //     output: 'var a =<obo>{<oao>a:<obo>{<oao>a:<obo>{<oao>a: 2<obc>}<oac><obc>}<oac><obc>};\\nvar a =<obo>{<oao>a:<obo>{<oao>a:<obo>{<oao>a: 2<obc>}<oac><obc>}<oac><obc>};'\n        // },\n        {\n          input: '//case 1\\nif (a == 1)<ibo>{}\\n//case 2\\nelse if (a == 2)<ibo>{}',\n          output: '//case 1\\nif (a == 1)<obo>{}\\n//case 2\\nelse if (a == 2)<obo>{}'\n        },\n        {\n          input: 'if(1)<ibo>{<iao>2<ibc>}<iac>else<ibo>{<iao>3<ibc>}',\n          output: 'if (1)<obo>{<oao>2<obc>}<oac>else<obo>{<oao>3<obc>}'\n        },\n        {\n          input: 'try<ibo>{<iao>a();<ibc>}<iac>' + 'catch(b)<ibo>{<iao>c();<ibc>}<iac>' + 'catch(d)<ibo>{}<iac>' + 'finally<ibo>{<iao>e();<ibc>}',\n          output:\n            // expected\n            'try<obo>{<oao>a();<obc>}<oac>' + 'catch (b)<obo>{<oao>c();<obc>}<oac>' + 'catch (d)<obo>{}<oac>' + 'finally<obo>{<oao>e();<obc>}'\n        }\n      ]\n    }, {\n      name: \"Comma-first option\",\n      description: \"Put commas at the start of lines instead of the end\",\n      matrix: [{\n        options: [\n          { name: \"comma_first\", value: \"false\" }\n        ],\n        c0: ',\\n',\n        c1: ',\\n    ',\n        c2: ',\\n        ',\n        c3: ',\\n            ',\n        // edge cases where engine bails\n        f1: '    ,\\n    '\n      }, {\n        options: [\n          { name: \"comma_first\", value: \"true\" }\n        ],\n        c0: '\\n, ',\n        c1: '\\n    , ',\n        c2: '\\n        , ',\n        c3: '\\n            , ',\n        // edge cases where engine bails\n        f1: ', '\n      }],\n      tests: [\n        { input: '{a:1, b:2}', output: \"{\\n    a: 1{{c1}}b: 2\\n}\" },\n        { input: 'var a=1, b=c[d], e=6;', output: 'var a = 1{{c1}}b = c[d]{{c1}}e = 6;' },\n        { input: \"for(var a=1,b=2,c=3;d<3;d++)\\ne\", output: \"for (var a = 1, b = 2, c = 3; d < 3; d++)\\n    e\" },\n        { input: \"for(var a=1,b=2,\\nc=3;d<3;d++)\\ne\", output: \"for (var a = 1, b = 2{{c2}}c = 3; d < 3; d++)\\n    e\" },\n        { unchanged: 'function foo() {\\n    return [\\n        \"one\"{{c2}}\"two\"\\n    ];\\n}' },\n        { input: 'a=[[1,2],[4,5],[7,8]]', output: \"a = [\\n    [1, 2]{{c1}}[4, 5]{{c1}}[7, 8]\\n]\" },\n        { input: 'a=[[1,2],[4,5],[7,8],]', output: \"a = [\\n    [1, 2]{{c1}}[4, 5]{{c1}}[7, 8]{{c0}}]\" },\n        {\n          input: 'a=[[1,2],[4,5],function(){},[7,8]]',\n          output: \"a = [\\n    [1, 2]{{c1}}[4, 5]{{c1}}function() {}{{c1}}[7, 8]\\n]\"\n        },\n        {\n          input: 'a=[[1,2],[4,5],function(){},function(){},[7,8]]',\n          output: \"a = [\\n    [1, 2]{{c1}}[4, 5]{{c1}}function() {}{{c1}}function() {}{{c1}}[7, 8]\\n]\"\n        },\n        {\n          input: 'a=[[1,2],[4,5],function(){},[7,8]]',\n          output: \"a = [\\n    [1, 2]{{c1}}[4, 5]{{c1}}function() {}{{c1}}[7, 8]\\n]\"\n        },\n        {\n          input: 'a=[b,c,function(){},function(){},d]',\n          output: \"a = [b, c, function() {}, function() {}, d]\"\n        },\n        {\n          input: 'a=[b,c,\\nfunction(){},function(){},d]',\n          output: \"a = [b, c{{c1}}function() {}{{c1}}function() {}{{c1}}d\\n]\"\n        },\n        { input: 'a=[a[1],b[4],c[d[7]]]', output: \"a = [a[1], b[4], c[d[7]]]\" },\n        { input: '[1,2,[3,4,[5,6],7],8]', output: \"[1, 2, [3, 4, [5, 6], 7], 8]\" },\n\n        {\n          input: '[[[\"1\",\"2\"],[\"3\",\"4\"]],[[\"5\",\"6\",\"7\"],[\"8\",\"9\",\"0\"]],[[\"1\",\"2\",\"3\"],[\"4\",\"5\",\"6\",\"7\"],[\"8\",\"9\",\"0\"]]]',\n          output: '[\\n    [\\n        [\"1\", \"2\"]{{c2}}[\"3\", \"4\"]\\n    ]{{c1}}[\\n        [\"5\", \"6\", \"7\"]{{c2}}[\"8\", \"9\", \"0\"]\\n    ]{{c1}}[\\n        [\"1\", \"2\", \"3\"]{{c2}}[\"4\", \"5\", \"6\", \"7\"]{{c2}}[\"8\", \"9\", \"0\"]\\n    ]\\n]'\n        },\n        {\n          input: [\n            'changeCollection.add({',\n            '    name: \"Jonathan\" // New line inserted after this line on every save',\n            '    , age: 25',\n            '});'\n          ],\n          output: [\n            'changeCollection.add({',\n            '    name: \"Jonathan\" // New line inserted after this line on every save',\n            '    {{f1}}age: 25',\n            '});'\n          ]\n        },\n        {\n          input: [\n            'changeCollection.add(',\n            '    function() {',\n            '        return true;',\n            '    },',\n            '    function() {',\n            '        return true;',\n            '    }',\n            ');'\n          ],\n          output: [\n            'changeCollection.add(',\n            '    function() {',\n            '        return true;',\n            '    }{{c1}}function() {',\n            '        return true;',\n            '    }',\n            ');'\n          ]\n        }\n      ]\n    }, {\n      name: \"Unindent chained functions\",\n      description: \"Don't indent chained functions if unindent_chained_functions is true\",\n      matrix: [{\n        options: [\n          { name: \"unindent_chained_methods\", value: \"true\" }\n        ]\n      }],\n      tests: [{\n          input: [\n            'f().f().f()',\n            '    .f().f();'\n          ],\n          output: [\n            'f().f().f()',\n            '.f().f();'\n          ]\n        },\n        {\n          input: [\n            'f()',\n            '    .f()',\n            '    .f();'\n          ],\n          output: [\n            'f()',\n            '.f()',\n            '.f();'\n          ]\n        },\n        {\n          input: [\n            'f(function() {',\n            '    f()',\n            '        .f()',\n            '        .f();',\n            '});'\n          ],\n          output: [\n            'f(function() {',\n            '    f()',\n            '    .f()',\n            '    .f();',\n            '});'\n          ]\n        },\n        {\n          comment: 'regression test for fix #1378',\n          input: [\n            'f(function() {',\n            '    if(g === 1)',\n            '        g = 0;',\n            '    else',\n            '        g = 1;',\n            '',\n            '    f()',\n            '        .f()',\n            '        .f();',\n            '});'\n          ],\n          output: [\n            'f(function() {',\n            '    if (g === 1)',\n            '        g = 0;',\n            '    else',\n            '        g = 1;',\n            '',\n            '    f()',\n            '    .f()',\n            '    .f();',\n            '});'\n          ]\n        },\n        {\n          comment: 'regression test for fix #1533',\n          unchanged: [\n            'angular.module(\"test\").controller(\"testCtrl\", function($scope) {',\n            '    $scope.tnew;',\n            '    $scope.toggle_tnew = function() {',\n            '        $scope.mode = 0;',\n            '        if (!$scope.tnew) {',\n            '            $scope.tnew = {};',\n            '        } else $scope.tnew = null;',\n            '    }',\n            '    $scope.fn = function() {',\n            '        return null;',\n            '    }',\n            '});'\n          ]\n        }\n      ]\n    }, {\n      name: \"Space in parens tests\",\n      description: \"put space inside parens\",\n      matrix: [{\n        options: [\n          { name: \"space_in_paren\", value: \"false\" },\n          { name: \"space_in_empty_paren\", value: \"false\" }\n        ],\n        s: '',\n        e: ''\n      }, {\n        options: [\n          { name: \"space_in_paren\", value: \"false\" },\n          { name: \"space_in_empty_paren\", value: \"true\" }\n        ],\n        s: '',\n        e: ''\n      }, {\n        options: [\n          { name: \"space_in_paren\", value: \"true\" },\n          { name: \"space_in_empty_paren\", value: \"false\" }\n        ],\n        s: ' ',\n        e: ''\n      }, {\n        options: [\n          { name: \"space_in_paren\", value: \"true\" },\n          { name: \"space_in_empty_paren\", value: \"true\" }\n        ],\n        s: ' ',\n        e: ' '\n      }],\n      tests: [{\n          input: 'if(p) foo(a,b);',\n          output: 'if ({{s}}p{{s}}) foo({{s}}a, b{{s}});'\n        },\n        {\n          input: 'try{while(true){willThrow()}}catch(result)switch(result){case 1:++result }',\n          output: 'try {\\n    while ({{s}}true{{s}}) {\\n        willThrow({{e}})\\n    }\\n} catch ({{s}}result{{s}}) switch ({{s}}result{{s}}) {\\n    case 1:\\n        ++result\\n}'\n        },\n        {\n          input: '((e/((a+(b)*c)-d))^2)*5;',\n          output: '({{s}}({{s}}e / ({{s}}({{s}}a + ({{s}}b{{s}}) * c{{s}}) - d{{s}}){{s}}) ^ 2{{s}}) * 5;'\n        },\n        {\n          input: 'function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}',\n          output: 'function f({{s}}a, b{{s}}) {\\n    if ({{s}}a{{s}}) b({{e}})\\n}\\n\\nfunction g({{s}}a, b{{s}}) {\\n    if ({{s}}!a{{s}}) b({{e}})\\n}'\n        },\n        {\n          input: 'a=[][    ](  );',\n          output: 'a = [{{e}}][{{e}}]({{e}});'\n        },\n        {\n          input: 'a=()(    )[  ];',\n          output: 'a = ({{e}})({{e}})[{{e}}];'\n        },\n        {\n          input: 'a=[b,c,d];',\n          output: 'a = [{{s}}b, c, d{{s}}];'\n        },\n        {\n          input: 'a= f[b];',\n          output: 'a = f[{{s}}b{{s}}];'\n        },\n        {\n          comment: 'Issue #1151 - inside class methods',\n          input: [\n            'export default class Test extends Component {',\n            '    render() {',\n            '        someOther();',\n            '        return null;',\n            '    }',\n            '}'\n          ],\n          output: [\n            'export default class Test extends Component {',\n            '    render({{e}}) {',\n            '        someOther({{e}});',\n            '        return null;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          input: [\n            '{',\n            '    files: a[][ {',\n            '        expand: true,',\n            '        cwd: \"www/gui/\",',\n            '        src: b(c)[ \"im/design_standards/*.*\" ],',\n            '        dest: \"www/gui/build\"',\n            '    } ]',\n            '}'\n          ],\n          output: [\n            '{',\n            '    files: a[{{e}}][{{s}}{',\n            '        expand: true,',\n            '        cwd: \"www/gui/\",',\n            '        src: b({{s}}c{{s}})[{{s}}\"im/design_standards/*.*\"{{s}}],',\n            '        dest: \"www/gui/build\"',\n            '    }{{s}}]',\n            '}'\n          ]\n        }\n      ]\n    },\n    {\n      name: \"general preserve_newlines tests\",\n      template: \"< >\",\n      matrix: [{\n        options: [\n          { name: \"preserve_newlines\", value: \"false\" }\n        ],\n        n0: '',\n        n1: '',\n        sn1: ' ',\n        sn2: ' ',\n        sn3: ' ',\n        _n1: '\\n    '\n\n      }, {\n        options: [\n          { name: \"preserve_newlines\", value: \"true\" }\n        ],\n        n0: '\\n',\n        n1: '\\n    ',\n        sn1: '\\n    ',\n        sn2: '\\n        ',\n        sn3: '\\n            ',\n        _n1: '\\n    '\n      }],\n      tests: [{\n          unchanged: 'if (foo) // comment\\n    bar();'\n        },\n        {\n          unchanged: 'if (foo) // comment\\n    bar();'\n        },\n        {\n          unchanged: 'if (foo) // comment\\n    (bar());'\n        },\n        {\n          unchanged: 'if (foo) // comment\\n    (bar());'\n        },\n        {\n          unchanged: 'if (foo) // comment\\n    /asdf/;'\n        },\n        {\n          input: 'this.oa = new OAuth(\\n' +\n            '    _requestToken,\\n' +\n            '    _accessToken,\\n' +\n            '    consumer_key\\n' +\n            ');',\n          output: 'this.oa = new OAuth(<n1>_requestToken,<sn1>_accessToken,<sn1>consumer_key<n0>);'\n        },\n        {\n          unchanged: 'foo = {\\n    x: y, // #44\\n    w: z // #44\\n}'\n        },\n        {\n          unchanged: 'switch (x) {\\n    case \"a\":\\n        // comment on newline\\n        break;\\n    case \"b\": // comment on same line\\n        break;\\n}'\n        },\n        {\n          input: 'this.type =\\n    this.options =\\n    // comment\\n    this.enabled null;',\n          output: 'this.type =<sn1>this.options =\\n    // comment\\n    this.enabled null;'\n        },\n        {\n          input: 'someObj\\n    .someFunc1()\\n    // This comment should not break the indent\\n    .someFunc2();',\n          output: 'someObj<n1>.someFunc1()\\n    // This comment should not break the indent\\n    .someFunc2();'\n        },\n\n        {\n          input: 'if (true ||\\n!true) return;',\n          output: 'if (true ||<sn1>!true) return;'\n        },\n\n        // this isn't ready yet.\n        // {\n        //    unchanged: 'if (foo) // comment\\n    bar() /*i*/ + baz() /*j\\n*/ + asdf();'\n        // },\n        {\n          input: 'if\\n(foo)\\nif\\n(bar)\\nif\\n(baz)\\nwhee();\\na();',\n          output: 'if (foo)\\n    if (bar)\\n        if (baz)<sn3>whee();\\na();'\n        },\n        {\n          input: 'if\\n(foo)\\nif\\n(bar)\\nif\\n(baz)\\nwhee();\\nelse\\na();',\n          output: 'if (foo)\\n    if (bar)\\n        if (baz)<sn3>whee();\\n        else<sn3>a();'\n        },\n        {\n          input: 'if (foo)\\nbar();\\nelse\\ncar();',\n          output: 'if (foo)<sn1>bar();\\nelse<sn1>car();'\n        },\n\n        {\n          input: 'if (foo) if (bar) if (baz);\\na();',\n          output: 'if (foo)\\n    if (bar)\\n        if (baz);\\na();'\n        },\n        {\n          input: 'if (foo) if (bar) if (baz) whee();\\na();',\n          output: 'if (foo)\\n    if (bar)\\n        if (baz) whee();\\na();'\n        },\n        {\n          input: 'if (foo) a()\\nif (bar) if (baz) whee();\\na();',\n          output: 'if (foo) a()\\nif (bar)\\n    if (baz) whee();\\na();'\n        },\n        {\n          input: 'if (foo);\\nif (bar) if (baz) whee();\\na();',\n          output: 'if (foo);\\nif (bar)\\n    if (baz) whee();\\na();'\n        },\n        {\n          input: 'if (options)\\n' +\n            '    for (var p in options)\\n' +\n            '        this[p] = options[p];',\n          output: 'if (options)\\n' +\n            '    for (var p in options)<sn2>this[p] = options[p];'\n        },\n        {\n          input: 'if (options) for (var p in options) this[p] = options[p];',\n          output: 'if (options)\\n    for (var p in options) this[p] = options[p];'\n        },\n\n        {\n          input: 'if (options) do q(); while (b());',\n          output: 'if (options)\\n    do q(); while (b());'\n        },\n        {\n          input: 'if (options) while (b()) q();',\n          output: 'if (options)\\n    while (b()) q();'\n        },\n        {\n          input: 'if (options) do while (b()) q(); while (a());',\n          output: 'if (options)\\n    do\\n        while (b()) q(); while (a());'\n        },\n\n        {\n          input: 'function f(a, b, c,\\nd, e) {}',\n          output: 'function f(a, b, c,<sn1>d, e) {}'\n        },\n\n        {\n          input: 'function f(a,b) {if(a) b()}function g(a,b) {if(!a) b()}',\n          output: 'function f(a, b) {\\n    if (a) b()\\n}\\n\\nfunction g(a, b) {\\n    if (!a) b()\\n}'\n        },\n        {\n          input: 'function f(a,b) {if(a) b()}\\n\\n\\n\\nfunction g(a,b) {if(!a) b()}',\n          output: 'function f(a, b) {\\n    if (a) b()\\n}\\n\\n<n0><n0>function g(a, b) {\\n    if (!a) b()\\n}'\n        },\n\n        // This is not valid syntax, but still want to behave reasonably and not side-effect\n        {\n          input: '(if(a) b())(if(a) b())',\n          output: '(\\n    if (a) b())(\\n    if (a) b())'\n        },\n        {\n          input: '(if(a) b())\\n\\n\\n(if(a) b())',\n          output: '(\\n    if (a) b())\\n<n0><n0>(\\n    if (a) b())'\n        },\n        {\n          input: 'if\\n(a)\\nb();',\n          output: 'if (a)<sn1>b();'\n        },\n        {\n          input: 'var a =\\nfoo',\n          output: 'var a =<sn1>foo'\n        },\n        {\n          input: 'var a = {\\n\"a\":1,\\n\"b\":2}',\n          output: 'var a = {\\n    \"a\": 1,\\n    \"b\": 2\\n}'\n        },\n        {\n          input: 'var a = {\\n\\\\\\'a\\\\\\':1,\\n\\\\\\'b\\\\\\':2}',\n          output: 'var a = {\\n    \\\\\\'a\\\\\\': 1,\\n    \\\\\\'b\\\\\\': 2\\n}'\n        },\n        {\n          unchanged: 'var a = /*i*/ \"b\";'\n        },\n        {\n          input: 'var a = /*i*/\\n\"b\";',\n          output: 'var a = /*i*/<sn1>\"b\";'\n        },\n        {\n          input: '{\\n\\n\\n\"x\"\\n}',\n          output: '{<n0><n0><_n1>\"x\"\\n}'\n        },\n        {\n          input: 'if(a &&\\nb\\n||\\nc\\n||d\\n&&\\ne) e = f',\n          output: 'if (a &&<sn1>b ||<sn1>c ||<sn1>d &&<sn1>e) e = f'\n        },\n        {\n          input: 'if(a &&\\n(b\\n||\\nc\\n||d)\\n&&\\ne) e = f',\n          output: 'if (a &&<sn1>(b ||<sn2>c ||<sn2>d) &&<sn1>e) e = f'\n        }, {\n          fragment: true,\n          input: '\\n\\n\"x\"',\n          output: '\"x\"'\n        },\n        {\n          fragment: true,\n          input: '{\\n\\n\"x\"\\nh=5;\\n}',\n          output: '{<n0><_n1>\"x\"<_n1>h = 5;\\n}'\n        },\n        {\n          input: 'var a = \"foo\" +\\n    \"bar\";',\n          output: 'var a = \"foo\" +<sn1>\"bar\";'\n        },\n        {\n          input: 'var a = 42; // foo\\n\\nvar b;',\n          output: 'var a = 42; // foo\\n<n0>var b;'\n        },\n        {\n          input: 'var a = 42; // foo\\n\\n\\nvar b;',\n          output: 'var a = 42; // foo\\n<n0><n0>var b;'\n        },\n        {\n          input: 'a = 1;\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nb = 2;',\n          output: 'a = 1;\\n<n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0><n0>b = 2;'\n        }\n      ]\n    }, {\n      name: \"break chained methods\",\n      template: \"< >\",\n      matrix: [{\n        options: [\n          { name: \"break_chained_methods\", value: \"false\" },\n          { name: \"preserve_newlines\", value: \"false\" }\n        ],\n        n0: '',\n        n1: '',\n        pn1: ''\n      }, {\n        options: [\n          { name: \"break_chained_methods\", value: \"false\" },\n          { name: \"preserve_newlines\", value: \"true\" }\n        ],\n        n0: '',\n        n1: '',\n        pn1: '\\n    ',\n        pon1: '\\n    '\n      }, {\n        options: [\n          { name: \"break_chained_methods\", value: \"true\" },\n          { name: \"preserve_newlines\", value: \"false\" }\n        ],\n        n0: '',\n        n1: '\\n    ',\n        pn1: '',\n        pon1: '\\n    '\n      }, {\n        options: [\n          { name: \"break_chained_methods\", value: \"true\" },\n          { name: \"preserve_newlines\", value: \"true\" }\n        ],\n        n0: '\\n',\n        n1: '\\n    ',\n        pn1: '\\n    ',\n        pon1: '\\n    '\n      }],\n      tests: [{\n          input: 'foo\\n.bar()\\n.baz().cucumber(fat)',\n          output: 'foo<pn1>.bar()<pon1>.baz()<n1>.cucumber(fat)'\n        },\n        {\n          input: 'foo\\n.bar()\\n.baz().cucumber(fat); foo.bar().baz().cucumber(fat)',\n          output: 'foo<pn1>.bar()<pon1>.baz()<n1>.cucumber(fat);\\nfoo.bar()<n1>.baz()<n1>.cucumber(fat)'\n        },\n        {\n          input: 'foo\\n.bar()\\n.baz().cucumber(fat)\\n foo.bar().baz().cucumber(fat)',\n          output: 'foo<pn1>.bar()<pon1>.baz()<n1>.cucumber(fat)\\nfoo.bar()<n1>.baz()<n1>.cucumber(fat)'\n        },\n        {\n          input: 'this\\n.something = foo.bar()\\n.baz().cucumber(fat)',\n          output: 'this<pn1>.something = foo.bar()<pon1>.baz()<n1>.cucumber(fat)'\n        },\n        {\n          unchanged: 'this.something.xxx = foo.moo.bar()'\n        },\n        {\n          input: 'this\\n.something\\n.xxx = foo.moo\\n.bar()',\n          output: 'this<pn1>.something<pn1>.xxx = foo.moo<pn1>.bar()'\n        },\n        {\n          comment: 'optional chaining operator',\n          input: 'foo\\n?.bar()\\n?.baz()?.cucumber(fat)',\n          output: 'foo<pn1>?.bar()<pon1>?.baz()<n1>?.cucumber(fat)'\n        },\n        {\n          input: 'foo\\n?.bar()\\n?.baz()?.cucumber(fat); foo?.bar()?.baz()?.cucumber(fat)',\n          output: 'foo<pn1>?.bar()<pon1>?.baz()<n1>?.cucumber(fat);\\nfoo?.bar()<n1>?.baz()<n1>?.cucumber(fat)'\n        },\n        {\n          input: 'foo\\n?.bar()\\n?.baz()?.cucumber(fat)\\n foo?.bar()?.baz()?.cucumber(fat)',\n          output: 'foo<pn1>?.bar()<pon1>?.baz()<n1>?.cucumber(fat)\\nfoo?.bar()<n1>?.baz()<n1>?.cucumber(fat)'\n        },\n        {\n          input: 'this\\n?.something = foo?.bar()\\n?.baz()?.cucumber(fat)',\n          output: 'this<pn1>?.something = foo?.bar()<pon1>?.baz()<n1>?.cucumber(fat)'\n        },\n        {\n          unchanged: 'this?.something?.xxx = foo?.moo?.bar()'\n        },\n        {\n          input: 'this\\n?.something\\n?.xxx = foo?.moo\\n?.bar()',\n          output: 'this<pn1>?.something<pn1>?.xxx = foo?.moo<pn1>?.bar()'\n        }\n      ]\n    }, {\n      name: 'line wrapping 0',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"false\" },\n        { name: \"wrap_line_length\", value: \"0\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap.but_this_can',\n            'return between_return_and_expression_should_never_wrap.but_this_can',\n            'throw between_throw_and_expression_should_never_wrap.but_this_can',\n            'if (wraps_can_occur && inside_an_if_block) that_is_.okay();',\n            'object_literal = {',\n            '    propertx: first_token + 12345678.99999E-6,',\n            '    property: first_token_should_never_wrap + but_this_can,',\n            '    propertz: first_token_should_never_wrap + !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap.but_this_can',\n            '    return between_return_and_expression_should_never_wrap.but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap.but_this_can',\n            '    if (wraps_can_occur && inside_an_if_block) that_is_.okay();',\n            '    object_literal = {',\n            '        propertx: first_token + 12345678.99999E-6,',\n            '        property: first_token_should_never_wrap + but_this_can,',\n            '        propertz: first_token_should_never_wrap + !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 70',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"false\" },\n        { name: \"wrap_line_length\", value: \"70\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap.but_this_can',\n            'return between_return_and_expression_should_never_wrap.but_this_can',\n            'throw between_throw_and_expression_should_never_wrap.but_this_can',\n            'if (wraps_can_occur && inside_an_if_block) that_is_.okay();',\n            'object_literal = {',\n            '    propertx: first_token + 12345678.99999E-6,',\n            '    property: first_token_should_never_wrap + but_this_can,',\n            '    propertz: first_token_should_never_wrap + !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap.but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap.but_this_can',\n            '    if (wraps_can_occur && inside_an_if_block) that_is_.okay();',\n            '    object_literal = {',\n            '        propertx: first_token + 12345678.99999E-6,',\n            '        property: first_token_should_never_wrap + but_this_can,',\n            '        propertz: first_token_should_never_wrap + !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 40',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"false\" },\n        { name: \"wrap_line_length\", value: \"40\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f &&',\n            '    \"sass\") || (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'throw between_throw_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'if (wraps_can_occur &&',\n            '    inside_an_if_block) that_is_.okay();',\n            'object_literal = {',\n            '    propertx: first_token +',\n            '        12345678.99999E-6,',\n            '    property: first_token_should_never_wrap +',\n            '        but_this_can,',\n            '    propertz: first_token_should_never_wrap +',\n            '        !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" +',\n            '        \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1932 - Javascript object property with -/+ symbol wraps issue\",\n          input: [\n            '{',\n            '            \"1234567891234567891234567891234\": -433,',\n            '            \"abcdefghijklmnopqrstuvwxyz12345\": +11',\n            '}'\n          ],\n          output: [\n            '{',\n            '    \"1234567891234567891234567891234\": -433,',\n            '    \"abcdefghijklmnopqrstuvwxyz12345\": +11',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f &&',\n            '        \"sass\") || (leans &&',\n            '        mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    if (wraps_can_occur &&',\n            '        inside_an_if_block) that_is_',\n            '        .okay();',\n            '    object_literal = {',\n            '        propertx: first_token +',\n            '            12345678.99999E-6,',\n            '        property: first_token_should_never_wrap +',\n            '            but_this_can,',\n            '        propertz: first_token_should_never_wrap +',\n            '            !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" +',\n            '            \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 41',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"false\" },\n        { name: \"wrap_line_length\", value: \"41\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") ||',\n            '    (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'throw between_throw_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'if (wraps_can_occur &&',\n            '    inside_an_if_block) that_is_.okay();',\n            'object_literal = {',\n            '    propertx: first_token +',\n            '        12345678.99999E-6,',\n            '    property: first_token_should_never_wrap +',\n            '        but_this_can,',\n            '    propertz: first_token_should_never_wrap +',\n            '        !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" +',\n            '        \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f &&',\n            '        \"sass\") || (leans &&',\n            '        mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    if (wraps_can_occur &&',\n            '        inside_an_if_block) that_is_',\n            '        .okay();',\n            '    object_literal = {',\n            '        propertx: first_token +',\n            '            12345678.99999E-6,',\n            '        property: first_token_should_never_wrap +',\n            '            but_this_can,',\n            '        propertz: first_token_should_never_wrap +',\n            '            !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" +',\n            '            \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 45',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"false\" },\n        { name: \"wrap_line_length\", value: \"45\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") || (',\n            '    leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'throw between_throw_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'if (wraps_can_occur && inside_an_if_block)',\n            '    that_is_.okay();',\n            'object_literal = {',\n            '    propertx: first_token +',\n            '        12345678.99999E-6,',\n            '    property: first_token_should_never_wrap +',\n            '        but_this_can,',\n            '    propertz: first_token_should_never_wrap +',\n            '        !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" +',\n            '        \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f && \"sass\") ||',\n            '        (leans && mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    if (wraps_can_occur &&',\n            '        inside_an_if_block) that_is_.okay();',\n            '    object_literal = {',\n            '        propertx: first_token +',\n            '            12345678.99999E-6,',\n            '        property: first_token_should_never_wrap +',\n            '            but_this_can,',\n            '        propertz: first_token_should_never_wrap +',\n            '            !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" +',\n            '            \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 0',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"wrap_line_length\", value: \"0\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap.but_this_can',\n            'throw between_throw_and_expression_should_never_wrap.but_this_can',\n            'if (wraps_can_occur && inside_an_if_block) that_is_',\n            '    .okay();',\n            'object_literal = {',\n            '    propertx: first_token + 12345678.99999E-6,',\n            '    property: first_token_should_never_wrap + but_this_can,',\n            '    propertz: first_token_should_never_wrap + !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap.but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap.but_this_can',\n            '    if (wraps_can_occur && inside_an_if_block) that_is_',\n            '        .okay();',\n            '    object_literal = {',\n            '        propertx: first_token + 12345678.99999E-6,',\n            '        property: first_token_should_never_wrap + but_this_can,',\n            '        propertz: first_token_should_never_wrap + !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 70',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"wrap_line_length\", value: \"70\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap.but_this_can',\n            'throw between_throw_and_expression_should_never_wrap.but_this_can',\n            'if (wraps_can_occur && inside_an_if_block) that_is_',\n            '    .okay();',\n            'object_literal = {',\n            '    propertx: first_token + 12345678.99999E-6,',\n            '    property: first_token_should_never_wrap + but_this_can,',\n            '    propertz: first_token_should_never_wrap + !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f && \"sass\") || (leans && mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap.but_this_can',\n            '    if (wraps_can_occur && inside_an_if_block) that_is_',\n            '        .okay();',\n            '    object_literal = {',\n            '        propertx: first_token + 12345678.99999E-6,',\n            '        property: first_token_should_never_wrap + but_this_can,',\n            '        propertz: first_token_should_never_wrap + !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" + \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 40',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"wrap_line_length\", value: \"40\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f &&',\n            '    \"sass\") || (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'throw between_throw_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'if (wraps_can_occur &&',\n            '    inside_an_if_block) that_is_',\n            '    .okay();',\n            'object_literal = {',\n            '    propertx: first_token +',\n            '        12345678.99999E-6,',\n            '    property: first_token_should_never_wrap +',\n            '        but_this_can,',\n            '    propertz: first_token_should_never_wrap +',\n            '        !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" +',\n            '        \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f &&',\n            '        \"sass\") || (leans &&',\n            '        mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    if (wraps_can_occur &&',\n            '        inside_an_if_block) that_is_',\n            '        .okay();',\n            '    object_literal = {',\n            '        propertx: first_token +',\n            '            12345678.99999E-6,',\n            '        property: first_token_should_never_wrap +',\n            '            but_this_can,',\n            '        propertz: first_token_should_never_wrap +',\n            '            !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" +',\n            '            \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 41',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"wrap_line_length\", value: \"41\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") ||',\n            '    (leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'throw between_throw_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'if (wraps_can_occur &&',\n            '    inside_an_if_block) that_is_',\n            '    .okay();',\n            'object_literal = {',\n            '    propertx: first_token +',\n            '        12345678.99999E-6,',\n            '    property: first_token_should_never_wrap +',\n            '        but_this_can,',\n            '    propertz: first_token_should_never_wrap +',\n            '        !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" +',\n            '        \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f &&',\n            '        \"sass\") || (leans &&',\n            '        mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    if (wraps_can_occur &&',\n            '        inside_an_if_block) that_is_',\n            '        .okay();',\n            '    object_literal = {',\n            '        propertx: first_token +',\n            '            12345678.99999E-6,',\n            '        property: first_token_should_never_wrap +',\n            '            but_this_can,',\n            '        propertz: first_token_should_never_wrap +',\n            '            !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" +',\n            '            \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: 'line wrapping 45',\n      description: \"\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"wrap_line_length\", value: \"45\" }\n      ],\n      tests: [{\n          fragment: true,\n          input: '\\' + wrap_input_1 + \\'',\n          output: [\n            'foo.bar().baz().cucumber((f && \"sass\") || (',\n            '    leans && mean));',\n            'Test_very_long_variable_name_this_should_never_wrap',\n            '    .but_this_can',\n            'return between_return_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'throw between_throw_and_expression_should_never_wrap',\n            '    .but_this_can',\n            'if (wraps_can_occur && inside_an_if_block)',\n            '    that_is_',\n            '    .okay();',\n            'object_literal = {',\n            '    propertx: first_token +',\n            '        12345678.99999E-6,',\n            '    property: first_token_should_never_wrap +',\n            '        but_this_can,',\n            '    propertz: first_token_should_never_wrap +',\n            '        !but_this_can,',\n            '    proper: \"first_token_should_never_wrap\" +',\n            '        \"but_this_can\"',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: '\\' + wrap_input_2 + \\'',\n          output: [\n            '{',\n            '    foo.bar().baz().cucumber((f && \"sass\") ||',\n            '        (leans && mean));',\n            '    Test_very_long_variable_name_this_should_never_wrap',\n            '        .but_this_can',\n            '    return between_return_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    throw between_throw_and_expression_should_never_wrap',\n            '        .but_this_can',\n            '    if (wraps_can_occur &&',\n            '        inside_an_if_block) that_is_',\n            '        .okay();',\n            '    object_literal = {',\n            '        propertx: first_token +',\n            '            12345678.99999E-6,',\n            '        property: first_token_should_never_wrap +',\n            '            but_this_can,',\n            '        propertz: first_token_should_never_wrap +',\n            '            !but_this_can,',\n            '        proper: \"first_token_should_never_wrap\" +',\n            '            \"but_this_can\"',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"general preserve_newlines tests preserve limit\",\n      template: \"< >\",\n      options: [\n        { name: \"preserve_newlines\", value: \"true\" },\n        { name: \"max_preserve_newlines\", value: \"8\" }\n      ],\n      tests: [{\n        input: 'a = 1;\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nb = 2;',\n        output: 'a = 1;\\n\\n\\n\\n\\n\\n\\n\\nb = 2;'\n      }]\n    }, {\n      name: \"more random test\",\n      tests: [{\n          unchanged: 'return function();'\n        },\n        {\n          unchanged: 'var a = function();'\n        },\n        {\n          unchanged: 'var a = 5 + function();'\n        },\n        {\n          comment: 'actionscript import',\n          unchanged: 'import foo.*;'\n        },\n        {\n          comment: 'actionscript',\n          unchanged: 'function f(a: a, b: b)'\n        },\n        {\n          input: 'function a(a) {} function b(b) {} function c(c) {}',\n          output: 'function a(a) {}\\n\\nfunction b(b) {}\\n\\nfunction c(c) {}'\n        },\n        {\n          unchanged: 'foo(a, function() {})'\n        },\n        {\n          unchanged: 'foo(a, /regex/)'\n        },\n        {\n          unchanged: '/* foo */\\n\"x\"'\n        },\n        {\n          fragment: true,\n          unchanged: 'roo = {\\n    /*\\n    ****\\n      FOO\\n    ****\\n    */\\n    BAR: 0\\n};'\n        },\n        {\n          fragment: true,\n          unchanged: 'if (zz) {\\n    // ....\\n}\\n(function'\n        },\n        {\n          unchanged: 'a = //comment\\n    /regex/;'\n        },\n        {\n          unchanged: 'var a = new function();'\n        },\n        {\n          unchanged: 'new function'\n        },\n        {\n          input: 'if (a)\\n{\\nb;\\n}\\nelse\\n{\\nc;\\n}',\n          output: 'if (a) {\\n    b;\\n} else {\\n    c;\\n}'\n        },\n        {\n          unchanged: 'fn`tagged`'\n        },\n        {\n          unchanged: 'fn()`tagged`'\n        },\n        {\n          unchanged: 'fn`${algo} ${`6string`}`'\n        },\n        {\n          unchanged: 'fn`${fn2()} more text ${`${`more text`}`} banana ${fn3`test`} ${fn4()`moretest banana2`}`'\n        },\n        {\n          input: '`untagged`+`untagged`',\n          output: '`untagged` + `untagged`'\n        },\n        {\n          unchanged: \"fun() `taggedd`\"\n        },\n        {\n          input: 'fn[0]`tagged`',\n          output: 'fn[0] `tagged`'\n        }\n      ]\n    }, {\n      name: \"operator_position option - ensure no newlines if preserve_newlines is false\",\n      matrix: [{\n        options: [\n          // test for default\n          // { name: \"operator_position\", value: \"'before-newline'\" },\n          { name: \"preserve_newlines\", value: \"false\" }\n        ]\n      }, {\n        options: [\n          { name: \"operator_position\", value: \"'before-newline'\" },\n          { name: \"preserve_newlines\", value: \"false\" }\n        ]\n      }, {\n        options: [\n          { name: \"operator_position\", value: \"'after-newline'\" },\n          { name: \"preserve_newlines\", value: \"false\" }\n        ]\n      }, {\n        options: [\n          { name: \"operator_position\", value: \"'preserve-newline'\" },\n          { name: \"preserve_newlines\", value: \"false\" }\n        ]\n      }],\n      tests: [{\n        unchanged: inputlib.operator_position.sanity\n      }, {\n        input: inputlib.operator_position.comprehensive,\n        output: inputlib.operator_position.sanity\n      }]\n    }, {\n      name: 'operator_position option - set to \"before-newline\" (default value)',\n      matrix: [{\n        options: [\n          // test for default\n          // { name: \"operator_position\", value: \"'before-newline'\" }\n        ]\n      }, {\n        options: [\n          { name: \"operator_position\", value: \"'before-newline'\" }\n        ]\n      }],\n      tests: [{\n        comment: 'comprehensive, various newlines',\n        input: inputlib.operator_position.comprehensive,\n        output: [\n          'var res = a + b -',\n          '    c /',\n          '    d * e %',\n          '    f;',\n          'var res = g & h |',\n          '    i ^',\n          '    j |>',\n          '    console.log;',\n          'var res = (k &&',\n          '        l ||',\n          '        m) ?',\n          '    n ??',\n          '    nn :',\n          '    o;',\n          'var res = p >>',\n          '    q <<',\n          '    r >>>',\n          '    s;',\n          'var res = t',\n          '',\n          '    ===',\n          '    u !== v !=',\n          '    w ==',\n          '    x >=',\n          '    y <= z > aa <',\n          '    ab;',\n          'res ??= a;',\n          'res ||= b;',\n          'res &&= c;',\n          'ac +',\n          '    -ad'\n        ]\n      }, {\n        comment: 'colon special case',\n        input: inputlib.operator_position.colon_special_case,\n        output: [\n          'var a = {',\n          '    b: bval,',\n          '    c: cval,',\n          '    d: dval',\n          '};',\n          'var e = f ? g :',\n          '    h;',\n          'var i = j ? k :',\n          '    l;'\n        ]\n      }, {\n        comment: 'catch-all, includes brackets and other various code',\n        input: inputlib.operator_position.catch_all,\n        output: [\n          'var d = 1;',\n          'if (a === b &&',\n          '    c) {',\n          '    d = (c * everything /',\n          '            something_else) %',\n          '        b;',\n          '    e',\n          '        += d;',\n          '',\n          '} else if (!(complex && simple) ||',\n          '    (emotion && emotion.name === \"happy\")) {',\n          '    cryTearsOfJoy(many ||',\n          '        anOcean ||',\n          '        aRiver);',\n          '}'\n        ]\n      }]\n    }, {\n      name: 'operator_position option - set to \"after_newline\"',\n      options: [{\n        name: \"operator_position\",\n        value: \"'after-newline'\"\n      }],\n      tests: [{\n        comment: 'comprehensive, various newlines',\n        input: inputlib.operator_position.comprehensive,\n        output: [\n          'var res = a + b',\n          '    - c',\n          '    / d * e',\n          '    % f;',\n          'var res = g & h',\n          '    | i',\n          '    ^ j',\n          '    |> console.log;',\n          'var res = (k',\n          '        && l',\n          '        || m)',\n          '    ? n',\n          '    ?? nn',\n          '    : o;',\n          'var res = p',\n          '    >> q',\n          '    << r',\n          '    >>> s;',\n          'var res = t',\n          '',\n          '    === u !== v',\n          '    != w',\n          '    == x',\n          '    >= y <= z > aa',\n          '    < ab;',\n          'res ??= a;',\n          'res ||= b;',\n          'res &&= c;',\n          'ac',\n          '    + -ad'\n        ]\n      }, {\n        comment: 'colon special case',\n        input: inputlib.operator_position.colon_special_case,\n        output: [\n          'var a = {',\n          '    b: bval,',\n          '    c: cval,',\n          '    d: dval',\n          '};',\n          'var e = f ? g',\n          '    : h;',\n          'var i = j ? k',\n          '    : l;'\n        ]\n      }, {\n        comment: 'catch-all, includes brackets and other various code',\n        input: inputlib.operator_position.catch_all,\n        output: [\n          'var d = 1;',\n          'if (a === b',\n          '    && c) {',\n          '    d = (c * everything',\n          '            / something_else)',\n          '        % b;',\n          '    e',\n          '        += d;',\n          '',\n          '} else if (!(complex && simple)',\n          '    || (emotion && emotion.name === \"happy\")) {',\n          '    cryTearsOfJoy(many',\n          '        || anOcean',\n          '        || aRiver);',\n          '}'\n        ]\n      }]\n    }, {\n      name: 'operator_position option - set to \"preserve-newline\"',\n      options: [{\n        name: \"operator_position\",\n        value: \"'preserve-newline'\"\n      }],\n      tests: [{\n        comment: 'comprehensive, various newlines',\n        input: inputlib.operator_position.comprehensive,\n        output: [\n          'var res = a + b',\n          '    - c /',\n          '    d * e',\n          '    %',\n          '    f;',\n          'var res = g & h',\n          '    | i ^',\n          '    j',\n          '    |> console.log;',\n          'var res = (k &&',\n          '        l',\n          '        || m) ?',\n          '    n',\n          '    ?? nn',\n          '    : o;',\n          'var res = p',\n          '    >> q <<',\n          '    r',\n          '    >>> s;',\n          'var res = t',\n          '',\n          '    === u !== v',\n          '    !=',\n          '    w',\n          '    == x >=',\n          '    y <= z > aa <',\n          '    ab;',\n          'res ??= a;',\n          'res ||= b;',\n          'res &&= c;',\n          'ac +',\n          '    -ad'\n        ]\n      }, {\n        comment: 'colon special case',\n        input: inputlib.operator_position.colon_special_case,\n        output: [\n          'var a = {',\n          '    b: bval,',\n          '    c: cval,',\n          '    d: dval',\n          '};',\n          'var e = f ? g',\n          '    : h;',\n          'var i = j ? k :',\n          '    l;'\n        ]\n      }, {\n        comment: 'catch-all, includes brackets and other various code',\n        unchanged: inputlib.operator_position.catch_all\n      }]\n    }, {\n      name: \"Yield tests\",\n      description: \"ES6 yield tests\",\n      tests: [\n        { unchanged: 'yield /foo\\\\\\\\//;' },\n        { unchanged: 'result = yield pgClient.query_(queryString);' },\n        { unchanged: 'yield [1, 2]' },\n        { unchanged: 'yield function() {};' },\n        { unchanged: \"yield* bar();\" },\n        {\n          comment: \"yield should have no space between yield and star\",\n          input: \"yield * bar();\",\n          output: \"yield* bar();\"\n        },\n        {\n          comment: \"yield should have space between star and generator\",\n          input: \"yield *bar();\",\n          output: \"yield* bar();\"\n        }\n      ]\n    }, {\n      name: \"Async / await tests\",\n      description: \"ES7 async / await tests\",\n      tests: [\n        { unchanged: \"async function foo() {}\" },\n        { unchanged: \"let w = async function foo() {}\" },\n        { unchanged: \"async function foo() {}\\nvar x = await foo();\" },\n        {\n          comment: \"async function as an input to another function\",\n          unchanged: \"wrapper(async function foo() {})\"\n        },\n        {\n          comment: \"await on inline anonymous function. should have a space after await\",\n          input_: \"async function() {\\n    var w = await(async function() {\\n        return await foo();\\n    })();\\n}\",\n          output: \"async function() {\\n    var w = await (async function() {\\n        return await foo();\\n    })();\\n}\"\n        },\n        {\n          comment: \"Regression test #1228\",\n          unchanged: 'const module = await import(\"...\")'\n        },\n        {\n          comment: \"Regression test #1658\",\n          unchanged: '.'\n        },\n        {\n          comment: \"ensure that this doesn't break anyone with the async library\",\n          unchanged: \"async.map(function(t) {})\"\n        },\n        {\n          comment: \"async on arrow function. should have a space after async\",\n          input_: \"async() => {}\",\n          output: \"async () => {}\"\n        },\n        {\n          comment: \"async on arrow function. should have a space after async\",\n          input_: \"async() => {\\n    return 5;\\n}\",\n          output: \"async () => {\\n    return 5;\\n}\"\n        },\n        {\n          comment: \"async on arrow function returning expression. should have a space after async\",\n          input_: \"async() => 5;\",\n          output: \"async () => 5;\"\n        },\n        {\n          comment: \"async on arrow function returning object literal. should have a space after async\",\n          input_: \"async(x) => ({\\n    foo: \\\"5\\\"\\n})\",\n          output: \"async (x) => ({\\n    foo: \\\"5\\\"\\n})\"\n        },\n        {\n          unchanged: \"async (x) => {\\n    return x * 2;\\n}\"\n        },\n        {\n          unchanged: \"async () => 5;\"\n        },\n        {\n          unchanged: \"async x => x * 2;\"\n        },\n        {\n          unchanged: [\n            'async function() {',\n            '    const obj = {',\n            '        a: 1,',\n            '        b: await fn(),',\n            '        c: 2',\n            '    };',\n            '}'\n          ]\n        },\n        {\n          unchanged: [\n            'const a = 1,',\n            '    b = a ? await foo() : b,',\n            '    c = await foo(),',\n            '    d = 3,',\n            '    e = (await foo()),',\n            '    f = 4;'\n          ]\n        },\n        {\n          unchanged: [\n            'a = {',\n            '    myVar: async function() {',\n            '        return a;',\n            '    },',\n            '    myOtherVar: async function() {',\n            '        yield b;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          unchanged: [\n            'a = {',\n            '    myVar: async () => {',\n            '        return a;',\n            '    },',\n            '    myOtherVar: async async () => {',\n            '        yield b;',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"e4x - Test that e4x literals passed through when e4x-option is enabled\",\n      description: \"\",\n      options: [\n        { name: 'e4x', value: true }\n      ],\n      tests: [\n        { input: 'xml=<a b=\"c\"><d/><e>\\n foo</e>x</a>;', output: 'xml = <a b=\"c\"><d/><e>\\n foo</e>x</a>;' },\n        { unchanged: '<a b=\\\\\\'This is a quoted \"c\".\\\\\\'/>' },\n        { unchanged: '<a b=\"This is a quoted \\\\\\'c\\\\\\'.\"/>' },\n        { unchanged: '<a b=\"A quote \\\\\\' inside string.\"/>' },\n        { unchanged: '<a b=\\\\\\'A quote \" inside string.\\\\\\'/>' },\n        { unchanged: '<a b=\\\\\\'Some \"\"\" quotes \"\"  inside string.\\\\\\'/>' },\n\n        {\n          comment: 'Handles inline expressions',\n          input: 'xml=<{a} b=\"c\"><d/><e v={z}>\\n foo</e>x</{a}>;',\n          output: 'xml = <{a} b=\"c\"><d/><e v={z}>\\n foo</e>x</{a}>;'\n        },\n        {\n          input: 'xml=<{a} b=\"c\">\\n    <e v={z}>\\n foo</e>x</{a}>;',\n          output: 'xml = <{a} b=\"c\">\\n    <e v={z}>\\n foo</e>x</{a}>;'\n        },\n        {\n          comment: 'xml literals with special characters in elem names - see http://www.w3.org/TR/REC-xml/#NT-NameChar',\n          unchanged: 'xml = <_:.valid.xml- _:.valid.xml-=\"123\"/>;'\n        },\n        {\n          comment: 'xml literals with attributes without equal sign',\n          unchanged: 'xml = <elem someAttr/>;'\n        },\n\n        {\n          comment: 'Handles CDATA',\n          input: 'xml=<![CDATA[ b=\"c\"><d/><e v={z}>\\n foo</e>x/]]>;',\n          output: 'xml = <![CDATA[ b=\"c\"><d/><e v={z}>\\n foo</e>x/]]>;'\n        },\n        { input: 'xml=<![CDATA[]]>;', output: 'xml = <![CDATA[]]>;' },\n        { input: 'xml=<a b=\"c\"><![CDATA[d/></a></{}]]></a>;', output: 'xml = <a b=\"c\"><![CDATA[d/></a></{}]]></a>;' },\n\n        {\n          comment: 'JSX - working jsx from http://prettydiff.com/unit_tests/beautification_javascript_jsx.txt',\n          unchanged: [\n            'var ListItem = React.createClass({',\n            '    render: function() {',\n            '        return (',\n            '            <li className=\"ListItem\">',\n            '                <a href={ \"/items/\" + this.props.item.id }>',\n            '                    this.props.item.name',\n            '                </a>',\n            '            </li>',\n            '        );',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            'var List = React.createClass({',\n            '    renderList: function() {',\n            '        return this.props.items.map(function(item) {',\n            '            return <ListItem item={item} key={item.id} />;',\n            '        });',\n            '    },',\n            '',\n            '    render: function() {',\n            '        return <ul className=\"List\">',\n            '                this.renderList()',\n            '            </ul>',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            'var Mist = React.createClass({',\n            '    renderList: function() {',\n            '        return this.props.items.map(function(item) {',\n            '            return <ListItem item={return <tag>{item}</tag>} key={item.id} />;',\n            '        });',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            '// JSX',\n            'var box = <Box>',\n            '    {shouldShowAnswer(user) ?',\n            '        <Answer value={false}>no</Answer> : <Box.Comment>',\n            '        Text Content',\n            '        </Box.Comment>}',\n            '    </Box>;',\n            'var a = function() {',\n            '    return <tsdf>asdf</tsdf>;',\n            '};',\n            '',\n            'var HelloMessage = React.createClass({',\n            '    render: function() {',\n            '        return <div {someAttr}>Hello {this.props.name}</div>;',\n            '    }',\n            '});',\n            'React.render(<HelloMessage name=\"John\" />, mountNode);'\n          ]\n        },\n        {\n          unchanged: [\n            'var Timer = React.createClass({',\n            '    getInitialState: function() {',\n            '        return {',\n            '            secondsElapsed: 0',\n            '        };',\n            '    },',\n            '    tick: function() {',\n            '        this.setState({',\n            '            secondsElapsed: this.state.secondsElapsed + 1',\n            '        });',\n            '    },',\n            '    componentDidMount: function() {',\n            '        this.interval = setInterval(this.tick, 1000);',\n            '    },',\n            '    componentWillUnmount: function() {',\n            '        clearInterval(this.interval);',\n            '    },',\n            '    render: function() {',\n            '        return (',\n            '            <div>Seconds Elapsed: {this.state.secondsElapsed}</div>',\n            '        );',\n            '    }',\n            '});',\n            'React.render(<Timer />, mountNode);'\n          ]\n        },\n        {\n          unchanged: [\n            'var TodoList = React.createClass({',\n            '    render: function() {',\n            '        var createItem = function(itemText) {',\n            '            return <li>{itemText}</li>;',\n            '        };',\n            '        return <ul>{this.props.items.map(createItem)}</ul>;',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            'var TodoApp = React.createClass({',\n            '    getInitialState: function() {',\n            '        return {',\n            '            items: [],',\n            '            text: \\\\\\'\\\\\\'',\n            '        };',\n            '    },',\n            '    onChange: function(e) {',\n            '        this.setState({',\n            '            text: e.target.value',\n            '        });',\n            '    },',\n            '    handleSubmit: function(e) {',\n            '        e.preventDefault();',\n            '        var nextItems = this.state.items.concat([this.state.text]);',\n            '        var nextText = \\\\\\'\\\\\\';',\n            '        this.setState({',\n            '            items: nextItems,',\n            '            text: nextText',\n            '        });',\n            '    },',\n            '    render: function() {',\n            '        return (',\n            '            <div>',\n            '                <h3 {someAttr}>TODO</h3>',\n            '                <TodoList items={this.state.items} />',\n            '                <form onSubmit={this.handleSubmit}>',\n            '                    <input onChange={this.onChange} value={this.state.text} />',\n            '                    <button>{\\\\\\'Add #\\\\\\' + (this.state.items.length + 1)}</button>',\n            '                </form>',\n            '            </div>',\n            '        );',\n            '    }',\n            '});',\n            'React.render(<TodoApp />, mountNode);'\n          ]\n        },\n        {\n          input: [\n            'var converter = new Showdown.converter();',\n            'var MarkdownEditor = React.createClass({',\n            '    getInitialState: function() {',\n            '        return {value: \\\\\\'Type some *markdown* here!\\\\\\'};',\n            '    },',\n            '    handleChange: function() {',\n            '        this.setState({value: this.refs.textarea.getDOMNode().value});',\n            '    },',\n            '    render: function() {',\n            '        return (',\n            '            <div className=\"MarkdownEditor\">',\n            '                <h3>Input</h3>',\n            '                <textarea',\n            '                    onChange={this.handleChange}',\n            '                    ref=\"textarea\"',\n            '                    defaultValue={this.state.value} />',\n            '                <h3>Output</h3>',\n            '            <div',\n            '                className=\"content\"',\n            '                dangerouslySetInnerHTML={{',\n            '                        __html: converter.makeHtml(this.state.value)',\n            '                    }}',\n            '                />',\n            '            </div>',\n            '        );',\n            '    }',\n            '});',\n            'React.render(<MarkdownEditor />, mountNode);'\n\n          ],\n          output: [\n            'var converter = new Showdown.converter();',\n            'var MarkdownEditor = React.createClass({',\n            '    getInitialState: function() {',\n            '        return {',\n            '            value: \\\\\\'Type some *markdown* here!\\\\\\'',\n            '        };',\n            '    },',\n            '    handleChange: function() {',\n            '        this.setState({',\n            '            value: this.refs.textarea.getDOMNode().value',\n            '        });',\n            '    },',\n            '    render: function() {',\n            '        return (',\n            '            <div className=\"MarkdownEditor\">',\n            '                <h3>Input</h3>',\n            '                <textarea',\n            '                    onChange={this.handleChange}',\n            '                    ref=\"textarea\"',\n            '                    defaultValue={this.state.value} />',\n            '                <h3>Output</h3>',\n            '            <div',\n            '                className=\"content\"',\n            '                dangerouslySetInnerHTML={{',\n            '                        __html: converter.makeHtml(this.state.value)',\n            '                    }}',\n            '                />',\n            '            </div>',\n            '        );',\n            '    }',\n            '});',\n            'React.render(<MarkdownEditor />, mountNode);'\n          ]\n        },\n        {\n          comment: 'JSX - Not quite correct jsx formatting that still works',\n          input: [\n            'var content = (',\n            '        <Nav>',\n            '            {/* child comment, put {} around */}',\n            '            <Person',\n            '                /* multi',\n            '         line',\n            '         comment */',\n            '         //attr=\"test\"',\n            '                name={window.isLoggedIn ? window.name : \\\\\\'\\\\\\'} // end of line comment',\n            '            />',\n            '        </Nav>',\n            '    );',\n            'var qwer = <DropDown> A dropdown list <Menu> <MenuItem>Do Something</MenuItem> <MenuItem>Do Something Fun!</MenuItem> <MenuItem>Do Something Else</MenuItem> </Menu> </DropDown>;',\n            'render(dropdown);'\n          ],\n          output: [\n            'var content = (',\n            '    <Nav>',\n            '            {/* child comment, put {} around */}',\n            '            <Person',\n            '                /* multi',\n            '         line',\n            '         comment */',\n            '         //attr=\"test\"',\n            '                name={window.isLoggedIn ? window.name : \\\\\\'\\\\\\'} // end of line comment',\n            '            />',\n            '        </Nav>',\n            ');',\n            'var qwer = <DropDown> A dropdown list <Menu> <MenuItem>Do Something</MenuItem> <MenuItem>Do Something Fun!</MenuItem> <MenuItem>Do Something Else</MenuItem> </Menu> </DropDown>;',\n            'render(dropdown);'\n          ]\n        },\n        {\n          comment: [\n            \"Handles messed up tags, as long as it isn't the same name\",\n            \"as the root tag. Also handles tags of same name as root tag\",\n            \"as long as nesting matches.\"\n          ],\n          input_: 'xml=<a x=\"jn\"><c></b></f><a><d jnj=\"jnn\"><f></a ></nj></a>;',\n          output: 'xml = <a x=\"jn\"><c></b></f><a><d jnj=\"jnn\"><f></a ></nj></a>;'\n        },\n\n        {\n          comment: [\n            \"If xml is not terminated, the remainder of the file is treated\",\n            \"as part of the xml-literal (passed through unaltered)\"\n          ],\n          fragment: true,\n          input_: 'xml=<a></b>\\nc<b;',\n          output: 'xml = <a></b>\\nc<b;'\n        },\n        {\n          comment: 'Issue #646 = whitespace is allowed in attribute declarations',\n          unchanged: [\n            'let a = React.createClass({',\n            '    render() {',\n            '        return (',\n            '            <p className=\\\\\\'a\\\\\\'>',\n            '                <span>c</span>',\n            '            </p>',\n            '        );',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            'let a = React.createClass({',\n            '    render() {',\n            '        return (',\n            '            <p className = \\\\\\'b\\\\\\'>',\n            '                <span>c</span>',\n            '            </p>',\n            '        );',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            'let a = React.createClass({',\n            '    render() {',\n            '        return (',\n            '            <p className = \"c\">',\n            '                <span>c</span>',\n            '            </p>',\n            '        );',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            'let a = React.createClass({',\n            '    render() {',\n            '        return (',\n            '            <{e}  className = {d}>',\n            '                <span>c</span>',\n            '            </{e}>',\n            '        );',\n            '    }',\n            '});'\n          ]\n        },\n        {\n          comment: 'Issue #914 - Multiline attribute in root tag',\n          unchanged: [\n            'return (',\n            '    <a href=\"#\"',\n            '        onClick={e => {',\n            '            e.preventDefault()',\n            '            onClick()',\n            '       }}>',\n            '       {children}',\n            '    </a>',\n            ');'\n          ]\n        },\n        {\n          unchanged: [\n            'return (',\n            '    <{',\n            '        a + b',\n            '    } href=\"#\"',\n            '        onClick={e => {',\n            '            e.preventDefault()',\n            '            onClick()',\n            '       }}>',\n            '       {children}',\n            '    </{',\n            '        a + b',\n            '    }>',\n            ');'\n          ]\n        },\n        {\n          input: [\n            'return (',\n            '    <{',\n            '        a + b',\n            '    } href=\"#\"',\n            '        onClick={e => {',\n            '            e.preventDefault()',\n            '            onClick()',\n            '       }}>',\n            '       {children}',\n            '    </{a + b}>',\n            '    );'\n          ],\n          output: [\n            'return (',\n            '    <{',\n            '        a + b',\n            '    } href=\"#\"',\n            '        onClick={e => {',\n            '            e.preventDefault()',\n            '            onClick()',\n            '       }}>',\n            '       {children}',\n            '    </{a + b}>',\n            ');'\n          ]\n        },\n        {\n          unchanged: [\n            'class Columns extends React.Component {',\n            '    render() {',\n            '        return (',\n            '            <>',\n            '              <td>Hello</td>',\n            '              <td>World</td>',\n            '            </>',\n            '        );',\n            '    }',\n            '}'\n          ]\n        }\n      ]\n    },\n    {\n      comment: 'Issue #1334 - Fix incorrect XML detection',\n      unchanged: [\n        'if (c++ < 100) {',\n        '    //',\n        '}',\n        '',\n        '\"<div>\" +',\n        '\"</div>\";'\n      ]\n    }, {\n      name: \"e4x disabled\",\n      description: \"\",\n      options: [\n        { name: 'e4x', value: false }\n      ],\n      tests: [{\n        input_: 'xml=<a b=\"c\"><d/><e>\\n foo</e>x</a>;',\n        output: 'xml = < a b = \"c\" > < d / > < e >\\n    foo < /e>x</a > ;'\n      }]\n    }, {\n      name: \"Multiple braces\",\n      description: \"\",\n      template: \"^^^ $$$\",\n      options: [],\n      tests: [\n        { input: '{{}/z/}', output: '{\\n    {}\\n    /z/\\n}' }\n      ]\n    }, {\n      name: \"Space before conditional\",\n      description: \"\",\n      matrix: [{\n        options: [\n          { name: \"space_before_conditional\", value: \"false\" }\n        ],\n        s: ''\n      }, {\n        options: [\n          { name: \"space_before_conditional\", value: \"true\" }\n        ],\n        s: ' '\n      }],\n      tests: [\n        { unchanged: 'if{{s}}(a) b()' },\n        { unchanged: 'while{{s}}(a) b()' },\n        { unchanged: 'do\\n    c();\\nwhile{{s}}(a) b()' },\n        { unchanged: 'switch{{s}}(a) b()' },\n        {\n          input: 'if(a)\\nb();',\n          output: 'if{{s}}(a)\\n    b();'\n        },\n        {\n          input: 'while(a)\\nb();',\n          output: 'while{{s}}(a)\\n    b();'\n        },\n        {\n          input: 'do\\nc();\\nwhile(a);',\n          output: 'do\\n    c();\\nwhile{{s}}(a);'\n        },\n        {\n          input: 'switch(a)\\nb()',\n          output: 'switch{{s}}(a)\\n    b()'\n        },\n        { unchanged: 'return [];' },\n        { unchanged: 'return ();' }\n      ]\n    }, {\n      name: \"Beautify preserve formatting\",\n      description: \"Allow beautifier to preserve sections\",\n      tests: [\n        { unchanged: \"/* beautify preserve:start */\\n/* beautify preserve:end */\" },\n        { unchanged: \"/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\" },\n        { unchanged: \"var a = 1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\" },\n        { unchanged: \"/* beautify preserve:start */     {asdklgh;y;;{}dd2d}/* beautify preserve:end */\" },\n        {\n          input_: \"var a =  1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\",\n          output: \"var a = 1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\"\n        },\n        {\n          input_: \"var a = 1;\\n /* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\",\n          output: \"var a = 1;\\n/* beautify preserve:start */\\n   var a = 1;\\n/* beautify preserve:end */\"\n        },\n        {\n          unchanged: [\n            'var a = {',\n            '    /* beautify preserve:start */',\n            '    one   :  1',\n            '    two   :  2,',\n            '    three :  3,',\n            '    ten   : 10',\n            '    /* beautify preserve:end */',\n            '};'\n          ]\n        },\n        {\n          input: [\n            'var a = {',\n            '/* beautify preserve:start */',\n            '    one   :  1,',\n            '    two   :  2,',\n            '    three :  3,',\n            '    ten   : 10',\n            '/* beautify preserve:end */',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /* beautify preserve:start */',\n            '    one   :  1,',\n            '    two   :  2,',\n            '    three :  3,',\n            '    ten   : 10',\n            '/* beautify preserve:end */',\n            '};'\n          ]\n        },\n        {\n          comment: 'one space before and after required, only single spaces inside.',\n          input: [\n            'var a = {',\n            '/*  beautify preserve:start  */',\n            '    one   :  1,',\n            '    two   :  2,',\n            '    three :  3,',\n            '    ten   : 10',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /*  beautify preserve:start  */',\n            '    one: 1,',\n            '    two: 2,',\n            '    three: 3,',\n            '    ten: 10',\n            '};'\n          ]\n        },\n        {\n          input: [\n            'var a = {',\n            '/*beautify preserve:start*/',\n            '    one   :  1,',\n            '    two   :  2,',\n            '    three :  3,',\n            '    ten   : 10',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /*beautify preserve:start*/',\n            '    one: 1,',\n            '    two: 2,',\n            '    three: 3,',\n            '    ten: 10',\n            '};'\n          ]\n        },\n        {\n          input: [\n            'var a = {',\n            '/*beautify  preserve:start*/',\n            '    one   :  1,',\n            '    two   :  2,',\n            '    three :  3,',\n            '    ten   : 10',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /*beautify  preserve:start*/',\n            '    one: 1,',\n            '    two: 2,',\n            '    three: 3,',\n            '    ten: 10',\n            '};'\n          ]\n        },\n\n        {\n          comment: 'Directive: ignore',\n          unchanged: \"/* beautify ignore:start */\\n/* beautify ignore:end */\"\n        },\n        { unchanged: \"/* beautify ignore:start */\\n   var a,,,{ 1;\\n  /* beautify ignore:end */\" },\n        { unchanged: \"var a = 1;\\n/* beautify ignore:start */\\n   var a = 1;\\n/* beautify ignore:end */\" },\n        {\n          comment: 'ignore starts _after_ the start comment, ends after the end comment',\n          unchanged: \"/* beautify ignore:start */     {asdklgh;y;+++;dd2d}/* beautify ignore:end */\"\n        },\n        { unchanged: \"/* beautify ignore:start */  {asdklgh;y;+++;dd2d}    /* beautify ignore:end */\" },\n        {\n          input_: \"var a =  1;\\n/* beautify ignore:start */\\n   var a,,,{ 1;\\n/*beautify ignore:end*/\",\n          output: \"var a = 1;\\n/* beautify ignore:start */\\n   var a,,,{ 1;\\n/*beautify ignore:end*/\"\n        },\n        {\n          input_: \"var a = 1;\\n /* beautify ignore:start */\\n   var a,,,{ 1;\\n/* beautify ignore:end */\",\n          output: \"var a = 1;\\n/* beautify ignore:start */\\n   var a,,,{ 1;\\n/* beautify ignore:end */\"\n        },\n        {\n          unchanged: [\n            'var a = {',\n            '    /* beautify ignore:start */',\n            '    one   :  1',\n            '    two   :  2,',\n            '    three :  {',\n            '    ten   : 10',\n            '    /* beautify ignore:end */',\n            '};'\n          ]\n        },\n        {\n          input: [\n            'var a = {',\n            '/* beautify ignore:start */',\n            '    one   :  1',\n            '    two   :  2,',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /* beautify ignore:start */',\n            '    one   :  1',\n            '    two   :  2,',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '};'\n          ]\n        },\n        {\n          comment: 'Directives - multiple and interacting',\n          input: [\n            'var a = {',\n            '/* beautify preserve:start */',\n            '/* beautify preserve:start */',\n            '    one   :  1,',\n            '  /* beautify preserve:end */',\n            '    two   :  2,',\n            '    three :  3,',\n            '/* beautify preserve:start */',\n            '    ten   : 10',\n            '/* beautify preserve:end */',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /* beautify preserve:start */',\n            '/* beautify preserve:start */',\n            '    one   :  1,',\n            '  /* beautify preserve:end */',\n            '    two: 2,',\n            '    three: 3,',\n            '    /* beautify preserve:start */',\n            '    ten   : 10',\n            '/* beautify preserve:end */',\n            '};'\n          ]\n        },\n        {\n          input: [\n            'var a = {',\n            '/* beautify ignore:start */',\n            '    one   :  1',\n            ' /* beautify ignore:end */',\n            '    two   :  2,',\n            '/* beautify ignore:start */',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /* beautify ignore:start */',\n            '    one   :  1',\n            ' /* beautify ignore:end */',\n            '    two: 2,',\n            '    /* beautify ignore:start */',\n            '    three :  {',\n            '    ten   : 10',\n            '/* beautify ignore:end */',\n            '};'\n          ]\n        },\n        {\n          comment: 'Starts can occur together, ignore:end must occur alone.',\n          input: [\n            'var a = {',\n            '/* beautify ignore:start */',\n            '    one   :  1',\n            '    NOTE: ignore end block does not support starting other directives',\n            '    This does not match the ending the ignore...',\n            ' /* beautify ignore:end preserve:start */',\n            '    two   :  2,',\n            '/* beautify ignore:start */',\n            '    three :  {',\n            '    ten   : 10',\n            '    ==The next comment ends the starting ignore==',\n            '/* beautify ignore:end */',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /* beautify ignore:start */',\n            '    one   :  1',\n            '    NOTE: ignore end block does not support starting other directives',\n            '    This does not match the ending the ignore...',\n            ' /* beautify ignore:end preserve:start */',\n            '    two   :  2,',\n            '/* beautify ignore:start */',\n            '    three :  {',\n            '    ten   : 10',\n            '    ==The next comment ends the starting ignore==',\n            '/* beautify ignore:end */',\n            '};'\n          ]\n        },\n        {\n          input: [\n            'var a = {',\n            '/* beautify ignore:start preserve:start */',\n            '    one   :  {',\n            ' /* beautify ignore:end */',\n            '    two   :  2,',\n            '  /* beautify ignore:start */',\n            '    three :  {',\n            '/* beautify ignore:end */',\n            '    ten   : 10',\n            '   // This is all preserved',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /* beautify ignore:start preserve:start */',\n            '    one   :  {',\n            ' /* beautify ignore:end */',\n            '    two   :  2,',\n            '  /* beautify ignore:start */',\n            '    three :  {',\n            '/* beautify ignore:end */',\n            '    ten   : 10',\n            '   // This is all preserved',\n            '};'\n          ]\n        },\n        {\n          input: [\n            'var a = {',\n            '/* beautify ignore:start preserve:start */',\n            '    one   :  {',\n            ' /* beautify ignore:end */',\n            '    two   :  2,',\n            '  /* beautify ignore:start */',\n            '    three :  {',\n            '/* beautify ignore:end */',\n            '    ten   : 10,',\n            '/* beautify preserve:end */',\n            '     eleven: 11',\n            '};'\n          ],\n          output: [\n            'var a = {',\n            '    /* beautify ignore:start preserve:start */',\n            '    one   :  {',\n            ' /* beautify ignore:end */',\n            '    two   :  2,',\n            '  /* beautify ignore:start */',\n            '    three :  {',\n            '/* beautify ignore:end */',\n            '    ten   : 10,',\n            '/* beautify preserve:end */',\n            '    eleven: 11',\n            '};'\n          ]\n        }\n      ]\n    }, {\n      name: \"Comments and  tests\",\n      description: \"Comments should be in the right indent and not side-ffect.\",\n      options: [],\n      tests: [{\n          comment: '#913',\n\n          unchanged: [\n            'class test {',\n            '    method1() {',\n            '        let resp = null;',\n            '    }',\n            '    /**',\n            '     * @param {String} id',\n            '     */',\n            '    method2(id) {',\n            '        let resp2 = null;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: '#1090',\n          unchanged: [\n            'for (var i = 0; i < 20; ++i) // loop',\n            '    if (i % 3) {',\n            '        console.log(i);',\n            '    }',\n            'console.log(\"done\");'\n          ]\n        },\n        {\n          comment: '#1043',\n          unchanged: [\n            'var o = {',\n            '    k: 0',\n            '}',\n            '// ...',\n            'foo(o)'\n          ]\n        },\n        {\n          comment: '#713 and #964',\n          unchanged: [\n            'Meteor.call(\"foo\", bar, function(err, result) {',\n            '    Session.set(\"baz\", result.lorem)',\n            '})',\n            '//blah blah'\n          ]\n        },\n        {\n          comment: '#815',\n          unchanged: [\n            'foo()',\n            '// this is a comment',\n            'bar()',\n            '',\n            'const foo = 5',\n            '// comment',\n            'bar()'\n          ]\n        },\n        {\n          comment: 'This shows current behavior.  Note #1069 is not addressed yet.',\n          unchanged: [\n            'if (modulus === 2) {',\n            '    // i might be odd here',\n            '    i += (i & 1);',\n            '    // now i is guaranteed to be even',\n            '    // this block is obviously about the statement above',\n            '',\n            '    // #1069 This should attach to the block below',\n            '    // this comment is about the block after it.',\n            '} else {',\n            '    // rounding up using integer arithmetic only',\n            '    if (i % modulus)',\n            '        i += modulus - (i % modulus);',\n            '    // now i is divisible by modulus',\n            '    // behavior of comments should be different for single statements vs block statements/expressions',\n            '}',\n            '',\n            'if (modulus === 2)',\n            '    // i might be odd here',\n            '    i += (i & 1);',\n            '// now i is guaranteed to be even',\n            '// non-braced comments unindent immediately',\n            '',\n            '// this comment is about the block after it.',\n            'else',\n            '    // rounding up using integer arithmetic only',\n            '    if (i % modulus)',\n            '        i += modulus - (i % modulus);',\n            '// behavior of comments should be different for single statements vs block statements/expressions'\n          ]\n        }\n\n      ]\n    }, {\n      name: \"minimal template handling\",\n      description: \"treated as content.\",\n      template: \"^^^ $$$\",\n      options: [\n        { name: \"templating\", value: \"['django', 'erb', 'handlebars', 'php']\" }\n      ],\n      matrix: templating_matrix,\n      tests: [{\n        input: 'var  a = ^^^s$$$$view[\"name\"]; ^^^e$$$;',\n        output: 'var a = ^^^s$$$$view[\"name\"]; ^^^e$$$;'\n      }, {\n        unchanged: [\n          'a = abc^^^s$$$',\n          'for($i = 1; $i <= 100; $i++;) {',\n          '    #count to 100!',\n          '    echo($i . \"</br>\");',\n          '}',\n          '^^^e$$$;'\n        ]\n      }, {\n        fragment: true,\n        unchanged: [\n          '^^^s$$$ ^^^e$$$',\n          'test.met^^^s$$$ someValue ^^^e$$$hod();'\n        ]\n      }, {\n        unchanged: [\n          '^^^s$$$ \"A\" ^^^e$$$abc^^^s$$$ \"D\" ^^^e$$$;',\n          '^^^s$$$ \"B\" ^^^e$$$.test();',\n          '\" ^^^s$$$   \"C\" \\\\\\'D\\\\\\'  ^^^e$$$  \"'\n        ]\n      }, {\n        unchanged: [\n          '^^^s$$$',\n          'echo \"A\";',\n          '^^^e$$$;',\n          'test.method();'\n        ]\n      }, {\n        unchanged: [\n          '\"^^^s$$$\";if(0){}\"^^^e$$$\";'\n        ]\n      }]\n    }, {\n      name: \"Templating disabled - ensure formatting\",\n      description: \"\",\n      template: \"^^^ $$$\",\n      options: [\n        { name: \"templating\", value: \"['auto']\" }\n      ],\n      matrix: templating_matrix,\n      tests: [{\n        input: [\n          '\"^^^s$$$\";if(0){}\"^^^e$$$\";'\n        ],\n        output: [\n          '\"^^^s$$$\";',\n          'if (0) {}',\n          '\"^^^e$$$\";'\n        ]\n      }, {\n        input: [\n          '\"^^^s$$$\";if(0){}'\n        ],\n        output: [\n          '\"^^^s$$$\";',\n          'if (0) {}'\n        ]\n      }]\n    }, {\n      name: \"jslint and space after anon function\",\n      description: \"jslint_happy and space_after_anon_function tests\",\n      matrix: [{\n          options: [\n            { name: \"jslint_happy\", value: \"true\" },\n            { name: \"space_after_anon_function\", value: \"true\" }\n          ],\n          f: ' ',\n          c: '',\n          nf: ''\n        }, {\n          options: [\n            { name: \"jslint_happy\", value: \"true\" },\n            { name: \"space_after_anon_function\", value: \"false\" }\n          ],\n          f: ' ',\n          c: '',\n          nf: ''\n        }, {\n          options: [\n            { name: \"jslint_happy\", value: \"false\" },\n            { name: \"space_after_anon_function\", value: \"true\" }\n          ],\n          f: ' ',\n          c: '    ',\n          nf: ''\n        }, {\n          options: [\n            { name: \"jslint_happy\", value: \"false\" },\n            { name: \"space_after_anon_function\", value: \"false\" }\n          ],\n          f: '',\n          c: '    ',\n          nf: ''\n        }, {\n          options: [\n            { name: \"space_after_named_function\", value: \"true\" }\n          ],\n          f: '',\n          c: '    ',\n          nf: ' '\n        }\n\n\n      ],\n      tests: [{\n          input_: 'a=typeof(x)',\n          output: 'a = typeof{{f}}(x)'\n        },\n        {\n          input_: 'x();\\n\\nfunction(){}',\n          output: 'x();\\n\\nfunction{{f}}() {}'\n        },\n        {\n          input_: 'x();\\n\\nfunction y(){}',\n          output: 'x();\\n\\nfunction y{{nf}}() {}'\n        },\n        {\n          input_: 'x();\\n\\nvar x = {\\nx: function(){}\\n}',\n          output: 'x();\\n\\nvar x = {\\n    x: function{{f}}() {}\\n}'\n        },\n        {\n          input_: 'x();\\n\\nvar x = {\\nx: function y(){}\\n}',\n          output: 'x();\\n\\nvar x = {\\n    x: function y{{nf}}() {}\\n}'\n        },\n        {\n          input_: 'function () {\\n    var a, b, c, d, e = [],\\n        f;\\n}',\n          output: 'function{{f}}() {\\n    var a, b, c, d, e = [],\\n        f;\\n}'\n        },\n        {\n          input_: 'switch(x) {case 0: case 1: a(); break; default: break}',\n          output: 'switch (x) {\\n{{c}}case 0:\\n{{c}}case 1:\\n{{c}}    a();\\n{{c}}    break;\\n{{c}}default:\\n{{c}}    break\\n}'\n        },\n        {\n          input: 'switch(x){case -1:break;case !y:break;}',\n          output: 'switch (x) {\\n{{c}}case -1:\\n{{c}}    break;\\n{{c}}case !y:\\n{{c}}    break;\\n}'\n        },\n        {\n          comment: \"Issue #1357\",\n          input_: 'switch(x) {case 0: case 1:{a(); break;} default: break}',\n          output: 'switch (x) {\\n{{c}}case 0:\\n{{c}}case 1: {\\n{{c}}    a();\\n{{c}}    break;\\n{{c}}\\}\\n{{c}}default:\\n{{c}}    break\\n}'\n        },\n        {\n          comment: \"Issue #1357\",\n          input: 'switch(x){case -1:break;case !y:{break;}}',\n          output: 'switch (x) {\\n{{c}}case -1:\\n{{c}}    break;\\n{{c}}case !y: {\\n{{c}}    break;\\n{{c}}\\}\\n}'\n        },\n        {\n          comment: \"Issue #1622 - basic class with function definitions\",\n          input: [\n            'class blah {',\n            '    constructor() {',\n            '        this.doStuff()',\n            '    }',\n            '    doStuff() {',\n            '        console.log(\"stuff\")',\n            '    }',\n            '}'\n          ],\n          output: [\n            'class blah {',\n            '    constructor{{nf}}() {',\n            '        this.doStuff()',\n            '    }',\n            '    doStuff{{nf}}() {',\n            '        console.log(\"stuff\")',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1622 - class with extends and function definitions\",\n          input: [\n            'class blah extends something {',\n            '    constructor() {',\n            '        this.zz = 2 + 2;',\n            '    }',\n            '    someOtherFunction() {',\n            'this.y = 1;',\n            '    }',\n            '}'\n          ],\n          output: [\n            'class blah extends something {',\n            '    constructor{{nf}}() {',\n            '        this.zz = 2 + 2;',\n            '    }',\n            '    someOtherFunction{{nf}}() {',\n            '        this.y = 1;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1622 - class/extends as a property\",\n          input: [\n            'var a.class = {',\n            ' ...abc(),',\n            '}',\n            'b.extends({',\n            ' bb.s(),',\n            '})'\n          ],\n          output: [\n            'var a.class = {',\n            '    ...abc(),',\n            '}',\n            'b.extends({',\n            '    bb.s(),',\n            '})'\n          ]\n        },\n        {\n          comment: 'typical greasemonkey start',\n          fragment: true,\n          unchanged: '// comment 2\\n(function{{f}}()'\n        },\n\n        {\n          input_: 'var a2, b2, c2, d2 = 0, c = function() {}, d = \\\\\\'\\\\\\';',\n          output: 'var a2, b2, c2, d2 = 0,\\n    c = function{{f}}() {},\\n    d = \\\\\\'\\\\\\';'\n        },\n        {\n          input_: 'var a2, b2, c2, d2 = 0, c = function yoohoo() {}, d = \\\\\\'\\\\\\';',\n          output: 'var a2, b2, c2, d2 = 0,\\n    c = function yoohoo{{nf}}() {},\\n    d = \\\\\\'\\\\\\';'\n        },\n        {\n          input_: 'var a2, b2, c2, d2 = 0, c = function() {},\\nd = \\\\\\'\\\\\\';',\n          output: 'var a2, b2, c2, d2 = 0,\\n    c = function{{f}}() {},\\n    d = \\\\\\'\\\\\\';'\n        },\n        {\n          input_: 'var o2=$.extend(a);function(){alert(x);}',\n          output: 'var o2 = $.extend(a);\\n\\nfunction{{f}}() {\\n    alert(x);\\n}'\n        },\n        {\n          input_: 'var o2=$.extend(a);function yoohoo(){alert(x);}',\n          output: 'var o2 = $.extend(a);\\n\\nfunction yoohoo{{nf}}() {\\n    alert(x);\\n}'\n        },\n        {\n          input: 'function*() {\\n    yield 1;\\n}',\n          output: 'function*{{f}}() {\\n    yield 1;\\n}'\n        },\n        {\n          input: 'function* yoohoo() {\\n    yield 1;\\n}',\n          output: 'function* yoohoo{{nf}}() {\\n    yield 1;\\n}'\n        },\n        {\n          input: 'function* x() {\\n    yield 1;\\n}',\n          output: 'function* x{{nf}}() {\\n    yield 1;\\n}'\n        },\n        {\n          input: 'async x() {\\n    yield 1;\\n}',\n          output: 'async x{{nf}}() {\\n    yield 1;\\n}'\n        },\n        {\n          input: 'var a={data(){},\\ndata2(){}}',\n          output: [\n            'var a = {',\n            '    data{{nf}}() {},',\n            '    data2{{nf}}() {}',\n            '}'\n          ]\n        }, {\n          input: 'new Vue({\\ndata(){},\\ndata2(){}, a:1})',\n          output: [\n            'new Vue({',\n            '    data{{nf}}() {},',\n            '    data2{{nf}}() {},',\n            '    a: 1',\n            '})'\n          ]\n        }, {\n          input: 'export default {data(){},\\ndata2(){},\\na:1}',\n          output: [\n            'export default {',\n            '    data{{nf}}() {},',\n            '    data2{{nf}}() {},',\n            '    a: 1',\n            '}'\n          ]\n        },\n        {\n          input: 'var a={*data(){},*data2(){}}',\n          output: [\n            'var a = {',\n            '    * data{{nf}}() {},',\n            '    * data2{{nf}}() {}',\n            '}'\n          ]\n        }, {\n          input: 'new Vue({\\n*data(){},*data2(){}, a:1})',\n          output: [\n            'new Vue({',\n            '    * data{{nf}}() {},',\n            '    * data2{{nf}}() {},',\n            '    a: 1',\n            '})'\n          ]\n        }, {\n          input: 'export default {*data(){},*data2(){},\\na:1}',\n          output: [\n            'export default {',\n            '    * data{{nf}}() {},',\n            '    * data2{{nf}}() {},',\n            '    a: 1',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Regression tests\",\n      description: \"Ensure specific bugs do not recur\",\n      options: [],\n      tests: [{\n          comment: \"Issue 241\",\n          unchanged: [\n            'obj',\n            '    .last({',\n            '        foo: 1,',\n            '        bar: 2',\n            '    });',\n            'var test = 1;'\n          ]\n        }, {\n          comment: \"Issue #1852 - semicolon followed by block statement\",\n          unchanged: [\n            '(function() {',\n            '    some_code_here();',\n            '    {',\n            '        /* IE11 let bug bypass */',\n            '        let index;',\n            '        for (index in a) {',\n            '            a[index];',\n            '        }',\n            '    }',\n            '})();'\n          ]\n        }, {\n          comment: \"Issue #1852 - semicolon followed by block statement 2\",\n          input: [\n            'let x = { A: 1 }; { console.log(\"hello\"); }'\n          ],\n          output: [\n            'let x = {',\n            '    A: 1',\n            '};',\n            '{',\n            '    console.log(\"hello\");',\n            '}'\n          ]\n        }, {\n          comment: \"Issue #772\",\n          input: [\n            'this.initAttributes([',\n            '\"name\",',\n            '[\"parent\", null, \"parentName\"],',\n            '\"length\",',\n            '[\"id\", this.name],',\n            ']);'\n          ],\n          output: [\n            'this.initAttributes([',\n            '    \"name\",',\n            '    [\"parent\", null, \"parentName\"],',\n            '    \"length\",',\n            '    [\"id\", this.name],',\n            ']);'\n          ]\n        }, {\n          comment: \"Issue #1663\",\n          unchanged: [\n            '{',\n            '    /* howdy',\n            '    ',\n            '    */',\n            '}'\n          ]\n        },\n        {\n          comment: \"#1095 - Return without semicolon followed by prefix on a new line\",\n          input: [\n            'function x(){',\n            'return',\n            '++a',\n            '}',\n            '',\n            'while(true) {',\n            'return',\n            '--b',\n            '}'\n          ],\n          output: [\n            'function x() {',\n            '    return',\n            '    ++a',\n            '}',\n            '',\n            'while (true) {',\n            '    return',\n            '    --b',\n            '}'\n          ]\n        },\n        {\n          comment: \"#1095\",\n          input: [\n            'function test(){',\n            'if(x) return',\n            '++x',\n            'var y= 1;',\n            '}',\n            'function t1(){',\n            'if(cc) return;',\n            'else return',\n            '--cc',\n            '}'\n          ],\n          output: [\n            'function test() {',\n            '    if (x) return',\n            '    ++x',\n            '    var y = 1;',\n            '}',\n            '',\n            'function t1() {',\n            '    if (cc) return;',\n            '    else return',\n            '    --cc',\n            '}'\n          ]\n        },\n        {\n          comment: \"#1095 - Return with semicolon followed by a prefix on a new line\",\n          input: [\n            'function x(){',\n            'return; ++a',\n            '}',\n            '',\n            'while(true){return; --b',\n            '}'\n          ],\n          output: [\n            'function x() {',\n            '    return;',\n            '    ++a',\n            '}',\n            '',\n            'while (true) {',\n            '    return;',\n            '    --b',\n            '}'\n          ]\n        },\n        {\n          comment: \"#1838 - handle class and interface word as an object property\",\n          unchanged: [\n            '{',\n            '    class: {',\n            '        a: 1,',\n            '        b: 2,',\n            '        c: 3,',\n            '    }',\n            '    interface: {',\n            '        a: 1,',\n            '        b: 2,',\n            '        c: 3,',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"#1838 - handle class word as an object property but with space after colon\",\n          input: [\n            '{',\n            '    class : { a: 1,',\n            'b: 2,c : 3',\n            '    }',\n            '}'\n          ],\n          output: [\n            '{',\n            '    class: {',\n            '        a: 1,',\n            '        b: 2,',\n            '        c: 3',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"#1838 - handle class word as an object property but without spaces\",\n          input: '{class:{a:1,b:2,c:3,}}',\n          output: [\n            '{',\n            '    class: {',\n            '        a: 1,',\n            '        b: 2,',\n            '        c: 3,',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"#1838 - handle class word as a nested object property\",\n          input: '{x:{a:1,class:2,c:3,}}',\n          output: [\n            '{',\n            '    x: {',\n            '        a: 1,',\n            '        class: 2,',\n            '        c: 3,',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          unchanged: [\n            'obj',\n            '    .last(a, function() {',\n            '        var test;',\n            '    });',\n            'var test = 1;'\n          ]\n        },\n        {\n          unchanged: [\n            'obj.first()',\n            '    .second()',\n            '    .last(function(err, response) {',\n            '        console.log(err);',\n            '    });'\n          ]\n        },\n        {\n          comment: \"Issue 268 and 275\",\n          unchanged: [\n            'obj.last(a, function() {',\n            '    var test;',\n            '});',\n            'var test = 1;'\n          ]\n        },\n        {\n          unchanged: [\n            'obj.last(a,',\n            '    function() {',\n            '        var test;',\n            '    });',\n            'var test = 1;'\n          ]\n        },\n        {\n          input: '(function() {if (!window.FOO) window.FOO || (window.FOO = function() {var b = {bar: \"zort\"};});})();',\n          output: [\n            '(function() {',\n            '    if (!window.FOO) window.FOO || (window.FOO = function() {',\n            '        var b = {',\n            '            bar: \"zort\"',\n            '        };',\n            '    });',\n            '})();'\n          ]\n        },\n        {\n          comment: \"Issue 281\",\n          unchanged: [\n            'define([\"dojo/_base/declare\", \"my/Employee\", \"dijit/form/Button\",',\n            '    \"dojo/_base/lang\", \"dojo/Deferred\"',\n            '], function(declare, Employee, Button, lang, Deferred) {',\n            '    return declare(Employee, {',\n            '        constructor: function() {',\n            '            new Button({',\n            '                onClick: lang.hitch(this, function() {',\n            '                    new Deferred().then(lang.hitch(this, function() {',\n            '                        this.salary * 0.25;',\n            '                    }));',\n            '                })',\n            '            });',\n            '        }',\n            '    });',\n            '});'\n          ]\n        },\n        {\n          unchanged: [\n            'define([\"dojo/_base/declare\", \"my/Employee\", \"dijit/form/Button\",',\n            '        \"dojo/_base/lang\", \"dojo/Deferred\"',\n            '    ],',\n            '    function(declare, Employee, Button, lang, Deferred) {',\n            '        return declare(Employee, {',\n            '            constructor: function() {',\n            '                new Button({',\n            '                    onClick: lang.hitch(this, function() {',\n            '                        new Deferred().then(lang.hitch(this, function() {',\n            '                            this.salary * 0.25;',\n            '                        }));',\n            '                    })',\n            '                });',\n            '            }',\n            '        });',\n            '    });'\n          ]\n        },\n        {\n          comment: \"Issue 459\",\n          unchanged: [\n            '(function() {',\n            '    return {',\n            '        foo: function() {',\n            '            return \"bar\";',\n            '        },',\n            '        bar: [\"bar\"]',\n            '    };',\n            '}());'\n          ]\n        },\n        {\n          comment: \"Issue 505 - strings should end at newline unless continued by backslash\",\n          unchanged: [\n            'var name = \"a;',\n            'name = \"b\";'\n          ]\n        },\n        {\n          unchanged: [\n            'var name = \"a;\\\\\\\\',\n            '    name = b\";'\n          ]\n        },\n        {\n          comment: \"Issue 514 - some operators require spaces to distinguish them\",\n          unchanged: 'var c = \"_ACTION_TO_NATIVEAPI_\" + ++g++ + +new Date;'\n        },\n        {\n          unchanged: 'var c = \"_ACTION_TO_NATIVEAPI_\" - --g-- - -new Date;'\n        },\n        {\n          comment: \"Issue 440 - reserved words can be used as object property names\",\n          unchanged: [\n            'a = {',\n            '    function: {},',\n            '    \"function\": {},',\n            '    throw: {},',\n            '    \"throw\": {},',\n            '    var: {},',\n            '    \"var\": {},',\n            '    set: {},',\n            '    \"set\": {},',\n            '    get: {},',\n            '    \"get\": {},',\n            '    if: {},',\n            '    \"if\": {},',\n            '    then: {},',\n            '    \"then\": {},',\n            '    else: {},',\n            '    \"else\": {},',\n            '    yay: {}',\n            '};'\n          ]\n        },\n        {\n          comment: \"Issue 331 - if-else with braces edge case\",\n          input: 'if(x){a();}else{b();}if(y){c();}',\n          output: [\n            'if (x) {',\n            '    a();',\n            '} else {',\n            '    b();',\n            '}',\n            'if (y) {',\n            '    c();',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1683 - switch-case wrong indentation\",\n          input: 'switch (x) { case 0: if (y == z) { a(); } else { b(); } case 1: c(); }',\n          output: [\n            'switch (x) {',\n            '    case 0:',\n            '        if (y == z) {',\n            '            a();',\n            '        } else {',\n            '            b();',\n            '        }',\n            '    case 1:',\n            '        c();',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 485 - ensure function declarations behave the same in arrays as elsewhere\",\n          unchanged: [\n            'var v = [\"a\",',\n            '    function() {',\n            '        return;',\n            '    }, {',\n            '        id: 1',\n            '    }',\n            '];'\n          ]\n        },\n        {\n          unchanged: [\n            'var v = [\"a\", function() {',\n            '    return;',\n            '}, {',\n            '    id: 1',\n            '}];'\n          ]\n        },\n        {\n          comment: \"Issue 382 - initial totally cursory support for es6 module export\",\n          unchanged: [\n            'module \"Even\" {',\n            '    import odd from \"Odd\";',\n            '    export function sum(x, y) {',\n            '        return x + y;',\n            '    }',\n            '    export var pi = 3.141593;',\n            '    export default moduleName;',\n            '}'\n          ]\n        },\n        {\n          unchanged: [\n            'module \"Even\" {',\n            '    export default function div(x, y) {}',\n            '}'\n          ]\n        },\n        {\n          comment: 'Issue 889 - export default { ... }',\n          unchanged: [\n            'export default {',\n            '    func1() {},',\n            '    func2() {}',\n            '    func3() {}',\n            '}'\n          ]\n        },\n        {\n          unchanged: [\n            'export default {',\n            '    a() {',\n            '        return 1;',\n            '    },',\n            '    b() {',\n            '        return 2;',\n            '    },',\n            '    c() {',\n            '        return 3;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 508\",\n          unchanged: 'set[\"name\"]'\n        },\n        {\n          unchanged: 'get[\"name\"]'\n        },\n        {\n          fragment: true,\n          unchanged: [\n            'a = {',\n            '    set b(x) {},',\n            '    c: 1,',\n            '    d: function() {}',\n            '};'\n          ]\n        },\n        {\n          fragment: true,\n          unchanged: [\n            'a = {',\n            '    get b() {',\n            '        retun 0;',\n            '    },',\n            '    c: 1,',\n            '    d: function() {}',\n            '};'\n          ]\n        },\n        {\n          comment: \"Issue 298 - do not under indent if/while/for condtionals experesions\",\n          unchanged: [\n            '\\\\\\'use strict\\\\\\';',\n            'if ([].some(function() {',\n            '        return false;',\n            '    })) {',\n            '    console.log(\"hello\");',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 298 - do not under indent if/while/for condtionals experesions\",\n          unchanged: [\n            '\\\\\\'use strict\\\\\\';',\n            'if ([].some(function() {',\n            '        return false;',\n            '    })) {',\n            '    console.log(\"hello\");',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 552 - Typescript?  Okay... we didn't break it before, so try not to break it now.\",\n          unchanged: [\n            'class Test {',\n            '    blah: string[];',\n            '    foo(): number {',\n            '        return 0;',\n            '    }',\n            '    bar(): number {',\n            '        return 0;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 1544 - Typescript declare formatting (no newline).\",\n          unchanged: [\n            'declare const require: any;',\n            'declare function greet(greeting: string): void;',\n            'declare var foo: number;',\n            'declare namespace myLib {',\n            '    function makeGreeting(s: string): string;',\n            '    let numberOfGreetings: number;',\n            '}',\n            'declare let test: any;'\n          ]\n        },\n        {\n          unchanged: [\n            'interface Test {',\n            '    blah: string[];',\n            '    foo(): number {',\n            '        return 0;',\n            '    }',\n            '    bar(): number {',\n            '        return 0;',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 583 - Functions with comments after them should still indent correctly.\",\n          unchanged: [\n            'function exit(code) {',\n            '    setTimeout(function() {',\n            '        phantom.exit(code);',\n            '    }, 0);',\n            '    phantom.onError = function() {};',\n            '}',\n            '// Comment'\n          ]\n        },\n        {\n          comment: \"Issue 806 - newline arrow functions\",\n          unchanged: [\n            'a.b(\"c\",',\n            '    () => d.e',\n            ')'\n          ]\n        },\n        {\n          comment: \"Issue 810 - es6 object literal detection\",\n          unchanged: [\n            'function badFormatting() {',\n            '    return {',\n            '        a,',\n            '        b: c,',\n            '        d: e,',\n            '        f: g,',\n            '        h,',\n            '        i,',\n            '        j: k',\n            '    }',\n            '}',\n            '',\n            'function goodFormatting() {',\n            '    return {',\n            '        a: b,',\n            '        c,',\n            '        d: e,',\n            '        f: g,',\n            '        h,',\n            '        i,',\n            '        j: k',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 602 - ES6 object literal shorthand functions\",\n          unchanged: [\n            'return {',\n            '    fn1() {},',\n            '    fn2() {}',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'throw {',\n            '    fn1() {},',\n            '    fn2() {}',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'foo({',\n            '    fn1(a) {}',\n            '    fn2(a) {}',\n            '})'\n          ]\n        }, {\n          unchanged: [\n            'foo(\"text\", {',\n            '    fn1(a) {}',\n            '    fn2(a) {}',\n            '})'\n          ]\n        }, {\n          unchanged: [\n            'oneArg = {',\n            '    fn1(a) {',\n            '        do();',\n            '    },',\n            '    fn2() {}',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'multiArg = {',\n            '    fn1(a, b, c) {',\n            '        do();',\n            '    },',\n            '    fn2() {}',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'noArgs = {',\n            '    fn1() {',\n            '        do();',\n            '    },',\n            '    fn2() {}',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'emptyFn = {',\n            '    fn1() {},',\n            '    fn2() {}',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'nested = {',\n            '    fns: {',\n            '        fn1() {},',\n            '        fn2() {}',\n            '    }',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'array = [{',\n            '    fn1() {},',\n            '    prop: val,',\n            '    fn2() {}',\n            '}]'\n          ]\n        }, {\n          unchanged: [\n            'expr = expr ? expr : {',\n            '    fn1() {},',\n            '    fn2() {}',\n            '}'\n          ]\n        }, {\n          unchanged: [\n            'strange = valid + {',\n            '    fn1() {},',\n            '    fn2() {',\n            '        return 1;',\n            '    }',\n            '}.fn2()'\n          ]\n        },\n        {\n          comment: \"Issue 854 - Arrow function with statement block\",\n          unchanged: [\n            'test(() => {',\n            '    var a = {}',\n            '',\n            '    a.what = () => true ? 1 : 2',\n            '',\n            '    a.thing = () => {',\n            '        b();',\n            '    }',\n            '})'\n          ]\n        },\n        {\n          comment: \"Issue 1727 - Optional chaining\",\n          input: [\n            'true?.1:.2'\n          ],\n          output: [\n            'true ? .1 : .2'\n          ]\n        },\n        {\n          comment: \"Issue 406 - Multiline array\",\n          unchanged: [\n            'var tempName = [',\n            '    \"temp\",',\n            '    process.pid,',\n            '    (Math.random() * 0x1000000000).toString(36),',\n            '    new Date().getTime()',\n            '].join(\"-\");'\n          ]\n        },\n        {\n          comment: \"Issue 1801 - Optional chaining w/ obj?.[expr] syntax\",\n          unchanged: [\n            'let nestedProp = obj?.[\"prop\" + \"Name\"];',\n            'let arrayItem = arr?.[42];'\n          ]\n        },\n        {\n          comment: \"Issue 1374 - Parameters starting with ! or [ merged into single line\",\n          unchanged: [\n            'fn(',\n            '    1,',\n            '    !1,',\n            '    1,',\n            '    [1]',\n            ')'\n          ]\n        },\n        {\n          comment: \"Issue 1288 - Negative numbers remove newlines in array\",\n          unchanged: [\n            'var array = [',\n            '    -1,',\n            '    0,',\n            '    \"a\",',\n            '    -2,',\n            '    1,',\n            '    -3,',\n            '];'\n          ]\n        },\n        {\n          comment: \"Issue 1229 - Negated expressions in array\",\n          unchanged: [\n            'a = [',\n            '    true && 1,',\n            '    true && 1,',\n            '    true && 1',\n            ']',\n            'a = [',\n            '    !true && 1,',\n            '    !true && 1,',\n            '    !true && 1',\n            ']'\n          ]\n        },\n\n\n        {\n          comment: \"Issue #996 - Input ends with backslash throws exception\",\n          fragment: true,\n          unchanged: [\n            'sd = 1;',\n            '/'\n          ]\n        },\n        {\n          comment: \"Issue #1079 - unbraced if with comments should still look right\",\n          unchanged: [\n            'if (console.log)',\n            '    for (var i = 0; i < 20; ++i)',\n            '        if (i % 3)',\n            '            console.log(i);',\n            '// all done',\n            'console.log(\"done\");'\n          ]\n        },\n        {\n          comment: \"Issue #1085 - function should not have blank line in a number of cases\",\n          unchanged: [\n            'var transformer =',\n            '    options.transformer ||',\n            '    globalSettings.transformer ||',\n            '    function(x) {',\n            '        return x;',\n            '    };'\n          ]\n        },\n        {\n          comment: 'Issue #1794 - support nullish-coalescing',\n          unchanged: [\n            'a = b ?? c'\n          ]\n        },\n        {\n          comment: \"Issue #569 - function should not have blank line in a number of cases\",\n          unchanged: [\n            '(function(global) {',\n            '    \"use strict\";',\n            '',\n            '    /* jshint ignore:start */',\n            '    include \"somefile.js\"',\n            '    /* jshint ignore:end */',\n            '}(this));'\n          ]\n        },\n        {\n          unchanged: [\n            'function bindAuthEvent(eventName) {',\n            '    self.auth.on(eventName, function(event, meta) {',\n            '        self.emit(eventName, event, meta);',\n            '    });',\n            '}',\n            '[\"logged_in\", \"logged_out\", \"signed_up\", \"updated_user\"].forEach(bindAuthEvent);',\n            '',\n            'function bindBrowserEvent(eventName) {',\n            '    browser.on(eventName, function(event, meta) {',\n            '        self.emit(eventName, event, meta);',\n            '    });',\n            '}',\n            '[\"navigating\"].forEach(bindBrowserEvent);'\n          ]\n        },\n        {\n          comment: \"Issue #892 - new line between chained methods \",\n          unchanged: [\n            'foo',\n            '    .who()',\n            '',\n            '    .knows()',\n            '    // comment',\n            '    .nothing() // comment',\n            '',\n            '    .more()'\n          ]\n        }, {\n          comment: \"Issue #1107 - Missing space between words for label\",\n          input: 'function f(a) {c: do if (x) {} else if (y) {} while(0); return 0;}',\n          output: [\n            'function f(a) {',\n            '    c: do',\n            '        if (x) {} else if (y) {}',\n            '    while (0);',\n            '    return 0;',\n            '}'\n          ]\n        }, {\n          input: 'function f(a) {c: if (x) {} else if (y) {} return 0;}',\n          output: [\n            'function f(a) {',\n            '    c: if (x) {} else if (y) {}',\n            '    return 0;',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Test non-positionable-ops\",\n      description: \"Ensure specific bugs do not recur\",\n      tests: [\n        { unchanged: 'a += 2;' },\n        { unchanged: 'a -= 2;' },\n        { unchanged: 'a *= 2;' },\n        { unchanged: 'a /= 2;' },\n        { unchanged: 'a %= 2;' },\n        { unchanged: 'a &= 2;' },\n        { unchanged: 'a ^= 2;' },\n        { unchanged: 'a |= 2;' },\n        { unchanged: 'a **= 2;' },\n        { unchanged: 'a <<= 2;' },\n        { unchanged: 'a >>= 2;' }\n      ]\n    }, {\n      tests: [{\n          comment: 'exponent literals',\n          unchanged: 'a = 1e10'\n        },\n        { unchanged: 'a = 1.3e10' },\n        { unchanged: 'a = 1.3e-10' },\n        { unchanged: 'a = -12345.3e-10' },\n        { unchanged: 'a = .12345e-10' },\n        { unchanged: 'a = 06789e-10' },\n        { unchanged: 'a = e - 10' },\n        { unchanged: 'a = 1.3e+10' },\n        { unchanged: 'a = 1.e-7' },\n        { unchanged: 'a = -12345.3e+10' },\n        { unchanged: 'a = .12345e+10' },\n        { unchanged: 'a = 06789e+10' },\n        { unchanged: 'a = e + 10' },\n        { input: 'a=0e-12345.3e-10', output: 'a = 0e-12345 .3e-10' },\n        { input: 'a=0.e-12345.3e-10', output: 'a = 0.e-12345 .3e-10' },\n        { input: 'a=0x.e-12345.3e-10', output: 'a = 0x.e - 12345.3e-10' },\n        { input: 'a=0x0.e-12345.3e-10', output: 'a = 0x0.e - 12345.3e-10' },\n        { input: 'a=0x0.0e-12345.3e-10', output: 'a = 0x0 .0e-12345 .3e-10' },\n        { input: 'a=0g-12345.3e-10', output: 'a = 0 g - 12345.3e-10' },\n        { input: 'a=0.g-12345.3e-10', output: 'a = 0. g - 12345.3e-10' },\n        { input: 'a=0x.g-12345.3e-10', output: 'a = 0x.g - 12345.3e-10' },\n        { input: 'a=0x0.g-12345.3e-10', output: 'a = 0x0.g - 12345.3e-10' },\n        { input: 'a=0x0.0g-12345.3e-10', output: 'a = 0x0 .0 g - 12345.3e-10' },\n        {\n          comment: 'exponent literals with underscore',\n          unchanged: 'a = 1_1e10'\n        },\n        { unchanged: 'a = 1_.3e10' },\n        { unchanged: 'a = 1_1.3e10' },\n        { unchanged: 'a = 1__1.3e10' },\n        { unchanged: 'a = 1._3e10' },\n        { unchanged: 'a = 1.3_e10' },\n        { unchanged: 'a = 1.3e_10' },\n        { unchanged: 'a = 1.3e1_0' },\n        { unchanged: 'a = 1.3e10_' },\n        {\n          comment: 'Decimal literals',\n          unchanged: 'a = 0123456789;'\n        },\n        { unchanged: 'a = 9876543210;' },\n        { unchanged: 'a = 5647308291;' },\n        { input: 'a=030e-5', output: 'a = 030e-5' },\n        { input: 'a=00+4', output: 'a = 00 + 4' },\n        { input: 'a=32+4', output: 'a = 32 + 4' },\n        { input: 'a=0.6g+4', output: 'a = 0.6 g + 4' },\n        { input: 'a=01.10', output: 'a = 01.10' },\n        { input: 'a=a.10', output: 'a = a .10' },\n        { input: 'a=00B0x0', output: 'a = 00 B0x0' },\n        { input: 'a=00B0xb0', output: 'a = 00 B0xb0' },\n        { input: 'a=00B0x0b0', output: 'a = 00 B0x0b0' },\n        { input: 'a=0090x0', output: 'a = 0090 x0' },\n        { input: 'a=0g0b0o0', output: 'a = 0 g0b0o0' },\n        {\n          comment: 'Decimal literals with underscore',\n          unchanged: 'a = 0_123456789'\n        },\n        { unchanged: 'a = 0__123456789' },\n        { unchanged: 'a = 0__' },\n        { unchanged: 'a = 0_1_2_3' },\n        { unchanged: 'a = 0_1_2_3_' },\n\n        {\n          comment: 'Hexadecimal literals',\n          unchanged: 'a = 0x0123456789abcdef;'\n        },\n        { unchanged: 'a = 0X0123456789ABCDEF;' },\n        { unchanged: 'a = 0xFeDcBa9876543210;' },\n        { input: 'a=0x30e-5', output: 'a = 0x30e - 5' },\n        { input: 'a=0xF0+4', output: 'a = 0xF0 + 4' },\n        { input: 'a=0Xff+4', output: 'a = 0Xff + 4' },\n        { input: 'a=0Xffg+4', output: 'a = 0Xff g + 4' },\n        { input: 'a=0x01.10', output: 'a = 0x01 .10' },\n        { unchanged: 'a = 0xb0ce;' },\n        { unchanged: 'a = 0x0b0;' },\n        { input: 'a=0x0B0x0', output: 'a = 0x0B0 x0' },\n        { input: 'a=0x0B0xb0', output: 'a = 0x0B0 xb0' },\n        { input: 'a=0x0B0x0b0', output: 'a = 0x0B0 x0b0' },\n        { input: 'a=0X090x0', output: 'a = 0X090 x0' },\n        { input: 'a=0Xg0b0o0', output: 'a = 0X g0b0o0' },\n        {\n          comment: 'Hexadecimal literals with underscore',\n          unchanged: 'a = 0x0_123456789abcdef'\n        },\n        { unchanged: 'a = 0x0__0123456789abcdef' },\n        { unchanged: 'a = 0x_0123456789abcdef' },\n        { unchanged: 'a = 0x__' },\n        { unchanged: 'a = 0x0_1_a_3' },\n        { unchanged: 'a = 0x_1_2_F_' },\n\n        {\n          comment: 'Octal literals',\n          unchanged: 'a = 0o01234567;'\n        },\n        { unchanged: 'a = 0O01234567;' },\n        { unchanged: 'a = 0o34120675;' },\n        { input: 'a=0o30e-5', output: 'a = 0o30 e - 5' },\n        { input: 'a=0o70+4', output: 'a = 0o70 + 4' },\n        { input: 'a=0O77+4', output: 'a = 0O77 + 4' },\n        { input: 'a=0O778+4', output: 'a = 0O77 8 + 4' },\n        { input: 'a=0O77a+4', output: 'a = 0O77 a + 4' },\n        { input: 'a=0o01.10', output: 'a = 0o01 .10' },\n        { input: 'a=0o0B0x0', output: 'a = 0o0 B0x0' },\n        { input: 'a=0o0B0xb0', output: 'a = 0o0 B0xb0' },\n        { input: 'a=0o0B0x0b0', output: 'a = 0o0 B0x0b0' },\n        { input: 'a=0O090x0', output: 'a = 0O0 90 x0' },\n        { input: 'a=0Og0b0o0', output: 'a = 0O g0b0o0' },\n        {\n          comment: 'Octal literals with underscore',\n          unchanged: 'a = 0o0_1234567'\n        },\n        { unchanged: 'a = 0o0__1234567' },\n        { unchanged: 'a = 0o_01234567' },\n        { unchanged: 'a = 0o__' },\n        { unchanged: 'a = 0o0_1_2_3' },\n        { unchanged: 'a = 0o_1_2_3_' },\n\n        {\n          comment: 'Binary literals',\n          unchanged: 'a = 0b010011;'\n        },\n        { unchanged: 'a = 0B010011;' },\n        { unchanged: 'a = 0b01001100001111;' },\n        { input: 'a=0b10e-5', output: 'a = 0b10 e - 5' },\n        { input: 'a=0b10+4', output: 'a = 0b10 + 4' },\n        { input: 'a=0B11+4', output: 'a = 0B11 + 4' },\n        { input: 'a=0B112+4', output: 'a = 0B11 2 + 4' },\n        { input: 'a=0B11a+4', output: 'a = 0B11 a + 4' },\n        { input: 'a=0b01.10', output: 'a = 0b01 .10' },\n        { input: 'a=0b0B0x0', output: 'a = 0b0 B0x0' },\n        { input: 'a=0b0B0xb0', output: 'a = 0b0 B0xb0' },\n        { input: 'a=0b0B0x0b0', output: 'a = 0b0 B0x0b0' },\n        { input: 'a=0B090x0', output: 'a = 0B0 90 x0' },\n        { input: 'a=0Bg0b0o0', output: 'a = 0B g0b0o0' },\n        {\n          comment: 'Binary literals with underscore',\n          unchanged: 'a = 0b0_10011'\n        },\n        { unchanged: 'a = 0b0__10011' },\n        { unchanged: 'a = 0b_010011' },\n        { unchanged: 'a = 0b__' },\n        { unchanged: 'a = 0b0_1_1_1' },\n        { unchanged: 'a = 0b_1_0_1_' },\n        { unchanged: 'a = 0B010_0_11;' },\n        { unchanged: 'a = 0b01_0011_0000_1111;' },\n\n        {\n          comment: 'BigInt literals',\n          unchanged: 'a = 1n;'\n        },\n        { unchanged: 'a = 1234567890123456789n;' },\n        { unchanged: 'a = -1234567890123456789n;' },\n        { unchanged: 'a = 1234567890123456789 N;' },\n        { input: 'a=0b10e-5n', output: 'a = 0b10 e - 5n' },\n        { input: 'a=.0n', output: 'a = .0 n' },\n        { input: 'a=1.0n', output: 'a = 1.0 n' },\n        { input: 'a=1e0n', output: 'a = 1e0 n' },\n        { input: 'a=0n11a+4', output: 'a = 0n 11 a + 4' },\n        {\n          comment: 'BigInt literals with underscore',\n          unchanged: 'a = 0_123456789n'\n        },\n        { unchanged: 'a = 0__123456789n' },\n        { unchanged: 'a = 0__n' },\n        { unchanged: 'a = 0_1_2_3n' },\n        { unchanged: 'a = 0_1_2_3_n' },\n\n        {\n          comment: 'BigInt hexadecimal literals',\n          unchanged: 'a = 0x0123456789abcdefn;'\n        },\n        { unchanged: 'a = 0X0123456789ABCDEFn;' },\n        { unchanged: 'a = 0xFeDcBa9876543210n;' },\n        { input: 'a=0x30en-5', output: 'a = 0x30en - 5' },\n        { input: 'a=0xF0n+4', output: 'a = 0xF0n + 4' },\n        { input: 'a=0Xffn+4', output: 'a = 0Xffn + 4' },\n        { input: 'a=0Xffng+4', output: 'a = 0Xffn g + 4' },\n        { input: 'a=0x01n.10', output: 'a = 0x01n .10' },\n        { unchanged: 'a = 0xb0cen;' },\n        { unchanged: 'a = 0x0b0n;' },\n        { input: 'a=0x0B0nx0', output: 'a = 0x0B0n x0' },\n        { input: 'a=0x0B0nxb0', output: 'a = 0x0B0n xb0' },\n        { input: 'a=0x0B0nx0b0', output: 'a = 0x0B0n x0b0' },\n        { input: 'a=0X090nx0', output: 'a = 0X090n x0' },\n        {\n          comment: 'BigInt hexadecimal literals with underscore',\n          unchanged: 'a = 0x0_123456789abcdefn'\n        },\n        { unchanged: 'a = 0x0__0123456789abcdefn' },\n        { unchanged: 'a = 0x_0123456789abcdefn' },\n        { unchanged: 'a = 0x__n' },\n        { unchanged: 'a = 0x0_1_a_3n' },\n        { unchanged: 'a = 0x_1_2_F_n' },\n\n        {\n          comment: 'BigInt octal literals',\n          unchanged: 'a = 0o01234567n;'\n        },\n        { unchanged: 'a = 0O01234567n;' },\n        { unchanged: 'a = 0o34120675n;' },\n        { input: 'a=0o30ne-5', output: 'a = 0o30n e - 5' },\n        { input: 'a=0o70n+4', output: 'a = 0o70n + 4' },\n        { input: 'a=0O77n+4', output: 'a = 0O77n + 4' },\n        { input: 'a=0O77n8+4', output: 'a = 0O77n 8 + 4' },\n        { input: 'a=0O77na+4', output: 'a = 0O77n a + 4' },\n        { input: 'a=0o01n.10', output: 'a = 0o01n .10' },\n        { input: 'a=0o0nB0x0', output: 'a = 0o0n B0x0' },\n        { input: 'a=0o0nB0xb0', output: 'a = 0o0n B0xb0' },\n        { input: 'a=0o0nB0x0b0', output: 'a = 0o0n B0x0b0' },\n        { input: 'a=0O0n90x0', output: 'a = 0O0n 90 x0' },\n        {\n          comment: 'BigInt octal literals with underscore',\n          unchanged: 'a = 0o0_1234567n'\n        },\n        { unchanged: 'a = 0o0__1234567n' },\n        { unchanged: 'a = 0o_01234567n' },\n        { unchanged: 'a = 0o__n' },\n        { unchanged: 'a = 0o0_1_2_3n' },\n        { unchanged: 'a = 0o_1_2_3_n' },\n        {\n          comment: 'BigInt binary literals',\n          unchanged: 'a = 0b010011n;'\n        },\n        { unchanged: 'a = 0B010011n;' },\n        { unchanged: 'a = 0b01001100001111n;' },\n        { input: 'a=0b10ne-5', output: 'a = 0b10n e - 5' },\n        { input: 'a=0b10n+4', output: 'a = 0b10n + 4' },\n        { input: 'a=0B11n+4', output: 'a = 0B11n + 4' },\n        { input: 'a=0B11n2+4', output: 'a = 0B11n 2 + 4' },\n        { input: 'a=0B11na+4', output: 'a = 0B11n a + 4' },\n        { input: 'a=0b01n.10', output: 'a = 0b01n .10' },\n        { input: 'a=0b0nB0x0', output: 'a = 0b0n B0x0' },\n        { input: 'a=0b0nB0xb0', output: 'a = 0b0n B0xb0' },\n        { input: 'a=0b0nB0x0b0', output: 'a = 0b0n B0x0b0' },\n        { input: 'a=0B0n90x0', output: 'a = 0B0n 90 x0' },\n        {\n          comment: 'BigInt binary literals with underscore',\n          unchanged: 'a = 0b0_10011n'\n        },\n        { unchanged: 'a = 0b0__10011n' },\n        { unchanged: 'a = 0b_010011' },\n        { unchanged: 'a = 0b__n' },\n        { unchanged: 'a = 0b0_1_1_1n' },\n        { unchanged: 'a = 0b_1_0_1_n' },\n        { unchanged: 'a = 0B010_0_11n;' },\n        { unchanged: 'a = 0b01_0011_0000_1111n;' }\n      ]\n    }, {\n      //Relies on the tab being four spaces as default for the tests\n      name: \"brace_style ,preserve-inline tests\",\n      description: \"brace_style *,preserve-inline varying different brace_styles\",\n      template: \"< >\",\n      matrix: [\n        //test for all options of brace_style\n        {\n          options: [\n            { name: \"brace_style\", value: \"'collapse,preserve-inline'\" }\n          ],\n          obo: ' ',\n          obot: '', //Output Before Open curlybrace & Tab character\n          oao: '\\n',\n          oaot: '    ', //Output After Open curlybrace & corresponding Tab\n          obc: '\\n', //Output Before Close curlybrace\n          oac: ' ',\n          oact: '' //Output After Close curlybrace & corresponding Tab character\n        },\n        {\n          options: [\n            { name: \"brace_style\", value: \"'expand,preserve-inline'\" }\n          ],\n          obo: '\\n',\n          obot: '    ',\n          oao: '\\n',\n          oaot: '    ',\n          obc: '\\n',\n          oac: '\\n',\n          oact: '    '\n        },\n        {\n          options: [\n            { name: \"brace_style\", value: \"'end-expand,preserve-inline'\" }\n          ],\n          obo: ' ',\n          obot: '',\n          oao: '\\n',\n          oaot: '    ',\n          obc: '\\n',\n          oac: '\\n',\n          oact: '    '\n        },\n        {\n          //None tries not to touch brace style so all the tests in this\n          //matrix were formatted as if they were collapse\n          options: [\n            { name: \"brace_style\", value: \"'none,preserve-inline'\" }\n          ],\n          obo: ' ',\n          obot: '',\n          oao: '\\n',\n          oaot: '    ',\n          obc: '\\n',\n          oac: ' ',\n          oact: ''\n        },\n        //Test for backward compatibility\n        {\n          options: [\n            { name: \"brace_style\", value: \"'collapse-preserve-inline'\" }\n          ],\n          //Equivalent to the output of the first test\n          obo: ' ',\n          obot: '',\n          oao: '\\n',\n          oaot: '    ',\n          obc: '\\n',\n          oac: ' ',\n          oact: ''\n        }\n      ],\n      tests: [\n        //Test single inline blocks\n        {\n          unchanged: 'import { asdf } from \"asdf\";'\n        },\n        {\n          unchanged: 'import { get } from \"asdf\";'\n        },\n        {\n          unchanged: 'function inLine() { console.log(\"oh em gee\"); }'\n        },\n        {\n          unchanged: 'if (cancer) { console.log(\"Im sorry but you only have so long to live...\"); }'\n        },\n        //Test more complex inliners\n        {\n          input: 'if (ding) { console.log(\"dong\"); } else { console.log(\"dang\"); }',\n          output: 'if (ding) { console.log(\"dong\"); }<oac>else { console.log(\"dang\"); }'\n        },\n        //Test complex mixes of the two\n        {\n          //The outer function and the third object (obj3) should not\n          //be preserved. All other objects should be\n          input: [\n            'function kindaComplex() {',\n            '    var a = 2;',\n            '    var obj = {};',\n            '    var obj2 = { a: \"a\", b: \"b\" };',\n            '    var obj3 = {',\n            '        c: \"c\",',\n            '        d: \"d\",',\n            '        e: \"e\"',\n            '    };',\n            '}'\n          ],\n          output: [\n            'function kindaComplex()<obo>{<oao>' + //NL in templates\n            '<oaot>var a = 2;',\n            '    var obj = {};',\n            '    var obj2 = { a: \"a\", b: \"b\" };',\n            '    var obj3 = {<oao>' + //NL in templates, Expand doesnt affect js objects\n            '<oaot><oaot>c: \"c\",',\n            '        d: \"d\",',\n            '        e: \"e\"' + //NL in templates\n            '<obc>    };' + //NL in templates\n            '<obc>}'\n          ]\n        },\n        {\n          //All inlines should be preserved, all non-inlines (specifically\n          //complex(), obj, and obj.b should not be preserved (and hence\n          //have the template spacing defined in output)\n          input: [\n            'function complex() {',\n            '    console.log(\"wowe\");',\n            '    (function() { var a = 2; var b = 3; })();',\n            '    $.each(arr, function(el, idx) { return el; });',\n            '    var obj = {',\n            '        a: function() { console.log(\"test\"); },',\n            '        b() {',\n            '             console.log(\"test2\");',\n            '        }',\n            '    };',\n            '}'\n\n          ],\n          output: [\n            'function complex()<obo>{<oao>' + //NL in templates\n            '<oaot>console.log(\"wowe\");',\n            '    (function() { var a = 2; var b = 3; })();',\n            '    $.each(arr, function(el, idx) { return el; });',\n            '    var obj = {<oao>' + //NL in templates\n            '<oaot><oaot>a: function() { console.log(\"test\"); },',\n            '        b()<obo><obot><obot>{<oao>' + //NL in templates\n            '<oaot><oaot><oaot>console.log(\"test2\");' + '<obc>        }' + //NL in templates\n            '<obc>    };' + //NL in templates\n            '<obc>}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Destructured and related\",\n      description: \"Ensure specific bugs do not recur\",\n      options: [\n        { name: \"brace_style\", value: \"'collapse,preserve-inline'\" }\n      ], //Issue 1052, now collapse,preserve-inline instead of collapse-preserve-inline\n      tests: [{\n          comment: \"Issue 382 - import destructured \",\n          unchanged: [\n            'module \"Even\" {',\n            '    import { odd, oddly } from \"Odd\";',\n            '}'\n          ]\n        },\n        {\n          unchanged: [\n            'import defaultMember from \"module-name\";',\n            'import * as name from \"module-name\";',\n            'import { member } from \"module-name\";',\n            'import { member as alias } from \"module-name\";',\n            'import { member1, member2 } from \"module-name\";',\n            'import { member1, member2 as alias2 } from \"module-name\";',\n            'import defaultMember, { member, member2 } from \"module-name\";',\n            'import defaultMember, * as name from \"module-name\";',\n            'import \"module-name\";',\n            'import(\"module-name\")'\n          ]\n        },\n        {\n          comment: \"Issue #1393 - dynamic import()\",\n          unchanged: [\n            'if (from < to) {',\n            '    import(`dynamic${library}`);',\n            '} else {',\n            '    import(\"otherdynamic\");',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1197 - dynamic import() arrow syntax\",\n          input: 'frontend = Async(() => import(\"../frontend\").then(m => m.default      ))',\n          output: 'frontend = Async(() => import(\"../frontend\").then(m => m.default))'\n        },\n        {\n          comment: \"Issue #1978 - import.meta syntax support\",\n          input: 'let       x =      import.meta',\n          output: 'let x = import.meta'\n        },\n        {\n          comment: \"Issue 858 - from is a keyword only after import\",\n          unchanged: [\n            'if (from < to) {',\n            '    from++;',\n            '} else {',\n            '    from--;',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 511 - destrutured\",\n          unchanged: [\n            'var { b, c } = require(\"../stores\");',\n            'var { ProjectStore } = require(\"../stores\");',\n            '',\n            'function takeThing({ prop }) {',\n            '    console.log(\"inner prop\", prop)',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 315 - Short objects\",\n          unchanged: [\n            'var a = { b: { c: { d: e } } };'\n          ]\n        },\n        {\n          unchanged: [\n            'var a = {',\n            '    b: {',\n            '        c: { d: e }',\n            '        c3: { d: e }',\n            '    },',\n            '    b2: { c: { d: e } }',\n            '};'\n          ]\n        },\n        {\n          comment: \"Issue 370 - Short objects in array\",\n          unchanged: [\n            'var methods = [',\n            '    { name: \"to\" },',\n            '    { name: \"step\" },',\n            '    { name: \"move\" },',\n            '    { name: \"min\" },',\n            '    { name: \"max\" }',\n            '];'\n          ]\n        },\n        {\n          comment: \"Issue 838 - Short objects in array\",\n          unchanged: [\n            'function(url, callback) {',\n            '    var script = document.createElement(\"script\")',\n            '    if (true) script.onreadystatechange = function() {',\n            '        foo();',\n            '    }',\n            '    else script.onload = callback;',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue 578 - Odd indenting after function\",\n          unchanged: [\n            'function bindAuthEvent(eventName) {',\n            '    self.auth.on(eventName, function(event, meta) {',\n            '        self.emit(eventName, event, meta);',\n            '    });',\n            '}',\n            '[\"logged_in\", \"logged_out\", \"signed_up\", \"updated_user\"].forEach(bindAuthEvent);'\n          ]\n        },\n        {\n          comment: \"Issue #487 - some short expressions examples\",\n          unchanged: [\n            'if (a == 1) { a++; }',\n            'a = { a: a };',\n            'UserDB.findOne({ username: \"xyz\" }, function(err, user) {});',\n            'import { fs } from \"fs\";'\n          ]\n        },\n        {\n          comment: \"Issue #982 - Fixed return expression collapse-preserve-inline\",\n          unchanged: [\n            'function foo(arg) {',\n            '    if (!arg) { a(); }',\n            '    if (!arg) { return false; }',\n            '    if (!arg) { throw \"inline\"; }',\n            '    return true;',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #338 - Short expressions \",\n          unchanged: [\n            'if (someCondition) { return something; }',\n            'if (someCondition) {',\n            '    return something;',\n            '}',\n            'if (someCondition) { break; }',\n            'if (someCondition) {',\n            '    return something;',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1283 - Javascript ++ Operator get wrong indent \",\n          input: [\n            '{this.foo++',\n            'bar}'\n          ],\n          output: [\n            '{',\n            '    this.foo++',\n            '    bar',\n            '}'\n          ]\n        },\n        {\n          comment: \"Issue #1283 - Javascript ++ Operator get wrong indent (2)\",\n          unchanged: [\n            'axios.interceptors.request.use(',\n            '    config => {',\n            '        // loading',\n            '        window.store.loading++',\n            '        let extraParams = {}',\n            '    }',\n            ')'\n          ]\n        },\n        {\n          comment: \"Issue ##1846 - in keyword in class method causes indentation problem\",\n          input: [\n            'class {',\n            '  get a() {',\n            '\\n',\n            '  }',\n            '\\n',\n            '  in() {',\n            '\\n',\n            '  }',\n            '\\n',\n            '  b() {',\n            '\\n',\n            '  }',\n            '}'\n          ],\n          output: [\n            'class {',\n            '    get a() {',\n            '\\n',\n            '    }',\n            '\\n',\n            '    in() {',\n            '\\n',\n            '    }',\n            '\\n',\n            '    b() {',\n            '\\n',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: \"Related to Issue ##1846 - Do not indent 'in' keyword if not a class method\",\n          input: [\n            'function test() {',\n            'for x in nums {}',\n            '\"make\" in car',\n            '3 in number;',\n            '}'\n          ],\n          output: [\n            'function test() {',\n            '    for x in nums {}',\n            '    \"make\" in car',\n            '    3 in number;',\n            '}'\n          ]\n        },\n        {\n          comment: \"Related to Issue ##1846 - of keyword in class method causes indentation problem\",\n          input: [\n            'class {',\n            '  get a() {',\n            '\\n',\n            '  }',\n            '\\n',\n            '  of() {',\n            '\\n',\n            '  }',\n            '\\n',\n            '  b() {',\n            '\\n',\n            '  }',\n            '}'\n          ],\n          output: [\n            'class {',\n            '    get a() {',\n            '\\n',\n            '    }',\n            '\\n',\n            '    of() {',\n            '\\n',\n            '    }',\n            '\\n',\n            '    b() {',\n            '\\n',\n            '    }',\n            '}'\n          ]\n        },\n        {\n          comment: 'Issue #1950: Do not remove whitespace after number - test scenario: number before a dot',\n          input: '1000000000000001000 .toFixed(0)!==1000000000000001024',\n          output: '1000000000000001000 .toFixed(0) !== 1000000000000001024'\n        },\n        {\n          comment: 'Issue #1950: Do not remove whitespace after number - test scenario: variable ends with a number before a dot',\n          input: 'a.b21 . performAction()',\n          output: 'a.b21.performAction()'\n        }\n      ]\n    }, {\n      name: \"keep_array_indentation false\",\n      description: \"\",\n      options: [\n        { name: \"keep_array_indentation\", value: \"false\" }\n      ],\n      tests: [{\n          input: 'a  = [\"a\", \"b\", \"c\",\\n   \"d\", \"e\", \"f\"]',\n          output: 'a = [\"a\", \"b\", \"c\",\\n    \"d\", \"e\", \"f\"\\n]'\n        },\n        {\n          input: 'a  = [\"a\", \"b\", \"c\",\\n   \"d\", \"e\", \"f\",\\n        \"g\", \"h\", \"i\"]',\n          output: 'a = [\"a\", \"b\", \"c\",\\n    \"d\", \"e\", \"f\",\\n    \"g\", \"h\", \"i\"\\n]'\n        },\n        {\n          input: 'a  = [\"a\", \"b\", \"c\",\\n       \"d\", \"e\", \"f\",\\n            \"g\", \"h\", \"i\"]',\n          output: 'a = [\"a\", \"b\", \"c\",\\n    \"d\", \"e\", \"f\",\\n    \"g\", \"h\", \"i\"\\n]'\n        },\n        {\n          input: 'var  x = [{}\\n]',\n          output: 'var x = [{}]'\n        },\n        {\n          input: 'var x = [{foo:bar}\\n]',\n          output: 'var x = [{\\n    foo: bar\\n}]'\n        },\n        {\n          input: 'a  = [\"something\",\\n    \"completely\",\\n    \"different\"];\\nif (x);',\n          output: 'a = [\"something\",\\n    \"completely\",\\n    \"different\"\\n];\\nif (x);'\n        },\n        {\n          input: 'a = [\"a\",\"b\",\"c\"]',\n          output: 'a = [\"a\", \"b\", \"c\"]'\n        },\n\n        {\n          input: 'a = [\"a\",   \"b\",\"c\"]',\n          output: 'a = [\"a\", \"b\", \"c\"]'\n        },\n        {\n          input: 'x = [{\"a\":0}]',\n          output: 'x = [{\\n    \"a\": 0\\n}]'\n        },\n        {\n          input: '{a([[a1]], {b;});}',\n          output: '{\\n    a([\\n        [a1]\\n    ], {\\n        b;\\n    });\\n}'\n        },\n        {\n          input: 'a ();\\n   [\\n   [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n   ].toString();',\n          output: 'a();\\n[\\n    [\"sdfsdfsd\"],\\n    [\"sdfsdfsdf\"]\\n].toString();'\n        },\n        {\n          input: 'a ();\\na = [\\n   [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n   ].toString();',\n          output: 'a();\\na = [\\n    [\"sdfsdfsd\"],\\n    [\"sdfsdfsdf\"]\\n].toString();'\n        },\n        {\n          input: 'function()  {\\n    Foo([\\n        [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n    ]);\\n}',\n          output: 'function() {\\n    Foo([\\n        [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n    ]);\\n}'\n        },\n        {\n          input: 'function  foo() {\\n    return [\\n        \"one\",\\n        \"two\"\\n    ];\\n}',\n          output: 'function foo() {\\n    return [\\n        \"one\",\\n        \"two\"\\n    ];\\n}'\n        },\n        // 4 spaces per indent input, processed with 4-spaces per indent\n        {\n          input: [\n            'function foo() {',\n            '    return [',\n            '        {',\n            '            one: \"x\",',\n            '            two: [',\n            '                {',\n            '                    id: \"a\",',\n            '                    name: \"apple\"',\n            '                }, {',\n            '                    id: \"b\",',\n            '                    name: \"banana\"',\n            '                }',\n            '            ]',\n            '        }',\n            '    ];',\n            '}'\n          ],\n          output: [\n            'function foo() {',\n            '    return [{',\n            '        one: \"x\",',\n            '        two: [{',\n            '            id: \"a\",',\n            '            name: \"apple\"',\n            '        }, {',\n            '            id: \"b\",',\n            '            name: \"banana\"',\n            '        }]',\n            '    }];',\n            '}'\n          ]\n        },\n        // 3 spaces per indent input, processed with 4-spaces per indent\n        {\n          input: [\n            'function foo() {',\n            '   return [',\n            '      {',\n            '         one: \"x\",',\n            '         two: [',\n            '            {',\n            '               id: \"a\",',\n            '               name: \"apple\"',\n            '            }, {',\n            '               id: \"b\",',\n            '               name: \"banana\"',\n            '            }',\n            '         ]',\n            '      }',\n            '   ];',\n            '}'\n          ],\n          output: [\n            'function foo() {',\n            '    return [{',\n            '        one: \"x\",',\n            '        two: [{',\n            '            id: \"a\",',\n            '            name: \"apple\"',\n            '        }, {',\n            '            id: \"b\",',\n            '            name: \"banana\"',\n            '        }]',\n            '    }];',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"keep_array_indentation true\",\n      description: \"\",\n      options: [\n        { name: \"keep_array_indentation\", value: \"true\" }\n      ],\n      tests: [{\n          input: 'a  = [\"a\", \"b\", \"c\",\\n   \"d\", \"e\", \"f\"]',\n          output: 'a = [\"a\", \"b\", \"c\",\\n   \"d\", \"e\", \"f\"]'\n        },\n        {\n          input: 'a  = [\"a\", \"b\", \"c\",\\n   \"d\", \"e\", \"f\",\\n        \"g\", \"h\", \"i\"]',\n          output: 'a = [\"a\", \"b\", \"c\",\\n   \"d\", \"e\", \"f\",\\n        \"g\", \"h\", \"i\"]'\n        },\n        {\n          input: 'a  = [\"a\", \"b\", \"c\",\\n       \"d\", \"e\", \"f\",\\n            \"g\", \"h\", \"i\"]',\n          output: 'a = [\"a\", \"b\", \"c\",\\n       \"d\", \"e\", \"f\",\\n            \"g\", \"h\", \"i\"]'\n        },\n        {\n          input: 'var  x = [{}\\n]',\n          output: 'var x = [{}\\n]'\n        },\n        {\n          input: 'var x = [{foo:bar}\\n]',\n          output: 'var x = [{\\n        foo: bar\\n    }\\n]'\n        },\n        {\n          input: 'a  = [\"something\",\\n    \"completely\",\\n    \"different\"];\\nif (x);',\n          output: 'a = [\"something\",\\n    \"completely\",\\n    \"different\"];\\nif (x);'\n        },\n        {\n          input: 'a = [\"a\",\"b\",\"c\"]',\n          output: 'a = [\"a\", \"b\", \"c\"]'\n        },\n\n        {\n          input: 'a = [\"a\",   \"b\",\"c\"]',\n          output: 'a = [\"a\", \"b\", \"c\"]'\n        },\n        {\n          input: 'x = [{\"a\":0}]',\n          output: 'x = [{\\n    \"a\": 0\\n}]'\n        },\n        {\n          input: '{a([[a1]], {b;});}',\n          output: '{\\n    a([[a1]], {\\n        b;\\n    });\\n}'\n        },\n        {\n          input: 'a ();\\n   [\\n   [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n   ].toString();',\n          output: 'a();\\n   [\\n   [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n   ].toString();'\n        },\n        {\n          input: 'a ();\\na = [\\n   [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n   ].toString();',\n          output: 'a();\\na = [\\n   [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n   ].toString();'\n        },\n        {\n          input: 'function()  {\\n    Foo([\\n        [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n    ]);\\n}',\n          output: 'function() {\\n    Foo([\\n        [\"sdfsdfsd\"],\\n        [\"sdfsdfsdf\"]\\n    ]);\\n}'\n        },\n        {\n          input: 'function  foo() {\\n    return [\\n        \"one\",\\n        \"two\"\\n    ];\\n}',\n          output: 'function foo() {\\n    return [\\n        \"one\",\\n        \"two\"\\n    ];\\n}'\n        },\n        // 4 spaces per indent input, processed with 4-spaces per indent\n        {\n          input: [\n            'function  foo() {',\n            '    return [',\n            '        {',\n            '            one: \"x\",',\n            '            two: [',\n            '                {',\n            '                    id: \"a\",',\n            '                    name: \"apple\"',\n            '                }, {',\n            '                    id: \"b\",',\n            '                    name: \"banana\"',\n            '                }',\n            '            ]',\n            '        }',\n            '    ];',\n            '}'\n          ],\n          output: [\n            'function foo() {',\n            '    return [',\n            '        {',\n            '            one: \"x\",',\n            '            two: [',\n            '                {',\n            '                    id: \"a\",',\n            '                    name: \"apple\"',\n            '                }, {',\n            '                    id: \"b\",',\n            '                    name: \"banana\"',\n            '                }',\n            '            ]',\n            '        }',\n            '    ];',\n            '}'\n          ]\n        }\n        //,\n        // 3 spaces per indent input, processed with 4-spaces per indent\n        // {\n        //   input: [\n        //     'function foo() {',\n        //     '   return [',\n        //     '      {',\n        //     '         one: \"x\",',\n        //     '         two: [',\n        //     '            {',\n        //     '               id: \"a\",',\n        //     '               name: \"apple\"',\n        //     '            }, {',\n        //     '               id: \"b\",',\n        //     '               name: \"banana\"',\n        //     '            }',\n        //     '         ]',\n        //     '      }',\n        //     '   ];',\n        //     '}'\n        //   ],\n        //   output: [\n        //     'function foo() {',\n        //     '    return [{',\n        //     '        one: \"x\",',\n        //     '        two: [{',\n        //     '            id: \"a\",',\n        //     '            name: \"apple\"',\n        //     '        }, {',\n        //     '            id: \"b\",',\n        //     '            name: \"banana\"',\n        //     '        }]',\n        //     '    }];',\n        //     '}'\n        //   ]\n        // }\n      ]\n    }, {\n      name: \"indent_empty_lines true\",\n      description: \"\",\n      options: [\n        { name: \"indent_empty_lines\", value: \"true\" }\n      ],\n      // NOTE: all of these tests must be \"fragment: true\", so that the\n      //       test framework doesn't try additional permutations based\n      //       on these inputs.\n      tests: [{\n          fragment: true,\n          unchanged: [\n            'var a = 1;',\n            '',\n            'var b = 1;'\n          ]\n        },\n        {\n          fragment: true,\n          input: [\n            'var a = 1;',\n            '        ',\n            'var b = 1;'\n          ],\n          output: [\n            'var a = 1;',\n            '',\n            'var b = 1;'\n          ]\n        },\n        {\n          fragment: true,\n          input: [\n            '{',\n            '    var a = 1;',\n            '        ',\n            '    var b = 1;',\n            '',\n            '}'\n          ],\n          output: [\n            '{',\n            '    var a = 1;',\n            '    ',\n            '    var b = 1;',\n            '    ',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: [\n            '{',\n            '',\n            '    var a = 1;',\n            '',\n            '',\n            '',\n            '    var b = 1;',\n            '',\n            '}'\n          ],\n          output: [\n            '{',\n            '    ',\n            '    var a = 1;',\n            '    ',\n            '    ',\n            '    ',\n            '    var b = 1;',\n            '    ',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: [\n            '{',\n            '',\n            '    var a = 1;',\n            '',\n            'function A() {',\n            '',\n            '}',\n            '',\n            '    var b = 1;',\n            '',\n            '}'\n          ],\n          output: [\n            '{',\n            '    ',\n            '    var a = 1;',\n            '    ',\n            '    function A() {',\n            '        ',\n            '    }',\n            '    ',\n            '    var b = 1;',\n            '    ',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"indent_empty_lines false\",\n      description: \"\",\n      options: [\n        { name: \"indent_empty_lines\", value: \"false\" }\n      ],\n      // NOTE: all of these tests must be \"fragment: true\", so that the\n      //       test framework doesn't try additional permutations based\n      //       on these inputs.\n      tests: [{\n          fragment: true,\n          unchanged: [\n            'var a = 1;',\n            '',\n            'var b = 1;'\n          ]\n        },\n        {\n          fragment: true,\n          input: [\n            'var a = 1;',\n            '        ',\n            'var b = 1;'\n          ],\n          output: [\n            'var a = 1;',\n            '',\n            'var b = 1;'\n          ]\n        },\n        {\n          fragment: true,\n          input: [\n            '{',\n            '    var a = 1;',\n            '        ',\n            '    var b = 1;',\n            '',\n            '}'\n          ],\n          output: [\n            '{',\n            '    var a = 1;',\n            '',\n            '    var b = 1;',\n            '',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          unchanged: [\n            '{',\n            '',\n            '    var a = 1;',\n            '',\n            '',\n            '',\n            '    var b = 1;',\n            '',\n            '}'\n          ]\n        },\n        {\n          fragment: true,\n          input: [\n            '{',\n            '',\n            '    var a = 1;',\n            '',\n            'function A() {',\n            '',\n            '}',\n            '',\n            '    var b = 1;',\n            '',\n            '}'\n          ],\n          output: [\n            '{',\n            '',\n            '    var a = 1;',\n            '',\n            '    function A() {',\n            '',\n            '    }',\n            '',\n            '    var b = 1;',\n            '',\n            '}'\n          ]\n        }\n      ]\n    }, {\n      name: \"Record data type\",\n      description: \"\",\n      tests: [{\n          comment: 'regular record with primitive',\n          input: 'a = #{ b:\"c\", d:1, e:true };',\n          output: [\n            'a = #{',\n            '    b: \"c\",',\n            '    d: 1,',\n            '    e: true',\n            '};'\n          ]\n        },\n        {\n          comment: 'nested record',\n          input: 'a = #{b:#{ c:1,d:2,}, e:\"f\"};',\n          output: [\n            'a = #{',\n            '    b: #{',\n            '        c: 1,',\n            '        d: 2,',\n            '    },',\n            '    e: \"f\"',\n            '};'\n          ]\n        },\n        {\n          comment: '# not directly followed by { is not handled as record',\n          unchanged: [\n            'a = # {',\n            '    b: 1,',\n            '    d: true',\n            '};'\n          ]\n        },\n        {\n          comment: 'example of already valid and beautified record',\n          unchanged: [\n            'a = #{',\n            '    b: 1,',\n            '    d: true',\n            '};'\n          ]\n        }\n      ]\n    }, {\n      // =======================================================\n      // New tests groups should be added above this line.\n      // Everything below is a work in progress - converting\n      // old test to generated form.\n      // =======================================================\n      name: \"Old tests\",\n      description: \"Largely unorganized pile of tests\",\n      options: [],\n      tests: [\n        { unchanged: '' },\n        { fragment: true, unchanged: '   return .5' },\n        { fragment: true, unchanged: '   return .5;\\n   a();' },\n        { fragment: true, unchanged: '    return .5;\\n    a();' },\n        { fragment: true, unchanged: '     return .5;\\n     a();' },\n        { fragment: true, unchanged: '   < div' },\n        { input: 'a        =          1', output: 'a = 1' },\n        { input: 'a=1', output: 'a = 1' },\n        { unchanged: '(3) / 2' },\n        { unchanged: '[\"a\", \"b\"].join(\"\")' },\n        { unchanged: 'a();\\n\\nb();' },\n        { input: 'var a = 1 var b = 2', output: 'var a = 1\\nvar b = 2' },\n        { input: 'var a=1, b=c[d], e=6;', output: 'var a = 1,\\n    b = c[d],\\n    e = 6;' },\n        { unchanged: 'var a,\\n    b,\\n    c;' },\n        { input: 'let a = 1 let b = 2', output: 'let a = 1\\nlet b = 2' },\n        { input: 'let a=1, b=c[d], e=6;', output: 'let a = 1,\\n    b = c[d],\\n    e = 6;' },\n        { unchanged: 'let a,\\n    b,\\n    c;' },\n        { input: 'const a = 1 const b = 2', output: 'const a = 1\\nconst b = 2' },\n        { input: 'const a=1, b=c[d], e=6;', output: 'const a = 1,\\n    b = c[d],\\n    e = 6;' },\n        { unchanged: 'const a,\\n    b,\\n    c;' },\n        { unchanged: 'a = \" 12345 \"' },\n        { unchanged: \"a = \\\\' 12345 \\\\'\" },\n        { unchanged: 'if (a == 1) b = 2;' },\n        { input: 'if(1){2}else{3}', output: 'if (1) {\\n    2\\n} else {\\n    3\\n}' },\n        { input: 'if(1||2);', output: 'if (1 || 2);' },\n        { input: '(a==1)||(b==2)', output: '(a == 1) || (b == 2)' },\n        { input: 'var a = 1 if (2) 3;', output: 'var a = 1\\nif (2) 3;' },\n        { unchanged: 'a = a + 1' },\n        { unchanged: 'a = a == 1' },\n        { unchanged: '/12345[^678]*9+/.match(a)' },\n        { unchanged: 'a /= 5' },\n        { unchanged: 'a = 0.5 * 3' },\n        { unchanged: 'a *= 10.55' },\n        { unchanged: 'a < .5' },\n        { unchanged: 'a <= .5' },\n        { input: 'a<.5', output: 'a < .5' },\n        { input: 'a<=.5', output: 'a <= .5' },\n        { unchanged: 'a = [1, 2, 3, 4]' },\n        { input: 'F*(g/=f)*g+b', output: 'F * (g /= f) * g + b' },\n        { input: 'a.b({c:d})', output: 'a.b({\\n    c: d\\n})' },\n        { input: 'a.b\\n(\\n{\\nc:\\nd\\n}\\n)', output: 'a.b({\\n    c: d\\n})' },\n        { input: 'a.b({c:\"d\"})', output: 'a.b({\\n    c: \"d\"\\n})' },\n        { input: 'a.b\\n(\\n{\\nc:\\n\"d\"\\n}\\n)', output: 'a.b({\\n    c: \"d\"\\n})' },\n        { input: 'a=!b', output: 'a = !b' },\n        { input: 'a=!!b', output: 'a = !!b' },\n        { input: 'a?b:c', output: 'a ? b : c' },\n        { input: 'a?1:2', output: 'a ? 1 : 2' },\n        { input: 'a?(b):c', output: 'a ? (b) : c' },\n        { input: 'x={a:1,b:w==\"foo\"?x:y,c:z}', output: 'x = {\\n    a: 1,\\n    b: w == \"foo\" ? x : y,\\n    c: z\\n}' },\n        { input: 'x=a?b?c?d:e:f:g;', output: 'x = a ? b ? c ? d : e : f : g;' },\n        { input: 'x=a?b?c?d:{e1:1,e2:2}:f:g;', output: 'x = a ? b ? c ? d : {\\n    e1: 1,\\n    e2: 2\\n} : f : g;' },\n        { unchanged: 'function void(void) {}' },\n        { input: 'if(!a)foo();', output: 'if (!a) foo();' },\n        { input: 'a=~a', output: 'a = ~a' },\n        { input: 'a;/*comment*/b;', output: \"a; /*comment*/\\nb;\" },\n        { input: 'a;/* comment */b;', output: \"a; /* comment */\\nb;\" },\n        { fragment: true, input: 'a;/*\\ncomment\\n*/b;', output: \"a;\\n/*\\ncomment\\n*/\\nb;\", comment: \"simple comments don't get touched at all\" },\n        { input: 'a;/**\\n* javadoc\\n*/b;', output: \"a;\\n/**\\n * javadoc\\n */\\nb;\" },\n        { fragment: true, input: 'a;/**\\n\\nno javadoc\\n*/b;', output: \"a;\\n/**\\n\\nno javadoc\\n*/\\nb;\" },\n        { input: 'a;/*\\n* javadoc\\n*/b;', output: \"a;\\n/*\\n * javadoc\\n */\\nb;\", comment: 'comment blocks detected and reindented even w/o javadoc starter' },\n        { input: 'if(a)break;', output: \"if (a) break;\" },\n        { input: 'if(a){break}', output: \"if (a) {\\n    break\\n}\" },\n        { input: 'if((a))foo();', output: 'if ((a)) foo();' },\n        { input: 'for(var i=0;;) a', output: 'for (var i = 0;;) a' },\n        { input: 'for(var i=0;;)\\na', output: 'for (var i = 0;;)\\n    a' },\n        { unchanged: 'a++;' },\n        { input: 'for(;;i++)a()', output: 'for (;; i++) a()' },\n        { input: 'for(;;i++)\\na()', output: 'for (;; i++)\\n    a()' },\n        { input: 'for(;;++i)a', output: 'for (;; ++i) a' },\n        { input: 'return(1)', output: 'return (1)' },\n        { input: 'try{a();}catch(b){c();}finally{d();}', output: \"try {\\n    a();\\n} catch (b) {\\n    c();\\n} finally {\\n    d();\\n}\" },\n        { unchanged: '(xx)()', comment: ' magic function call' },\n        { unchanged: 'a[1]()', comment: 'another magic function call' },\n        { input: 'if(a){b();}else if(c) foo();', output: \"if (a) {\\n    b();\\n} else if (c) foo();\" },\n        { input: 'switch(x) {case 0: case 1: a(); break; default: break}', output: \"switch (x) {\\n    case 0:\\n    case 1:\\n        a();\\n        break;\\n    default:\\n        break\\n}\" },\n\n        { input: 'switch(x) {default: case 1: a(); break; case 0: break}', output: \"switch (x) {\\n    default:\\n    case 1:\\n        a();\\n        break;\\n    case 0:\\n        break\\n}\" },\n\n        { input: 'switch(x){case -1:break;case !y:break;}', output: 'switch (x) {\\n    case -1:\\n        break;\\n    case !y:\\n        break;\\n}' },\n        { unchanged: 'a !== b' },\n        { input: 'if (a) b(); else c();', output: \"if (a) b();\\nelse c();\" },\n        { unchanged: \"// comment\\n(function something() {})\", comment: 'typical greasemonkey start' },\n        { unchanged: \"{\\n\\n    x();\\n\\n}\", comment: 'duplicating newlines' },\n        { unchanged: 'if (a in b) foo();' },\n        { unchanged: 'if (a of b) foo();' },\n        { unchanged: 'if (a of [1, 2, 3]) foo();' },\n        {\n          input: 'if(X)if(Y)a();else b();else c();',\n          output: \"if (X)\\n    if (Y) a();\\n    else b();\\nelse c();\"\n        },\n        { unchanged: 'if (foo) bar();\\nelse break' },\n        { unchanged: 'var a, b;' },\n        { unchanged: 'var a = new function();' },\n        { fragment: true, unchanged: 'new function' },\n        { unchanged: 'var a, b' },\n        { input: '{a:1, b:2}', output: \"{\\n    a: 1,\\n    b: 2\\n}\" },\n        { input: 'a={1:[-1],2:[+1]}', output: 'a = {\\n    1: [-1],\\n    2: [+1]\\n}' },\n        { input: \"var l = {\\\\'a\\\\':\\\\'1\\\\', \\\\'b\\\\':\\\\'2\\\\'}\", output: \"var l = {\\n    \\\\'a\\\\': \\\\'1\\\\',\\n    \\\\'b\\\\': \\\\'2\\\\'\\n}\" },\n        { unchanged: 'if (template.user[n] in bk) foo();' },\n        { unchanged: 'return 45' },\n        { unchanged: 'return this.prevObject ||\\n\\n    this.constructor(null);' },\n        { unchanged: 'If[1]' },\n        { unchanged: 'Then[1]' },\n        { input: \"a = 1;// comment\", output: \"a = 1; // comment\" },\n        { unchanged: \"a = 1; // comment\" },\n        { input: \"a = 1;\\n // comment\", output: \"a = 1;\\n// comment\" },\n        { unchanged: 'a = [-1, -1, -1]' },\n\n        // These must work as non-fragments.\n        { unchanged: ['// a', '// b', '', '', '', '// c', '// d'] },\n        { unchanged: ['// func-comment', '', 'function foo() {}', '', '// end-func-comment'] },\n\n        {\n          comment: 'The exact formatting these should have is open for discussion, but they are at least reasonable',\n          unchanged: 'a = [ // comment\\n    -1, -1, -1\\n]'\n        },\n        { unchanged: 'var a = [ // comment\\n    -1, -1, -1\\n]' },\n        { unchanged: 'a = [ // comment\\n    -1, // comment\\n    -1, -1\\n]' },\n        { unchanged: 'var a = [ // comment\\n    -1, // comment\\n    -1, -1\\n]' },\n\n        { input: 'o = [{a:b},{c:d}]', output: 'o = [{\\n    a: b\\n}, {\\n    c: d\\n}]' },\n\n        {\n          comment: 'was: extra space appended',\n          unchanged: \"if (a) {\\n    do();\\n}\"\n        },\n\n        {\n          comment: 'if/else statement with empty body',\n          input: \"if (a) {\\n// comment\\n}else{\\n// comment\\n}\",\n          output: \"if (a) {\\n    // comment\\n} else {\\n    // comment\\n}\"\n        },\n        { comment: 'multiple comments indentation', input: \"if (a) {\\n// comment\\n// comment\\n}\", output: \"if (a) {\\n    // comment\\n    // comment\\n}\" },\n        { input: \"if (a) b() else c();\", output: \"if (a) b()\\nelse c();\" },\n        { input: \"if (a) b() else if c() d();\", output: \"if (a) b()\\nelse if c() d();\" },\n\n        { unchanged: \"{}\" },\n        { unchanged: \"{\\n\\n}\" },\n        { input: \"do { a(); } while ( 1 );\", output: \"do {\\n    a();\\n} while (1);\" },\n        { unchanged: \"do {} while (1);\" },\n        { input: \"do {\\n} while (1);\", output: \"do {} while (1);\" },\n        { unchanged: \"do {\\n\\n} while (1);\" },\n        { unchanged: \"var a = x(a, b, c)\" },\n        { input: \"delete x if (a) b();\", output: \"delete x\\nif (a) b();\" },\n        { input: \"delete x[x] if (a) b();\", output: \"delete x[x]\\nif (a) b();\" },\n        { input: \"for(var a=1,b=2)d\", output: \"for (var a = 1, b = 2) d\" },\n        { input: \"for(var a=1,b=2,c=3) d\", output: \"for (var a = 1, b = 2, c = 3) d\" },\n        { input: \"for(var a=1,b=2,c=3;d<3;d++)\\ne\", output: \"for (var a = 1, b = 2, c = 3; d < 3; d++)\\n    e\" },\n        { input: \"function x(){(a||b).c()}\", output: \"function x() {\\n    (a || b).c()\\n}\" },\n        { input: \"function x(){return - 1}\", output: \"function x() {\\n    return -1\\n}\" },\n        { input: \"function x(){return ! a}\", output: \"function x() {\\n    return !a\\n}\" },\n        { unchanged: \"x => x\" },\n        { unchanged: \"(x) => x\" },\n        { input: \"x => { x }\", output: \"x => {\\n    x\\n}\" },\n        { input: \"(x) => { x }\", output: \"(x) => {\\n    x\\n}\" },\n\n        {\n          comment: 'a common snippet in jQuery plugins',\n          input_: \"settings = $.extend({},defaults,settings);\",\n          output: \"settings = $.extend({}, defaults, settings);\"\n        },\n\n        // reserved words used as property names\n        { unchanged: \"$http().then().finally().default()\" },\n        { input: \"$http()\\n.then()\\n.finally()\\n.default()\", output: \"$http()\\n    .then()\\n    .finally()\\n    .default()\" },\n        { unchanged: \"$http().when.in.new.catch().throw()\" },\n        { input: \"$http()\\n.when\\n.in\\n.new\\n.catch()\\n.throw()\", output: \"$http()\\n    .when\\n    .in\\n    .new\\n    .catch()\\n    .throw()\" },\n\n        { input: '{xxx;}()', output: '{\\n    xxx;\\n}()' },\n\n        { unchanged: \"a = \\\\'a\\\\'\\nb = \\\\'b\\\\'\" },\n        { unchanged: \"a = /reg/exp\" },\n        { unchanged: \"a = /reg/\" },\n        { unchanged: '/abc/.test()' },\n        { unchanged: '/abc/i.test()' },\n        { input: \"{/abc/i.test()}\", output: \"{\\n    /abc/i.test()\\n}\" },\n        { input: 'var x=(a)/a;', output: 'var x = (a) / a;' },\n\n        { unchanged: 'x != -1' },\n\n        { input: 'for (; s-->0;)t', output: 'for (; s-- > 0;) t' },\n        { input: 'for (; s++>0;)u', output: 'for (; s++ > 0;) u' },\n        { input: 'a = s++>s--;', output: 'a = s++ > s--;' },\n        { input: 'a = s++>--s;', output: 'a = s++ > --s;' },\n\n        { input: '{x=#1=[]}', output: '{\\n    x = #1=[]\\n}' },\n        { input: '{a:#1={}}', output: '{\\n    a: #1={}\\n}' },\n        { input: '{a:#1#}', output: '{\\n    a: #1#\\n}' },\n\n        { fragment: true, unchanged: '\"incomplete-string' },\n        { fragment: true, unchanged: \"\\\\'incomplete-string\" },\n        { fragment: true, unchanged: '/incomplete-regex' },\n        { fragment: true, unchanged: '`incomplete-template-string' },\n\n        { fragment: true, input: '{a:1},{a:2}', output: '{\\n    a: 1\\n}, {\\n    a: 2\\n}' },\n        { fragment: true, input: 'var ary=[{a:1}, {a:2}];', output: 'var ary = [{\\n    a: 1\\n}, {\\n    a: 2\\n}];' },\n\n        { comment: 'incomplete', fragment: true, input: '{a:#1', output: '{\\n    a: #1' },\n        { comment: 'incomplete', fragment: true, input: '{a:#', output: '{\\n    a: #' },\n\n        { comment: 'incomplete', fragment: true, input: '}}}', output: '}\\n}\\n}' },\n\n        { fragment: true, unchanged: '<!--\\nvoid();\\n// -->' },\n\n        { comment: 'incomplete regexp', fragment: true, input: 'a=/regexp', output: 'a = /regexp' },\n\n        { input: '{a:#1=[],b:#1#,c:#999999#}', output: '{\\n    a: #1=[],\\n    b: #1#,\\n    c: #999999#\\n}' },\n\n        { input: \"do{x()}while(a>1)\", output: \"do {\\n    x()\\n} while (a > 1)\" },\n\n        { input: \"x(); /reg/exp.match(something)\", output: \"x();\\n/reg/exp.match(something)\" },\n\n        { fragment: true, input: \"something();(\", output: \"something();\\n(\" },\n        { fragment: true, input: \"#!she/bangs, she bangs\\nf=1\", output: \"#!she/bangs, she bangs\\n\\nf = 1\" },\n        { fragment: true, input: \"#!she/bangs, she bangs\\n\\nf=1\", output: \"#!she/bangs, she bangs\\n\\nf = 1\" },\n        { fragment: true, unchanged: \"#!she/bangs, she bangs\\n\\n/* comment */\" },\n        { fragment: true, unchanged: \"#!she/bangs, she bangs\\n\\n\\n/* comment */\" },\n        { fragment: true, unchanged: \"#\" },\n        { fragment: true, unchanged: \"#!\" },\n        { fragment: true, unchanged: \"#include\" },\n        { fragment: true, unchanged: '#include \"settings.jsxinc\"' },\n        { fragment: true, unchanged: '#include \"settings.jsxinc\"\\n\\n\\n/* comment */' },\n        { fragment: true, unchanged: '#include \"settings.jsxinc\"\\n\\n\\n#include \"settings.jsxinc\"\\n\\n\\n/* comment */' },\n\n        { unchanged: \"function namespace::something()\" },\n\n        { fragment: true, unchanged: \"<!--\\nsomething();\\n-->\" },\n        { fragment: true, input: \"<!--\\nif(i<0){bla();}\\n-->\", output: \"<!--\\nif (i < 0) {\\n    bla();\\n}\\n-->\" },\n\n        { input: '{foo();--bar;}', output: '{\\n    foo();\\n    --bar;\\n}' },\n        { input: '{foo();++bar;}', output: '{\\n    foo();\\n    ++bar;\\n}' },\n        { input: '{--bar;}', output: '{\\n    --bar;\\n}' },\n        { input: '{++bar;}', output: '{\\n    ++bar;\\n}' },\n        { input: 'if(true)++a;', output: 'if (true) ++a;' },\n        { input: 'if(true)\\n++a;', output: 'if (true)\\n    ++a;' },\n        { input: 'if(true)--a;', output: 'if (true) --a;' },\n        { input: 'if(true)\\n--a;', output: 'if (true)\\n    --a;' },\n        { unchanged: 'elem[array]++;' },\n        { unchanged: 'elem++ * elem[array]++;' },\n        { unchanged: 'elem-- * -elem[array]++;' },\n        { unchanged: 'elem-- + elem[array]++;' },\n        { unchanged: 'elem-- - elem[array]++;' },\n        { unchanged: 'elem-- - -elem[array]++;' },\n        { unchanged: 'elem-- - +elem[array]++;' },\n\n\n        {\n          comment: 'Handling of newlines around unary ++ and -- operators',\n          input: '{foo\\n++bar;}',\n          output: '{\\n    foo\\n    ++bar;\\n}'\n        },\n        { input: '{foo++\\nbar;}', output: '{\\n    foo++\\n    bar;\\n}' },\n\n        {\n          comment: 'This is invalid, but harder to guard against. Issue #203.',\n          input: '{foo\\n++\\nbar;}',\n          output: '{\\n    foo\\n    ++\\n    bar;\\n}'\n        },\n\n        {\n          comment: 'regexps',\n          input: 'a(/abc\\\\\\\\/\\\\\\\\/def/);b()',\n          output: \"a(/abc\\\\\\\\/\\\\\\\\/def/);\\nb()\"\n        },\n        { input: 'a(/a[b\\\\\\\\[\\\\\\\\]c]d/);b()', output: \"a(/a[b\\\\\\\\[\\\\\\\\]c]d/);\\nb()\" },\n        { comment: 'incomplete char class', fragment: true, unchanged: 'a(/a[b\\\\\\\\[' },\n\n        {\n          comment: 'allow unescaped / in char classes',\n          input: 'a(/[a/b]/);b()',\n          output: \"a(/[a/b]/);\\nb()\"\n        },\n        { unchanged: 'typeof /foo\\\\\\\\//;' },\n        { unchanged: 'throw /foo\\\\\\\\//;' },\n        { unchanged: 'do /foo\\\\\\\\//;' },\n        { unchanged: 'return /foo\\\\\\\\//;' },\n        { unchanged: 'switch (a) {\\n    case /foo\\\\\\\\//:\\n        b\\n}' },\n        { unchanged: 'if (a) /foo\\\\\\\\//\\nelse /foo\\\\\\\\//;' },\n\n        { unchanged: 'if (foo) /regex/.test();' },\n        { unchanged: \"for (index in [1, 2, 3]) /^test$/i.test(s)\" },\n\n        { unchanged: 'function foo() {\\n    return [\\n        \"one\",\\n        \"two\"\\n    ];\\n}' },\n        { input: 'a=[[1,2],[4,5],[7,8]]', output: \"a = [\\n    [1, 2],\\n    [4, 5],\\n    [7, 8]\\n]\" },\n        {\n          input: 'a=[[1,2],[4,5],function(){},[7,8]]',\n          output: \"a = [\\n    [1, 2],\\n    [4, 5],\\n    function() {},\\n    [7, 8]\\n]\"\n        },\n        {\n          input: 'a=[[1,2],[4,5],function(){},function(){},[7,8]]',\n          output: \"a = [\\n    [1, 2],\\n    [4, 5],\\n    function() {},\\n    function() {},\\n    [7, 8]\\n]\"\n        },\n        {\n          input: 'a=[[1,2],[4,5],function(){},[7,8]]',\n          output: \"a = [\\n    [1, 2],\\n    [4, 5],\\n    function() {},\\n    [7, 8]\\n]\"\n        },\n        {\n          input: 'a=[b,c,function(){},function(){},d]',\n          output: \"a = [b, c, function() {}, function() {}, d]\"\n        },\n        {\n          input: 'a=[b,c,\\nfunction(){},function(){},d]',\n          output: \"a = [b, c,\\n    function() {},\\n    function() {},\\n    d\\n]\"\n        },\n        { input: 'a=[a[1],b[4],c[d[7]]]', output: \"a = [a[1], b[4], c[d[7]]]\" },\n        { input: '[1,2,[3,4,[5,6],7],8]', output: \"[1, 2, [3, 4, [5, 6], 7], 8]\" },\n\n        {\n          input: '[[[\"1\",\"2\"],[\"3\",\"4\"]],[[\"5\",\"6\",\"7\"],[\"8\",\"9\",\"0\"]],[[\"1\",\"2\",\"3\"],[\"4\",\"5\",\"6\",\"7\"],[\"8\",\"9\",\"0\"]]]',\n          output: '[\\n    [\\n        [\"1\", \"2\"],\\n        [\"3\", \"4\"]\\n    ],\\n    [\\n        [\"5\", \"6\", \"7\"],\\n        [\"8\", \"9\", \"0\"]\\n    ],\\n    [\\n        [\"1\", \"2\", \"3\"],\\n        [\"4\", \"5\", \"6\", \"7\"],\\n        [\"8\", \"9\", \"0\"]\\n    ]\\n]'\n        },\n\n        { input: '{[x()[0]];indent;}', output: '{\\n    [x()[0]];\\n    indent;\\n}' },\n        { unchanged: '/*\\n foo trailing space    \\n * bar trailing space   \\n**/' },\n        { unchanged: '{\\n    /*\\n    foo    \\n    * bar    \\n    */\\n}' },\n\n        { unchanged: 'return ++i' },\n        {\n          unchanged: [\n            'obj.num++',\n            'foo()',\n            'bar()',\n            '',\n            'obj.num--',\n            'foo()',\n            'bar()'\n          ]\n        },\n        { unchanged: 'return !!x' },\n        { unchanged: 'return !x' },\n        { input: 'return [1,2]', output: 'return [1, 2]' },\n        { unchanged: 'return;' },\n        { unchanged: 'return\\nfunc' },\n        { input: 'catch(e)', output: 'catch (e)' },\n\n        {\n          input: 'var a=1,b={foo:2,bar:3},{baz:4,wham:5},c=4;',\n          output: 'var a = 1,\\n    b = {\\n        foo: 2,\\n        bar: 3\\n    },\\n    {\\n        baz: 4,\\n        wham: 5\\n    }, c = 4;'\n        },\n        {\n          input: 'var a=1,b={foo:2,bar:3},{baz:4,wham:5},\\nc=4;',\n          output: 'var a = 1,\\n    b = {\\n        foo: 2,\\n        bar: 3\\n    },\\n    {\\n        baz: 4,\\n        wham: 5\\n    },\\n    c = 4;'\n        },\n\n        {\n          comment: 'inline comment',\n          input_: 'function x(/*int*/ start, /*string*/ foo)',\n          output: 'function x( /*int*/ start, /*string*/ foo)'\n        },\n\n        {\n          comment: 'javadoc comment',\n          input: '/**\\n* foo\\n*/',\n          output: '/**\\n * foo\\n */'\n        },\n        { input: '{\\n/**\\n* foo\\n*/\\n}', output: '{\\n    /**\\n     * foo\\n     */\\n}' },\n\n        {\n          comment: 'starless block comment',\n          unchanged: '/**\\nfoo\\n*/'\n        },\n        { unchanged: '/**\\nfoo\\n**/' },\n        { unchanged: '/**\\nfoo\\nbar\\n**/' },\n        { unchanged: '/**\\nfoo\\n\\nbar\\n**/' },\n        { unchanged: '/**\\nfoo\\n    bar\\n**/' },\n        { input: '{\\n/**\\nfoo\\n*/\\n}', output: '{\\n    /**\\n    foo\\n    */\\n}' },\n        { input: '{\\n/**\\nfoo\\n**/\\n}', output: '{\\n    /**\\n    foo\\n    **/\\n}' },\n        { input: '{\\n/**\\nfoo\\nbar\\n**/\\n}', output: '{\\n    /**\\n    foo\\n    bar\\n    **/\\n}' },\n        { input: '{\\n/**\\nfoo\\n\\nbar\\n**/\\n}', output: '{\\n    /**\\n    foo\\n\\n    bar\\n    **/\\n}' },\n        { input: '{\\n/**\\nfoo\\n    bar\\n**/\\n}', output: '{\\n    /**\\n    foo\\n        bar\\n    **/\\n}' },\n        { unchanged: '{\\n    /**\\n    foo\\nbar\\n    **/\\n}' },\n\n        { input: 'var a,b,c=1,d,e,f=2;', output: 'var a, b, c = 1,\\n    d, e, f = 2;' },\n        { input: 'var a,b,c=[],d,e,f=2;', output: 'var a, b, c = [],\\n    d, e, f = 2;' },\n        { unchanged: 'function() {\\n    var a, b, c, d, e = [],\\n        f;\\n}' },\n\n        { input: 'do/regexp/;\\nwhile(1);', output: 'do /regexp/;\\nwhile (1);' },\n        { input: 'var a = a,\\na;\\nb = {\\nb\\n}', output: 'var a = a,\\n    a;\\nb = {\\n    b\\n}' },\n\n        { unchanged: 'var a = a,\\n    /* c */\\n    b;' },\n        { unchanged: 'var a = a,\\n    // c\\n    b;' },\n\n        {\n          comment: 'weird element referencing',\n          unchanged: 'foo.(\"bar\");'\n        },\n\n\n        { unchanged: 'if (a) a()\\nelse b()\\nnewline()' },\n        { unchanged: 'if (a) a()\\nnewline()' },\n        { input: 'a=typeof(x)', output: 'a = typeof(x)' },\n\n        { unchanged: 'var a = function() {\\n        return null;\\n    },\\n    b = false;' },\n\n        { unchanged: 'var a = function() {\\n    func1()\\n}' },\n        { unchanged: 'var a = function() {\\n    func1()\\n}\\nvar b = function() {\\n    func2()\\n}' },\n\n        {\n          comment: 'code with and without semicolons',\n          input_: 'var whatever = require(\"whatever\");\\nfunction() {\\n    a = 6;\\n}',\n          output: 'var whatever = require(\"whatever\");\\n\\nfunction() {\\n    a = 6;\\n}'\n        },\n        {\n          input: 'var whatever = require(\"whatever\")\\nfunction() {\\n    a = 6\\n}',\n          output: 'var whatever = require(\"whatever\")\\n\\nfunction() {\\n    a = 6\\n}'\n        },\n\n        { input: '{\"x\":[{\"a\":1,\"b\":3},\\n7,8,8,8,8,{\"b\":99},{\"a\":11}]}', output: '{\\n    \"x\": [{\\n            \"a\": 1,\\n            \"b\": 3\\n        },\\n        7, 8, 8, 8, 8, {\\n            \"b\": 99\\n        }, {\\n            \"a\": 11\\n        }\\n    ]\\n}' },\n        { input: '{\"x\":[{\"a\":1,\"b\":3},7,8,8,8,8,{\"b\":99},{\"a\":11}]}', output: '{\\n    \"x\": [{\\n        \"a\": 1,\\n        \"b\": 3\\n    }, 7, 8, 8, 8, 8, {\\n        \"b\": 99\\n    }, {\\n        \"a\": 11\\n    }]\\n}' },\n\n        { input: '{\"1\":{\"1a\":\"1b\"},\"2\"}', output: '{\\n    \"1\": {\\n        \"1a\": \"1b\"\\n    },\\n    \"2\"\\n}' },\n        { input: '{a:{a:b},c}', output: '{\\n    a: {\\n        a: b\\n    },\\n    c\\n}' },\n\n        { input: '{[y[a]];keep_indent;}', output: '{\\n    [y[a]];\\n    keep_indent;\\n}' },\n\n        { input: 'if (x) {y} else { if (x) {y}}', output: 'if (x) {\\n    y\\n} else {\\n    if (x) {\\n        y\\n    }\\n}' },\n\n        { unchanged: 'if (foo) one()\\ntwo()\\nthree()' },\n        { unchanged: 'if (1 + foo() && bar(baz()) / 2) one()\\ntwo()\\nthree()' },\n        { unchanged: 'if (1 + foo() && bar(baz()) / 2) one();\\ntwo();\\nthree();' },\n\n        { input: 'var a=1,b={bang:2},c=3;', output: 'var a = 1,\\n    b = {\\n        bang: 2\\n    },\\n    c = 3;' },\n        { input: 'var a={bing:1},b=2,c=3;', output: 'var a = {\\n        bing: 1\\n    },\\n    b = 2,\\n    c = 3;' },\n\n        {\n          comment: 'Issue #1896: Handle newlines with bitwise ~ operator',\n          input: 'if (foo) {\\nvar bar = 1;\\n~bar ? 0 : 1\\n }',\n          output: 'if (foo) {\\n    var bar = 1;\\n    ~bar ? 0 : 1\\n}'\n        },\n\n        {\n          comment: 'Issue #2128 - NPE in python implementation',\n          fragment: true,\n          unchanged: [\n            ') / a / g'\n          ]\n        }\n      ]\n    }\n  ],\n  examples: [{\n    // Example\n    group_name: \"one\",\n    description: \"\",\n    options: [],\n    values: [{\n      source: \"\", //string or array of lines\n      output: \"\" //string or array of lines\n    }]\n  }]\n};\n"
  },
  {
    "path": "test/generate-tests.js",
    "content": "#!/usr/bin/env node\n\n/*\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n*/\n\n'use strict';\n\nvar fs = require('fs');\nvar mustache = require('mustache');\nvar path = require('path');\n\nmustache.escape = function(text) {\n  return text;\n};\n\nfunction generate_tests() {\n  // javascript\n  generate_test_files('javascript', 'bt', 'js/test/generated/beautify-javascript-tests.js', 'python/jsbeautifier/tests/generated/tests.py');\n\n  // css\n  generate_test_files('css', 't', 'js/test/generated/beautify-css-tests.js', 'python/cssbeautifier/tests/generated/tests.py');\n\n  // html\n  // no python html beautifier, so no tests\n  generate_test_files('html', 'bth', 'js/test/generated/beautify-html-tests.js');\n}\n\nfunction generate_test_files(data_folder, test_method, node_output, python_output) {\n  var data_file_path, input_path, template_file_path;\n  var test_data, template;\n\n  input_path = path.resolve(__dirname, 'data', data_folder);\n  data_file_path = path.resolve(input_path, 'tests.js');\n  test_data = require(data_file_path).test_data;\n\n  template_file_path = path.resolve(input_path, 'node.mustache');\n  template = fs.readFileSync(template_file_path, { encoding: 'utf-8' });\n  set_formatters(test_data, test_method, '// ');\n  set_generated_header(test_data, data_file_path, template_file_path);\n  fs.mkdirSync(path.resolve(__dirname, '..', node_output, '..'), { recursive: true });\n  fs.writeFileSync(path.resolve(__dirname, '..', node_output),\n    mustache.render(template, test_data), { encoding: 'utf-8' });\n\n  if (python_output) {\n    template_file_path = path.resolve(input_path, 'python.mustache');\n    template = fs.readFileSync(template_file_path, { encoding: 'utf-8' });\n    set_formatters(test_data, test_method, '# ');\n    set_generated_header(test_data, data_file_path, template_file_path);\n    fs.mkdirSync(path.resolve(__dirname, '..', python_output, '..'), { recursive: true });\n    fs.writeFileSync(path.resolve(__dirname, '..', python_output),\n      mustache.render(template, test_data), { encoding: 'utf-8' });\n  }\n}\n\nfunction set_generated_header(data, data_file_path, template_file_path) {\n  var relative_script_path = path.relative(process.cwd(), __filename).split(path.sep).join('/');\n  var relative_data_file_path = path.relative(process.cwd(), data_file_path).split(path.sep).join('/');\n  var relative_template_file_path = path.relative(process.cwd(), template_file_path).split(path.sep).join('/');\n\n  data.header_text =\n    '    AUTO-GENERATED. DO NOT MODIFY.\\n' +\n    '    Script: ' + relative_script_path + '\\n' +\n    '    Template: ' + relative_template_file_path + '\\n' +\n    '    Data: ' + relative_data_file_path;\n\n}\n\nfunction isStringOrArray(val) {\n  return typeof val === 'string' || val instanceof Array;\n}\n\nfunction getTestString(val) {\n  val = val.split('\\n');\n\n  var result = \"'\" + val.join(\"\\\\n' +\\n            '\").replace(/\\t/g, '\\\\t') + \"'\";\n  result = result.replace(/' \\+\\n            ''$/, \"'\");\n  return result;\n}\n\nfunction set_formatters(data, test_method, comment_mark) {\n\n  // utility mustache functions\n  data.matrix_context_string = function() {\n    var context = this;\n    return function(text, render) {\n      var outputs = [];\n      // text is ignored for this\n      if (context.options) {\n        var item;\n        for (var x = 0; x < context.options.length; x++) {\n          item = context.options[x];\n          outputs.push(item.name + ' = \"' + item.value.replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t').replace(/[']/g, \"\\\"\") + '\"');\n        }\n      }\n      return render(outputs.join(', '));\n    };\n  };\n\n  data.test_line = function() {\n    return function(text, render) {\n      var method_text = this.fragment ? 'test_fragment' : test_method;\n      var comment = '';\n      var before_input = method_text + '(';\n      var input = null;\n      var before_output = ', ';\n      var output = null;\n\n      // text is ignored for this.\n      if (typeof this.comment === 'string') {\n        this.comment = this.comment.split('\\n');\n      }\n\n      if (this.comment instanceof Array) {\n        comment = '\\n        ' + comment_mark + this.comment.join('\\n        ' + comment_mark) + '\\n        ';\n      }\n\n      // input: the default field\n      // input_: allow underscore for formatting alignment with \"output\"\n      // unchanged: use \"unchanged\" instead of \"input\" if there is no output\n      input = this.input || this.input_ || this.unchanged;\n      if (input instanceof Array) {\n        input = input.join('\\n');\n      }\n\n      if (isStringOrArray(this.output)) {\n        output = this.output;\n        if (output instanceof Array) {\n          output = output.join('\\n');\n        }\n      }\n\n      // Do all most error checking\n      if (!(this.input !== null || this.input_ !== null || this.unchanged !== null)) {\n        throw \"Missing test input field (input, input_, or unchanged).\";\n      } else if ((this.input !== null && (this.input_ !== null || this.unchanged !== null)) &&\n        (this.input_ === null || this.unchanged === null)) {\n        throw \"Only one test input field allowed (input, input_, or unchanged): \" + input;\n      } else if (output && isStringOrArray(this.unchanged)) {\n        throw \"Cannot specify 'output' with 'unchanged' test input: \" + input;\n      } else if (!output && !isStringOrArray(this.unchanged)) {\n        throw \"Neither 'output' nor 'unchanged' specified for test input: \" + input;\n      } else if (input === output) {\n        // Raw input and output can be the same, just omit output.\n        throw \"Test strings are identical.  Omit 'output' and use 'unchanged': \" + input;\n      }\n\n      input = getTestString(render(input));\n\n      if (output) {\n        output = getTestString(render(output));\n      } else {\n        output = '';\n      }\n\n      if (this.input_ || input.indexOf('\\n') !== -1 || output.indexOf('\\n') !== -1) {\n        before_input = method_text + '(\\n            ';\n        before_output = ',\\n            ' + comment_mark + ' -- output --\\n            ';\n      }\n      if (output === '') {\n        before_output = '';\n      }\n\n      // Rendered input and output can be the same, just omit output.\n      if (output === input) {\n        before_output = '';\n        output = '';\n      }\n      return comment + before_input + input + before_output + output + ')';\n    };\n  };\n\n  data.set_mustache_tags = function() {\n    return function( /* text, render */ ) {\n      if (this.template) {\n        mustache.tags = this.template.split(' ');\n      }\n      return '';\n    };\n  };\n\n  data.unset_mustache_tags = function() {\n    return function( /* text , render */ ) {\n      if (this.template) {\n        mustache.tags = ['{{', '}}'];\n      }\n      return '';\n    };\n  };\n}\n\ngenerate_tests();"
  },
  {
    "path": "test/resources/github-min.js",
    "content": "!function(e){var t={};function n(e){if(e in t)return t[e];throw new Error(\"dependency not found: \"+e)}e.define=function(r,o,i){if(r in t)console.error(\"module redefined: \"+r);else{var a;arguments.length<3&&(i=o,o=[]);var s=[];for(a=0;a<o.length;a++)s.push(n(o[a]));var u=\"github-rollup-frameworks-bootstrap\"===r;try{if(t[r]=i.apply(this,s),u){var c,l=t[r];for(c in l){var f=c.replace(/___/g,\"@\").replace(/__/g,\"/\").replace(/_/g,\"-\");t[f]=l[c]}}}catch(t){throw t.message=\"evaluating module \"+r+\": \"+t.message,u&&(e.define=function(){}),t}}}}(self),define(\"github-rollup-frameworks-bootstrap\",function(){\"use strict\";function e(){var e=this,t=0;return{next:function(){return{done:t===e.length,value:e[t++]}}}}Symbol.iterator||(Symbol.iterator=Symbol()),Array.prototype[Symbol.iterator]||(Array.prototype[Symbol.iterator]=e),NodeList.prototype[Symbol.iterator]||Object.defineProperty(NodeList.prototype,Symbol.iterator,{enumerable:!1,configurable:!0,get:function(){return e}}),HTMLCollection.prototype[Symbol.iterator]||Object.defineProperty(HTMLCollection.prototype,Symbol.iterator,{enumerable:!1,configurable:!0,get:function(){return e}}),window.Headers&&!Headers.prototype[Symbol.iterator]&&(Headers.prototype[Symbol.iterator]=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),e[Symbol.iterator]()});var t=\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof self?self:{};function n(){throw new Error(\"Dynamic requires are not currently supported by rollup-plugin-commonjs\")}function r(e,t){return e(t={exports:{}},t.exports),t.exports}!function e(t,r,o){function i(s,u){if(!r[s]){if(!t[s]){if(!u&&n)return n(s,!0);if(a)return a(s,!0);var c=new Error(\"Cannot find module '\"+s+\"'\");throw c.code=\"MODULE_NOT_FOUND\",c}var l=r[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return i(n||e)},l,l.exports,e,t,r,o)}return r[s].exports}for(var a=n,s=0;s<o.length;s++)i(o[s]);return i}({1:[function(e,t,n){e(\"./index\").polyfill()},{\"./index\":2}],2:[function(e,t,n){function r(e,t){if(void 0===e||null===e)throw new TypeError(\"Cannot convert first argument to object\");for(var n=Object(e),r=1;r<arguments.length;r++){var o=arguments[r];if(void 0!==o&&null!==o)for(var i=Object.keys(Object(o)),a=0,s=i.length;a<s;a++){var u=i[a],c=Object.getOwnPropertyDescriptor(o,u);void 0!==c&&c.enumerable&&(n[u]=o[u])}}return n}t.exports={assign:r,polyfill:function(){Object.assign||Object.defineProperty(Object,\"assign\",{enumerable:!1,configurable:!0,writable:!0,value:r})}}},{}]},{},[1]);r(function(e){!function(t){var n,r=Object.prototype.hasOwnProperty,o=\"function\"==typeof Symbol?Symbol:{},i=o.iterator||\"@@iterator\",a=o.toStringTag||\"@@toStringTag\",s=t.regeneratorRuntime;if(s)e.exports=s;else{(s=t.regeneratorRuntime=e.exports).wrap=p;var u=\"suspendedStart\",c=\"suspendedYield\",l=\"executing\",f=\"completed\",d={},h=b.prototype=m.prototype;g.prototype=h.constructor=b,b.constructor=g,b[a]=g.displayName=\"GeneratorFunction\",s.isGeneratorFunction=function(e){var t=\"function\"==typeof e&&e.constructor;return!!t&&(t===g||\"GeneratorFunction\"===(t.displayName||t.name))},s.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,b):(e.__proto__=b,a in e||(e[a]=\"GeneratorFunction\")),e.prototype=Object.create(h),e},s.awrap=function(e){return new w(e)},y(E.prototype),s.async=function(e,t,n,r){var o=new E(p(e,t,n,r));return s.isGeneratorFunction(t)?o:o.next().then(function(e){return e.done?e.value:o.next()})},y(h),h[i]=function(){return this},h[a]=\"Generator\",h.toString=function(){return\"[object Generator]\"},s.keys=function(e){var t=[];for(var n in e)t.push(n);return t.reverse(),function n(){for(;t.length;){var r=t.pop();if(r in e)return n.value=r,n.done=!1,n}return n.done=!0,n}},s.values=T,k.prototype={constructor:k,reset:function(e){if(this.prev=0,this.next=0,this.sent=n,this.done=!1,this.delegate=null,this.tryEntries.forEach(x),!e)for(var t in this)\"t\"===t.charAt(0)&&r.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=n)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if(\"throw\"===e.type)throw e.arg;return this.rval},dispatchException:function(e){if(this.done)throw e;var t=this;function n(n,r){return a.type=\"throw\",a.arg=e,t.next=n,!!r}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if(\"root\"===i.tryLoc)return n(\"end\");if(i.tryLoc<=this.prev){var s=r.call(i,\"catchLoc\"),u=r.call(i,\"finallyLoc\");if(s&&u){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(s){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!u)throw new Error(\"try statement without catch or finally\");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var i=o;break}}i&&(\"break\"===e||\"continue\"===e)&&i.tryLoc<=t&&t<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=e,a.arg=t,i?this.next=i.finallyLoc:this.complete(a),d},complete:function(e,t){if(\"throw\"===e.type)throw e.arg;\"break\"===e.type||\"continue\"===e.type?this.next=e.arg:\"return\"===e.type?(this.rval=e.arg,this.next=\"end\"):\"normal\"===e.type&&t&&(this.next=t)},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),x(n),d}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if(\"throw\"===r.type){var o=r.arg;x(n)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(e,t,n){return this.delegate={iterator:T(e),resultName:t,nextLoc:n},d}}}function p(e,t,r,o){var i=Object.create((t||m).prototype),a=new k(o||[]);return i._invoke=function(e,t,r){var o=u;return function(i,a){if(o===l)throw new Error(\"Generator is already running\");if(o===f){if(\"throw\"===i)throw a;return j()}for(;;){var s=r.delegate;if(s){if(\"return\"===i||\"throw\"===i&&s.iterator[i]===n){r.delegate=null;var h=s.iterator.return;if(h){var p=v(h,s.iterator,a);if(\"throw\"===p.type){i=\"throw\",a=p.arg;continue}}if(\"return\"===i)continue}var p=v(s.iterator[i],s.iterator,a);if(\"throw\"===p.type){r.delegate=null,i=\"throw\",a=p.arg;continue}i=\"next\",a=n;var m=p.arg;if(!m.done)return o=c,m;r[s.resultName]=m.value,r.next=s.nextLoc,r.delegate=null}if(\"next\"===i)r.sent=o===c?a:n;else if(\"throw\"===i){if(o===u)throw o=f,a;r.dispatchException(a)&&(i=\"next\",a=n)}else\"return\"===i&&r.abrupt(\"return\",a);o=l;var p=v(e,t,r);if(\"normal\"===p.type){o=r.done?f:c;var m={value:p.arg,done:r.done};if(p.arg!==d)return m;r.delegate&&\"next\"===i&&(a=n)}else\"throw\"===p.type&&(o=f,i=\"throw\",a=p.arg)}}}(e,r,a),i}function v(e,t,n){try{return{type:\"normal\",arg:e.call(t,n)}}catch(e){return{type:\"throw\",arg:e}}}function m(){}function g(){}function b(){}function y(e){[\"next\",\"throw\",\"return\"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function w(e){this.arg=e}function E(e){function t(n,r,o,i){var a=v(e[n],e,r);if(\"throw\"!==a.type){var s=a.arg,u=s.value;return u instanceof w?Promise.resolve(u.arg).then(function(e){t(\"next\",e,o,i)},function(e){t(\"throw\",e,o,i)}):Promise.resolve(u).then(function(e){s.value=e,o(s)},i)}i(a.arg)}var n;\"object\"==typeof process&&process.domain&&(t=process.domain.bind(t)),this._invoke=function(e,r){function o(){return new Promise(function(n,o){t(e,r,n,o)})}return n=n?n.then(o,o):o()}}function _(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function x(e){var t=e.completion||{};t.type=\"normal\",delete t.arg,e.completion=t}function k(e){this.tryEntries=[{tryLoc:\"root\"}],e.forEach(_,this),this.reset(!0)}function T(e){if(e){var t=e[i];if(t)return t.call(e);if(\"function\"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,a=function t(){for(;++o<e.length;)if(r.call(e,o))return t.value=e[o],t.done=!1,t;return t.value=n,t.done=!0,t};return a.next=a}}return{next:j}}function j(){return{value:n,done:!0}}}(\"object\"==typeof t?t:\"object\"==typeof window?window:\"object\"==typeof self?self:t)});window.requestIdleCallback=window.requestIdleCallback||function(e){var t=Date.now();return setTimeout(function(){e({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-t))}})},1)},window.cancelIdleCallback=window.cancelIdleCallback||function(e){clearTimeout(e)};var o=function(e,t,n,r,o,i,a,s){if(!e){var u;if(void 0===t)u=new Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var c=[n,r,o,i,a,s],l=0;(u=new Error(t.replace(/%s/g,function(){return c[l++]}))).name=\"Invariant Violation\"}throw u.framesToPop=1,u}},i=\"interactive\"===document.readyState||\"complete\"===document.readyState?Promise.resolve():new Promise(function(e){document.addEventListener(\"DOMContentLoaded\",function(){e()})}),a=\"complete\"===document.readyState?Promise.resolve():new Promise(function(e){window.addEventListener(\"load\",e)}),s=Object.freeze({ready:i,loaded:a}),u=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},c=function(e){return function(){var t=e.apply(this,arguments);return new Promise(function(e,n){return function r(o,i){try{var a=t[o](i),s=a.value}catch(e){return void n(e)}if(!a.done)return Promise.resolve(s).then(function(e){r(\"next\",e)},function(e){r(\"throw\",e)});e(s)}(\"next\")})}},l=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},f=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),d=function e(t,n,r){null===t&&(t=Function.prototype);var o=Object.getOwnPropertyDescriptor(t,n);if(void 0===o){var i=Object.getPrototypeOf(t);return null===i?void 0:e(i,n,r)}if(\"value\"in o)return o.value;var a=o.get;return void 0!==a?a.call(r):void 0},h=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},p=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t},v=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}}(),m=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)},g=[],b=\"text/plain\",y=[\"application/x-www-form-urlencoded\",\"multipart/form-data\",b];var w=!1;\"sendBeacon\"in window.navigator?w=!0:navigator.sendBeacon=function(e,t){return t instanceof Blob?((n=t,r=new FileReader,i=new Promise(function(e,t){r.onload=function(){o(\"string\"==typeof r.result,\"app/assets/modules/github/send-beacon.js:125\"),e(r.result)},r.onerror=function(){t(r.error)}}),r.readAsText(n),i).then(function(n){var r=\"string\"==typeof t.type&&\"\"!==t.type?t.type:b;x(e,n,r)}),!0):(x(e,t,b),!0);var n,r,i};var E=void 0,_=!1;function x(e,t,n){var r={url:String(e),data:t,type:n};if(_){var o=j()||[];o.push(r),L(o)}else g.push(r),E&&clearTimeout(E),E=setTimeout(function(){k(g),g.length=0},20);return!0}function k(e){var t=!0,n=!1,r=void 0;try{for(var o,i=e[Symbol.iterator]();!(t=(o=i.next()).done);t=!0){var a=o.value,s=new XMLHttpRequest;try{s.open(\"POST\",a.url,!0),s.setRequestHeader(\"Content-Type\",a.type),s.send(a.data)}catch(e){}}}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}}window.addEventListener(\"beforeunload\",function(e){setTimeout(function(){e.defaultPrevented||(_=!0,E&&clearTimeout(E),g.length>0&&L(g))})}),c(regeneratorRuntime.mark(function e(){var t;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,i;case 2:(t=j())&&(k(t),O());case 4:case\"end\":return e.stop()}},e,this)}))();var T=\"send-beacon-queue\";function j(){var e=void 0;try{e=sessionStorage.getItem(T)}catch(e){}if(e)return JSON.parse(e)}function L(e){var t=JSON.stringify(e);try{sessionStorage.setItem(T,t)}catch(e){}}function O(){try{sessionStorage.removeItem(T)}catch(e){}}var S=Object.freeze({guaranteedPost:function(e,t,n){w&&navigator.sendBeacon&&function(e){return e=e.split(\";\")[0],y.indexOf(e)>-1}(n)?navigator.sendBeacon(e,new Blob([t],{type:n})):x(e,t,n)}});r(function(e){var t=!1,n=!1;function r(){}try{var o=Object.create({},{passive:{get:function(){t=!0}},once:{get:function(){n=!0}}});window.addEventListener(\"test\",r,o),window.removeEventListener(\"test\",r,o)}catch(e){}var i=e.exports=function(e){var o=e.addEventListener,i=e.removeEventListener,a=new WeakMap;e.addEventListener=function(e,i,s){if(void 0===s||!0===s||!1===s)return o.call(this,e,i,s);var u=i,c=\"boolean\"==typeof s?{capture:s}:s||{},l=Boolean(c.passive),f=Boolean(c.once),d=Boolean(c.capture),h=u;!n&&f&&(u=function(t){this.removeEventListener(e,i,c),h.call(this,t)}),!t&&l&&(u=function(e){e.preventDefault=r,h.call(this,e)}),a.has(this)||a.set(this,new WeakMap);var p=a.get(this);p.has(i)||p.set(i,[]);var v=1*l+2*f+4*d;p.get(i)[v]=u,o.call(this,e,u,d)},e.removeEventListener=function(e,t,n){var r=Boolean(\"object\"==typeof n?n.capture:n),o=a.get(this);if(!o)return i.call(this,e,t,n);var s=o.get(t);if(!s)return i.call(this,e,t,n);for(var u in s){var c=Boolean(4&u);c===r&&i.call(this,e,s[u],c)}}};t&&n||(\"undefined\"!=typeof EventTarget?i(EventTarget.prototype):(i(Text.prototype),i(HTMLElement.prototype),i(HTMLDocument.prototype),i(Window.prototype),i(XMLHttpRequest.prototype)))}),r(function(e,t){!function(){var t=window,n=document;e.exports={polyfill:function(){if(!(\"scrollBehavior\"in n.documentElement.style&&!0!==t.__forceSmoothScrollPolyfill__)){var e,r=t.HTMLElement||t.Element,o=468,i=(e=t.navigator.userAgent,new RegExp([\"MSIE \",\"Trident/\",\"Edge/\"].join(\"|\")).test(e)?1:0),a={scroll:t.scroll||t.scrollTo,scrollBy:t.scrollBy,elementScroll:r.prototype.scroll||u,scrollIntoView:r.prototype.scrollIntoView},s=t.performance&&t.performance.now?t.performance.now.bind(t.performance):Date.now;t.scroll=t.scrollTo=function(){void 0!==arguments[0]&&(!0!==c(arguments[0])?p.call(t,n.body,void 0!==arguments[0].left?~~arguments[0].left:t.scrollX||t.pageXOffset,void 0!==arguments[0].top?~~arguments[0].top:t.scrollY||t.pageYOffset):a.scroll.call(t,void 0!==arguments[0].left?arguments[0].left:\"object\"!=typeof arguments[0]?arguments[0]:t.scrollX||t.pageXOffset,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:t.scrollY||t.pageYOffset))},t.scrollBy=function(){void 0!==arguments[0]&&(c(arguments[0])?a.scrollBy.call(t,void 0!==arguments[0].left?arguments[0].left:\"object\"!=typeof arguments[0]?arguments[0]:0,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:0):p.call(t,n.body,~~arguments[0].left+(t.scrollX||t.pageXOffset),~~arguments[0].top+(t.scrollY||t.pageYOffset)))},r.prototype.scroll=r.prototype.scrollTo=function(){if(void 0!==arguments[0])if(!0!==c(arguments[0])){var e=arguments[0].left,t=arguments[0].top;p.call(this,this,void 0===e?this.scrollLeft:~~e,void 0===t?this.scrollTop:~~t)}else{if(\"number\"==typeof arguments[0]&&void 0===arguments[1])throw new SyntaxError(\"Value couldn't be converted\");a.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left:\"object\"!=typeof arguments[0]?~~arguments[0]:this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top:void 0!==arguments[1]?~~arguments[1]:this.scrollTop)}},r.prototype.scrollBy=function(){void 0!==arguments[0]&&(!0!==c(arguments[0])?this.scroll({left:~~arguments[0].left+this.scrollLeft,top:~~arguments[0].top+this.scrollTop,behavior:arguments[0].behavior}):a.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left+this.scrollLeft:~~arguments[0]+this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top+this.scrollTop:~~arguments[1]+this.scrollTop))},r.prototype.scrollIntoView=function(){if(!0!==c(arguments[0])){var e=function(e){var t;do{t=(e=e.parentNode)===n.body}while(!1===t&&!1===d(e));return t=null,e}(this),r=e.getBoundingClientRect(),o=this.getBoundingClientRect();e!==n.body?(p.call(this,e,e.scrollLeft+o.left-r.left,e.scrollTop+o.top-r.top),\"fixed\"!==t.getComputedStyle(e).position&&t.scrollBy({left:r.left,top:r.top,behavior:\"smooth\"})):t.scrollBy({left:o.left,top:o.top,behavior:\"smooth\"})}else a.scrollIntoView.call(this,void 0===arguments[0]||arguments[0])}}function u(e,t){this.scrollLeft=e,this.scrollTop=t}function c(e){if(null===e||\"object\"!=typeof e||void 0===e.behavior||\"auto\"===e.behavior||\"instant\"===e.behavior)return!0;if(\"object\"==typeof e&&\"smooth\"===e.behavior)return!1;throw new TypeError(\"behavior member of ScrollOptions \"+e.behavior+\" is not a valid value for enumeration ScrollBehavior.\")}function l(e,t){return\"Y\"===t?e.clientHeight+i<e.scrollHeight:\"X\"===t?e.clientWidth+i<e.scrollWidth:void 0}function f(e,n){var r=t.getComputedStyle(e,null)[\"overflow\"+n];return\"auto\"===r||\"scroll\"===r}function d(e){var t=l(e,\"Y\")&&f(e,\"Y\"),n=l(e,\"X\")&&f(e,\"X\");return t||n}function h(e){var n,r,i,a,u=(s()-e.startTime)/o;a=u=u>1?1:u,n=.5*(1-Math.cos(Math.PI*a)),r=e.startX+(e.x-e.startX)*n,i=e.startY+(e.y-e.startY)*n,e.method.call(e.scrollable,r,i),r===e.x&&i===e.y||t.requestAnimationFrame(h.bind(t,e))}function p(e,r,o){var i,c,l,f,d=s();e===n.body?(i=t,c=t.scrollX||t.pageXOffset,l=t.scrollY||t.pageYOffset,f=a.scroll):(i=e,c=e.scrollLeft,l=e.scrollTop,f=u),h({scrollable:i,method:f,startTime:d,startX:c,startY:l,x:r,y:o})}}}}()}).polyfill;function A(e,t,n){return o(e instanceof t,\"undefined -- app/assets/modules/github/typecast.js:17\"),e}var M=Object.freeze({default:A});function C(e,t){var n=e.head;o(n,\"document.head was not initialized -- app/assets/modules/github/metadata.js:13\");var r=!0,i=!1,a=void 0;try{for(var s,u=n.getElementsByTagName(\"meta\")[Symbol.iterator]();!(r=(s=u.next()).done);r=!0){var c=s.value;if(o(c instanceof HTMLMetaElement,\"getElementsByTagName('meta') returned non-meta element -- app/assets/modules/github/metadata.js:18\"),c.name===t)return c.content||\"\"}}catch(e){i=!0,a=e}finally{try{!r&&u.return&&u.return()}finally{if(i)throw a}}return\"\"}var D=Object.freeze({getMetadataByName:C});function P(e){var t=C(e,\"expected-hostname\");return!!t&&t.replace(/\\.$/,\"\").split(\".\").slice(-2).join(\".\")!==e.location.hostname.replace(/\\.$/,\"\").split(\".\").slice(-2).join(\".\")}var H=Object.freeze({default:P}),R=0;function N(e){W()&&B(function(e){var t=e.message,n=e.filename,r=e.lineno,o=e.colno;return X(e.error,{message:t,filename:n,lineno:r,colno:o})}(e))}function I(e){W()&&e.promise&&e.promise.catch(function(e){var t={};e&&e.response instanceof Response&&(t.dataRemoteUrl=e.response.url),F(e,t)})}function q(e){var t=e.body||{},n=new Error(\"ReportingObserverError\");B({bucket:\"github-js-reports\",error:{columnNumber:t.columnNumber,fileName:\"\"===t.sourceFile?n.fileName:t.sourceFile,lineNumber:t.lineNumber,message:t.message||n.message,name:t.id,stack:n.stack},url:e.url})}function F(e){B(X(e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}))}function B(e){var t=C(document,\"browser-errors-url\");t&&(R++,window.fetch(t,{method:\"post\",body:JSON.stringify(e)}).catch(function(){}))}var z=(new Date).getTime();function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=void 0;return e&&(n={columnNumber:e.columnNumber,fileName:e.fileName,lineNumber:e.lineNumber,message:e.message,name:e.name,stack:e.stack,toString:e.toString()}),Object.assign({},{error:n,url:window.location.href,readyState:document.readyState,referrer:document.referrer,timeSinceLoad:Math.round((new Date).getTime()-z),extensionScripts:JSON.stringify(function(){for(var e=document.getElementsByTagName(\"script\"),t=[],n=0,r=e.length;n<r;n++){var o=e[n];/^(?:chrome-extension|file):/.test(o.src)&&t.push(o.src)}return t}().sort()),user:function(){var e=document.querySelector(\"meta[name=user-login]\");if(e)return A(e,HTMLMetaElement).content}()},t)}var V=!1;function W(){return!V&&R<10&&\"undefined\"!=typeof customElements&&\"undefined\"!=typeof Intl&&\"undefined\"!=typeof MutationObserver&&!P(document)}window.addEventListener(\"pageshow\",function(){V=!1}),window.addEventListener(\"pagehide\",function(){V=!0});var U,Y=Object.freeze({reportEvent:N,reportPromiseRejectionEvent:I,reportIntervention:q,reportError:F});function G(){if(!(this instanceof G))return new G;this.size=0,this.uid=0,this.selectors=[],this.indexes=Object.create(this.indexes),this.activeIndexes=[]}window.addEventListener(\"error\",N),window.addEventListener(\"unhandledrejection\",I),\"#b00m\"===window.location.hash&&setTimeout(function(){throw new Error(\"b00m\")}),(U=window.ReportingObserver)&&new U(function(e){var t=!0,n=!1,r=void 0;try{for(var o,i=e[Symbol.iterator]();!(t=(o=i.next()).done);t=!0)q(o.value)}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}},{buffered:!0}).observe(),\"undefined\"==typeof Reflect&&(window.Reflect={construct:function(e,t,n){void 0===n&&(n=e);var r=n.prototype||Object.prototype,o=Object.create(r);return Function.prototype.apply.call(e,o,t)||o}});var K=window.document.documentElement,$=K.matches||K.webkitMatchesSelector||K.mozMatchesSelector||K.oMatchesSelector||K.msMatchesSelector;G.prototype.matchesSelector=function(e,t){return $.call(e,t)},G.prototype.querySelectorAll=function(e,t){return t.querySelectorAll(e)},G.prototype.indexes=[];var J=/^#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/g;G.prototype.indexes.push({name:\"ID\",selector:function(e){var t;if(t=e.match(J))return t[0].slice(1)},element:function(e){if(e.id)return[e.id]}});var Z=/^\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/g;G.prototype.indexes.push({name:\"CLASS\",selector:function(e){var t;if(t=e.match(Z))return t[0].slice(1)},element:function(e){var t=e.className;if(t){if(\"string\"==typeof t)return t.split(/\\s/);if(\"object\"==typeof t&&\"baseVal\"in t)return t.baseVal.split(/\\s/)}}});var Q,ee=/^((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/g;G.prototype.indexes.push({name:\"TAG\",selector:function(e){var t;if(t=e.match(ee))return t[0].toUpperCase()},element:function(e){return[e.nodeName.toUpperCase()]}}),G.prototype.indexes.default={name:\"UNIVERSAL\",selector:function(){return!0},element:function(){return[!0]}},Q=\"function\"==typeof window.Map?window.Map:function(){function e(){this.map={}}return e.prototype.get=function(e){return this.map[e+\" \"]},e.prototype.set=function(e,t){this.map[e+\" \"]=t},e}();var te=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g;function ne(e,t){var n,r,o,i,a,s,u=(e=e.slice(0).concat(e.default)).length,c=t,l=[];do{if(te.exec(\"\"),(o=te.exec(c))&&(c=o[3],o[2]||!c))for(n=0;n<u;n++)if(a=(s=e[n]).selector(o[1])){for(r=l.length,i=!1;r--;)if(l[r].index===s&&l[r].key===a){i=!0;break}i||l.push({index:s,key:a});break}}while(o);return l}function re(e,t){var n,r,o;for(n=0,r=e.length;n<r;n++)if(o=e[n],t.isPrototypeOf(o))return o}function oe(e,t){return e.id-t.id}G.prototype.logDefaultIndexUsed=function(){},G.prototype.add=function(e,t){var n,r,o,i,a,s,u,c,l=this.activeIndexes,f=this.selectors;if(\"string\"==typeof e){for(n={id:this.uid++,selector:e,data:t},u=ne(this.indexes,e),r=0;r<u.length;r++)i=(c=u[r]).key,(a=re(l,o=c.index))||((a=Object.create(o)).map=new Q,l.push(a)),o===this.indexes.default&&this.logDefaultIndexUsed(n),(s=a.map.get(i))||(s=[],a.map.set(i,s)),s.push(n);this.size++,f.push(e)}},G.prototype.remove=function(e,t){if(\"string\"==typeof e){var n,r,o,i,a,s,u,c,l=this.activeIndexes,f={},d=1===arguments.length;for(n=ne(this.indexes,e),o=0;o<n.length;o++)for(r=n[o],i=l.length;i--;)if(s=l[i],r.index.isPrototypeOf(s)){if(u=s.map.get(r.key))for(a=u.length;a--;)(c=u[a]).selector!==e||!d&&c.data!==t||(u.splice(a,1),f[c.id]=!0);break}this.size-=Object.keys(f).length}},G.prototype.queryAll=function(e){if(!this.selectors.length)return[];var t,n,r,o,i,a,s,u,c={},l=[],f=this.querySelectorAll(this.selectors.join(\", \"),e);for(t=0,r=f.length;t<r;t++)for(i=f[t],n=0,o=(a=this.matches(i)).length;n<o;n++)c[(u=a[n]).id]?s=c[u.id]:(s={id:u.id,selector:u.selector,data:u.data,elements:[]},c[u.id]=s,l.push(s)),s.elements.push(i);return l.sort(oe)},G.prototype.matches=function(e){if(!e)return[];var t,n,r,o,i,a,s,u,c,l,f,d=this.activeIndexes,h={},p=[];for(t=0,o=d.length;t<o;t++)if(u=(s=d[t]).element(e))for(n=0,i=u.length;n<i;n++)if(c=s.map.get(u[n]))for(r=0,a=c.length;r<a;r++)!h[f=(l=c[r]).id]&&this.matchesSelector(e,l.selector)&&(h[f]=!0,p.push(l));return p.sort(oe)};var ie={},ae={},se=new WeakMap,ue=new WeakMap,ce=new WeakMap,le=Object.getOwnPropertyDescriptor(Event.prototype,\"currentTarget\");function fe(e,t,n){var r=e[t];return e[t]=function(){return n.apply(e,arguments),r.apply(e,arguments)},e}function de(){se.set(this,!0)}function he(){se.set(this,!0),ue.set(this,!0)}function pe(){return ce.get(this)||null}function ve(e,t){le&&Object.defineProperty(e,\"currentTarget\",{configurable:!0,enumerable:!0,get:t||le.get})}function me(e){var t=(1===e.eventPhase?ae:ie)[e.type];if(t){var n=function(e,t,n){var r=[],o=t;do{if(1!==o.nodeType)break;var i=e.matches(o);if(i.length){var a={node:o,observers:i};n?r.unshift(a):r.push(a)}}while(o=o.parentElement);return r}(t,e.target,1===e.eventPhase);if(n.length){fe(e,\"stopPropagation\",de),fe(e,\"stopImmediatePropagation\",he),ve(e,pe);for(var r=0,o=n.length;r<o&&!se.get(e);r++){var i=n[r];ce.set(e,i.node);for(var a=0,s=i.observers.length;a<s&&!ue.get(e);a++)i.observers[a].data.call(i.node,e)}ce.delete(e),ve(e)}}}function ge(e,t,n){var r=!!(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).capture,o=r?ae:ie,i=o[e];i||(i=new G,o[e]=i,document.addEventListener(e,me,r)),i.add(t,n)}function be(e,t,n){return e.dispatchEvent(new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n}))}var ye=Object.freeze({on:ge,off:function(e,t,n){var r=!!(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).capture,o=r?ae:ie,i=o[e];i&&(i.remove(t,n),i.size||(delete o[e],document.removeEventListener(e,me,r)))},fire:be}),we=[],Ee=0,_e=function(){var e={_id:(new Date).getTime()};return Te(e),e}();function xe(){return _e}function ke(){return history.length-1+Ee}function Te(e){_e=e;var t=location.href;we[ke()]={url:t,state:_e},we.length=history.length;var n=new CustomEvent(\"statechange\",{bubbles:!1,cancelable:!1});n.state=_e,window.dispatchEvent(n)}function je(e,t){var n={_id:t};if(e)for(var r in e)n[r]=e[r];return n}function Le(){return(new Date).getTime()}function Oe(e,t,n){Ee=0,e=je(e,Le()),history.pushState(e,t,n),Te(e)}function Se(e,t,n){e=je(e,xe()._id),history.replaceState(e,t,n),Te(e)}window.addEventListener(\"popstate\",function(e){e.state&&e.state._id&&(e.state._id<xe()._id?Ee--:Ee++,Te(e.state))},!0),window.addEventListener(\"hashchange\",function(){if(history.length>we.length){var e=je({},Le());history.replaceState(e,\"\",location.href),Te(e)}},!0);var Ae=Object.freeze({getState:xe,pushState:Oe,replaceState:Se,getBackURL:function(){var e=we[ke()-1];if(e)return e.url},getForwardURL:function(){var e=we[ke()+1];if(e)return e.url}});function Me(e){return Ce(e,De(arguments.length>1&&void 0!==arguments[1]?arguments[1]:location.hash))}function Ce(e,t){if(\"\"!==t)return e.getElementById(t)||e.getElementsByName(t)[0]}function De(e){try{return decodeURIComponent(e.slice(1))}catch(e){return\"\"}}var Pe=Object.freeze({findFragmentTarget:Me,findElementByFragmentName:Ce,decodeFragmentValue:De}),He=[],Re=0;function Ne(e){c(regeneratorRuntime.mark(function t(){return regeneratorRuntime.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return He.push(e),t.next=3,i;case 3:Ie();case 4:case\"end\":return t.stop()}},t,this)}))()}function Ie(){var e=Re;Re=He.length,qe(He.slice(e),null,window.location.href)}function qe(e,t,n){var r=window.location.hash.slice(1),o={oldURL:t,newURL:n,target:r&&document.getElementById(r)},i=!0,a=!1,s=void 0;try{for(var u,c=e[Symbol.iterator]();!(i=(u=c.next()).done);i=!0){u.value.call(null,o)}}catch(e){a=!0,s=e}finally{try{!i&&c.return&&c.return()}finally{if(a)throw s}}}Ne.clear=function(){He.length=Re=0};var Fe=window.location.href;window.addEventListener(\"popstate\",function(){Fe=window.location.href}),window.addEventListener(\"hashchange\",function(e){var t=window.location.href;try{qe(He,e.oldURL||Fe,t)}finally{Fe=t}});var Be=null;document.addEventListener(\"pjax:start\",function(){Be=window.location.href}),document.addEventListener(\"pjax:end\",function(){qe(He,Be,window.location.href)});var ze=Object.freeze({default:Ne});function Xe(e){return(e.ctrlKey?\"Control+\":\"\")+(e.altKey?\"Alt+\":\"\")+(e.metaKey?\"Meta+\":\"\")+e.key}var Ve=Object.freeze({default:Xe});function We(e){return!function(e){return e.offsetWidth<=0&&e.offsetHeight<=0}(e)}var Ue=Object.freeze({default:We});function Ye(e){var t=e.currentTarget;if(o(t instanceof HTMLElement,\"app/assets/modules/github/restrict-tab-behavior.js:9\"),\"Tab\"===Xe(e)){e.preventDefault();var n=Array.from(t.querySelectorAll(\"input, button, textarea\")).filter(function(e){if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLButtonElement)return!e.disabled&&We(e)}),r=e.shiftKey?-1:1,i=n.length-1;if(document.activeElement){var a=n.indexOf(document.activeElement);if(-1!==a){var s=a+r;s>=0&&(i=s%n.length)}}n[i].focus()}}var Ge,Ke=Object.freeze({default:Ye}),$e=(Ge=c(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(\"0s\"!==getComputedStyle(t).transitionDuration){e.next=2;break}return e.abrupt(\"return\");case 2:return t.style.display=\"block\",t.offsetHeight,e.next=6,new Promise(function(e){return t.addEventListener(\"transitionend\",e,{once:!0})});case 6:t.style.display=\"\";case 7:case\"end\":return e.stop()}},e,this)})),function(e){return Ge.apply(this,arguments)}),Je=null;function Ze(e){var t=document.querySelector(\"button[data-box-overlay-id='\"+e.id+\"']\");return t instanceof HTMLButtonElement?t:null}function Qe(e,t){var n=t||Ze(e);et(),$e(e).then(function(){var t=e.querySelector(\"[autofocus]\");t?t.focus():(e.hidden&&(e.hidden=!1),e.setAttribute(\"tabindex\",\"-1\"),e.focus()),be(e,\"overlay:opened\",{button:n})}),e.hidden=!1,n&&n.setAttribute(\"aria-expanded\",\"true\"),e.addEventListener(\"keydown\",Ye),document.addEventListener(\"keydown\",tt),Je=e}function et(){if(Je){var e=Je,t=document.querySelector('[data-box-overlay-id=\"'+e.id+'\"]');$e(e).then(function(){t&&t.focus(),be(e,\"overlay:closed\")}),t&&t.setAttribute(\"aria-expanded\",\"false\"),e.hidden=!0,e.removeEventListener(\"keydown\",Ye),document.removeEventListener(\"keydown\",tt),location.hash===\"#\"+e.id&&Se(xe(),\"\",window.location.href.split(\"#\")[0]),Je=null}}function tt(e){\"Escape\"===Xe(e)&&et()}ge(\"click\",\"button[data-box-overlay-id]\",function(e){var t=A(e.currentTarget,HTMLButtonElement),n=t.getAttribute(\"data-box-overlay-id\");o(n,\"app/assets/modules/github/box-overlay.js:18\"),Qe(A(document.getElementById(n),HTMLElement),t)}),ge(\"click\",\".js-box-overlay-container\",function(e){e.target.querySelector(\".js-box-overlay-content\")&&et()}),ge(\"click\",\".js-box-overlay-close\",function(){et()}),Ne(function(){var e=Me(document);if(e instanceof HTMLElement){var t=Ze(e);t&&Qe(e,t)}});var nt=new WeakMap;var rt,ot=(rt=c(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(e.t0=nt.get(t),e.t0){e.next=7;break}return e.t1=it,e.next=5,at(t,\"codeEditor:ready\");case 5:e.t2=e.sent,e.t0=(0,e.t1)(e.t2);case 7:return e.abrupt(\"return\",e.t0);case 8:case\"end\":return e.stop()}},e,this)})),function(e){return rt.apply(this,arguments)});function it(e){o(e instanceof CustomEvent,\"app/assets/modules/github/code-editor.js:18\");var t=e.detail.editor;return nt.set(e.target,t),t}function at(e,t){return new Promise(function(n){e.addEventListener(t,n,{once:!0})})}ge(\"codeEditor:ready\",\".js-code-editor\",it);var st=Object.freeze({getCodeEditor:function(e){return nt.get(e)},getAsyncCodeEditor:ot});function ut(e,t){var n=void 0;return function(){var r=this,o=arguments;clearTimeout(n),n=setTimeout(function(){clearTimeout(n),e.apply(r,o)},t)}}document.addEventListener(\"click\",function(e){if(e.target instanceof Element){var t=e.target.closest(\"a[data-confirm], input[type=submit][data-confirm], input[type=checkbox][data-confirm], button[data-confirm]\");if(t){var n=t.getAttribute(\"data-confirm\");n&&(t instanceof HTMLInputElement&&t.hasAttribute(\"data-confirm-checked\")&&!t.checked||confirm(n)||(e.stopImmediatePropagation(),e.preventDefault()))}}},!0);var ct=Object.freeze({default:ut});var lt=Object.freeze({default:function(e,t){var n=0,r=void 0;return function(){for(var o=this,i=arguments.length,a=Array(i),s=0;s<i;s++)a[s]=arguments[s];var u=Date.now()-n;u<t?(clearTimeout(r),r=setTimeout(function(){n=Date.now(),e.apply(o,a)},t-u)):(n=Date.now(),e.apply(this,a))}}});function ft(e,t,n){var r=n||HTMLElement,o=e.closest(t);if(o instanceof r)return o;throw new Error(\"Element not found: <\"+r.name+\"> \"+t)}function dt(e,t,n){var r=n||HTMLElement,o=e.querySelector(t);if(o instanceof r)return o;throw new Error(\"Element not found: <\"+r.name+\"> \"+t)}function ht(e,t,n){var r=n||HTMLElement,o=[],i=!0,a=!1,s=void 0;try{for(var u,c=e.querySelectorAll(t)[Symbol.iterator]();!(i=(u=c.next()).done);i=!0){var l=u.value;l instanceof r&&o.push(l)}}catch(e){a=!0,s=e}finally{try{!i&&c.return&&c.return()}finally{if(a)throw s}}return o}var pt=Object.freeze({closest:ft,query:dt,querySelectorAll:ht,namedItem:function(e,t,n){var r=n||HTMLInputElement,o=e.elements.namedItem(t);if(o instanceof r)return o;throw new Error(\"Element not found by name: <\"+r.name+\"> \"+t)}}),vt=\"ontransitionend\"in window;function mt(e,t){if(vt){var n=Array.from(e.querySelectorAll(\".js-transitionable\"));e.classList.add(\"js-transitionable\")&&n.push(e);var r=function(e){var t=gt(e);e.addEventListener(\"transitionend\",function(){e.style.display=\"\",e.style.visibility=\"\",t&&bt(e,function(){e.style.height=\"\"})},{once:!0}),e.style.boxSizing=\"content-box\",e.style.display=\"block\",e.style.visibility=\"visible\",t&&bt(e,function(){e.style.height=getComputedStyle(e).height}),e.offsetHeight},o=!0,i=!1,a=void 0;try{for(var s,u=n[Symbol.iterator]();!(o=(s=u.next()).done);o=!0){r(p=s.value)}}catch(e){i=!0,a=e}finally{try{!o&&u.return&&u.return()}finally{if(i)throw a}}t();var c=!0,l=!1,f=void 0;try{for(var d,h=n[Symbol.iterator]();!(c=(d=h.next()).done);c=!0){var p;if(gt(p=d.value)){var v=getComputedStyle(p).height;p.style.boxSizing=\"\",p.style.height=\"0px\"===v?p.scrollHeight+\"px\":\"0px\"}}}catch(e){l=!0,f=e}finally{try{!c&&h.return&&h.return()}finally{if(l)throw f}}}else t()}function gt(e){return\"height\"===getComputedStyle(e).transitionProperty}function bt(e,t){e.style.transition=\"none\",t(),e.offsetHeight,e.style.transition=\"\"}function yt(e){var t=e.getAttribute(\"data-details-container\")||\".js-details-container\",n=ft(e,t);e.getAttribute(\"data-initial-state\")||e.setAttribute(\"data-initial-state\",e.getAttribute(\"aria-expanded\")||\"false\"),mt(n,function(){n.classList.toggle(\"open\"),n.classList.toggle(\"Details--on\"),e.setAttribute(\"aria-expanded\",(e.getAttribute(\"data-initial-state\")!==n.classList.contains(\"Details--on\").toString()).toString()),Promise.resolve().then(function(){!function(e){var t=e.querySelectorAll(\"input[autofocus], textarea[autofocus]\"),n=t[t.length-1];n&&document.activeElement!==n&&n.focus()}(n),function(e){e.classList.contains(\"tooltipped\")&&(e.classList.remove(\"tooltipped\"),e.addEventListener(\"mouseleave\",function(){return e.classList.add(\"tooltipped\")},{once:!0}))}(e),function(e){var t=e.closest(\".js-edit-repository-meta\");t&&A(t,HTMLFormElement).reset()}(e);var t=new CustomEvent(\"details:toggled\",{bubbles:!0,cancelable:!1,detail:{open:n.classList.contains(\"Details--on\")}});n.dispatchEvent(t)})})}function wt(e){for(var t=!1,n=e.parentElement;n;)n.classList.contains(\"Details-content--shown\")&&(t=!0),n.classList.contains(\"js-details-container\")&&(n.classList.toggle(\"open\",!t),n.classList.toggle(\"Details--on\",!t),t=!1),n=n.parentElement}ge(\"click\",\".js-details-target\",function(e){var t=e.currentTarget;o(t instanceof HTMLElement,\"app/assets/modules/github/details.js:129\"),yt(t),e.preventDefault()}),Ne(function(e){var t=e.target;t&&wt(t)});var Et=Object.freeze({toggleDetailsTarget:yt,isDetailsTargetExpanded:function(e){var t=ft(e,e.getAttribute(\"data-details-container\")||\".js-details-container\").classList;return t.contains(\"Details--on\")||t.contains(\"open\")},ensureExpanded:wt}),_t=function(){var e=c(regeneratorRuntime.mark(function e(t){var n,r,i,a,s,u,c;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r=dt(document,\"#site-details-dialog\",HTMLTemplateElement),i=r.content.cloneNode(!0),a=dt(i,\"details\"),s=dt(a,\"details-dialog\"),u=dt(a,\".js-details-dialog-spinner\"),t.dialogClass&&(n=s.classList).add.apply(n,m(t.dialogClass.split(\" \"))),o(document.body,\"app/assets/modules/github/details-dialog.js:20\"),document.body.append(i),e.next=10,t.content;case 10:return c=e.sent,u.remove(),s.prepend(c),setTimeout(function(){a.addEventListener(\"toggle\",function(){be(s,\"dialog:remove\"),a.remove()},{once:!0})}),e.abrupt(\"return\",s);case 15:case\"end\":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}(),xt=Object.freeze({dialog:_t});function kt(e){var t=e,n=t.ownerDocument;if(n&&t.offsetParent){var r=n.defaultView.HTMLElement;if(t!==n.body){for(;t!==n.body;){if(!(t.parentElement instanceof r))return;t=t.parentElement;var o=getComputedStyle(t),i=o.position,a=o.overflowY,s=o.overflowX;if(\"fixed\"===i||\"auto\"===a||\"auto\"===s||\"scroll\"===a||\"scroll\"===s)break}return t instanceof Document?null:t}}}function Tt(e,t){var n=t,r=e.ownerDocument;if(r&&r.body){var o=r.documentElement;if(o&&e!==o){var i=jt(e,n);if(i){var a=(n=i._container)===r.documentElement?{top:r.defaultView.pageYOffset,left:r.defaultView.pageXOffset}:{top:n.scrollTop,left:n.scrollLeft},s=i.top-a.top,u=i.left-a.left,c=n.clientHeight,l=n.clientWidth;return{top:s,left:u,bottom:c-(s+e.offsetHeight),right:l-(u+e.offsetWidth),height:c,width:l}}}}}function jt(e,t){var n=e,r=n.ownerDocument;if(r){var o=r.documentElement;if(o){var i=r.body;if(i){for(var a=r.defaultView.HTMLElement,s=0,u=0,c=n.offsetHeight,l=n.offsetWidth;n!==r.body&&n!==t;){if(s+=n.offsetTop||0,u+=n.offsetLeft||0,!(n.offsetParent instanceof a))return;n=n.offsetParent}var f=void 0,d=void 0,h=void 0;if(t&&t!==r&&t!==r.defaultView&&t!==r.documentElement&&t!==r.body){if(!(t instanceof a))return;h=t,f=t.scrollHeight,d=t.scrollWidth}else h=o,f=function(e,t){return Math.max(e.scrollHeight,t.scrollHeight,e.offsetHeight,t.offsetHeight,t.clientHeight)}(i,o),d=function(e,t){return Math.max(e.scrollWidth,t.scrollWidth,e.offsetWidth,t.offsetWidth,t.clientWidth)}(i,o);return{top:s,left:u,bottom:f-(s+c),right:d-(u+l),_container:h}}}}}var Lt=Object.freeze({offset:function(e){var t=e.getBoundingClientRect();return{top:t.top+window.pageYOffset,left:t.left+window.pageXOffset}},overflowParent:kt,overflowOffset:Tt,positionedOffset:jt});var Ot=Object.freeze({microtask:function(){return Promise.resolve()},animationFrame:function(){return new Promise(window.requestAnimationFrame)}});function St(){if(\"Intl\"in window)try{return(new window.Intl.DateTimeFormat).resolvedOptions().timeZone}catch(e){if(!(e instanceof RangeError))throw e}}var At=Object.freeze({default:St});function Mt(e,t){return!!(e&&t in e&&(n=e[t],\"function\"==typeof n&&n.toString().match(/native code/)));var n}var Ct=document.createElement(\"input\");var Dt={beacon:Mt(window.navigator,\"sendBeacon\"),classlist:Pt(),classlistMultiArg:function(){if(Pt())return Ct.classList.add(\"a\",\"b\"),Ct.classList.contains(\"b\");return!1}(),closest:Mt(Ct,\"closest\"),customElements:Mt(window.customElements,\"define\"),customEvent:function(){if(!Mt(window,\"CustomEvent\"))return!1;try{return\"supported\"===new CustomEvent(\"test\",{detail:\"supported\"}).detail}catch(e){return!1}}(),fetch:Mt(window,\"fetch\"),highResolutionTime:Mt(window.performance,\"now\"),matchesSelector:Mt(Ct,\"matches\"),promises:Mt(window,\"Promise\"),stringEndsWith:Mt(String.prototype,\"endsWith\"),stringStartsWith:Mt(String.prototype,\"startsWith\"),timezone:!!St(),url:Mt(window,\"URL\"),urlSearchParams:Mt(window,\"URLSearchParams\"),userTimingEntries:Mt(window.performance,\"getEntries\"),userTimingMark:Mt(window.performance,\"mark\"),weakmap:Mt(window,\"WeakMap\")};function Pt(){return Mt(\"classList\"in Ct&&Ct.classList,\"add\")}var Ht=Object.freeze({default:Dt});function Rt(e){var t=e.querySelector(\"meta[name=html-safe-nonce]\");if(null==t||!(t instanceof HTMLMetaElement))throw new Error(\"could not find html-safe-nonce on document\");var n=t.content;if(n)return n;throw new Error(\"could not find html-safe-nonce on document\")}var Nt=function(e){function t(e,n){l(this,t);var r=p(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e+\" for HTTP \"+n.status));return r.response=n,r}return h(t,e),t}(Error);function It(e,t){var n=t.headers.get(\"content-type\")||\"\";if(!n.startsWith(\"text/html\"))throw new Nt(\"expected response with text/html, but was \"+n,t);var r=t.headers.get(\"x-html-safe\");if(!r)throw new Nt(\"missing X-HTML-Safe nonce\",t);if(r!==e)throw new Nt(\"response X-HTML-Safe nonce did not match\",t)}var qt=Object.freeze({getDocumentHtmlSafeNonce:Rt,verifyResponseHtmlSafeNonce:It});function Ft(e,t){if(\"function\"!=typeof HTMLTemplateElement.bootstrap){var n=e.createElement(\"template\");return n.innerHTML=t,e.importNode(n.content,!0)}var r=e.createDocumentFragment(),i=e.implementation.createHTMLDocument(void 0);o(i.body,\"app/assets/modules/github/parse-html.js:27\"),i.body.innerHTML=t,o(i.body.childNodes,\"app/assets/modules/github/parse-html.js:30\");var a=Array.from(i.body.childNodes),s=!0,u=!1,c=void 0;try{for(var l,f=a[Symbol.iterator]();!(s=(l=f.next()).done);s=!0){var d=l.value;r.appendChild(d)}}catch(e){u=!0,c=e}finally{try{!s&&f.return&&f.return()}finally{if(u)throw c}}return\"function\"==typeof HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(r),r}var Bt=Object.freeze({parseHTML:Ft}),zt=function(e){function t(e){l(this,t);var n=e.statusText?\" \"+e.statusText:\"\",r=p(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,\"HTTP \"+e.status+n));return r.response=e,r}return h(t,e),t}(Error);function Xt(e){if(e.status>=200&&e.status<300)return e;throw new zt(e)}function Vt(e){return e.json()}function Wt(e){return e.text()}function Ut(e,t){var n=t?Object.assign({},t):{};n.credentials||(n.credentials=\"same-origin\");var r=new Request(e,n);if(r.headers.append(\"X-Requested-With\",\"XMLHttpRequest\"),/#csrf-token=/.test(r.url))throw new TypeError(\"URL with encoded CSRF token was passed to fetch() without using the csrfRequest(url) helper\");return r}function Yt(e,t){var n=Ut(e,t);return self.fetch(n).then(Xt)}function Gt(e,t){var n=Ut(e,t);return self.fetch(n).then(Xt).then(Wt)}function Kt(e,t){var n=Ut(e,t);return n.headers.set(\"Accept\",\"application/json\"),self.fetch(n).then(Xt).then(Vt)}var $t=function(){var e=c(regeneratorRuntime.mark(function e(t,n,r){var o,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return o=Ut(n,r),e.next=3,self.fetch(o);case 3:return Xt(i=e.sent),It(Rt(t),i),e.t0=Ft,e.t1=t,e.next=10,i.text();case 10:return e.t2=e.sent,e.abrupt(\"return\",(0,e.t0)(e.t1,e.t2));case 12:case\"end\":return e.stop()}},e,this)}));return function(t,n,r){return e.apply(this,arguments)}}();var Jt=Object.freeze({csrfRequest:function(e,t){var n=new URL(e,window.location.origin),r=t?Object.assign({},t):{},o=n.hash.match(/^#csrf-token=([A-Za-z0-9+/=]+)$/);if(!o)throw new TypeError(\"Expected csrfRequest(url) to have an associated #csrf-token\");n.hash=\"\",e=n.toString(),r.mode=\"same-origin\";var i=new Request(e,r);return i.headers.append(\"Scoped-CSRF-Token\",o[1]),i},fetch:Yt,fetchText:Gt,fetchJSON:Kt,fetchForm:function(e){return Yt(e.action,{method:e.method,body:new FormData(e)})},fetchSafeDocumentFragment:$t,fetchPoll:function(e,t){return new Promise(function(n,r){!function o(i){Yt(e,t).then(function(e){switch(e.status){case 200:n(e);break;case 202:setTimeout(function(){return o(1.5*i)},i);break;default:r(new zt(e))}},r)}(1e3)})}}),Zt=\"function\"==typeof FormData&&\"entries\"in FormData.prototype?function(e){return Array.from(new FormData(e).entries())}:function(e){for(var t=[],n=e.elements,r=0;r<n.length;r++){var o=n[r],i=o.tagName.toUpperCase();if(\"SELECT\"===i||\"TEXTAREA\"===i||\"INPUT\"===i){var a=o.type,s=o.name;if(s&&!o.disabled&&\"submit\"!==a&&\"reset\"!==a&&\"button\"!==a&&(\"radio\"!==a&&\"checkbox\"!==a||o.checked))if(\"SELECT\"===i)for(var u=o.getElementsByTagName(\"option\"),c=0;c<u.length;c++){var l=u[c];l.selected&&t.push([s,l.value])}else\"file\"===a?(console.warn(\"form-data-entries could not serialize <input type=file>\",o),t.push([s,\"\"])):t.push([s,o.value])}}return t};function Qt(e){var t=e.querySelector(\"input.is-submit-button-value\");return t instanceof HTMLInputElement?t:null}function en(e){var t=e.closest(\"form\");if(t instanceof HTMLFormElement){var n=Qt(t);if(e.name){var r=e.matches(\"input[type=submit]\")?\"Submit\":\"\",o=e.value||r;n||((n=document.createElement(\"input\")).type=\"hidden\",n.classList.add(\"is-submit-button-value\"),t.prepend(n)),n.name=e.name,n.value=o}else n&&n.remove()}}var tn=Object.freeze({findPersistedSubmitButtonValue:Qt,persistSubmitButtonValue:en});function nn(e,t,n){return e.dispatchEvent(new CustomEvent(t,{bubbles:!0,cancelable:n}))}function rn(e,t){t&&en(t),nn(e,\"submit\",!0)&&e.submit()}function on(e){if(!(e instanceof HTMLElement))return!1;var t=e.nodeName.toLowerCase(),n=(e.getAttribute(\"type\")||\"\").toLowerCase();return\"select\"===t||\"textarea\"===t||\"input\"===t&&\"submit\"!==n&&\"reset\"!==n||e.isContentEditable}function an(e){var t=new URLSearchParams,n=!0,r=!1,o=void 0;try{for(var i,a=Zt(e)[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value,u=v(s,2),c=u[0],l=u[1];t.append(c,l)}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}return t.toString()}var sn=Object.freeze({submit:rn,changeValue:function(e,t){if(\"boolean\"==typeof t){if(!(e instanceof HTMLInputElement))throw new TypeError(\"only checkboxes can be set to boolean value\");e.checked=t}else{if(\"checkbox\"===e.type)throw new TypeError(\"checkbox can't be set to string value\");e.value=t}nn(e,\"change\",!1)},fillFormValues:function(e,t){for(var n in t){var r=t[n],o=e.elements.namedItem(n);o instanceof HTMLInputElement?o.value=r:o instanceof HTMLTextAreaElement&&(o.value=r)}},isFormField:on,serialize:an});!function(){var e=function(e){this.w=e||[]};e.prototype.set=function(e){this.w[e]=!0},e.prototype.encode=function(){for(var e=[],t=0;t<this.w.length;t++)this.w[t]&&(e[Math.floor(t/6)]^=1<<t%6);for(t=0;t<e.length;t++)e[t]=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".charAt(e[t]||0);return e.join(\"\")+\"~\"};var t=new e;function n(e){t.set(e)}var r=function(t,n){var r=new e(i(t));r.set(n),t.set(it,r.w)},o=function(n){n=i(n),n=new e(n);for(var r=t.w.slice(),o=0;o<n.w.length;o++)r[o]=r[o]||n.w[o];return new e(r).encode()},i=function(e){return e=e.get(it),s(e)||(e=[]),e},a=function(e){return\"function\"==typeof e},s=function(e){return\"[object Array]\"==Object.prototype.toString.call(Object(e))},u=function(e){return void 0!=e&&-1<(e.constructor+\"\").indexOf(\"String\")},c=function(e,t){return 0==e.indexOf(t)},l=function(e){return e?e.replace(/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\"):\"\"},f=function(e){var t=x.createElement(\"img\");return t.width=1,t.height=1,t.src=e,t},d=function(){},h=function(e){return encodeURIComponent instanceof Function?encodeURIComponent(e):(n(28),e)},p=function(e,t,r,o){try{e.addEventListener?e.addEventListener(t,r,!!o):e.attachEvent&&e.attachEvent(\"on\"+t,r)}catch(e){n(27)}},v=/^[\\w\\-:/.?=&%!]+$/,m=function(e,t,n,r){e&&(n?(r=\"\",t&&v.test(t)&&(r=' id=\"'+t+'\"'),v.test(e)&&x.write(\"<script\"+r+' src=\"'+e+'\"><\\/script>')):((n=x.createElement(\"script\")).type=\"text/javascript\",n.async=!0,n.src=e,r&&(n.onload=r),t&&(n.id=t),(e=x.getElementsByTagName(\"script\")[0]).parentNode.insertBefore(n,e)))},g=function(){return\"https:\"==x.location.protocol},b=function(e,t){return(e=e.match(\"(?:&|#|\\\\?)\"+h(t).replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g,\"\\\\$1\")+\"=([^&#]*)\"))&&2==e.length?e[1]:\"\"},y=function(){var e=\"\"+x.location.hostname;return 0==e.indexOf(\"www.\")?e.substring(4):e},w=function(e,t){if(1==t.length&&null!=t[0]&&\"object\"==typeof t[0])return t[0];for(var n={},r=Math.min(e.length+1,t.length),o=0;o<r;o++){if(\"object\"==typeof t[o]){for(var i in t[o])t[o].hasOwnProperty(i)&&(n[i]=t[o][i]);break}o<e.length&&(n[e[o]]=t[o])}return n},E=function(){this.keys=[],this.values={},this.m={}};E.prototype.set=function(e,t,n){this.keys.push(e),n?this.m[\":\"+e]=t:this.values[\":\"+e]=t},E.prototype.get=function(e){return this.m.hasOwnProperty(\":\"+e)?this.m[\":\"+e]:this.values[\":\"+e]},E.prototype.map=function(e){for(var t=0;t<this.keys.length;t++){var n=this.keys[t],r=this.get(n);r&&e(n,r)}};var _=window,x=document,k=window,T=function(e){var t=k._gaUserPrefs;if(t&&t.ioo&&t.ioo()||e&&!0===k[\"ga-disable-\"+e])return!0;try{var n=k.external;if(n&&n._gaUserPrefs&&\"oo\"==n._gaUserPrefs)return!0}catch(e){}return!1},j=function(e){var t=[],n=x.cookie.split(\";\");e=new RegExp(\"^\\\\s*\"+e+\"=\\\\s*(.*?)\\\\s*$\");for(var r=0;r<n.length;r++){var o=n[r].match(e);o&&t.push(o[1])}return t},L=function(e,t,r,o,i,a){if(!(i=!T(i)&&!(A.test(x.location.hostname)||\"/\"==r&&S.test(o))))return!1;if(t&&1200<t.length&&(t=t.substring(0,1200),n(24)),r=e+\"=\"+t+\"; path=\"+r+\"; \",a&&(r+=\"expires=\"+new Date((new Date).getTime()+a).toGMTString()+\"; \"),o&&\"none\"!=o&&(r+=\"domain=\"+o+\";\"),o=x.cookie,x.cookie=r,!(o=o!=x.cookie))e:{for(e=j(e),o=0;o<e.length;o++)if(t==e[o]){o=!0;break e}o=!1}return o},O=function(e){return h(e).replace(/\\(/g,\"%28\").replace(/\\)/g,\"%29\")},S=/^(www\\.)?google(\\.com?)?(\\.[a-z]{2})?$/,A=/(^|\\.)doubleclick\\.net$/i,M=function(){return(le||g()?\"https:\":\"http:\")+\"//www.google-analytics.com\"},C=function(e,t,n){if(n=n||d,2036>=t.length)D(e,t,n);else{if(!(8192>=t.length))throw R(\"len\",t.length),new function(e){this.name=\"len\",this.message=e+\"-8192\"}(t.length);H(e,t,n)||P(e,t,n)||D(e,t,n)}},D=function(e,t,n){var r=f(e+\"?\"+t);r.onload=r.onerror=function(){r.onload=null,r.onerror=null,n()}},P=function(e,t,n){var r=_.XMLHttpRequest;if(!r)return!1;var o=new r;return\"withCredentials\"in o&&(o.open(\"POST\",e,!0),o.withCredentials=!0,o.setRequestHeader(\"Content-Type\",\"text/plain\"),o.onreadystatechange=function(){4==o.readyState&&(n(),o=null)},o.send(t),!0)},H=function(e,t,n){return!!_.navigator.sendBeacon&&(!!_.navigator.sendBeacon(e,t)&&(n(),!0))},R=function(e,t,n){1<=100*Math.random()||T(\"?\")||(e=[\"t=error\",\"_e=\"+e,\"_v=j48\",\"sr=1\"],t&&e.push(\"_f=\"+t),n&&e.push(\"_m=\"+h(n.substring(0,100))),e.push(\"aip=1\"),e.push(\"z=\"+G()),D(M()+\"/collect\",e.join(\"&\"),d))},N=function(e){var t=_.gaData=_.gaData||{};return t[e]=t[e]||{}},I=function(){this.M=[]};function q(e){if(100!=e.get(Ht)&&$n(ee(e,_t))%1e4>=100*te(e,Ht))throw\"abort\"}function F(e){if(T(ee(e,Tt)))throw\"abort\"}function B(){var e=x.location.protocol;if(\"http:\"!=e&&\"https:\"!=e)throw\"abort\"}function z(e){try{_.navigator.sendBeacon?n(42):_.XMLHttpRequest&&\"withCredentials\"in new _.XMLHttpRequest&&n(40)}catch(e){}e.set(ot,o(e),!0),e.set(ye,te(e,ye)+1);var t=[];Z.map(function(n,r){r.F&&(void 0!=(n=e.get(n))&&n!=r.defaultValue&&(\"boolean\"==typeof n&&(n*=1),t.push(r.F+\"=\"+h(\"\"+n))))}),t.push(\"z=\"+K()),e.set(me,t.join(\"&\"),!0)}function X(e){var t=ee(e,It)||M()+\"/collect\",n=ee(e,be);if(!n&&e.get(ge)&&(n=\"beacon\"),n){var r=ee(e,me),o=(o=e.get(ve))||d;\"image\"==n?D(t,r,o):\"xhr\"==n&&P(t,r,o)||\"beacon\"==n&&H(t,r,o)||C(t,r,o)}else C(t,ee(e,me),e.get(ve));t=e.get(Tt),n=(t=N(t)).hitcount,t.hitcount=n?n+1:1,t=e.get(Tt),delete N(t).pending_experiments,e.set(ve,d,!0)}function V(e){var t;(_.gaData=_.gaData||{}).expId&&e.set(Ke,(_.gaData=_.gaData||{}).expId),(_.gaData=_.gaData||{}).expVar&&e.set($e,(_.gaData=_.gaData||{}).expVar);var n=e.get(Tt);if(n=N(n).pending_experiments){var r=[];for(t in n)n.hasOwnProperty(t)&&n[t]&&r.push(encodeURIComponent(t)+\".\"+encodeURIComponent(n[t]));t=r.join(\"!\")}else t=void 0;t&&e.set(Je,t,!0)}function W(){if(_.navigator&&\"preview\"==_.navigator.loadPurpose)throw\"abort\"}function U(e){var t=_.gaDevIds;s(t)&&0!=t.length&&e.set(\"&did\",t.join(\",\"),!0)}function Y(e){if(!e.get(Tt))throw\"abort\"}I.prototype.add=function(e){this.M.push(e)},I.prototype.D=function(e){try{for(var t=0;t<this.M.length;t++){var n=e.get(this.M[t]);n&&a(n)&&n.call(_,e)}}catch(e){}(t=e.get(ve))!=d&&a(t)&&(e.set(ve,d,!0),setTimeout(t,10))};var G=function(){return Math.round(2147483647*Math.random())},K=function(){try{var e=new Uint32Array(1);return _.crypto.getRandomValues(e),2147483647&e[0]}catch(e){return G()}};function $(e){var t=te(e,tt);if(500<=t&&n(15),\"transaction\"!=(r=ee(e,pe))&&\"item\"!=r){var r=te(e,rt),o=(new Date).getTime(),i=te(e,nt);if(0==i&&e.set(nt,o),0<(i=Math.round(2*(o-i)/1e3))&&(r=Math.min(r+i,20),e.set(nt,o)),0>=r)throw\"abort\";e.set(rt,--r)}e.set(tt,++t)}var J=function(){this.data=new E},Z=new E,Q=[];J.prototype.get=function(e){var t=oe(e),n=this.data.get(e);return t&&void 0==n&&(n=a(t.defaultValue)?t.defaultValue():t.defaultValue),t&&t.Z?t.Z(this,e,n):n};var ee=function(e,t){return void 0==(e=e.get(t))?\"\":\"\"+e},te=function(e,t){return void 0==(e=e.get(t))||\"\"===e?0:1*e};J.prototype.set=function(e,t,n){if(e)if(\"object\"==typeof e)for(var r in e)e.hasOwnProperty(r)&&ne(this,r,e[r],n);else ne(this,e,t,n)};var ne=function(e,t,n,r){if(void 0!=n)switch(t){case Tt:Tn.test(n)}var o=oe(t);o&&o.o?o.o(e,t,n,r):e.data.set(t,n,r)},re=function(e,t,n,r,o){this.name=e,this.F=t,this.Z=r,this.o=o,this.defaultValue=n},oe=function(e){var t=Z.get(e);if(!t)for(var n=0;n<Q.length;n++){var r=Q[n],o=r[0].exec(e);if(o){t=r[1](o),Z.set(t.name,t);break}}return t},ie=function(e,t,n,r,o){return e=new re(e,t,n,r,o),Z.set(e.name,e),e.name},ae=function(e,t){Q.push([new RegExp(\"^\"+e+\"$\"),t])},se=function(e,t,n){return ie(e,t,n,void 0,ue)},ue=function(){},ce=u(window.GoogleAnalyticsObject)&&l(window.GoogleAnalyticsObject)||\"ga\",le=!1,fe=se(\"apiVersion\",\"v\"),de=se(\"clientVersion\",\"_v\");ie(\"anonymizeIp\",\"aip\");var he=ie(\"adSenseId\",\"a\"),pe=ie(\"hitType\",\"t\"),ve=ie(\"hitCallback\"),me=ie(\"hitPayload\");ie(\"nonInteraction\",\"ni\"),ie(\"currencyCode\",\"cu\"),ie(\"dataSource\",\"ds\");var ge=ie(\"useBeacon\",void 0,!1),be=ie(\"transport\");ie(\"sessionControl\",\"sc\",\"\"),ie(\"sessionGroup\",\"sg\"),ie(\"queueTime\",\"qt\");var ye=ie(\"_s\",\"_s\");ie(\"screenName\",\"cd\");var we=ie(\"location\",\"dl\",\"\"),Ee=ie(\"referrer\",\"dr\"),_e=ie(\"page\",\"dp\",\"\");ie(\"hostname\",\"dh\");var xe=ie(\"language\",\"ul\"),ke=ie(\"encoding\",\"de\");ie(\"title\",\"dt\",function(){return x.title||void 0}),ae(\"contentGroup([0-9]+)\",function(e){return new re(e[0],\"cg\"+e[1])});var Te=ie(\"screenColors\",\"sd\"),je=ie(\"screenResolution\",\"sr\"),Le=ie(\"viewportSize\",\"vp\"),Oe=ie(\"javaEnabled\",\"je\"),Se=ie(\"flashVersion\",\"fl\");ie(\"campaignId\",\"ci\"),ie(\"campaignName\",\"cn\"),ie(\"campaignSource\",\"cs\"),ie(\"campaignMedium\",\"cm\"),ie(\"campaignKeyword\",\"ck\"),ie(\"campaignContent\",\"cc\");var Ae=ie(\"eventCategory\",\"ec\"),Me=ie(\"eventAction\",\"ea\"),Ce=ie(\"eventLabel\",\"el\"),De=ie(\"eventValue\",\"ev\"),Pe=ie(\"socialNetwork\",\"sn\"),He=ie(\"socialAction\",\"sa\"),Re=ie(\"socialTarget\",\"st\"),Ne=ie(\"l1\",\"plt\"),Ie=ie(\"l2\",\"pdt\"),qe=ie(\"l3\",\"dns\"),Fe=ie(\"l4\",\"rrt\"),Be=ie(\"l5\",\"srt\"),ze=ie(\"l6\",\"tcp\"),Xe=ie(\"l7\",\"dit\"),Ve=ie(\"l8\",\"clt\"),We=ie(\"timingCategory\",\"utc\"),Ue=ie(\"timingVar\",\"utv\"),Ye=ie(\"timingLabel\",\"utl\"),Ge=ie(\"timingValue\",\"utt\");ie(\"appName\",\"an\"),ie(\"appVersion\",\"av\",\"\"),ie(\"appId\",\"aid\",\"\"),ie(\"appInstallerId\",\"aiid\",\"\"),ie(\"exDescription\",\"exd\"),ie(\"exFatal\",\"exf\");var Ke=ie(\"expId\",\"xid\"),$e=ie(\"expVar\",\"xvar\"),Je=ie(\"exp\",\"exp\"),Ze=ie(\"_utma\",\"_utma\"),Qe=ie(\"_utmz\",\"_utmz\"),et=ie(\"_utmht\",\"_utmht\"),tt=ie(\"_hc\",void 0,0),nt=ie(\"_ti\",void 0,0),rt=ie(\"_to\",void 0,20);ae(\"dimension([0-9]+)\",function(e){return new re(e[0],\"cd\"+e[1])}),ae(\"metric([0-9]+)\",function(e){return new re(e[0],\"cm\"+e[1])}),ie(\"linkerParam\",void 0,void 0,function(e){var t=un(e=e.get(_t),0);return\"_ga=1.\"+h(t+\".\"+e)},ue);var ot=ie(\"usage\",\"_u\"),it=ie(\"_um\");ie(\"forceSSL\",void 0,void 0,function(){return le},function(e,t,r){n(34),le=!!r});var at=ie(\"_j1\",\"jid\");ae(\"\\\\&(.*)\",function(e){var t=new re(e[0],e[1]),n=function(e){var t;return Z.map(function(n,r){r.F==e&&(t=r)}),t&&t.name}(e[0].substring(1));return n&&(t.Z=function(e){return e.get(n)},t.o=function(e,t,r,o){e.set(n,r,o)},t.F=void 0),t});var st=se(\"_oot\"),ut=ie(\"previewTask\"),ct=ie(\"checkProtocolTask\"),lt=ie(\"validationTask\"),ft=ie(\"checkStorageTask\"),dt=ie(\"historyImportTask\"),ht=ie(\"samplerTask\"),pt=ie(\"_rlt\"),vt=ie(\"buildHitTask\"),mt=ie(\"sendHitTask\"),gt=ie(\"ceTask\"),bt=ie(\"devIdTask\"),yt=ie(\"timingTask\"),wt=ie(\"displayFeaturesTask\"),Et=se(\"name\"),_t=se(\"clientId\",\"cid\"),xt=se(\"clientIdTime\"),kt=ie(\"userId\",\"uid\"),Tt=se(\"trackingId\",\"tid\"),jt=se(\"cookieName\",void 0,\"_ga\"),Lt=se(\"cookieDomain\"),Ot=se(\"cookiePath\",void 0,\"/\"),St=se(\"cookieExpires\",void 0,63072e3),At=se(\"legacyCookieDomain\"),Mt=se(\"legacyHistoryImport\",void 0,!0),Ct=se(\"storage\",void 0,\"cookie\"),Dt=se(\"allowLinker\",void 0,!1),Pt=se(\"allowAnchor\",void 0,!0),Ht=se(\"sampleRate\",\"sf\",100),Rt=se(\"siteSpeedSampleRate\",void 0,1),Nt=se(\"alwaysSendReferrer\",void 0,!1),It=ie(\"transportUrl\"),qt=ie(\"_r\",\"_r\");function Ft(e,t,r,o){t[e]=function(){try{return o&&n(o),r.apply(this,arguments)}catch(t){throw R(\"exc\",e,t&&t.name),t}}}var Bt=function(e,t,n){this.V=e,this.fa=t,this.$=!1,this.oa=n,this.ea=1},zt=function(e,t){var n;if(e.fa&&e.$)return 0;if(e.$=!0,t){if(e.oa&&te(t,e.oa))return te(t,e.oa);if(0==t.get(Rt))return 0}return 0==e.V?0:(void 0===n&&(n=K()),0==n%e.V?Math.floor(n/e.V)%e.ea+1:0)};var Xt=function(e){var t={};if(Vt(t)||Wt(t)){var n=t[Ne];void 0==n||1/0==n||isNaN(n)||(0<n?(Ut(t,qe),Ut(t,ze),Ut(t,Be),Ut(t,Ie),Ut(t,Fe),Ut(t,Xe),Ut(t,Ve),e(t)):p(_,\"load\",function(){Xt(e)},!1))}},Vt=function(e){var t;if(!(t=(t=_.performance||_.webkitPerformance)&&t.timing))return!1;var n=t.navigationStart;return 0!=n&&(e[Ne]=t.loadEventStart-n,e[qe]=t.domainLookupEnd-t.domainLookupStart,e[ze]=t.connectEnd-t.connectStart,e[Be]=t.responseStart-t.requestStart,e[Ie]=t.responseEnd-t.responseStart,e[Fe]=t.fetchStart-n,e[Xe]=t.domInteractive-n,e[Ve]=t.domContentLoadedEventStart-n,!0)},Wt=function(e){if(_.top!=_)return!1;var t=_.external,n=t&&t.onloadT;return t&&!t.isValidLoadTime&&(n=void 0),2147483648<n&&(n=void 0),0<n&&t.setPageReadyTime(),void 0!=n&&(e[Ne]=n,!0)},Ut=function(e,t){var n=e[t];(isNaN(n)||1/0==n||0>n)&&(e[t]=void 0)},Yt=function(e){return function(t){if(\"pageview\"==t.get(pe)&&!e.I){e.I=!0;var n=function(e){var t=Math.min(te(e,Rt),100);return!($n(ee(e,_t))%100>=t)}(t);t=0<b(t.get(we),\"gclid\").length,(n||t)&&Xt(function(t){e.send(n?\"timing\":\"adtiming\",t)})}}},Gt=!1,Kt=function(e){if(\"cookie\"==ee(e,Ct)){var t=ee(e,jt),r=Zt(e),o=tn(ee(e,Ot)),i=en(ee(e,Lt)),a=1e3*te(e,St),s=ee(e,Tt);if(\"auto\"!=i)L(t,r,o,i,s,a)&&(Gt=!0);else{var u;if(n(32),r=[],4!=(i=y().split(\".\")).length||(u=i[i.length-1],parseInt(u,10)!=u)){for(u=i.length-2;0<=u;u--)r.push(i.slice(u).join(\".\"));r.push(\"none\"),u=r}else u=[\"none\"];for(var c=0;c<u.length;c++)if(i=u[c],e.data.set(Lt,i),r=Zt(e),L(t,r,o,i,s,a))return void(Gt=!0);e.data.set(Lt,\"auto\")}}},$t=function(e){if(\"cookie\"==ee(e,Ct)&&!Gt&&(Kt(e),!Gt))throw\"abort\"},Jt=function(e){if(e.get(Mt)){var t=ee(e,Lt),r=ee(e,At)||y(),o=rn(\"__utma\",r,t);o&&(n(19),e.set(et,(new Date).getTime(),!0),e.set(Ze,o.R),(t=rn(\"__utmz\",r,t))&&o.hash==t.hash&&e.set(Qe,t.R))}},Zt=function(e){var t=O(ee(e,_t)),n=en(ee(e,Lt)).split(\".\").length;return 1<(e=nn(ee(e,Ot)))&&(n+=\"-\"+e),[\"GA1\",n,t].join(\".\")},Qt=function(e,t,n){for(var r,o=[],i=[],a=0;a<e.length;a++){var s=e[a];s.H[n]==t?o.push(s):void 0==r||s.H[n]<r?(i=[s],r=s.H[n]):s.H[n]==r&&i.push(s)}return 0<o.length?o:i},en=function(e){return 0==e.indexOf(\".\")?e.substr(1):e},tn=function(e){return e?(1<e.length&&e.lastIndexOf(\"/\")==e.length-1&&(e=e.substr(0,e.length-1)),0!=e.indexOf(\"/\")&&(e=\"/\"+e),e):\"/\"},nn=function(e){return\"/\"==(e=tn(e))?1:e.split(\"/\").length};function rn(e,t,n){\"none\"==t&&(t=\"\");var r=[],o=j(e);e=\"__utma\"==e?6:2;for(var i=0;i<o.length;i++){var a=(\"\"+o[i]).split(\".\");a.length>=e&&r.push({hash:a[0],R:o[i],O:a})}if(0!=r.length)return 1==r.length?r[0]:on(t,r)||on(n,r)||on(null,r)||r[0]}function on(e,t){var n;null==e?n=e=1:(n=$n(e),e=$n(c(e,\".\")?e.substring(1):\".\"+e));for(var r=0;r<t.length;r++)if(t[r].hash==n||t[r].hash==e)return t[r]}var an=new RegExp(/^https?:\\/\\/([^\\/:]+)/),sn=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/;function un(e,t){var n=new Date,r=_.navigator,o=r.plugins||[];for(e=[e,r.userAgent,n.getTimezoneOffset(),n.getYear(),n.getDate(),n.getHours(),n.getMinutes()+t],t=0;t<o.length;++t)e.push(o[t].description);return $n(e.join(\".\"))}var cn=function(e){n(48),this.target=e,this.T=!1};cn.prototype.ca=function(e,t){if(e.tagName){if(\"a\"==e.tagName.toLowerCase())return void(e.href&&(e.href=ln(this,e.href,t)));if(\"form\"==e.tagName.toLowerCase())return fn(this,e)}if(\"string\"==typeof e)return ln(this,e,t)};var ln=function(e,t,n){(o=sn.exec(t))&&3<=o.length&&(t=o[1]+(o[3]?o[2]+o[3]:\"\")),e=e.target.get(\"linkerParam\");var r=t.indexOf(\"?\"),o=t.indexOf(\"#\");return n?t+=(-1==o?\"#\":\"&\")+e:(n=-1==r?\"?\":\"&\",t=-1==o?t+(n+e):t.substring(0,o)+n+e+t.substring(o)),t.replace(/&+_ga=/,\"&_ga=\")},fn=function(e,t){if(t&&t.action){var n=e.target.get(\"linkerParam\").split(\"=\")[1];if(\"get\"==t.method.toLowerCase()){e=t.childNodes||[];for(var r=0;r<e.length;r++)if(\"_ga\"==e[r].name)return void e[r].setAttribute(\"value\",n);(e=x.createElement(\"input\")).setAttribute(\"type\",\"hidden\"),e.setAttribute(\"name\",\"_ga\"),e.setAttribute(\"value\",n),t.appendChild(e)}else\"post\"==t.method.toLowerCase()&&(t.action=ln(e,t.action))}};function dn(e,t){if(t==x.location.hostname)return!1;for(var n=0;n<e.length;n++)if(e[n]instanceof RegExp){if(e[n].test(t))return!0}else if(0<=t.indexOf(e[n]))return!0;return!1}cn.prototype.S=function(e,t,r){function o(r){try{var o;r=r||_.event;e:{var a=r.target||r.srcElement;for(r=100;a&&0<r;){if(a.href&&a.nodeName.match(/^a(?:rea)?$/i)){o=a;break e}a=a.parentNode,r--}o={}}(\"http:\"==o.protocol||\"https:\"==o.protocol)&&dn(e,o.hostname||\"\")&&o.href&&(o.href=ln(i,o.href,t))}catch(e){n(26)}}var i=this;this.T||(this.T=!0,p(x,\"mousedown\",o,!1),p(x,\"keyup\",o,!1)),r&&p(x,\"submit\",function(t){if((t=(t=t||_.event).target||t.srcElement)&&t.action){var n=t.action.match(an);n&&dn(e,n[1])&&fn(i,t)}})};var hn,pn=/^(GTM|OPT)-[A-Z0-9]+$/,vn=/;_gaexp=[^;]*/g,mn=/;((__utma=)|([^;=]+=GAX?\\d+\\.))[^;]*/g,gn=function(e,t,r){this.U=at,this.aa=t,(t=r)||(t=(t=ee(e,Et))&&\"t0\"!=t?En.test(t)?\"_gat_\"+O(ee(e,Tt)):\"_gat_\"+O(t):\"_gat\"),this.Y=t,zt(new Bt(10),e)&&(n(30),this.pa=!0)},bn=function(e,t){t.get(e.U)||(\"1\"==j(e.Y)[0]?t.set(e.U,\"\",!0):t.set(e.U,\"\"+G(),!0))},yn=function(e,t){if(t.get(e.U)){var n=6e5;e.pa&&(n/=10),L(e.Y,\"1\",t.get(Ot),t.get(Lt),t.get(Tt),n)}},wn=function(e,t){if(t.get(e.U)){var n=new E,r=function(e){oe(e).F&&n.set(oe(e).F,t.get(e))};r(fe),r(de),r(Tt),r(_t),r(kt),r(e.U),n.set(oe(ot).F,o(t));var i=e.aa;n.map(function(e,t){i+=h(e)+\"=\",i+=h(\"\"+t)+\"&\"}),i+=\"z=\"+G(),f(i),t.set(e.U,\"\",!0)}},En=/^gtm\\d+$/,_n=function(e,t){var n;(e=e.b).get(\"dcLoaded\")||(r(e,29),(t=t||{})[jt]&&(n=O(t[jt])),function(e,t){var n=t.get(vt);t.set(vt,function(t){bn(e,t);var r=n(t);return yn(e,t),r});var r=t.get(mt);t.set(mt,function(t){var n=r(t);return wn(e,t),n})}(t=new gn(e,\"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&\",n),e),e.set(\"dcLoaded\",!0))},xn=function(e){if(!e.get(\"dcLoaded\")&&\"cookie\"==e.get(Ct)){r(e,51);var t=new gn(e);bn(t,e),yn(t,e),e.get(t.U)&&(e.set(qt,1,!0),e.set(It,M()+\"/r/collect\",!0))}},kn=function(e){return e?(1*e).toFixed(3):\"0\"},Tn=/^(UA|YT|MO|GP)-(\\d+)-(\\d+)$/,jn=function(e){function t(e,t){i.b.data.set(e,t)}function r(e,n){t(e,n),i.filters.add(e)}function o(e,t,r){zt(new Bt(1e4,!0,t),i.b)&&(e=j(e))&&0<e.length&&n(r)}var i=this;this.b=new J,this.filters=new I,t(Et,e[Et]),t(Tt,l(e[Tt])),t(jt,e[jt]),t(Lt,e[Lt]||y()),t(Ot,e[Ot]),t(St,e[St]),t(At,e[At]),t(Mt,e[Mt]),t(Dt,e[Dt]),t(Pt,e[Pt]),t(Ht,e[Ht]),t(Rt,e[Rt]),t(Nt,e[Nt]),t(Ct,e[Ct]),t(kt,e[kt]),t(xt,e[xt]),t(fe,1),t(de,\"j48\"),r(st,F),r(ut,W),r(ct,B),r(lt,Y),r(ft,$t),r(dt,Jt),r(ht,q),r(pt,$),r(gt,V),r(bt,U),r(wt,xn),r(vt,z),r(mt,X),r(yt,Yt(this)),Ln(this.b,e[_t]),On(this.b),this.b.set(he,function(){var e=_.gaGlobal=_.gaGlobal||{};return e.hid=e.hid||G()}()),function(e,t,n){if(!hn){var r;r=x.location.hash;var o=_.name,i=/^#?gaso=([^&]*)/;(o=(r=(r=r&&r.match(i)||o&&o.match(i))?r[1]:j(\"GASO\")[0]||\"\")&&r.match(/^(?:!([-0-9a-z.]{1,40})!)?([-.\\w]{10,1200})$/i))&&(L(\"GASO\",\"\"+r,n,t,e,0),window._udo||(window._udo=t),window._utcp||(window._utcp=n),e=o[1],m(\"https://www.google.com/analytics/web/inpage/pub/inpage.js?\"+(e?\"prefix=\"+e+\"&\":\"\")+G(),\"_gasojs\")),hn=!0}}(this.b.get(Tt),this.b.get(Lt),this.b.get(Ot)),this.ra=new Bt(1e4,!0,\"gaexp10\"),o(\"_gid\",\"gacookie11\",41),o(\"_gaid\",\"gacookie12\",44)},Ln=function(e,t){if(\"cookie\"==ee(e,Ct)){var r;Gt=!1;e:{var o=j(ee(e,jt));if(o&&!(1>o.length)){r=[];for(var i=0;i<o.length;i++){var a,s=(a=o[i].split(\".\")).shift();(\"GA1\"==s||\"1\"==s)&&1<a.length?(1==(s=a.shift().split(\"-\")).length&&(s[1]=\"1\"),s[0]*=1,s[1]*=1,a={H:s,s:a.join(\".\")}):a=void 0,a&&r.push(a)}if(1==r.length){n(13),r=r[0].s;break e}if(0!=r.length){if(n(14),o=en(ee(e,Lt)).split(\".\").length,1==(r=Qt(r,o,0)).length){r=r[0].s;break e}o=nn(ee(e,Ot)),r=(r=Qt(r,o,1))[0]&&r[0].s;break e}n(12)}r=void 0}r||(r=ee(e,Lt),void 0!=(r=rn(\"__utma\",o=ee(e,At)||y(),r))?(n(10),r=r.O[1]+\".\"+r.O[2]):r=void 0),r&&(e.data.set(_t,r),Gt=!0)}if(r=e.get(Pt),(i=b(x.location[r?\"href\":\"search\"],\"_ga\"))&&(e.get(Dt)?-1==(r=i.indexOf(\".\"))?n(22):(o=i.substring(r+1),\"1\"!=i.substring(0,r)?n(22):-1==(r=o.indexOf(\".\"))?n(22):(i=o.substring(0,r))!=un(r=o.substring(r+1),0)&&i!=un(r,-1)&&i!=un(r,-2)?n(23):(n(11),e.data.set(_t,r))):n(21)),t&&(n(9),e.data.set(_t,h(t))),!e.get(_t))if(t=(t=_.gaGlobal&&_.gaGlobal.vid)&&-1!=t.search(/^(?:utma\\.)?\\d+\\.\\d+$/)?t:void 0)n(17),e.data.set(_t,t);else{for(n(8),r=(t=_.navigator.userAgent+(x.cookie?x.cookie:\"\")+(x.referrer?x.referrer:\"\")).length,o=_.history.length;0<o;)t+=o--^r++;e.data.set(_t,[G()^2147483647&$n(t),Math.round((new Date).getTime()/1e3)].join(\".\"))}Kt(e)},On=function(e){var t=_.navigator,r=_.screen,o=x.location;if(e.set(Ee,function(e){var t=x.referrer;if(/^https?:\\/\\//i.test(t)){if(e)return t;e=\"//\"+x.location.hostname;var n=t.indexOf(e);if(!(5!=n&&6!=n||\"/\"!=(e=t.charAt(n+e.length))&&\"?\"!=e&&\"\"!=e&&\":\"!=e))return;return t}}(e.get(Nt))),o){var i=o.pathname||\"\";\"/\"!=i.charAt(0)&&(n(31),i=\"/\"+i),e.set(we,o.protocol+\"//\"+o.hostname+i+o.search)}r&&e.set(je,r.width+\"x\"+r.height),r&&e.set(Te,r.colorDepth+\"-bit\");r=x.documentElement;var a=(i=x.body)&&i.clientWidth&&i.clientHeight,s=[];if(r&&r.clientWidth&&r.clientHeight&&(\"CSS1Compat\"===x.compatMode||!a)?s=[r.clientWidth,r.clientHeight]:a&&(s=[i.clientWidth,i.clientHeight]),r=0>=s[0]||0>=s[1]?\"\":s.join(\"x\"),e.set(Le,r),e.set(Se,function(){var e,t,n;if((n=(n=_.navigator)?n.plugins:null)&&n.length)for(var r=0;r<n.length&&!t;r++){var o=n[r];-1<o.name.indexOf(\"Shockwave Flash\")&&(t=o.description)}if(!t)try{t=(e=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\")).GetVariable(\"$version\")}catch(e){}if(!t)try{e=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\"),t=\"WIN 6,0,21,0\",e.AllowScriptAccess=\"always\",t=e.GetVariable(\"$version\")}catch(e){}if(!t)try{t=(e=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\")).GetVariable(\"$version\")}catch(e){}return t&&(e=t.match(/[\\d]+/g))&&3<=e.length&&(t=e[0]+\".\"+e[1]+\" r\"+e[2]),t||void 0}()),e.set(ke,x.characterSet||x.charset),e.set(Oe,t&&\"function\"==typeof t.javaEnabled&&t.javaEnabled()||!1),e.set(xe,(t&&(t.language||t.browserLanguage)||\"\").toLowerCase()),o&&e.get(Pt)&&(t=x.location.hash)){for(t=t.split(/[?&#]+/),o=[],r=0;r<t.length;++r)(c(t[r],\"utm_id\")||c(t[r],\"utm_campaign\")||c(t[r],\"utm_source\")||c(t[r],\"utm_medium\")||c(t[r],\"utm_term\")||c(t[r],\"utm_content\")||c(t[r],\"gclid\")||c(t[r],\"dclid\")||c(t[r],\"gclsrc\"))&&o.push(t[r]);0<o.length&&(t=\"#\"+o.join(\"&\"),e.set(we,e.get(we)+t))}};jn.prototype.get=function(e){return this.b.get(e)},jn.prototype.set=function(e,t){this.b.set(e,t)};var Sn={pageview:[_e],event:[Ae,Me,Ce,De],social:[Pe,He,Re],timing:[We,Ue,Ge,Ye]};jn.prototype.send=function(e){var t,r;1>arguments.length||(\"string\"==typeof arguments[0]?(t=arguments[0],r=[].slice.call(arguments,1)):(t=arguments[0]&&arguments[0][pe],r=arguments),t&&((r=w(Sn[t]||[],r))[pe]=t,this.b.set(r,void 0,!0),this.filters.D(this.b),this.b.data.m={},zt(this.ra,this.b)&&function(e){var t=_.performance;if(t&&t.getEntriesByName){n(35);var r=\"https://www.google-analytics.com/analytics.js?wpid=\"+e;m(r,void 0,void 0,function(){try{var o=1,i=t.getEntriesByName(\"https://www.google-analytics.com/analytics.js\");i&&0!=i.length||(i=t.getEntriesByName(\"http://www.google-analytics.com/analytics.js\"),o=0);var a=t.getEntriesByName(r);if(i&&1==i.length&&a&&1==a.length){n(37);var s=i[0],u=a[0],c={tid:e,ad:kn(s.duration),bd:kn(u.duration),ar:kn(s.responseEnd-s.requestStart),br:kn(u.responseEnd-u.requestStart),an:kn(s.domainLookupEnd-s.domainLookupStart),bn:kn(u.domainLookupEnd-u.domainLookupStart),ac:kn(s.connectEnd-s.connectStart),bc:kn(u.connectEnd-u.connectStart),as:o};for(var l in(o=[]).push(\"_v=j48\"),o.push(\"id=10\"),c)c.hasOwnProperty(l)&&o.push(l+\"=\"+h(c[l]));o.push(\"z=\"+G()),D(\"https://www.google-analytics.com/u/d\",o.join(\"&\"),d)}}catch(e){}})}}(this.b.get(Tt))))},jn.prototype.ma=function(e,t){var n=this;qn(e,n,t)||(Bn(e,function(){qn(e,n,t)}),Fn(String(n.get(Et)),e,void 0,t,!0))};var An,Mn,Cn,Dn,Pn=function(e){return\"prerender\"!=x.visibilityState&&(e(),!0)},Hn=function(e){if(!Pn(e)){n(16);var t=!1,r=function(){if(!t&&Pn(e)){t=!0;var n=r,o=x;o.removeEventListener?o.removeEventListener(\"visibilitychange\",n,!1):o.detachEvent&&o.detachEvent(\"onvisibilitychange\",n)}};p(x,\"visibilitychange\",r)}},Rn=/^(?:(\\w+)\\.)?(?:(\\w+):)?(\\w+)$/,Nn=function(e){if(a(e[0]))this.u=e[0];else{var t=Rn.exec(e[0]);if(null!=t&&4==t.length&&(this.c=t[1]||\"t0\",this.K=t[2]||\"\",this.C=t[3],this.a=[].slice.call(e,1),this.K||(this.A=\"create\"==this.C,this.i=\"require\"==this.C,this.g=\"provide\"==this.C,this.ba=\"remove\"==this.C),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(u(this.a[1])?this.X=this.a[1]:this.W=this.a[1]))),t=e[1],e=e[2],!this.C)throw\"abort\";if(this.i&&(!u(t)||\"\"==t))throw\"abort\";if(this.g&&(!u(t)||\"\"==t||!a(e)))throw\"abort\";if(In(this.c)||In(this.K))throw\"abort\";if(this.g&&\"t0\"!=this.c)throw\"abort\"}};function In(e){return 0<=e.indexOf(\".\")||0<=e.indexOf(\":\")}An=new E,Cn=new E,Dn=new E,Mn={ec:45,ecommerce:46,linkid:47};var qn=function(e,t,n){t==Un||t.get(Et);var r=An.get(e);return!!a(r)&&(t.plugins_=t.plugins_||new E,!!t.plugins_.get(e)||(t.plugins_.set(e,new r(t,n||{})),!0))},Fn=function(e,t,r,o,i){if(!a(An.get(t))&&!Cn.get(t)){if(Mn.hasOwnProperty(t)&&n(Mn[t]),pn.test(t)){if(n(52),!(e=Un.j(e)))return!0;o={id:t,B:(r=o||{}).dataLayer||\"dataLayer\",ia:!!e.get(\"anonymizeIp\"),na:i,G:!1},e.get(\"&gtm\")==t&&(o.G=!0);var s=String(e.get(\"name\"));\"t0\"!=s&&(o.target=s),T(String(e.get(\"trackingId\")))||(o.ja=String(e.get(_t)),o.ka=Number(e.get(xt)),r=r.palindrome?mn:vn,r=(r=x.cookie.replace(/^|(; +)/g,\";\").match(r))?r.sort().join(\"\").substring(1):void 0,o.la=r,o.qa=b(e.b.get(we)||\"\",\"gclid\")),e=o.B,r=(new Date).getTime(),_[e]=_[e]||[],r={\"gtm.start\":r},i||(r.event=\"gtm.js\"),_[e].push(r),r=function(e){function t(e,t){t&&(n+=\"&\"+e+\"=\"+h(t))}var n=\"https://www.google-analytics.com/gtm/js?id=\"+h(e.id);return\"dataLayer\"!=e.B&&t(\"l\",e.B),t(\"t\",e.target),t(\"cid\",e.ja),t(\"cidt\",e.ka),t(\"gac\",e.la),t(\"aip\",e.ia),e.na&&t(\"m\",\"sync\"),t(\"cycle\",e.G),e.qa&&t(\"gclid\",e.qa),n}(o)}!r&&Mn.hasOwnProperty(t)?(n(39),r=t+\".js\"):n(43),r&&(r&&0<=r.indexOf(\"/\")||(r=(le||g()?\"https:\":\"http:\")+\"//www.google-analytics.com/plugins/ua/\"+r),e=(o=Vn(r)).protocol,r=x.location.protocol,(\"https:\"==e||e==r||\"http:\"==e&&\"http:\"==r)&&Xn(o)&&(m(o.url,void 0,i),Cn.set(t,!0)))}},Bn=function(e,t){var n=Dn.get(e)||[];n.push(t),Dn.set(e,n)},zn=function(e,t){An.set(e,t),t=Dn.get(e)||[];for(var n=0;n<t.length;n++)t[n]();Dn.set(e,[])},Xn=function(e){var t=Vn(x.location.href);return!!c(e.url,\"https://www.google-analytics.com/gtm/js?id=\")||!(e.query||0<=e.url.indexOf(\"?\")||0<=e.path.indexOf(\"://\"))&&(e.host==t.host&&e.port==t.port||(t=\"http:\"==e.protocol?80:443,!(\"www.google-analytics.com\"!=e.host||(e.port||t)!=t||!c(e.path,\"/plugins/\"))))},Vn=function(e){function t(e){var t=(e.hostname||\"\").split(\":\")[0].toLowerCase(),n=(e.protocol||\"\").toLowerCase();n=1*e.port||(\"http:\"==n?80:\"https:\"==n?443:\"\");return e=e.pathname||\"\",c(e,\"/\")||(e=\"/\"+e),[t,\"\"+n,e]}var n=x.createElement(\"a\");n.href=x.location.href;var r=(n.protocol||\"\").toLowerCase(),o=t(n),i=n.search||\"\",a=r+\"//\"+o[0]+(o[1]?\":\"+o[1]:\"\");return c(e,\"//\")?e=r+e:c(e,\"/\")?e=a+e:!e||c(e,\"?\")?e=a+o[2]+(e||i):0>e.split(\"/\")[0].indexOf(\":\")&&(e=a+o[2].substring(0,o[2].lastIndexOf(\"/\"))+\"/\"+e),n.href=e,r=t(n),{protocol:(n.protocol||\"\").toLowerCase(),host:r[0],port:r[1],path:r[2],query:n.search||\"\",url:e||\"\"}},Wn={ga:function(){Wn.f=[]}};Wn.ga(),Wn.D=function(e){var t=Wn.J.apply(Wn,arguments);t=Wn.f.concat(t);for(Wn.f=[];0<t.length&&!Wn.v(t[0])&&(t.shift(),!(0<Wn.f.length)););Wn.f=Wn.f.concat(t)},Wn.J=function(e){for(var t=[],n=0;n<arguments.length;n++)try{var r=new Nn(arguments[n]);r.g?zn(r.a[0],r.a[1]):(r.i&&(r.ha=Fn(r.c,r.a[0],r.X,r.W)),t.push(r))}catch(e){}return t},Wn.v=function(e){try{if(e.u)e.u.call(_,Un.j(\"t0\"));else{var t=e.c==ce?Un:Un.j(e.c);if(e.A)\"t0\"!=e.c||Un.create.apply(Un,e.a);else if(e.ba)Un.remove(e.c);else if(t)if(e.i){if(e.ha&&(e.ha=Fn(e.c,e.a[0],e.X,e.W)),!qn(e.a[0],t,e.W))return!0}else if(e.K){var n=e.C,r=e.a,o=t.plugins_.get(e.K);o[n].apply(o,r)}else t[e.C].apply(t,e.a)}}catch(e){}};var Un=function(e){n(1),Wn.D.apply(Wn,[arguments])};Un.h={},Un.P=[],Un.L=0,Un.answer=42;var Yn=[Tt,Lt,Et];Un.create=function(e){var t=w(Yn,[].slice.call(arguments));t[Et]||(t[Et]=\"t0\");var n=\"\"+t[Et];return Un.h[n]?Un.h[n]:(t=new jn(t),Un.h[n]=t,Un.P.push(t),t)},Un.remove=function(e){for(var t=0;t<Un.P.length;t++)if(Un.P[t].get(Et)==e){Un.P.splice(t,1),Un.h[e]=null;break}},Un.j=function(e){return Un.h[e]},Un.getAll=function(){return Un.P.slice(0)},Un.N=function(){\"ga\"!=ce&&n(49);var e=_[ce];if(!e||42!=e.answer){if(Un.L=e&&e.l,Un.loaded=!0,Ft(\"create\",t=_[ce]=Un,t.create),Ft(\"remove\",t,t.remove),Ft(\"getByName\",t,t.j,5),Ft(\"getAll\",t,t.getAll,6),Ft(\"get\",t=jn.prototype,t.get,7),Ft(\"set\",t,t.set,4),Ft(\"send\",t,t.send),Ft(\"requireSync\",t,t.ma),Ft(\"get\",t=J.prototype,t.get),Ft(\"set\",t,t.set),!g()&&!le){e:{for(var t=x.getElementsByTagName(\"script\"),r=0;r<t.length&&100>r;r++){var o=t[r].src;if(o&&0==o.indexOf(\"https://www.google-analytics.com/analytics\")){n(33),t=!0;break e}}t=!1}t&&(le=!0)}g()||le||!zt(new Bt(1e4))||(n(36),le=!0),(_.gaplugins=_.gaplugins||{}).Linker=cn,t=cn.prototype,zn(\"linker\",cn),Ft(\"decorate\",t,t.ca,20),Ft(\"autoLink\",t,t.S,25),zn(\"displayfeatures\",_n),zn(\"adfeatures\",_n),e=e&&e.q,s(e)?Wn.D.apply(Un,e):n(50)}},Un.da=function(){for(var e=Un.getAll(),t=0;t<e.length;t++)e[t].get(Et)};var Gn=Un.N,Kn=_[ce];function $n(e){var t,n,r=1;if(e)for(r=0,n=e.length-1;0<=n;n--)r=0!=(t=266338304&(r=(r<<6&268435455)+(t=e.charCodeAt(n))+(t<<14)))?r^t>>21:r;return r}Kn&&Kn.r?Gn():Hn(Gn),Hn(function(){Wn.D([\"provide\",\"render\",d])})}(window),function(){var e=window,t=\"push\",n=\"length\",r=\"prototype\",o=function(e){if(e.get&&e.set){this.clear();var t=e.get(\"buildHitTask\");e.set(\"buildHitTask\",l(this,t)),e.set(\"_rlt\",f(this,e.get(\"_rlt\")))}},i={action:\"pa\",promoAction:\"promoa\",id:\"ti\",affiliation:\"ta\",revenue:\"tr\",tax:\"tt\",shipping:\"ts\",coupon:\"tcc\",step:\"cos\",label:\"col\",option:\"col\",options:\"col\",list:\"pal\",listSource:\"pls\"},a={id:\"id\",name:\"nm\",brand:\"br\",category:\"ca\",variant:\"va\",position:\"ps\",price:\"pr\",quantity:\"qt\",coupon:\"cc\",\"dimension(\\\\d+)\":\"cd\",\"metric(\\\\d+)\":\"cm\"},s={id:\"id\",name:\"nm\",creative:\"cr\",position:\"ps\"},u=\"detail checkout checkout_option click add remove purchase refund\".split(\" \");o[r].clear=function(){this.b=void 0,this.f=[],this.a=[],this.g=[],this.d=void 0},o[r].h=function(e,t){var n=t||{};\"promo_click\"==e?n.promoAction=\"click\":n.action=e,this.b=d(n)},o[r].j=function(e){(e=d(e))&&this.f[t](e)},o[r].i=function(e){var r=d(e);if(r){var o,i=e.list||\"\";e=e.listSource||\"\";for(var a=0;a<this.a[n];a++)if(this.a[a].name==i){o=this.a[a];break}o||(o=new function(e,t){this.name=e,this.source=t,this.e=[]}(i,e),this.a[t](o)),o.e[t](r)}},o[r].c=function(e){(e=d(e))&&this.g[t](e)};var c=function(e,t,o){if(\"[object Array]\"==Object[r].toString.call(Object(e)))for(var i=0;i<e[n];i++)t.call(o,e[i])};o[r].data=function(e){if(e&&e.ecommerce){(e=e.ecommerce).promoView&&c(e.promoView.promotions,this.c,this),e.promoClick&&(this.h(\"promo_click\",e.promoClick.actionField),c(e.promoClick.promotions,this.c,this));for(var t=0;t<u[n];t++){var r=e[u[t]];if(r){this.h(u[t],r.actionField),c(r.products,this.j,this);break}}c(e.impressions,this.i,this),e.currencyCode&&(this.d=e.currencyCode)}};var l=function(e,t){return function(r){var o,u,c;for(e.b&&h(i,e.b,r,\"&\"),o=0;o<e.f[n];o++)u=\"&pr\"+(o+1),h(a,e.f[o],r,u);for(o=0;o<e.a[n];o++){u=\"&il\"+(o+1),(c=e.a[o]).name&&r.set(u+\"nm\",c.name,!0),c.source&&r.set(u+\"ls\",c.source,!0);for(var l=0;l<c.e[n];l++)h(a,c.e[l],r,u+\"pi\"+(l+1))}for(o=0;o<e.g[n];o++)u=\"&promo\"+(o+1),h(s,e.g[o],r,u);return e.d&&r.set(\"&cu\",e.d,!0),e.clear(),t(r)}},f=function(e,t){return function(n){var r=e.b&&e.b.action;if(\"purchase\"!=r&&\"refund\"!=r)return t(n)}},d=function(e){var t=0,n={};if(e&&\"object\"==typeof e)for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r],t++);return t?n:void 0},h=function(e,t,n,r){for(var o in t)if(t.hasOwnProperty(o))for(var i in e)if(e.hasOwnProperty(i)){var a=o.match(\"^\"+i+\"$\");a&&n.set(r+e[i]+a.slice(1).join(\"\"),t[o],!0)}};!function(){e.gaplugins=e.gaplugins||{},e.gaplugins.EC=o,o[r].setAction=o[r].h,o[r].addProduct=o[r].j,o[r].addImpression=o[r].i,o[r].addPromo=o[r].c,o[r].clear=o[r].clear,o[r].data=o[r].data;var n=e.GoogleAnalyticsObject||\"ga\";e[n]=e[n]||function(){(e[n].q=e[n].q||[])[t](arguments)},e[n](\"provide\",\"ec\",o)}()}(),window.ga||(window.ga=function(){window.ga.q.push(arguments)},window.ga.q=[]);var un=Object.freeze({trackPageview:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.page=e,window.ga(\"send\",\"pageview\",t)},setDimension:function(e,t){window.ga(\"set\",e,t)},setGlobalLocation:function(e){window.ga(\"set\",{location:e})},setGlobalTitle:function(e){window.ga(\"set\",{title:e})},setGlobalAccount:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.ga(\"create\",e,t,n),window.ga(\"set\",\"transport\",\"sendBeacon\"in window.navigator?\"beacon\":\"xhr\")},providePlugin:function(e,t){var n=window[window.GoogleAnalyticsObject||\"ga\"];\"function\"==typeof n&&n(\"provide\",e,t)},requirePlugin:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};window.ga(function(){window.ga(\"require\",e,t)})},trackEvent:function(e){void 0===e.interactive&&(e.interactive=!0),window.ga(\"send\",\"event\",e.category,e.action,e.label,e.value,{nonInteraction:!e.interactive})}});function cn(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return ln(e)||function(e,t){var n=e.ownerDocument.activeElement;if(!n)return!1;if(t&&n===e)return!1;return on(n)&&e===n||e.contains(n)}(e,t)||function(e){return e.matches(\":active\")}(e)||function(e){return!(!e.closest(\".is-dirty\")&&!e.querySelector(\".is-dirty\"))}(e)}function ln(e){var t=!0,n=!1,r=void 0;try{for(var o,i=e.querySelectorAll(\"input, textarea\")[Symbol.iterator]();!(t=(o=i.next()).done);t=!0){var a=o.value;if((a instanceof HTMLInputElement||a instanceof HTMLTextAreaElement)&&fn(a))return!0}}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}return!1}function fn(e){if(e instanceof HTMLInputElement&&(\"checkbox\"===e.type||\"radio\"===e.type)){if(e.checked!==e.defaultChecked)return!0}else if(e.value!==e.defaultValue)return!0;return!1}var dn=Object.freeze({hasInteractions:cn,hasDirtyFields:ln}),hn=function(){function e(t){l(this,e),this.children=[],this.parent=t}return f(e,[{key:\"delete\",value:function(e){var t=this.children.indexOf(e);return-1!==t&&(this.children=this.children.slice(0,t).concat(this.children.slice(t+1)),0===this.children.length&&this.parent.delete(this),!0)}},{key:\"add\",value:function(e){return this.children.push(e),this}}]),e}(),pn=function(){function e(t){l(this,e),this.parent=null,this.children={},this.parent=t||null}return f(e,[{key:\"get\",value:function(e){return this.children[e]}},{key:\"insert\",value:function(t){for(var n=this,r=0;r<t.length;r+=1){var o=t[r],i=n.get(o);if(r===t.length-1)return i instanceof e&&(n.delete(i),i=null),i||(i=new hn(n),n.children[o]=i),i;i instanceof hn&&(i=null),i||(i=new e(n),n.children[o]=i),n=i}return n}},{key:\"delete\",value:function(e){for(var t in this.children){if(this.children[t]===e){var n=delete this.children[t];return 0===Object.keys(this.children).length&&this.parent&&this.parent.delete(this),n}}return!1}}]),e}(),vn=Object.freeze({Leaf:hn,RadixTrie:pn}),mn=null,gn=null,bn=[];function yn(e,t){var n=[];function r(){var e=n;n=[],t(e)}return function(){for(var t=arguments.length,o=Array(t),i=0;i<t;i++)o[i]=arguments[i];n.push(o),1===n.length&&wn(e,r)}}function wn(e,t){gn||(gn=new MutationObserver(En)),mn||(mn=e.createElement(\"div\"),gn.observe(mn,{attributes:!0})),bn.push(t),mn.setAttribute(\"data-twiddle\",\"\"+Date.now())}function En(){var e=bn;bn=[];for(var t=0;t<e.length;t++)try{e[t]()}catch(e){setTimeout(function(){throw e},0)}}var _n=new WeakMap,xn=new WeakMap,kn=new WeakMap,Tn=new WeakMap;function jn(e,t){for(var n=0;n<t.length;n++){var r=t[n],o=r[0],i=r[1],a=r[2];o===Cn?(Ln(a,i),On(a,i)):o===Dn?Sn(a,i):o===Pn&&An(e.observers,i)}}function Ln(e,t){if(t instanceof e.elementConstructor){var n=_n.get(t);if(n||(n=[],_n.set(t,n)),-1===n.indexOf(e.id)){var r=void 0;if(e.initialize&&(r=e.initialize.call(void 0,t)),r){var o=xn.get(t);o||(o={},xn.set(t,o)),o[\"\"+e.id]=r}n.push(e.id)}}}function On(e,t){if(t instanceof e.elementConstructor){var n=Tn.get(t);if(n||(n=[],Tn.set(t,n)),-1===n.indexOf(e.id)){e.elements.push(t);var r=xn.get(t),o=r?r[\"\"+e.id]:null;if(o&&o.add&&o.add.call(void 0,t),e.subscribe){var i=e.subscribe.call(void 0,t);if(i){var a=kn.get(t);a||(a={},kn.set(t,a)),a[\"\"+e.id]=i}}e.add&&e.add.call(void 0,t),n.push(e.id)}}}function Sn(e,t){if(t instanceof e.elementConstructor){var n=Tn.get(t);if(n){var r=e.elements.indexOf(t);if(-1!==r&&e.elements.splice(r,1),-1!==(r=n.indexOf(e.id))){var o=xn.get(t),i=o?o[\"\"+e.id]:null;if(i&&i.remove&&i.remove.call(void 0,t),e.subscribe){var a=kn.get(t),s=a?a[\"\"+e.id]:null;s&&s.unsubscribe&&s.unsubscribe()}e.remove&&e.remove.call(void 0,t),n.splice(r,1)}0===n.length&&Tn.delete(t)}}}function An(e,t){var n=Tn.get(t);if(n){for(var r=n.slice(0),o=0;o<r.length;o++){var i=e[r[o]];if(i){var a=i.elements.indexOf(t);-1!==a&&i.elements.splice(a,1);var s=xn.get(t),u=s?s[\"\"+i.id]:null;u&&u.remove&&u.remove.call(void 0,t);var c=kn.get(t),l=c?c[\"\"+i.id]:null;l&&l.unsubscribe&&l.unsubscribe(),i.remove&&i.remove.call(void 0,t)}}Tn.delete(t)}}var Mn=null;var Cn=1,Dn=2,Pn=3;function Hn(e,t,n){for(var r=0;r<n.length;r++){var o=n[r];\"childList\"===o.type?(Rn(e,t,o.addedNodes),Nn(e,t,o.removedNodes)):\"attributes\"===o.type&&In(e,t,o.target)}(function(e){if(null===Mn){var t=e.createElement(\"div\"),n=e.createElement(\"div\"),r=e.createElement(\"div\");t.appendChild(n),n.appendChild(r),t.innerHTML=\"\",Mn=r.parentNode!==n}return Mn})(e.ownerDocument)&&function(e,t){for(var n=0;n<e.observers.length;n++){var r=e.observers[n];if(r)for(var o=r.elements,i=0;i<o.length;i++){var a=o[i];a.parentNode||t.push([Pn,a])}}}(e,t)}function Rn(e,t,n){for(var r=0;r<n.length;r++){var o=n[r];if(\"matches\"in o)for(var i=e.selectorSet.matches(o),a=0;a<i.length;a++){var s=i[a].data;t.push([Cn,o,s])}if(\"querySelectorAll\"in o)for(var u=e.selectorSet.queryAll(o),c=0;c<u.length;c++)for(var l=u[c],f=l.data,d=l.elements,h=0;h<d.length;h++)t.push([Cn,d[h],f])}}function Nn(e,t,n){for(var r=0;r<n.length;r++){var o=n[r];if(\"querySelectorAll\"in o){t.push([Pn,o]);for(var i=o.querySelectorAll(\"*\"),a=0;a<i.length;a++)t.push([Pn,i[a]])}}}function In(e,t,n){if(\"matches\"in n)for(var r=e.selectorSet.matches(n),o=0;o<r.length;o++){var i=r[o].data;t.push([Cn,n,i])}if(\"querySelectorAll\"in n){var a=Tn.get(n);if(a)for(var s=0;s<a.length;s++){var u=e.observers[a[s]];u&&(e.selectorSet.matchesSelector(n,u.selector)||t.push([Dn,n,u]))}}}var qn=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Fn=0;function Bn(e){var t,n,r;this.rootNode=9===e.nodeType?e.documentElement:e,this.ownerDocument=9===e.nodeType?e:e.ownerDocument,this.observers=[],this.selectorSet=new G,this.mutationObserver=new MutationObserver(function(e,t){var n=[];Hn(e,n,t),jn(e,n)}.bind(this,this)),this._scheduleAddRootNodes=yn(this.ownerDocument,function(e){var t=[];Rn(e,t,[e.rootNode]),jn(e,t)}.bind(this,this)),this._handleThrottledChangedTargets=yn(this.ownerDocument,function(e,t){var n=[];(function(e,t,n){for(var r=0;r<n.length;r++)for(var o=n[r],i=o.form?o.form.elements:e.rootNode.querySelectorAll(\"input\"),a=0;a<i.length;a++)In(e,t,i[a])})(e,n,t),jn(e,n)}.bind(this,this)),this.rootNode.addEventListener(\"change\",function(e,t){e._handleThrottledChangedTargets(t.target)}.bind(this,this),!1),t=this.ownerDocument,n=function(e){e.mutationObserver.observe(e.rootNode,{childList:!0,attributes:!0,subtree:!0}),e._scheduleAddRootNodes()}.bind(this,this),\"interactive\"===(r=t.readyState)||\"complete\"===r?wn(t,n):t.addEventListener(\"DOMContentLoaded\",wn(t,n))}Bn.prototype.disconnect=function(){this.mutationObserver.disconnect()},Bn.prototype.observe=function(e,t){var n=void 0;\"function\"==typeof t?n={selector:e,initialize:t}:\"object\"===(void 0===t?\"undefined\":qn(t))?(n=t).selector=e:n=e;var r=this,o={id:Fn++,selector:n.selector,initialize:n.initialize,add:n.add,remove:n.remove,subscribe:n.subscribe,elements:[],elementConstructor:n.hasOwnProperty(\"constructor\")?n.constructor:Element,abort:function(){r._abortObserving(o)}};return this.selectorSet.add(o.selector,o),this.observers[o.id]=o,this._scheduleAddRootNodes(),o},Bn.prototype._abortObserving=function(e){for(var t=e.elements,n=0;n<t.length;n++)Sn(e,t[n]);this.selectorSet.remove(e.selector,e),delete this.observers[e.id]},Bn.prototype.triggerObservers=function(e){var t=[];!function(e,t,n){if(\"querySelectorAll\"in n){In(e,t,n);for(var r=n.querySelectorAll(\"*\"),o=0;o<r.length;o++)In(e,t,r[o])}}(this,t,e),jn(this,t)};var zn=void 0;function Xn(){return zn||(zn=new Bn(window.document)),zn}function Vn(){var e;return(e=Xn()).observe.apply(e,arguments)}var Wn=Object.freeze({default:Bn,getDocumentObserver:Xn,observe:Vn,triggerObservers:function(){var e;return(e=Xn()).triggerObservers.apply(e,arguments)}}),Un=new pn;function Yn(e){return e.split(\",\").reduce(function(e,t){return e.push(t.split(\" \")),e},[])}var Gn=Un,Kn=null;function $n(){Kn=null,Gn=Un}document.addEventListener(\"keydown\",function(e){if(!(e.target instanceof Node&&on(e.target))){null!=Kn&&clearTimeout(Kn),Kn=setTimeout($n,1500);var t,n=Gn.get(Xe(e));if(n)return Gn=n,n instanceof hn?(be(e.target,\"hotkey:activate\",{originalEvent:e}),on(t=n.children[n.children.length-1])?t.focus():(t instanceof HTMLAnchorElement&&t.href||\"BUTTON\"===t.tagName||\"SUMMARY\"===t.tagName)&&t.click(),e.preventDefault(),void $n()):void 0;else $n()}});var Jn=new WeakMap;Vn(\"[data-hotkey]\",{add:function(e){var t=Yn(e.getAttribute(\"data-hotkey\")||\"\").map(function(t){return Un.insert(t).add(e)});Jn.set(e,t)},remove:function(e){var t=Jn.get(e);if(t&&t.length){var n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;s&&s.delete(e)}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}}});var Zn=Object.freeze({expandHotkeyToEdges:Yn}),Qn=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function er(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(er.prototype,HTMLElement.prototype),Object.setPrototypeOf(er,HTMLElement);var tr=new WeakMap;function nr(e,t){setTimeout(function(){var n=t.ownerDocument.createEvent(\"Event\");n.initEvent(e,!1,!1),t.dispatchEvent(n)},0)}function rr(e){return or(e).then(function(t){var n=e.parentNode;n&&(e.insertAdjacentHTML(\"afterend\",t),n.removeChild(e))},function(){e.classList.add(\"is-error\")})}function or(e){var t=e.src,n=tr.get(e);return n&&n.src===t?n.data:(n=t?e.load():Promise.reject(new Error(\"missing src\")),tr.set(e,{src:t,data:n}),n)}var ir=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t),function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this))}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,er),Qn(t,[{key:\"attributeChangedCallback\",value:function(e){\"src\"===e&&this._attached&&rr(this)}},{key:\"connectedCallback\",value:function(){this._attached=!0,this.src&&rr(this)}},{key:\"disconnectedCallback\",value:function(){this._attached=!1}},{key:\"request\",value:function(){var e=this.src;if(!e)throw new Error(\"missing src\");return new Request(e,{method:\"GET\",credentials:\"same-origin\",headers:{Accept:\"text/html\"}})}},{key:\"load\",value:function(){var e=this;return Promise.resolve().then(function(){return nr(\"loadstart\",e),e.fetch(e.request())}).then(function(e){if(200!==e.status)throw new Error(\"Failed to load resource: the server responded with a status of \"+e.status);var t=e.headers.get(\"Content-Type\");if(!t||!t.match(/^text\\/html/))throw new Error(\"Failed to load resource: expected text/html but was \"+t);return e}).then(function(e){return e.text()}).then(function(t){return nr(\"load\",e),nr(\"loadend\",e),t},function(t){throw nr(\"error\",e),nr(\"loadend\",e),t})}},{key:\"fetch\",value:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}(function(e){return fetch(e)})},{key:\"src\",get:function(){var e=this.getAttribute(\"src\");if(e){var t=this.ownerDocument.createElement(\"a\");return t.href=e,t.href}return\"\"},set:function(e){e?this.setAttribute(\"src\",e):this.removeAttribute(\"src\")}},{key:\"data\",get:function(){return or(this)}}],[{key:\"observedAttributes\",get:function(){return[\"src\"]}}]),t}();window.customElements.get(\"include-fragment\")||(window.IncludeFragmentElement=ir,window.customElements.define(\"include-fragment\",ir)),IncludeFragmentElement.prototype.fetch=Yt;var ar=Object.freeze({pluralize:function(e,t){return t+(e>1||0===e?\"s\":\"\")},pluralizeNode:function(e,t){var n=1===e?\"data-singular-string\":\"data-plural-string\",r=t.getAttribute(n);null!=r&&(t.textContent=r)}}),sr=Object.freeze({weekdays:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],months:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]}),ur=null;function cr(e){ur&&lr(ur),be(e,\"menu:activate\")&&(document.addEventListener(\"keydown\",dr),document.addEventListener(\"click\",fr),ur=e,mt(e,function(){e.classList.add(\"active\");var t=e.querySelector(\".js-menu-content [tabindex]\");t&&t.focus();var n=e.querySelector(\".js-menu-target\");n&&(n.setAttribute(\"aria-expanded\",\"true\"),n.hasAttribute(\"data-no-toggle\")||n.classList.add(\"selected\"))}),be(e,\"menu:activated\"))}function lr(e){be(e,\"menu:deactivate\")&&(document.removeEventListener(\"keydown\",dr),document.removeEventListener(\"click\",fr),ur=null,mt(e,function(){e.classList.remove(\"active\");var t=e.querySelector(\".js-menu-content\");t&&t.setAttribute(\"aria-expanded\",\"false\");var n=e.querySelector(\".js-menu-target\");n&&(n.setAttribute(\"aria-expanded\",\"false\"),n.hasAttribute(\"data-no-toggle\")||n.classList.remove(\"selected\"))}),be(e,\"menu:deactivated\"))}function fr(e){if(ur){var t=e.target;o(t instanceof Element,\"app/assets/modules/github/menu.js:111\");var n=t.closest(\"#facebox, .facebox-overlay, details[open], details-dialog\"),r=!!n&&!n.contains(ur);ur.contains(t)||r||(e.preventDefault(),lr(ur))}}function dr(e){if(ur){var t=document.activeElement;t&&\"Escape\"===e.key&&(ur.contains(t)&&t.blur(),e.preventDefault(),lr(ur))}}ge(\"click\",\".js-menu-container\",function(e){var t=e.currentTarget;o(t instanceof HTMLElement,\"app/assets/modules/github/menu.js:156\"),e.target.closest(\".js-menu-target\")instanceof HTMLElement?(e.preventDefault(),t===ur?lr(t):cr(t)):e.target.closest(\".js-menu-content\")||t===ur&&(e.preventDefault(),lr(t))}),ge(\"click\",\".js-menu-container .js-menu-close\",function(e){var t=e.currentTarget.closest(\".js-menu-container\");o(t instanceof HTMLElement,\"expected container to be .js-menu-container -- app/assets/modules/github/menu.js:183\"),lr(t),e.preventDefault()}),Vn(\".js-menu-container.active\",{add:function(){var e=document.body;o(e,\"app/assets/modules/github/menu.js:192\"),e.classList.add(\"menu-active\")},remove:function(){var e=document.body;o(e,\"app/assets/modules/github/menu.js:197\"),e.classList.remove(\"menu-active\")}});var hr=Object.freeze({activate:cr,deactivate:lr}),pr=function e(t){var n=this;l(this,e),this.closed=!1,this.unsubscribe=function(){t(),n.closed=!0}};function vr(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];return e.addEventListener(t,n,r),new pr(function(){e.removeEventListener(t,n,r)})}var mr=Object.freeze({fromEvent:vr});function gr(e){var t=br(e);if(t)return t.defaultView}function br(e){return e?9===e.nodeType?e:e.ownerDocument?e.ownerDocument:e.document?e.document:null:null}var yr=Object.freeze({getWindow:gr,getDocument:br});function wr(e,t){var n=br(e);if(n){e!==n&&e!==n.defaultView&&e!==n.documentElement&&e!==n.body||(e=n);var r=n.defaultView.Document,i=n.defaultView.HTMLElement;if(null==t&&(t={}),null==t.top&&null==t.left)if(t.target){var a=jt(t.target,e);null!=a&&(t.top=a.top,t.left=a.left)}else if(e instanceof i){var s=jt(e,e.offsetParent);e=e.offsetParent,null!=s&&(t.top=s.top,t.left=s.left)}if(e instanceof r||e===n.body){var u=null!=t.top?t.top:n.defaultView.pageYOffset,c=null!=t.left?t.left:n.defaultView.pageXOffset;n.defaultView.scrollTo(c,u)}else o(e instanceof i,\"container is not HTMLElement -- app/assets/modules/github/scrollto.js:62\"),null!=t.top&&(e.scrollTop=t.top),null!=t.left&&(e.scrollLeft=t.left)}}var Er=Object.freeze({default:wr}),_r=navigator.userAgent.match(/Macintosh/),xr=_r?\"metaKey\":\"ctrlKey\",kr=_r?\"Meta\":\"Control\",Tr=!1,jr={x:0,y:0};function Lr(e){o(e instanceof MouseEvent,\"app/assets/modules/github/navigation.js:142\"),jr.x===e.clientX&&jr.y===e.clientY||(Tr=!1),jr={x:e.clientX,y:e.clientY}}function Or(e){if(!Tr){var t=e.currentTarget;if(o(t instanceof HTMLElement,\"app/assets/modules/github/navigation.js:157\"),t.closest(\".js-active-navigation-container\")){o(e.target instanceof Element,\"app/assets/modules/github/navigation.js:161\");var n=e.target.closest(\".js-navigation-item\");n&&Fr(n,t)}}}Vn(\".js-navigation-container\",{subscribe:function(e){return vr(e,\"mousemove\",Lr)}}),Vn(\".js-navigation-container\",{subscribe:function(e){return vr(e,\"mouseover\",Or)}});var Sr=0;function Ar(e){if(!(e.target!==document.body&&e.target instanceof HTMLElement)||e.target.classList.contains(\"js-navigation-enable\")){Tr=!0;var t=Br(),n=void 0;if(t)n=be(t.querySelector('.js-navigation-item[aria-selected=\"true\"]')||t,\"navigation:keydown\",{hotkey:Xe(e),originalEvent:e,originalTarget:e.target});n||e.preventDefault()}}function Mr(e){be(e.currentTarget,\"navigation:open\",{modifierKey:e.modifierKey||e.altKey||e.ctrlKey||e.metaKey,shiftKey:e.shiftKey})||e.preventDefault()}function Cr(e){var t=Br();e!==t&&(t&&Dr(t),e.classList.add(\"js-active-navigation-container\"))}function Dr(e){e.classList.remove(\"js-active-navigation-container\")}Vn(\".js-active-navigation-container\",{add:function(){1===++Sr&&document.addEventListener(\"keydown\",Ar)},remove:function(){0===--Sr&&document.removeEventListener(\"keydown\",Ar)}}),ge(\"navigation:keydown\",\".js-active-navigation-container\",function(e){o(e instanceof CustomEvent,\"app/assets/modules/github/navigation.js:229\");var t=e.currentTarget,n=e.detail.originalTarget.matches(\"input, textarea\"),r=e.target;if(r.classList.contains(\"js-navigation-item\"))if(n){if(_r)switch(Xe(e.detail.originalEvent)){case\"Control+n\":Ir(r,t);break;case\"Control+p\":Nr(r,t)}switch(Xe(e.detail.originalEvent)){case\"ArrowUp\":Nr(r,t);break;case\"ArrowDown\":Ir(r,t);break;case\"Enter\":case kr+\"+Enter\":qr(r,e.detail.originalEvent[xr])}}else{if(_r)switch(Xe(e.detail.originalEvent)){case\"Control+n\":Ir(r,t);break;case\"Control+p\":Nr(r,t);break;case\"Alt+v\":!function(e,t){var n=zr(t),r=n.indexOf(e),o=kt(e);if(null==o)return;var i=void 0,a=void 0;for(;(i=n[r-1])&&(a=Tt(i,o))&&a.top>=0;)r--;if(i){var s=Fr(i,t);if(s)return;Vr(o,i)}}(r,t);break;case\"Control+v\":!function(e,t){var n=zr(t),r=n.indexOf(e),o=kt(e);if(null==o)return;var i=void 0,a=void 0;for(;(i=n[r+1])&&(a=Tt(i,o))&&a.bottom>=0;)r++;if(i){var s=Fr(i,t);if(s)return;Vr(o,i)}}(r,t)}switch(Xe(e.detail.originalEvent)){case\"j\":case\"J\":Ir(r,t);break;case\"k\":case\"K\":Nr(r,t);break;case\"o\":case\"Enter\":case kr+\"+Enter\":qr(r,e.detail[xr])}}else{var i=zr(t)[0];if(i)if(n){if(_r)switch(Xe(e.detail.originalEvent)){case\"Control+n\":Fr(i,t)}switch(Xe(e.detail.originalEvent)){case\"ArrowDown\":Fr(i,t)}}else{if(_r)switch(Xe(e.detail.originalEvent)){case\"Control+n\":case\"Control+v\":Fr(i,t)}switch(Xe(e.detail.originalEvent)){case\"j\":Fr(i,t)}}}if(n){if(_r)switch(Xe(e.detail.originalEvent)){case\"Control+n\":case\"Control+p\":e.preventDefault()}switch(Xe(e.detail.originalEvent)){case\"ArrowUp\":case\"ArrowDown\":e.preventDefault();break;case\"Enter\":e.preventDefault()}}else{if(_r)switch(Xe(e.detail.originalEvent)){case\"Control+n\":case\"Control+p\":case\"Control+v\":case\"Alt+v\":e.preventDefault()}switch(Xe(e.detail.originalEvent)){case\"j\":case\"k\":e.preventDefault();break;case\"o\":case\"Enter\":case xr+\"+Enter\":e.preventDefault()}}}),ge(\"click\",\".js-active-navigation-container .js-navigation-item\",function(e){o(e instanceof MouseEvent,\"app/assets/modules/github/navigation.js:385\"),Mr(e)}),ge(\"navigation:keyopen\",\".js-active-navigation-container .js-navigation-item\",function(e){o(e instanceof CustomEvent,\"app/assets/modules/github/navigation.js:391\");var t=e.currentTarget.classList.contains(\"js-navigation-open\")?e.currentTarget:e.currentTarget.querySelector(\".js-navigation-open\");if(t){if(e.detail.modifierKey)window.open(t.href,\"_blank\"),window.focus();else{var n=void 0;try{n=new MouseEvent(\"click\",{bubbles:!0,cancelable:!0})}catch(e){(n=document.createEvent(\"MouseEvent\")).initEvent(\"click\",!0,!0)}t.dispatchEvent(n)&&t.click()}e.preventDefault()}else Mr(e)});var Pr=[];function Hr(e,t){t||(t=e);var n=zr(e)[0],r=t.closest(\".js-navigation-item\")||n;if(Cr(e),r instanceof HTMLElement){if(Fr(r,e))return;var i=kt(r);o(i,\"app/assets/modules/github/navigation.js:498\"),Wr(i,r)}}function Rr(e){var t=e.querySelectorAll(\".js-navigation-item[aria-selected]\"),n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;s.classList.remove(\"navigation-focus\"),s.setAttribute(\"aria-selected\",\"false\")}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}function Nr(e,t){var n=zr(t),r=n[n.indexOf(e)-1];if(r){if(Fr(r,t))return;var i=kt(r);o(i,\"app/assets/modules/github/navigation.js:546\"),\"page\"===Xr(t)?Vr(i,r):Wr(i,r)}}function Ir(e,t){var n=zr(t),r=n[n.indexOf(e)+1];if(r){if(Fr(r,t))return;var i=kt(r);o(i,\"app/assets/modules/github/navigation.js:573\"),\"page\"===Xr(t)?Vr(i,r):Wr(i,r)}}function qr(e,t){null==t&&(t=!1),be(e,\"navigation:keyopen\",{modifierKey:t})}function Fr(e,t){return!be(e,\"navigation:focus\")||(Rr(t),e.classList.add(\"navigation-focus\"),e.setAttribute(\"aria-selected\",\"true\"),!1)}function Br(){return document.querySelector(\".js-active-navigation-container\")}function zr(e){return Array.from(e.querySelectorAll(\".js-navigation-item\")).filter(We)}function Xr(e){return e.getAttribute(\"data-navigation-scroll\")||\"item\"}function Vr(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:\"smooth\",r=Tt(t,e);r&&(r.bottom<=0?t.scrollIntoView({behavior:n,block:\"start\"}):r.top<=0&&t.scrollIntoView({behavior:n,block:\"end\"}))}function Wr(e,t){var n=jt(t,e),r=Tt(t,e);null!=n&&null!=r&&(r.bottom<=0&&document.body?wr(e,{top:(null!=e.offsetParent?e.scrollHeight:document.body.scrollHeight)-(n.bottom+r.height)}):r.top<=0&&wr(e,{top:n.top}))}var Ur=Object.freeze({activate:Cr,push:function(e){var t=Br();t&&Pr.push(t),Cr(e)},pop:function(e){Dr(e),Rr(e);var t=Pr.pop();t&&Cr(t)},focus:Hr,clear:Rr,refocus:function(e,t){Rr(e),Hr(e,t)}}),Yr=14594616e5;var Gr=Object.freeze({formatNumber:function(e){return(\"\"+e).replace(/(^|[^\\w.])(\\d{4,})/g,function(e,t,n){return t+n.replace(/\\d(?=(?:\\d\\d\\d)+(?!\\d))/g,\"$&,\")})},parseFormattedNumber:function(e){return\"string\"==typeof e&&(e=e.replace(/,/g,\"\")),parseFloat(e)}}),Kr=!1,$r=new G;function Jr(e){var t=e.target;if(t instanceof HTMLElement&&t.nodeType!==Node.DOCUMENT_NODE){var n=!0,r=!1,o=void 0;try{for(var i,a=$r.matches(t)[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){i.value.data.call(null,t)}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}}function Zr(e,t){Kr||(Kr=!0,document.addEventListener(\"focus\",Jr,!0)),$r.add(e,t),document.activeElement&&document.activeElement.matches(e)&&t(document.activeElement)}var Qr=Object.freeze({onFocus:Zr,onKey:function(e,t,n){function r(t){t.currentTarget.removeEventListener(e,n),t.currentTarget.removeEventListener(\"blur\",r)}Zr(t,function(t){t.addEventListener(e,n),t.addEventListener(\"blur\",r)})},onInput:function(e,t){function n(e){e.currentTarget.removeEventListener(\"input\",t),e.currentTarget.removeEventListener(\"blur\",n)}Zr(e,function(e){e.addEventListener(\"input\",t),e.addEventListener(\"blur\",n)})}});function eo(){}var to=function(){function e(){l(this,e),this.previousReceiver={resolve:eo,reject:eo}}return f(e,[{key:\"push\",value:function(e){var t=this;return this.previousReceiver.resolve=this.previousReceiver.reject=eo,new Promise(function(n,r){var o={resolve:n,reject:r};t.previousReceiver=o,e.then(function(){o.resolve.apply(this,arguments)},function(){o.reject.apply(this,arguments)})})}}]),e}(),no=Object.freeze({default:to});function ro(e){for(var t=[];e&&(t.push(oo(e)),e!==br(e)&&!e.id);)e=e.parentNode;return t.reverse().join(\" > \")}function oo(e){if(e===window)return\"window\";var t=[e.nodeName.toLowerCase()],n=e.id;if(n&&t.push(\"#\"+n),\"function\"==typeof e.getAttribute&&e.getAttribute(\"class\")){var r=(e.getAttribute(\"class\")||\"\").trim().split(/\\s+/).join(\".\");r&&t.push(\".\"+r)}return t.join(\"\")}var io=Object.freeze({default:ro}),ao=new WeakMap;function so(e,t){var n=function(e,t){var n=ht(e,\"link[rel=pjax-prefetch]\",HTMLLinkElement),r=!0,o=!1,i=void 0;try{for(var a,s=n[Symbol.iterator]();!(r=(a=s.next()).done);r=!0){var u=a.value;if(u.href===t)return u}}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}}(e,t);if(n){var r=ao.get(n);return n.remove(),ao.delete(n),r}}var uo=Object.freeze({popPrefetchResponseForRequest:so,setPrefetchResponse:function(e,t){ao.set(e,t)}}),co={container:null,timeout:650,push:!0,replace:!1,type:\"GET\",dataType:\"html\",scrollTo:0},lo=20,fo=void 0,ho=new to;function po(e,t,n){return e.dispatchEvent(new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n}))}function vo(e){mo({url:e.url,container:e.container})}function mo(e){var t,n=(t=c(regeneratorRuntime.mark(function e(t){var n,o,i,c,l,f,d,h,p,v,m,g,b;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=fo,o=Ho(),i=t.headers.get(\"X-PJAX-Version\"),e.next=5,t.text();case 5:if(c=e.sent,l=So(c,t,r),f=l.contents,d=xo(l.url),a&&(d.hash=a,l.url=d.href),!o||!i||o===i){e.next=13;break}return go(l.url),e.abrupt(\"return\");case 13:if(f){e.next=16;break}return go(l.url),e.abrupt(\"return\");case 16:if(fo={id:null!=r.id?r.id:Eo(),url:l.url,title:l.title,container:u,fragment:r.fragment,timeout:r.timeout},!0!==r.push&&!0!==r.replace||Se(fo,l.title,l.url),h=document.activeElement,p=null!=r.container&&r.container.contains(h),h&&p)try{h.blur()}catch(e){}l.title&&(document.title=l.title),po(s,\"pjax:beforeReplace\",{contents:f,state:fo,previousState:n}),Lo(s,f),(v=ht(s,\"input[autofocus], textarea[autofocus]\").pop())&&document.activeElement!==v&&v.focus(),Ao(l.scripts),m=r.scrollTo,a&&(g=Me(document,a))&&(b=g.getBoundingClientRect(),m=b.top+window.pageYOffset),\"number\"==typeof m&&window.scrollTo(window.pageXOffset,m),po(s,\"pjax:success\"),po(s,\"pjax:complete\"),po(s,\"pjax:end\");case 33:case\"end\":return e.stop()}},e,this)})),function(e){return t.apply(this,arguments)}),r={url:\"\",container:null};Object.assign(r,co,e),o(\"string\"==typeof r.url,\"app/assets/modules/github/pjax.js:177\"),r.requestUrl=r.url;var i=xo(r.url),a=i.hash,s=r.container;o(s,\"app/assets/modules/github/pjax.js:183\");var u=To(s);\"GET\"===r.type&&(i.search+=(i.search?\"&\":\"\")+\"_pjax=\"+encodeURIComponent(u),r.url=i.toString()),fo||Se(fo={id:Eo(),url:window.location.href,title:document.title,container:u,fragment:r.fragment,timeout:r.timeout},fo.title,fo.url),vo.options=r,o(\"string\"==typeof r.requestUrl,\"app/assets/modules/github/pjax.js:324\");var l,f,d=so(s,r.requestUrl);d||(o(r.url,\"app/assets/modules/github/pjax.js:327\"),d=Yt(r.url,{method:r.type,body:r.data,headers:{Accept:\"text/html\",\"X-PJAX\":\"true\",\"X-PJAX-Container\":u}}),\"GET\"===r.type&&\"number\"==typeof r.timeout&&r.timeout>0&&(d=Promise.race([d,new Promise(function(e,t){setTimeout(function(){po(s,\"pjax:timeout\")&&t(new Error(\"timeout\"))},r.timeout)})]))),!0===r.push&&!0!==r.replace&&(l=fo.id,f=_o(s),Mo[l]=f,Do.push(l),Po(Co,0),Po(Do,lo),o(\"string\"==typeof r.requestUrl,\"app/assets/modules/github/pjax.js:355\"),Oe(null,\"\",r.requestUrl)),po(s,\"pjax:start\",{url:r.url}),po(s,\"pjax:send\"),ho.push(d).then(n,function(e){var t=r.requestUrl;o(\"string\"==typeof t,\"app/assets/modules/github/pjax.js:197\"),e.response&&(t=Oo(e.response,t));var n=po(s,\"pjax:error\");\"GET\"===r.type&&n&&go(t),po(s,\"pjax:complete\"),po(s,\"pjax:end\")})}function go(e){o(fo,\"app/assets/modules/github/pjax.js:406\"),Se(null,\"\",fo.url),window.location.replace(e)}var bo=!0,yo=window.location.href,wo=window.history.state;function Eo(){return(new Date).getTime()}function _o(e){var t=e.cloneNode(!0);return[To(e),Array.from(t.childNodes)]}function xo(e){var t=document.createElement(\"a\");return t.href=e,t}function ko(e){return e.href.replace(/#.*/,\"\")}function To(e){if(e.id)return\"#\"+e.id;throw new Error(\"pjax container has no id\")}function jo(e,t,n){var r=[],o=!0,i=!1,a=void 0;try{for(var s,u=e[Symbol.iterator]();!(o=(s=u.next()).done);o=!0){var c=s.value;c instanceof Element&&(c instanceof n&&c.matches(t)&&r.push(c),r=r.concat(ht(c,t,n)))}}catch(e){i=!0,a=e}finally{try{!o&&u.return&&u.return()}finally{if(i)throw a}}return r}function Lo(e,t){e.innerHTML=\"\";var n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;null!=s&&e.appendChild(s)}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}function Oo(e,t){var n,r=e.headers.get(\"X-PJAX-URL\");return r?((n=xo(r)).search=n.search.replace(/([?&])(_pjax|_)=[^&]*/g,\"\"),n.href.replace(/\\?($|#)/,\"$1\")):t}function So(e,t,n){o(\"string\"==typeof n.requestUrl,\"app/assets/modules/github/pjax.js:612\");var r={url:Oo(t,n.requestUrl),title:\"\"},i=/<html/i.test(e);if(\"text/html\"!==(t.headers.get(\"Content-Type\")||\"\").split(\";\",1)[0].trim())return r;var a=void 0,s=void 0;if(i){var u=e.match(/<head[^>]*>([\\s\\S.]*)<\\/head>/i),c=e.match(/<body[^>]*>([\\s\\S.]*)<\\/body>/i);a=u?Array.from(Ft(document,u[0]).childNodes):[],s=c?Array.from(Ft(document,c[0]).childNodes):[]}else a=s=Array.from(Ft(document,e).childNodes);if(0===s.length)return r;var l=jo(a,\"title\",HTMLTitleElement);r.title=l.length>0?l[l.length-1].textContent:\"\";var f=void 0;if(n.fragment){if(\"body\"===n.fragment)f=s;else{var d=jo(s,n.fragment,Element);f=d.length>0?[d[0]]:[]}if(f.length&&(\"body\"===n.fragment?r.contents=f:r.contents=f.reduce(function(e,t){return e.concat(Array.from(t.childNodes))},[]),!r.title)){var h=f[0];h instanceof Element&&(r.title=h.getAttribute(\"title\")||h.getAttribute(\"data-title\")||\"\")}}else i||(r.contents=s);if(r.contents){r.contents=r.contents.filter(function(e){return!(e instanceof Element)||!e.matches(\"title\")});var p=!0,v=!1,m=void 0;try{for(var g,b=r.contents[Symbol.iterator]();!(p=(g=b.next()).done);p=!0){var y=g.value;if(y instanceof Element){var w=!0,E=!1,_=void 0;try{for(var x,k=y.querySelectorAll(\"title\")[Symbol.iterator]();!(w=(x=k.next()).done);w=!0){x.value.remove()}}catch(e){E=!0,_=e}finally{try{!w&&k.return&&k.return()}finally{if(E)throw _}}}}}catch(e){v=!0,m=e}finally{try{!p&&b.return&&b.return()}finally{if(v)throw m}}var T=jo(r.contents,\"script[src]\",HTMLScriptElement),j=!0,L=!1,O=void 0;try{for(var S,A=T[Symbol.iterator]();!(j=(S=A.next()).done);j=!0){S.value.remove()}}catch(e){L=!0,O=e}finally{try{!j&&A.return&&A.return()}finally{if(L)throw O}}r.scripts=T,o(r.contents,\"app/assets/modules/github/pjax.js:704\"),r.contents=r.contents.filter(function(e){return-1===T.indexOf(e)})}return r.title&&(r.title=r.title.trim()),r}function Ao(e){if(e){var t=ht(document,\"script[src]\",HTMLScriptElement),n=function(e){var n=e.src;if(t.some(function(e){return e.src===n}))return{v:void 0};var r=document.createElement(\"script\"),o=e.getAttribute(\"type\");o&&(r.type=o),r.src=n,document.head&&document.head.appendChild(r)},r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done);r=!0){var c=n(a.value);if(\"object\"===(void 0===c?\"undefined\":u(c)))return c.v}}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}}}wo&&wo.container&&(fo=wo),\"state\"in window.history&&(bo=!1);var Mo={},Co=[],Do=[];function Po(e,t){for(;e.length>t;)delete Mo[e.shift()]}function Ho(){var e=!0,t=!1,n=void 0;try{for(var r,o=document.getElementsByTagName(\"meta\")[Symbol.iterator]();!(e=(r=o.next()).done);e=!0){var i=r.value,a=i.getAttribute(\"http-equiv\");if(a&&\"X-PJAX-VERSION\"===a.toUpperCase())return i.content}}catch(e){t=!0,n=e}finally{try{!e&&o.return&&o.return()}finally{if(t)throw n}}}window.addEventListener(\"popstate\",function(e){bo||ho.push(Promise.resolve(new Response));var t=fo,n=e.state,r=void 0;if(n&&n.container){if(bo&&yo===n.url)return;if(t){if(t.id===n.id)return;r=t.id<n.id?\"forward\":\"back\"}var o=Mo[n.id]||[],i=document.querySelector(o[0]||n.container),a=o[1];if(i){t&&function(e,t,n){var r=void 0,o=void 0;Mo[t]=n,\"forward\"===e?(r=Do,o=Co):(r=Co,o=Do),r.push(t),(t=o.pop())&&delete Mo[t],Po(r,lo)}(r,t.id,_o(i)),po(i,\"pjax:popstate\",{state:n,direction:r});var s={id:n.id,url:n.url,container:i,push:!1,fragment:n.fragment,timeout:n.timeout,scrollTo:!1};a?(po(i,\"pjax:start\"),fo=n,n.title&&(document.title=n.title),po(i,\"pjax:beforeReplace\",{contents:a,state:n,previousState:t}),Lo(i,a),po(i,\"pjax:end\")):mo(s),i.offsetHeight}else go(location.href)}bo=!1});var Ro=Object.freeze({click:function(e,t){var n=A(e.currentTarget,HTMLAnchorElement);if(!(0!==e.button||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||location.protocol!==n.protocol||location.hostname!==n.hostname||n.href.indexOf(\"#\")>-1&&ko(n)===ko(location)||e.defaultPrevented)){var r={url:n.href,container:null,target:n};Object.assign(r,t),po(n,\"pjax:click\",{options:r,relatedEvent:e})&&(mo(r),e.preventDefault(),po(n,\"pjax:clicked\",{options:r}))}},submit:function(e,t){var n=A(e.currentTarget,HTMLFormElement),r={type:(n.method||\"GET\").toUpperCase(),url:n.action,container:null,target:n};if(Object.assign(r,t),\"GET\"===r.type){if(n.querySelector(\"input[type=file]\"))return;o(\"string\"==typeof r.url,\"app/assets/modules/github/pjax.js:142\");var i=xo(r.url);i.search+=(i.search?\"&\":\"\")+an(n),r.url=i.toString()}else r.data=new FormData(n);mo(r),e.preventDefault()},default:vo,fetch:function(e,t){var n=e.closest(\"[data-pjax-container]\");if(!n)throw new Error(\"no pjax container for \"+ro(e));var r=To(n),o=xo(e.href);return o.search+=(o.search?\"&\":\"\")+\"_pjax=\"+encodeURIComponent(r),Yt(o.href,{headers:Object.assign({Accept:\"text/html\",\"X-PJAX\":\"true\",\"X-PJAX-Container\":r},t&&t.headers)})},getState:function(){return fo}});function No(e){return new Promise(function(t){setTimeout(function(){t()},e)})}var Io=Object.freeze({delay:No}),qo=function(e){function t(){return l(this,t),p(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return h(t,e),f(t,[{key:\"fetch\",value:function(){var e=c(regeneratorRuntime.mark(function e(n){var r,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e3;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),\"fetch\",this).call(this,n);case 2:if(202!==(r=e.sent).status){e.next=9;break}return e.next=6,No(o);case 6:return e.abrupt(\"return\",this.fetch(n,1.5*o));case 9:return e.abrupt(\"return\",r);case 10:case\"end\":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}()}]),t}(IncludeFragmentElement);window.customElements.get(\"poll-include-fragment\")||(window.PollIncludeFragmentElement=qo,window.customElements.define(\"poll-include-fragment\",qo));var Fo=function(){var e=c(regeneratorRuntime.mark(function e(){var t,n,r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t=dt(document,\"link[rel=sso-modal]\",HTMLLinkElement),e.next=3,_t({content:$t(document,t.href),dialogClass:\"sso-modal\"});case 3:return n=e.sent,r=null,window.external.ssoComplete=function(e){e.error?Xo(r=!1):(Xo(r=!0),Vo(e.expiresAround),window.focus()),window.external.ssoComplete=null},e.next=8,zo(n);case 8:if(r){e.next=10;break}throw new Error(\"sso prompt canceled\");case 10:case\"end\":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}(),Bo=function(){var e=c(regeneratorRuntime.mark(function e(){var t,n,r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=document.querySelector(\"link[rel=sso-session]\"),n=document.querySelector(\"meta[name=sso-expires-around]\"),t){e.next=4;break}return e.abrupt(\"return\",!0);case 4:if(Wo(n)){e.next=6;break}return e.abrupt(\"return\",!0);case 6:return r=A(t,HTMLLinkElement).href,e.abrupt(\"return\",Kt(r));case 8:case\"end\":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}();function zo(e){return new Promise(function(t){e.addEventListener(\"dialog:remove\",t,{once:!0})})}function Xo(e){var t=document.querySelector(\".sso-modal\");t&&(t.classList.remove(\"success\",\"error\"),e?t.classList.add(\"success\"):t.classList.add(\"error\"))}function Vo(e){var t=document.querySelector(\"meta[name=sso-expires-around]\");t&&t.setAttribute(\"content\",e)}function Wo(e){if(!e)return!0;var t=parseInt(A(e,HTMLMetaElement).content);return(new Date).getTime()/1e3>t}Vn(\".js-sso-modal-complete\",function(e){if(window.opener&&window.opener.external.ssoComplete){var t=e.getAttribute(\"data-error\"),n=e.getAttribute(\"data-expires-around\");window.opener.external.ssoComplete({error:t,expiresAround:n}),window.close()}else{var r=e.getAttribute(\"data-fallback-url\");window.location=r}});var Uo=null;function Yo(){Uo=null}var Go=c(regeneratorRuntime.mark(function e(){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Bo();case 2:if(e.sent){e.next=7;break}return Uo||(Uo=Fo().then(Yo).catch(Yo)),e.next=7,Uo;case 7:case\"end\":return e.stop()}},e,this)})),Ko=Object.freeze({default:Go}),$o=function(){var e=c(regeneratorRuntime.mark(function e(t,n,r,o){var i,a,s,u,c,l,f,d,h=this;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:i=!1,a=regeneratorRuntime.mark(function e(t){var a,s,u,c,l,f;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=Qo(),s=v(a,2),u=s[0],c=s[1],f={text:l=function(){return i=!0,c(),o},json:function(){return r.headers.set(\"Accept\",\"application/json\"),l()},html:function(){return r.headers.set(\"Accept\",\"text/html\"),l()}},e.next=5,Promise.race([u,t.data.call(null,n,f,r)]);case 5:case\"end\":return e.stop()}},e,h)}),s=!0,u=!1,c=void 0,e.prev=5,l=t[Symbol.iterator]();case 7:if(s=(f=l.next()).done){e.next=13;break}return d=f.value,e.delegateYield(a(d),\"t0\",10);case 10:s=!0,e.next=7;break;case 13:e.next=19;break;case 15:e.prev=15,e.t1=e.catch(5),u=!0,c=e.t1;case 19:e.prev=19,e.prev=20,!s&&l.return&&l.return();case 22:if(e.prev=22,!u){e.next=25;break}throw c;case 25:return e.finish(22);case 26:return e.finish(19);case 27:return e.abrupt(\"return\",i);case 28:case\"end\":return e.stop()}},e,this,[[5,15,19,27],[20,,22,26]])}));return function(t,n,r,o){return e.apply(this,arguments)}}(),Jo=function(){var e=c(regeneratorRuntime.mark(function e(t){var n,r,o,i,a;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Go();case 2:return e.next=4,window.fetch(t.url,{method:t.method,body:null!==t.body?t.body:void 0,headers:t.headers,credentials:\"same-origin\"});case 4:return n=e.sent,e.t0=n.url,e.t1=n.status,e.t2=n.statusText,e.t3=n.headers,i={url:e.t0,status:e.t1,statusText:e.t2,headers:e.t3,text:\"\",get json(){return n=this,r=JSON.parse(n.text),delete n.json,n.json=r,n.json},get html(){return n=this,It(Rt(document),n),o=Ft(document,n.text),delete n.html,n.html=o,n.html}},e.next=12,n.text();case 12:if(a=e.sent,i.text=a,!(i.status<300)){e.next=18;break}return e.abrupt(\"return\",i);case 18:throw new Zo(\"request failed\",i);case 19:case\"end\":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}(),Zo=function(e){function t(e,n){l(this,t);var r=p(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.response=n,r}return h(t,e),t}(Error);function Qo(){var e=void 0,t=void 0,n=new Promise(function(n,r){e=n,t=r});return o(\"function\"==typeof e,\"app/assets/modules/github/remote-form.js:28\"),o(\"function\"==typeof t,\"app/assets/modules/github/remote-form.js:29\"),[n,e,t]}var ei=void 0,ti=[];function ni(e,t){ei||(ei=new G,document.addEventListener(\"submit\",ri)),ei.add(e,t)}function ri(e){var t=A(e.target,HTMLFormElement),n=ei&&ei.matches(t);if(n&&0!==n.length){var r=function(e){var t={method:e.method||\"GET\",url:e.action,headers:new Headers({\"X-Requested-With\":\"XMLHttpRequest\"}),body:null};if(\"GET\"===t.method.toUpperCase()){var n=an(e);n&&(t.url+=(~t.url.indexOf(\"?\")?\"&\":\"?\")+n)}else t.body=new FormData(function(e){if(oi){for(var t=void 0,n=e.elements.length-1;n>=0&&((t=e.elements[n])instanceof HTMLButtonElement||t instanceof HTMLInputElement&&(\"submit\"===t.type||\"reset\"===t.type||\"text\"===t.type&&!t.name));)n--;if(t instanceof HTMLInputElement&&((\"checkbox\"===t.type||\"radio\"===t.type)&&!t.checked||\"file\"===t.type)){var r=document.createElement(\"input\");r.type=\"hidden\",r.name=\"_ie11fix\",e.append(r)}}return e}(e));return t}(t),o=Qo(),i=v(o,3),a=i[0],s=i[1],u=i[2];e.preventDefault(),$o(n,t,r,a).then(function(e){e?Jo(r).then(s,u).catch(function(){}).then(function(){var e=!0,n=!1,r=void 0;try{for(var o,i=ti[Symbol.iterator]();!(e=(o=i.next()).done);e=!0){(0,o.value)(t)}}catch(e){n=!0,r=e}finally{try{!e&&i.return&&i.return()}finally{if(n)throw r}}}):t.submit()},function(e){t.submit(),setTimeout(function(){throw e})})}}var oi=/\\bTrident\\/.+\\brv:11\\./.test(navigator.userAgent);var ii=Object.freeze({afterRemote:function(e){ti.push(e)},remoteForm:ni,remoteUninstall:function(e,t){ei&&ei.remove(e,t)}}),ai=function(){var e=c(regeneratorRuntime.mark(function e(t){var n,r,i,a,s,u,c,l,f,d,h,p,v;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.currentTarget,o(n instanceof Element,\"app/assets/modules/github/select-menu/loading.js:38\"),n.classList.remove(\"js-load-contents\"),n.classList.add(\"is-loading\"),n.classList.remove(\"has-error\"),r=n.getAttribute(\"data-contents-url\"),o(r,\"app/assets/modules/github/select-menu/loading.js:45\"),i=new URL(r,window.location.origin),!(a=si.get(n))){e.next=31;break}for(s=new URLSearchParams(i.search.slice(1)),u=!0,c=!1,l=void 0,e.prev=14,f=a[Symbol.iterator]();!(u=(d=f.next()).done);u=!0)h=d.value,s.append(h[0],h[1]);e.next=22;break;case 18:e.prev=18,e.t0=e.catch(14),c=!0,l=e.t0;case 22:e.prev=22,e.prev=23,!u&&f.return&&f.return();case 25:if(e.prev=25,!c){e.next=28;break}throw l;case 28:return e.finish(25);case 29:return e.finish(22);case 30:i.search=s.toString();case 31:return p=n.querySelector(\".js-select-menu-deferred-content\"),v=void 0,e.prev=33,e.next=36,Go();case 36:if(!p){e.next=42;break}return e.next=39,Gt(i);case 39:v=e.sent,e.next=45;break;case 42:return e.next=44,Kt(i);case 44:v=e.sent;case 45:e.next=51;break;case 47:return e.prev=47,e.t1=e.catch(33),n.classList.add(\"has-error\"),e.abrupt(\"return\");case 51:return e.prev=51,n.classList.remove(\"is-loading\"),e.finish(51);case 54:p?p.innerHTML=v:be(n,\"selectmenu:data\",{data:v}),(n.classList.contains(\"active\")||n.hasAttribute(\"open\"))&&be(n,\"selectmenu:load\");case 56:case\"end\":return e.stop()}},e,this,[[14,18,22,30],[23,,25,29],[33,47,51,54]])}));return function(t){return e.apply(this,arguments)}}(),si=new WeakMap;Vn(\".js-select-menu.js-load-contents\",{add:function(e){e.addEventListener(\"mouseenter\",ai),e.addEventListener(\"menu:activate\",ai)},remove:function(e){e.removeEventListener(\"mouseenter\",ai),e.removeEventListener(\"menu:activate\",ai)}});var ui=Object.freeze({setLoadingData:function(e,t){si.set(e,t)}});var ci,li=Object.freeze({getItem:function(e){try{return sessionStorage.getItem(e)}catch(e){return}},setItem:function(e,t){try{sessionStorage.setItem(e,t)}catch(e){}},removeItem:function(e){try{sessionStorage.removeItem(e)}catch(e){}}}),fi=function(){var e=c(regeneratorRuntime.mark(function e(){var t,n,r,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(t=document.body,o(t,\"app/assets/modules/github/sudo.js:15\"),n=dt(document,\"link[rel=sudo-modal]\",HTMLLinkElement),!((r=document.querySelector(\".js-sudo-prompt\"))instanceof HTMLTemplateElement)){e.next=8;break}return e.abrupt(\"return\",r);case 8:if(!n){e.next=16;break}return e.next=11,$t(document,n.href);case 11:return i=e.sent,t.appendChild(i),e.abrupt(\"return\",dt(document,\".js-sudo-prompt\",HTMLTemplateElement));case 16:throw new Error(\"couldn't load sudo prompt\");case 17:case\"end\":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}(),di=function(){var e=c(regeneratorRuntime.mark(function e(){var t,n,r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!hi){e.next=2;break}return e.abrupt(\"return\",!1);case 2:return hi=!0,t=!1,e.next=6,fi();case 6:return n=e.sent,e.next=9,_t({content:n.content.cloneNode(!0)});case 9:return r=e.sent,ni(\".js-sudo-form\",function(){var e=c(regeneratorRuntime.mark(function e(n,r){var o;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,r.text();case 3:e.next=22;break;case 5:if(e.prev=5,e.t0=e.catch(0),e.t0.response){e.next=9;break}throw e.t0;case 9:o=void 0,e.t1=e.t0.response.status,e.next=401===e.t1?13:429===e.t1?15:17;break;case 13:return o=\"Incorrect password.\",e.abrupt(\"break\",18);case 15:return o=\"Too many password attempts. Please wait and try again later.\",e.abrupt(\"break\",18);case 17:o=\"Failed to receive a response. Please try again later.\";case 18:return dt(n,\".js-sudo-error\").textContent=o,dt(n,\".js-sudo-error\").hidden=!1,dt(n,\".js-sudo-password\",HTMLInputElement).value=\"\",e.abrupt(\"return\");case 22:t=!0,ft(n,\"details\").removeAttribute(\"open\");case 24:case\"end\":return e.stop()}},e,this,[[0,5]])}));return function(t,n){return e.apply(this,arguments)}}()),e.next=13,new Promise(function(e){r.addEventListener(\"dialog:remove\",function(){hi=!1,e()},{once:!0})});case 13:return e.abrupt(\"return\",t);case 14:case\"end\":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}(),hi=!1,pi=function(){var e=c(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Kt(\"/sessions/in_sudo.json?requested_access_level=\"+t);case 2:if(e.sent){e.next=6;break}return e.next=6,di();case 6:case\"end\":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}();ge(\"click\",\"[data-sudo-required]\",(ci=c(regeneratorRuntime.mark(function e(t){var n,r,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),n=t.currentTarget,o(n instanceof HTMLElement,\"app/assets/modules/github/sudo.js:93\"),a=n.getAttribute(\"data-sudo-required\"),o(r=\"low\"===a||\"medium\"===a||\"high\"===a||\"two_factor\"===a?a:null,\"app/assets/modules/github/sudo.js:95\"),e.next=7,Kt(\"/sessions/in_sudo.json?requested_access_level=\"+r);case 7:if(i=e.sent,e.t0=i,e.t0){e.next=13;break}return e.next=12,di();case 12:e.t0=e.sent;case 13:if(!e.t0){e.next=16;break}n.removeAttribute(\"data-sudo-required\"),n.click();case 16:case\"end\":return e.stop()}var a},e,this)})),function(e){return ci.apply(this,arguments)}));var vi=Object.freeze({default:pi}),mi=new WeakMap,gi=null;function bi(e,t){return e.closest(\"task-lists\")===t.closest(\"task-lists\")}function yi(e){if(e.currentTarget===e.target){var t=e.currentTarget;if(t instanceof Element){var n=t.closest(\".contains-task-list\");if(n&&(t.classList.add(\"is-ghost\"),e.dataTransfer&&e.dataTransfer.setData(\"text/plain\",t.textContent.trim()),t.parentElement)){var r=Array.from(t.parentElement.children),o=r.indexOf(t);gi={didDrop:!1,dragging:t,dropzone:t,sourceList:n,sourceSibling:r[o+1]||null,sourceIndex:o}}}}}function wi(e){if(gi){var t=e.currentTarget;t instanceof Element&&(bi(gi.dragging,t)?(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=\"move\"),gi.dropzone!==t&&(gi.dragging.classList.add(\"is-dragging\"),gi.dropzone=t,!function(e,t){if(e.parentNode===t.parentNode)for(var n=e;n;){if(n===t)return!0;n=n.previousElementSibling}return!1}(gi.dragging,t)?t.after(gi.dragging):t.before(gi.dragging))):e.stopPropagation())}}function Ei(e){if(gi){var t=e.currentTarget;if(t instanceof Element&&(gi.didDrop=!0,gi.dragging.parentElement)){var n=Array.from(gi.dragging.parentElement.children).indexOf(gi.dragging),r=t.closest(\".contains-task-list\");if(r&&(gi.sourceIndex!==n||gi.sourceList!==r)){gi.sourceList===r&&gi.sourceIndex<n&&n++;var o={list:gi.sourceList,index:gi.sourceIndex},i={list:r,index:n},a=mi.get(gi.dragging);a&&a({src:o,dst:i})}}}}function _i(){gi&&(gi.dragging.classList.remove(\"is-dragging\"),gi.dragging.classList.remove(\"is-ghost\"),gi.didDrop||gi.sourceList.insertBefore(gi.dragging,gi.sourceSibling),gi=null)}function xi(e){if(gi){var t=e.currentTarget;t instanceof Element&&(bi(gi.dragging,t)?(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=\"move\")):e.stopPropagation())}}var ki=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},Ti=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),ji=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t};function Li(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(Li.prototype,HTMLElement.prototype),Object.setPrototypeOf(Li,HTMLElement);var Oi=new WeakMap,Si=function(e){function t(){ki(this,t);var e=ji(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.addEventListener(\"change\",function(t){var n=t.target;n instanceof HTMLInputElement&&n.classList.contains(\"task-list-item-checkbox\")&&e.dispatchEvent(new CustomEvent(\"task-lists:check\",{bubbles:!0,detail:{position:function(e){var t=Ni(e);if(!t)throw new Error(\".contains-task-list not found\");var n=Array.from(t.querySelectorAll(\"li\")).indexOf(e.closest(\".task-list-item\"));return[Fi(t),n]}(n),checked:n.checked}}))}),Oi.set(e,new MutationObserver(Ii.bind(null,e))),e}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,Li),Ti(t,[{key:\"connectedCallback\",value:function(){var e=Oi.get(this);e&&e.observe(this,{childList:!0,subtree:!0}),Ii(this)}},{key:\"disconnectedCallback\",value:function(){var e=Oi.get(this);e&&e.disconnect()}},{key:\"attributeChangedCallback\",value:function(e,t,n){if(t!==n)switch(e){case\"disabled\":qi(this)}}},{key:\"disabled\",get:function(){return this.hasAttribute(\"disabled\")},set:function(e){e?this.setAttribute(\"disabled\",\"\"):this.removeAttribute(\"disabled\")}},{key:\"sortable\",get:function(){return this.hasAttribute(\"sortable\")},set:function(e){e?this.setAttribute(\"sortable\",\"\"):this.removeAttribute(\"sortable\")}}],[{key:\"observedAttributes\",get:function(){return[\"disabled\"]}}]),t}(),Ai=document.createElement(\"template\");Ai.innerHTML='\\n  <span class=\"handle\">\\n    <svg class=\"drag-handle\" aria-hidden=\"true\" width=\"16\" height=\"15\" version=\"1.1\" viewBox=\"0 0 16 15\">\\n      <path d=\"M12,4V5H4V4h8ZM4,8h8V7H4V8Zm0,3h8V10H4v1Z\"></path>\\n    </svg>\\n  </span>';var Mi=new WeakMap;function Ci(e){if(!Mi.get(e)){Mi.set(e,!0);var t=e.closest(\"task-lists\");if(t instanceof Si&&!(t.querySelectorAll(\".task-list-item\").length<=1)){var n=Ai.content.cloneNode(!0),r=n.querySelector(\".handle\");if(e.prepend(n),!r)throw new Error(\"handle not found\");r.addEventListener(\"mouseenter\",zi),r.addEventListener(\"mouseleave\",Xi),function(e,t){mi.set(e,t),e.addEventListener(\"dragstart\",yi),e.addEventListener(\"dragenter\",wi),e.addEventListener(\"dragend\",_i),e.addEventListener(\"drop\",Ei),e.addEventListener(\"dragover\",xi)}(e,Bi),e.addEventListener(\"mouseenter\",Di),e.addEventListener(\"mouseleave\",Pi)}}}function Di(e){var t=e.currentTarget;if(t instanceof Element){var n=t.closest(\"task-lists\");n instanceof Si&&n.sortable&&!n.disabled&&t.classList.add(\"hovered\")}}function Pi(e){var t=e.currentTarget;t instanceof Element&&t.classList.remove(\"hovered\")}function Hi(e){var t=e.parentElement;return t?t.closest(\".contains-task-list\"):null}function Ri(e){return Hi(e)===Ni(e)}function Ni(e){var t=Hi(e);return t?Ni(t)||t:null}function Ii(e){var t=e.querySelectorAll(\".contains-task-list > .task-list-item\"),n=!0,r=!1,o=void 0;try{for(var i,a=t[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;Ri(s)&&Ci(s)}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}qi(e)}function qi(e){var t=!0,n=!1,r=void 0;try{for(var o,i=e.querySelectorAll(\".task-list-item\")[Symbol.iterator]();!(t=(o=i.next()).done);t=!0){o.value.classList.toggle(\"enabled\",!e.disabled)}}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}var a=!0,s=!1,u=void 0;try{for(var c,l=e.querySelectorAll(\".task-list-item-checkbox\")[Symbol.iterator]();!(a=(c=l.next()).done);a=!0){var f=c.value;f instanceof HTMLInputElement&&(f.disabled=e.disabled)}}catch(e){s=!0,u=e}finally{try{!a&&l.return&&l.return()}finally{if(s)throw u}}}function Fi(e){var t=e.parentElement;if(!t)throw new Error(\"parent not found\");return Array.from(t.children).filter(function(e){return\"OL\"===e.nodeName||\"UL\"===e.nodeName}).indexOf(e)}function Bi(e){var t=e.src,n=e.dst,r=t.list.closest(\"task-lists\");r&&r.dispatchEvent(new CustomEvent(\"task-lists:move\",{bubbles:!0,detail:{src:[Fi(t.list),t.index],dst:[Fi(n.list),n.index]}}))}function zi(e){var t=e.currentTarget;if(t instanceof Element){var n=t.closest(\".task-list-item\");if(n){var r=n.closest(\"task-lists\");r instanceof Si&&r.sortable&&!r.disabled&&n.setAttribute(\"draggable\",\"true\")}}}function Xi(e){if(!gi){var t=e.currentTarget;if(t instanceof Element){var n=t.closest(\".task-list-item\");n&&n.setAttribute(\"draggable\",\"false\")}}}function Vi(e){if(e.querySelector(\".js-task-list-field\")){var t=!0,n=!1,r=void 0;try{for(var o,i=ht(e,\"task-lists\",Si)[Symbol.iterator]();!(t=(o=i.next()).done);t=!0){o.value.disabled=!1}}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}}}function Wi(e,t,n){var r=dt(e,\".js-comment-update\",HTMLFormElement);!function(e){var t=!0,n=!1,r=void 0;try{for(var o,i=ht(e,\"task-lists\",Si)[Symbol.iterator]();!(t=(o=i.next()).done);t=!0)o.value.disabled=!0}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}}(e);var i=r.elements.namedItem(\"task_list_track\");i&&i.remove();var a=r.elements.namedItem(\"task_list_operation\");a&&a.remove();var s=document.createElement(\"input\");s.setAttribute(\"type\",\"hidden\"),s.setAttribute(\"name\",\"task_list_track\"),s.setAttribute(\"value\",t),r.appendChild(s);var u=document.createElement(\"input\");if(u.setAttribute(\"type\",\"hidden\"),u.setAttribute(\"name\",\"task_list_operation\"),u.setAttribute(\"value\",JSON.stringify(n)),r.appendChild(u),!r.elements.namedItem(\"task_list_key\")){var c=dt(r,\".js-task-list-field\").getAttribute(\"name\");o(c,\"app/assets/modules/github/task-list.js:127\");var l=c.split(\"[\")[0],f=document.createElement(\"input\");f.setAttribute(\"type\",\"hidden\"),f.setAttribute(\"name\",\"task_list_key\"),f.setAttribute(\"value\",l),r.appendChild(f)}e.classList.remove(\"is-comment-stale\"),rn(r)}window.customElements.get(\"task-lists\")||(window.TaskListsElement=Si,window.customElements.define(\"task-lists\",Si)),Vn(\".js-task-list-container .js-task-list-field\",function(e){Vi(ft(e,\".js-task-list-container\"))}),ge(\"task-lists:move\",\"task-lists\",function(e){o(e instanceof CustomEvent,\"app/assets/modules/github/task-list.js:68\");var t=e.detail,n=t.src,r=t.dst;Wi(ft(e.currentTarget,\".js-task-list-container\"),\"reordered\",{operation:\"move\",src:n,dst:r})}),ge(\"task-lists:check\",\"task-lists\",function(e){o(e instanceof CustomEvent,\"app/assets/modules/github/task-list.js:75\");var t=e.detail,n=t.position,r=t.checked;Wi(ft(e.currentTarget,\".js-task-list-container\"),\"checked:\"+(r?1:0),{operation:\"check\",position:n,checked:r})}),ni(\".js-task-list-container .js-comment-update\",function(){var e=c(regeneratorRuntime.mark(function e(t,n){var r,o,i,a,s,u,c,l,f,d,h;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r=ft(t,\".js-task-list-container\"),(o=t.elements.namedItem(\"task_list_track\"))&&o.remove(),(i=t.elements.namedItem(\"task_list_operation\"))&&i.remove(),a=void 0,e.prev=6,e.next=9,n.json();case 9:a=e.sent,e.next=17;break;case 12:e.prev=12,e.t0=e.catch(6),s=void 0;try{s=JSON.parse(e.t0.response.text)}catch(e){}s&&s.stale?(u=s.updated_markdown,c=s.updated_html,l=s.version,u&&c&&l&&(f=dt(r,\".js-comment-body\"),d=dt(r,\".js-body-version\"),h=dt(r,\".js-task-list-field\",HTMLTextAreaElement),f.innerHTML=c,h.value=u,r.setAttribute(\"data-body-version\",l),d instanceof HTMLInputElement&&(d.value=l))):window.location.reload();case 17:a&&(i&&a.json.source&&(dt(r,\".js-task-list-field\",HTMLTextAreaElement).value=a.json.source),Vi(r));case 18:case\"end\":return e.stop()}},e,this,[[6,12]])}));return function(t,n){return e.apply(this,arguments)}}());var Ui=Object.freeze({enableTaskList:Vi});function Yi(e){return e.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0,cancelable:!1}))}var Gi=Object.freeze({getUtf8StringLength:function(e){var t=e.split(\"‍\"),n=0,r=!0,o=!1,i=void 0;try{for(var a,s=t[Symbol.iterator]();!(r=(a=s.next()).done);r=!0){var u=a.value;n+=Array.from(u.split(/[\\ufe00-\\ufe0f]/).join(\"\")).length}}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n/t.length},replaceText:function(e,t,n){var r=e.value.substring(0,e.selectionEnd),o=e.value.substring(e.selectionEnd);r=r.replace(t,n),o=o.replace(t,n),e.value=r+o,e.selectionStart=r.length,e.selectionEnd=r.length,Yi(e)},insertText:function(e,t){var n=e.selectionEnd,r=e.value.substring(0,n),o=e.value.substring(n),i=\"\"===e.value||r.match(/\\n$/)?\"\":\"\\n\";e.value=r+i+t+o,e.selectionStart=n+t.length,e.selectionEnd=n+t.length,Yi(e),e.focus()}}),Ki=new WeakMap;function $i(e){var t=Ki.get(e);o(t,\"app/assets/modules/github/throttled-input.js:24\"),null!=t.timer&&clearTimeout(t.timer),t.timer=setTimeout(function(){null!=t.timer&&(t.timer=null),t.inputed=!1,t.listener.call(null,e)},t.wait)}function Ji(e){var t=Ki.get(e.currentTarget);o(t,\"app/assets/modules/github/throttled-input.js:36\"),t.keypressed=!0,null!=t.timer&&clearTimeout(t.timer)}function Zi(e){var t=Ki.get(e.currentTarget);o(t,\"app/assets/modules/github/throttled-input.js:45\"),o(e.currentTarget instanceof HTMLInputElement||e.currentTarget instanceof HTMLTextAreaElement,\"app/assets/modules/github/throttled-input.js:46\"),t.keypressed=!1,t.inputed&&$i(e.currentTarget)}function Qi(e){var t=Ki.get(e.currentTarget);o(t,\"app/assets/modules/github/throttled-input.js:55\"),o(e.currentTarget instanceof HTMLInputElement||e.currentTarget instanceof HTMLTextAreaElement,\"app/assets/modules/github/throttled-input.js:56\"),t.inputed=!0,t.keypressed||$i(e.currentTarget)}var ea=Object.freeze({addThrottledInputEventListener:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Ki.set(e,{keypressed:!1,inputed:!1,timer:void 0,listener:t,wait:null!=n.wait?n.wait:100}),e.addEventListener(\"keydown\",Ji),e.addEventListener(\"keyup\",Zi),e.addEventListener(\"input\",Qi)},removeThrottledInputEventListener:function(e,t){e.removeEventListener(\"keydown\",Ji),e.removeEventListener(\"keyup\",Zi),e.removeEventListener(\"input\",Qi);var n=Ki.get(e);n&&(null!=n.timer&&n.listener===t&&clearTimeout(n.timer),Ki.delete(e))},dispatchThrottledInputEvent:function(e){var t=Ki.get(e);t&&t.listener.call(null,e)}});function ta(e,t,n){if(0===t&&0===n)return[0,0];var r=na(e);wr(e,{top:r.top+n,left:r.left+t});var o=na(e);return[o.left-r.left,o.top-r.top]}function na(e){if(e.offsetParent&&e instanceof HTMLElement)return{top:e.scrollTop,left:e.scrollLeft};var t=gr(e);return{top:null!=t?t.pageYOffset:0,left:null!=t?t.pageXOffset:0}}var ra=Object.freeze({default:ta});function oa(e){return new Promise(function(t){if(e===window&&((n=ia)<Yr?self.performance.now()-n:Date.now()-n)>500)requestAnimationFrame(function(){return t()});else{var n,r=ut(function(){e.removeEventListener(\"scroll\",r,{capture:!0,passive:!0}),t()},500);e.addEventListener(\"scroll\",r,{capture:!0,passive:!0}),r()}})}var ia=0;window.addEventListener(\"scroll\",function(e){var t;t=e.timeStamp,ia=!t||t<Yr&&!(t%1)?Date.now():t},{capture:!0,passive:!0});var aa=function(){var e=c(regeneratorRuntime.mark(function e(t){return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,oa(window);case 2:return e.abrupt(\"return\",ua(sa(),t));case 3:case\"end\":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}();function sa(){if(document.activeElement!==document.body)return document.activeElement;var e=document.querySelectorAll(\":hover\"),t=e.length;return t?e[t-1]:void 0}function ua(e,t){if(!e)return t();var n=function(e){var t=[];for(;e instanceof HTMLElement;){var n=e.getBoundingClientRect(),r=n.top,o=n.left;t.push({element:e,top:r,left:o}),e=e.parentElement}return t}(e),r=t.call(e),o=function(e){var t=document.documentElement;if(!t)return;var n=!0,r=!1,o=void 0;try{for(var i,a=e[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;if(t.contains(s.element))return s}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}(n);if(o){e=o.element;var i=o.top,a=o.left,s=e.getBoundingClientRect(),u=s.top;return function(e,t,n){for(var r=kt(e),o=0,i=0;r;){var a=ta(r,t-o,n-i),s=v(a,2),u=s[0];if(i+=s[1],(o+=u)===t&&i===n)break;r=kt(r)}}(e,s.left-a,u-i),r}}var ca=Object.freeze({preserveInteractivePosition:aa,preservingScrollPosition:ua});function la(e,t){return new Promise(function(n,r){e.onload=function(){200===e.status?n(e.responseText):r(new Error(\"XMLHttpRequest \"+e.statusText))},e.onerror=r,e.send(t||null)})}var fa=new WeakMap,da=function(){var e=c(regeneratorRuntime.mark(function e(t){var n,r,o,i;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!fa.get(t)){e.next=2;break}return e.abrupt(\"return\");case 2:if(n=new XMLHttpRequest,r=t.getAttribute(\"data-url\"),o=t.hasAttribute(\"data-retain-focus\"),null!=r){e.next=7;break}throw new Error(\"Element must have `data-url` attribute\");case 7:return n.open(\"GET\",r),n.setRequestHeader(\"Accept\",\"text/html\"),n.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),fa.set(t,n),e.prev=11,e.next=14,la(n);case 14:if(i=e.sent,!cn(t,o)){e.next=17;break}throw new Error(\"element had interactions\");case 17:return e.abrupt(\"return\",pa(t,i,o));case 20:e.prev=20,e.t0=e.catch(11),\"XMLHttpRequest abort\"!==e.t0.message&&console.warn(\"Failed to update content\",t,e.t0);case 23:return e.prev=23,fa.delete(t),e.finish(23);case 26:case\"end\":return e.stop()}},e,this,[[11,20,23,26]])}));return function(t){return e.apply(this,arguments)}}(),ha=function(){var e=c(regeneratorRuntime.mark(function e(t,n){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return(r=fa.get(t))&&r.abort(),e.abrupt(\"return\",pa(t,n));case 3:case\"end\":return e.stop()}},e,this)}));return function(t,n){return e.apply(this,arguments)}}();function pa(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return aa(function(){var r=Ft(document,t.trim()),o=n&&e===e.ownerDocument.activeElement?r.querySelector(\"*\"):null;e.replaceWith(r),o&&o.focus()})}var va=Object.freeze({updateContent:da,replaceContent:ha}),ma=r(function(e){var t;t=function(){if(\"undefined\"==typeof window||!window.document)return function(){throw new Error(\"Sortable.js requires a window with a document\")};var e,t,n,r,o,i,a,s,u,c,l,f,d,h,p,v,m,g,b,y,w,E,_={},x=/\\s+/g,k=/left|right|inline/,T=\"Sortable\"+(new Date).getTime(),j=window,L=j.document,O=j.parseInt,S=j.setTimeout,A=j.jQuery||j.Zepto,M=j.Polymer,C=!1,D=\"draggable\"in L.createElement(\"div\"),P=!navigator.userAgent.match(/(?:Trident.*rv[ :]?11\\.|msie)/i)&&((E=L.createElement(\"x\")).style.cssText=\"pointer-events:auto\",\"auto\"===E.style.pointerEvents),H=!1,R=Math.abs,N=Math.min,I=[],q=[],F=function(){return!1},B=ie(function(e,t,n){if(n&&t.scroll){var r,o,i,a,s,f,d=n[T],h=t.scrollSensitivity,p=t.scrollSpeed,v=e.clientX,m=e.clientY,g=window.innerWidth,b=window.innerHeight;if(c!==n&&(u=t.scroll,c=n,l=t.scrollFn,!0===u)){u=n;do{if(u.offsetWidth<u.scrollWidth||u.offsetHeight<u.scrollHeight)break}while(u=u.parentNode)}u&&(r=u,o=u.getBoundingClientRect(),i=(R(o.right-v)<=h)-(R(o.left-v)<=h),a=(R(o.bottom-m)<=h)-(R(o.top-m)<=h)),i||a||(a=(b-m<=h)-(m<=h),((i=(g-v<=h)-(v<=h))||a)&&(r=j)),_.vx===i&&_.vy===a&&_.el===r||(_.el=r,_.vx=i,_.vy=a,clearInterval(_.pid),r&&(_.pid=setInterval(function(){if(f=a?a*p:0,s=i?i*p:0,\"function\"==typeof l)return l.call(d,s,f,e);r===j?j.scrollTo(j.pageXOffset+s,j.pageYOffset+f):(r.scrollTop+=f,r.scrollLeft+=s)},24)))}},30),z=function(e){function t(e,t){return null!=e&&!0!==e||null!=(e=n.name)?\"function\"==typeof e?e:function(n,r){var o=r.options.group.name;return t?e:e&&(e.join?e.indexOf(o)>-1:o==e)}:F}var n={},r=e.group;r&&\"object\"==typeof r||(r={name:r}),n.name=r.name,n.checkPull=t(r.pull,!0),n.checkPut=t(r.put),n.revertClone=r.revertClone,e.group=n};try{window.addEventListener(\"test\",null,Object.defineProperty({},\"passive\",{get:function(){C={capture:!1,passive:!1}}}))}catch(e){}function X(e,t){if(!e||!e.nodeType||1!==e.nodeType)throw\"Sortable: `el` must be HTMLElement, and not \"+{}.toString.call(e);this.el=e,this.options=t=ae({},t),e[T]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(e.nodeName)?\"li\":\">*\",ghostClass:\"sortable-ghost\",chosenClass:\"sortable-chosen\",dragClass:\"sortable-drag\",ignore:\"a, img\",filter:null,preventOnFilter:!0,animation:0,setData:function(e,t){e.setData(\"Text\",t.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:\"data-id\",delay:0,forceFallback:!1,fallbackClass:\"sortable-fallback\",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==X.supportPointer};for(var r in n)!(r in t)&&(t[r]=n[r]);for(var o in z(t),this)\"_\"===o.charAt(0)&&\"function\"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!t.forceFallback&&D,Y(e,\"mousedown\",this._onTapStart),Y(e,\"touchstart\",this._onTapStart),t.supportPointer&&Y(e,\"pointerdown\",this._onTapStart),this.nativeDraggable&&(Y(e,\"dragover\",this),Y(e,\"dragenter\",this)),q.push(this._onDragOver),t.store&&this.sort(t.store.get(this))}function V(t,n){\"clone\"!==t.lastPullMode&&(n=!0),o&&o.state!==n&&($(o,\"display\",n?\"none\":\"\"),n||o.state&&(t.options.group.revertClone?(i.insertBefore(o,a),t._animate(e,o)):i.insertBefore(o,e)),o.state=n)}function W(e,t,n){if(e){n=n||L;do{if(\">*\"===t&&e.parentNode===n||oe(e,t))return e}while(e=U(e))}return null}function U(e){var t=e.host;return t&&t.nodeType?t:e.parentNode}function Y(e,t,n){e.addEventListener(t,n,C)}function G(e,t,n){e.removeEventListener(t,n,C)}function K(e,t,n){if(e)if(e.classList)e.classList[n?\"add\":\"remove\"](t);else{var r=(\" \"+e.className+\" \").replace(x,\" \").replace(\" \"+t+\" \",\" \");e.className=(r+(n?\" \"+t:\"\")).replace(x,\" \")}}function $(e,t,n){var r=e&&e.style;if(r){if(void 0===n)return L.defaultView&&L.defaultView.getComputedStyle?n=L.defaultView.getComputedStyle(e,\"\"):e.currentStyle&&(n=e.currentStyle),void 0===t?n:n[t];t in r||(t=\"-webkit-\"+t),r[t]=n+(\"string\"==typeof n?\"\":\"px\")}}function J(e,t,n){if(e){var r=e.getElementsByTagName(t),o=0,i=r.length;if(n)for(;o<i;o++)n(r[o],o);return r}return[]}function Z(e,t,n,r,i,a,s,u){e=e||t[T];var c=L.createEvent(\"Event\"),l=e.options,f=\"on\"+n.charAt(0).toUpperCase()+n.substr(1);c.initEvent(n,!0,!0),c.to=i||t,c.from=a||t,c.item=r||t,c.clone=o,c.oldIndex=s,c.newIndex=u,t.dispatchEvent(c),l[f]&&l[f].call(e,c)}function Q(e,t,n,r,o,i,a,s){var u,c,l=e[T],f=l.options.onMove;return(u=L.createEvent(\"Event\")).initEvent(\"move\",!0,!0),u.to=t,u.from=e,u.dragged=n,u.draggedRect=r,u.related=o||t,u.relatedRect=i||t.getBoundingClientRect(),u.willInsertAfter=s,e.dispatchEvent(u),f&&(c=f.call(l,u,a)),c}function ee(e){e.draggable=!1}function te(){H=!1}function ne(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,r=0;n--;)r+=t.charCodeAt(n);return r.toString(36)}function re(e,t){var n=0;if(!e||!e.parentNode)return-1;for(;e&&(e=e.previousElementSibling);)\"TEMPLATE\"===e.nodeName.toUpperCase()||\">*\"!==t&&!oe(e,t)||n++;return n}function oe(e,t){if(e){var n=(t=t.split(\".\")).shift().toUpperCase(),r=new RegExp(\"\\\\s(\"+t.join(\"|\")+\")(?=\\\\s)\",\"g\");return!(\"\"!==n&&e.nodeName.toUpperCase()!=n||t.length&&((\" \"+e.className+\" \").match(r)||[]).length!=t.length)}return!1}function ie(e,t){var n,r;return function(){void 0===n&&(n=arguments,r=this,S(function(){1===n.length?e.call(r,n[0]):e.apply(r,n),n=void 0},t))}}function ae(e,t){if(e&&t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function se(e){return S(e,0)}function ue(e){return clearTimeout(e)}return X.prototype={constructor:X,_onTapStart:function(t){var n,r=this,o=this.el,i=this.options,a=i.preventOnFilter,u=t.type,c=t.touches&&t.touches[0],l=(c||t).target,f=t.target.shadowRoot&&t.path&&t.path[0]||l,d=i.filter;if(function(e){I.length=0;var t=e.getElementsByTagName(\"input\"),n=t.length;for(;n--;){var r=t[n];r.checked&&I.push(r)}}(o),!e&&!(/mousedown|pointerdown/.test(u)&&0!==t.button||i.disabled)&&!f.isContentEditable&&(l=W(l,i.draggable,o))&&s!==l){if(n=re(l,i.draggable),\"function\"==typeof d){if(d.call(this,t,l,this))return Z(r,f,\"filter\",l,o,o,n),void(a&&t.preventDefault())}else if(d&&(d=d.split(\",\").some(function(e){if(e=W(f,e.trim(),o))return Z(r,e,\"filter\",l,o,o,n),!0})))return void(a&&t.preventDefault());i.handle&&!W(f,i.handle,o)||this._prepareDragStart(t,c,l,n)}},_prepareDragStart:function(r,o,u,c){var l,f=this,d=f.el,h=f.options,v=d.ownerDocument;u&&!e&&u.parentNode===d&&(b=r,i=d,e=u,h.handleReplacedDragElement&&(t=u.getAttribute(\"id\")),n=e.parentNode,a=e.nextSibling,s=u,m=h.group,p=c,this._lastX=(o||r).clientX,this._lastY=(o||r).clientY,e.style[\"will-change\"]=\"all\",l=function(){f._disableDelayedDrag(),e.draggable=f.nativeDraggable,K(e,h.chosenClass,!0),f._triggerDragStart(r,o),Z(f,i,\"choose\",e,i,i,p)},h.ignore.split(\",\").forEach(function(t){J(e,t.trim(),ee)}),Y(v,\"mouseup\",f._onDrop),Y(v,\"touchend\",f._onDrop),Y(v,\"touchcancel\",f._onDrop),Y(v,\"selectstart\",f),h.supportPointer&&Y(v,\"pointercancel\",f._onDrop),h.delay?(Y(v,\"mouseup\",f._disableDelayedDrag),Y(v,\"touchend\",f._disableDelayedDrag),Y(v,\"touchcancel\",f._disableDelayedDrag),Y(v,\"mousemove\",f._disableDelayedDrag),Y(v,\"touchmove\",f._disableDelayedDrag),h.supportPointer&&Y(v,\"pointermove\",f._disableDelayedDrag),f._dragStartTimer=S(l,h.delay)):l())},_disableDelayedDrag:function(){var e=this.el.ownerDocument;clearTimeout(this._dragStartTimer),G(e,\"mouseup\",this._disableDelayedDrag),G(e,\"touchend\",this._disableDelayedDrag),G(e,\"touchcancel\",this._disableDelayedDrag),G(e,\"mousemove\",this._disableDelayedDrag),G(e,\"touchmove\",this._disableDelayedDrag),G(e,\"pointermove\",this._disableDelayedDrag)},_triggerDragStart:function(t,n){(n=n||(\"touch\"==t.pointerType?t:null))?(b={target:e,clientX:n.clientX,clientY:n.clientY},this._onDragStart(b,\"touch\")):this.nativeDraggable?(Y(e,\"dragend\",this),Y(i,\"dragstart\",this._onDragStart)):this._onDragStart(b,!0);try{L.selection?se(function(){L.selection.empty()}):window.getSelection().removeAllRanges()}catch(e){}},_dragStarted:function(){if(i&&e){var t=this.options;K(e,t.ghostClass,!0),K(e,t.dragClass,!1),X.active=this,Z(this,i,\"start\",e,i,i,p)}else this._nulling()},_emulateDragOver:function(){if(y){if(this._lastX===y.clientX&&this._lastY===y.clientY)return;this._lastX=y.clientX,this._lastY=y.clientY,P||$(r,\"display\",\"none\");var e=L.elementFromPoint(y.clientX,y.clientY),t=e,n=q.length;if(e&&e.shadowRoot&&(t=e=e.shadowRoot.elementFromPoint(y.clientX,y.clientY)),t)do{if(t[T]){for(;n--;)q[n]({clientX:y.clientX,clientY:y.clientY,target:e,rootEl:t});break}e=t}while(t=t.parentNode);P||$(r,\"display\",\"\")}},_onTouchMove:function(e){if(b){var t=this.options,n=t.fallbackTolerance,o=t.fallbackOffset,i=e.touches?e.touches[0]:e,a=i.clientX-b.clientX+o.x,s=i.clientY-b.clientY+o.y,u=e.touches?\"translate3d(\"+a+\"px,\"+s+\"px,0)\":\"translate(\"+a+\"px,\"+s+\"px)\";if(!X.active){if(n&&N(R(i.clientX-this._lastX),R(i.clientY-this._lastY))<n)return;this._dragStarted()}this._appendGhost(),w=!0,y=i,$(r,\"webkitTransform\",u),$(r,\"mozTransform\",u),$(r,\"msTransform\",u),$(r,\"transform\",u),e.preventDefault()}},_appendGhost:function(){if(!r){var t,n=e.getBoundingClientRect(),o=$(e),a=this.options;K(r=e.cloneNode(!0),a.ghostClass,!1),K(r,a.fallbackClass,!0),K(r,a.dragClass,!0),$(r,\"top\",n.top-O(o.marginTop,10)),$(r,\"left\",n.left-O(o.marginLeft,10)),$(r,\"width\",n.width),$(r,\"height\",n.height),$(r,\"opacity\",\"0.8\"),$(r,\"position\",\"fixed\"),$(r,\"zIndex\",\"100000\"),$(r,\"pointerEvents\",\"none\"),a.fallbackOnBody&&L.body.appendChild(r)||i.appendChild(r),t=r.getBoundingClientRect(),$(r,\"width\",2*n.width-t.width),$(r,\"height\",2*n.height-t.height)}},_onDragStart:function(t,n){var r=t.dataTransfer,o=this.options;this._offUpEvents(),m.checkPull(this,this,e,t),K(e,o.dragClass,!0),n?(\"touch\"===n?(Y(L,\"touchmove\",this._onTouchMove),Y(L,\"touchend\",this._onDrop),Y(L,\"touchcancel\",this._onDrop),o.supportPointer&&(Y(L,\"pointermove\",this._onTouchMove),Y(L,\"pointerup\",this._onDrop))):(Y(L,\"mousemove\",this._onTouchMove),Y(L,\"mouseup\",this._onDrop)),this._loopId=setInterval(this._emulateDragOver,50)):(r&&(r.effectAllowed=\"move\",o.setData&&o.setData.call(this,r,e)),Y(L,\"drop\",this),this._dragStartId=se(this._dragStarted))},_onDragOver:function(s){var u,c,l,p,v=this.el,b=this.options,y=b.group,E=X.active,_=m===y,x=!1,j=b.sort;if(void 0!==s.preventDefault&&(s.preventDefault(),!b.dragoverBubble&&s.stopPropagation()),!e.animated&&(w=!0,b.handleReplacedDragElement&&!e.parentNode&&t&&K(e=L.getElementById(t)||e,this.options.ghostClass,!0),E&&!b.disabled&&(_?j||(p=!i.contains(e)):g===this||(E.lastPullMode=m.checkPull(this,E,e,s))&&y.checkPut(this,E,e,s))&&(void 0===s.rootEl||s.rootEl===this.el))){if(B(s,b,this.el),H)return;if(u=W(s.target,b.draggable,v),c=e.getBoundingClientRect(),g!==this&&(g=this,x=!0),p)return V(E,!0),n=i,void(o||a?i.insertBefore(e,o||a):j||i.appendChild(e));if(0===v.children.length||v.children[0]===r||v===s.target&&function(e,t){var n=e.lastElementChild.getBoundingClientRect();return t.clientY-(n.top+n.height)>5||t.clientX-(n.left+n.width)>5}(v,s)){if(0!==v.children.length&&v.children[0]!==r&&v===s.target&&(u=v.lastElementChild),u){if(u.animated)return;l=u.getBoundingClientRect()}V(E,_),!1!==Q(i,v,e,c,u,l,s)&&(e.contains(v)||(v.appendChild(e),n=v),this._animate(c,e),u&&this._animate(l,u))}else if(u&&!u.animated&&u!==e&&void 0!==u.parentNode[T]){f!==u&&(f=u,d=$(u),h=$(u.parentNode));var O=(l=u.getBoundingClientRect()).right-l.left,A=l.bottom-l.top,M=k.test(d.cssFloat+d.display)||\"flex\"==h.display&&0===h[\"flex-direction\"].indexOf(\"row\"),C=u.offsetWidth>e.offsetWidth,D=u.offsetHeight>e.offsetHeight,P=(M?(s.clientX-l.left)/O:(s.clientY-l.top)/A)>.5,R=u.nextElementSibling,N=!1;if(M){var I=e.offsetTop,q=u.offsetTop;N=I===q?u.previousElementSibling===e&&!C||P&&C:u.previousElementSibling===e||e.previousElementSibling===u?(s.clientY-l.top)/A>.5:q>I}else x||(N=R!==e&&!D||P&&D);var F=Q(i,v,e,c,u,l,s,N);!1!==F&&(1!==F&&-1!==F||(N=1===F),H=!0,S(te,30),V(E,_),e.contains(v)||(N&&!R?v.appendChild(e):u.parentNode.insertBefore(e,N?R:u)),n=e.parentNode,this._animate(c,e),this._animate(l,u))}}},_animate:function(e,t){var n=this.options.animation;if(n){var r=t.getBoundingClientRect();1===e.nodeType&&(e=e.getBoundingClientRect()),$(t,\"transition\",\"none\"),$(t,\"transform\",\"translate3d(\"+(e.left-r.left)+\"px,\"+(e.top-r.top)+\"px,0)\"),t.offsetWidth,$(t,\"transition\",\"all \"+n+\"ms\"),$(t,\"transform\",\"translate3d(0,0,0)\"),clearTimeout(t.animated),t.animated=S(function(){$(t,\"transition\",\"\"),$(t,\"transform\",\"\"),t.animated=!1},n)}},_offUpEvents:function(){var e=this.el.ownerDocument;G(L,\"touchmove\",this._onTouchMove),G(L,\"pointermove\",this._onTouchMove),G(e,\"mouseup\",this._onDrop),G(e,\"touchend\",this._onDrop),G(e,\"pointerup\",this._onDrop),G(e,\"touchcancel\",this._onDrop),G(e,\"pointercancel\",this._onDrop),G(e,\"selectstart\",this)},_onDrop:function(t){var s=this.el,u=this.options;clearInterval(this._loopId),clearInterval(_.pid),clearTimeout(this._dragStartTimer),ue(this._cloneId),ue(this._dragStartId),G(L,\"mouseover\",this),G(L,\"mousemove\",this._onTouchMove),this.nativeDraggable&&(G(L,\"drop\",this),G(s,\"dragstart\",this._onDragStart)),this._offUpEvents(),t&&(w&&(t.preventDefault(),!u.dropBubble&&t.stopPropagation()),r&&r.parentNode&&r.parentNode.removeChild(r),i!==n&&\"clone\"===X.active.lastPullMode||o&&o.parentNode&&o.parentNode.removeChild(o),e&&(this.nativeDraggable&&G(e,\"dragend\",this),ee(e),e.style[\"will-change\"]=\"\",K(e,this.options.ghostClass,!1),K(e,this.options.chosenClass,!1),Z(this,i,\"unchoose\",e,n,i,p),i!==n?(v=re(e,u.draggable))>=0&&(Z(null,n,\"add\",e,n,i,p,v),Z(this,i,\"remove\",e,n,i,p,v),Z(null,n,\"sort\",e,n,i,p,v),Z(this,i,\"sort\",e,n,i,p,v)):e.nextSibling!==a&&(v=re(e,u.draggable))>=0&&(Z(this,i,\"update\",e,n,i,p,v),Z(this,i,\"sort\",e,n,i,p,v)),X.active&&(null!=v&&-1!==v||(v=p),Z(this,i,\"end\",e,n,i,p,v),this.save()))),this._nulling()},_nulling:function(){i=e=n=r=a=o=s=u=c=b=y=w=v=f=d=g=m=X.active=null,I.forEach(function(e){e.checked=!0}),I.length=0},handleEvent:function(t){switch(t.type){case\"drop\":case\"dragend\":this._onDrop(t);break;case\"dragover\":case\"dragenter\":e&&(this._onDragOver(t),function(e){e.dataTransfer&&(e.dataTransfer.dropEffect=\"move\");e.preventDefault()}(t));break;case\"mouseover\":this._onDrop(t);break;case\"selectstart\":t.preventDefault()}},toArray:function(){for(var e,t=[],n=this.el.children,r=0,o=n.length,i=this.options;r<o;r++)W(e=n[r],i.draggable,this.el)&&t.push(e.getAttribute(i.dataIdAttr)||ne(e));return t},sort:function(e){var t={},n=this.el;this.toArray().forEach(function(e,r){var o=n.children[r];W(o,this.options.draggable,n)&&(t[e]=o)},this),e.forEach(function(e){t[e]&&(n.removeChild(t[e]),n.appendChild(t[e]))})},save:function(){var e=this.options.store;e&&e.set(this)},closest:function(e,t){return W(e,t||this.options.draggable,this.el)},option:function(e,t){var n=this.options;if(void 0===t)return n[e];n[e]=t,\"group\"===e&&z(n)},destroy:function(){var e=this.el;e[T]=null,G(e,\"mousedown\",this._onTapStart),G(e,\"touchstart\",this._onTapStart),G(e,\"pointerdown\",this._onTapStart),this.nativeDraggable&&(G(e,\"dragover\",this),G(e,\"dragenter\",this)),Array.prototype.forEach.call(e.querySelectorAll(\"[draggable]\"),function(e){e.removeAttribute(\"draggable\")}),q.splice(q.indexOf(this._onDragOver),1),this._onDrop(),this.el=e=null}},Y(L,\"touchmove\",function(e){X.active&&e.preventDefault()}),X.utils={on:Y,off:G,css:$,find:J,is:function(e,t){return!!W(e,t,e)},extend:ae,throttle:ie,closest:W,toggleClass:K,clone:function(e){return M&&M.dom?M.dom(e).cloneNode(!0):A?A(e).clone(!0)[0]:e.cloneNode(!0)},index:re,nextTick:se,cancelNextTick:ue},X.create=function(e,t){return new X(e,t)},X.version=\"1.7.0\",X},e.exports=t()}),ga=Object.freeze({default:ma,__moduleExports:ma});var ba=new WeakMap;function ya(e,t){var n=new XMLHttpRequest;return n.open(\"GET\",t,!0),n.setRequestHeader(\"Accept\",\"text/html; fragment\"),function(e,t){var n=ba.get(e);n&&n.abort();ba.set(e,t);var r=function(){return ba.delete(e)},o=function(e){return new Promise(function(t,n){e.onload=function(){e.status>=200&&e.status<300?t(e.responseText):n(new Error(e.responseText))},e.onerror=n,e.send()})}(t);return o.then(r,r),o}(e,n)}var wa=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},Ea=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),_a=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t},xa=navigator.userAgent.match(/Macintosh/),ka=function(){function e(t,n,r){var o,i,a;wa(this,e),this.container=t,this.input=n,this.results=r,this.results.hidden=!0,this.input.setAttribute(\"autocomplete\",\"off\"),this.input.setAttribute(\"spellcheck\",\"false\"),this.mouseDown=!1,this.onInputChange=(o=this.onInputChange.bind(this),i=300,a=void 0,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=this;clearTimeout(a),a=setTimeout(function(){clearTimeout(a),o.apply(r,t)},i)}),this.onResultsClick=this.onResultsClick.bind(this),this.onResultsMouseDown=this.onResultsMouseDown.bind(this),this.onInputBlur=this.onInputBlur.bind(this),this.onInputFocus=this.onInputFocus.bind(this),this.onKeydown=this.onKeydown.bind(this),this.input.addEventListener(\"keydown\",this.onKeydown),this.input.addEventListener(\"focus\",this.onInputFocus),this.input.addEventListener(\"blur\",this.onInputBlur),this.input.addEventListener(\"input\",this.onInputChange),this.results.addEventListener(\"mousedown\",this.onResultsMouseDown),this.results.addEventListener(\"click\",this.onResultsClick)}return Ea(e,[{key:\"destroy\",value:function(){this.input.removeEventListener(\"keydown\",this.onKeydown),this.input.removeEventListener(\"focus\",this.onInputFocus),this.input.removeEventListener(\"blur\",this.onInputBlur),this.input.removeEventListener(\"input\",this.onInputChange),this.results.removeEventListener(\"mousedown\",this.onResultsMouseDown),this.results.removeEventListener(\"click\",this.onResultsClick)}},{key:\"sibling\",value:function(e){var t=Array.from(this.results.querySelectorAll('[role=\"option\"]')),n=this.results.querySelector('[aria-selected=\"true\"]'),r=t.indexOf(n),o=e?t[r+1]:t[r-1],i=e?t[0]:t[t.length-1];return o||i}},{key:\"select\",value:function(e){var t=!0,n=!1,r=void 0;try{for(var o,i=this.results.querySelectorAll('[aria-selected=\"true\"]')[Symbol.iterator]();!(t=(o=i.next()).done);t=!0){o.value.removeAttribute(\"aria-selected\")}}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}e.setAttribute(\"aria-selected\",\"true\"),this.input.setAttribute(\"aria-activedescendant\",e.id),function(e,t){(function(e,t){var n=e.scrollTop,r=n+e.clientHeight,o=t.offsetTop,i=o+t.clientHeight;return o>=n&&i<=r})(e,t)||(e.scrollTop=t.offsetTop)}(this.results,e)}},{key:\"onKeydown\",value:function(e){switch(e.key){case\"Escape\":this.container.open&&(this.container.open=!1,e.stopPropagation(),e.preventDefault());break;case\"ArrowDown\":var t=this.sibling(!0);t&&this.select(t),e.preventDefault();break;case\"ArrowUp\":var n=this.sibling(!1);n&&this.select(n),e.preventDefault();break;case\"n\":if(xa&&e.ctrlKey){var r=this.sibling(!0);r&&this.select(r),e.preventDefault()}break;case\"p\":if(xa&&e.ctrlKey){var o=this.sibling(!1);o&&this.select(o),e.preventDefault()}break;case\"Tab\":var i=this.results.querySelector('[aria-selected=\"true\"]');i&&this.commit(i);break;case\"Enter\":var a=this.results.querySelector('[aria-selected=\"true\"]');a&&this.container.open&&(this.commit(a),e.preventDefault())}}},{key:\"onInputFocus\",value:function(){this.fetchResults()}},{key:\"onInputBlur\",value:function(){this.mouseDown||(this.container.open=!1)}},{key:\"commit\",value:function(e){if(\"true\"!==e.getAttribute(\"aria-disabled\")){if(e instanceof HTMLAnchorElement)return e.click(),void(this.container.open=!1);var t=e.getAttribute(\"data-autocomplete-value\")||e.textContent;this.container.value=t,this.container.open=!1}}},{key:\"onResultsClick\",value:function(e){if(e.target instanceof Element){var t=e.target.closest('[role=\"option\"]');t&&this.commit(t)}}},{key:\"onResultsMouseDown\",value:function(){var e=this;this.mouseDown=!0,this.results.addEventListener(\"mouseup\",function(){return e.mouseDown=!1},{once:!0})}},{key:\"onInputChange\",value:function(){this.container.removeAttribute(\"value\"),this.fetchResults()}},{key:\"identifyOptions\",value:function(){var e=0,t=!0,n=!1,r=void 0;try{for(var o,i=this.results.querySelectorAll('[role=\"option\"]:not([id])')[Symbol.iterator]();!(t=(o=i.next()).done);t=!0){o.value.id=this.results.id+\"-option-\"+e++}}catch(e){n=!0,r=e}finally{try{!t&&i.return&&i.return()}finally{if(n)throw r}}}},{key:\"fetchResults\",value:function(){var e=this,t=this.input.value.trim();if(t){var n=this.container.src;if(n){var r=new URL(n,window.location.href),o=new URLSearchParams(r.search.slice(1));o.append(\"q\",t),r.search=o.toString(),this.container.dispatchEvent(new CustomEvent(\"loadstart\")),ya(this.input,r.toString()).then(function(t){e.results.innerHTML=t,e.identifyOptions();var n=!!e.results.querySelector('[role=\"option\"]');e.container.open=n,e.container.dispatchEvent(new CustomEvent(\"load\")),e.container.dispatchEvent(new CustomEvent(\"loadend\"))}).catch(function(){e.container.dispatchEvent(new CustomEvent(\"error\")),e.container.dispatchEvent(new CustomEvent(\"loadend\"))})}}else this.container.open=!1}},{key:\"open\",value:function(){this.results.hidden&&(this.results.hidden=!1,this.container.setAttribute(\"aria-expanded\",\"true\"),this.container.dispatchEvent(new CustomEvent(\"toggle\",{detail:{input:this.input,results:this.results}})))}},{key:\"close\",value:function(){this.results.hidden||(this.results.hidden=!0,this.input.removeAttribute(\"aria-activedescendant\"),this.container.setAttribute(\"aria-expanded\",\"false\"),this.container.dispatchEvent(new CustomEvent(\"toggle\",{detail:{input:this.input,results:this.results}})))}}]),e}();function Ta(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(Ta.prototype,HTMLElement.prototype),Object.setPrototypeOf(Ta,HTMLElement);var ja=new WeakMap,La=function(e){function t(){return wa(this,t),_a(this,(t.__proto__||Object.getPrototypeOf(t)).call(this))}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,Ta),Ea(t,[{key:\"connectedCallback\",value:function(){var e=this.getAttribute(\"aria-owns\");if(e){var t=this.querySelector(\"input\"),n=document.getElementById(e);t instanceof HTMLInputElement&&n&&(ja.set(this,new ka(this,t,n)),this.setAttribute(\"role\",\"combobox\"),this.setAttribute(\"aria-haspopup\",\"listbox\"),this.setAttribute(\"aria-expanded\",\"false\"),t.setAttribute(\"aria-autocomplete\",\"list\"),t.setAttribute(\"aria-controls\",e),n.setAttribute(\"role\",\"listbox\"))}}},{key:\"disconnectedCallback\",value:function(){var e=ja.get(this);e&&(e.destroy(),ja.delete(this))}},{key:\"attributeChangedCallback\",value:function(e,t,n){if(t!==n){var r=ja.get(this);if(r)switch(e){case\"open\":null===n?r.close():r.open();break;case\"value\":null!==n&&(r.input.value=n),this.dispatchEvent(new CustomEvent(\"change\",{bubbles:!0}))}}}},{key:\"src\",get:function(){return this.getAttribute(\"src\")||\"\"},set:function(e){this.setAttribute(\"src\",e)}},{key:\"value\",get:function(){return this.getAttribute(\"value\")||\"\"},set:function(e){this.setAttribute(\"value\",e)}},{key:\"open\",get:function(){return this.hasAttribute(\"open\")},set:function(e){e?this.setAttribute(\"open\",\"\"):this.removeAttribute(\"open\")}}],[{key:\"observedAttributes\",get:function(){return[\"open\",\"value\"]}}]),t}();window.customElements.get(\"auto-complete\")||(window.AutocompleteElement=La,window.customElements.define(\"auto-complete\",La));var Oa=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function Sa(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(Sa.prototype,HTMLElement.prototype),Object.setPrototypeOf(Sa,HTMLElement);var Aa=function(e){function t(){return function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t),function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this))}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,Sa),Oa(t,[{key:\"connectedCallback\",value:function(){var e=this;this.setAttribute(\"role\",\"menu\");var t=this.parentElement;if(t){var n=t.querySelector(\"summary\");n&&n.setAttribute(\"aria-haspopup\",\"menu\"),t.addEventListener(\"click\",Ha),t.addEventListener(\"keydown\",Ra),t.addEventListener(\"toggle\",function(){if(e.src){var n=e.querySelector(\"include-fragment\");n&&(n.addEventListener(\"loadend\",Ca.bind(null,t)),n.src=e.src)}},{once:!0}),t.addEventListener(\"toggle\",Ma),t.addEventListener(\"toggle\",Ca.bind(null,t))}}},{key:\"src\",get:function(){return this.getAttribute(\"src\")||\"\"},set:function(e){this.setAttribute(\"src\",e)}}]),t}();function Ma(e){var t=e.currentTarget;if(t instanceof Element&&t.hasAttribute(\"open\")){var n=!0,r=!1,o=void 0;try{for(var i,a=document.querySelectorAll(\"details[open] > details-menu\")[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value.closest(\"details\");s&&s!==t&&!s.contains(t)&&s.removeAttribute(\"open\")}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}}function Ca(e){if(e.open){var t=e.querySelector(\"[autofocus]\");t&&t.focus()}}function Da(e,t){var n=Array.from(e.querySelectorAll('[role^=\"menuitem\"]:not([hidden]):not([disabled]):not([aria-disabled=\"true\"])')),r=document.activeElement,o=n.indexOf(r),i=t?n[o+1]:n[o-1],a=t?n[0]:n[n.length-1];return i||a}var Pa=navigator.userAgent.match(/Macintosh/);function Ha(e){var t=e.target;if(t instanceof Element){var n=e.currentTarget;if(n instanceof Element&&t.closest(\"details\")===n){var r=t.closest('[role^=\"menuitem\"]');r&&function(e,t){if(\"true\"===e.getAttribute(\"aria-disabled\"))return;if(!e.dispatchEvent(new CustomEvent(\"details-menu-select\",{bubbles:!0,cancelable:!0})))return;(function(e,t){var n=t.querySelector(\"[data-menu-button]\");if(n){var r=function(e){if(!e)return null;var t=e.hasAttribute(\"data-menu-button-text\")?e:e.querySelector(\"[data-menu-button-text]\");return t?t.getAttribute(\"data-menu-button-text\")||t.textContent:null}(e);if(r)n.textContent=r;else{var o=function(e){if(!e)return null;var t=e.hasAttribute(\"data-menu-button-contents\")?e:e.querySelector(\"[data-menu-button-contents]\");return t?t.innerHTML:null}(e);o&&(n.innerHTML=o)}}})(e,t),function(e,t){if(function(e){var t=e.getAttribute(\"role\");return\"menuitemradio\"===t||\"menuitemcheckbox\"===t}(e)){if(\"menuitemradio\"===e.getAttribute(\"role\")){var n=!0,r=!1,o=void 0;try{for(var i,a=t.querySelectorAll('[role=\"menuitemradio\"]')[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;s.setAttribute(\"aria-checked\",\"false\")}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}e.setAttribute(\"aria-checked\",\"true\")}}(e,t),\"menuitemcheckbox\"!==e.getAttribute(\"role\")&&Na(t);e.dispatchEvent(new CustomEvent(\"details-menu-selected\",{bubbles:!0}))}(r,n)}}}function Ra(e){var t,n=e.currentTarget;if(!n.querySelector(\"details[open]\"))switch(e.key){case\"Escape\":Na(n),e.preventDefault();break;case\"ArrowDown\":Da(n,!0).focus(),e.preventDefault();break;case\"ArrowUp\":Da(n,!1).focus(),e.preventDefault();break;case\"n\":Pa&&e.ctrlKey&&(Da(n,!0).focus(),e.preventDefault());break;case\"p\":Pa&&e.ctrlKey&&(Da(n,!1).focus(),e.preventDefault());break;case\" \":case\"Enter\":var r=document.activeElement;r&&(\"menuitem\"===(t=r.getAttribute(\"role\"))||\"menuitemcheckbox\"===t||\"menuitemradio\"===t)&&r.closest(\"details\")===n&&(e.preventDefault(),e.stopPropagation(),r.click())}}function Na(e){e.open=!1;var t=e.querySelector(\"summary\");t&&t.focus()}window.customElements.get(\"details-menu\")||(window.DetailsMenuElement=Aa,window.customElements.define(\"details-menu\",Aa));var Ia=/\\bWindows NT 6.1\\b/.test(navigator.userAgent),qa=/\\bWindows NT 6.2\\b/.test(navigator.userAgent),Fa=/\\bWindows NT 6.3\\b/.test(navigator.userAgent),Ba=/\\bLinux\\b/.test(navigator.userAgent),za=/\\bFreeBSD\\b/.test(navigator.userAgent);var Xa=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},Va=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),Wa=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t};function Ua(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(Ua.prototype,HTMLElement.prototype),Object.setPrototypeOf(Ua,HTMLElement);var Ya=function(e){function t(){return Xa(this,t),Wa(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,Ua),Va(t,[{key:\"connectedCallback\",value:function(){if(null===this.image&&(Ia||qa||Fa||Ba||za)){this.textContent=\"\";var e=function(e){var t=document.createElement(\"img\");return t.className=\"emoji\",t.alt=e.getAttribute(\"alias\")||\"\",t.height=20,t.width=20,t}(this);e.src=this.getAttribute(\"fallback-src\")||\"\",this.appendChild(e)}}},{key:\"image\",get:function(){return this.firstElementChild instanceof HTMLImageElement?this.firstElementChild:null}}]),t}();window.customElements.get(\"g-emoji\")||(window.GEmojiElement=Ya,window.customElements.define(\"g-emoji\",Ya));var Ga=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function Ka(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(Ka.prototype,HTMLElement.prototype),Object.setPrototypeOf(Ka,HTMLElement);var $a=document.createElement(\"template\");function Ja(e){var t=e.currentTarget;if(t.dragStartX&&t.dragStartY){var n=Math.min(Math.max(0,t.box.offsetLeft+e.pageX-t.dragStartX),t.image.width-t.box.offsetWidth),r=Math.min(Math.max(0,t.box.offsetTop+e.pageY-t.dragStartY),t.image.height-t.box.offsetHeight);t.box.style.left=n+\"px\",t.box.style.top=r+\"px\",rs(t,{x:n,y:r,width:t.box.offsetWidth,height:t.box.offsetHeight})}t.dragStartX=e.pageX,t.dragStartY=e.pageY}function Za(e){var t=e.target.closest(\"image-crop\"),n=t.getBoundingClientRect();es(t,e.pageX-t.startX-n.left-window.pageXOffset,e.pageY-t.startY-n.top-window.pageYOffset)}function Qa(e){var t=e.currentTarget.closest(\"image-crop\");if(e.target.hasAttribute(\"data-direction\")){var n=e.target.getAttribute(\"data-direction\");t.addEventListener(\"mousemove\",Za),[\"nw\",\"se\"].indexOf(n)>=0&&t.classList.add(\"nwse\"),[\"ne\",\"sw\"].indexOf(n)>=0&&t.classList.add(\"nesw\"),t.startX=t.box.offsetLeft+([\"se\",\"ne\"].indexOf(n)>=0?0:t.box.offsetWidth),t.startY=t.box.offsetTop+([\"se\",\"sw\"].indexOf(n)>=0?0:t.box.offsetHeight),Za(e)}else t.addEventListener(\"mousemove\",Ja)}function es(e,t,n){var r=Math.max(Math.abs(t),Math.abs(n),e.minWidth);r=Math.min(r,n>0?e.image.height-e.startY:e.startY,t>0?e.image.width-e.startX:e.startX);var o=Math.round(Math.max(0,t>0?e.startX:e.startX-r)),i=Math.round(Math.max(0,n>0?e.startY:e.startY-r));e.box.style.left=o+\"px\",e.box.style.top=i+\"px\",e.box.style.width=r+\"px\",e.box.style.height=r+\"px\",rs(e,{x:o,y:i,width:r,height:r})}function ts(e){var t=e.currentTarget.closest(\"image-crop\");t.loaded=!0;var n=e.target,r=Math.round(n.clientWidth>n.clientHeight?n.clientHeight:n.clientWidth);t.startX=(n.clientWidth-r)/2,t.startY=(n.clientHeight-r)/2,es(t,r,r)}function ns(e){var t=e.currentTarget;t.dragStartX=t.dragStartY=null,t.classList.remove(\"nwse\",\"nesw\"),t.removeEventListener(\"mousemove\",Za),t.removeEventListener(\"mousemove\",Ja)}function rs(e,t){var n=e.image.naturalWidth/e.image.width;for(var r in t){var o=Math.round(t[r]*n);t[r]=o;var i=e.querySelector(\"[data-image-crop-input='\"+r+\"']\");i&&(i.value=o)}e.dispatchEvent(new CustomEvent(\"image-crop-change\",{bubbles:!0,detail:t}))}$a.innerHTML='\\n  <div class=\"crop-wrapper\">\\n    <img width=\"100%\" class=\"crop-image\" alt=\"\">\\n    <div class=\"crop-container\">\\n      <div data-crop-box class=\"crop-box\">\\n        <div class=\"crop-outline\"></div>\\n        <div data-direction=\"nw\" class=\"handle nw\"></div>\\n        <div data-direction=\"ne\" class=\"handle ne\"></div>\\n        <div data-direction=\"sw\" class=\"handle sw\"></div>\\n        <div data-direction=\"se\" class=\"handle se\"></div>\\n      </div>\\n    </div>\\n  </div>\\n';var os=function(e){function t(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);var e=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.startX=null,e.startY=null,e.minWidth=10,e}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,Ka),Ga(t,[{key:\"connectedCallback\",value:function(){this.constructed||(this.constructed=!0,this.appendChild(document.importNode($a.content,!0)),this.image=this.querySelector(\"img\"),this.box=this.querySelector(\"[data-crop-box]\"),this.image.addEventListener(\"load\",ts),this.addEventListener(\"mouseleave\",ns),this.addEventListener(\"mouseup\",ns),this.box.addEventListener(\"mousedown\",Qa),this.src&&(this.image.src=this.src))}},{key:\"attributeChangedCallback\",value:function(e,t,n){\"src\"===e&&(this.loaded=!1,this.image&&(this.image.src=n))}},{key:\"src\",get:function(){return this.getAttribute(\"src\")},set:function(e){e?this.setAttribute(\"src\",e):this.removeAttribute(\"src\")}},{key:\"loaded\",get:function(){return this.hasAttribute(\"loaded\")},set:function(e){e?this.setAttribute(\"loaded\",\"\"):this.removeAttribute(\"loaded\")}}],[{key:\"observedAttributes\",get:function(){return[\"src\"]}}]),t}();window.customElements.get(\"image-crop\")||window.customElements.define(\"image-crop\",os);var is=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},as=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function ss(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function us(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}function cs(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function ls(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(ls.prototype,HTMLElement.prototype),Object.setPrototypeOf(ls,HTMLElement);var fs=new WeakMap,ds=function(e){function t(){ss(this,t);var e,n=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this)),r=function(){var e=fs.get(n);e&&Cs(n,e)};return n.addEventListener(\"keydown\",(e=r,function(t){\" \"!==t.key&&\"Enter\"!==t.key||(t.preventDefault(),e(t))})),n.addEventListener(\"click\",r),n}return cs(t,ls),as(t,[{key:\"connectedCallback\",value:function(){this.hasAttribute(\"tabindex\")||this.setAttribute(\"tabindex\",\"0\"),this.hasAttribute(\"role\")||this.setAttribute(\"role\",\"button\")}},{key:\"click\",value:function(){var e=fs.get(this);e&&Cs(this,e)}}]),t}(),hs=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return fs.set(e,{prefix:\"### \"}),e}return cs(t,ds),t}();window.customElements.get(\"md-header\")||(window.MarkdownHeaderButtonElement=hs,window.customElements.define(\"md-header\",hs));var ps=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.setAttribute(\"hotkey\",\"b\"),fs.set(e,{prefix:\"**\",suffix:\"**\",trimFirst:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-bold\")||(window.MarkdownBoldButtonElement=ps,window.customElements.define(\"md-bold\",ps));var vs=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.setAttribute(\"hotkey\",\"i\"),fs.set(e,{prefix:\"_\",suffix:\"_\",trimFirst:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-italic\")||(window.MarkdownItalicButtonElement=vs,window.customElements.define(\"md-italic\",vs));var ms=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return fs.set(e,{prefix:\"> \",multiline:!0,surroundWithNewlines:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-quote\")||(window.MarkdownQuoteButtonElement=ms,window.customElements.define(\"md-quote\",ms));var gs=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return fs.set(e,{prefix:\"`\",suffix:\"`\",blockPrefix:\"```\",blockSuffix:\"```\"}),e}return cs(t,ds),t}();window.customElements.get(\"md-code\")||(window.MarkdownCodeButtonElement=gs,window.customElements.define(\"md-code\",gs));var bs=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.setAttribute(\"hotkey\",\"k\"),fs.set(e,{prefix:\"[\",suffix:\"](url)\",replaceNext:\"url\",scanFor:\"https?://\"}),e}return cs(t,ds),t}();window.customElements.get(\"md-link\")||(window.MarkdownLinkButtonElement=bs,window.customElements.define(\"md-link\",bs));var ys=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return fs.set(e,{prefix:\"- \",multiline:!0,surroundWithNewlines:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-unordered-list\")||(window.MarkdownUnorderedListButtonElement=ys,window.customElements.define(\"md-unordered-list\",ys));var ws=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return fs.set(e,{prefix:\"1. \",multiline:!0,orderedList:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-ordered-list\")||(window.MarkdownOrderedListButtonElement=ws,window.customElements.define(\"md-ordered-list\",ws));var Es=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.setAttribute(\"hotkey\",\"L\"),fs.set(e,{prefix:\"- [ ] \",multiline:!0,surroundWithNewlines:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-task-list\")||(window.MarkdownTaskListButtonElement=Es,window.customElements.define(\"md-task-list\",Es));var _s=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return fs.set(e,{prefix:\"@\",prefixSpace:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-mention\")||(window.MarkdownMentionButtonElement=_s,window.customElements.define(\"md-mention\",_s));var xs=function(e){function t(){ss(this,t);var e=us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return fs.set(e,{prefix:\"#\",prefixSpace:!0}),e}return cs(t,ds),t}();window.customElements.get(\"md-ref\")||(window.MarkdownRefButtonElement=xs,window.customElements.define(\"md-ref\",xs));var ks=navigator.userAgent.match(/Macintosh/)?\"Meta\":\"Control\",Ts=function(e){function t(){return ss(this,t),us(this,(t.__proto__||Object.getPrototypeOf(t)).call(this))}return cs(t,ls),as(t,[{key:\"connectedCallback\",value:function(){var e=function(e,t){if(t.metaKey&&\"Meta\"===ks||t.ctrlKey&&\"Control\"===ks){var n=e.querySelector('[hotkey=\"'+t.key+'\"]');n&&(n.click(),t.preventDefault())}}.bind(null,this);this.field&&(this.field.addEventListener(\"keydown\",e),js.set(this,e))}},{key:\"disconnectedCallback\",value:function(){var e=js.get(this);e&&this.field&&(this.field.removeEventListener(\"keydown\",e),js.delete(this))}},{key:\"field\",get:function(){var e=this.getAttribute(\"for\");if(e){var t=document.getElementById(e);return t instanceof HTMLTextAreaElement?t:null}}}]),t}(),js=new WeakMap;function Ls(e){return e.trim().split(\"\\n\").length>1}function Os(e,t){return Array(t+1).join(e)}window.customElements.get(\"markdown-toolbar\")||(window.MarkdownToolbarElement=Ts,window.customElements.define(\"markdown-toolbar\",Ts));var Ss=null;function As(e,t){var n=e.value.slice(e.selectionStart,e.selectionEnd),r=void 0;r=t.orderedList?function(e){var t=/^\\d+\\.\\s+/,n=void 0,r=void 0,o=e.value.slice(e.selectionStart,e.selectionEnd),i=o.split(\"\\n\");if(i.every(function(e){return t.test(e)}))i=i.map(function(e){return e.replace(t,\"\")}),o=i.join(\"\\n\");else{i=function(){var e=void 0,t=void 0,n=void 0,r=[];for(n=e=0,t=i.length;e<t;n=++e){var o=i[n];r.push(n+1+\". \"+o)}return r}(),o=i.join(\"\\n\");var a=Ms(e),s=a.newlinesToAppend,u=a.newlinesToPrepend;r=e.selectionStart+s.length,n=r+o.length,o=s+o+u}return{text:o,selectionStart:r,selectionEnd:n}}(e):t.multiline&&Ls(n)?function(e,t){var n=t.prefix,r=t.suffix,o=t.surroundWithNewlines,i=e.value.slice(e.selectionStart,e.selectionEnd),a=e.selectionStart,s=e.selectionEnd,u=i.split(\"\\n\");if(u.every(function(e){return e.startsWith(n)&&e.endsWith(r)}))i=u.map(function(e){return e.slice(n.length,e.length-r.length)}).join(\"\\n\"),s=a+i.length;else if(i=u.map(function(e){return n+e+r}).join(\"\\n\"),o){var c=Ms(e),l=c.newlinesToAppend,f=c.newlinesToPrepend;a+=l.length,s=a+i.length,i=l+i+f}return{text:i,selectionStart:a,selectionEnd:s}}(e,t):function(e,t){var n=void 0,r=void 0,o=t.prefix,i=t.suffix,a=t.blockPrefix,s=t.blockSuffix,u=t.replaceNext,c=t.prefixSpace,l=t.scanFor,f=t.surroundWithNewlines,d=e.selectionStart,h=e.selectionEnd,p=e.value.slice(e.selectionStart,e.selectionEnd),v=Ls(p)&&a.length>0?a+\"\\n\":o,m=Ls(p)&&s.length>0?\"\\n\"+s:i;if(c){var g=e.value[e.selectionStart-1];0===e.selectionStart||null==g||g.match(/\\s/)||(v=\" \"+v)}p=function(e,t,n){if(e.selectionStart===e.selectionEnd)e.selectionStart=function(e,t){for(;e[t]&&null!=e[t-1]&&!e[t-1].match(/\\s/);)t--;return t}(e.value,e.selectionStart),e.selectionEnd=function(e,t){for(;e[t]&&!e[t].match(/\\s/);)t++;return t}(e.value,e.selectionEnd);else{var r=e.selectionStart-t.length,o=e.selectionEnd+n.length,i=e.value.slice(r,e.selectionStart)===t,a=e.value.slice(e.selectionEnd,o)===n;i&&a&&(e.selectionStart=r,e.selectionEnd=o)}return e.value.slice(e.selectionStart,e.selectionEnd)}(e,v,m);var b=e.selectionStart,y=e.selectionEnd,w=u.length>0&&m.indexOf(u)>-1&&p.length>0;if(f){var E=Ms(e);n=E.newlinesToAppend,r=E.newlinesToPrepend,v=n+o,m+=r}if(p.startsWith(v)&&p.endsWith(m)){var _=p.slice(v.length,p.length-m.length);if(d===h){var x=d-v.length;x=Math.max(x,b),x=Math.min(x,b+_.length),b=y=x}else y=b+_.length;return{text:_,selectionStart:b,selectionEnd:y}}if(w){if(l.length>0&&p.match(l)){m=m.replace(u,p);var k=v+m;return b=y=b+v.length,{text:k,selectionStart:b,selectionEnd:y}}var T=v+p+m;return b=b+v.length+p.length+m.indexOf(u),y=b+u.length,{text:T,selectionStart:b,selectionEnd:y}}var j=v+p+m;b=d+v.length,y=h+v.length;var L=p.match(/^\\s*|\\s*$/g);if(t.trimFirst&&L){var O=L[0]||\"\",S=L[1]||\"\";j=O+v+p.trim()+m+S,b+=O.length,y-=S.length}return{text:j,selectionStart:b,selectionEnd:y}}(e,t),function(e,t){var n=t.text,r=t.selectionStart,o=t.selectionEnd,i=e.selectionStart,a=e.value.slice(0,i),s=e.value.slice(e.selectionEnd);if(null===Ss||!0===Ss){e.contentEditable=\"true\";try{Ss=document.execCommand(\"insertText\",!1,n)}catch(e){Ss=!1}e.contentEditable=\"false\"}if(Ss&&!e.value.slice(0,e.selectionStart).endsWith(n)&&(Ss=!1),!Ss){try{document.execCommand(\"ms-beginUndoUnit\")}catch(e){}e.value=a+n+s;try{document.execCommand(\"ms-endUndoUnit\")}catch(e){}e.dispatchEvent(new CustomEvent(\"input\",{bubbles:!0,cancelable:!0}))}null!=r&&null!=o?e.setSelectionRange(r,o):e.setSelectionRange(i,e.selectionEnd)}(e,r)}function Ms(e){var t=e.value.slice(0,e.selectionStart),n=e.value.slice(e.selectionEnd),r=t.match(/\\n*$/),o=n.match(/^\\n*/),i=r?r[0].length:0,a=o?o[0].length:0,s=void 0,u=void 0;return t.match(/\\S/)&&i<2&&(s=Os(\"\\n\",2-i)),n.match(/\\S/)&&a<2&&(u=Os(\"\\n\",2-a)),null==s&&(s=\"\"),null==u&&(u=\"\"),{newlinesToAppend:s,newlinesToPrepend:u}}function Cs(e,t){var n=e.closest(\"markdown-toolbar\");if(n instanceof Ts){var r=is({},{prefix:\"\",suffix:\"\",blockPrefix:\"\",blockSuffix:\"\",multiline:!1,replaceNext:\"\",prefixSpace:!1,scanFor:\"\",surroundWithNewlines:!1,orderedList:!1,trimFirst:!1},t),o=n.field;o&&(o.focus(),As(o,r))}}var Ds=[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],Ps=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];function Hs(e){return(\"0\"+e).slice(-2)}function Rs(e,t){var n=e.getDay(),r=e.getDate(),o=e.getMonth(),i=e.getFullYear(),a=e.getHours(),s=e.getMinutes(),u=e.getSeconds();return t.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g,function(t){var c=void 0;switch(t[1]){case\"%\":return\"%\";case\"a\":return Ds[n].slice(0,3);case\"A\":return Ds[n];case\"b\":return Ps[o].slice(0,3);case\"B\":return Ps[o];case\"c\":return e.toString();case\"d\":return Hs(r);case\"e\":return r;case\"H\":return Hs(a);case\"I\":return Hs(Rs(e,\"%l\"));case\"l\":return 0===a||12===a?12:(a+12)%12;case\"m\":return Hs(o+1);case\"M\":return Hs(s);case\"p\":return a>11?\"PM\":\"AM\";case\"P\":return a>11?\"pm\":\"am\";case\"S\":return Hs(u);case\"w\":return n;case\"y\":return Hs(i%100);case\"Y\":return i;case\"Z\":return(c=e.toString().match(/\\((\\w+)\\)$/))?c[1]:\"\";case\"z\":return(c=e.toString().match(/\\w([+-]\\d\\d\\d\\d) /))?c[1]:\"\"}})}function Ns(e){var t=void 0;return function(){if(t)return t;if(\"Intl\"in window)try{return t=new Intl.DateTimeFormat(void 0,e)}catch(e){if(!(e instanceof RangeError))throw e}}}var Is=null,qs=Ns({day:\"numeric\",month:\"short\"});function Fs(){if(null!==Is)return Is;var e=qs();if(e){var t=e.format(new Date(0));return Is=!!t.match(/^\\d/)}return!1}var Bs=null,zs=Ns({day:\"numeric\",month:\"short\",year:\"numeric\"});var Xs=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},Vs=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),Ws=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},Us=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t};function Ys(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(Ys.prototype,HTMLElement.prototype),Object.setPrototypeOf(Ys,HTMLElement);var Gs=function(e){function t(){return Xs(this,t),Us(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return Ws(t,Ys),Vs(t,[{key:\"attributeChangedCallback\",value:function(e,t,n){if(\"datetime\"===e){var r=Date.parse(n);this._date=isNaN(r)?null:new Date(r)}var o=this.getFormattedTitle();o&&!this.hasAttribute(\"title\")&&this.setAttribute(\"title\",o);var i=this.getFormattedDate();i&&(this.textContent=i)}},{key:\"getFormattedTitle\",value:function(){if(this._date){var e=Ks();if(e)return e.format(this._date);try{return this._date.toLocaleString()}catch(e){if(e instanceof RangeError)return this._date.toString();throw e}}}}],[{key:\"observedAttributes\",get:function(){return[\"datetime\",\"day\",\"format\",\"hour\",\"minute\",\"month\",\"second\",\"title\",\"weekday\",\"year\"]}}]),t}(),Ks=Ns({day:\"numeric\",month:\"short\",year:\"numeric\",hour:\"numeric\",minute:\"2-digit\",timeZoneName:\"short\"}),$s=new WeakMap,Js=function(e){function t(){return Xs(this,t),Us(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return Ws(t,Gs),Vs(t,[{key:\"attributeChangedCallback\",value:function(e,n,r){\"hour\"!==e&&\"minute\"!==e&&\"second\"!==e&&\"time-zone-name\"!==e||$s.delete(this),function e(t,n,r){null===t&&(t=Function.prototype);var o=Object.getOwnPropertyDescriptor(t,n);if(void 0===o){var i=Object.getPrototypeOf(t);return null===i?void 0:e(i,n,r)}if(\"value\"in o)return o.value;var a=o.get;return void 0!==a?a.call(r):void 0}(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),\"attributeChangedCallback\",this).call(this,e,n,r)}},{key:\"getFormattedDate\",value:function(){if(this._date)return((function(e){var t={weekday:{short:\"%a\",long:\"%A\"},day:{numeric:\"%e\",\"2-digit\":\"%d\"},month:{short:\"%b\",long:\"%B\"},year:{numeric:\"%Y\",\"2-digit\":\"%y\"}},n=Fs()?\"weekday day month year\":\"weekday month day, year\";for(var r in t){var o=t[r][e.getAttribute(r)];n=n.replace(r,o||\"\")}return n=n.replace(/(\\s,)|(,\\s$)/,\"\"),Rs(e._date,n).replace(/\\s+/,\" \").trim()}(this)||\"\")+\" \"+(function(e){var t={hour:e.getAttribute(\"hour\"),minute:e.getAttribute(\"minute\"),second:e.getAttribute(\"second\"),timeZoneName:e.getAttribute(\"time-zone-name\")};for(var n in t)t[n]||delete t[n];if(0===Object.keys(t).length)return;var r=$s.get(e);r||(r=Ns(t),$s.set(e,r));var o=r();if(o)return o.format(e._date);var i=t.second?\"%H:%M:%S\":\"%H:%M\";return Rs(e._date,i)}(this)||\"\")).trim()}}]),t}();window.customElements.get(\"local-time\")||(window.LocalTimeElement=Js,window.customElements.define(\"local-time\",Js));var Zs=function(){function e(t){Xs(this,e),this.date=t}return Vs(e,[{key:\"toString\",value:function(){var e=this.timeElapsed();if(e)return e;var t=this.timeAhead();return t||\"on \"+this.formatDate()}},{key:\"timeElapsed\",value:function(){var e=(new Date).getTime()-this.date.getTime(),t=Math.round(e/1e3),n=Math.round(t/60),r=Math.round(n/60),o=Math.round(r/24);return e>=0&&o<30?this.timeAgoFromMs(e):null}},{key:\"timeAhead\",value:function(){var e=this.date.getTime()-(new Date).getTime(),t=Math.round(e/1e3),n=Math.round(t/60),r=Math.round(n/60),o=Math.round(r/24);return e>=0&&o<30?this.timeUntil():null}},{key:\"timeAgo\",value:function(){var e=(new Date).getTime()-this.date.getTime();return this.timeAgoFromMs(e)}},{key:\"timeAgoFromMs\",value:function(e){var t=Math.round(e/1e3),n=Math.round(t/60),r=Math.round(n/60),o=Math.round(r/24),i=Math.round(o/30),a=Math.round(i/12);return e<0?\"just now\":t<10?\"just now\":t<45?t+\" seconds ago\":t<90?\"a minute ago\":n<45?n+\" minutes ago\":n<90?\"an hour ago\":r<24?r+\" hours ago\":r<36?\"a day ago\":o<30?o+\" days ago\":o<45?\"a month ago\":i<12?i+\" months ago\":i<18?\"a year ago\":a+\" years ago\"}},{key:\"microTimeAgo\",value:function(){var e=(new Date).getTime()-this.date.getTime(),t=Math.round(e/1e3),n=Math.round(t/60),r=Math.round(n/60),o=Math.round(r/24),i=Math.round(o/30),a=Math.round(i/12);return n<1?\"1m\":n<60?n+\"m\":r<24?r+\"h\":o<365?o+\"d\":a+\"y\"}},{key:\"timeUntil\",value:function(){var e=this.date.getTime()-(new Date).getTime();return this.timeUntilFromMs(e)}},{key:\"timeUntilFromMs\",value:function(e){var t=Math.round(e/1e3),n=Math.round(t/60),r=Math.round(n/60),o=Math.round(r/24),i=Math.round(o/30),a=Math.round(i/12);return i>=18?a+\" years from now\":i>=12?\"a year from now\":o>=45?i+\" months from now\":o>=30?\"a month from now\":r>=36?o+\" days from now\":r>=24?\"a day from now\":n>=90?r+\" hours from now\":n>=45?\"an hour from now\":t>=90?n+\" minutes from now\":t>=45?\"a minute from now\":t>=10?t+\" seconds from now\":\"just now\"}},{key:\"microTimeUntil\",value:function(){var e=this.date.getTime()-(new Date).getTime(),t=Math.round(e/1e3),n=Math.round(t/60),r=Math.round(n/60),o=Math.round(r/24),i=Math.round(o/30),a=Math.round(i/12);return o>=365?a+\"y\":r>=24?o+\"d\":n>=60?r+\"h\":n>1?n+\"m\":\"1m\"}},{key:\"formatDate\",value:function(){var e,t=Fs()?\"%e %b\":\"%b %e\";return e=this.date,(new Date).getUTCFullYear()!==e.getUTCFullYear()&&(t+=function(){if(null!==Bs)return Bs;var e=zs();if(e){var t=e.format(new Date(0));return Bs=!!t.match(/\\d,/)}return!0}()?\", %Y\":\" %Y\"),Rs(this.date,t)}},{key:\"formatTime\",value:function(){var e=Qs();return e?e.format(this.date):Rs(this.date,\"%l:%M%P\")}}]),e}(),Qs=Ns({hour:\"numeric\",minute:\"2-digit\"}),eu=function(e){function t(){return Xs(this,t),Us(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return Ws(t,Gs),Vs(t,[{key:\"getFormattedDate\",value:function(){if(this._date)return new Zs(this._date).toString()}},{key:\"connectedCallback\",value:function(){tu.push(this),nu||(ru(),nu=setInterval(ru,6e4))}},{key:\"disconnectedCallback\",value:function(){var e=tu.indexOf(this);-1!==e&&tu.splice(e,1),tu.length||nu&&(clearInterval(nu),nu=null)}}]),t}(),tu=[],nu=void 0;function ru(){var e,t=void 0,n=void 0;for(n=0,e=tu.length;n<e;n++)(t=tu[n]).textContent=t.getFormattedDate()}window.customElements.get(\"relative-time\")||(window.RelativeTimeElement=eu,window.customElements.define(\"relative-time\",eu));var ou=function(e){function t(){return Xs(this,t),Us(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return Ws(t,eu),Vs(t,[{key:\"getFormattedDate\",value:function(){if(this._date)return\"micro\"===this.getAttribute(\"format\")?new Zs(this._date).microTimeAgo():new Zs(this._date).timeAgo()}}]),t}();window.customElements.get(\"time-ago\")||(window.TimeAgoElement=ou,window.customElements.define(\"time-ago\",ou));var iu=function(e){function t(){return Xs(this,t),Us(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return Ws(t,eu),Vs(t,[{key:\"getFormattedDate\",value:function(){if(this._date)return\"micro\"===this.getAttribute(\"format\")?new Zs(this._date).microTimeUntil():new Zs(this._date).timeUntil()}}]),t}();function au(e,t){if(!uu(e,t.textContent)){var n=getSelection();if(null!=n){n.removeAllRanges();var r=document.createRange();r.selectNodeContents(t),n.addRange(r),document.execCommand(\"copy\"),n.removeAllRanges()}}}function su(e,t){if(!uu(e,t)){var n=document.body;if(n){var r=function(e){var t=document.createElement(\"pre\");return t.style.width=\"1px\",t.style.height=\"1px\",t.style.position=\"fixed\",t.style.top=\"5px\",t.textContent=e,t}(t);n.appendChild(r),au(e,r),n.removeChild(r)}}}function uu(e,t){var n=navigator.clipboard;return!!n&&(n.writeText(t).then(function(){e.dispatchEvent(new CustomEvent(\"copy\",{bubbles:!0}))}),!0)}window.customElements.get(\"time-until\")||(window.TimeUntilElement=iu,window.customElements.define(\"time-until\",iu));var cu=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},lu=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),fu=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t};function du(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}function hu(e){var t=e.getAttribute(\"for\"),n=e.getAttribute(\"value\");n?su(e,n):t&&function(e,t){var n=e.ownerDocument.getElementById(t);if(!n)return;n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement?\"hidden\"===n.type?su(e,n.value):function(e,t){if(!uu(e,t.value)){t.select(),document.execCommand(\"copy\");var n=getSelection();null!=n&&n.removeAllRanges()}}(e,n):n instanceof HTMLAnchorElement&&n.hasAttribute(\"href\")?su(e,n.href):au(e,n)}(e,t)}function pu(e){var t=e.currentTarget;t instanceof HTMLElement&&hu(t)}function vu(e){if(\" \"===e.key||\"Enter\"===e.key){var t=e.currentTarget;t instanceof HTMLElement&&(e.preventDefault(),hu(t))}}function mu(e){e.currentTarget.addEventListener(\"keydown\",vu)}function gu(e){e.currentTarget.removeEventListener(\"keydown\",vu)}Object.setPrototypeOf(du.prototype,HTMLElement.prototype),Object.setPrototypeOf(du,HTMLElement);var bu=function(e){function t(){cu(this,t);var e=fu(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.addEventListener(\"click\",pu),e.addEventListener(\"focus\",mu),e.addEventListener(\"blur\",gu),e}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,du),lu(t,[{key:\"connectedCallback\",value:function(){this.hasAttribute(\"tabindex\")||this.setAttribute(\"tabindex\",\"0\"),this.hasAttribute(\"role\")||this.setAttribute(\"role\",\"button\")}},{key:\"value\",get:function(){return this.getAttribute(\"value\")||\"\"},set:function(e){this.setAttribute(\"value\",e)}}]),t}();window.customElements.get(\"clipboard-copy\")||(window.ClipboardCopyElement=bu,window.customElements.define(\"clipboard-copy\",bu));var yu=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function wu(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(wu.prototype,HTMLElement.prototype),Object.setPrototypeOf(wu,HTMLElement);var Eu=\"[data-close-dialog]\",_u=\"a, input, button, textarea, select, summary\";function xu(e){var t=e.currentTarget;t instanceof Element&&(\"Escape\"===e.key?(t.removeAttribute(\"open\"),e.stopPropagation()):\"Tab\"===e.key&&function(e){if(!(e.currentTarget instanceof Element))return;var t=e.currentTarget.querySelector(\"details-dialog\");if(!t)return;e.preventDefault();var n=Array.from(t.querySelectorAll(_u)).filter(ku),r=e.shiftKey?-1:1,o=n.filter(function(e){return e.matches(\":focus\")})[0],i=n.length-1;if(o){var a=n.indexOf(o);if(-1!==a){var s=a+r;s>=0&&(i=s%n.length)}}n[i].focus()}(e))}function ku(e){return!(e.disabled||e.hidden||e.type&&\"hidden\"===e.type)}function Tu(e){var t=e.currentTarget;if(t instanceof Element){var n=t.querySelector(\"details-dialog\");if(n instanceof Lu)if(t.hasAttribute(\"open\"))document.activeElement&&ju.set(n,{details:t,activeElement:document.activeElement}),function(e){var t=e.querySelector(\"[autofocus]\");t||(t=e,e.setAttribute(\"tabindex\",\"-1\")),t.focus()}(n),t.addEventListener(\"keydown\",xu);else{var r=!0,o=!1,i=void 0;try{for(var a,s=n.querySelectorAll(\"form\")[Symbol.iterator]();!(r=(a=s.next()).done);r=!0){var u=a.value;u instanceof HTMLFormElement&&u.reset()}}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}var c=function(e,t){var n=ju.get(t);return n&&n.activeElement instanceof HTMLElement?n.activeElement:e.querySelector(\"summary\")}(t,n);c&&c.focus(),t.removeEventListener(\"keydown\",xu)}}}var ju=new WeakMap,Lu=function(e){function t(){!function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}(this,t);var e=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return ju.set(e,{details:null,activeElement:null}),e.addEventListener(\"click\",function(e){var t=e.target;if(t instanceof Element){var n=t.closest(\"details\");n&&t.closest(Eu)&&n.removeAttribute(\"open\")}}),e}return function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,wu),yu(t,null,[{key:\"CLOSE_ATTR\",get:function(){return\"data-close-dialog\"}},{key:\"CLOSE_SELECTOR\",get:function(){return Eu}},{key:\"INPUT_SELECTOR\",get:function(){return _u}}]),yu(t,[{key:\"connectedCallback\",value:function(){this.setAttribute(\"role\",\"dialog\");var e=ju.get(this);if(e){var t=this.parentElement;if(t){var n=t.querySelector(\"summary\");n&&n.setAttribute(\"aria-haspopup\",\"dialog\"),t.addEventListener(\"toggle\",Tu),e.details=t}}}},{key:\"disconnectedCallback\",value:function(){var e=ju.get(this);e&&e.details&&(e.details.removeEventListener(\"toggle\",Tu),e.details=null)}},{key:\"toggle\",value:function(e){var t=ju.get(this);if(t){var n=t.details;n&&(e?n.setAttribute(\"open\",\"open\"):n.removeAttribute(\"open\"))}}}]),t}();window.customElements.get(\"details-dialog\")||(window.DetailsDialogElement=Lu,window.customElements.define(\"details-dialog\",Lu));var Ou=function(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")},Su=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),Au=function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},Mu=function(e,t){if(!e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!t||\"object\"!=typeof t&&\"function\"!=typeof t?e:t},Cu=function(e){function t(e,n,r){Ou(this,t);var o=Mu(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return o.statusCode=e,o.responseText=n,o.contentType=r,o}return Au(t,e),t}(Error);function Du(){return Reflect.construct(HTMLElement,[],this.__proto__.constructor)}Object.setPrototypeOf(Du.prototype,HTMLElement.prototype),Object.setPrototypeOf(Du,HTMLElement);var Pu=new WeakMap,Hu=new WeakMap,Ru=function(e){function t(){Ou(this,t);var e,n,r,o=Mu(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return o.boundCheck=(e=o.check.bind(o),n=300,r=void 0,function(){for(var t=arguments.length,o=Array(t),i=0;i<t;i++)o[i]=arguments[i];var a=this;clearTimeout(r),r=setTimeout(function(){clearTimeout(r),e.apply(a,o)},n)}),o}return Au(t,Du),Su(t,[{key:\"connectedCallback\",value:function(){var e=this.querySelector(\"input\");e instanceof HTMLInputElement&&(this.input=e,this.input.addEventListener(\"change\",this.boundCheck),this.input.addEventListener(\"input\",this.boundCheck))}},{key:\"disconnectedCallback\",value:function(){this.input&&(this.input.removeEventListener(\"change\",this.boundCheck),this.input.addEventListener(\"input\",this.boundCheck))}},{key:\"check\",value:function(){var e=this;if(!this.src)throw new Error(\"missing src\");if(!this.csrf)throw new Error(\"missing csrf\");var t=new FormData;t.append(\"authenticity_token\",this.csrf),t.append(\"value\",this.input.value);var n=t.entries?[].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t.entries())).sort().toString():null;if(!n||n!==Hu.get(this.input))if(Hu.set(this.input,n),this.input.dispatchEvent(new CustomEvent(\"autocheck:send\",{detail:{body:t},bubbles:!0,cancelable:!0})),this.input.value.trim()){var r=function(){e.dispatchEvent(new CustomEvent(\"loadend\")),e.input.dispatchEvent(new CustomEvent(\"autocheck:complete\",{bubbles:!0,cancelable:!0}))};this.dispatchEvent(new CustomEvent(\"loadstart\")),function(e,t,n){var r=Pu.get(e);r&&r.abort();var o=function(){return Pu.delete(e)},i=new XMLHttpRequest;Pu.set(e,i),i.open(\"POST\",n,!0),i.setRequestHeader(\"Accept\",\"text/html; fragment\");var a=function(e,t){return new Promise(function(n,r){e.onload=function(){e.status>=200&&e.status<300?n(e.responseText):r(new Cu(e.status,e.responseText,e.getResponseHeader(\"Content-Type\")))},e.onerror=function(){r(new Cu(e.status,e.responseText,e.getResponseHeader(\"Content-Type\")))},e.send(t)})}(i,t);return a.then(o,o),a}(this.input,t,this.src).then(function(t){e.dispatchEvent(new CustomEvent(\"load\"));var n=t?t.trim():null;e.input.dispatchEvent(new CustomEvent(\"autocheck:success\",{detail:{warning:n},bubbles:!0,cancelable:!0}))}).catch(function(t){e.dispatchEvent(new CustomEvent(\"error\")),e.input.dispatchEvent(new CustomEvent(\"autocheck:error\",{detail:{message:function(e){if(422===e.statusCode&&e.responseText&&e.contentType.includes(\"text/html; fragment\"))return e.responseText}(t)},bubbles:!0,cancelable:!0}))}).then(r,r)}else this.input.dispatchEvent(new CustomEvent(\"autocheck:complete\",{bubbles:!0,cancelable:!0}))}},{key:\"src\",get:function(){var e=this.getAttribute(\"src\");if(!e)return\"\";var t=this.ownerDocument.createElement(\"a\");return t.href=e,t.href},set:function(e){this.setAttribute(\"src\",e)}},{key:\"csrf\",get:function(){return this.getAttribute(\"csrf\")||\"\"},set:function(e){this.setAttribute(\"csrf\",e)}}]),t}();window.customElements.get(\"auto-check\")||(window.AutoCheckElement=Ru,window.customElements.define(\"auto-check\",Ru));var Nu=new Map,Iu=function(){function e(t,n,r){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:ec;l(this,e),this.strings=t,this.values=n,this.type=r,this.partCallback=o}return f(e,[{key:\"getHTML\",value:function(){for(var e,t,n=this.strings.length-1,r=\"\",o=!0,i=0;i<n;i++){var a=this.strings[i];r+=a;var s=(void 0,void 0,t=(e=a).lastIndexOf(\">\"),e.indexOf(\"<\",t+1)>-1?e.length:t);r+=(o=s>-1?s<a.length:o)?zu:Bu}return r+=this.strings[n]}},{key:\"getTemplateElement\",value:function(){var e=document.createElement(\"template\");return e.innerHTML=this.getHTML(),e}}]),e}(),qu=function(e){function t(){return l(this,t),p(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return h(t,Iu),f(t,[{key:\"getHTML\",value:function(){return\"<svg>\"+d(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),\"getHTML\",this).call(this)+\"</svg>\"}},{key:\"getTemplateElement\",value:function(){var e=d(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),\"getTemplateElement\",this).call(this),n=e.content,r=n.firstChild;return n.removeChild(r),nc(n,r.firstChild),e}}]),t}();function Fu(e){var t=Nu.get(e.type);void 0===t&&(t=new Map,Nu.set(e.type,t));var n=t.get(e.strings);return void 0===n&&(n=new Yu(e,e.getTemplateElement()),t.set(e.strings,n)),n}var Bu=\"{{lit-\"+String(Math.random()).slice(2)+\"}}\",zu=\"\\x3c!--\"+Bu+\"--\\x3e\",Xu=new RegExp(Bu+\"|\"+zu),Vu=/[ \\x09\\x0a\\x0c\\x0d]([^\\0-\\x1F\\x7F-\\x9F \\x09\\x0a\\x0c\\x0d\"'>=/]+)[ \\x09\\x0a\\x0c\\x0d]*=[ \\x09\\x0a\\x0c\\x0d]*(?:[^ \\x09\\x0a\\x0c\\x0d\"'`<>=]*|\"[^\"]*|'[^']*)$/;var Wu=function e(t,n,r,o,i){l(this,e),this.type=t,this.index=n,this.name=r,this.rawName=o,this.strings=i},Uu=function(e){return-1!==e.index},Yu=function e(t,n){l(this,e),this.parts=[],this.element=n;for(var r=this.element.content,o=document.createTreeWalker(r,133,null,!1),i=-1,a=0,s=[],u=void 0,c=void 0;o.nextNode();){i++,u=c;var f=c=o.currentNode;if(1===f.nodeType){if(!f.hasAttributes())continue;for(var d=f.attributes,h=0,p=0;p<d.length;p++)d[p].value.indexOf(Bu)>=0&&h++;for(;h-- >0;){var v=t.strings[a],m=Vu.exec(v)[1],g=d.getNamedItem(m),b=g.value.split(Xu);this.parts.push(new Wu(\"attribute\",i,g.name,m,b)),f.removeAttribute(g.name),a+=b.length-1}}else if(3===f.nodeType){var y=f.nodeValue;if(y.indexOf(Bu)<0)continue;var w=f.parentNode,E=y.split(Xu),_=E.length-1;a+=_;for(var x=0;x<_;x++)w.insertBefore(\"\"===E[x]?document.createComment(\"\"):document.createTextNode(E[x]),f),this.parts.push(new Wu(\"node\",i++));w.insertBefore(\"\"===E[_]?document.createComment(\"\"):document.createTextNode(E[_]),f),s.push(f)}else if(8===f.nodeType&&f.nodeValue===Bu){var k=f.parentNode,T=f.previousSibling;null===T||T!==u||T.nodeType!==Node.TEXT_NODE?k.insertBefore(document.createComment(\"\"),f):i--,this.parts.push(new Wu(\"node\",i++)),s.push(f),null===f.nextSibling?k.insertBefore(document.createComment(\"\"),f):i--,c=u,a++}}var j=!0,L=!1,O=void 0;try{for(var S,A=s[Symbol.iterator]();!(j=(S=A.next()).done);j=!0){var M=S.value;M.parentNode.removeChild(M)}}catch(e){L=!0,O=e}finally{try{!j&&A.return&&A.return()}finally{if(L)throw O}}},Gu=function(e,t){return Ku(t)?(t=t(e),$u):null===t?void 0:t},Ku=function(e){return\"function\"==typeof e&&!0===e.__litDirective},$u={},Ju=function(e){return null===e||!(\"object\"===(void 0===e?\"undefined\":u(e))||\"function\"==typeof e)},Zu=function(){function e(t,n,r,o){l(this,e),this.instance=t,this.element=n,this.name=r,this.strings=o,this.size=o.length-1,this._previousValues=[]}return f(e,[{key:\"_interpolate\",value:function(e,t){for(var n=this.strings,r=n.length-1,o=\"\",i=0;i<r;i++){o+=n[i];var a=Gu(this,e[t+i]);if(a&&a!==$u&&(Array.isArray(a)||\"string\"!=typeof a&&a[Symbol.iterator])){var s=!0,u=!1,c=void 0;try{for(var l,f=a[Symbol.iterator]();!(s=(l=f.next()).done);s=!0){o+=l.value}}catch(e){u=!0,c=e}finally{try{!s&&f.return&&f.return()}finally{if(u)throw c}}}else o+=a}return o+n[r]}},{key:\"_equalToPreviousValues\",value:function(e,t){for(var n=t;n<t+this.size;n++)if(this._previousValues[n]!==e[n]||!Ju(e[n]))return!1;return!0}},{key:\"setValue\",value:function(e,t){if(!this._equalToPreviousValues(e,t)){var n=this.strings,r=void 0;2===n.length&&\"\"===n[0]&&\"\"===n[1]?(r=Gu(this,e[t]),Array.isArray(r)&&(r=r.join(\"\"))):r=this._interpolate(e,t),r!==$u&&this.element.setAttribute(this.name,r),this._previousValues=e}}}]),e}(),Qu=function(){function e(t,n,r){l(this,e),this.instance=t,this.startNode=n,this.endNode=r,this._previousValue=void 0}return f(e,[{key:\"setValue\",value:function(e){if((e=Gu(this,e))!==$u)if(Ju(e)){if(e===this._previousValue)return;this._setText(e)}else e instanceof Iu?this._setTemplateResult(e):Array.isArray(e)||e[Symbol.iterator]?this._setIterable(e):e instanceof Node?this._setNode(e):void 0!==e.then?this._setPromise(e):this._setText(e)}},{key:\"_insert\",value:function(e){this.endNode.parentNode.insertBefore(e,this.endNode)}},{key:\"_setNode\",value:function(e){this._previousValue!==e&&(this.clear(),this._insert(e),this._previousValue=e)}},{key:\"_setText\",value:function(e){var t=this.startNode.nextSibling;e=void 0===e?\"\":e,t===this.endNode.previousSibling&&t.nodeType===Node.TEXT_NODE?t.textContent=e:this._setNode(document.createTextNode(e)),this._previousValue=e}},{key:\"_setTemplateResult\",value:function(e){var t=this.instance._getTemplate(e),n=void 0;this._previousValue&&this._previousValue.template===t?n=this._previousValue:(n=new tc(t,this.instance._partCallback,this.instance._getTemplate),this._setNode(n._clone()),this._previousValue=n),n.update(e.values)}},{key:\"_setIterable\",value:function(t){Array.isArray(this._previousValue)||(this.clear(),this._previousValue=[]);var n=this._previousValue,r=0,o=!0,i=!1,a=void 0;try{for(var s,u=t[Symbol.iterator]();!(o=(s=u.next()).done);o=!0){var c=s.value,l=n[r];if(void 0===l){var f=this.startNode;if(r>0)f=n[r-1].endNode=document.createTextNode(\"\"),this._insert(f);l=new e(this.instance,f,this.endNode),n.push(l)}l.setValue(c),r++}}catch(e){i=!0,a=e}finally{try{!o&&u.return&&u.return()}finally{if(i)throw a}}if(0===r)this.clear(),this._previousValue=void 0;else if(r<n.length){var d=n[r-1];n.length=r,this.clear(d.endNode.previousSibling),d.endNode=this.endNode}}},{key:\"_setPromise\",value:function(e){var t=this;this._previousValue=e,e.then(function(n){t._previousValue===e&&t.setValue(n)})}},{key:\"clear\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.startNode;rc(this.startNode.parentNode,e.nextSibling,this.endNode)}}]),e}(),ec=function(e,t,n){if(\"attribute\"===t.type)return new Zu(e,n,t.name,t.strings);if(\"node\"===t.type)return new Qu(e,n,n.nextSibling);throw new Error(\"Unknown part type \"+t.type)},tc=function(){function e(t,n,r){l(this,e),this._parts=[],this.template=t,this._partCallback=n,this._getTemplate=r}return f(e,[{key:\"update\",value:function(e){var t=0,n=!0,r=!1,o=void 0;try{for(var i,a=this._parts[Symbol.iterator]();!(n=(i=a.next()).done);n=!0){var s=i.value;s?void 0===s.size?(s.setValue(e[t]),t++):(s.setValue(e,t),t+=s.size):t++}}catch(e){r=!0,o=e}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}}},{key:\"_clone\",value:function(){var e=this.template.element.content.cloneNode(!0),t=this.template.parts;if(t.length>0)for(var n=document.createTreeWalker(e,133,null,!1),r=-1,o=0;o<t.length;o++){var i=t[o],a=Uu(i);if(a)for(;r<i.index;)r++,n.nextNode();this._parts.push(a?this._partCallback(this,i,n.currentNode):void 0)}return e}}]),e}(),nc=function(e,t){for(var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=t;o!==n;){var i=o.nextSibling;e.insertBefore(o,r),o=i}},rc=function(e,t){for(var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=t;r!==n;){var o=r.nextSibling;e.removeChild(r),r=o}};return{delegated_events:ye,form_data_entries:Zt,lit_html:Object.freeze({templateCaches:Nu,html:function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return new Iu(e,n,\"html\")},svg:function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return new qu(e,n,\"svg\")},TemplateResult:Iu,SVGTemplateResult:qu,defaultTemplateFactory:Fu,render:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Fu,r=n(e),o=t.__templateInstance;if(void 0===o||o.template!==r||o._partCallback!==e.partCallback){o=new tc(r,e.partCallback,n),t.__templateInstance=o;var i=o._clone();o.update(e.values),rc(t,t.firstChild),t.appendChild(i)}else o.update(e.values)},TemplatePart:Wu,isTemplatePartActive:Uu,Template:Yu,getValue:Gu,directive:function(e){return e.__litDirective=!0,e},noChange:$u,directiveValue:$u,AttributePart:Zu,NodePart:Qu,defaultPartCallback:ec,TemplateInstance:tc,reparentNodes:nc,removeNodes:rc}),github__code_editor:st,github__debounce:ct,github__throttle:lt,github__details:Et,github__details_dialog:xt,github__dimensions:Lt,github__document_ready:s,github__eventloop_tasks:Ot,github__failbot:Y,github__feature_detection:Ht,github__fetch:Jt,github__form:sn,github__fragment_target:Pe,github__google_analytics:un,github__has_interactions:dn,github__hash_change:ze,github__history:Ae,github__hotkey:Ve,github__hotkey_map:Zn,github__html_safe:qt,github__inflector:ar,github__inspect:io,github__locale:sr,github__menu:hr,github__metadata:D,github__navigation:Ur,github__node:yr,github__number_helpers:Gr,github__onfocus:Qr,github__parse_html:Bt,github__pjax:Ro,github__pjax__prefetch:uo,github__preserve_position:ca,github__proxy_site_detection:H,github__query_selector:pt,github__radix_trie:vn,github__remote_form:ii,github__remote_submit:tn,github__restrict_tab_behavior:Ke,github__scrollby:ra,github__scrollto:Er,github__select_menu__loading:ui,github__send_beacon:S,github__session_storage:li,github__sliding_promise_queue:no,github__sso:Ko,github__subscription:mr,github__sudo:vi,github__task_list:Ui,github__text:Gi,github__throttled_input:ea,github__timers:Io,github__timezone:At,github__typecast:M,github__updatable_content:va,github__visible:Ue,invariant:o,selector_observer:Wn,___github__sortablejs:ga}});\n\n//# sourceMappingURL=frameworks-5c52a327bd2ba29b7592ae71d78755a2.js.map\n"
  },
  {
    "path": "test/resources/github.css",
    "content": "/*!\n * Primer-product\n * http://primer.github.io\n *\n * Released under MIT license. Copyright (c) 2018 GitHub Inc.\n */.flash{position:relative;padding:16px;color:#032f62;background-color:#dbedff;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.flash p:last-child{margin-bottom:0}.flash-messages{margin-bottom:24px}.flash-close{float:right;padding:16px;margin:-16px;color:inherit;text-align:center;cursor:pointer;background:none;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0.6}.flash-close:hover{opacity:1}.flash-action{float:right;margin-top:-3px;margin-left:24px}.flash-warn{color:#735c0f;background-color:#fffbdd;border-color:rgba(27,31,35,0.15)}.flash-error{color:#86181d;background-color:#ffdce0;border-color:rgba(27,31,35,0.15)}.flash-success{color:#165c26;background-color:#dcffe4;border-color:rgba(27,31,35,0.15)}.flash-full{margin-top:-1px;border-width:1px 0;border-radius:0}.warning{padding:.5em;margin-bottom:0.8em;font-weight:600;background-color:#fffbdd}.avatar{display:inline-block;overflow:hidden;line-height:1;vertical-align:middle;border-radius:3px}.avatar-small{border-radius:2px}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-parent-child{position:relative}.avatar-child{position:absolute;right:-15%;bottom:-9%;background-color:#fff;border-radius:2px;box-shadow:-2px -2px 0 rgba(255,255,255,0.8)}.avatar-stack{display:inline-block;white-space:nowrap}.avatar-stack .avatar{position:relative;z-index:2;display:inline-block;width:20px;height:20px;box-sizing:content-box;margin-right:-15px;background-color:#fff;border-right:1px solid #fff;border-radius:2px;transition:margin 0.1s ease-in-out}.avatar-stack .avatar:only-child{background-color:transparent}.avatar-stack .avatar:first-child{z-index:3}.avatar-stack .avatar:last-child{z-index:1;margin-right:0;border-right:0}.avatar-stack:hover .avatar{margin-right:3px}.avatar-stack:hover .avatar:last-child{margin-right:0}.AvatarStack{position:relative;min-width:26px;height:20px}.AvatarStack .AvatarStack-body{position:absolute}.AvatarStack.AvatarStack--two{min-width:36px}.AvatarStack.AvatarStack--three-plus{min-width:46px}.AvatarStack-body{display:flex;background:#fff}.AvatarStack-body .avatar{position:relative;z-index:2;display:flex;width:20px;height:20px;box-sizing:content-box;margin-right:-11px;background-color:#fff;border-right:1px solid #fff;border-radius:2px;transition:margin 0.1s ease-in-out}.AvatarStack-body .avatar:first-child{z-index:3}.AvatarStack-body .avatar:last-child{z-index:1;border-right:0}.AvatarStack-body .avatar img{border-radius:2px}.AvatarStack-body .avatar:nth-child(n+4){display:none;opacity:0}.AvatarStack-body:hover .avatar{margin-right:3px}.AvatarStack-body:hover .avatar:nth-child(n+4){display:flex;opacity:1}.AvatarStack-body:hover .avatar-more{display:none !important}.avatar.avatar-more{z-index:1;margin-right:0;background:#f6f8fa}.avatar.avatar-more::before,.avatar.avatar-more::after{position:absolute;display:block;height:20px;content:\"\";border-radius:2px;outline:1px solid #fff}.avatar.avatar-more::before{width:17px;background:#e1e4e8}.avatar.avatar-more::after{width:14px;background:#d1d5da}.AvatarStack--right .AvatarStack-body{right:0;flex-direction:row-reverse}.AvatarStack--right .AvatarStack-body:hover .avatar{margin-right:0;margin-left:3px}.AvatarStack--right .avatar.avatar-more{background:#d1d5da}.AvatarStack--right .avatar.avatar-more::before{width:5px}.AvatarStack--right .avatar.avatar-more::after{width:2px;background:#f6f8fa}.AvatarStack--right .avatar{margin-right:0;margin-left:-11px;border-right:0;border-left:1px solid #fff}.CircleBadge{display:flex;align-items:center;justify-content:center;background-color:#fff;border-radius:50%;box-shadow:0 1px 5px rgba(27,31,35,0.15)}.CircleBadge-icon{max-width:60% !important;height:auto !important;max-height:55% !important}.CircleBadge--small{width:56px;height:56px}.CircleBadge--medium{width:96px;height:96px}.CircleBadge--large{width:128px;height:128px}.DashedConnection{position:relative}.DashedConnection::before{position:absolute;top:50%;left:0;width:100%;content:\"\";border-bottom:2px dashed #e1e4e8}.DashedConnection .CircleBadge{position:relative}.blankslate{position:relative;padding:32px;text-align:center;background-color:#fafbfc;border:1px solid #e1e4e8;border-radius:3px;box-shadow:inset 0 0 10px rgba(27,31,35,0.05)}.blankslate code{padding:2px 5px 3px;font-size:14px;background:#fff;border:1px solid #eaecef;border-radius:3px}.blankslate-icon{margin-right:4px;margin-bottom:8px;margin-left:4px;color:#a3aab1}.blankslate-capped{border-radius:0 0 3px 3px}.blankslate-spacious{padding:80px 40px}.blankslate-narrow{width:485px;margin:0 auto}.blankslate-large h3{margin:16px 0;font-size:20px}.blankslate-large p{font-size:16px}.blankslate-clean-background{background:none;border:0;box-shadow:none}.branch-name{display:inline-block;padding:2px 6px;font:12px \"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;color:rgba(27,31,35,0.6);background-color:#eaf5ff;border-radius:3px}.branch-name .octicon{margin:1px -2px 0 0;color:#a8bbd0}a.branch-name{color:#0366d6}.labels{position:relative}.label,.Label{display:inline-block;padding:3px 4px;font-size:12px;font-weight:600;line-height:1;color:#fff;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(27,31,35,0.12)}.label:hover,.Label:hover{text-decoration:none}.Label--gray{color:#586069;background-color:#eaecef}.Label--outline{margin-top:-1px;margin-bottom:-1px;font-weight:400;color:#586069;background-color:transparent;border:1px solid rgba(27,31,35,0.15);box-shadow:none}.Label--outline-green{color:#28a745;border:1px solid #34d058}.Label--gray-darker{background-color:#6a737d}.Label--orange{background-color:#d15704}.state,.State{display:inline-block;padding:4px 8px;font-weight:600;line-height:20px;color:#fff;text-align:center;background-color:#6a737d;border-radius:3px}.State--green{background-color:#2cbe4e}.State--purple{background-color:#6f42c1}.State--red{background-color:#cb2431}.State--small{padding:.125em 4px;font-size:12px}.State--small .octicon{width:1em}.Counter{display:inline-block;padding:2px 5px;font-size:12px;font-weight:600;line-height:1;color:#586069;background-color:rgba(27,31,35,0.08);border-radius:20px}.Counter--gray-light{color:#24292e;background-color:rgba(27,31,35,0.15)}.Counter--gray{color:#fff;background-color:#6a737d}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body::before{display:table;content:\"\"}.markdown-body::after{display:table;clear:both;content:\"\"}.markdown-body>*:first-child{margin-top:0 !important}.markdown-body>*:last-child{margin-bottom:0 !important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cb2431}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:0.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{font-size:inherit}.markdown-body h1{padding-bottom:0.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:0.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:0.875em}.markdown-body h6{font-size:0.85em;color:#6a737d}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li{word-wrap:break-all}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #dfe2e5}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292e}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:0.2em 0.4em;margin:0;font-size:85%;background-color:rgba(27,31,35,0.05);border-radius:3px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}.Popover{position:absolute;z-index:100}.Popover-message{position:relative;width:232px;margin-right:auto;margin-left:auto}.Popover-message::before,.Popover-message::after{position:absolute;left:50%;display:inline-block;content:\"\"}.Popover-message::before{top:-16px;margin-left:-9px;border:8px solid transparent;border-bottom-color:rgba(27,31,35,0.15)}.Popover-message::after{top:-14px;margin-left:-8px;border:7px solid transparent;border-bottom-color:#fff}.Popover-message--bottom::before,.Popover-message--bottom::after,.Popover-message--bottom-right::before,.Popover-message--bottom-right::after,.Popover-message--bottom-left::before,.Popover-message--bottom-left::after{top:auto;border-bottom-color:transparent}.Popover-message--bottom::before,.Popover-message--bottom-right::before,.Popover-message--bottom-left::before{bottom:-16px;border-top-color:rgba(27,31,35,0.15)}.Popover-message--bottom::after,.Popover-message--bottom-right::after,.Popover-message--bottom-left::after{bottom:-14px;border-top-color:#fff}.Popover-message--top-right,.Popover-message--bottom-right{right:-9px;margin-right:0}.Popover-message--top-right::before,.Popover-message--top-right::after,.Popover-message--bottom-right::before,.Popover-message--bottom-right::after{left:auto;margin-left:0}.Popover-message--top-right::before,.Popover-message--bottom-right::before{right:20px}.Popover-message--top-right::after,.Popover-message--bottom-right::after{right:21px}.Popover-message--top-left,.Popover-message--bottom-left{left:-9px;margin-left:0}.Popover-message--top-left::before,.Popover-message--top-left::after,.Popover-message--bottom-left::before,.Popover-message--bottom-left::after{left:24px;margin-left:0}.Popover-message--top-left::after,.Popover-message--bottom-left::after{left:25px}.Popover-message--right::before,.Popover-message--right::after,.Popover-message--right-top::before,.Popover-message--right-top::after,.Popover-message--right-bottom::before,.Popover-message--right-bottom::after,.Popover-message--left::before,.Popover-message--left::after,.Popover-message--left-top::before,.Popover-message--left-top::after,.Popover-message--left-bottom::before,.Popover-message--left-bottom::after{top:50%;left:auto;margin-left:0;border-bottom-color:transparent}.Popover-message--right::before,.Popover-message--right-top::before,.Popover-message--right-bottom::before,.Popover-message--left::before,.Popover-message--left-top::before,.Popover-message--left-bottom::before{margin-top:-9px}.Popover-message--right::after,.Popover-message--right-top::after,.Popover-message--right-bottom::after,.Popover-message--left::after,.Popover-message--left-top::after,.Popover-message--left-bottom::after{margin-top:-8px}.Popover-message--right::before,.Popover-message--right-top::before,.Popover-message--right-bottom::before{right:-16px;border-left-color:rgba(27,31,35,0.15)}.Popover-message--right::after,.Popover-message--right-top::after,.Popover-message--right-bottom::after{right:-14px;border-left-color:#fff}.Popover-message--left::before,.Popover-message--left-top::before,.Popover-message--left-bottom::before{left:-16px;border-right-color:rgba(27,31,35,0.15)}.Popover-message--left::after,.Popover-message--left-top::after,.Popover-message--left-bottom::after{left:-14px;border-right-color:#fff}.Popover-message--right-top::before,.Popover-message--right-top::after,.Popover-message--left-top::before,.Popover-message--left-top::after{top:24px}.Popover-message--right-bottom::before,.Popover-message--right-bottom::after,.Popover-message--left-bottom::before,.Popover-message--left-bottom::after{top:auto}.Popover-message--right-bottom::before,.Popover-message--left-bottom::before{bottom:16px}.Popover-message--right-bottom::after,.Popover-message--left-bottom::after{bottom:17px}@media (min-width: 544px){.Popover-message--large{min-width:320px}}.Subhead{display:flex;padding-bottom:8px;margin-bottom:16px;border-bottom:1px #e1e4e8 solid;flex-flow:row wrap}.Subhead--spacious{margin-top:40px}.Subhead-heading{font-size:24px;font-weight:normal;flex:1 1 auto}.Subhead-heading--danger{font-weight:600;color:#cb2431}.Subhead-description{font-size:14px;color:#586069;flex:1 100%}.Subhead-actions{align-self:center;justify-content:flex-end}.table-list{display:table;width:100%;color:#6a737d;table-layout:fixed;border-bottom:1px solid #e1e4e8}.table-list ol{list-style-type:decimal}.table-list-bordered{border-bottom-color:#eaecef}.table-list-bordered .table-list-cell:first-child{border-left:1px solid #eaecef}.table-list-bordered .table-list-cell:last-child{border-right:1px solid #eaecef}.table-list-item{position:relative;display:table-row;list-style:none}.table-list-item.unread .table-list-cell:first-child{box-shadow:2px 0 0 #0366d6 inset}.table-list-cell{position:relative;display:table-cell;padding:8px 10px;font-size:12px;vertical-align:top;border-top:1px solid #eaecef}.table-list-cell.flush-left{padding-left:0}.table-list-cell.flush-right{padding-right:0}.table-list-cell-checkbox{width:30px;padding-right:0;padding-left:0;text-align:center}.table-list-header{position:relative;margin-top:20px;background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:3px 3px 0 0}.table-list-header::before{display:table;content:\"\"}.table-list-header::after{display:table;clear:both;content:\"\"}.table-list-header .btn-link{position:relative;display:inline-block;padding-top:13px;padding-bottom:13px;font-weight:400}.table-list-heading{margin-left:10px}.table-list-header-select-all{float:left;width:30px;padding:12px 10px;margin-right:5px;margin-left:-1px;text-align:center}.table-list-header-meta{display:inline-block;padding-top:13px;padding-bottom:13px;color:#586069}.table-list-header-toggle h4{padding:12px 0}.table-list-filters:first-child .table-list-header-toggle:first-child{padding-left:16px}.table-list-header-toggle.states .selected{font-weight:600}.table-list-header-toggle .btn-link{color:#586069}.table-list-header-toggle .btn-link .octicon{margin-right:2px}.table-list-header-toggle .btn-link:hover{color:#24292e;text-decoration:none}.table-list-header-toggle .btn-link.selected,.table-list-header-toggle .btn-link.selected:hover{color:#24292e}.table-list-header-toggle .btn-link+.btn-link{margin-left:10px}.table-list-header-toggle .btn-link:disabled,.table-list-header-toggle .btn-link.disabled{pointer-events:none;opacity:0.5}.table-list-header-toggle .select-menu{position:relative}.table-list-header-toggle .select-menu-item.selected{font-weight:600}.table-list-header-toggle .select-menu-button{padding-right:15px;padding-left:15px}.table-list-header-toggle .select-menu-button:hover,.table-list-header-toggle .select-menu-button.selected,.table-list-header-toggle .select-menu-button.selected:hover{color:#24292e}.table-list-header-toggle .select-menu-modal-holder{right:10px}.table-list-header-toggle .select-menu-modal-holder .select-menu-modal{margin-top:-1px}.table-list-header-next{margin-top:20px;margin-bottom:-1px}.table-list-header-next .table-list-header-select-all{padding-left:14px}.table-list-header-next .select-all-dropdown{padding-top:10px;padding-bottom:10px}.bulk-actions-header{position:-webkit-sticky;position:sticky;top:0;z-index:32;height:50px}.table-list-triage{display:none}.triage-mode .table-list-filters{display:none}.triage-mode .table-list-triage{display:block}.ajax-pagination-form .ajax-pagination-btn{width:100%;padding:6px;margin-top:20px;font-weight:600;color:#0366d6;background:#fff;border:1px solid #e1e4e8;border-radius:3px}.ajax-pagination-form .ajax-pagination-btn:hover,.ajax-pagination-form .ajax-pagination-btn:focus{background-color:#f6f8fa}.ajax-pagination-form.loading .ajax-pagination-btn{text-indent:-3000px;background-color:#f6f8fa;background-image:url(\"/images/spinners/octocat-spinner-16px-EAF2F5.gif\");background-repeat:no-repeat;background-position:center center;border-color:#d1d5da}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.ajax-pagination-form.loading .ajax-pagination-btn{background-image:url(\"/images/spinners/octocat-spinner-32-EAF2F5.gif\");background-size:16px auto}}.autocomplete-results{position:absolute;z-index:99;width:100%;max-height:20em;overflow-y:auto;font-size:13px;list-style:none;background:#fff;border-radius:3px;box-shadow:0 0 5px rgba(27,31,35,0.3)}.autocomplete-item{display:block;padding:5px;overflow:hidden;font-weight:600;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.autocomplete-item:hover,.autocomplete-item[aria-selected=\"true\"],.autocomplete-item.selected,.autocomplete-item.navigation-focus{color:#fff;text-decoration:none;background-color:#0366d6}.autocomplete-item:hover .organization-member,.autocomplete-item:hover .ldap-group-dn,.autocomplete-item[aria-selected=\"true\"] .organization-member,.autocomplete-item[aria-selected=\"true\"] .ldap-group-dn,.autocomplete-item.selected .organization-member,.autocomplete-item.selected .ldap-group-dn,.autocomplete-item.navigation-focus .organization-member,.autocomplete-item.navigation-focus .ldap-group-dn{color:#f6f8fa}.autocomplete-item .secondary-label{font-weight:400}.autocomplete-item .organization-member{float:right;padding-top:1px;color:#6a737d}.suggester-container{position:absolute;top:0;left:0;z-index:30;transform:translateZ(0)}.suggester{position:relative;top:0;left:0;min-width:180px;margin-top:20px;cursor:pointer;background:#fff;border:1px solid #dfe2e5;border-radius:3px;box-shadow:0 0 5px rgba(27,31,35,0.1)}.suggester ul{padding:0;margin:0;list-style:none}.suggester li{display:block;padding:5px 10px;font-weight:600;border-bottom:1px solid #dfe2e5}.suggester li small{font-weight:400;color:#586069}.suggester li:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.suggester li:first-child a{border-top-left-radius:3px;border-top-right-radius:3px}.suggester li[aria-selected=\"true\"],.suggester li.navigation-focus{color:#fff;text-decoration:none;background:#0366d6}.suggester li[aria-selected=\"true\"] small,.suggester li.navigation-focus small{color:#fff}.Box--overlay{width:448px;margin-right:auto;margin-left:auto;background-color:#fff;background-clip:padding-box;border-color:#444d56;box-shadow:0 0 18px rgba(0,0,0,0.4)}.Box--overlay .Box-header{margin:0;border-width:0;border-bottom-width:1px;border-top-left-radius:2px;border-top-right-radius:2px}.Box-overlay--narrow{width:320px}.Box-overlay--wide{width:640px}.Overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99;overflow-y:auto}.Overlay-table-full{display:table;width:100%;height:100%;table-layout:fixed}.Overlay-cell-middle{display:table-cell;width:100%;height:100%;padding:32px;vertical-align:middle}.bg-transparent-dark{background-color:rgba(0,0,0,0.5)}.transition-in-out{transition:opacity 0.2s ease-in-out}.transition-in-out[hidden]{opacity:0}.Box-body.scrollable-overlay{max-height:400px;overflow-y:scroll}.Box-body .help{padding-top:8px;margin:0;color:#586069;text-align:center}.boxed-group{position:relative;margin-bottom:30px;border-radius:3px}.boxed-group .Counter{color:#fff;background-color:rgba(47,54,61,0.5)}.boxed-group.flush .boxed-group-inner{padding:0}.boxed-group.condensed .boxed-group-inner{padding:0;font-size:12px}.boxed-group>h3,.boxed-group .heading{display:block;padding:9px 10px 10px;margin:0;font-size:14px;line-height:17px;background-color:#f6f8fa;border:1px solid rgba(27,31,35,0.15);border-bottom:0;border-radius:3px 3px 0 0}.boxed-group>h3 a,.boxed-group .heading a{color:inherit}.boxed-group>h3 a.boxed-group-breadcrumb,.boxed-group .heading a.boxed-group-breadcrumb{font-weight:400;color:#586069;text-decoration:none}.boxed-group>h3 .avatar,.boxed-group .heading .avatar{margin-top:-4px}.boxed-group .tabnav.heading{padding:0}.boxed-group .tabnav.heading .tabnav-tab.selected{border-top:0}.boxed-group .tabnav.heading li:first-child .selected{border-left-color:#fff;border-top-left-radius:3px}.boxed-group .tabnav-tab{border-top:0;border-radius:0}.boxed-group code.heading{font-size:12px}.boxed-group.dangerzone>h3{color:#fff;background-color:#d73a49;border:1px solid #9e1c23}.boxed-group.dangerzone .boxed-group-inner{border-top:0}.boxed-group.condensed>h3{padding:6px 6px 7px;font-size:12px}.boxed-group.condensed>h3 .octicon{padding:0 6px 0 2px}.one-half .boxed-group,.dashboard-sidebar .boxed-group{margin-bottom:20px}.boxed-group .bleed-flush{width:100%;padding:0 10px;margin-left:-10px}.boxed-group .compact{margin-top:10px;margin-bottom:10px}.boxed-group-inner{padding:10px;color:#586069;background:#fff;border:1px solid #d1d5da;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.boxed-group-inner .markdown-body{padding:20px 10px 10px;font-size:13px}.boxed-group-inner.markdown-body{padding-top:10px;padding-bottom:10px}.boxed-group-inner.seamless{padding:0}.boxed-group-inner .tabnav{padding-right:10px;padding-left:10px;margin-right:-10px;margin-left:-10px}.boxed-group-inner .tabnav-tab.selected{border-top:1px solid #dfe2e5}.boxed-group-inner .help{padding:1em 10px 1em 35px;margin:1em -10px -10px;clear:both;color:#586069;border-top:1px solid #dfe2e5}.boxed-group-inner .help .octicon{margin-right:5px;margin-left:-25px}.boxed-group-inner .boxed-group-list+.help{margin-top:0}.boxed-action{float:right;margin-left:10px}.boxed-group-action{position:relative;z-index:2;float:right;margin:5px 10px 0 0}.boxed-group-action.flush{margin-top:0;margin-right:0}.field-with-errors{display:inline}.compact-options{margin:-6px 0 13px}.compact-options>li{display:inline-block;margin:0 12px 0 0;font-weight:600;list-style-type:none}.compact-options>li label{float:left}.compact-options>li .spinner{display:block;float:left;width:16px;height:16px;margin-left:5px}.boxed-group-list{margin:0;list-style:none}.boxed-group-list:first-child>li:first-child{border-top:0}.boxed-group-list>li{display:block;padding:5px 10px;margin-right:-10px;margin-left:-10px;line-height:23px;border-bottom:1px solid #e1e4e8}.boxed-group-list>li:first-child{border-top:1px solid #dfe2e5}.boxed-group-list>li:last-of-type{border-bottom:0}.boxed-group-list>li.selected{background:#dcffe4}.boxed-group-list>li.approved .btn-sm,.boxed-group-list>li.rejected .btn-sm{display:none}.boxed-group-list>li.rejected a{text-decoration:line-through}.boxed-group-list>li .avatar{margin-top:-2px;margin-right:4px}.boxed-group-list>li .octicon{width:24px;margin-right:4px}.boxed-group-list>li .btn-sm{float:right;margin:-1px 0 0 10px}.boxed-group-list>li .BtnGroup{float:right}.boxed-group-list>li .BtnGroup .btn-sm{float:left}.boxed-group.flush .boxed-group-list li{width:auto;padding-right:0;padding-left:0;margin-left:0}.boxed-group-list.standalone{margin-top:-1px}.boxed-group-list.standalone>li:first-child{border-top:0}.boxed-group-standalone{margin-top:-10px;margin-bottom:-10px}.boxed-group-standalone>li:last-child{border-radius:0 0 2px 2px}.boxed-group-table{width:100%;text-align:left}.boxed-group-table tr:last-child td{border-bottom:0}.boxed-group-table th{padding:9px;background-color:#fafbfc;border-bottom:1px solid #eaecef}.boxed-group-table td{padding:9px;vertical-align:top;border-bottom:1px solid #eaecef}.ajax-error-message{position:fixed;top:-200px;left:50%;z-index:9999;display:none;width:974px;margin:0 3px;margin-left:-487px;transition:top 0.5s ease-in-out}.ajax-error-message.visible{top:0;display:block}.ajax-error-message>.octicon-alert{vertical-align:text-top}.boxed-group-warning{padding:10px 15px;margin:-10px -10px 10px;color:rgba(27,31,35,0.85);background-color:#fffbdd;border-color:rgba(27,31,35,0.15);border-style:solid;border-width:1px 0}.boxed-group-warning .btn-sm{margin:-5px 0}.boxed-group-warning:first-child{border-top:0}.breadcrumb{margin-bottom:10px;font-size:18px;color:#586069}.breadcrumb .separator::before,.breadcrumb .separator::after{content:\" \"}.breadcrumb strong.final-path{color:#24292e}.breadcrumb .zeroclipboard-button{display:inline-block;margin-left:5px}.breadcrumb .repo-root{font-weight:600}.breadcrumb .octicon{vertical-align:-2px}.editor-license-template,.editor-code-of-conduct-template,.editor-gitignore-template{position:relative;top:3px;display:block;float:right;font-size:14px}.editor-license-template .select-menu-git-ignore,.editor-code-of-conduct-template .select-menu-git-ignore,.editor-gitignore-template .select-menu-git-ignore{right:0}.starring-container .unstarred,.starring-container.on .starred{display:block}.starring-container.on .unstarred,.starring-container .starred{display:none}.starring-container.loading{opacity:0.5}.user-following-container .follow,.user-following-container.on .unfollow{display:inline-block}.user-following-container.on .follow,.user-following-container .unfollow{display:none}.user-following-container.loading{opacity:0.5}.members .user-following-container{float:right}.close-button{padding:0;background:transparent;border:0;outline:none}.btn-invisible{color:#0366d6;background-color:#fff;background-image:none;border:0}.btn-invisible:hover,.btn-invisible:active,.btn-invisible:focus,.btn-invisible.selected,.btn-invisible.zeroclipboard-is-hover,.btn-invisible.zeroclipboard-is-active{color:#0366d6;background:none;outline:none;box-shadow:none}.btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#586069;vertical-align:middle;background:transparent;border:0}.btn-octicon:hover{color:#0366d6}.btn-octicon.disabled{color:#959da5;cursor:default}.btn-octicon.disabled:hover{color:#959da5}.btn-octicon-danger:hover{color:#cb2431}.btn-states .btn-state-alternate{display:none}.btn-states:hover .btn-state-default{display:none}.btn-states:hover .btn-state-alternate{display:inline-block}.commit-ref{position:relative;display:inline-block;padding:0 5px;font:0.75em/2 \"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;color:#274466;white-space:nowrap;background-color:#eff7ff;border-radius:3px}.commit-ref .user{color:#044289}a.commit-ref:hover{text-decoration:none;background-color:#dbedff}.capped-cards{list-style:none}.capped-cards .capped-card{float:left;width:450px}.capped-card{margin:10px;list-style:none;border:1px solid #dfe2e5;border-radius:2px}.capped-card::before{display:table;content:\"\"}.capped-card::after{display:table;clear:both;content:\"\"}.capped-card:nth-child(odd){margin-left:0}.capped-card:nth-child(even){margin-right:0}.capped-card h3{padding:10px;margin:0;line-height:100%;border-bottom:1px solid #eaecef}.capped-card>p{display:block;padding:0 10px 10px;margin:0;font-size:15px;line-height:100%;color:#586069;border-bottom:1px solid #eaecef}.capped-card-content{display:block;background:#f6f8fa}.capped-card-content::before{display:table;content:\"\"}.capped-card-content::after{display:table;clear:both;content:\"\"}.details-collapse .collapse{position:relative;display:none;height:0;overflow:hidden;transition:height 0.35s ease-in-out}.details-collapse.open .collapse{display:block;height:auto;overflow:visible}.comment .email-format{line-height:1.5}.previewable-edit .previewable-comment-form{display:none}.previewable-edit .previewable-comment-form::before{display:table;content:\"\"}.previewable-edit .previewable-comment-form::after{display:table;clear:both;content:\"\"}.previewable-edit .previewable-comment-form .tabnav-tabs{display:inline-block}.previewable-edit .previewable-comment-form .form-actions{float:right;margin-right:10px;margin-bottom:10px}.previewable-edit.is-comment-editing .timeline-comment-header{display:none}.is-comment-editing .previewable-comment-form{display:block}.is-comment-editing .timeline-comment-actions,.is-comment-editing .edit-comment-hide{display:none}.is-comment-loading .previewable-comment-form{opacity:0.5}.is-comment-stale .comment-form-stale{display:block}.comment-body{width:100%;padding:15px;overflow:visible;font-size:14px}.comment-body .highlight{overflow:visible !important;background-color:transparent}.comment-form-textarea{width:100%;max-width:100%;height:100px;min-height:100px;margin:0;line-height:1.6}.comment-form-textarea.dragover{border:solid 1px #0366d6}.discussion-topic-header{position:relative;padding:10px;word-wrap:break-word}.comment-form-error,.comment-form-stale{display:none;padding:15px 10px;margin:10px;color:#86181d;background-color:#ffdce0;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.comment-form-error.comment-form-bottom,.comment-form-stale.comment-form-bottom{margin-bottom:10px}.email-format{line-height:1.5em !important}.email-format div{white-space:pre-wrap}.email-format .email-hidden-reply{display:none;white-space:pre-wrap}.email-format .email-hidden-reply.expanded{display:block}.email-format .email-quoted-reply,.email-format .email-signature-reply{padding:0 15px;margin:15px 0;color:#586069;border-left:4px solid #dfe2e5}.email-format .email-hidden-toggle a{display:inline-block;height:12px;padding:0 9px;font-size:12px;font-weight:600;line-height:6px;color:#444d56;text-decoration:none;vertical-align:middle;background:#dfe2e5;border-radius:1px}.email-format .email-hidden-toggle a:hover{background-color:#c6cbd1}.email-format .email-hidden-toggle a:active{color:#fff;background-color:#0366d6}.comment-email-format div{white-space:normal}.comment-email-format .email-hidden-reply{display:none;white-space:normal}.comment-email-format .email-hidden-reply.expanded{display:block}.comment-email-format blockquote,.comment-email-format p{margin:0}.blankslate.conversation-limited{padding:20px 0 10px;margin:15px}.locked-conversation .write-tab,.locked-conversation .preview-tab{color:#c6cbd1}.commit-form{position:relative;padding:15px;border:1px solid #dfe2e5;border-radius:3px}.commit-form::after,.commit-form::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:\" \";border-color:transparent;border-style:solid solid outset}.commit-form::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.commit-form::before{border-width:8px;border-right-color:#dfe2e5}.commit-form .input-block{margin-top:10px;margin-bottom:10px}.commit-form-avatar{float:left;margin-left:-64px;border-radius:3px}.commit-form-actions::before{display:table;content:\"\"}.commit-form-actions::after{display:table;clear:both;content:\"\"}.commit-form-actions .BtnGroup{margin-right:5px}.commit-form-actions .check-for-fork{line-height:34px}.merge-commit-message{resize:vertical}.commit-sha{padding:0.2em 0.4em;font-size:90%;font-weight:400;background-color:#f6f8fa;border:1px solid #eaecef;border-radius:0.2em}.commit-partial-notice{margin-top:20px;margin-bottom:20px}.commit-paginate-container{float:right;margin:-5px 0 0;text-align:inherit}.commit .commit-title,.commit .commit-title a{color:#444d56}.commit .commit-title.blank,.commit .commit-title.blank a{color:rgba(27,31,35,0.3)}.commit .commit-title .issue-link{font-weight:600;color:#0366d6}.commit .sha-block,.commit .sha{font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:12px}.commit.open .commit-desc{display:block}.commit-link{font-weight:400;color:#0366d6}.commit-email-flash{display:inline}.commit-desc{display:none}.commit-desc pre{max-width:700px;margin-top:10px;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:11px;line-height:1.45;color:#444d56;white-space:pre-wrap}.commit-desc+.commit-branches{padding-top:8px;margin-top:2px;border-top:solid 1px rgba(27,31,35,0.15)}.commit-author-section{color:#24292e}.commit-author-section span.user-mention{font-weight:400}.commit-tease{position:relative;padding:10px;margin-bottom:-1px;font-size:13px;line-height:20px;color:#586069;background-color:#f1f8ff;border:1px solid #c8e1ff;border-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.commit-tease .muted-link{color:inherit}.commit-tease .loader{float:left;margin:2px 5px 0 2px}.commit-tease .message{color:inherit}.commit-tease .avatar{margin-top:-1px}.commit-tease.open .commit-desc{display:block}.branch-infobar+.commit-tease{border-top-left-radius:0;border-top-right-radius:0}.commit-tease-comments{margin-right:15px}.commit-tease-sha{display:inline-block;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:90%;color:#444d56}.commit-tease-contributors{padding:5px 10px;margin:10px -10px -10px;background-color:#fff;border-top:1px solid #bedfff;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.commit-tease-contributors::before{display:table;content:\"\"}.commit-tease-contributors::after{display:table;clear:both;content:\"\"}.commit-tease-contributors .avatar-link{float:left;margin-right:3px}.commit-tease-contributors .loader-loading{margin:2px 5px 2px 0}.commit-tease-contributors.error .loader-loading{display:none}.commit-tease-contributors.error .loader-error{display:block}.commits-listing{position:relative;padding-bottom:20px;margin-bottom:15px}.commits-listing::before{position:absolute;top:0;bottom:0;left:14px;z-index:-1;display:block;width:2px;content:\"\";background-color:#eff1f3}.commits-listing .discussion-item-icon{margin-right:5px;margin-left:-1px}.commits-listing .timeline-commits{padding-left:8px;margin-bottom:20px}.commits-listing .timeline-commits:last-child{margin-bottom:0}.commits-listing-padded{padding-left:39px}.commit-group{margin-top:10px;list-style-type:none}.commit-group-title{margin-top:15px;margin-left:-31px;color:#586069}.commit-group-title .octicon-git-commit{margin-right:17px;color:#c6cbd1;background:#fff}.commits-list-item[aria-selected=\"true\"],.commits-list-item.navigation-focus{background:#f6fbff}.commits-list-item .commit-title{margin:0;font-size:15px;font-weight:600;color:#24292e}.commits-list-item .commit-meta{margin-top:1px;font-weight:400;color:#586069}.commits-list-item .status .octicon{height:14px;line-height:14px}.commits-list-item .commit-author{color:#586069}.commits-list-item .octicon-arrow-right{margin:0 3px}.commits-list-item .btn-outline{margin-top:2px}.commits-list-item .commit-desc pre{margin-top:5px;margin-bottom:10px;color:#586069}.commits-list-item .commit-desc pre a{word-break:break-word}.commits-list-item em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,247,140,0.5);border-radius:3px}.commit-indicator{margin-left:4px}.commit-links-cell{width:335px;text-align:right}.commit-links-group{margin-right:5px}.commits-list-item+.commits-list-item{border-top:1px solid #e1e4e8}.timeline-commits{width:100%;margin-top:5px;border-collapse:separate}.timeline-commits+.timeline-commits{margin-top:15px}.timeline-commits td{padding-top:4px;padding-right:8px;padding-bottom:4px;font-size:12px;line-height:16px;vertical-align:top;background-color:transparent}.discussion-item .timeline-commits .commit-author{display:none}.timeline-commits .author{font-weight:600;color:#444d56}.timeline-commits .commit-message{max-width:550px;min-height:0;flex-grow:2;white-space:normal}.timeline-commits .commit-message>code a{color:#444d56}.timeline-commits .commit-message>code a:hover{color:#0366d6}.timeline-commits .commit-desc pre{overflow:visible;color:#586069}.timeline-commits .hidden-text-expander .ellipsis-expander{height:13px;background-color:#eaecef}.timeline-commits .hidden-text-expander .ellipsis-expander:hover{color:#fff;background-color:#0366d6}.timeline-commits .commit-sig-status{width:60px;margin-left:auto}.timeline-commits .commit-ci-status{width:16px}.timeline-commits .commit-ci-status .octicon-primitive-dot{width:9px;margin-right:3px;margin-left:2px}.timeline-commits .commit-meta{width:50px}.commit-icon{color:#d1d5da}.commit-icon .octicon{background-color:#fff}.commit-id{color:#959da5}.commit-id:hover{color:#0366d6}.full-commit{padding:8px 8px 0;margin:10px 0;font-size:14px;background:#eaf5ff;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.full-commit:first-child{margin-top:0}.full-commit .btn-outline,.full-commit .btn-outline:disabled{background-color:transparent;border-color:rgba(27,31,35,0.15)}.full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.full-commit p.commit-title{margin:0 0 8px;font-size:18px;font-weight:600;color:#05264c}.full-commit .branches-list{display:inline;margin-right:10px;margin-left:2px;vertical-align:middle;list-style:none}.full-commit .branches-list li{display:inline-block;padding-left:3px;font-weight:600;color:#444d56}.full-commit .branches-list li::before{padding-right:6px;font-weight:400;content:\"+\"}.full-commit .branches-list li:first-child{padding-left:0}.full-commit .branches-list li:first-child::before{padding-right:0;content:\"\"}.full-commit .branches-list li.loading{font-weight:400;color:#6a737d}.full-commit .branches-list li.pull-request{font-weight:400;color:#6a737d}.full-commit .branches-list li.pull-request::before{margin-left:-8px;content:\"\"}.full-commit .branches-list li.pull-request-error{margin-bottom:-1px}.full-commit .branches-list li a{color:inherit}.full-commit .commit-meta{padding:8px;margin-right:-8px;margin-left:-8px;background:#fff;border-top:1px solid rgba(27,31,35,0.15);border-bottom-right-radius:3px;border-bottom-left-radius:3px}.full-commit .sha-block{margin-left:16px;font-size:12px;line-height:24px;color:#586069}.full-commit .sha-block>.sha{color:#444d56}.full-commit .sha-block>a{color:#444d56;text-decoration:none;border-bottom:1px dotted #c6cbd1}.full-commit .sha-block>a:hover{border-bottom:1px solid #444d56}.full-commit .commit-desc{display:block;margin:-5px 0 10px}.full-commit .commit-desc pre{max-width:100%;overflow:visible;font-size:13px;word-wrap:break-word}.branches-tag-list{display:inline;margin-right:10px;margin-left:2px;vertical-align:middle;list-style:none}.branches-tag-list .more-commit-details,.branches-tag-list.open .hidden-text-expander{display:none}.branches-tag-list.open .more-commit-details{display:inline-block}.branches-tag-list li{display:inline-block;padding-left:3px}.branches-tag-list li:first-child{padding-left:0;font-weight:600;color:#444d56}.branches-tag-list li.loading{font-weight:400;color:#6a737d}.branches-tag-list li.abbrev-tags{cursor:pointer}.branches-tag-list li a,.branches-tag-list li .ellipsis-expander{color:inherit}.branches-tag-list li .ellipsis-expander{background-color:#d3e2f4}.branches-tag-list li .ellipsis-expander:hover{background-color:#d6e2f1}.commit-branches{min-height:18px;margin-top:-6px;margin-bottom:8px;font-size:12px;color:#6a737d;vertical-align:middle}.commit-branches .octicon{vertical-align:middle}.commit-loader .loader-error{display:none;margin:0;font-size:12px;font-weight:600;color:#cb2431}.commit-loader.is-error .loader-loading{display:none}.commit-loader.is-error .loader-error{display:block}.commit-comments-heading{max-width:780px;margin-bottom:15px}.commit-comment-count{display:inline-block;margin-right:15px;margin-bottom:0}.commit-build-statuses{position:relative;display:inline-block;text-align:left}.commit-build-statuses .octicon-primitive-dot{width:10px}.commit-build-statuses.active .dropdown-menu-content{display:block}.commit-build-statuses.active .tooltipped::before,.commit-build-statuses.active .tooltipped::after{display:none}.commit-build-statuses .dropdown-menu{min-width:400px;max-width:500px;padding-top:0;padding-bottom:0}.commit-build-statuses .dropdown-menu .merge-status-list{max-height:170px;border-bottom:0}.commit-build-statuses .dropdown-menu-w,.commit-build-statuses .dropdown-menu-e{top:-11px}.commit-build-statuses .merge-status-item:last-child{border-radius:0 0 2px 2px}.dropdown-signed-commit .dropdown-menu{width:260px;margin-top:8px;font-size:13px;line-height:1.4}.dropdown-signed-commit .dropdown-menu::after{border-bottom-color:#f6f8fa}.dropdown-signed-commit .dropdown-menu-w{top:-28px;margin-top:0}.dropdown-signed-commit .dropdown-menu-w::after{border-bottom-color:transparent;border-left-color:#f6f8fa}.signed-commit-header{padding:12px;line-height:1.3;white-space:normal;border-collapse:separate;background-color:#f6f8fa;border-bottom:solid 1px #e1e4e8;border-top-left-radius:3px;border-top-right-radius:3px}.signed-commit-header .octicon-verified{color:#28a745}.signed-commit-header .octicon-unverified{color:#959da5}.signed-commit-signer{padding-right:12px;padding-left:12px;margin-top:12px;border-collapse:separate}.signed-commit-footer{padding:12px;font-size:12px;line-height:1.5}.signed-commit-cert-info{margin-bottom:6px}.signed-commit-cert-info td{vertical-align:top}.signed-commit-cert-info td:first-child{width:44px;padding-right:12px}.signed-commit-badge{display:inline-block;padding:1px 4px;font-size:10px;color:#586069;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:none;border:solid 1px #e1e4e8;border-radius:2px}.signed-commit-badge:hover{text-decoration:none;border-color:#c6cbd1}.signed-commit-badge.verified{color:#22863a}.signed-commit-badge.verified:hover{border-color:#28a745}.signed-commit-badge-small{margin-top:-2px;margin-right:3px}.signed-commit-badge-medium{padding:3px 8px;font-size:12px;border-radius:3px}.signed-commit-badge-large{padding:6px 12px;margin-top:2px;margin-right:9px;font-size:13px;line-height:20px;border-radius:3px}.signed-commit-verified-label{color:#1e7e34;white-space:nowrap}.signed-commit-signer-name{font-size:14px;text-align:left}.signed-commit-signer-name .signer{display:block;font-weight:600;color:#24292e}.table-of-contents{margin:15px 0}.table-of-contents li{padding:7px 0;list-style-type:none}.table-of-contents li+li{border-top:1px solid #eaecef}.table-of-contents li>.octicon{margin-right:3px}.table-of-contents .toc-diff-stats{padding-left:20px;line-height:26px}.table-of-contents .toc-diff-stats .octicon{float:left;margin-top:3px;margin-left:-20px;color:#c6cbd1}.table-of-contents .toc-diff-stats .btn-link{font-weight:600}.table-of-contents .toc-diff-stats+.content{padding-top:5px}.table-of-contents .octicon-diff-removed{color:#cb2431}.table-of-contents .octicon-diff-renamed{color:#6a737d}.table-of-contents .octicon-diff-modified{color:#dbab09}.table-of-contents .octicon-diff-added{color:#28a745}.toc-select .select-menu-modal{width:420px}.toc-select .select-menu-item .css-truncate{max-width:290px}.toc-select .select-menu-item-heading,.toc-select .select-menu-item-text{color:#24292e}.toc-select .select-menu-item-icon.octicon-diff-removed{color:#cb2431}.toc-select .select-menu-item-icon.octicon-diff-renamed{color:#6a737d}.toc-select .select-menu-item-icon.octicon-diff-modified{color:#dbab09}.toc-select .select-menu-item-icon.octicon-diff-added{color:#28a745}.toc-select[aria-selected=\"true\"] .select-menu-item-heading,.toc-select[aria-selected=\"true\"] .select-menu-item-text,.toc-select[aria-selected=\"true\"] .text-green,.toc-select[aria-selected=\"true\"] .text-red,.toc-select[aria-selected=\"true\"] .text-gray-light,.toc-select[aria-selected=\"true\"] .octicon-diff-removed,.toc-select[aria-selected=\"true\"] .octicon-diff-renamed,.toc-select[aria-selected=\"true\"] .octicon-diff-modified,.toc-select[aria-selected=\"true\"] .octicon-diff-added,.toc-select[aria-selected=\"true\"] .diffstat,.toc-select .navigation-focus .select-menu-item-heading,.toc-select .navigation-focus .select-menu-item-text,.toc-select .navigation-focus .text-green,.toc-select .navigation-focus .text-red,.toc-select .navigation-focus .text-gray-light,.toc-select .navigation-focus .octicon-diff-removed,.toc-select .navigation-focus .octicon-diff-renamed,.toc-select .navigation-focus .octicon-diff-modified,.toc-select .navigation-focus .octicon-diff-added,.toc-select .navigation-focus .diffstat{color:#fff !important}.select-menu-item+.semantic-toc-file,.semantic-toc-symbol:not(.last-visible){overflow:visible !important}.semantic-toc-symbol:not(.last-visible)::after,.select-menu-item+.semantic-toc-file::after{position:absolute;left:0;width:100%;height:16px;pointer-events:none;content:\" \";background-color:#f6f8fa;border-color:#e1e4e8;border-style:solid;border-width:1px 0}.semantic-toc-symbol:not(.last-visible){margin-bottom:16px}.semantic-toc-symbol:not(.last-visible)::after{bottom:-18px}.select-menu-item+.semantic-toc-file{margin-top:16px}.select-menu-item+.semantic-toc-file::after{top:-18px}.filterable-active .select-menu-item-nested{padding-left:16px !important;margin-left:0}.filterable-active .semantic-toc-symbol{margin-bottom:0}.filterable-active .semantic-toc-file{margin-top:0}.filterable-active .semantic-toc-symbol::after,.filterable-active .semantic-toc-file::after{display:none}.conversation-list-heading{height:0;margin:35px 0 10px;font-size:16px;font-weight:400;color:#6a737d;text-align:center;border-bottom:1px solid #dfe2e5}.conversation-list-heading .inner{position:relative;top:-10px;display:inline-block;padding:0 5px;background:#fff}.simple-conversation-list{margin:15px 0;font-size:13px;color:#6a737d}.simple-conversation-list>li{padding:11px 0 8px;margin:0;list-style-type:none;border-top:1px solid #f6f8fa}.simple-conversation-list>li:first-child{border-top:0}.simple-conversation-list>li .title{font-weight:600}.simple-conversation-list>li .num{color:#6a737d}.simple-conversation-list>li .state{padding-top:2px;padding-bottom:2px;margin-top:-3px;margin-right:3px}.simple-conversation-list>li .meta{float:right;margin-left:10px}.simple-conversation-list.varied-states>li .state{float:left;width:80px;margin-left:-90px}.copyable-terminal{position:relative;padding:10px 55px 10px 10px;background-color:#f6f8fa;border-radius:3px}.copyable-terminal-content{overflow:auto}.copyable-terminal-button{position:absolute;top:5px;right:5px}.copyable-terminal-button .zeroclipboard-button{float:right}.copyable-terminal-button .zeroclipboard-button .octicon{padding-left:1px;margin:0 auto}.Details--on .Details-content--shown{display:none !important}.Details:not(.Details--on) .Details-content--hidden{display:none !important}.Details-element[open]>summary .Details-content--closed{display:none !important}.Details-element:not([open])>summary .Details-content--open{display:none !important}.details-overlay[open]>.dropdown-item:hover{color:inherit;background:#fff}details-menu{display:block}.blob-wrapper{overflow-x:auto;overflow-y:hidden;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.blob-wrapper-embedded{max-height:240px;overflow-y:auto}.diff-table{width:100%;border-collapse:separate}.diff-table .line-comments{padding:10px;vertical-align:top;border-top:1px solid #e1e4e8}.diff-table .line-comments:first-child+.empty-cell{border-left-width:1px}.diff-table tr:not(:last-child) .line-comments{border-top:1px solid #e1e4e8;border-bottom:1px solid #e1e4e8}.blob-num{width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:12px;line-height:20px;color:rgba(27,31,35,0.3);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.blob-num:hover{color:rgba(27,31,35,0.6)}.blob-num::before{content:attr(data-line-number)}.blob-num.non-expandable{cursor:default}.blob-num.non-expandable:hover{color:rgba(27,31,35,0.3)}.blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}.blob-code-inner{overflow:visible;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:12px;color:#24292e;word-wrap:normal;white-space:pre}.blob-code-inner .x-first{border-top-left-radius:0.2em;border-bottom-left-radius:0.2em}.blob-code-inner .x-last{border-top-right-radius:0.2em;border-bottom-right-radius:0.2em}.blob-code-inner::before{content:\" \"}.blob-code-inner.highlighted{background-color:#fffbdd}.blob-code-marker-addition::before{content:\"+ \"}.blob-code-marker-deletion::before{content:\"- \"}.blob-code-marker-context::before{content:\"  \"}.soft-wrap .diff-table{table-layout:fixed}.soft-wrap .blob-code{padding-left:18px;text-indent:-7px}.soft-wrap .blob-code-inner{word-wrap:break-word;white-space:pre-wrap}.soft-wrap .no-nl-marker{display:none}.soft-wrap .add-line-comment{margin-left:-28px}.blob-num-hunk,.blob-code-hunk,.blob-num-expandable,.blob-code-expandable{color:rgba(27,31,35,0.5);vertical-align:middle}.blob-num-hunk,.blob-num-expandable{background-color:#dbedff}.blob-code-hunk,.blob-code-expandable{padding-top:4px;padding-bottom:4px;background-color:#f1f8ff;border-width:1px 0}.blob-expanded .blob-num,.blob-expanded .blob-code{background-color:#fafbfc}.blob-expanded+tr:not(.blob-expanded) .blob-num,.blob-expanded+tr:not(.blob-expanded) .blob-code{border-top:1px solid #eaecef}.blob-expanded .blob-num-hunk{border-top:1px solid #eaecef}tr:not(.blob-expanded)+.blob-expanded .blob-num,tr:not(.blob-expanded)+.blob-expanded .blob-code{border-top:1px solid #eaecef}.blob-num-expandable{padding:0;font-size:12px;text-align:center}.blob-num-expandable .octicon{vertical-align:top}.blob-num-expandable .diff-expander{display:block;width:auto;height:auto;padding:4px 11px 4px 10px;margin-right:-1px;color:#586069;cursor:pointer}.blob-num-expandable .diff-expander:hover{color:#fff;text-shadow:none;background-color:#0366d6;border-color:#0366d6}.blob-code-addition{background-color:#e6ffed}.blob-code-addition .x{color:#24292e;background-color:#acf2bd}.blob-num-addition{background-color:#cdffd8;border-color:#bef5cb}.blob-code-deletion{background-color:#ffeef0}.blob-code-deletion .x{color:#24292e;background-color:#fdb8c0}.blob-num-deletion{background-color:#ffdce0;border-color:#fdaeb7}.selected-line.blob-code{background-color:#fffbdd}.selected-line.blob-code .x{background-color:transparent}.selected-line.blob-num{background-color:#fff5b1;border-color:#ffea7f}.add-line-comment{position:relative;z-index:5;float:left;width:22px;height:22px;margin:-2px -10px -2px -20px;line-height:21px;color:#fff;text-align:center;text-indent:0;cursor:pointer;background-color:#0366d6;background-image:linear-gradient(#0372ef, #0366d6);border-radius:3px;box-shadow:0 1px 4px rgba(27,31,35,0.15);opacity:0;transition:transform 0.1s ease-in-out;transform:scale(0.8, 0.8)}.add-line-comment:hover{transform:scale(1, 1)}.is-hovered .add-line-comment,.add-line-comment:focus{opacity:1}.add-line-comment .octicon{vertical-align:text-top;pointer-events:none}.add-line-comment.octicon-check{background:#333;opacity:1}.inline-comment-form{border:1px solid #dfe2e5;border-radius:3px}.inline-review-comment{margin-top:0 !important;margin-bottom:10px !important}.inline-review-comment .gc:first-child+tr .blob-num,.inline-review-comment .gc:first-child+tr .blob-code{padding-top:5px}.inline-review-comment tr:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.inline-review-comment tr:last-child .blob-num,.inline-review-comment tr:last-child .blob-code{padding-bottom:8px}.inline-review-comment tr:last-child .blob-num:first-child,.inline-review-comment tr:last-child .blob-code:first-child{border-bottom-left-radius:2px}.inline-review-comment tr:last-child .blob-num:last-child,.inline-review-comment tr:last-child .blob-code:last-child{border-bottom-right-radius:2px}.timeline-inline-comments{width:100%;table-layout:fixed}.timeline-inline-comments .inline-comments,.show-inline-notes .inline-comments{display:table-row}.inline-comments{display:none}.inline-comments.is-collapsed{display:none}.inline-comments .line-comments.is-collapsed{visibility:hidden}.inline-comments .line-comments+.blob-num{border-left-width:1px}.inline-comments .timeline-comment{margin-bottom:10px}.inline-comments .inline-comment-form,.inline-comments .inline-comment-form-container{max-width:780px}.comment-holder{max-width:780px}.line-comments+.line-comments,.empty-cell+.line-comments{border-left:1px solid #eaecef}.inline-comment-form-container .inline-comment-form,.inline-comment-form-container.open .inline-comment-form-actions{display:none}.inline-comment-form-container .inline-comment-form-actions,.inline-comment-form-container.open .inline-comment-form{display:block}body.split-diff .container,body.split-diff .container-lg,body.full-width .container,body.full-width .container-lg{width:100%;max-width:none;padding-right:20px;padding-left:20px}body.split-diff .repository-content,body.full-width .repository-content{width:100%}body.split-diff .new-pr-form,body.full-width .new-pr-form{max-width:980px}body.split-diff .new-pr-form .discussion-sidebar,body.full-width .new-pr-form .discussion-sidebar{width:200px}.file-diff-split{table-layout:fixed}.file-diff-split .blob-code+.blob-num{border-left:1px solid #f6f8fa}.file-diff-split .blob-code-inner{word-wrap:break-word;white-space:pre-wrap}.file-diff-split .empty-cell{cursor:default;background-color:#fafbfc;border-right-color:#eaecef}.submodule-diff-stats .octicon-diff-removed{color:#cb2431}.submodule-diff-stats .octicon-diff-renamed{color:#677a85}.submodule-diff-stats .octicon-diff-modified{color:#d0b44c}.submodule-diff-stats .octicon-diff-added{color:#28a745}.BlobToolbar{left:-17px}.BlobToolbar-dropdown{margin-left:-2px}.diffstat{font-size:12px;font-weight:600;color:#586069;white-space:nowrap;cursor:default}.block-diff-deleted,.block-diff-added,.block-diff-neutral{display:inline-block;width:8px;height:8px;margin-left:1px}.block-diff-deleted,.text-red .block-diff-neutral{background-color:#cb2431}.block-diff-added,.block-diff-neutral{background-color:#2cbe4e}.block-diff-neutral{background-color:#d1d5da}.discussion-timeline{position:relative;float:left;width:760px}.discussion-timeline::before{position:absolute;top:0;bottom:0;left:79px;z-index:-1;display:block;width:2px;content:\"\";background-color:#e6ebf1}.discussion-timeline.team-discussion-timeline::before{bottom:24px;left:20px;z-index:auto;background-color:#e1e4e8}.discussion-timeline.team-discussion-timeline .blankslate{background:#fff}.discussion-sidebar{top:0;z-index:21;float:right;width:200px}.discussion-sidebar-item{padding-top:15px;font-size:12px;color:#586069}.discussion-sidebar-item .btn .octicon{margin-right:0}.discussion-sidebar-item+.discussion-sidebar-item{margin-top:15px;border-top:1px solid #e6ebf1}.discussion-sidebar-item .select-menu{position:relative}.discussion-sidebar-item .select-menu-modal-holder{top:25px;right:-1px;left:auto}.discussion-sidebar-heading{margin-bottom:10px;font-size:12px;line-height:16px;color:#586069}.discussion-sidebar-toggle{padding:5px 0;margin:-5px 0 5px}.discussion-sidebar-toggle .octicon{float:right;color:#c3c8cf}.discussion-sidebar-toggle:hover{color:#0366d6;text-decoration:none;cursor:pointer}.discussion-sidebar-toggle:hover .octicon{color:inherit}button.discussion-sidebar-toggle{display:block;width:100%;font-weight:600;text-align:left;background:none;border:0}.sidebar-milestone .progress-bar,.sidebar-projects .progress-bar{height:8px;margin-bottom:2px;border-radius:2px}.milestone-name{display:block;margin-top:5px;font-weight:600;color:#586069}.milestone-name .css-truncate-target{max-width:100%}.milestone-name:hover{color:#0366d6;text-decoration:none}.sidebar-assignee .css-truncate-target{max-width:110px}.sidebar-assignee .assignee{font-weight:600;color:#586069;vertical-align:middle}.sidebar-assignee .assignee:hover{color:#0366d6;text-decoration:none}.sidebar-assignee .reviewers-status-icon{width:14px}.sidebar-assignee .octicon{margin-top:2px}.sidebar-notifications{position:relative}.sidebar-notifications .thread-subscription-status{padding:0;margin:0;border:0}.sidebar-notifications .thread-subscription-status .thread-subscribe-form{display:block}.sidebar-notifications .thread-subscription-status .octicon-radio-tower{display:none}.sidebar-notifications .thread-subscription-status .reason{padding:0;margin:5px 0 0}.sidebar-notifications .thread-subscription-status .btn-sm{display:block;width:100%}.participation .participant-avatar{float:left;margin:3px 0 0 3px}.participation a{color:#586069}.participation a:hover{color:#0366d6;text-decoration:none}.participation-avatars{margin-left:-3px}.participation-avatars::before{display:table;content:\"\"}.participation-avatars::after{display:table;clear:both;content:\"\"}.participation-more{float:left;margin:6px 0 0;line-height:14px}.inline-comment-form .form-actions,.timeline-new-comment .form-actions{padding:0 10px 10px}.inline-comment-form::before{display:table;content:\"\"}.inline-comment-form::after{display:table;clear:both;content:\"\"}.inline-comment-form .tabnav-tabs{display:inline-block}.inline-comment-form .form-actions{float:right}.gh-header-actions{float:right;margin-top:3px}.gh-header-actions .btn-sm{float:left;margin-left:5px}.gh-header-actions .btn-sm .octicon{margin-right:0}.gh-header .gh-header-edit{display:none}.gh-header .gh-header-meta .base-ref{display:inline-block}.gh-header .gh-header-meta .commit-ref-dropdown{display:none}.gh-header.open .gh-header-show{display:none}.gh-header.open .gh-header-edit{display:block}.gh-header.open .gh-header-meta .base-ref{display:none}.gh-header.open .gh-header-meta .commit-ref-dropdown{display:inline-block;margin-top:-3px;margin-bottom:-1px;vertical-align:top}.gh-header-title{margin-right:150px;margin-bottom:0;font-weight:400;line-height:1.125;word-wrap:break-word}.gh-header-no-access .gh-header-title{margin-right:0}.gh-header-number{font-weight:300;color:#a3aab1;letter-spacing:-1px}.gh-header-edit::before{display:table;content:\"\"}.gh-header-edit::after{display:table;clear:both;content:\"\"}.gh-header-edit .edit-issue-title{float:left;width:760px;padding:7px 10px;margin-right:10px;font-size:16px;background-color:#fafbfc}.gh-header-edit .edit-issue-title:focus{background-color:#fff}.gh-header-edit .btn{float:left;padding:7px 15px}.gh-header-edit .btn-link{float:left;margin:7px 10px}.gh-header-meta{padding-bottom:20px;margin-top:8px;font-size:14px;line-height:20px;color:#586069;border-bottom:1px solid #e6ebf1}.gh-header.issue .gh-header-meta{margin-bottom:15px}.gh-header.pull .gh-header-meta{padding-bottom:0;border-bottom:0}.gh-header-meta .TableObject-item--primary{word-wrap:break-word;white-space:normal}.gh-header-meta .TableObject-item--primary .commit-ref .css-truncate-target,.gh-header-meta .TableObject-item--primary .commit-ref:hover .css-truncate-target{max-width:780px !important}.gh-header-meta .State{margin-right:8px}.gh-header-meta .avatar{float:left;margin-top:-3px;margin-right:5px}.gh-header-meta .author{font-weight:600;color:#586069}.gh-header-meta .noun{text-transform:lowercase}.tabnav-pr{margin:15px 0 20px;border-color:#e1e4e8}.tabnav-pr .tabnav-tab{position:relative;padding:9px 14px;font-size:13px;color:#586069}.tabnav-pr .tabnav-tab.selected{color:#24292e;border-color:#e1e4e8}.timeline-comment-wrapper>.timeline-comment::after,.timeline-comment-wrapper>.timeline-comment::before,.timeline-new-comment .timeline-comment::after,.timeline-new-comment .timeline-comment::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:\" \";border-color:transparent;border-style:solid solid outset}.timeline-comment-wrapper>.timeline-comment::after,.timeline-new-comment .timeline-comment::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#f6f8fa}.timeline-comment-wrapper>.timeline-comment::before,.timeline-new-comment .timeline-comment::before{border-width:8px;border-right-color:#d1d5da}.timeline-comment-wrapper{position:relative;padding-left:60px;margin-top:15px;margin-bottom:15px;border-top:2px solid #fff;border-bottom:2px solid #fff}.timeline-comment-wrapper .timeline-comment.current-user::after,.timeline-comment-wrapper .timeline-comment.current-user::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:\" \";border-color:transparent;border-style:solid solid outset}.timeline-comment-wrapper .timeline-comment.current-user::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#f1f8ff}.timeline-comment-wrapper .timeline-comment.current-user::before{border-width:8px;border-right-color:#c0d3eb}.timeline-comment-wrapper .timeline-comment.unread-item::after,.timeline-comment-wrapper .timeline-comment.unread-item::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:\" \";border-color:transparent;border-style:solid solid outset}.timeline-comment-wrapper .timeline-comment.unread-item::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fffdef}.timeline-comment-wrapper .timeline-comment.unread-item::before{border-width:8px;border-right-color:#e5d999}.timeline-comment-avatar{float:left;margin-left:-60px;border-radius:3px}.timeline-comment{position:relative;background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.timeline-comment.will-transition-once{transition:border-color .65s ease-in-out}.timeline-comment.will-transition-once .timeline-comment-header{transition:background-color .65s ease,border-bottom-color .65s ease-in-out}.timeline-comment.will-transition-once .timeline-comment-label{transition:border-color .65s ease-in-out}.timeline-comment.will-transition-once::before,.timeline-comment.will-transition-once::after{transition:border-right-color .65s ease-in-out}.timeline-comment.current-user{border-color:#c0d3eb}.timeline-comment.current-user .timeline-comment-header{background-color:#f1f8ff;border-bottom-color:#c0d3eb}.timeline-comment.current-user .timeline-comment-label{border-color:#c0d3eb}.timeline-comment.current-user .previewable-comment-form .comment-form-head.tabnav{color:#c0d3eb;background-color:#f1f8ff;border-bottom-color:#c0d3eb}.timeline-comment.unread-item{border-color:#e5d999}.timeline-comment.unread-item .timeline-comment-header{background-color:#fffdef;border-bottom-color:#e5d999}.timeline-comment.unread-item .timeline-comment-label{border-color:#e5d999}.timeline-comment.unread-item .previewable-comment-form .comment-form-head.tabnav{color:#e5d999;background-color:#fffdef;border-bottom-color:#e5d999}.timeline-comment:empty{display:none}.timeline-comment .comment+.comment{border-top:1px solid #e1e4e8}.timeline-comment .comment+.comment::before,.timeline-comment .comment+.comment::after{display:none}.timeline-comment .comment+.comment .timeline-comment-header{border-top-left-radius:0;border-top-right-radius:0}.timeline-comment-group:target .timeline-comment{border-color:#2188ff;box-shadow:0 0 0 0.2em #c8e1ff}.timeline-comment-group:target .timeline-comment::before{filter:drop-shadow(-0.25em 0 0 #c8e1ff);border-right-color:#2188ff}.review-comment:target{border:1px solid #2188ff;border-radius:3px;box-shadow:0 0 0 0.2em #c8e1ff}.timeline-comment:target .review-summary{box-shadow:0 0 0 0.2em #c8e1ff}.timeline-comment:target .review-summary::before{filter:drop-shadow(0 -0.28em 0 #c8e1ff);border-bottom-color:#2188ff}.timeline-comment:target .review-summary .comment-body{border:1px solid #2188ff;border-radius:3px}.timeline-comment-header{padding-right:15px;padding-left:15px;color:#586069;background-color:#f6f8fa;border-bottom:1px solid #d1d5da;border-top-left-radius:3px;border-top-right-radius:3px}.timeline-comment-header:only-child{border-bottom:0;border-radius:3px}.timeline-comment-header .author{color:#586069}.timeline-comment-header .timestamp{color:inherit;white-space:nowrap}.timeline-comment-header .timestamp.timestamp-edited{cursor:default}.timeline-comment-header code{word-break:break-all}.comment-type-icon{color:inherit}.timeline-comment-label{float:right;padding:2px 5px;margin:8px 0 0 10px;font-size:12px;cursor:default;border:1px solid rgba(27,31,35,0.1);border-radius:3px}.timeline-comment-label-spammy{color:#cb2431;border-color:#d73a49}.timeline-comment-header-text{max-width:78%;padding-top:10px;padding-bottom:10px}.timeline-comment-header-text code a{color:#586069}.timeline-comment-actions{float:right;margin-right:-5px;margin-left:10px}.timeline-comment-actions .show-more-popover.dropdown-menu-sw{right:-6px;margin-top:-5px}.timeline-comment-action{display:inline-block;padding:10px 5px;color:inherit;opacity:0.5}.timeline-comment-action:hover,.timeline-comment-action:focus{color:#0366d6;text-decoration:none;opacity:1}.timeline-comment-action .octicon-check{height:16px;font-size:18px}.timeline-comment-action.disabled{color:#b1b7bc;cursor:default}.timeline-comment-action.disabled:hover{color:#b1b7bc}.compare-tab-comments .timeline-comment-actions{display:none}.timeline-new-comment{max-width:780px;margin-bottom:0}.timeline-new-comment .comment-form-head{margin-bottom:10px}.timeline-new-comment .previewable-comment-form .comment-body{padding:5px 5px 15px;border-bottom:1px solid #e1e4e8}.discussion-item+.discussion-item,.discussion-item-review+.discussion-item{padding-top:15px;border-top:1px solid #e6ebf1}.discussion-item+.discussion-item-review{padding-top:8px;border-top:1px solid #e6ebf1}.discussion-item{position:relative;padding-left:25px;margin:15px 0 15px 79px}.discussion-item .author{font-weight:600;color:#586069}.discussion-item .timestamp{color:inherit;white-space:nowrap}.discussion-item.open .discussion-item-details{display:block}.discussion-item.open .discussion-item-toggler-opened{display:inline}.discussion-item.open .discussion-item-toggler-closed{display:none}.discussion-item .code-owner{color:inherit}.discussion-item-details{display:none}.discussion-item-deployed{padding-top:15px;border-top:1px solid #e6ebf1}.discussion-item-toggler-opened{display:none}.discussion-item-icon{float:left;width:32px;height:32px;margin-top:-7px;margin-left:-40px;line-height:28px;color:#586069;text-align:center;background-color:#e6ebf1;border:2px solid #fff;border-radius:50%}.discussion-item-icon .octicon-pencil{font-size:14px}.discussion-item-header{min-height:30px;padding-top:5px;padding-bottom:5px;line-height:22px;color:#586069;word-wrap:break-word}.discussion-item-header .avatar{width:16px;height:16px}.discussion-item-header .discussion-item-private{vertical-align:-1px}.discussion-item-header:last-child{padding-bottom:0}.discussion-item-header .commit-ref{font-size:85%;vertical-align:baseline}.discussion-item-header .btn-outline{float:right;padding:4px 8px;margin-top:-5px;margin-left:10px}.discussion-item-body{margin-top:5px}.discussion-item-footer{font-size:12px}.discussion-item-link{color:#586069}.discussion-item-link:hover{color:#0366d6}.discussion-item-entity{font-weight:600;color:#24292e}.discussion-item-entity:hover{color:#0366d6;text-decoration:none}.discussion-item-ref-title .issue-num{font-weight:400;color:#586069}.discussion-item-ref-title .title-link{color:#24292e}.discussion-item-ref-title .title-link:hover{color:#0366d6;text-decoration:none}.discussion-item-ref-title .title-link:hover .issue-num{color:inherit}.discussion-item-context-icon{display:inline-block;margin-left:10px;line-height:22px}.discussion-item-help{color:#586069}.discussion-item-help:hover{color:#0366d6}.discussion-item-private{color:rgba(27,31,35,0.7)}.discussion-item-rollup-ref .State{margin-top:2px}.discussion-item-rollup-ref .discussion-item-context-icon{margin-top:2px}.discussion-item-reopened .discussion-item-icon,.discussion-item-review.is-approved.is-writer .discussion-item-icon{color:#fff;background-color:#2cbe4e}.discussion-item-closed .discussion-item-icon,.discussion-item-review.is-rejected.is-writer .discussion-item-icon{color:#fff;background-color:#cb2431}.discussion-item-head_ref_deleted .discussion-item-icon{padding-left:1px;color:#fff;background-color:#6a737d}.discussion-item-locked .discussion-item-icon,.discussion-item-unlocked .discussion-item-icon{color:#fff;background-color:#24292e}.discussion-item-integrations-callout .discussion-item-icon{color:#fff;background-color:#428ade}.discussion-item-integrations-callout .pull-request-integrations-dismiss{padding:4px 8px;margin:-3px 0 0 10px;color:#586069}.pull-request-integrations-title{margin:0;font-size:15px;color:#24292e}.pull-request-integrations-body{margin-top:5px;color:#586069}.discussion-item .renamed-was,.discussion-item .renamed-is{font-weight:600;color:#24292e}.discussion-commits .discussion-item-icon{padding-top:1px}.discussion-commits .discussion-item-body{margin-top:0;margin-left:-31px}.discussion-item-changes-marker{margin-bottom:0}.discussion-item-changes-marker .discussion-item-icon{color:#fff;background-color:#0366d6}.discussion-item-changes-marker+.discussion-commits{padding-top:0;margin-top:0;border-top:0}.discussion-item-changes-marker+.discussion-commits .discussion-item-icon{display:none}.new-discussion-timeline .previewable-comment-form .comment-form-head.tabnav{padding:6px 10px 0;background:#f6f8fa;border-radius:3px 3px 0 0}.new-discussion-timeline .previewable-comment-form .comment{border:0}.new-discussion-timeline .previewable-comment-form .comment-body{padding:5px 5px 15px;background-color:transparent;border-bottom:1px solid #e1e4e8}.new-discussion-timeline .previewable-comment-form .timeline-comment .timeline-comment-actions{display:none}.new-discussion-timeline .closed-banner{position:relative;height:19px;margin:15px 0 -15px;overflow:visible;background:#e6ebf1;border-bottom:15px solid #fff;border-radius:0}.new-discussion-timeline .composer .timeline-comment{margin-bottom:10px}.new-discussion-timeline .composer .timeline-comment::after{border-right-color:#fff}.new-discussion-timeline .composer .comment-form-head.tabnav{padding-top:0;background-color:#fff}.discussion-timeline-actions{background-color:#fff;border-top:2px solid #e6ebf1}.discussion-timeline-actions .merge-pr{padding-top:0;border-top:0}.discussion-timeline-actions .thread-subscription-status{margin-top:20px}.discussion-timeline-actions .thread-subscription-status .octicon-radio-tower{display:none}.discussion-item-merged .discussion-item-icon{padding-left:1px;color:#fff;background-color:#6f42c1}.discussion-item-merged.open .discussion-item-footer{display:none}.discussion-item-merged.open .discussion-item-details{margin-top:5px;margin-bottom:10px;border:1px solid #d1d5da;border-radius:3px}.discussion-item-merged.open .discussion-item-details-header{padding:12px 15px;margin-top:0;margin-bottom:0;font-size:inherit;border-top:1px solid #d1d5da}.discussion-item-merged.open .discussion-item-details-header:first-child{border-top:0}.discussion-item-merged.open .merge-status-list{max-height:370px;margin:0;border-top-color:#d1d5da}.discussion-item-merged.open .merge-status-item{padding-left:15px}.pagination-loader-container{background-color:#fff;background-image:url(\"/images/modules/pulls/progressive-disclosure-line@2x.png\");background-repeat:repeat-x;background-position:left center;background-size:32px}.progressive-timeline-loader-container{padding-left:64px}.deployment-icon .octicon-rocket{position:relative;bottom:-1px;left:-1px}.environment-name{color:#586069}.deployment-meta{font-size:12px;color:#586069}.deployment-meta .octicon{color:#c3c8cf}.deployment-status-label{display:inline-block;padding:1px 4px;margin-top:-2px;margin-right:3px;font-size:10px;line-height:16px;color:#6a737d;vertical-align:middle;background:none;border:solid 1px #e1e4e8;border-radius:2px}.deployment-status-label.is-error,.deployment-status-label.is-failure{color:#cb2431;text-align:center}.deployment-status-label.is-active{color:#28a745}.deployment-status-label.is-pending,.deployment-status-label.is-queued,.deployment-status-label.is-in_progress{color:#b08800}.discussion-item-review{padding-left:0;margin:20px 0 20px 80px;border:0}.discussion-item-review .discussion-item{margin-left:-30px}.discussion-item-review .discussion-item-copy{max-width:460px}.discussion-item-review .discussion-item-body{margin-left:25px}.discussion-item-review .file-header{padding:2px 12px;background-color:#fafbfc;border-bottom:1px solid #d1d5da;border-top-left-radius:3px;border-top-right-radius:3px}.discussion-item-review .blob-wrapper{border-bottom-right-radius:0;border-bottom-left-radius:0}.discussion-item-review .timeline-comment{background-color:transparent;border:0}.discussion-item-review .timeline-comment::before,.discussion-item-review .timeline-comment::after{display:none}.discussion-item-review .timeline-comment .timeline-comment-header{padding-right:5px;background-color:inherit;border:0}.discussion-item-review .timeline-comment .discussion-item-icon{margin-right:8px;margin-left:-11px}.discussion-item-review .timeline-comment-avatar{margin-top:-7px;margin-left:-80px}.discussion-item-review.is-pending .form-actions{margin-right:10px;margin-bottom:5px}.discussion-item-review.is-pending .file,.discussion-item-review.is-pending .file-header,.discussion-item-review.is-pending .tabnav-tab.selected,.discussion-item-review.is-pending .comment-form-head.tabnav{border-color:#d9d0a5}.discussion-item-review.is-pending .file-header,.discussion-item-review.is-pending .comment-form-head.tabnav{background-color:#fffdef}.discussion-item-review-comment{border-bottom:1px solid #e1e4e8}.discussion-item-review-comment:last-child{border-bottom:0}.review-summary{position:relative;margin-left:-20px}.review-summary::after,.review-summary::before{position:absolute;left:11px;content:\" \";border-color:transparent transparent #fff;border-style:solid;border-width:8px}.review-summary::after{top:-15px;border-bottom-color:#fff}.review-summary::before{top:-16px;border-bottom-color:#d1d5da}.discussion-item-icon-gray{background-color:#e6ebf1 !important}.dropdown{position:relative}.dropdown.active .dropdown-menu-content{display:block;pointer-events:all}.dropdown-caret{display:inline-block;width:0;height:0;vertical-align:middle;content:\"\";border:4px solid;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.dropdown-menu{position:absolute;top:100%;left:0;z-index:100;width:160px;padding-top:5px;padding-bottom:5px;margin-top:2px;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(27,31,35,0.15);border-radius:4px;box-shadow:0 3px 12px rgba(27,31,35,0.15)}.dropdown-menu::before,.dropdown-menu::after{position:absolute;display:inline-block;content:\"\"}.dropdown-menu::before{border:8px solid transparent;border-bottom-color:rgba(27,31,35,0.15)}.dropdown-menu::after{border:7px solid transparent;border-bottom-color:#fff}.dropdown-menu>ul{list-style:none}.dropdown-menu-no-overflow{width:auto}.dropdown-menu-no-overflow .dropdown-item{padding:4px 15px;overflow:visible;text-overflow:inherit}.dropdown-item{display:block;padding:4px 10px 4px 15px;overflow:hidden;color:#24292e;text-overflow:ellipsis;white-space:nowrap}.dropdown-item:focus,.dropdown-item:hover,.dropdown-item.zeroclipboard-is-hover{color:#fff;text-decoration:none;background-color:#0366d6;outline:none}.dropdown-item:focus>.octicon,.dropdown-item:hover>.octicon,.dropdown-item.zeroclipboard-is-hover>.octicon{color:inherit;opacity:1}.dropdown-item.btn-link{width:100%;text-align:left}.dropdown-signout{width:100%;text-align:left;background:none;border:0}.dropdown-divider{height:1px;margin:8px 1px;background-color:#e1e4e8}.dropdown-header{padding:4px 15px;font-size:12px;color:#586069}.dropdown-menu-content{display:none}.dropdown-menu-content.anim-scale-in{position:relative;z-index:100;pointer-events:none}.dropdown-menu-w{top:0;right:100%;left:auto;width:auto;margin-top:0;margin-right:10px}.dropdown-menu-w::before{top:10px;right:-16px;left:auto;border-color:transparent;border-left-color:rgba(27,31,35,0.15)}.dropdown-menu-w::after{top:11px;right:-14px;left:auto;border-color:transparent;border-left-color:#fff}.dropdown-menu-e{top:0;left:100%;width:auto;margin-top:0;margin-left:10px}.dropdown-menu-e::before{top:10px;left:-16px;border-color:transparent;border-right-color:rgba(27,31,35,0.15)}.dropdown-menu-e::after{top:11px;left:-14px;border-color:transparent;border-right-color:#fff}.dropdown-menu-ne{top:auto;bottom:100%;left:0;margin-bottom:3px}.dropdown-menu-ne::before,.dropdown-menu-ne::after{top:auto;right:auto}.dropdown-menu-ne::before{bottom:-8px;left:9px;border-top:8px solid rgba(27,31,35,0.15);border-right:8px solid transparent;border-bottom:0;border-left:8px solid transparent}.dropdown-menu-ne::after{bottom:-7px;left:10px;border-top:7px solid #fff;border-right:7px solid transparent;border-bottom:0;border-left:7px solid transparent}.dropdown-menu-s{right:50%;left:auto;transform:translateX(50%)}.dropdown-menu-s::before{top:-16px;right:50%;transform:translateX(50%)}.dropdown-menu-s::after{top:-14px;right:50%;transform:translateX(50%)}.dropdown-menu-sw{right:0;left:auto}.dropdown-menu-sw::before{top:-16px;right:9px;left:auto}.dropdown-menu-sw::after{top:-14px;right:10px;left:auto}.dropdown-menu-se::before{top:-16px;left:9px}.dropdown-menu-se::after{top:-14px;left:10px}g-emoji{font-family:\"Apple Color Emoji\", \"Segoe UI\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";font-size:1.2em;font-weight:400;line-height:20px;vertical-align:middle}g-emoji img{width:1em;height:1em}body.emoji-size-boost g-emoji{margin-right:3px}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){body.emoji-size-boost g-emoji{margin-right:0;font-size:1.4em}}.emoji-icon{display:inline-block;width:20px;height:20px;vertical-align:middle;background-repeat:no-repeat;background-size:20px 20px}.emoji-result{display:inline-block;height:20px;font-size:18px;font-weight:400;vertical-align:middle}.facebox{position:absolute;top:0;left:0;z-index:100;padding-bottom:40px}.facebox ul{margin-bottom:15px;margin-left:25px}.facebox .suggester ul{margin:0}.facebox-popup{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid rgba(27,31,35,0.25);border-radius:5px;box-shadow:0 0 18px rgba(27,31,35,0.4)}.facebox-content{width:455px;padding:15px}.facebox-content::before{display:table;content:\"\"}.facebox-content::after{display:table;clear:both;content:\"\"}.facebox-close{position:absolute;top:8px;right:5px;padding:10px;cursor:pointer;background-color:transparent;border:0;opacity:0.25;-webkit-appearance:none;-moz-appearance:none;appearance:none}.facebox-close:hover{opacity:1}.facebox-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.facebox-overlay-hide{z-index:-100}.facebox-overlay-active{z-index:99}.facebox-header{padding:15px;margin:-15px -15px 15px;font-size:18px;font-weight:400;border-bottom:1px solid #e1e4e8}.facebox-header:focus{outline:none}.facebox-footer{padding:10px 15px;margin:0 -15px -15px;text-align:right;background:#fafbfc;border-top:1px solid #e1e4e8;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.facebox-footer .help{margin:0;color:#586069;text-align:center}.facebox-alert{padding:10px 15px;margin:-16px -15px 15px;color:#735c0f;background-color:#ffea7f;border-color:rgba(176,136,0,0.3);border-style:solid;border-width:1px 0}.keyboard-shortcuts{float:right}.keyboard-mappings{font-size:12px;color:#444d56}.keyboard-mappings th{padding-top:25px;font-size:14px;line-height:1.5;color:#24292e;text-align:left}.keyboard-mappings tbody:first-child tr:first-child th{padding-top:0}.keyboard-mappings td{padding-top:3px;padding-bottom:3px;line-height:20px;vertical-align:top}.keyboard-mappings .keys{padding-right:10px;color:#586069;text-align:right;white-space:nowrap}.linejump .linejump-input{width:340px;background-color:#fafbfc}.linejump .linejump-input,.linejump .btn{padding:10px 15px;font-size:16px}.linejump+.facebox-close{top:18px}.repo-transfer-tip{margin-bottom:0}.flash-banner{position:fixed;top:0;z-index:90;width:100%;border-top:0;border-right:0;border-left:0;border-radius:0}.signed-in-tab-flash,.signed-out-tab-flash{display:none}.stale-session-flash.is-signed-in .signed-in-tab-flash{display:inline}.stale-session-flash.is-signed-out .signed-out-tab-flash{display:inline}.org-privileges-tour-dismiss{padding:4px 8px;margin:-3px 0 0 10px;color:#586069}.footer-octicon{color:#c6cbd1}.footer-octicon:hover{color:#959da5}.page-responsive .footer .footer-octicon{display:none}@media (min-width: 1012px){.page-responsive .footer .footer-octicon{display:block}}.gollum-editor .comment-form-head.tabnav{border:1px solid #dfe2e5}.gollum-editor .gollum-editor-body{height:390px;resize:vertical}.active .gollum-editor-function-buttons{display:block !important}include-fragment,poll-include-fragment{display:block}kbd{display:inline-block;padding:3px 5px;font:11px \"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #d1d5da;border-bottom-color:#c6cbd1;border-radius:3px;box-shadow:inset 0 -1px 0 #c6cbd1}.badmono{font-family:sans-serif;font-weight:600}.IssueLabel{height:20px;padding:0.15em 4px;font-size:12px;font-weight:600;line-height:15px;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(27,31,35,0.12)}.IssueLabel .g-emoji{position:relative;top:-0.05em;display:inline-block;font-size:1em;line-height:1}.IssueLabel:hover{text-decoration:none}.IssueLabel--big{padding:0 8px;font-size:16px;font-weight:600;line-height:2;border-radius:3px;transition:opacity 0.2s linear}.IssueLabel--big .g-emoji{display:inline-block;margin-top:-1px}.IssueLabel--big:hover{opacity:0.85}.list-group-item{position:relative;display:block;padding:8px 10px 10px 40px;margin-bottom:-1px;border:1px solid #e1e4e8}.list-group-item::before{display:table;content:\"\"}.list-group-item::after{display:table;clear:both;content:\"\"}.list-group-item a:hover{text-decoration:none}.list-group-item:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.list-group-item.closed{background-color:#fafbfc}.list-group-item.selectable{padding-left:60px}.list-group-item.selected{background-color:#fffdef}.list-group-item[aria-selected=\"true\"],.list-group-item.navigation-focus{background-color:#f1f8ff}.list-group-item .list-group-item-summary a{color:#586069}.list-group-item .list-group-item-summary a.quiet{color:#6a737d}.list-group-item .status{position:relative;top:2px;float:right;margin-right:-9px}.list-group-item .type-icon{position:relative;top:1px;width:16px;text-align:center;vertical-align:middle}.list-group-item .assignee{float:right}.list-group-item .assignee img{display:block;border-radius:2px}.list-group-item .labels{top:-2px;display:inline-block;margin-bottom:-2px;margin-left:4px}.list-group-item-name{margin:0 60px 2px 0;font-size:15px;line-height:1.3;word-wrap:break-word}.list-group-item-name .type-icon{float:left;margin-top:1px;margin-left:-24px}.list-group-item-link{color:#24292e}.closed.octicon,.reverted.octicon{color:#cb2431}.open.octicon{color:#28a745}.merged.octicon{color:#6f42c1}.list-group-item-summary{margin-top:2px}.list-group-item-summary p{margin:0 0 5px}.standalone .list-group-item-summary p{margin-bottom:0}.animated-ellipsis-container{display:inline-block;width:12px;height:12px;overflow:hidden;transform:translateZ(0)}.animated-ellipsis-container>.animated-ellipsis{display:inline-block;overflow:hidden;vertical-align:bottom;animation:ellipsis 1s infinite}@keyframes ellipsis{from{width:2px}to{width:12px}}.large-loading-area{padding:100px 0;text-align:center}.user-mention,.team-mention{font-weight:600;color:#24292e;white-space:nowrap}.pagehead{position:relative;padding-top:20px;padding-bottom:20px;margin-bottom:20px}@media (min-width: 1012px){.pagehead{border-bottom:1px solid #e1e4e8}}.pagehead.admin{background:url(\"/images/modules/pagehead/background-yellowhatch-v3.png\") 0 0 repeat-x}.pagehead ul.pagehead-actions{position:relative;z-index:31;float:right;margin:0}.pagehead .path-divider{margin:0 0.25em}.pagehead h1{margin-top:0;margin-bottom:0;font-size:20px;font-weight:400;line-height:28px}.pagehead h1 .avatar{margin-top:-2px;margin-right:9px;margin-bottom:-2px}.pagehead .account-switcher{margin-top:-3px;margin-bottom:-3px}.pagehead .underline-nav{height:69px;margin-top:-20px;margin-bottom:-20px}.pagehead-heading{color:inherit}.pagehead-actions>li{float:left;margin:0 10px 0 0;font-size:11px;color:#24292e;list-style-type:none}.pagehead-actions>li:last-child{margin-right:0}.pagehead-actions .octicon-mute{color:#cb2431}.pagehead-actions .select-menu{position:relative}.pagehead-actions .select-menu::before{display:table;content:\"\"}.pagehead-actions .select-menu::after{display:table;clear:both;content:\"\"}.pagehead-actions .select-menu-modal-holder{top:100%}.pagehead-tabs-item{float:left;padding:8px 15px 11px;color:#586069;white-space:nowrap;border:solid transparent;border-width:3px 1px 1px;border-radius:3px 3px 0 0}.pagehead-tabs-item .octicon{color:rgba(27,31,35,0.3)}.pagehead-tabs-item .Counter{color:#444d56}.pagehead-tabs-item:hover{color:#24292e;text-decoration:none}.pagehead-tabs-item.selected{font-weight:600;color:#24292e;background-color:#fff;border-color:#e36209 #e1e4e8 transparent}.pagehead-tabs-item.selected>.octicon{color:inherit}.repohead.experiment-repo-nav{padding-bottom:0;background-color:#fafbfc}.repohead .repohead-details-container{margin-bottom:20px}.repohead.mirror h1,.repohead.fork h1{height:auto;margin-top:-5px;margin-bottom:15px}.repohead h1{position:relative;float:left;max-width:635px;padding-left:18px;font-size:18px;line-height:26px;color:#586069}.repohead h1.private .octicon{color:rgba(27,31,35,0.5)}.repohead h1 .octicon{position:absolute;top:0;left:0;margin-top:5px;color:#959da5}.repohead .octicon-mirror{left:-3px}.repohead .octicon-lock{top:10px}.repohead .fork-flag,.repohead .mirror-flag{display:block;font-size:11px;line-height:10px;white-space:nowrap}.reponav{position:relative;top:1px;margin-top:-5px}.reponav::before{display:table;content:\"\"}.reponav::after{display:table;clear:both;content:\"\"}.reponav-dropdown{position:relative;float:left}.reponav-dropdown.active .dropdown-menu-content{display:block}.reponav-item{float:left;padding:7px 15px 8px;color:#586069;white-space:nowrap;border:solid transparent;border-width:3px 1px 1px;border-radius:3px 3px 0 0}.reponav-item .octicon{color:rgba(27,31,35,0.3)}.reponav-item .Counter{color:#444d56}.reponav-item:hover,.reponav-item:focus{color:#24292e;text-decoration:none}.reponav-item.selected{color:#24292e;background-color:#fff;border-color:#e36209 #e1e4e8 transparent}.reponav-item.selected>.octicon{color:inherit}.reponav-wrapper{position:relative;z-index:2;overflow-y:hidden;background-color:#24292e}.reponav-wrapper .reponav{top:0;padding-right:8px;padding-left:8px;margin-top:0;-webkit-overflow-scrolling:touch;overflow-x:auto;color:rgba(255,255,255,0.75)}.reponav-wrapper .reponav-item{display:inline-block;float:none;padding:4px 8px 16px;color:rgba(255,255,255,0.75);border:0}.reponav-wrapper .reponav-item .Counter{color:inherit;background-color:rgba(255,255,255,0.15)}.reponav-wrapper .reponav-item.selected{font-weight:600;color:#fff;background-color:transparent;border:0}.progress-bar{display:block;height:15px;overflow:hidden;background-color:#eaecef;border-radius:3px}.progress-bar .progress{display:block;height:100%;background-color:#2cbe4e}.reverse-progress-container{position:relative;height:3px;background-color:#e1e4e8;background-image:linear-gradient(to right, #28a745, #005cc5, #3a1d6e, #cb2431, #f66a0a);background-size:100% 3px}.reverse-progress-bar{position:absolute;right:0;height:100%;background-color:#e1e4e8}.progress-bar-small{height:10px}.progress-bar-inline .progress-bar{width:100%;border-color:#e1e4e8;border-style:solid;border-width:1px;border-top:0;border-radius:0}.steps{display:table;width:100%;padding:0;margin:30px auto 0;overflow:hidden;list-style:none;border:1px solid #dfe2e5;border-radius:3px;box-shadow:0 1px 3px rgba(27,31,35,0.05)}.steps li{display:table-cell;width:33.3%;padding:10px 15px;color:#c6cbd1;cursor:default;background-color:#fafbfc;border-left:1px solid #dfe2e5}.steps li.current{color:#24292e;background-color:#fff}.steps li.current .octicon{color:#0366d6}.steps li .octicon{float:left;margin-right:15px;margin-bottom:5px}.steps li .step{display:block}.steps li:first-child{border-left:0}.steps .complete{color:#586069}.steps .complete .octicon{color:#28a745}.prose-diff .anchor{display:none}.prose-diff .show-rich-diff{color:#0366d6;text-decoration:none;cursor:pointer}.prose-diff .show-rich-diff:hover{text-decoration:underline}.prose-diff.collapsed .rich-diff-level-zero.expandable{cursor:pointer}.prose-diff.collapsed .rich-diff-level-zero.expandable .vicinity{display:block}.prose-diff.collapsed .rich-diff-level-zero.expandable .unchanged:not(.vicinity){display:none}.prose-diff.collapsed .rich-diff-level-zero.expandable .octicon{display:block;margin:20px auto;color:#d1d5da}.prose-diff.collapsed .rich-diff-level-zero.expandable:hover .octicon{color:#24292e}.prose-diff.collapsed .rich-diff-level-zero.expandable:only-child::before{font-size:18px;color:#d1d5da;content:\"Sorry, no visible changes to display.\"}.prose-diff.collapsed .rich-diff-level-zero.expandable:only-child:hover::before{color:#24292e}.prose-diff.collapsed .rich-diff-level-zero.expandable>.removed,.prose-diff.collapsed .rich-diff-level-zero.expandable>del{display:none;text-decoration:none}.prose-diff .markdown-body{padding:30px;padding-left:15px}.prose-diff .markdown-body>ins{box-shadow:inset 4px 0 0 #2cbe4e}.prose-diff .markdown-body>del{text-decoration:none;box-shadow:inset 4px 0 0 #cb2431}.prose-diff .markdown-body>ins,.prose-diff .markdown-body>del{display:block;border-radius:0}.prose-diff .markdown-body>ins>.rich-diff-level-zero,.prose-diff .markdown-body>ins>.rich-diff-level-one,.prose-diff .markdown-body>del>.rich-diff-level-zero,.prose-diff .markdown-body>del>.rich-diff-level-one{margin-left:15px}.prose-diff .markdown-body>ins:first-child *,.prose-diff .markdown-body>del:first-child *{margin-top:0}.prose-diff .rich-diff-level-zero.added{box-shadow:inset 4px 0 0 #2cbe4e}.prose-diff .rich-diff-level-zero.removed{box-shadow:inset 4px 0 0 #cb2431}.prose-diff .rich-diff-level-zero.changed{box-shadow:inset 4px 0 0 #f9c513}.prose-diff .rich-diff-level-zero.unchanged,.prose-diff .rich-diff-level-zero.vicinity{margin-left:15px}.prose-diff .rich-diff-level-zero.added,.prose-diff .rich-diff-level-zero.removed,.prose-diff .rich-diff-level-zero.changed{display:block;border-radius:0}.prose-diff .rich-diff-level-zero.added>.rich-diff-level-one,.prose-diff .rich-diff-level-zero.removed>.rich-diff-level-one,.prose-diff .rich-diff-level-zero.changed>.rich-diff-level-one{margin-left:15px}.prose-diff .rich-diff-level-zero.added:first-child *,.prose-diff .rich-diff-level-zero.removed:first-child *,.prose-diff .rich-diff-level-zero.changed:first-child *{margin-top:0}.prose-diff :not(.changed)>:not(.github-user-ins):not(.github-user-del)>.removed,.prose-diff :not(.changed)>:not(.github-user-ins):not(.github-user-del)>del{text-decoration:none}.prose-diff .changed del,.prose-diff .changed del pre,.prose-diff .changed del code,.prose-diff .changed del>div,.prose-diff .changed .removed,.prose-diff .changed .removed pre,.prose-diff .changed .removed code,.prose-diff .changed .removed>div{color:#cb2431;text-decoration:line-through;background:#ffdce0}.prose-diff .changed ins,.prose-diff .changed ins code,.prose-diff .changed ins pre,.prose-diff .changed .added{background:#e6ffed;border-bottom:1px solid #2cbe4e}.prose-diff>.markdown-body .github-user-ins{text-decoration:underline}.prose-diff>.markdown-body .github-user-del{text-decoration:line-through}.prose-diff>.markdown-body li ul.added{background:#e6ffed}.prose-diff>.markdown-body li ul.removed{color:#cb2431;background:#ffeef0}.prose-diff>.markdown-body li ul.removed:not(.github-user-ins){text-decoration:line-through}.prose-diff>.markdown-body li.added.moved-up .octicon,.prose-diff>.markdown-body li.added.moved-down .octicon{margin-right:5px;margin-left:5px;color:#d1d5da}.prose-diff>.markdown-body li.added.moved{background:#fffdef}.prose-diff>.markdown-body li.removed.moved{display:none}.prose-diff>.markdown-body pre{padding:10px 20px}.prose-diff>.markdown-body th.changed,.prose-diff>.markdown-body td.changed{background:#fffdef;border-left-color:#dfe2e5}.prose-diff>.markdown-body :not(li.moved).removed{color:#cb2431;text-decoration:line-through;background:#ffeef0}.prose-diff>.markdown-body :not(.github-user-ins):not(li.moved).removed{text-decoration:line-through}.prose-diff>.markdown-body :not(li.moved).added,.prose-diff>.markdown-body li:not(.moved).added{background:#e6ffed}.prose-diff>.markdown-body :not(.github-user-del):not(li.moved).added li:not(.moved):not(.github-user-del).added{text-decoration:none}.prose-diff>.markdown-body li:not(.moved).removed{color:#cb2431;background:#ffeef0}.prose-diff>.markdown-body li:not(.moved):not(.github-user-ins).removed{text-decoration:line-through}.prose-diff>.markdown-body .added,.prose-diff>.markdown-body ins+.added,.prose-diff>.markdown-body ins{border-top:0;border-bottom:0}.prose-diff>.markdown-body .added:not(.github-user-del):not(.github-user-ins),.prose-diff>.markdown-body ins+.added:not(.github-user-del):not(.github-user-ins),.prose-diff>.markdown-body ins:not(.github-user-del):not(.github-user-ins){text-decoration:none}.prose-diff>.markdown-body img.added,.prose-diff>.markdown-body img.removed{border-style:solid;border-width:1px}.prose-diff>.markdown-body ins pre:not(.github-user-del):not(.github-user-ins),.prose-diff>.markdown-body ins code:not(.github-user-del):not(.github-user-ins),.prose-diff>.markdown-body ins>div:not(.github-user-del):not(.github-user-ins){text-decoration:none}.prose-diff>.markdown-body ul>ins,.prose-diff>.markdown-body ul>del{display:block;padding:0}.prose-diff>.markdown-body .added>li,.prose-diff>.markdown-body .removed>li{margin-top:0;margin-bottom:0}span.changed_tag,em.changed_tag,strong.changed_tag,b.changed_tag,i.changed_tag,code.changed_tag{border-bottom:1px dotted #6a737d;border-radius:0}a.added_href,a.changed_href,span.removed_href{border-bottom:1px dotted #6a737d;border-radius:0}.diff-view .file-type-prose .rich-diff{display:none}.diff-view .display-rich-diff .rich-diff{display:block}.diff-view .display-rich-diff .file-diff{display:none}.diff-view .display-rich-diff.has-inline-notes .show-file-notes{display:none}.protip{margin-top:20px;text-align:center}.protip code{padding:2px;background-color:#f6f8fa;border-radius:3px}.protip-callout{padding:8px 10px;margin-bottom:20px;color:#444d56;text-align:left;border:solid 1px #eaecef;border-radius:3px}.radio-group::before{display:table;content:\"\"}.radio-group::after{display:table;clear:both;content:\"\"}.radio-label{float:left;padding:8px 10px 8px 35px;margin-left:-1px;color:#24292e;cursor:pointer;border:1px solid #d1d5da}:checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}.radio-label .octicon{padding-right:5px}.radio-label:first-of-type{margin-left:0;border-top-left-radius:3px;border-bottom-left-radius:3px}.radio-label:last-of-type{padding-right:16px;border-top-right-radius:3px;border-bottom-right-radius:3px}.radio-input{z-index:3;float:left;margin:14px -35px 0 14px}.add-reaction-btn{opacity:0;transition:opacity 0.1s ease-in-out}.add-reaction-plus-icon{margin-right:-1px}.reaction-popover-container{display:inline-block}.reaction-popover-container[open] .add-reaction-btn{opacity:1}.add-reaction-popover.dropdown-menu{width:220px}.add-reaction-popover.dropdown-menu-ne{bottom:100%;left:6px;margin-bottom:3px}.reaction-popover-form .loading-spinner{display:none;float:right}.reaction-popover-form.loading .loading-spinner{display:inline}.add-reactions-options::before{display:table;content:\"\"}.add-reactions-options::after{display:table;clear:both;content:\"\"}.add-reactions-options-item{float:left;width:34px;line-height:29px;transition:transform 0.15s cubic-bezier(0.2, 0, 0.13, 2);transform:scale(1)}.add-reactions-options-item:hover,.add-reactions-options-item:focus{text-decoration:none;transform:scale(1.2)}.add-reactions-options-item:active{background-color:#dbedff}.comment-reactions::before{display:table;content:\"\"}.comment-reactions::after{display:table;clear:both;content:\"\"}.comment-reactions .reaction-popover-container{z-index:100}.comment-reactions.has-reactions{border-top:1px solid #e1e4e8}.comment-reactions.has-reactions:hover .add-reaction-btn{opacity:1}.comment-reactions .user-has-reacted{background-color:#f1f8ff}.comment-reactions .add-reaction-btn{border-right:0}.reaction-summary-item{float:left;padding:9px 15px 7px;line-height:18px;border-right:1px solid #e1e4e8}.reaction-summary-item:hover,.reaction-summary-item:focus{text-decoration:none}.comment-reactions-options .reaction-summary-item:first-child{border-bottom-left-radius:2px}.render-container{padding:30px;line-height:0;text-align:center;background:#dfe2e5}.render-container .render-viewer{display:none;width:100%;height:100%;border:0}.render-container .octospinner{display:none}.render-container .render-viewer-error,.render-container .render-viewer-fatal,.render-container .render-viewer-invalid{display:none}.render-container.is-render-automatic .octospinner{display:inline-block}.render-container.is-render-requested .octospinner{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer-error{display:inline-block}.render-container.is-render-requested.is-render-failed .render-viewer,.render-container.is-render-requested.is-render-failed .render-viewer-fatal,.render-container.is-render-requested.is-render-failed .render-viewer-invalid,.render-container.is-render-requested.is-render-failed .octospinner{display:none}.render-container.is-render-requested.is-render-failed-fatal .render-viewer-fatal{display:inline-block}.render-container.is-render-requested.is-render-failed-fatal .render-viewer,.render-container.is-render-requested.is-render-failed-fatal .render-viewer-error,.render-container.is-render-requested.is-render-failed-fatal .render-viewer-invalid,.render-container.is-render-requested.is-render-failed-fatal .octospinner{display:none}.render-container.is-render-requested.is-render-failed-invalid .render-viewer-invalid{display:inline-block}.render-container.is-render-requested.is-render-failed-invalid .render-viewer,.render-container.is-render-requested.is-render-failed-invalid .render-viewer-error,.render-container.is-render-requested.is-render-failed-invalid .render-viewer-fatal,.render-container.is-render-requested.is-render-failed-invalid .octospinner{display:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed){height:500px;padding:0;background:none}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer{display:block}.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-error,.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .render-viewer-fatal,.render-container.is-render-ready.is-render-requested:not(.is-render-failed) .octospinner{display:none}.render-notice{padding:20px 15px;font-size:14px;color:#444d56;background-color:#f6f8fa;border-color:rgba(27,31,35,0.15)}.select-menu-button::after{display:inline-block;width:0;height:0;vertical-align:-2px;content:\"\";border:4px solid;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.select-menu-button.icon-only{padding-left:7px}.select-menu-button.primary::after{border-top-color:#fff}.select-menu-button.primary::after:active{background-color:#28a745}.select-menu-button-large::after{margin-left:0.25em;border-width:0.33em}.select-menu .spinner{float:left;margin:4px 0 0 -24px}.select-menu.active .select-menu-modal-holder{display:block}.select-menu.select-menu-modal-right{position:relative}.select-menu.select-menu-modal-right .select-menu-modal-holder{right:0}.select-menu .select-menu-clear-item{display:block}.select-menu .select-menu-clear-item .octicon{color:inherit}.select-menu .select-menu-clear-item+.select-menu-no-results{display:none !important}.select-menu.is-loading .select-menu-loading-overlay{display:block}.select-menu.is-loading .select-menu-modal{min-height:200px}.select-menu.has-error .select-menu-error{display:block}.select-menu-error{display:none}.select-menu-loading-overlay{position:absolute;top:0;z-index:5;display:none;width:100%;height:100%;background-color:rgba(255,255,255,0.8);border:1px solid transparent;border-radius:5px}.select-menu-loading-overlay .octicon-octoface{position:absolute;top:50%;left:50%;margin:-16px 0 0 -16px}.select-menu-modal-holder{position:absolute;z-index:30;display:none}.select-menu-modal{position:relative;width:300px;margin-top:4px;margin-bottom:20px;overflow:hidden;font-size:12px;color:#586069;background-color:#fff;background-clip:padding-box;border:1px solid rgba(27,31,35,0.15);border-radius:3px;box-shadow:0 3px 12px rgba(27,31,35,0.15)}.select-menu-modal-narrow{width:200px}.select-menu-header,.select-menu-divider{padding:8px 10px;line-height:16px;background:#f6f8fa;border-bottom:1px solid #e1e4e8}.select-menu-header .select-menu-title,.select-menu-divider{font-weight:600;color:#24292e}.select-menu-divider{margin-top:-1px;border-top:1px solid #e1e4e8}.select-menu-header .close-button,.select-menu-header .octicon{display:block;float:right;color:#c6cbd1;cursor:pointer}.select-menu-header .close-button:hover,.select-menu-header .octicon:hover{color:#444d56}.select-menu-header:focus{outline:none}.select-menu-filters{background-color:#f6f8fa}.select-menu-text-filter{padding:10px 10px 0}.select-menu-text-filter:first-child:last-child{padding-bottom:10px;border-bottom:1px solid #dfe2e5}.select-menu-text-filter input{display:block;width:100%;max-width:100%;padding:5px;border:1px solid #dfe2e5;border-radius:3px}.select-menu-text-filter input:-ms-input-placeholder{color:#a3aab1}.select-menu-text-filter input::-ms-input-placeholder{color:#a3aab1}.select-menu-text-filter input::placeholder{color:#a3aab1}.select-menu-tabs{padding:10px 10px 0;border-bottom:1px solid #dfe2e5}.select-menu-tabs ul{position:relative;bottom:-1px}.select-menu-tabs .select-menu-tab{display:inline-block}.select-menu-tabs a,.select-menu-tabs .select-menu-tab-nav{display:inline-block;padding:4px 8px 2px;font-size:11px;font-weight:600;color:#6a737d;text-decoration:none;cursor:pointer;background:transparent;border:1px solid transparent;border-radius:3px 3px 0 0}.select-menu-tabs a:hover,.select-menu-tabs .select-menu-tab-nav:hover{color:#24292e}.select-menu-tabs a.selected,.select-menu-tabs .select-menu-tab-nav.selected{color:#24292e;background-color:#fff;border-color:#dfe2e5;border-bottom-color:#fff}.select-menu-list{position:relative;max-height:400px;overflow:auto}.select-menu-list.select-menu-tab-bucket{display:none}.select-menu-list.select-menu-tab-bucket.selected{display:block}.select-menu-list.is-showing-new-item-form .select-menu-new-item-form{display:block}.select-menu-list.is-showing-new-item-form .select-menu-no-results,.select-menu-list.is-showing-new-item-form .select-menu-clear-item{display:none}.select-menu-blankslate{padding:16px;text-align:center}.select-menu-blankslate svg{display:block;margin-right:auto;margin-bottom:9px;margin-left:auto;fill:#879099}.select-menu-blankslate h3{font-size:14px;color:#24292e}.select-menu-blankslate p{width:195px;margin-right:auto;margin-bottom:0;margin-left:auto}.select-menu-item{display:block;padding:8px 8px 8px 30px;overflow:hidden;color:inherit;cursor:pointer;border-bottom:1px solid #eaecef}.select-menu-item .select-menu-item-text .octicon-x{display:none;float:right;margin:1px 10px 0 0;opacity:0.6}.select-menu-item:hover{text-decoration:none}.select-menu-item.select-menu-item-template{display:none}.select-menu-item.disabled,.select-menu-item.disabled.selected{color:#6a737d;cursor:default}.select-menu-item.disabled .description,.select-menu-item.disabled.selected .description{color:#6a737d}.select-menu-item.disabled.opaque,.select-menu-item.disabled.selected.opaque{opacity:0.7}.select-menu-item.disabled .select-menu-item-gravatar,.select-menu-item.disabled.selected .select-menu-item-gravatar{opacity:0.5}.select-menu-item .octicon{vertical-align:middle}.select-menu-item .octicon-check,.select-menu-item input[type=\"radio\"]:not(:checked)+.octicon-check{visibility:hidden}.select-menu-item input[type=\"radio\"]{display:none}.select-menu-item:focus{outline:none}.select-menu-item:hover,.select-menu-item:hover.selected,.select-menu-item:hover.select-menu-action,.select-menu-item:hover .description-inline,.select-menu-item:focus,.select-menu-item:focus.selected,.select-menu-item:focus.select-menu-action,.select-menu-item:focus .description-inline,.select-menu-item.navigation-focus,.select-menu-item.navigation-focus.selected,.select-menu-item.navigation-focus.select-menu-action,.select-menu-item.navigation-focus .description-inline,.select-menu-item[aria-selected=\"true\"],.select-menu-item[aria-selected=\"true\"].selected,.select-menu-item[aria-selected=\"true\"].select-menu-action,.select-menu-item[aria-selected=\"true\"] .description-inline{color:#fff;background-color:#0366d6}.select-menu-item:hover>.octicon,.select-menu-item:hover.selected>.octicon,.select-menu-item:hover.select-menu-action>.octicon,.select-menu-item:hover .description-inline>.octicon,.select-menu-item:focus>.octicon,.select-menu-item:focus.selected>.octicon,.select-menu-item:focus.select-menu-action>.octicon,.select-menu-item:focus .description-inline>.octicon,.select-menu-item.navigation-focus>.octicon,.select-menu-item.navigation-focus.selected>.octicon,.select-menu-item.navigation-focus.select-menu-action>.octicon,.select-menu-item.navigation-focus .description-inline>.octicon,.select-menu-item[aria-selected=\"true\"]>.octicon,.select-menu-item[aria-selected=\"true\"].selected>.octicon,.select-menu-item[aria-selected=\"true\"].select-menu-action>.octicon,.select-menu-item[aria-selected=\"true\"] .description-inline>.octicon{color:#fff}.select-menu-item:hover .description,.select-menu-item:hover .description-warning,.select-menu-item:hover.selected .description,.select-menu-item:hover.selected .description-warning,.select-menu-item:hover.select-menu-action .description,.select-menu-item:hover.select-menu-action .description-warning,.select-menu-item:hover .description-inline .description,.select-menu-item:hover .description-inline .description-warning,.select-menu-item:focus .description,.select-menu-item:focus .description-warning,.select-menu-item:focus.selected .description,.select-menu-item:focus.selected .description-warning,.select-menu-item:focus.select-menu-action .description,.select-menu-item:focus.select-menu-action .description-warning,.select-menu-item:focus .description-inline .description,.select-menu-item:focus .description-inline .description-warning,.select-menu-item.navigation-focus .description,.select-menu-item.navigation-focus .description-warning,.select-menu-item.navigation-focus.selected .description,.select-menu-item.navigation-focus.selected .description-warning,.select-menu-item.navigation-focus.select-menu-action .description,.select-menu-item.navigation-focus.select-menu-action .description-warning,.select-menu-item.navigation-focus .description-inline .description,.select-menu-item.navigation-focus .description-inline .description-warning,.select-menu-item[aria-selected=\"true\"] .description,.select-menu-item[aria-selected=\"true\"] .description-warning,.select-menu-item[aria-selected=\"true\"].selected .description,.select-menu-item[aria-selected=\"true\"].selected .description-warning,.select-menu-item[aria-selected=\"true\"].select-menu-action .description,.select-menu-item[aria-selected=\"true\"].select-menu-action .description-warning,.select-menu-item[aria-selected=\"true\"] .description-inline .description,.select-menu-item[aria-selected=\"true\"] .description-inline .description-warning{color:#fff}.select-menu-item[aria-selected=\"true\"].disabled,.select-menu-item.navigation-focus.disabled{color:rgba(255,255,255,0.5)}.select-menu-item[aria-selected=\"true\"].disabled .description,.select-menu-item.navigation-focus.disabled .description{color:rgba(255,255,255,0.6)}.select-menu-item>.octicon-dash{display:none}.select-menu-item.indeterminate>.octicon-check{display:none}.select-menu-item.indeterminate>.octicon-dash{display:block}.select-menu-item[aria-checked=\"true\"] .octicon-check,.select-menu-item input:checked+.octicon-check{color:inherit;visibility:visible}.select-menu-item.selected{color:#24292e}.select-menu-item.selected .description{color:#586069}.select-menu-item.selected>.octicon{color:#24292e}.select-menu-item.selected .octicon-check{color:inherit;visibility:visible}.select-menu-item.selected .select-menu-item-text .octicon-x{display:block;color:inherit}.select-menu.label-select-menu .select-menu-item:active{background-color:transparent !important}.select-menu-item a{color:inherit;text-decoration:none}.select-menu-item .hidden-select-button-text{display:none}.select-menu-item .css-truncate-target{max-width:100%}.select-menu-item-parent{pointer-events:none}.select-menu-item-parent:hover{cursor:default}.select-menu-item-parent.navigation-focus,.select-menu-item-parent.navigation-focus.selected,.select-menu-item-parent[aria-selected=\"true\"],.select-menu-item-parent[aria-selected=\"true\"].selected{color:#24292e;background-color:#f1f8ff}.select-menu-item-parent.navigation-focus .octicon-check,.select-menu-item-parent.navigation-focus.selected .octicon-check,.select-menu-item-parent[aria-selected=\"true\"] .octicon-check,.select-menu-item-parent[aria-selected=\"true\"].selected .octicon-check{color:#24292e}.select-menu-item-icon{float:left;margin-left:-20px}form.select-menu-item>div:first-child{display:none !important}.select-menu-list:last-child .select-menu-item:last-child,.select-menu-item.last-visible{border-bottom:0;border-radius:0 0 3px 3px}.select-menu-action{font-weight:400;color:#444d56}.select-menu-action>.octicon{color:inherit}.select-menu-action:hover{color:#0366d6}.select-menu-no-results{display:none;padding:9px;color:#586069;cursor:auto}.select-menu-list.filterable-empty .select-menu-no-results,.select-menu-no-results:only-child{display:block}.select-menu-button-gravatar,.select-menu-item-gravatar{width:20px;overflow:hidden;line-height:0}.select-menu-button-gravatar img,.select-menu-item-gravatar img{display:inline-block;width:20px;height:20px;border-radius:3px}.select-menu-item-gravatar{float:left;width:20px;height:20px;margin-right:8px;border-radius:2px}.select-menu-button-gravatar{float:left;margin-right:5px}.select-menu-item-text{display:block;text-align:left}.select-menu-item-text .description{display:block;max-width:265px;font-size:12px;color:#586069}.select-menu-item-text .description-inline{font-size:10px;color:#586069}.select-menu-item-text .description-warning{color:#cb2431}.select-menu-item-heading{display:block;margin-top:0;margin-bottom:0;font-size:14px;font-weight:600}.select-menu-item-heading .description{display:inline;font-weight:400}.select-menu-new-item-form{display:none}.select-menu-new-item-form .octicon{color:#0366d6}.modal-backdrop{display:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.menu-active .modal-backdrop{position:fixed;top:0;left:0;z-index:20;display:block;width:100vw;height:100vh}.authors-2 .AvatarStack{min-width:36px !important}.authors-3 .AvatarStack{min-width:46px !important}[aria-selected=\"true\"] .AvatarStack-body,.navigation-focus .AvatarStack-body{background:#f6fbff}.commit-tease .AvatarStack-body{background:#f1f8ff}.blame-commit .AvatarStack{margin-top:3px}.unfurl{padding:0 1em;border-left:.25em solid #d1d5da}.unfurl-icon{width:15px;height:15px}.hide-unfurl{display:none}.editable-comment .hide-unfurl{display:block}body{min-width:1012px;word-wrap:break-word}.page-content{padding-top:20px}.container-sm{max-width:544px}.marketing .pagehead h1{font-size:30px}.marketing .pagehead p{margin-top:4px;margin-bottom:0;font-size:14px;color:#586069}.marketing .pagehead ul.actions{margin-top:10px}.marketing h2 .secure{float:right;padding:1px 0;font-size:11px;font-weight:600;color:#28a745;text-transform:uppercase}.marketing .questions p{font-size:14px}.marketing-section{position:relative;padding-top:80px;padding-bottom:80px;font-size:16px;line-height:1.5;text-align:center;border-bottom:1px solid #e5e5e5}.marketing-section::before{display:table;content:\"\"}.marketing-section::after{display:table;clear:both;content:\"\"}.marketing-section h3{font-size:21px;font-weight:400}.marketing-hero-octicon{position:relative;width:100px;height:100px;margin:0 auto 15px;text-align:center;border:solid 1px #e5e5e5;border-radius:50px}.marketing-hero-octicon .octicon{margin-top:22px;color:#0366d6}.marketing-hero-octicon .octicon-checklist{position:relative;right:-3px}.hanging-icon-list li{padding-left:25px;margin:10px 0;font-size:14px;list-style-type:none}.hanging-icon-list .octicon{float:left;margin-top:3px;margin-left:-25px;color:#586069}.hanging-icon-list .octicon-check{color:#28a745}.hanging-icon-list .octicon-x{color:#cb2431}.nonprofit-head{padding:100px 0 120px}.heart{position:absolute;top:40%;left:50%;width:12px;height:12px;margin-left:400px;background:#83d6c0;box-shadow:140px 30px 0 #efa, 120px -120px 0 #aded84, 220px -60px 0 #ded, 30px 240px 0 #ada, 60px -60px 0 #d76666, 60px -30px 0 #ff846f, 60px 0 0 #f9a7a7, 60px 30px 0 #ffc8c8, 60px 60px 0 #ffd8d8, 30px 60px 0 #baf2ca, 30px 30px 0 #98eaac, 30px 0 0 #80d896, 30px -30px 0 #6dd085, 30px -60px 0 #55be6f, 0 -60px 0 #4cc2a7, 0 -30px 0 #73d3b9, 0 30px 0 #93e3cd, 0 60px 0 #adf9e4, -30px 60px 0 #ffe1b9, -30px 30px 0 #ffd194, -30px 0 0 #ffc86f, -60px 0 0 #fd9ff0, -60px 30px 0 #ffbaf7, -60px 60px 0 #fccdf7, -180px 60px 0 #9df;transform:rotate(45deg)}.heart:first-child{margin-left:-400px;transform:rotate(-45deg),scaleX(-1)}.octo-earth{position:absolute;bottom:-150px;left:50%;margin-left:-120px;animation:rotate 20s infinite linear}@keyframes rotate{0%{transform:rotate(0)}100%{transform:rotate(-360deg)}}.btn-blurple{color:#fff;background-color:#3b41af;background-image:linear-gradient(-180deg, #6570e2 0%, #3b41af 90%)}.btn-blurple:focus,.btn-blurple.focus{box-shadow:0 0 0 0.2em rgba(101,112,226,0.4)}.btn-blurple:hover,.btn-blurple.hover{background-color:#383ea7;background-image:linear-gradient(-180deg, #5c68e0 0%, #383ea7 90%);background-position:-.5em;border-color:rgba(27,31,35,0.5)}.btn-blurple:active,.btn-blurple.selected,[open]>.btn-blurple{background-color:#3a43bb;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-blurple:disabled,.btn-blurple.disabled{color:rgba(255,255,255,0.75);background-color:#9da0d7;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-blurple .Counter{color:#4350dc;background-color:#fff}.integrations-hero-octicon.marketing-hero-octicon{width:75px;height:75px;border-width:5px}.integrations-hero-octicon.marketing-hero-octicon .octicon{margin-top:15px}.marketing-blue-octicon{color:#34acbf;border-color:#34acbf}.marketing-blue-octicon .octicon{color:#34acbf}.marketing-turquoise-octicon{color:#75bbb6;border-color:#75bbb6}.marketing-turquoise-octicon .octicon{color:#75bbb6}.marketing-purple-octicon{color:#b086b7;border-color:#b086b7}.marketing-purple-octicon .octicon{color:#b086b7}.marketing-graphic{position:relative}.intgrs-dir .marketing-graphic{padding-right:0;margin:0}.intgrs-dir .footer{margin-top:40px}.intgrs-dir-section h2{margin-top:0;margin-bottom:20px;font-size:26px;font-weight:300}.intgrs-dir-intro{padding:40px 0;margin:0;text-align:left;background-image:linear-gradient(-110deg, #48227d 0%, #2f569c 100%);border-bottom:0}.pagehead+.intgrs-dir-intro{margin-top:-20px}.intgrs-dir-intro .directory-header-back{margin-top:10px;font-size:18px;color:#fff}.intgrs-dir-intro .directory-header-back:hover{color:#d7def1;text-decoration:none}.intgrs-dir-intro .directory-header-back .octicon{vertical-align:middle}.intgrs-dir-intro .directory-header-back .header-link{color:#96dad9}.intgrs-dir-intro .column{padding-right:40px;padding-left:0}.intgrs-dir-intro .directory-tag-line{margin-bottom:0;font-size:28px;font-weight:400;color:#fff}.intgrs-dir-intro .lead{margin-top:10px;margin-bottom:6px;font-size:18px;font-weight:400;color:#d7def1}.intgrs-lstng-search{display:inline-block;width:33%;margin-left:20px}.intgrs-lstng-search .subnav-search-input{width:100%}.intgrs-lstng-categories-container{display:inline-block;float:left;width:20%}.intgrs-lstng-categories-container .intgrs-lstng-categories{top:0}.intgrs-lstng-categories-container .filter-item{padding:6px 10px;margin-right:-10px;margin-left:-10px}.intgrs-lstng-container{display:inline-block;width:80%;text-align:left}.intgrs-lstng-item{position:relative;display:inline-flex;width:30.8%;font-size:14px;border:1px solid #ededed;border-radius:4px;transition:border-color 0.15s ease 0s, transform 0.15s ease 0s, box-shadow 0.15s ease 0s, color 0.15s ease 0s}.intgrs-lstng-item:hover{border-color:#51a7e8;box-shadow:0 0 5px rgba(81,167,232,0.5);transform:scale(1.05)}.intgrs-lstng-item .intgrs-lstng-logo{display:block;margin:0 auto 10px}.intgrs-lstng-item .draft-tag{position:absolute;top:-1px;left:10px}.intgrs-lstng-item-link{display:block;width:100%;height:181px;padding-top:20px}.intgrs-lstng-item-link:hover{text-decoration:none}.intgrs-lstng-item-link:hover .intgrs-lstng-item-header{color:#0366d6}.intgrs-lstng-item-header{margin:15px 10px 0;font-size:14px;font-weight:600;color:#333}.intgrs-lstng-item-description{position:relative;height:2.8em;padding:0 10px;margin-top:5px;overflow:hidden;font-size:13px;color:#586069}.intgrs-lstng-item-description::after{position:absolute;right:0;bottom:0;padding:0 15px 0 20px;color:transparent;content:\"\\00a0\";background-image:linear-gradient(to right, rgba(255,255,255,0), #fff 80%)}.intgr-admin-link{position:relative;display:inline-block;height:25px;padding-left:23px;font-size:13px;vertical-align:middle;border:1px solid #ededed;border-radius:3px}.intgr-admin-link.draft-tag{padding-left:25px;border:0}.intgr-admin-link.draft-tag .octicon,.intgr-admin-link.draft-tag:hover .octicon{color:#fff}.intgr-admin-link.draft-tag:hover{text-decoration:none;background-color:#000}.intgr-admin-link:hover .octicon{color:#0366d6}.intgr-admin-link .octicon{position:absolute;top:3px;left:5px;color:#586069}.intgr-feat-header{position:relative;width:85%;padding:0 65px 10px;color:#d7def1}.intgr-feat-header .intgr-admin-link{border-color:rgba(215,222,241,0.6)}.intgr-feat-header .intgr-admin-link .octicon{color:#d7def1}.intgr-feat-header .intgr-admin-link:hover .octicon{color:#fff}.intgr-feat-header .marketing-hero-octicon{position:absolute;top:0;left:5px;width:50px;height:50px;border-width:3px}.intgr-feat-header .marketing-hero-octicon .octicon{margin-top:11px}.intgr-feat-header h2{margin:0;font-size:25px;line-height:50px;color:#fff}.intgr-feat-header p{max-width:580px;margin:0;font-size:18px}.integrations-breadcrumb{display:inline-block;font-weight:400;color:#8296cc}.integrations-breadcrumb-link{line-height:0;color:#d7def1}.integrations-breadcrumb-link:hover{color:#fff;text-decoration:none}.integrations-auth-wrapper{width:511px;margin:60px auto}.integrations-auth-header{font-size:20px;text-align:center}.integrations-permissions-group dt{font-size:18px;font-weight:400}.integrations-permissions-group .integrations-permission{position:relative;padding-left:22px;margin-bottom:10px;list-style-type:none}.integrations-permissions-group .integrations-permission .octicon{position:absolute;top:1px;left:0;margin-right:10px}.integrations-install-target .select-menu{vertical-align:middle}.integrations-install-target input[type=radio]{margin-right:10px}.integrations-install-target .flash{background-color:transparent}.integrations-install-target .flash-error{background-color:transparent;border:0}.integrations-install-target .octicon-lock,.integrations-install-target .octicon-repo{margin-right:3px}.integrations-install-target .octicon-lock{color:rgba(27,31,35,0.7)}.integrations-install-target .private{background-color:#fff9ea}.integrations-install-target [aria-selected=\"true\"].private,.integrations-install-target .navigation-focus.private{background-color:#4078c0}.integrations-install-target [aria-selected=\"true\"].octicon-lock,.integrations-install-target .navigation-focus .octicon-lock{color:inherit}.integrations-setup-note{margin:10px 0}.listgroup-item{line-height:inherit}.listgroup-item.disabled{background-color:#fafbfc}.listgroup-item.disabled .listgroup-item-title{color:#333}.integration-key-management-wrapper .integration-key-downloading{display:none}.integration-key-management-wrapper .integration-key-list{display:none}.integration-key-management-wrapper .flash-error{display:none}.integration-key-management-wrapper .blankslate{margin-bottom:30px}.integration-key-management-wrapper .action .deletable{display:none}.integration-key-management-wrapper .action .undeletable{display:block}.integration-key-management-wrapper.multi-keys .action .deletable{display:block}.integration-key-management-wrapper.multi-keys .action .undeletable{display:none}.integration-key-management-wrapper.error .flash-error{display:block}.integration-key-management-wrapper.error .integration-key{opacity:0.5}.integration-key-management-wrapper.error .action .deletable{display:none}.integration-key-management-wrapper.error .action .undeletable{display:block}.integration-key-management-wrapper.downloading .blankslate{display:none}.integration-key-management-wrapper.downloading .integration-key-downloading{display:block}.integration-key-management-wrapper.downloading .integration-key-list{display:block}.integration-key-management-wrapper.downloading .integration-key-management{display:none}.integration-key-management-wrapper.has-keys .blankslate{display:none}.integration-key-management-wrapper.has-keys .integration-key-list{display:block}.link-small{color:#767676;transition:color 500ms ease}.listgroup-item:hover .link-small{color:#0366d6}.social-callout-twitter:hover .social-callout-twitter-logo{background-image:url(\"/images/icons/twitter-white.png\")}.social-callout-twitter-logo{display:inline-block;width:32px;height:32px;vertical-align:middle;background:url(\"/images/icons/twitter.png\") 0 0 no-repeat;background-size:32px auto}.accessibility-error{outline:10px solid #d73a49 !important}.account-membership-form .become-a-member,.account-membership-form .already-a-member{display:none}.account-membership-form.is-member .already-a-member{display:block}.account-membership-form.is-not-member .become-a-member{display:block}.billing-plans tbody td{width:25%;vertical-align:middle}.billing-plans .current{background-color:#f2ffed}.billing-plans .name{font-size:14px;font-weight:600;color:#333}.billing-plans .coupon{font-size:12px}.billing-plans .coupon td{color:#fff;background-color:#28a745}.billing-plans .coupon .text-right{white-space:nowrap}.billing-plans .coupon.expiring td{background-color:#df6e00}.billing-plans .coupon.expiring .coupon-label::after{border-bottom-color:#df6e00}.billing-plans tbody>.selected{background-color:#fdffce}.coupon-label{position:relative;padding:9px;margin:-9px}.coupon-label::after{position:absolute;bottom:100%;left:15px;width:0;height:0;pointer-events:none;content:\" \";border:solid transparent;border-width:5px;border-bottom-color:#28a745}.boxed-group-table .toggle-currency{font-size:11px;font-weight:400}.has-removed-contents{display:none}.currency-notice{margin-bottom:10px}.org-login{margin-top:-30px;margin-bottom:30px}.org-login img{width:450px;padding:1px;margin:10px -25px;border:1px solid #ccc}.plan-notice{padding:10px;margin-bottom:0;border-top:1px solid #eee}.member-list-item .member-username{display:inline}.member-list-item .member-link{display:inline}.actor-and-action{font-weight:600}.vertical-separator{margin-right:8px;margin-left:5px;border-left:1px solid gray}.audit-log-search .audit-search-form{margin-bottom:10px}.audit-log-search .audit-results-actions{margin:15px 0}.audit-log-search .audit-search-clear{margin-bottom:0}.auth-form{width:340px;margin:0 auto}.auth-form .form-group.warn .warning,.auth-form .form-group.warn .error,.auth-form .form-group.errored .warning,.auth-form .form-group.errored .error{max-width:274px}.auth-form-header{padding:10px 20px;margin:0;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.3);background-color:#829aa8;border:1px solid #768995;border-radius:3px 3px 0 0}.auth-form-header h1{font-size:16px}.auth-form-header h1 a{color:#fff}.auth-form-header .octicon{position:absolute;top:10px;right:20px;color:rgba(0,0,0,0.4);text-shadow:0 1px 0 rgba(255,255,255,0.1)}.auth-form-message{max-height:140px;padding:20px 20px 10px;overflow-y:scroll;border:1px solid #d8dee2;border-radius:3px}.auth-form-message ol,.auth-form-message ul{padding-left:inherit;margin-bottom:inherit}.auth-form-body{padding:20px;font-size:14px;background-color:#fff;border:1px solid #d8dee2;border-top:0;border-radius:0 0 3px 3px}.auth-form-body .input-block{margin-top:5px;margin-bottom:15px}.auth-form-body p{margin:10px 0}.auth-form-body ol,.auth-form-body ul{padding-left:inherit;margin-bottom:inherit}.two-factor-help{position:relative;padding:10px 10px 10px 36px;margin:60px 0 auto auto;border:1px solid #eaeaea;border-radius:3px}.two-factor-help h4{margin-top:0;margin-bottom:5px}.two-factor-help .octicon-device-mobile{position:absolute;top:10px;left:10px}.two-factor-help .octicon-key{position:absolute;left:10px}.two-factor-help ul{list-style-type:none}.u2f-send-code-spinner{position:relative;bottom:2px;display:none;vertical-align:bottom}.loading .u2f-send-code-spinner{display:inline}.u2f-login-spinner{top:2px}.u2f-auth-header{padding-bottom:10px;margin-bottom:20px;border-bottom:1px solid #eaeaea}.auth-form-body .u2f-auth-form-body{padding:0}.u2f-auth-form-body{padding:30px 30px 20px;text-align:center}.u2f-auth-form-body button{margin-top:20px}.u2f-auth-form-body .u2f-enabled{display:block}.u2f-auth-form-body .u2f-disabled{display:none}.u2f-auth-form-body.unavailable .u2f-enabled{display:none}.u2f-auth-form-body.unavailable .u2f-disabled{display:block}.u2f-auth-icon{color:#aaa}.flash.sms-error,.flash.sms-success{display:none;margin:0 0 10px}.is-sent .sms-success{display:block}.is-sent .sms-error{display:none}.is-not-sent .sms-success{display:none}.is-not-sent .sms-error{display:block}.session-authentication{background-color:#f9f9f9}.session-authentication .header-logged-out{background-color:transparent;border-bottom:0}.session-authentication .header-logo{color:#333}.session-authentication .flash{padding:15px 20px;margin:0 auto;margin-bottom:10px;font-size:13px;border-style:solid;border-width:1px;border-radius:5px}.session-authentication .flash .container{width:auto}.session-authentication .flash .flash-close{height:40px}.session-authentication .flash.is-signed-in,.session-authentication .flash.is-signed-out{width:100%;border-top:0;border-right:0;border-left:0;border-radius:0}.session-authentication .auth-form label{display:block;margin-bottom:7px}.session-authentication .auth-form .btn{margin-top:20px}.session-authentication .auth-form .u2f-error{margin-bottom:0}.session-authentication .label-link{float:right;font-size:12px}.session-authentication .auth-form-header{margin-bottom:15px;color:#333;text-align:center;text-shadow:none;background-color:transparent;border:0}.session-authentication .auth-form-header h1{font-size:24px;font-weight:300;letter-spacing:-0.5px}.session-authentication .auth-form-body{border-top:1px solid #d8dee2;border-radius:5px}.session-authentication .auth-form-body.u2f-auth-form-body{padding:20px}.session-authentication .create-account-callout{padding:15px 20px;text-align:center;border:1px solid #d8dee2;border-radius:5px}.session-authentication .two-factor-help{padding:0 0 0 20px;margin-top:20px;border:0}.session-authentication .two-factor-help .octicon-device-mobile{top:3px;left:0}.session-authentication .two-factor-help .octicon-key{top:0;left:0}.session-authentication.enterprise .header-logged-out{padding:48px 0 28px;background-color:transparent}.session-authentication.hosted .header-logged-out{padding:40px 0 20px;background-color:transparent}.cvv-hint{position:relative}.cvv-hint:hover .cvv-hint-tooltip{display:block}.cvv-hint-tooltip{position:absolute;left:-115px;z-index:1000;display:none;padding:15px;background-color:#fff;border:1px solid #d0d0d0;border-radius:3px;transform:translateX(-100%) translateY(-50%)}.credit-card{position:relative;width:250px;height:150px;padding:20px;margin-top:5px;background-color:#f5f5f5;border-radius:10px}.credit-card.amex{margin-top:15px}.credit-card.amex .title{position:relative;top:-5px;z-index:1;font-family:\"Arial Black\", \"Arial Bold\", Gadget, sans-serif;color:#6a737d;text-align:center;letter-spacing:1px;transform:scale(1.3, 1)}.credit-card.amex .card-number{position:relative;display:inline-block;margin-top:40px;font-size:15px;white-space:nowrap}.credit-card.amex .gladiator{position:absolute;top:50px;left:50%;width:70px;height:80px;margin-left:-35px;background-color:#f5f5f5;border:3px solid #fff;border-radius:50%;box-shadow:0 0 1px #aaa}.credit-card.normal .strap{height:20px;margin:-5px -20px 15px;background-color:#555}.credit-card.normal .signature{display:inline-block;width:150px;height:30px;font-family:\"Brush Script MT\", cursive;font-size:17px;line-height:33px;color:#767676;text-indent:10px;letter-spacing:-1px;white-space:nowrap;background-color:#fff}.credit-card .cvv{position:relative;top:-10px;left:-7px;display:inline-block;padding:2px 5px;font-family:monospace;font-size:10px;line-height:1;text-align:center;border:2px solid #f00;border-top-left-radius:20px 10px;border-top-right-radius:20px 10px;border-bottom-right-radius:20px 10px;border-bottom-left-radius:20px 10px}.credit-card .cvv span{position:absolute;right:100%;margin-right:5px;color:#586069}.credit-card .text{display:block;font-family:monospace;font-size:7px;font-weight:600;line-height:1.1;text-transform:uppercase}.billing-addon-items table input{width:5em}.billing-addon-items td{vertical-align:middle;border-bottom:0}.billing-addon-items td.fixed{width:150px}.billing-addon-items td.black{color:#000}.billing-addon-items tr{border-bottom:1px solid #eee}.billing-addon-items tr:last-child{border-bottom-width:0}.billing-addon-items tr:nth-child(even){background-color:#fafbfc}.billing-addon-items tr.total-row{color:#cb2431;background-color:#fff}.billing-addon-items .new-addon-items{margin-left:5px}.billing-addon-items .addon-cost{color:#6a737d}.billing-addon-items .discounted-original-price{color:#666}.billing-addon-items .form-submit,.billing-addon-items .payment-method{margin-left:8px}.billing-addon-items .payment-summary{margin-right:8px;margin-left:8px}.billing-credit-card .javascript-disabled-overlay{position:absolute;top:0;left:0;z-index:1;display:none;width:100%;height:100%;background-color:#fff;opacity:0.5}.billing-credit-card.disabled .javascript-disabled-overlay,.billing-credit-card.unsupported .javascript-disabled-overlay{display:block}.billing-actions{padding-bottom:10px}.billing-heres-what-appears{margin:0 0 10px}.billing-extra-box{padding-left:10px;margin:10px 0;border-left:3px solid #eee}.billing-vat-box{padding-left:10px;margin:10px 0;border-left:3px solid #eee}.billing-section .action-button{float:right;margin-bottom:5px;margin-left:10px}.billing-section .section-label{position:absolute;width:85px;font-weight:400;color:#586069;text-align:right}.billing-section .section-title{width:100px}.billing-section .section-content{margin-left:100px;color:#333}.billing-section:last-child{border-bottom:0}.billing-section .usage-bar{max-width:304px}.usage-bar{width:100%;margin:5px 0 0;background:#eee;border-radius:20px}.usage-bar.exceeded .progress{background:#d73a49}.usage-bar .progress{position:relative;max-width:100%;height:5px;background:#67d07c;border-radius:20px;transition:width 0.3s}.usage-bar .progress.no-highlight{background:#959da5}.live-update-seats-usage{margin:10px 0 5px}.billing-per-seat-callout{position:relative}.lfs-data-pack-field{margin:-6px 0}.packs-table .desc{width:1%;white-space:nowrap}.lfs-data-icon{color:#586069;text-align:center}.lfs-data-icon.dark{color:#333}.lfs-data-icon.octicon-database{margin-right:3px;margin-left:2px}.setup-wrapper .paypal-container{margin-bottom:30px}.setup-wrapper .paypal-logged-in .paypal-container{margin-bottom:10px}.payment-methods{position:relative}.payment-methods .selected-payment-method{display:none}.payment-methods .selected-payment-method::before{display:table;content:\"\"}.payment-methods .selected-payment-method::after{display:table;clear:both;content:\"\"}.payment-methods .selected-payment-method.active{display:block}.payment-methods .form-group dd .card-select-number{width:300px}.payment-methods .form-group dd .form-control.short.input-vat{width:300px}.payment-methods .pay-with-header{margin:5px 0}.payment-methods .pay-with-paypal .setup-creditcard-form,.payment-methods .pay-with-paypal .paypal-form-actions,.payment-methods .pay-with-paypal .terms,.payment-methods .pay-with-paypal .paypal-signed-in,.payment-methods .pay-with-paypal .paypal-down-flash,.payment-methods .pay-with-paypal .loading-paypal-spinner{display:none}.payment-methods.paypal-loading .loading-paypal-spinner{display:block}.payment-methods.paypal-down .paypal-down-flash{display:block}.payment-methods.paypal-logged-in .paypal-sign-in{display:none}.payment-methods.paypal-logged-in .setup-creditcard-form,.payment-methods.paypal-logged-in .paypal-form-actions,.payment-methods.paypal-logged-in .terms,.payment-methods.paypal-logged-in .paypal-signed-in{display:block}.payment-methods.has-paypal-account .paypal-sign-in{display:none}.payment-methods.has-paypal-account .paypal-signed-in{display:block}.paypal-label{margin:15px 0 10px;font-weight:600}.paypal-container{display:inline-block;margin-bottom:15px;vertical-align:top;background-color:#f9f9f9;border-radius:4px}.braintree-paypal-loggedin{padding:11px 16px !important;background-position:12px 50% !important;border:1px solid #ddd !important;border-radius:4px}.bt-pp-name{margin-left:20px !important}.bt-pp-email{margin-left:15px !important}.bt-pp-cancel{font-size:0 !important;line-height:1 !important;color:#a00 !important;text-decoration:none !important}.payment-history .id,.payment-history .date,.payment-history .receipt,.payment-history .status,.payment-history .amount{white-space:nowrap}.payment-history .break-all{word-break:break-all}.payment-history .receipt{text-align:center}.payment-history .currency,.payment-history .status{color:#586069}.payment-history .status-icon{width:14px;text-align:center}.payment-history .succeeded .status{color:#28a745}.payment-history .refunded,.payment-history .failed{background:#f6f8fa}.payment-history .refunded td,.payment-history .failed td{opacity:0.5}.payment-history .refunded .receipt,.payment-history .refunded .status,.payment-history .failed .receipt,.payment-history .failed .status{opacity:1}.payment-history .refunded .status{color:#6a737d}.payment-history .failed .status{color:#cb2431}.paypal-icon{margin:0 2px 0 1px;vertical-align:middle}.inline-form-action{display:inline}.boxed-group .boxed-group-content{margin:10px}.currency-container .local-currency,.currency-container .local-currency-block{display:none}.currency-container.open .local-currency{display:inline}.currency-container.open .local-currency-block{display:block}.currency-container.open .default-currency{display:none}.strong-label{display:inline-block;margin-bottom:5px;font-weight:600}.discounted-original-price{font-weight:400;color:#586069;text-decoration:line-through}.billing-manager-input{width:500px}.billing-manager-banner{padding:30px 20px;margin-bottom:30px;overflow:hidden;background:#f9f9f9;border-bottom:1px solid #eee}.billing-manager-banner .container{position:relative}.billing-manager-banner-text{margin-left:210px;font-size:14px;color:#555}.billing-manager-banner-text .btn{margin-top:8px;margin-right:8px}.billing-manager-banner-title{font-size:12px;font-weight:600;color:#586069}.billing-manager-icon{position:absolute;top:-35px;left:0;width:180px;height:180px;font-size:180px;color:#e0e0e0}.golden-ticket-banner{margin-top:30px;margin-bottom:15px;text-align:center;border-top:1px solid #e6d445}.golden-ticket{height:60px;margin-top:-30px}.golden-ticket-button{float:left;width:50%;padding:30px 20px;font-size:18px;font-weight:400}.golden-ticket-button .octicon{margin-right:10px;vertical-align:middle}.golden-ticket-button:first-child{border-radius:3px 0 0 3px}.golden-ticket-button:last-child{border-left:0;border-radius:0 3px 3px 0}.golden-ticket-confirm .setup-header{text-align:center;border:0}.seats-change-arrow{margin:0 10px}.billing-note-block{margin:15px 0}.plan-choice{position:relative;display:block;padding:15px;padding-left:40px;font-weight:400;background-color:#fafbfc;border:1px solid #e0e0e0}.plan-choice.open,.plan-choice.selected{background-color:#fff}.plan-choice--experiment{cursor:pointer;transition:transform 0.3s, box-shadow 0.3s, border-color 0.3s}.plan-choice--experiment.open,.plan-choice--experiment.selected{border-color:#d1d5da;box-shadow:0 1px 15px rgba(27,31,35,0.15);transform:scale(1.025)}.plan-choice--experiment.open .plan-choice-icon,.plan-choice--experiment.selected .plan-choice-icon{background-color:#28a745;box-shadow:0 1px 1px rgba(27,31,35,0.1)}.plan-choice--experiment.open .plan-choice-icon .octicon,.plan-choice--experiment.selected .plan-choice-icon .octicon{transform:scale(1)}.plan-choice--experiment.plan-choice--blue.open,.plan-choice--experiment.plan-choice--blue.selected{border-color:#2188ff}.plan-choice--experiment.plan-choice--blue.open .plan-choice-icon,.plan-choice--experiment.plan-choice--blue.selected .plan-choice-icon{background-color:#0366d6}.plan-choice--experiment.plan-choice--green.open,.plan-choice--experiment.plan-choice--green.selected{border-color:#34d058}.plan-choice--experiment.plan-choice--green.open .plan-choice-icon,.plan-choice--experiment.plan-choice--green.selected .plan-choice-icon{background-color:#28a745}.plan-choice--experiment.plan-choice--purple.open,.plan-choice--experiment.plan-choice--purple.selected{border-color:#8a63d2}.plan-choice--experiment.plan-choice--purple.open .plan-choice-icon,.plan-choice--experiment.plan-choice--purple.selected .plan-choice-icon{background-color:#6f42c1}.plan-choice-icon{transition:box-shadow 0.3s}.plan-choice-icon .octicon{transition:transform 0.2s;transform:scale(0.5)}.plan-choice-top{border-radius:3px 3px 0 0}.plan-choice-bottom{margin-bottom:20px;border-top:0;border-radius:0 0 3px 3px}.plan-choice-radio{position:absolute;top:18px;left:15px}.plan-choice-exp{margin-top:5px;font-size:12px;color:#6a737d}.seat-field{width:50px;margin-right:5px}.billing-form-title{font-size:16px}.billing-line-items{margin-top:10px}.billing-line-item{padding:10px 0;font-size:12px;list-style:none;border-top:1px solid #e0e0e0}.billing-line-item::before{display:table;content:\"\"}.billing-line-item::after{display:table;clear:both;content:\"\"}.billing-line-item-last{font-weight:600;border-top-width:3px}.line-item-value{float:right}.condensed-payment-methods .vat-field,.condensed-payment-methods .cc-field,.condensed-payment-methods .expiration-field,.condensed-payment-methods .country-field,.condensed-payment-methods .vat-field{margin-top:15px}.condensed-payment-methods .vat-field{width:100%;margin-bottom:0}.condensed-payment-methods .cc-field{width:42%}.condensed-payment-methods .expiration-field,.condensed-payment-methods .state-field{width:30%}.condensed-payment-methods .expiration-field{white-space:nowrap}.condensed-payment-methods .expiration-field .select{width:40%}.condensed-payment-methods .expiration-divider{width:20%;line-height:30px;text-align:center}.condensed-payment-methods .cvv-field,.condensed-payment-methods .postcode-field{width:28%;margin-top:15px;margin-bottom:0}.condensed-payment-methods .state-field.column,.condensed-payment-methods .postcode-field.column{margin-top:15px;margin-bottom:0}.condensed-payment-methods .country-field{width:42%}.condensed-payment-methods .state-field{width:30%}.condensed-payment-methods .is-international .country-field{width:72%}.condensed-payment-methods .is-international.no-postcodes .country-field{width:100%}.zuora-billing-section.PaymentMethod--creditcard:not(.has-removed-contents) ~ .SignUpContinueActions{display:none}.zuora-billing-section.PaymentMethod--creditcard-added ~ .SignUpContinueActions{display:block}.zuora-billing-section.PaymentMethod--paypal ~ .SignUpContinueActions{display:block}.blame-commit{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.blame-commit[data-heat=\"1\"]{border-right:2px solid #f66a0a}.blame-commit[data-heat=\"2\"]{border-right:2px solid rgba(246,106,10,0.9)}.blame-commit[data-heat=\"3\"]{border-right:2px solid rgba(246,106,10,0.8)}.blame-commit[data-heat=\"4\"]{border-right:2px solid rgba(246,106,10,0.7)}.blame-commit[data-heat=\"5\"]{border-right:2px solid rgba(246,106,10,0.6)}.blame-commit[data-heat=\"6\"]{border-right:2px solid rgba(246,106,10,0.5)}.blame-commit[data-heat=\"7\"]{border-right:2px solid rgba(246,106,10,0.4)}.blame-commit[data-heat=\"8\"]{border-right:2px solid rgba(246,106,10,0.3)}.blame-commit[data-heat=\"9\"]{border-right:2px solid rgba(246,106,10,0.2)}.blame-commit[data-heat=\"10\"]{border-right:2px solid rgba(246,106,10,0.1)}.heat[data-heat=\"1\"]{background:#f66a0a}.heat[data-heat=\"2\"]{background:rgba(246,106,10,0.9)}.heat[data-heat=\"3\"]{background:rgba(246,106,10,0.8)}.heat[data-heat=\"4\"]{background:rgba(246,106,10,0.7)}.heat[data-heat=\"5\"]{background:rgba(246,106,10,0.6)}.heat[data-heat=\"6\"]{background:rgba(246,106,10,0.5)}.heat[data-heat=\"7\"]{background:rgba(246,106,10,0.4)}.heat[data-heat=\"8\"]{background:rgba(246,106,10,0.3)}.heat[data-heat=\"9\"]{background:rgba(246,106,10,0.2)}.heat[data-heat=\"10\"]{background:rgba(246,106,10,0.1)}.blame-commit-date{font-size:11px;line-height:25px;flex-shrink:0}.blame-commit-date[data-heat=\"1\"]{color:#c24e00}.blame-commit-date[data-heat=\"2\"]{color:#ac571f}.blame-commit-date[data-heat=\"3\"]{color:#a35b2c}.blame-commit-date[data-heat=\"4\"]{color:#9a5f38}.blame-commit-date[data-heat=\"5\"]{color:#926245}.blame-commit-date[data-heat=\"6\"]{color:#896651}.blame-commit-date[data-heat=\"7\"]{color:#806a5e}.blame-commit-date[data-heat=\"8\"]{color:#776d6a}.blame-commit-date[data-heat=\"9\"]{color:#6e7177}.blame-commit-date[data-heat=\"10\"]{color:#6a737d}.line-age-legend .heat{width:2px;height:10px;margin:2px 1px 0}.blame-breadcrumb .css-truncate-target{max-width:680px}.blame-commit-info{width:450px;height:26px}.blame-commit-content{flex-grow:2;overflow:hidden}.blame-commit-message{text-overflow:ellipsis}.blame-commit-message .message.blank{color:rgba(27,31,35,0.3)}.blob-reblame{min-width:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.reblame-link{padding-top:2px;color:#d1d5da}.blame-hunk g-emoji{font-size:14px !important}.blame-hunk:hover .reblame-link{color:#6a737d}.blame-container .blame-blob-num,.blame-container .blob-code-inner{padding-top:3px;padding-bottom:3px}.blame-container .blob-code-inner{flex-grow:1}.editor-abort{display:inline;font-size:14px}.blob-interaction-bar{position:relative;background-color:#f2f2f2;border-bottom:1px solid #e5e5e5}.blob-interaction-bar::before{display:table;content:\"\"}.blob-interaction-bar::after{display:table;clear:both;content:\"\"}.blob-interaction-bar .octicon-search{position:absolute;top:10px;left:10px;font-size:12px;color:#586069}.blob-filter{width:100%;padding:4px 20px 5px 30px;font-size:12px;border:0;border-radius:0;outline:none}.blob-filter:focus{outline:none}.html-blob{margin-bottom:15px}.TagsearchPopover-content{width:inherit;max-width:600px}.license-summary-octicon{color:#959da5}.rule-type-permissions{color:#28a745}.rule-type-conditions{color:#0366d6}.rule-type-limitations{color:#d73a49}.check-for-fork.is-error .check-for-fork-loading{display:none}.check-for-fork.is-error .check-for-fork-error{display:inline-block}.check-for-fork-error{display:none}.commit-form-avatar{margin-left:-64px}.file-commit-form{padding-left:64px}.commit-form::after,.commit-form::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:\" \";border-color:transparent;border-style:solid solid outset}.commit-form::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.commit-form::before{border-width:8px;border-right-color:#ddd}.quick-pull-new-branch-icon{top:9px;left:10px}.code-formatting-menu{width:260px}.merge-pr{padding-top:10px;margin:20px 0 0;border-top:1px solid #d1d5da}.merge-pr.open .merge-branch-form{display:block}.merge-pr.open .branch-action{display:none}.status-heading{margin-bottom:1px}.merge-status-list{max-height:0;padding:0;margin:15px -15px -16px -55px;overflow-y:auto;border:solid #e1e4e8;border-width:1px 0 0;transition:max-height 0.25s ease-in-out}.statuses-toggle-opened{display:none}.merge-status-item{position:relative;padding:10px 15px;background-color:#fafbfc;border-bottom:1px solid #e1e4e8}.merge-status-item:last-child{border-bottom:0}.merge-status-item .css-truncate-target{max-width:100%}.merge-status-item .dismiss-review-form{display:none}.merge-status-item.open .review-status-item{display:none !important}.merge-status-item.open .dismiss-review-form{display:block}.status-meta{color:#586069}.status-meta-file-name{padding:0.2em 0.4em;margin:0;font-size:85%;background-color:rgba(27,31,35,0.05);border-radius:3px}.status-actions{margin-left:auto}.branch-action-item-icon{float:left;margin-left:-40px}.merge-status-icon{width:30px;margin-right:12px}.merge-pr-more-commits{margin-top:10px;margin-bottom:10px;margin-left:60px;font-size:12px;color:#586069}.branch-action{padding-left:60px;margin-top:15px;margin-bottom:15px}.branch-action .merge-branch-heading{margin-bottom:4px}.branch-action-icon{float:left;width:44px;height:44px;padding:6px;margin-left:-60px;color:#fff;text-align:center;border-radius:3px}.branch-action-body{position:relative;background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.branch-action-body::after,.branch-action-body::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:\" \";border-color:transparent;border-style:solid solid outset}.branch-action-body::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.branch-action-body::before{border-width:8px;border-right-color:#d1d5da}.branch-action-body .spinner{display:block;float:left;width:32px;height:32px;margin-right:15px;background:url(\"/images/spinners/octocat-spinner-32.gif\") no-repeat}.branch-action-body .merge-message,.branch-action-body .merge-branch-form{padding:15px;background-color:#fafbfc;border-top:1px solid #e1e4e8;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.post-merge-message{padding:15px}.branch-action-item{padding:15px 15px 15px 55px;font-size:13px;line-height:1.4}.branch-action-item+.branch-action-item,.branch-action-item+.mergeability-details{border-top:1px solid #e1e4e8}.branch-action-item.open>.merge-status-list{max-height:215px;margin-bottom:-15px}.branch-action-item.open .statuses-toggle-opened{display:inline}.branch-action-item.open .statuses-toggle-closed{display:none}.branch-action-btn{margin-left:15px}.branch-action-item-simple{padding-left:15px}.branch-action-item-simple .merge-status-list{margin-left:-15px}.branch-action-item-simple .merge-status-item{padding-left:12px}.branch-action-state-clean .branch-action-icon{background-color:#2cbe4e}.branch-action-state-clean .branch-action-body{border-color:#34d058}.branch-action-state-clean .branch-action-body::before{border-right-color:#34d058}.branch-action-state-unknown .branch-action-icon,.branch-action-state-unstable .branch-action-icon{background-color:#dbab09}.branch-action-state-unknown .branch-action-body,.branch-action-state-unstable .branch-action-body{border-color:#e2cc7a}.branch-action-state-unknown .branch-action-body::before,.branch-action-state-unstable .branch-action-body::before{border-right-color:#e2cc7a}.branch-action-state-merged .branch-action-icon{background-color:#6f42c1}.branch-action-state-merged .branch-action-body{border-color:#d5c8ed}.branch-action-state-merged .branch-action-body::before{border-right-color:#d5c8ed}.branch-action-state-dirty .branch-action-icon,.branch-action-state-closed-dirty .branch-action-icon,.is-rebasing .branch-action-state-dirty-if-rebasing .branch-action-icon{background-color:#6a737d}.branch-action-state-dirty .branch-action-body,.branch-action-state-closed-dirty .branch-action-body,.is-rebasing .branch-action-state-dirty-if-rebasing .branch-action-body{border-color:#d1d5da}.branch-action-state-dirty .branch-action-body::before,.branch-action-state-closed-dirty .branch-action-body::before,.is-rebasing .branch-action-state-dirty-if-rebasing .branch-action-body::before{border-right-color:#d1d5da}.branch-action-state-error .branch-action-icon{background-color:#d73a49}.branch-action-state-error .branch-action-body{border-color:#f97583}.branch-action-state-error .branch-action-body::before{border-right-color:#f97583}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.branch-action-body .spinner{background-image:url(\"/images/spinners/octocat-spinner-64.gif\");background-size:32px 32px}}.merge-branch-form{display:none;margin:15px 0}.merge-branch-form .commit-form{border-color:#85e89d}.merge-branch-form .commit-form::before{border-right-color:#e1e4e8}.merge-branch-form.error .commit-form,.merge-branch-form.danger .commit-form{border-color:#f97583}.merge-branch-form.error .commit-form::before,.merge-branch-form.danger .commit-form::before{border-right-color:#f97583}.merge-button-matrix-merge-form .merge-branch-form{display:block}.completeness-indicator{width:30px;height:30px;text-align:center}.completeness-indicator .octicon{display:block;margin-top:7px;margin-right:auto;margin-left:auto}.completeness-indicator .octicon-alert{margin-top:6px}.completeness-indicator-success{color:#fff;background-color:#2cbe4e;border-radius:50%}.completeness-indicator-error{color:#fff;background-color:#cb2431;border-radius:50%}.completeness-indicator-problem{color:#fff;background-color:#6a737d;border-radius:50%}.pull-merging .pull-merging-error{display:none}.pull-merging.is-error .pull-merging-error{display:block}.pull-merging.is-error .merge-pr{display:none}.RecentBranches{background-color:#fffbdd;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.RecentBranches-item{line-height:28px;color:#735c0f}.RecentBranches-item+.RecentBranches-item{border-top:1px solid rgba(27,31,35,0.05)}.RecentBranches-item-link{color:#735c0f}.RecentBranches-item-link.css-truncate-target{max-width:400px}.range-editor{position:relative;padding:5px 15px 5px 40px;margin-top:15px;margin-bottom:15px;background-color:#fafbfc;border:1px solid #e1e4e8;border-radius:3px}.range-editor .dots{font-size:16px}.range-editor .select-menu{position:relative;display:inline-block}.range-editor .select-menu.fork-suggester{display:none}.range-editor .branch-name{line-height:22px}.range-editor .branch .css-truncate-target,.range-editor .fork-suggester .css-truncate-target{max-width:180px}.range-editor .pre-mergability{display:inline-block;padding:5px;line-height:26px;vertical-align:middle}.range-editor .pre-mergability .octicon{vertical-align:text-bottom}.range-editor.is-cross-repo .select-menu.fork-suggester{display:inline-block}.range-editor-icon{float:left;margin-top:10px;margin-left:-25px;color:#586069}.gh-header-new-pr{margin-bottom:15px}.gh-header-new-pr .gh-header-meta{padding-bottom:0;margin-top:5px;border-bottom:0}.gh-header-new-pr .branch-name{display:inline}.compare-pr-header{display:none}.is-pr-composer-expanded .compare-show-header{display:none}.is-pr-composer-expanded .compare-pr-header{display:block}.range-cross-repo-pair{display:inline-block;padding:5px;white-space:nowrap}ul.comparison-list{width:350px;margin:25px auto 15px;font-size:14px;text-align:left;background:#fff;border:1px solid #dfe2e5;border-radius:3px}ul.comparison-list>li{padding:7px 10px;list-style-type:none;border-top:1px solid #eaecef}ul.comparison-list>li a{font-weight:600}ul.comparison-list>li em{float:right;font-style:normal;color:#586069}ul.comparison-list>li .octicon{position:relative;top:1px;color:#a3aab1}ul.comparison-list>li .css-truncate-target{max-width:200px}ul.comparison-list>li.title{font-size:12px;font-weight:600;color:#6a737d;text-transform:uppercase;background:#fafbfc;border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.branches .page-header{margin-bottom:20px}.branches .clear-search{display:none}.branches .loading-overlay{position:absolute;top:0;z-index:20;display:none;width:100%;height:100%;padding-top:50px;text-align:center;background-color:rgba(255,255,255,0.7)}.branches .loading-overlay .spinner{display:inline-block}.branches.is-search-mode .clear-search{display:inline-block}.branches.is-loading .loading-overlay{display:block}.branches .status{display:inline-block;width:16px;text-align:center}.branches .status .octicon{position:relative}.branches .status .octicon-primitive-dot{width:10px}.branches .branch-actions{position:relative;top:-4px;right:-4px;float:right}.branches .branch-actions form{display:inline}.branches .branch-actions .octicon{width:16px;text-align:center}.branch-groups{position:relative}.branch-group{width:100%;margin-bottom:20px;border-radius:3px}.branch-group::before{display:table;content:\"\"}.branch-group::after{display:table;clear:both;content:\"\"}.branch-group-heading{padding:6px 12px;background:#f6f8fa;border:1px solid #dfe2e5;border-bottom:0}.branch-group-heading+.branch-summary{border-top:1px solid #dfe2e5}.branch-group-heading .branch-name{color:#fff;background:#6a737d}.branch-group-name{font-weight:600;color:#586069}.branch-group-heading:first-child,.branch-summary:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.branch-group-heading:last-child,.branch-summary:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.branches-view-switcher{display:inline-block;vertical-align:middle}.branch-search{position:relative;float:right;vertical-align:middle}.branch-search .clear-search{position:absolute;top:9px;right:12px;color:#6a737d}.branch-search-field{width:250px;padding-right:25px}.no-results-message{padding:12px;color:rgba(27,31,35,0.5);text-align:center;border:1px solid #dfe2e5;border-radius:0 0 3px 3px}.branch-summary{padding:12px;color:rgba(27,31,35,0.5);border:1px solid #dfe2e5;border-bottom:0}.branch-summary:last-child{border-bottom:1px solid #dfe2e5}.branch-summary .branch-spinner{display:none;vertical-align:text-bottom}.branch-summary.loading .branch-delete-icon{display:none}.branch-summary.loading .branch-spinner{display:inline-block}.branch-summary.is-deleted .existing-branch-summary{display:none}.branch-summary.is-deleted .deleted-branch-summary{display:block}.deleted-branch-summary{display:none}.deleted-branch-summary .css-truncate-target{max-width:500px}.deleted-branch-summary .branch-name{text-decoration:line-through;opacity:0.5}.deleted-branch-summary .branch-spinner{position:relative;top:4px;right:5px;float:right}.branch-delete{display:inline-block;margin:4px 2px 0 8px;color:#cb2431}.branch-delete.disabled{color:#dfe2e5}.more-branches{display:block;width:100%;padding:6px;color:#0366d6;text-align:center;text-decoration:none;background:#eaf5ff;border:1px solid rgba(27,31,35,0.05);border-radius:0 0 3px 3px}.more-branches:hover{background:#dbedff}.more-branches .octicon{position:relative;top:1px;margin-left:5px}.branch-details{display:inline-block;width:490px;margin-right:10px}.branch-details .css-truncate-target{max-width:240px}.branch-details .octicon-shield{margin-right:2px}.branch-meta{font-size:12px;line-height:20px;color:#6a737d}.default-label{display:inline-block;width:150px;text-align:center;vertical-align:top}.default-label .sha{font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace}.default-label .sha .ellipses{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\";color:inherit}.default-label .sha .octicon{padding-right:4px}.branch-a-b-count{display:inline-block;vertical-align:middle}.branch-a-b-count .count-half{position:relative;float:left;width:90px;padding-bottom:6px;text-align:right}.branch-a-b-count .count-half:last-child{text-align:left;border-left:1px solid #959da5}.branch-a-b-count .count-value{position:relative;top:-1px;display:block;padding:0 3px;font-size:10px}.branch-a-b-count .bar{position:absolute;min-width:3px;height:4px}.branch-a-b-count .meter{position:absolute;height:4px;background-color:#c6cbd1}.branch-a-b-count .meter.zero{background-color:transparent}.branch-a-b-count .bar-behind{right:0;border-radius:3px 0 0 3px}.branch-a-b-count .bar-behind .meter{right:0;border-radius:3px 0 0 3px}.branch-a-b-count .bar-ahead{left:0;border-radius:0 3px 3px 0}.branch-a-b-count .bar-ahead .meter{border-radius:0 3px 3px 0}.branch-a-b-count .bar-ahead.even,.branch-a-b-count .bar-behind.even{min-width:2px;background:#eaecef}.businesses-toolbar .subnav-search{width:240px;margin-right:20px}body.full-width-p-0 .new-discussion-timeline{padding:0 !important;border-bottom:1px #e1e4e8 solid}body.full-width-p-0 .footer .mt-6{margin-top:0 !important;border-top:0 !important}body.full-width-p-0 .tabnav-pr .tabnav-extra{margin-right:24px}body.full-width-p-0 .tabnav-pr .tabnav-tabs{margin-left:16px}.checks-toolbar-commit-message.css-truncate{max-width:300px}.checks-index-group .octicon{vertical-align:text-top}.checks-index-item:first-child::before{position:absolute;top:0;left:0;z-index:1;width:100%;height:5px;content:\" \";background-image:linear-gradient(to bottom, rgba(47,54,61,0.1) 0%, rgba(255,255,255,0) 100%)}.checks-index-item:hover{background-color:#fff !important}.checks-index-item.selected{background-color:#fff !important}.checks-index-item.selected::after{position:absolute;top:0;bottom:0;left:0;display:block;width:3px;content:\" \";background-color:#e36209}.checks-index-item .css-truncate-target{max-width:220px}.checks-index-item-icon{width:16px}.selected .checks-index-label{font-weight:600;color:#24292e}.checks-summary-meta .octicon{width:16px}.checks-results-items .octicon-fold{display:none}.checks-results-items .Details--on .octicon-fold{display:inline-block}.checks-results-items .Details--on .octicon-unfold{display:none}.check-annotation{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.check-annotation::after{position:absolute;top:-1px;bottom:-1px;left:0;display:block;width:4px;content:\" \"}.check-annotation .annotation-actions{top:4px;right:8px}.check-annotation .annotation-octicon{width:16px}.check-annotation.Details--on .Details-content--hidden{display:block !important}.diff-table .check-annotation{max-width:962px}.annotation-title{word-break:break-all}.check-annotation-failure::after{background-color:#d73a49}.check-annotation-failure .annotation-title{color:#d73a49}.check-annotation-warning::after{background-color:#ffd33d}.check-annotation-warning .octicon-alert{color:#dbab09}.check-annotation-warning .annotation-title{color:#b08800}.check-annotation-notice::after{background-color:#6a737d}.check-annotation-notice .annotation-title{color:#6a737d}.neutral-check{color:#959da5}.code-frequency .addition{fill:#2cbe4e;fill-opacity:1}.code-frequency .deletion{fill:#cb2431;fill-opacity:1}.cadd{font-weight:600;color:#28a745}.cdel{font-weight:600;color:#cb2431}.code-list .file-box{border:1px #e1e4e8 solid;border-radius:3px}.code-list em{padding:2px;margin:0 -2px;font-style:normal;font-weight:600;color:#24292e;background-color:rgba(255,255,140,0.5);border-radius:3px}.code-list .title{min-height:24px;margin:-3px 0 10px 38px;font-weight:600;line-height:1.2}.code-list .repo-specific .title,.code-list .repo-specific .full-path{margin-left:0}.code-list .match-count,.code-list .updated-at{margin:0;font-weight:400}.code-list .language{float:right;margin-left:10px;font-size:12px;color:rgba(51,51,51,0.75)}.code-list .avatar{float:left}.code-list .code-list-item+.code-list-item{border-top:1px solid #eee}.code-list .blob-num{padding:0}.code-list .blob-num::before{content:normal}.code-list .blob-num a{padding:0 10px;color:inherit}.code-list .blob-num a:hover{color:#0366d6}.code-list .blob-code{white-space:pre-wrap}.code-list .divider .blob-num,.code-list .divider .blob-code{padding-top:0;padding-bottom:0;cursor:default;background-color:#f8fafd}.code-list .divider .blob-num{height:18px;padding:0 10px;line-height:15px;background-color:#f0f5fa}.code-list .full-path{margin:0 0 0 40px}.code-list .full-path .octicon-repo{color:#586069}.code-list .full-path .octicon-lock{color:#e9dba4}.code-list .full-path a{color:#6a737d}.code-list-item-private .file-box{border:1px solid #fadda5}.code-list-item-private .blob-num{background-color:#fffdef;border-right:1px solid #fadda5}.code-list-item-private .blob-num a{color:rgba(27,31,35,0.7)}.code-list-item-private .divider .blob-num,.code-list-item-private .divider .blob-code{color:rgba(27,31,35,0.7);background-color:#fffdef}.codesearch-head.pagehead h1{width:250px;line-height:33px}.search-autocomplete-dropdown{min-width:240px}.search-autocomplete-dropdown .autocomplete-category-heading::after{position:absolute;width:100%;height:1px;margin-top:8px;content:\"\";background-color:#e1e4e8}.search-autocomplete-dropdown .autocomplete-keyword-only{background:#f6f8fa}.search-autocomplete-dropdown .autocomplete-text{color:#24292e}.search-autocomplete-dropdown .navigation-item{cursor:pointer}.search-autocomplete-dropdown .navigation-item[aria-selected=\"true\"],.search-autocomplete-dropdown .navigation-item.navigation-focus{color:#fff;background-color:#0366d6;border-radius:3px}.search-autocomplete-dropdown .navigation-item[aria-selected=\"true\"] .autocomplete-text,.search-autocomplete-dropdown .navigation-item.navigation-focus .autocomplete-text{color:#fff}@media (min-width: 768px){.advanced-search-form .flattened dt{width:230px}.advanced-search-form .flattened dt label{font-weight:400}.advanced-search-form .flattened dd{margin-left:250px}.advanced-search-form .form-checkbox{margin-left:250px}}.codesearch-results .code-list .title a{word-wrap:break-word}.codesearch-results .repo-list-item{border-bottom:0}.codesearch-results .repo-list-item+.repo-list-item{border-top:1px #e1e4e8 solid}.search-form-fluid .TableObject-item--primary{position:relative;padding-right:8px}.search-form-fluid .completed-query{position:absolute;top:7px;right:8px;left:8px;z-index:1;margin:0;overflow:hidden;white-space:nowrap}.search-form-fluid .completed-query span{opacity:0}.search-form-fluid .search-page-label{position:relative;display:block;font-weight:400;cursor:text}.search-form-fluid .search-page-label.focus .completed-query{opacity:0.6}.search-form-fluid .search-page-input{position:relative;z-index:2;min-height:0;padding:0;margin:0;background:none;border:0;box-shadow:none}.search-form-fluid .search-page-input:focus{box-shadow:none}.sort-bar{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid #f1f1f1}.sort-bar .sort-label{padding-right:5px;font-size:13px;font-weight:200;color:#666}.sort-bar .select-menu{float:right}.topics-row-container{height:30px;overflow:hidden}@media (max-width: 544px){.codesearch-pagination-container a:not(.next_page):not(.previous_page),.codesearch-pagination-container .gap{display:none}.codesearch-pagination-container .previous_page,.codesearch-pagination-container .next_page{width:100%}.codesearch-pagination-container .current{color:#586069;background:#fff;border-color:#e1e4e8}.codesearch-pagination-container .current::after{content:\" of \" attr(data-total-pages)}}.comment-apps-container{border-top-width:0}.comment-apps-container .comment-app-details[open]>.comment-app{color:#fff;background-color:#0366d6}.comment-apps .select-menu{bottom:36px}.comment-apps .select-menu .select-menu-button{background-color:#e1e4e8;box-shadow:0 0 0 4px #fafbfc}.comment-apps .select-menu .select-menu-button.selected{color:#fff;background-color:#0366d6}.comment-apps .select-menu .select-menu-button::after{display:none}.comment-apps .select-menu-modal{z-index:90}.write-content.focused .select-menu-button{box-shadow:0 0 0 4px #fff}.commit-activity-graphs .dots{display:none}.commit-activity-master{margin-top:20px}.is-graph-loading .commit-activity-master{display:none}rect{shape-rendering:crispedges}rect.max{fill:#f9c513}g.bar{fill:#28a745}g.mini{fill:#fb8532}g.active rect{fill:#b31d28}circle.focus{fill:#444d56}.dot text{fill:#444d56;stroke:none}.CommunityTemplate-header{height:40px}.CommunityTemplate-markdown{height:800px;overflow-y:scroll;font-size:14px}.CommunityTemplate-highlight{padding:2px 4px;margin:0;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:12px;font-style:normal;font-weight:600;color:#24292e;cursor:pointer;background-color:#ffd33d;border-radius:3px}.CommunityTemplate-highlight--focus{color:#fff;background-color:#0366d6}.community-checklist .progress-bar{background:linear-gradient(to right, #ffd33d, #c5e300, #28a745);background-color:transparent}.community-checklist .progress{float:right;background-color:#f6f8fa}.community-checklist .checklist-dot{color:#dbab09}body.full-width-p0 .container{width:100%;padding-right:20px;padding-left:20px}body.full-width-p0 .container.new-discussion-timeline{padding-right:0;padding-left:0}.compare-cutoff,.diff-cutoff{padding:8px 0;margin:5px 0;font-weight:600;color:#4c4a42;text-align:center;background-color:#fff9ea;border:solid 1px #dfd8c2;border-radius:3px}span.no-nl-marker{position:relative;color:#cb2431;vertical-align:middle}.symlink .no-nl-marker{display:none}.existing-pull{margin:10px 0}.existing-pull .list-group-item::before{display:table;content:\"\"}.existing-pull .list-group-item::after{display:table;clear:both;content:\"\"}.existing-pull .existing-pull-contents{float:left;width:680px}.existing-pull .existing-pull-button{float:right;margin-top:3px}.existing-pull .existing-pull-number{font-weight:400;color:#aaa}.existing-pull .css-truncate{max-width:700px}.existing-pull .css-truncate p{display:inline}.compare-pr-placeholder{padding:15px;margin:15px 0;font-size:14px;color:#4c4a42;background-color:#fff9ea;border:solid 1px #dfd8c2;border-radius:3px}.compare-pr-placeholder p{margin:7px 0;color:#6d6c60}.compare-pr-placeholder .btn{margin-right:10px;margin-bottom:-2px}.compare-pr-placeholder .help-link{padding:3px;margin-top:5px;margin-right:-3px;color:#9c997d;text-decoration:none}.compare-pr .new-pr-form{display:none}.compare-pr .contributing{display:none}.compare-pr.open .compare-pr-placeholder{display:none}.compare-pr.open .new-pr-form{display:block}.compare-pr.open .contributing{display:block}.contact-github textarea{height:100px;resize:vertical}.contact-github .contact-checklist>li{margin:5px 0 5px 18px;list-style-position:outside}.documentation-results-wrapper{position:relative;top:-19px}.documentation-results{position:absolute;top:0;z-index:2;width:400px;margin-top:5px;box-shadow:0 0 5px rgba(0,0,0,0.2)}.documentation-results ul{width:100%}.documentation-results ul li:first-child a{border-top-left-radius:3px;border-top-right-radius:3px}.documentation-results .documentation-results-footer a{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.documentation-results a{display:block;padding:5px 10px;font-weight:600;color:#333;text-decoration:none;cursor:pointer;background-color:#fff;border:solid #ddd;border-width:0 1px 1px;outline:none}.documentation-results a:hover{color:#fff;background-color:#3586c3}.documentation-results a.selected{color:#fff;background-color:#3586c3}ul.documentation-results-group{list-style-type:none}.contact-form-extras{display:none}.select-menu-item{text-align:left;background-color:#fff;border-top:0;border-right:0;border-left:0}.timeline-jump-to-menu{left:-85px;z-index:80}.contributions-setting-menu{z-index:80;width:330px}.calendar-graph{height:126px;padding:5px 0 0;text-align:center}.calendar-graph.days-selected rect.day{opacity:0.5}.calendar-graph.days-selected rect.day.active{opacity:1}.calendar-graph .dots{width:64px;height:64px;margin:20px auto 0}.calendar-graph text.month{font-size:10px;fill:#767676}.calendar-graph text.wday{font-size:9px;fill:#767676}.graph-before-activity-overview{border-top-left-radius:3px;border-top-right-radius:3px}.activity-overview-box{border-top-left-radius:0;border-top-right-radius:0}.contrib-footer{padding:0 10px 12px;font-size:11px}.contrib-legend{float:right}.contrib-legend .legend{position:relative;bottom:-1px;display:inline-block;margin:0 5px;list-style:none}.contrib-legend .legend li{display:inline-block;width:10px;height:10px}.contrib-square{font-size:22px;line-height:0.9;color:#cce888}.contribution-activity h2{margin:30px 0 15px;font-size:18px;font-weight:400}.contribution-activity .select-menu-button{position:relative;top:-4px}.contribution-activity.loading .contribution-activity-listing{display:none}.contribution-activity.loading .contribution-activity-show-more{display:none}.contribution-activity.loading .contribution-activity-spinner{display:block}.contribution-activity-spinner{display:none;width:64px;height:64px;margin:20px auto 0}.contribution-activity-spinner.next{margin:0 auto}ul.simple-conversation-list a.meta{color:#586069}li.contribution{padding:10px 0;list-style:none}li.contribution h3{display:inline-block;margin:0;font-size:14px}li.contribution .cmeta{display:block;font-size:12px}li.contribution .d{color:#c00}li.contribution .a{color:#8cac29}li.contribution .num{color:#586069}.activity-overview-axis,.activity-overview-point{stroke:#6cb267}.halloween-activity-overview .activity-overview-axis,.halloween-activity-overview .activity-overview-point{stroke:#fe9600}.activity-overview-label{fill:#586069}.activity-overview-percentage{font-size:10px;fill:#959da5}.tint-box{position:relative;margin-bottom:10px;background:#f6f8fa;border-radius:6px}.tint-box.transparent{background:#fff}.tint-box .activity{padding-top:100px;margin-top:0}.contrib-person path{fill:#fb8532}.contrib-person .midlabel{fill:#959da5}.logged-out.enter-coupon{background-color:#f9f9f9}.logged-out.enter-coupon .coupon-form-body{margin-bottom:-20px;background-image:none;box-shadow:0 1px 3px rgba(0,0,0,0.075),inset 1px 0 #fff,0 0 200px #fff}.logged-out.enter-coupon .header-logged-out{background-color:#fff}.coupons .setup-plans td img{margin-top:-2px;vertical-align:middle}.coupons .coupon-form-body{width:270px;padding:20px;margin:100px auto 60px;font-size:14px;text-align:center;background-color:#fff;background-image:linear-gradient(#fefefe, #fafafa);border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.075),inset 1px 0 #fff}.coupons .coupon-form-body .input-block{margin-bottom:15px}.coupons .coupon-form-body .btn{display:block;width:100%}.coupon-icon{width:80px;height:80px;margin:0 auto 15px;color:#0366d6;border:1px solid #dedede;border-radius:40px}.coupon-icon .octicon{margin-top:15px;margin-right:2px}.coupons-list-options{margin-bottom:15px}.coupons-list-options .select-menu,.coupons-list-options .BtnGroup{display:inline-block;margin-right:10px}.coupons-list-options .pagination{float:right;margin:0}.user-repos .mini-repo-list-item{padding-right:6px}.user-repos .mini-repo-list-item .repo-and-owner{max-width:100%}.user-repos .mini-repo-list-item .owner{max-width:145px}.repo-private-icon{fill:#dbab09}.dashboard-rollup-items>.dashboard-rollup-item{border-top:1px solid #e1e4e8}@keyframes broadCastMaskFade{0%{opacity:0}30%{opacity:1}70%{opacity:1}100%{opacity:0}}.github-jobs-logo:hover{text-decoration:none}.github-jobs-logo strong{display:inline-block;width:62px;height:12px;text-indent:-9999px;vertical-align:middle;background:url(\"/images/modules/jobs/logo.png\") 0 0 no-repeat;background-size:62px auto}.dashboard h1{margin-bottom:0.5em;font-size:160%}.dashboard h1 a{font-size:70%;font-weight:400}.dashboard .notice{padding:15px;margin-top:0;margin-bottom:0;text-align:center}.news-full,.page-profile .news{float:none;width:auto}.dashboard-break-word{-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-break:break-word}.news .error-message{display:none}.news .is-error .loading-message{display:none}.news .is-error .error-message{display:block}.news .bio g-emoji,.news .repo-description g-emoji{display:inline-block}.account-switcher-truncate-override{width:calc(100% - 36px);max-width:100% !important}.dashboard-notice{position:relative;padding:15px 15px 15px 55px;margin-bottom:20px;font-size:14px;background-color:#fafbfc;border:solid 1px #d1d5da;border-radius:3px}.dashboard-notice .dismiss{position:absolute;top:10px;right:10px;width:16px;height:16px;color:#959da5;cursor:pointer}.dashboard-notice .dismiss:hover{color:#586069}.dashboard-notice .notice-icon{position:absolute;top:15px;left:15px}.dashboard-notice .octicon-organization{color:#0366d6}.dashboard-notice h2{margin-top:9px;margin-bottom:16px;font-size:18px;font-weight:400;color:#24292e}.dashboard-notice p.no-title{padding-right:5px}.dashboard-notice .inset-figure{float:right;margin-bottom:15px;margin-left:20px}.dashboard-notice ul{margin-left:18px}.dashboard-notice li{padding-bottom:15px}.dashboard-notice .coupon{padding:10px;margin:15px 0;font-size:20px;font-weight:600;text-align:center;background:#fff;border:1px dashed #dbedff}.dashboards-overview-lead{width:700px}.dashboards-overview-cards .boxed-group{width:100%;margin:10px 0}.dashboards-overview-cards .boxed-group .graph-canvas path{stroke-opacity:0.5}.dashboards-overview-cards .is-no-activity .blankslate{display:block}.dashboards-overview-cards .is-no-activity .dashboards-overview-graph{display:none}.dashboards-overview-cards .blankslate{display:none;padding-top:47px;background-color:#fff;border:0;box-shadow:none}.dashboards-overview-cards .octicon-arrow-down,.dashboards-overview-cards .octicon-arrow-up{display:none}.dashboards-overview-cards .is-increase .octicon-arrow-up{display:inline-block}.dashboards-overview-cards .is-decrease .octicon-arrow-down{display:inline-block}.dashboards-overview-cards .octicon-arrow-down{color:#cb2431}.dashboards-overview-cards .octicon-arrow-up{color:#1db34f}.dashboards-overview-cards .graph-canvas .dots{padding:43px 0}.dashboards-overview-cards .summary-stats{height:78px}.dashboards-overview-cards .summary-stats .created_at{color:#1db34f}.dashboards-overview-cards .summary-stats .closed_at,.dashboards-overview-cards .summary-stats .merged_at{color:#0366d6}.dashboards-overview-cards .summary-stats .totals-num{margin:0 7px}.dashboards-overview-cards .summary-stats .single{width:100%}.dashboards-overview-graph{height:160px}.dashboards-overview-graph .path{fill:none;stroke-width:2}.dashboards-overview-graph path.created_at{stroke:#1db34f}.dashboards-overview-graph path.merged_at,.dashboards-overview-graph path.closed_at{stroke:#1d7fb3}.dashboards-overview-graph .y line{stroke:#1db34f}.dashboards-overview-graph .y.unique line{stroke:#1d7fb3}.dashboards-overview-graph .overlay{fill-opacity:0}.created_at circle{fill:#1db34f;stroke:#fff;stroke-width:2}.dots.merged_at circle,.dots.closed_at circle{fill:#1d7fb3;stroke:#fff;stroke-width:2}dl.form.developer-select-account{margin-top:0}.developer-wrapper .setup-info-module .features-list{margin-left:16px}.developer-wrapper .setup-info-module .features-list .octicon{margin-left:-17px}.developer-thanks h2{font-size:38px;font-weight:400}.developer-thanks .hook{margin-top:2px;margin-bottom:30px;font-size:18px;font-weight:300;color:#666}.developer-thanks-image{position:relative;bottom:-45px;float:left;width:400px}.developer-thanks-section{margin:130px 0 0 470px}.developer-next-steps{font-size:18px;font-weight:300;list-style:none}.developer-next-steps li{margin-top:10px}.developer-next-steps li:first-child{margin-top:0}.developer-next-steps .octicon{margin-right:10px;color:#28a745;vertical-align:middle}.donut-chart>.error,.donut-chart>.cancelled,.donut-chart>.action_required,.donut-chart>.timed_out,.donut-chart>.failure{fill:#cb2431}.donut-chart>.expected,.donut-chart>.queued,.donut-chart>.in_progress,.donut-chart>.pending{fill:#dbab09}.donut-chart>.success{fill:#2cbe4e}.donut-chart>.neutral{fill:#959da5}.survey-question-form .other-text-form,.survey-question-form .other-text-form-block{display:none;margin-top:0}.survey-question-form.is-other-selected .other-text-form{display:inline-block}.survey-question-form.is-other-selected .other-text-form-block{display:block}.setup-header .large-file-storage-header{font-size:44px}.early-acccess-setup-form .form-group{margin-top:0;margin-bottom:30px}.early-acccess-setup-form select{display:block;width:200px}.early-access-setup-list{padding:0 15px 15px;margin:0;font-size:14px}.early-access-setup-list .early-access-setup-list-item{margin-top:10px;margin-left:20px}.early-access-setup-list .early-access-setup-list-item:first-child{margin-top:0}.early-access-thanks-wrapper{position:relative;z-index:1;height:80vh;margin-bottom:-41px;background-color:#fcfcfc;border-bottom:1px solid #ddd}.early-access-thanks-content{position:relative;top:50%;width:500px;margin:0 auto;transform:translateY(-50%)}.early-access-thanks-title{margin-top:0;font-weight:400}.early-access-thanks-lead{margin-top:0;margin-bottom:0}.eap-error-state-title{margin-top:0}.ghe-license-status{padding:40px 0;font-size:16px;text-align:center}.ghe-license-status .octocat{width:225px;margin-bottom:20px}.ghe-license-status h1{margin-bottom:10px}.ghe-license-status p{margin-bottom:5px;color:#586069}.ghe-license-expiry-icon{margin:5px 10px 0 0;color:#ddb38a}.explore-content{margin-top:-15px}.explore-content .blankslate{margin-top:15px}.explore-pjax-container{position:relative}.repo-snipit{display:inline-block;margin-top:7px}.repo-snipit:hover{text-decoration:none}.repo-snipit .octicon{font-size:14px;color:#586069}.repo-snipit-name{max-width:200px;color:#666}.repo-snipit-description{max-width:300px;color:#586069}.repo-snipit:hover .repo-snipit-name,.repo-snipit:hover .repo-snipit-description{color:#0366d6}.newsletter-frequency-choice{font-weight:400;cursor:pointer;border:1px solid #eee;border-radius:4px}.newsletter-frequency-choice .notice{position:absolute;right:0;bottom:1em;left:0;z-index:-1;font-weight:600;color:#28a745;text-align:center;opacity:0}.newsletter-frequency-choice .notice.visible{bottom:-2em;opacity:1;transition:opacity 0.15s ease-in-out}.newsletter-frequency-choice h3{padding:10px;margin:0;font-weight:400;text-align:center;background-color:#fafbfc;border-bottom:1px solid #eee}.newsletter-frequency-choice h3 input{position:relative;top:-2px;margin:0 3px 0 -19px}.newsletter-frequency-choice p{margin:15px}.newsletter-frequency-choice:hover{border-color:#0366d6}.newsletter-frequency-choice:hover h3{color:#fff;background-color:#0366d6;border-color:#0366d6}.newsletter-frequency-choice.selected{border-color:#28a745;box-shadow:0 0 5px rgba(0,0,0,0.2)}.newsletter-frequency-choice.selected h3{color:#fff;background-color:#28a745;border-color:#28a745}@media (min-width: 1012px){.col-lg-9 .Collection{max-width:744px}}@media (min-width: 1012px){.Spotlight{margin-top:100px}}.Spotlight-text{z-index:1}.Spotlight-blur{z-index:0;opacity:0.9}@media (min-width: 1012px){.Spotlight-blur{opacity:1;-webkit-mask-image:linear-gradient(0deg, #000, #000 75%, transparent);mask-image:linear-gradient(0deg, #000, #000 75%, transparent)}}.exploregrid{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;list-style:none}.exploregrid-item-wrap{display:flex;flex-direction:column}.exploregrid-item{flex:1;position:relative;display:block;height:100%;padding-top:24px;padding-bottom:64px;font-size:14px;color:#555;border:1px solid rgba(0,0,0,0.075);border-bottom-color:rgba(0,0,0,0.125);border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,0.05),0 5px 10px rgba(0,0,0,0.05);transition:border-color 0.1s ease-in-out, box-shadow 0.1s ease-in-out}.exploregrid-item:hover{text-decoration:none;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.15);box-shadow:0 1px 3px rgba(0,0,0,0.05),0 8px 15px rgba(0,0,0,0.1)}.exploregrid-item:hover .exploregrid-item-title{color:#0366d6}.exploregrid-item:hover .exploregrid-item-header{opacity:1}.exploregrid-item-mini{float:left;width:100%;height:auto;margin:0 0 15px}.exploregrid-item-mini .exploregrid-item-header{height:10px}.exploregrid-item-mini .exploregrid-item-title{font-size:16px}.exploregrid-item-header{position:absolute;top:0;left:0;width:100%;height:18px;background-color:#f5f5f5;border:1px solid rgba(0,0,0,0.1);border-top-left-radius:4px;border-top-right-radius:4px;opacity:0.8;transition:opacity 0.1s ease-in-out}.exploregrid-item-title{margin-top:0;margin-bottom:5px;font-size:20px;font-weight:400;line-height:1.2;color:#24292e}.fakelogin{position:fixed;top:0;z-index:1000;width:100%;font-size:14px;line-height:34px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(153,0,0,0.25);background-image:linear-gradient(#dc5f59, #b33630);border-bottom:1px solid #900}.fakelogin+.Header{margin-top:35px}.fakelogin+.server-stats{margin-top:35px}.fakelogin .cancel-impersonation{color:#fff;text-decoration:underline}.file{position:relative;margin-top:16px;margin-bottom:16px;border:1px solid #ddd;border-radius:3px}.file .data.empty{padding:5px 10px;color:#586069}.file:not(.open) .file-header.file-header--expandable{border-bottom:0}.file .data.suppressed,.file.open .image{display:none}.file.open .data.suppressed{display:block}.file .image{position:relative;padding:30px;text-align:center;background-color:#ddd}.file .image table{margin:0 auto}.file .image td{padding:0 5px;color:#888;text-align:center;vertical-align:top}.file .image td img{max-width:100%}.file .image .border-wrap{position:relative;display:inline-block;line-height:0;background-color:#fff;border:1px solid #6a737d}.file .image a{display:inline-block;line-height:0}.file .image img,.file .image canvas{max-width:600px;background:url(\"/images/modules/commit/trans_bg.gif\") right bottom #eee;border:1px solid #fff}.file .image .view img,.file .image .view canvas{position:relative;top:0;right:0;max-width:inherit;background:url(\"/images/modules/commit/trans_bg.gif\") right bottom #eee}.file .image .view>span{vertical-align:middle}.file .empty{background:none}.file-header{padding:5px 10px;background-color:#fafbfc;border-bottom:1px solid #e1e4e8;border-top-left-radius:2px;border-top-right-radius:2px}.file-header::before{display:table;content:\"\"}.file-header::after{display:table;clear:both;content:\"\"}.file-actions{float:right;padding-top:2px;font-size:13px}.file-actions select{margin-left:5px}.file-info{font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:12px;line-height:32px}.file-info .octicon{vertical-align:text-bottom}.file-info-divider{display:inline-block;width:1px;height:18px;margin-right:3px;margin-left:3px;vertical-align:middle;background-color:#ddd}.file-mode{text-transform:capitalize}.show-file-notes{display:none}.comments-indicator{display:none}.has-inline-notes .show-file-notes{display:inline-block;margin-right:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.has-inline-notes.hide-file-notes-toggle .show-file-notes{display:none !important}.has-inline-notes.hide-file-notes-toggle .comments-indicator{display:inline-block}.file-blankslate{border:0;border-radius:0 0 2px 2px}.diff-progressive-loader{min-height:150px}.load-diff-button,.load-diff-retry{z-index:1;min-height:32px}.diff-placeholder-svg{clip:rect(1px, 1px, 1px, 1px);-webkit-clip-path:inset(50%);clip-path:inset(50%)}.hidden-diff-reason{z-index:2}.axis{font-size:10px}.axis line{stroke:rgba(27,31,35,0.1);shape-rendering:crispedges}.axis path{display:none}.axis .zero line{stroke:#0366d6;stroke-dasharray:3 3;stroke-width:1.5}.graphs .is-graph-loading{min-height:500px}.graphs.wheader h2{padding:1px}.graphs .area{fill:#28a745;fill-opacity:0.5}.graphs .path{fill:none;stroke:#28a745;stroke-opacity:1;stroke-width:2px}.graphs .dot{fill:#28a745;stroke:#1e7e34;stroke-width:2px}.graphs .dot.padded{stroke:#fff;stroke-width:1px}.graphs .dot.padded circle:hover{fill:#0366d6}.graphs .d3-tip{fill:#24292e}.graphs .d3-tip text{font-size:11px;fill:#fff}.graphs .dir{float:right;padding-top:5px;font-size:12px;font-weight:400;line-height:100%;color:#6a737d}.graphs .selection .overlay{visibility:none}.graphs .selection .selection{fill:#24292e;fill-opacity:0.1;stroke:#24292e;stroke-dasharray:3 3;stroke-opacity:0.4;stroke-width:1px;shape-rendering:crispedges}.graph-filter h3{display:inline-block;font-size:24px;font-weight:300}.graph-filter .info{margin-bottom:20px;color:#586069}h2.ghead::after{display:block;height:0;clear:both;visibility:hidden;content:\".\"}.graph-canvas .activity{width:400px;padding:10px;margin:100px auto 0;color:#2f363d;text-align:center;border-radius:3px}.graph-canvas .dots{margin:0 auto}.graph-canvas>.activity{display:none}.graph-loading,.graph-error,.graph-no-usable-data,.graph-empty{display:none}.graph-canvas.is-graph-loading>.activity,.graph-canvas.is-graph-without-usable-data>.activity,.graph-canvas.is-graph-empty>.activity{display:block}.is-graph-loading .graph-loading,.is-graph-empty .graph-empty,.is-graph-without-usable-data .graph-no-usable-data,.is-graph-load-error .graph-error{display:block}.svg-tip{position:absolute;z-index:99999;padding:10px;font-size:12px;color:#959da5;text-align:center;background:rgba(0,0,0,0.8);border-radius:3px}.svg-tip strong{color:#dfe2e5}.svg-tip.is-visible{display:block}.svg-tip::after{position:absolute;bottom:-10px;left:50%;width:5px;height:5px;box-sizing:border-box;margin:0 0 0 -5px;content:\" \";border:5px solid transparent;border-top-color:rgba(0,0,0,0.8)}.svg-tip.comparison{padding:0;text-align:left;pointer-events:none}.svg-tip.comparison .title{display:block;padding:10px;margin:0;font-weight:600;line-height:1;pointer-events:none}.svg-tip.comparison ul{margin:0;white-space:nowrap;list-style:none}.svg-tip.comparison li{display:inline-block;padding:10px}.svg-tip.comparison li:first-child{border-top:3px solid #28a745;border-right:1px solid #24292e}.svg-tip.comparison li:last-child{border-top:3px solid #2188ff}.svg-tip-one-line{white-space:nowrap}.LoadingDependencies{position:absolute;left:0;width:100%;animation:fadeOut;animation-duration:0.6s;animation-fill-mode:forwards;animation-timing-function:ease-in}.LoadingDependencies--loading{position:relative}.LoadingDependencies--loading .octicon{opacity:0;animation:dropBox;animation-duration:1.25s;animation-fill-mode:forwards;animation-timing-function:linear;animation-delay:1s;animation-iteration-count:infinite}.LoadingDependencies--loading .octicon:nth-child(2){position:absolute;left:calc(50% - 27px);animation-delay:1.61s}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes dropBox{0%{opacity:1;transform:translateY(-110%)}7%{opacity:1;transform:translateY(20%);transform:translateX(0)}80%{opacity:1}100%{opacity:0;transform:translateX(-250%)}}.getting-started .main-content .container{width:420px}.getting-started .list-group-item{background:#fff}.getting-started .list-group-item .octicon{color:#bbb}.getting-started .list-group-item .octicon-lead{width:30px}.getting-started .list-group-item:hover,.getting-started .list-group-item:focus{background:#fafbfc}.getting-started .link-text{color:#24292e}.getting-started .link-text strong{color:#0366d6}.topic-tag{display:inline-block;padding:0.3em 0.9em;margin:0 0.5em 0.5em 0;white-space:nowrap;background-color:#f1f8ff;border-radius:3px}.topic-tag-link:hover{text-decoration:none;background-color:#def}.delete-topic-button{display:inline-block;width:26px;color:#6a737d;background-color:#f1f8ff;border-top:0;border-right:0;border-bottom:0;border-left:1px solid #b4d9ff;border-top-right-radius:3px;border-bottom-right-radius:3px}.delete-topic-button:hover{background-color:#def}.invalid-topic .delete-topic-button{color:#86181d;background-color:#ffdce0;border-left-color:#cea0a5}.invalid-topic .delete-topic-button:hover{background-color:#ffc8ce}.topic-tag-action{display:inline-flex;align-items:center;padding-left:0.8em;margin:0.4em 0.4em 0 0;background-color:#f1f8ff;border-radius:3px}.topic-tag-action.invalid-topic{color:#86181d;background-color:#ffdce0;border-color:#cea0a5}.topic-tag-action .add-topic-button,.topic-tag-action .remove-topic-button{display:inline-block;width:26px;font-size:15px;color:#6a737d;background-color:#f1f8ff;border-top:0;border-right:0;border-bottom:0;border-left:1px solid #b4d9ff}.topic-tag-action .add-topic-button:hover,.topic-tag-action .remove-topic-button:hover{color:#fff}.topic-tag-action .add-topic-button:hover{background-color:#28a745}.topic-tag-action .remove-topic-button{border-right:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.topic-tag-action .remove-topic-button:hover{background-color:#d73a49}.topic-input-container .tag-input{width:908px;cursor:text}.topic-input-container .tag-input.org-repo-tag-input{width:100%}.topic-input-container .tag-input .tag-input-inner{min-height:26px}.topic-input-container .topic-tag{margin-top:2px}.repository-topics-container .list-topics-container{display:inline-flex;flex-wrap:wrap;align-items:baseline}.repository-topics-container .manage-topics-container{display:none}.repository-topics-container.open .list-topics-container{display:none}.repository-topics-container.open .manage-topics-container{display:block}.topic .css-truncate-target{max-width:75%}.topic-list .topic-list-item+.topic-list-item{border-top:1px #e1e4e8 solid}.team-breadcrumb .team-breadcrumb-item{display:inline-block}.team-breadcrumb .team-breadcrumb-item::after{padding-right:0.5em;padding-left:0.5em;color:#e1e4e8;content:\"/\"}.team-breadcrumb .team-breadcrumb-item-selected::after{content:none}.team-discussions-container{min-height:100vh}.team-left-column{max-width:100%}@media (min-width: 768px){.team-left-column{max-width:350px}}.team-left-column .team-avatar{width:80px;height:80px}@media (min-width: 768px){.team-left-column .team-avatar{width:140px;height:140px}}.team-discussions{max-width:768px}.team-discussions .previewable-comment-form .comment{border:0}.discussion-post{opacity:1;transition:opacity 400ms}.discussion-post .timeline-comment::after,.discussion-post .timeline-comment::before{display:none}.discussion-post .post-author{margin-top:-6px}.discussion-post .post-author-timestamp{margin-top:-3px}.discussion-post.fade-out{opacity:0}.discussion-post .timeline-inline-comments{background:#fafbfc}.discussion-post .team-discussion-timeline::before{bottom:20px}.discussion-post .reply-comment:first-child{border-top:1px solid #e1e4e8}.discussion-post .reply-comment:first-child .review-comment{padding-top:16px}.discussion-post .reply-comment .review-comment{padding:8px 16px}.discussion-post .reply-comment .review-comment.is-comment-editing{padding:0;background:#fafbfc}.discussion-post .comment .comment-reactions{margin-left:16px;border-top:0}.discussion-post .comment .reaction-summary-item{margin-bottom:16px}.discussion-post .reaction-summary-item:not(.add-reaction-btn){padding:0 8px;font-size:12px;line-height:26px;border:1px solid #d2dff0;border-radius:3px}.discussion-post .reaction-summary-item:not(.add-reaction-btn) .emoji{font-size:16px;vertical-align:sub}.discussion-post .reaction-summary-item:not(.add-reaction-btn)+.reaction-summary-item{margin-left:8px}.discussion-post .reply-comments-holder{position:relative}.discussion-post .reply-comments-holder::before{position:absolute;top:51px;bottom:0;left:29px;width:2px;content:\"\";background-color:#e1e4e8}.discussion-post .add-reaction-btn{padding:4px 10px}.discussion-post .pin-btn:disabled{pointer-events:none}.discussion-post .pinned{color:#f66a0a;opacity:1}.discussion-post .loading-spinner{display:none;float:left;margin-top:12px}.discussion-post .loading .loading-spinner{display:block}.discussion-post ~ .blankslate{display:none}.team-discussion-new-post .review-thread-reply-button:disabled{cursor:inherit;background-color:#f6f8fa;border:0;box-shadow:none}.team-project-suggestion-number{font-weight:300;color:#a3aab1}.team-discussion-nav-disabled{pointer-events:none}.header-search-wrapper{display:table;width:100%;max-width:100%;min-height:0;padding:0;font-weight:400;vertical-align:middle}.header-search-wrapper.header-search-wrapper-jump-to .header-search-scope{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.header-search-input{display:table-cell;width:100%;min-height:26px;padding-top:0;padding-bottom:0;background:none;border:0;box-shadow:none}.header-search-input:focus{border:0;box-shadow:none}.header-search-input:focus ~ .header-search-key-slash{display:none !important}.header-search-input::-ms-clear{display:none}.header-search-scope{display:none;width:1%;padding-right:8px;padding-left:8px;font-size:12px;color:#586069;white-space:nowrap;vertical-align:middle;border-right:1px solid #eaecef;border-top-left-radius:3px;border-bottom-left-radius:3px}.header-search-scope:empty+.header-search-input{width:100%}.header-search-scope:hover{color:#fff;background-color:rgba(255,255,255,0.12)}.scoped-search .header-search-scope{display:table-cell}.scoped-search .form-control.focus .header-search-scope{color:#0366d6;background-color:#c0ddfe;border-color:#8ec2fd}.jump-to-field-active{color:#24292e !important;background-color:#fafbfc}.jump-to-field-active:-ms-input-placeholder{color:#586069 !important}.jump-to-field-active::-ms-input-placeholder{color:#586069 !important}.jump-to-field-active::placeholder{color:#586069 !important}.jump-to-field-active ~ .header-search-key-slash{display:none}.jump-to-field-active.jump-to-dropdown-visible{border-bottom-right-radius:0;border-bottom-left-radius:0}.jump-to-suggestions{top:30px;left:0;z-index:35;width:100%;border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;box-shadow:0 4px 10px rgba(0,0,0,0.1)}.jump-to-suggestions-path{min-width:0;min-height:44px;color:#1b1f23}.jump-to-suggestions-path .jump-to-octicon{width:28px;color:#6a737d}.jump-to-suggestions-path .jump-to-suggestion-name{max-width:none}.jump-to-suggestions-path mark{font-weight:600;background-color:transparent}.jump-to-suggestions-results-container .navigation-item{border-bottom:1px solid #e1e4e8}.jump-to-suggestions-results-container .navigation-item:last-child{border-bottom:0}.jump-to-suggestions-results-container .d-on-nav-focus{display:none}.jump-to-suggestions-results-container [aria-selected=\"true\"] .jump-to-octicon,.jump-to-suggestions-results-container .navigation-focus .jump-to-octicon{color:#fff}.jump-to-suggestions-results-container [aria-selected=\"true\"] .jump-to-suggestions-path,.jump-to-suggestions-results-container .navigation-focus .jump-to-suggestions-path{color:#fff;background:#0366d6}.jump-to-suggestions-results-container [aria-selected=\"true\"] mark,.jump-to-suggestions-results-container .navigation-focus mark{color:#fff}.jump-to-suggestions-results-container [aria-selected=\"true\"] .d-on-nav-focus,.jump-to-suggestions-results-container .navigation-focus .d-on-nav-focus{display:block}.Header{z-index:32;padding-top:12px;padding-bottom:12px;color:rgba(255,255,255,0.75);background-color:#24292e}.server-stats+.Header{box-shadow:inset 0 1px 0 rgba(255,255,255,0.075)}.Header .header-search-scope{font-size:inherit;line-height:28px;color:rgba(255,255,255,0.75);border-right-color:#282e34}.Header .header-search-wrapper{min-height:30px;font-size:inherit;color:#fff;background-color:rgba(255,255,255,0.125);border:0;box-shadow:none}.Header .header-search-wrapper .truncate-repo-scope{max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.Header .header-search-wrapper.focus{background-color:rgba(255,255,255,0.175);box-shadow:none}.Header .header-search-wrapper.focus .header-search-scope{color:#fff;background-color:rgba(255,255,255,0.075);border-right-color:#282e34}.Header .header-search-input{min-height:30px;font-size:16px;color:inherit}@media (min-width: 1012px){.Header .header-search-input{font-size:inherit}}.Header .header-search-input:-ms-input-placeholder{color:rgba(255,255,255,0.75)}.Header .header-search-input::-ms-input-placeholder{color:rgba(255,255,255,0.75)}.Header .header-search-input::placeholder{color:rgba(255,255,255,0.75)}.Header .dropdown-menu{width:300px}.Header .platform-nav .dropdown-menu{width:500px}.page-responsive .Header .platform-nav .dropdown-menu{width:auto}@media (min-width: 1012px){.page-responsive .Header .platform-nav .dropdown-menu{width:500px}}.Header .notification-indicator:hover::after{content:none}@media (min-width: 1012px){.Header .notification-indicator:hover::after{content:attr(aria-label)}}.page-responsive .HeaderMenu{display:none;clear:both}@media (min-width: 1012px){.page-responsive .HeaderMenu{display:block;clear:none}}.page-responsive .HeaderMenu .header-search{float:none;width:auto;max-width:none;padding-top:16px;padding-bottom:16px;margin-right:0;border-top:1px solid #444d56}@media (min-width: 1012px){.page-responsive .HeaderMenu .header-search{float:left;width:300px;padding-top:4px;padding-bottom:4px;border-top:0}}.open .HeaderMenu{display:block}.HeaderMenu .header-search{width:300px;padding-top:3px;padding-bottom:3px;font-size:13px}.page-responsive .HeaderMenu--experiment{z-index:100;width:300px;overflow:auto;background-color:#fff;box-shadow:0 10px 50px rgba(27,31,35,0.15)}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment{width:auto;overflow:visible;background-color:transparent;box-shadow:none}}.page-responsive .HeaderMenu--experiment .HeaderMenu-item{border-bottom:1px solid #eaecef}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .HeaderMenu-item{border-bottom:0 solid transparent}}.page-responsive .HeaderMenu--experiment .HeaderMenu-target{color:#586069 !important}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .HeaderMenu-target{color:#fff !important}}.page-responsive .HeaderMenu--experiment .dropdown-menu{position:static;width:auto;border:0 solid transparent;box-shadow:none}.page-responsive .HeaderMenu--experiment .dropdown-menu::before,.page-responsive .HeaderMenu--experiment .dropdown-menu::after{content:none}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .dropdown-menu{position:absolute;width:300px;border:1px solid rgba(27,31,35,0.15);box-shadow:0 3px 12px rgba(27,31,35,0.15)}.page-responsive .HeaderMenu--experiment .dropdown-menu::before,.page-responsive .HeaderMenu--experiment .dropdown-menu::after{content:\"\"}}.page-responsive .HeaderMenu--experiment .dropdown-menu-s{transform:none}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .dropdown-menu-s{transform:translateX(50%)}}.page-responsive .HeaderMenu--experiment .header-search{width:auto;padding-top:0;padding-bottom:0;border-top:0}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .header-search{width:240px}}.page-responsive .HeaderMenu--experiment .header-search-key-slash{opacity:0}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .header-search-key-slash{opacity:1}}.page-responsive .HeaderMenu--experiment .header-search-input{border:1px solid #eaecef}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .header-search-input{border:0}}.page-responsive .HeaderMenu--experiment .header-search-input:-ms-input-placeholder{color:#586069 !important}.page-responsive .HeaderMenu--experiment .header-search-input::-ms-input-placeholder{color:#586069 !important}.page-responsive .HeaderMenu--experiment .header-search-input::placeholder{color:#586069 !important}@media (min-width: 1012px){.page-responsive .HeaderMenu--experiment .header-search-input:-ms-input-placeholder{color:rgba(255,255,255,0.75) !important}.page-responsive .HeaderMenu--experiment .header-search-input::-ms-input-placeholder{color:rgba(255,255,255,0.75) !important}.page-responsive .HeaderMenu--experiment .header-search-input::placeholder{color:rgba(255,255,255,0.75) !important}}.HeaderMenu--experiment .header-search{width:240px}.read-only-mode-banner{text-align:center;background-color:#f8e45f;border-bottom-color:#f6dc2e}.header-logo-invertocat{margin:-1px 15px -1px -2px;color:#fff;white-space:nowrap}.header-logo-invertocat .octicon-mark-github{float:left}.header-logo-invertocat:hover{color:#fff;text-decoration:none}.header-logo-subbrand{float:left;margin-left:6px;font-size:16px;font-weight:600;line-height:30px}.header-logo-wordmark{position:relative;float:left;height:26px;margin-right:15px;color:#fff}.header-logo-wordmark .octicon{float:left}.header-logo-wordmark:hover{color:#fff}.header-actions{float:right;margin-top:-3px;margin-bottom:-3px}.header-actions .btn{margin-left:5px}.notification-indicator{color:rgba(255,255,255,0.75)}.notification-indicator .mail-status{position:absolute;top:-6px;left:6px;z-index:2;display:none;width:14px;height:14px;color:#fff;background-image:linear-gradient(#54a3ff, #006eed);background-clip:padding-box;border:2px solid #24292e;border-radius:50%}.notification-indicator .mail-status.unread{display:inline-block}.notification-indicator:hover .mail-status{text-decoration:none;background-color:#0366d6}.HeaderNavlink{display:block;color:#fff}.page-responsive .HeaderNavlink{border-top:1px solid #444d56}@media (min-width: 1012px){.page-responsive .HeaderNavlink{border-top:0}}.HeaderNavlink:hover,.HeaderNavlink:focus{color:rgba(255,255,255,0.75);text-decoration:none}.HeaderNavlink:hover .dropdown-caret,.HeaderNavlink:focus .dropdown-caret{border-top-color:rgba(255,255,255,0.75)}.HeaderNavlink.selected{color:#fff}.HeaderNavlink.selected.js-menu-target{border-bottom-color:transparent}.HeaderNavlink.selected.tooltipped::before,.HeaderNavlink.selected.tooltipped::after{display:none}.user-nav .octicon{width:16px}.user-nav .octicon-plus{margin-right:1px}.user-nav .dropdown-menu{width:180px;margin-top:8px}.header-nav-current-user{padding-bottom:0;font-size:inherit}.header-nav-current-user .css-truncate-target{max-width:100%}.header-nav-current-user .user-profile-link{color:#24292e}.unsupported-browser{color:#211e14;background-image:linear-gradient(#feefae, #fae692);border-bottom:1px solid #b3a569}.mobile-banner button.switch-to-mobile{display:block;width:100%;padding:30px 0 45px;font-size:60px;font-weight:600;color:#eaeaea;text-align:center;background-color:#444;border:0}.hooks-listing .boxed-group-action.select-menu{z-index:auto}.hooks-listing .boxed-group-inner{padding:0 10px;margin-bottom:10px}.hook-item a:hover{text-decoration:none}.hook-item .item-status{float:left;width:16px;margin-right:8px;text-align:center}.hook-item .description{color:#6a737d}.hook-item .description .css-truncate-target{max-width:160px}.hook-item .icon-for-success,.hook-item .icon-for-failure,.hook-item .icon-for-pending,.hook-item .icon-for-mute,.hook-item .icon-for-inactive{display:none}.hook-item.success .icon-for-success{display:inline-block;color:#28a745}.hook-item.failure .icon-for-failure{display:inline-block;color:#cb2431}.hook-item.pending .icon-for-pending{display:inline-block;color:#6a737d}.hook-item.inactive .icon-for-inactive{display:inline-block;color:#6a737d}.hook-item.mute .icon-for-mute{display:inline-block;color:#6a737d}.hook-item .icon-for-enabled,.hook-item .icon-for-disabled{display:none}.hook-item.enabled .icon-for-enabled{display:inline-block;color:#28a745}.hook-item.disabled .icon-for-disabled{display:inline-block;color:#ccc}.hook-item .hook-error-message{margin-left:24px;color:#cb2431}.hook-url.css-truncate-target{max-width:360px}.hook-events-field .hook-event-selector{display:none}.hook-events-field.is-custom .hook-event-selector{display:block}.hook-event-selector{margin-left:10px}.hook-event{display:inline-block;width:310px;padding:5px 0 5px 30px;margin:0}.hook-event p{font-weight:400}.hook-event-choice{font-weight:400}.hooks-oap-warning{margin-top:0}.hooks-oap-warning ul{margin:10px 0}.hooks-oap-warning ul li{margin-left:16px}.hook-secret .hook-secret-standin{display:block}.hook-secret .hook-secret-field{display:none}.hook-secret.open .hook-secret-standin{display:none}.hook-secret.open .hook-secret-field{display:block}.hook-deliveries-list .loading-message{display:block}.hook-deliveries-list .error-message{display:none}.hook-deliveries-list.is-error .loading-message{display:none}.hook-deliveries-list.is-error .error-message{display:block}.hook-deliveries-list .spinner{display:inline-block;margin:0;vertical-align:top}.hook-deliveries-list .hook-delivery-item:hover{background-color:transparent}.hook-deliveries-list .item-status{display:inline-block;width:16px;margin-right:5px;text-align:center}.hook-deliveries-list .item-status .icon-for-success,.hook-deliveries-list .item-status .icon-for-failure,.hook-deliveries-list .item-status .icon-for-pending{display:none}.hook-deliveries-list .item-status.success{color:#28a745;visibility:visible}.hook-deliveries-list .item-status.success .icon-for-success{display:inline-block}.hook-deliveries-list .item-status.failure{color:#cb2431}.hook-deliveries-list .item-status.failure .icon-for-failure{display:inline-block}.hook-deliveries-list .item-status.pending{color:#6a737d}.hook-deliveries-list .item-status.pending .icon-for-pending{display:inline-block}.hook-deliveries-pagination-loading-message{display:none}.hook-deliveries-pagination-loading-message .animated-ellipsis-container{text-align:left}.hook-deliveries-pagination.loading .hook-deliveries-pagination-button{display:none}.hook-deliveries-pagination.loading .hook-deliveries-pagination-loading-message{display:block}.boxed-group-list li.hook-delivery-item{padding:10px}.hook-delivery-item .hook-delivery-details{display:none}.hook-delivery-item .hook-delivery-details .loading-message,.hook-delivery-item .hook-delivery-details .error-message{display:none}.hook-delivery-item .hook-delivery-details.is-loading .loading-message{display:block}.hook-delivery-item .hook-delivery-details.has-error .error-message{display:block}.hook-delivery-item.open .hook-delivery-details{display:block}.hook-delivery-item .loading-message{text-align:center}.hook-delivery-time{float:right;margin-right:10px;font-size:10px;color:#6a737d}.hook-delivery-guid{display:inline-block;padding:2px 6px;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:12px;color:rgba(0,0,0,0.5);background-color:rgba(209,227,237,0.5);border-radius:3px}.hook-delivery-guid .octicon{margin:1px -2px 0 0;color:#b0c4ce}.hook-delivery-actions{padding-top:1px}.boxed-group-list>li.hook-delivery-item .btn-sm{margin:0}.boxed-group-list>li.hook-delivery-item .hook-delivery-details .btn-sm{margin:5px 0 0}.hook-deliveries-list .error-message,.hook-delivery-details .error-message{padding:7px 4px;margin:10px 0}.hook-deliveries-list .error-message .octicon,.hook-delivery-details .error-message .octicon{position:relative;top:1px}.boxed-group span.animated-ellipsis-container,.boxed-group span.animated-ellipsis{padding:0}.boxed-group .animated-ellipsis-container{line-height:1.3}.hook-delivery-details{clear:right}.hook-delivery-details .error-message{margin-bottom:0}.hook-delivery-details .tabnav-tabcontent{display:none}.hook-delivery-details .tabnav-tabcontent.selected{display:block}.hook-delivery-details hr{margin:10px 0}.hook-delivery-details pre{padding:7px 12px;margin:10px 0;overflow:auto;font-size:13px;line-height:1.5;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px}.hook-delivery-details .tabnav{margin:10px 0}.hook-delivery-details h4.remote-call-header{margin:20px 0 10px;border-bottom:1px solid #959da5}.hook-delivery-response-status{display:inline-block;padding:4px 6px 3px;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:10px;line-height:1.1;color:#fff;background-color:#d73a49;border-radius:3px}.hook-delivery-response-status[data-response-status^=\"2\"]{background-color:#28a745}.redelivery-dialog .pending-message{display:block}.redelivery-dialog .failure-message{display:none}.redelivery-dialog.failed{color:#9c2400;background-image:linear-gradient(#f8d8d8, #efd0d0);border-color:#da9797}.redelivery-dialog.failed .pending-message{display:none}.redelivery-dialog.failed .failure-message{display:block}.redelivering-hook-delivery .error-message{display:none}.redelivering-hook-delivery.is-error .loading-message{display:none}.redelivering-hook-delivery.is-error .error-message{display:block}.test-hook-message .success-message,.test-hook-message .error-message{display:none;margin-top:10px}.test-hook-message.success .success-message{display:block}.test-hook-message.error .error-message{display:block}.item-name{float:left;font-weight:600}.integration-meta-head{font-size:16px;color:#586069}.integrations-select-repos{max-height:138px;overflow-y:scroll;border-radius:3px}.integrations-select-repos .mini-repo-list-item{padding:8px 64px 8px 30px}.integrations-select-repos .mini-repo-list-item:hover .repo,.integrations-select-repos .mini-repo-list-item:hover .owner{text-decoration:none}.integrations-select-repos .mini-repo-list-item .css-truncate-target{max-width:345px}.integrations-select-repos::-webkit-scrollbar{width:10px}.integrations-select-repos::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.5);border:solid #fff 2px;border-radius:6px;box-shadow:0 0 1px rgba(255,255,255,0.5)}.integrations-select-repos::-webkit-scrollbar-track-piece{background:transparent}.integrations-repository-picker{position:relative;top:-5px;width:440px}.integrations-repository-picker .select-menu-modal{width:440px}.integrations-repository-picker .autocomplete-results{border:0}.integrations-repository-picker .select-menu .search-status{display:none}.integrations-repository-picker .select-menu.is-loading .search-status{display:block}.integrations-repository-picker .subnav-search{margin-bottom:5px;margin-left:0}.integrations-repository-picker .flash{padding:10px;margin-bottom:10px}dl.form-group>dd .integrations-repository-picker .form-control{margin-right:0}.integrations-repository-picker .octicon-x{position:absolute;top:8px;right:10px;cursor:pointer}.target-avatar{position:relative;top:-2px}.issue-list em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,255,140,0.5);border-radius:3px}.issue-list .title{min-height:24px;padding:0;margin:0 80px 10px 0;font-size:18px;font-weight:400;line-height:24px;word-wrap:break-word}.issue-list .title .octicon{position:absolute;top:-4px;left:0;color:#888}.issue-list .title .closed.octicon{color:#cb2431}.issue-list .title .open.octicon{color:#28a745}.issue-list .title .merged.octicon{color:#6f42c1}.issue-list .description{margin:0 0 10px;overflow:hidden;line-height:20px}.issue-list-item+.issue-list-item{border-top:1px #e1e4e8 solid}.issues-reset-query-wrapper{margin-bottom:20px}.label-link:hover{text-decoration:none}.issues-reset-query{font-weight:600;color:#586069}.issues-reset-query:hover{color:#0366d6;text-decoration:none}.issues-reset-query:hover .issues-reset-query-icon{background-color:#0366d6}.issues-reset-query-icon{width:18px;height:18px;padding:1px;margin-right:3px;color:#fff;text-align:center;background-color:#6a737d;border-radius:3px}.table-list-milestones .table-list-cell{padding:15px 20px}.table-list-milestones .stat{display:inline-block;font-size:14px;font-weight:600;line-height:1.2;color:#555;white-space:nowrap}.table-list-milestones .stat a{color:inherit}.table-list-milestones .stat+.stat{margin-left:15px}.table-list-milestones .stat-label{font-weight:400;color:#586069}.milestone-title{width:500px}.milestone-title-link{margin-top:0;margin-bottom:5px;font-size:24px;font-weight:400;line-height:1.2}.milestone-title-link a{color:#333}.milestone-title-link a:hover{color:#0366d6}.milestone-progress{width:420px}.milestone-progress .progress-bar{margin-top:7px;margin-bottom:12px}.milestone-meta{font-size:14px}.milestone-meta-item{display:inline-block;margin-right:10px}.milestone-meta-item .octicon{width:16px;text-align:center}.milestone-description-html{display:none}.milestone-description{margin-top:5px}.milestone-description .expand-more{color:#0366d6;cursor:pointer}.milestone-description .expand-more:hover{text-decoration:underline}.milestone-description.open .milestone-description-plaintext{display:none}.milestone-description.open .milestone-description-html{display:block}.issue-reorder-warning{z-index:110}.task-progress{color:#586069;text-decoration:none;vertical-align:top}.task-progress .octicon{margin-right:5px;color:#999;vertical-align:bottom}.task-progress .progress-bar{display:inline-block;width:80px;height:5px;vertical-align:2px;background-color:#eee}.task-progress .progress-bar .progress{background-color:#ccc}.task-progress-counts{display:inline-block;margin-right:6px;margin-left:-2px;font-size:12px}a.task-progress:hover{color:#0366d6}a.task-progress:hover .octicon{color:inherit}a.task-progress:hover .progress-bar .progress{background-color:#0366d6}.issues-listing{position:relative}.issues-listing .octocat-search{position:absolute;right:0;height:250px;margin:-132px -4px;transform:scaleX(-1)}.issue-meta-section .octicon{color:#ccc;vertical-align:bottom}.issue-milestone{max-width:240px}.issue-milestone .css-truncate-target{max-width:100px}.milestone-link .octicon{font-size:14px}.milestone-link:hover .octicon{color:inherit}.new-issue-form{padding-top:20px;margin-top:15px;border-top:1px solid #ddd}.new-issue-form::before{display:table;content:\"\"}.new-issue-form::after{display:table;clear:both;content:\"\"}.new-issue-form .discussion-timeline::before{display:none}.new-pr-form{margin-top:15px;margin-bottom:20px}.new-pr-form::before{display:table;content:\"\"}.new-pr-form::after{display:table;clear:both;content:\"\"}.new-pr-form .discussion-timeline::before{display:none}.new-pr-form .discussion-sidebar{position:relative}.label-select-menu .description{margin-left:19px}.label-select-menu .color{display:inline-block;width:14px;height:14px;margin-top:-1px;margin-right:2px;vertical-align:middle;border-radius:3px}.label-select-menu .selected .select-menu-item-icon{color:inherit !important}.label-select-menu .selected:active{background-color:transparent !important}.label-select-menu .select-menu-item{position:relative}.label-select-menu .select-menu-item[aria-selected=\"true\"],.label-select-menu .select-menu-item.navigation-focus{color:inherit;background-color:#f4f4f4}.label-select-menu .select-menu-item[aria-selected=\"true\"] .select-menu-item-icon,.label-select-menu .select-menu-item.navigation-focus .select-menu-item-icon{color:transparent}.label-select-menu>form{position:relative}.closed-banner{height:7px;margin:15px 0 15px 60px;overflow:hidden;background:url(\"/images/modules/comments/closed_pattern.gif\");border-radius:3px}.subnav .btn+.issues-search{padding-right:10px;border-right:1px solid #eee}.reaction-sort-item{float:left;width:39px;padding:5px;margin-top:5px;text-align:center;pointer-events:all;border:solid 1px transparent;border-radius:3px;opacity:0.7}.reaction-sort-item:hover,.reaction-sort-item.selected:hover,.reaction-sort-item[aria-selected=\"true\"],.reaction-sort-item.navigation-focus{text-decoration:none;background-color:#0366d6;opacity:1}.reaction-sort-item.selected{background-color:#f1f8ff;border-color:#0366d6;opacity:1}body.emoji-size-boost .reaction-sort-item g-emoji{margin-left:-3px}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){body.emoji-size-boost .reaction-sort-item g-emoji{margin-left:0}}.issue-keyword{border-bottom:1px dotted #959da5}.issue-keyword:hover{border-bottom:0}.new-label-color-dimensions{width:24px;height:24px}.select-menu-item[aria-selected=\"true\"]>.octicon.label-options-icon,.select-menu-item.navigation-focus>.octicon.label-options-icon{color:#24292e}.new-label-color-input:invalid{color:#cb2431}.repository-lang-stats{position:relative}.repository-lang-stats ol.repository-lang-stats-numbers li{display:table-cell;width:1%;padding:10px 5px;text-align:center;white-space:nowrap;border-bottom:0}.repository-lang-stats ol.repository-lang-stats-numbers li span.percent{float:none}.repository-lang-stats ol.repository-lang-stats-numbers li>a,.repository-lang-stats ol.repository-lang-stats-numbers li>span{font-weight:600;color:#6a737d;text-decoration:none}.repository-lang-stats ol.repository-lang-stats-numbers li .lang{color:#24292e}.repository-lang-stats ol.repository-lang-stats-numbers li .language-color{display:inline-block;width:10px;height:10px;border-radius:50%}.repository-lang-stats ol.repository-lang-stats-numbers li a:hover{background:transparent}.stats-switcher-viewport{height:41px;overflow:hidden}.stats-switcher-viewport .stats-switcher-wrapper{position:relative;top:0;transition:top 0.25s ease-in-out}.stats-switcher-viewport.is-revealing-lang-stats .stats-switcher-wrapper{top:-41px}.stats-switcher-viewport.is-revealing-overview .stats-switcher-wrapper{top:41px}.repository-lang-stats-graph{width:100%;overflow:hidden;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #ddd;border-top:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.repository-lang-stats-graph .language-color{line-height:8px;text-indent:-9999px}.repository-lang-stats-graph .language-color:first-child{border-bottom-left-radius:2px}.repository-lang-stats-graph .language-color:last-child{border-bottom-right-radius:2px}.facebox-loading,.octocat-spinner{min-height:64px;background-image:url(\"/images/spinners/octocat-spinner-64.gif\");background-repeat:no-repeat;background-position:center center}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.facebox-loading,.octocat-spinner{background-image:url(\"/images/spinners/octocat-spinner-128.gif\");background-size:64px 64px}}.MarketplaceJumbotron{background-color:#2f363d;background-image:url(\"/images/modules/marketplace/bg-hero.svg\");background-repeat:repeat-y;background-position:center top;background-size:150% auto}@media (min-width: 768px){.MarketplaceJumbotron{background-repeat:no-repeat;background-size:cover}}.CircleBadge--feature{position:relative;top:0;transition:top 0.15s ease-in, box-shadow 0.12s ease-in}.MarketplaceFeature-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}.MarketplaceFeature{min-width:250px}.MarketplaceFeature-text{opacity:0.7;transition:opacity 0.12s ease-in}.MarketplaceFeature-link:hover .CircleBadge--feature{top:-3px;box-shadow:0 3px 8px 0 rgba(0,0,0,0.2)}.MarketplaceFeature-link:hover .MarketplaceFeature-text{opacity:1}.MarketplaceFeature-link:active .CircleBadge--feature{top:0;box-shadow:0}.MarketplaceSideNav{-webkit-overflow-scrolling:touch;background-color:#f6f8fa}@media (min-width: 768px){.MarketplaceSideNav{background-color:#fff;border-right:1px #e1e4e8 solid}}.ScreenshotCarousel{border:1px #e1e4e8 solid;border-radius:3px}.ScreenshotCarousel-screenshot{display:none;padding:16px}.ScreenshotCarousel-screenshot.active{display:block}.ScreenshotCarousel-nav{display:flex;overflow-x:auto;align-items:top;box-shadow:inset 0 1px 0 #e1e4e8}.ScreenshotCarousel-navitem{width:20%;min-width:120px;padding:16px;cursor:pointer;border-right:1px #e1e4e8 solid}.ScreenshotCarousel-navitem:last-child{border-right:0}.ScreenshotCarousel-navitem.selected{background-color:#f6f8fa;box-shadow:inset 0 0 4px rgba(36,41,46,0.15)}.marketplace-plan-edit-unit,.marketplace-plan-edit-unit-label,.marketplace-plan-edit-price{display:none}.marketplace-plan-enable-free-trial{display:none}.marketplace-plan-editor[data-model=\"FLAT_RATE\"] .marketplace-plan-edit-price{display:block}.marketplace-plan-editor[data-model=\"FLAT_RATE\"] .marketplace-plan-enable-free-trial{display:block}.marketplace-plan-editor[data-model=\"PER_UNIT\"] .marketplace-plan-edit-price,.marketplace-plan-editor[data-model=\"PER_UNIT\"] .marketplace-plan-edit-unit{display:block}.marketplace-plan-editor[data-model=\"PER_UNIT\"] .marketplace-plan-edit-unit-label{display:inline}.marketplace-plan-editor[data-model=\"PER_UNIT\"] .marketplace-plan-enable-free-trial{display:block}.marketplace-listing-screenshot-container{width:175px;min-height:175px;background-repeat:no-repeat;background-position:center center;background-size:cover}.marketplace-listing-screenshot-container .marketplace-listing-screenshot{min-width:100%;min-height:100%;opacity:0}.marketplace-listing-screenshot-zoom{display:none;cursor:move}.marketplace-listing-details-sidebar{order:2}@media (min-width: 768px){.marketplace-listing-details-sidebar{order:1}}.marketplace-listing-details-description{order:1}@media (min-width: 768px){.marketplace-listing-details-description{order:2}}.marketplace-listing-screenshot-link{height:100px;cursor:move}.marketplace-listing-screenshot-link:hover .marketplace-listing-screenshot-zoom,.marketplace-listing-screenshot-link:focus .marketplace-listing-screenshot-zoom{top:0;left:0;display:block;width:100%;height:100%;padding-top:28px;background-color:rgba(255,255,255,0.75)}.marketplace-integratable-logo{width:40px;height:40px}.marketplace-listing-save-notice,.marketplace-listing-save-error{display:none;opacity:0;transition:opacity 0.15s linear}.marketplace-listing-save-notice.visible,.marketplace-listing-save-error.visible{display:inline-block;opacity:1}.marketplace-listing-screenshot-delete-form{position:absolute;bottom:-24px;width:100%;text-align:center}.marketplace-plan-dollar-field-container .price-note{display:none}.marketplace-plan-dollar-field-container.is-errored .price-note{display:block}.marketplace-plan-dollar-field-container.is-errored .form-control{border-color:#d73a49}.marketplace-plan-emphasis{color:#24292e}.selected .marketplace-plan-emphasis{color:#fff}.marketplace-plan-unit-name-preview::before{content:\"per \"}.marketplace-plan-per-time{clear:right}.marketplace-billing-modal{width:540px;max-height:90vh}.marketplace-listing-markdown,.marketplace-url-link{word-wrap:break-word;white-space:pre-wrap}.marketplace-listing-markdown{line-height:1.4}.integrations-promo-bg{background-image:url(\"/images/modules/works-with/build-your-own.svg\");background-repeat:no-repeat;background-size:0 0}@media (min-width: 544px){.integrations-promo-bg{background-position:top right;background-size:auto 100%}}.marketplace-product-callout{border-color:#d1d5da !important}.marketplace-product-callout::before,.marketplace-product-callout::after{display:none}.marketplace-product-callout .branch-action-item-icon{color:#586069;background-color:#e1e4e8}.filter-item.selected .Label--outline-white{color:#fff;border-color:#fff}.MarketplaceEdit-body{min-height:570px}.MarketplaceEdit-body .pricing-model-selector{width:calc(100% - 12px);max-width:100% !important}.MarketplaceEdit-body .Box-row--pending{box-shadow:2px 0 0 #f9c513 inset}.MarketplaceEdit-body .menu{border-right:0;border-left:0;border-radius:0}.MarketplaceEdit-body .menu-item{padding:12px 16px;background:#fafbfc}.MarketplaceEdit-body .menu-item.selected{background:#fff}.MarketplaceEdit-body .menu-item:hover{background:#f6f8fa}.MarketplaceEdit-body .menu-item.selected::before{position:absolute;top:0;bottom:0;left:0;width:3px;content:\"\";background-color:#f66a0a}.MarketplaceEdit-body .menu-item:first-child::before{border-top-left-radius:0}.MarketplaceEdit-body .CircleIcon{display:inline-block;width:32px;height:32px;font-weight:bold;line-height:32px;color:#586069;text-align:center;background:#e6ebf1;border-radius:100%}.MarketplaceEdit-body .CircleIcon .octicon{display:inline-block}.MarketplaceEdit-body .CircleIcon--success{color:#fff;background:#28a745}.MarketplaceInsights-graph .insights-month .tick:nth-child(2n){visibility:hidden}.CircleBadge--tiny{width:32px;height:32px}.CircleBadge--github{position:relative}.CircleBadge--github.CircleBadge--large::after{right:5px;bottom:5px}.CircleBadge--github.CircleBadge--small::after{right:-5px;bottom:-5px}.CircleBadge--github::after{position:absolute;right:0;bottom:0;display:block;width:22px;height:22px;padding:3px;line-height:0;content:\"\";background:#fff url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyMnB4IiBoZWlnaHQ9IjIycHgiIHZpZXdCb3g9IjAgMCAyMiAyMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4gICAgICAgIDx0aXRsZT5TaGFwZSBDb3B5PC90aXRsZT4gICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+ICAgIDxkZWZzPjwvZGVmcz4gICAgPGcgaWQ9IktpdGNoZW4tc2luayIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+ICAgICAgICA8ZyBpZD0iT2N0aWNvbnMiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zNzAuMDAwMDAwLCAtMTU4NC4wMDAwMDApIiBmaWxsPSIjMUIxRjIzIj4gICAgICAgICAgICA8cGF0aCBkPSJNMzgxLDE1ODQgQzM3NC45MjI1LDE1ODQgMzcwLDE1ODguOTIyNSAzNzAsMTU5NSBDMzcwLDE1OTkuODY3NSAzNzMuMTQ4NzUsMTYwMy45Nzg3NSAzNzcuNTIxMjUsMTYwNS40MzYyNSBDMzc4LjA3MTI1LDE2MDUuNTMyNSAzNzguMjc3NSwxNjA1LjIwMjUgMzc4LjI3NzUsMTYwNC45MTM3NSBDMzc4LjI3NzUsMTYwNC42NTI1IDM3OC4yNjM3NSwxNjAzLjc4NjI1IDM3OC4yNjM3NSwxNjAyLjg2NSBDMzc1LjUsMTYwMy4zNzM3NSAzNzQuNzg1LDE2MDIuMTkxMjUgMzc0LjU2NSwxNjAxLjU3MjUgQzM3NC40NDEyNSwxNjAxLjI1NjI1IDM3My45MDUsMTYwMC4yOCAzNzMuNDM3NSwxNjAwLjAxODc1IEMzNzMuMDUyNSwxNTk5LjgxMjUgMzcyLjUwMjUsMTU5OS4zMDM3NSAzNzMuNDIzNzUsMTU5OS4yOSBDMzc0LjI5LDE1OTkuMjc2MjUgMzc0LjkwODc1LDE2MDAuMDg3NSAzNzUuMTE1LDE2MDAuNDE3NSBDMzc2LjEwNSwxNjAyLjA4MTI1IDM3Ny42ODYyNSwxNjAxLjYxMzc1IDM3OC4zMTg3NSwxNjAxLjMyNSBDMzc4LjQxNSwxNjAwLjYxIDM3OC43MDM3NSwxNjAwLjEyODc1IDM3OS4wMiwxNTk5Ljg1Mzc1IEMzNzYuNTcyNSwxNTk5LjU3ODc1IDM3NC4wMTUsMTU5OC42MyAzNzQuMDE1LDE1OTQuNDIyNSBDMzc0LjAxNSwxNTkzLjIyNjI1IDM3NC40NDEyNSwxNTkyLjIzNjI1IDM3NS4xNDI1LDE1OTEuNDY2MjUgQzM3NS4wMzI1LDE1OTEuMTkxMjUgMzc0LjY0NzUsMTU5MC4wNjM3NSAzNzUuMjUyNSwxNTg4LjU1MTI1IEMzNzUuMjUyNSwxNTg4LjU1MTI1IDM3Ni4xNzM3NSwxNTg4LjI2MjUgMzc4LjI3NzUsMTU4OS42Nzg3NSBDMzc5LjE1NzUsMTU4OS40MzEyNSAzODAuMDkyNSwxNTg5LjMwNzUgMzgxLjAyNzUsMTU4OS4zMDc1IEMzODEuOTYyNSwxNTg5LjMwNzUgMzgyLjg5NzUsMTU4OS40MzEyNSAzODMuNzc3NSwxNTg5LjY3ODc1IEMzODUuODgxMjUsMTU4OC4yNDg3NSAzODYuODAyNSwxNTg4LjU1MTI1IDM4Ni44MDI1LDE1ODguNTUxMjUgQzM4Ny40MDc1LDE1OTAuMDYzNzUgMzg3LjAyMjUsMTU5MS4xOTEyNSAzODYuOTEyNSwxNTkxLjQ2NjI1IEMzODcuNjEzNzUsMTU5Mi4yMzYyNSAzODguMDQsMTU5My4yMTI1IDM4OC4wNCwxNTk0LjQyMjUgQzM4OC4wNCwxNTk4LjY0Mzc1IDM4NS40Njg3NSwxNTk5LjU3ODc1IDM4My4wMjEyNSwxNTk5Ljg1Mzc1IEMzODMuNDIsMTYwMC4xOTc1IDM4My43NjM3NSwxNjAwLjg1NzUgMzgzLjc2Mzc1LDE2MDEuODg4NzUgQzM4My43NjM3NSwxNjAzLjM2IDM4My43NSwxNjA0LjU0MjUgMzgzLjc1LDE2MDQuOTEzNzUgQzM4My43NSwxNjA1LjIwMjUgMzgzLjk1NjI1LDE2MDUuNTQ2MjUgMzg0LjUwNjI1LDE2MDUuNDM2MjUgQzM4OC44NTEyNSwxNjAzLjk3ODc1IDM5MiwxNTk5Ljg1Mzc1IDM5MiwxNTk1IEMzOTIsMTU4OC45MjI1IDM4Ny4wNzc1LDE1ODQgMzgxLDE1ODQgTDM4MSwxNTg0IFoiIGlkPSJTaGFwZS1Db3B5Ij48L3BhdGg+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=\") center no-repeat;border-radius:100px}body.min-width-0.page-responsive .flash-full .container{width:100%;max-width:980px}.member-list-item .table-list-cell-checkbox{width:30px}.member-list-item.adminable .member-info{padding-left:5px}.member-list-item .member-avatar-cell{width:58px}.member-list-item .dropdown-menu-content{text-align:left}.member-info{width:450px}.member-info .css-truncate-target{max-width:430px}.member-meta .select-menu-modal{width:310px}.member-meta .select-menu-modal-holder{right:0;text-align:left}.triage-mode .none-selected{display:none}.member-role-menu .select-menu-item-text{padding-right:8px}.merge-branch-heading{margin:0;line-height:1;color:#24292e}.merge-branch-description{margin-right:160px;margin-bottom:-5px;line-height:1.6em;color:#586069}.merge-branch-description .zeroclipboard-link .octicon{top:2px}.alt-merge-options{display:inline-block;margin-bottom:0;margin-left:4px;vertical-align:middle}.merged .merge-branch-description .commit-ref .css-truncate-target{max-width:180px}.merge-branch-prh-output{margin-top:10px}.merge-branch-form{display:none;padding-left:64px}.merge-branch.open .merge-branch-form{display:block}.merge-branch.open .merge-message{display:none}.merge-branch-manually{display:none;padding-top:15px;margin-top:14px;background-color:transparent;border-top:1px solid #ddd}.merge-branch-manually p{margin-bottom:0}.merge-branch-manually h3{margin-bottom:10px}.merge-branch-manually .intro{padding-bottom:10px;margin-top:0}.merge-branch-manually .step{margin:15px 0 5px}.merge-branch-manually .url-box{padding:0;margin-left:0;border:0}.merge-branch-manually .copyable-terminal{background-color:#f2f2f2}.open .merge-branch-manually{display:block}.select-menu-merge-method{width:310px}.merge-pr.is-rebasing .commit-form-fields{margin-top:-110px;opacity:0;transition:opacity 0.15s linear 0s, margin-top 0.25s ease 0.1s}.merge-pr .btn-group-merge,.merge-pr.is-squashing .btn-group-squash,.merge-pr.is-rebasing .btn-group-rebase{display:inline-block}.merge-pr .merging-body,.merge-pr .rebasing-body,.merge-pr .squashing-body{display:none}.merge-pr.is-merging .merging-body,.merge-pr.is-rebasing .rebasing-body,.merge-pr.is-squashing .squashing-body{display:block}.merge-pr .btn-group-squash,.merge-pr .btn-group-rebase,.merge-pr.is-squashing .btn-group-merge,.merge-pr.is-rebasing .btn-group-merge{display:none;margin-left:0}.commit-form-fields{transition:opacity 0.15s linear 0.1s, margin-top 0.25s ease 0s}.unavailable-merge-method{display:block;margin-top:6px;color:#a04100}[aria-selected=\"true\"].disabled .unavailable-merge-method,.navigation-focus.disabled .unavailable-merge-method{color:#fff}.network .network-tree{vertical-align:middle}.network .gravatar{margin-right:4px;vertical-align:middle;border-radius:3px}.network .octicon{display:inline-block;width:16px;margin-left:2px;text-align:center;vertical-align:middle}.network .current-repository{background-color:#fff5b1}.page-new-repo .octicon-repo{color:#959da5}.page-new-repo .octicon-lock{color:rgba(115,92,15,0.5)}.page-new-repo ul.repo-templates{margin:10px 0}.page-new-repo ul.repo-templates>li{display:inline-block;margin:0 10px 0 0;list-style-type:none}.page-new-repo ul.repo-templates .select-menu{float:left}.page-new-repo .form-checkbox .octicon{float:left;margin-right:5px}.page-new-repo .form-checkbox.disabled{color:#6a737d}.page-new-repo .license-info{float:left;margin-top:5px;margin-left:10px;color:#0366d6}.new-repo-container{width:700px;margin:40px auto 0}.new-repo-container .Subhead{margin-bottom:30px}.owner-reponame dl.form-group{margin-top:5px;margin-bottom:0}.owner-reponame .slash{float:left;padding-top:32px;margin:0 8px;font-size:21px;color:#586069}.reponame-suggestion{color:#34631a;cursor:pointer}.upgrade-upsell{padding-left:33px}.cc-upgrade{padding-left:20px}.featured-license{font-weight:600}.license-container{padding-left:15px;border-left:1px solid #ccc}.news .account-switcher{margin-bottom:20px}.news .release{margin-top:0;margin-bottom:0}.news blockquote{color:#586069}.news h1{margin-bottom:0}.news .alert{position:relative;padding:0 0 1em 45px;overflow:hidden;border-top:1px solid #eff3f6}.news .alert .commits{padding-left:40px}.news .alert .css-truncate.css-truncate-target,.news .alert .css-truncate .css-truncate-target{max-width:180px}.news .alert p{margin:0}.news .alert .markdown-body blockquote{padding:0 0 0 40px;border:0 none}.news .alert .octicon{color:#959da5}.news .alert .dashboard-event-icon{position:absolute;top:18px;left:22px;transform:translateX(-50%)}.news .alert .body{padding:1em 0 0;overflow:hidden;font-size:14px;border-bottom:0}.news .alert .time{font-size:12px;color:#959da5}.news .alert .title{padding:0;font-weight:600}.news .alert .title .subtle{color:#959da5}.news .alert .gravatar{float:left;margin-right:0.6em;line-height:0;background-color:#fff;border-radius:3px}.news .alert .simple .title{display:inline-block;font-size:13px;font-weight:400;color:#586069}.news .alert .simple .time{display:inline-block}.news .alert .branch-link{position:relative;top:-2px;margin:0;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;color:#4183c4}.news .alert .branch-link .octicon{display:none}.news .alert:first-child{border-top:0}.news .alert:first-child .body{padding-top:0}.news .alert:first-child .dashboard-event-icon{top:0}.news .github-welcome .done{color:#586069;text-decoration:line-through}.news .commits li{margin-top:0.15em;list-style-type:none}.news .commits li.more{padding-top:2px;font-size:11px}.news .commits li .committer{display:none;padding-left:0.5em}.news .commits li img{margin:0 1px 0 0;vertical-align:middle;background-color:#fff;border-radius:2px}.news .commits li img.emoji{padding:0;margin:0;border:0}.news .commits li .message{display:inline-block;max-width:390px;margin-top:2px;overflow:hidden;font-size:13px;line-height:1.3;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}.news div.message,.news li blockquote{display:inline;font-size:13px;color:#586069}.notification-routing .notification-email .edit-link{margin-right:10px;font-weight:600}.notification-routing .notification-email .btn-sm{float:none;margin:-2px 0 0}.notification-routing .notification-email .edit-form{display:none}.notification-routing .notification-email.open .edit-form{display:block}.notification-routing .notification-email.open .email-display{display:none}.notifications .list-group-item{padding-top:8px;padding-bottom:8px;padding-left:35px;border-width:1px 0 0}.notifications .list-group-item:first-child{border:0}.notifications .list-group-item-name{display:block;max-width:400px;font-size:14px;line-height:1.5em}.notifications .list-group-item-name a{display:block;max-width:460px}.notifications .notifications-more{padding:0}.notifications .notifications-more>a{display:block;padding:10px 15px;font-weight:600;color:#0366d6;text-align:center}.notifications .notifications-more>a:hover{text-decoration:underline}.notifications .read .type-icon{color:#586069}.notifications .read .list-group-item-name>a{color:#586069}.notifications .read .notification-actions{color:#586069}.notifications .read .avatar-stack{opacity:0.5}.notifications .read .undo{display:block}.notifications .read .delete{visibility:hidden}.notifications .read[aria-selected=\"true\"],.notifications .read.navigation-focus{background-color:#f5f9fc}.notifications .muted .unmute{display:block}.notifications .muted .mute{display:none}.notifications .unmute{display:none}.notifications-sso-prompt{padding:0}.notifications-sso-prompt[aria-selected=\"true\"],.notifications-sso-prompt.navigation-focus{background-color:#f5f9fc}.notifications-sso-prompt a{display:block;padding:10px 15px;color:#586069;text-align:center;background:none;border:0;outline:none}.notifications-sso-prompt a:hover{text-decoration:none}.notifications-sso-prompt em{font-style:normal;color:#0366d6}.notifications-sso-prompt a:hover em{text-decoration:underline}.notifications-sso-prompt strong{font-weight:bold}.type-icon-state-none{color:#586069}.type-icon-state-open{color:#28a745}.type-icon-state-closed{color:#cb2431}.type-icon-state-merged{color:#6f42c1}.notifications-list{float:left;width:100%}.notifications-list .notifications-repo-link{max-width:500px}.notifications-list .boxed-group .notification-success{position:absolute;right:3px;width:220px;margin-top:4px;font-size:13px;color:#28a745;text-align:right;visibility:hidden;opacity:0;transition:opacity 0.35s ease-in-out, transform 0.35s ease-in-out;transform:translateX(10px)}.notifications-list .mark-all-as-read{padding:2px 6px 5px 10px;margin-top:0;margin-right:0;line-height:20px;color:#586069;background-color:transparent;border:0}.notifications-list .mark-all-as-read-confirmed .notification-success{visibility:visible;opacity:1;transform:translateX(0)}.notifications-list .mark-all-as-read-confirmed .mark-all-as-read{visibility:hidden}.notifications-list .confirmation{max-height:0;padding:0;overflow:hidden;color:#666;text-align:center;opacity:0;transition:opacity 0.4s ease-in-out, max-height 0.4s ease-in-out, padding 0.4s ease-in-out}.notifications-list .confirmation+.list-group-item{margin-top:-1px;border-top-color:#d5d5d5}.notifications-list .confirmation.mark-all-as-read-confirmed{max-height:300px;padding:10px 0;opacity:1}.notification-actions{position:absolute;top:8px;right:10px;list-style:none}.notification-actions li{float:right;margin-left:10px;font-size:16px;line-height:20px}.notification-actions .age{width:120px;font-size:12px;color:#586069}.notification-actions .undo{position:absolute;top:0;display:none}.notification-actions .btn-link{padding-right:5px;padding-left:5px;line-height:inherit;color:#586069}.notification-actions .btn-link:hover{color:#0366d6;text-decoration:none}.repo-subscription-container{width:600px;margin-right:auto;margin-left:auto}.repo-subscription-container .spinner{float:right}.repo-subscription-container h2{margin-top:24px;margin-bottom:16px;font-size:22px;font-weight:400}.repo-subscription-container .intro{font-size:14px;color:#666}.repo-subscription-label{display:inline-block}.subscriptions-content .repo-icon{margin-right:5px;color:#666;vertical-align:middle}.subscriptions-content .repo-list form{display:inline}.subscriptions-content .repo-list .only-loading{display:none}.subscriptions-content .repo-list .loading .only-loading{display:inline-block}.subscriptions-content .repo-list .only-unsubed{display:none}.subscriptions-content .repo-list .unsubscribed .only-unsubed{display:inline}.subscriptions-content .repo-list .unsubscribed .only-subed{display:none}.subscriptions-content .repo-list .only-unignored{display:none}.subscriptions-content .repo-list .unsubscribed .only-unignored{display:inline}.subscriptions-content .repo-list .unsubscribed .only-ignored{display:none}.thread-subscription-status{padding:10px;margin:40px 0 20px;color:#586069;background-color:#fff;border:1px solid #eee;border-radius:3px}.thread-subscription-status .octicon-radio-tower{margin-right:10px;margin-left:4px;color:#ccc;vertical-align:middle}.thread-subscription-status .btn-sm>.octicon{margin-right:1px}.thread-subscription-status .reason{display:inline-block;margin:0 10px;vertical-align:middle}.thread-subscription-status .thread-subscribe-form{display:inline-block;vertical-align:middle}.subscription .loading{opacity:0.5}.oauth-permissions-details{position:relative;padding:15px;margin:0;list-style:none;border-bottom:1px solid #f2f2f2}.oauth-permissions-details:first-child{border-radius:3px 3px 0 0}.oauth-permissions-details:last-child{border:0;border-radius:0 0 3px 3px}.oauth-permissions-details.oauth-public-data-only{border-radius:3px}.oauth-permissions-details .markdown-body{font-size:13px}.oauth-permissions-details .content{display:none;margin-left:45px}.oauth-permissions-details .content .form-checkbox{margin-left:0}.oauth-permissions-details .content .form-checkbox:last-child{margin-bottom:0}.oauth-permissions-details .octicon{float:left;color:#586069;text-align:center}.oauth-permissions-details .permission-help{font-size:13px}.oauth-permissions-details .permission-help ul{padding-left:20px;margin:1em 0}.oauth-permissions-details .permission-summary{margin-left:45px}.oauth-permissions-details .permission-summary .access-details{position:relative;color:#586069}.oauth-permissions-details .permission-summary em.highlight{position:relative;padding:2px 3px;margin-right:-2px;margin-left:-3px;font-style:normal;color:#4c4a42;background:#fff9ea;border-radius:3px}.oauth-permissions-details .permission-title{display:block;color:#000}.oauth-permissions-details a.btn-sm{float:right;margin-top:4px}.oauth-permissions-details.open a.btn-sm{background-color:#dcdcdc;background-image:none;border-color:#b5b5b5;box-shadow:inset 0 2px 4px rgba(0,0,0,0.15)}.oauth-permissions-details.open .content{display:block}.oauth-permissions-details.default:not(.delete) .no-access,.oauth-permissions-details.default:not(.delete) .default-access,.oauth-permissions-details.none .no-access,.oauth-permissions-details.none .default-access{display:inline}.oauth-permissions-details.default:not(.delete) .access-details,.oauth-permissions-details.default:not(.delete) .permission-title,.oauth-permissions-details.none .access-details,.oauth-permissions-details.none .permission-title{color:#6a737d}.oauth-permissions-details.default:not(.delete) .octicon,.oauth-permissions-details.none .octicon{color:#ccc}.oauth-permissions-details.default .default-access{display:inline}.oauth-permissions-details.full .full-access{display:inline}.oauth-details-toggle{position:absolute;top:0;right:0;padding:20px 15px}.oauth-details-toggle .octicon-chevron-up{display:none}.open .oauth-details-toggle .octicon-chevron-down{display:none}.open .oauth-details-toggle .octicon-chevron-up{display:block}.oauth-user-permissions .full-access,.oauth-user-permissions .limited-access,.oauth-user-permissions .limited-access-emails-followers,.oauth-user-permissions .limited-access-emails-profile,.oauth-user-permissions .limited-access-followers-profile,.oauth-user-permissions .limited-access-profile,.oauth-user-permissions .limited-access-followers,.oauth-user-permissions .limited-access-emails,.oauth-user-permissions .no-access{display:none}.oauth-user-permissions.limited.limited-email .limited-access-emails{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile .limited-access-emails-profile{display:inline}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-profile,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-profile,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-emails-followers,.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access-followers-profile{display:none}.oauth-user-permissions.limited.limited-email.limited-profile.limited-follow .limited-access{display:inline}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails,.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-followers{display:none}.oauth-user-permissions.limited.limited-email.limited-follow .limited-access-emails-followers{display:inline}.oauth-user-permissions.limited.limited-follow .limited-access-followers{display:inline}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers,.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-profile{display:none}.oauth-user-permissions.limited.limited-follow.limited-profile .limited-access-followers-profile{display:inline}.oauth-user-permissions.limited.limited-profile .limited-access-profile{display:inline}.oauth-repo-permissions .default-access,.oauth-repo-permissions .public-access,.oauth-repo-permissions .limited-repo-invite-access,.oauth-repo-permissions .full-access{display:none}.oauth-repo-permissions.public .public-access{display:inline}.oauth-delete-repo-permissions .octicon-alert{color:#cb2431}.oauth-repo-status-permissions .no-access,.oauth-repo-status-permissions .full-access,.oauth-repo-deployment-permissions .no-access,.oauth-repo-deployment-permissions .full-access{display:none}.oauth-notifications-permissions .no-access,.oauth-notifications-permissions .read-access,.oauth-notifications-permissions .via-public-access,.oauth-notifications-permissions .via-full-access{display:none}.oauth-notifications-permissions.read .read-access{display:inline}.oauth-notifications-permissions.via-public .via-public-access{display:inline}.oauth-notifications-permissions.via-public .octicon{display:none}.oauth-notifications-permissions.via-full .via-full-access{display:inline}.oauth-gist-permissions .no-access,.oauth-gist-permissions .full-access{display:none}.oauth-granular-permissions .no-access,.oauth-granular-permissions .read-access,.oauth-granular-permissions .write-access,.oauth-granular-permissions .full-access{display:none}.oauth-granular-permissions.none .no-access{display:inline}.oauth-granular-permissions.read .read-access{display:inline}.oauth-granular-permissions.write .write-access{display:inline}.oauth-granular-permissions.full .full-access{display:inline}.oauth-no-description{color:#586069}.oauth-org-access-details a:hover{text-decoration:none}.oauth-org-access-details .boxed-group-inner{border:0;border-radius:3px}.oauth-org-access-details .oauth-org-item{line-height:24px}.oauth-org-access-details .oauth-org-item:first-child{border-radius:3px 3px 0 0}.oauth-org-access-details .oauth-org-item .loading-indicator{display:none;margin:4px}.oauth-org-access-details .oauth-org-item.on{background:#fff}.oauth-org-access-details .oauth-org-item.on:hover{background:#ffe}.oauth-org-access-details .oauth-org-item.on .authorized-tools{display:block}.oauth-org-access-details .oauth-org-item.on .unauthorized-tools{display:none}.oauth-org-access-details .oauth-org-item.on strong{color:#24292e}.oauth-org-access-details .oauth-org-item.on .octicon-check{display:inline}.oauth-org-access-details .oauth-org-item.on .octicon-x{display:none}.oauth-org-access-details .oauth-org-item.revoked{background:#fff}.oauth-org-access-details .oauth-org-item.revoked .unauthorized-tools,.oauth-org-access-details .oauth-org-item.revoked .authorized-tools{display:none}.oauth-org-access-details .oauth-org-item.revoked .octicon-x{color:#cb2431}.oauth-org-access-details .oauth-org-item.loading .unauthorized-tools,.oauth-org-access-details .oauth-org-item.loading .authorized-tools{display:none}.oauth-org-access-details .oauth-org-item.loading .loading-indicator{display:block}.oauth-org-access-details .oauth-org-item .authorized-tools{display:none}.oauth-org-access-details .oauth-org-item .unauthorized-tools{display:block}.oauth-org-access-details .btn{line-height:1.5em}.oauth-org-access-details .octicon{color:#979797}.oauth-org-access-details .octicon-check{display:none;color:#28a745}.oauth-org-access-details .octicon-x{display:inline}.oauth-org-access-details .octicon-x.org-access-denied{color:#cb2431}.permission-title{margin-top:0}.oauth-application-whitelist h2{display:inline-block}.oauth-application-whitelist .request-info{display:block}.oauth-application-whitelist .request-info strong{display:inline-block;color:#24292e}.oauth-application-whitelist .request-info .application-description{display:none}.oauth-application-whitelist .request-info.open .application-description{display:block}.oauth-application-whitelist .avatar{margin-top:0}.oauth-application-whitelist .requestor{font-weight:600}.oauth-application-whitelist .octicon-alert{color:#a04100}.oauth-application-whitelist .octicon-check,.oauth-application-whitelist .approved-request{color:#28a745}.oauth-application-whitelist .denied-request{color:#cb2431}.oauth-application-whitelist .request-indicator{margin-left:10px}.oauth-application-whitelist .edit-link{color:#6a737d}.oauth-application-whitelist .edit-link:hover{color:#0366d6}.oauth-application-whitelist .boxed-group-list{margin-top:1em}.oauth-application-whitelist .boxed-group-list li{padding:10px}.boxed-group-inner .oauth-application-info{margin-bottom:10px}.oauth-application-info .application-title{font-size:30px;color:#24292e}.oauth-application-info .application-description{margin-top:3px;margin-bottom:0}.oauth-application-info .app-info{display:inline-block;margin-right:10px;color:#6a737d}.oauth-application-info .app-info .octicon{margin-right:5px}.oauth-application-info .listgroup-item{line-height:inherit}.oauth-application-info .app-denied,.oauth-application-info .app-approved{margin-left:10px;font-size:13px;font-weight:400;white-space:nowrap}.oauth-application-info .app-approved,.oauth-application-info .octicon-check{color:#28a745}.oauth-application-info .app-denied,.oauth-application-info .octicon-x{color:#a04100}.restrict-oauth-access-button{margin-right:20px}.restrict-oauth-access-info{margin-bottom:40px;font-size:15px}.restrict-oauth-access-list{padding-left:25px}.restrict-oauth-access-list li{margin-bottom:10px}.restrict-oauth-access-list li:last-child{margin-bottom:0}.app-transfer-actions form{display:inline}.oauth-border{border-bottom:1px solid #e5e5e5}.oauth-border:last-child{border:0}.developer-app-item .developer-app-avatar-cell{width:60px}.developer-app-item .developer-app-name{font-size:15px;font-weight:600;line-height:1.2;color:#24292e}.developer-app-item .developer-app-name:hover{color:#0366d6;text-decoration:none}.developer-app-item .developer-app-info-cell{padding-left:0}.developer-app-item .developer-app-list-meta{margin-top:3px;margin-bottom:2px;font-weight:400;color:#6a737d}.org-transfer-requests{margin:10px 0 20px}.octocaptcha-element{width:450px;height:310px}.octocaptcha-frame{width:450px;height:340px}.invitation-2fa-banner{margin-right:-24px;margin-left:-24px}.sign-up-via-invitation .bleed-flush{width:100%;padding:0 20px;margin-left:-20px;border-color:#d8dee2}.sign-up-via-invitation label{font-size:13px}.orghead{padding-top:20px;padding-bottom:0;margin-bottom:20px;color:#666;background-color:#fafbfc;border-bottom:1px solid #eee}.orghead .edit-org{position:relative;top:-6px;display:inline-block;padding:3px 5px;font-size:14px;color:#aaa;border:1px solid #e5e5e5;border-radius:3px}.orghead .edit-org:hover{color:#0366d6;background-color:#fff}.orghead .edit-org .octicon{font-size:14px}.orghead .orgnav{position:relative;top:1px;margin-top:10px}.org-header-wrapper .TableObject-item--primary,.org-repos .TableObject-item--primary{white-space:normal}.org-header-wrapper .avatar{display:block;width:100px}.org-header-wrapper .TableObject-item--primary{padding-left:20px}.org-name{font-weight:400;color:#333}.org-description{margin-top:0;margin-bottom:8px;font-size:16px;line-height:1.25}.org-header-meta{font-size:12px;line-height:1.5;list-style:none}.org-header-meta .meta-item{display:inline-block;max-width:100%;padding-right:18px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.org-header-meta .octicon{position:relative;top:1px;margin-right:2px;color:#ccc;vertical-align:text-bottom}.org-header-meta.has-email.has-blog .meta-item,.org-header-meta.has-email.has-location .meta-item,.org-header-meta.has-blog.has-location .meta-item{max-width:278px}.org-header-meta.has-email.has-blog.has-location .meta-item{max-width:186px}.org-profile .member-badge{display:block;padding-top:0;padding-bottom:0;border-top:0}.audit-log-map-container{position:relative;margin-bottom:20px}.audit-log-map-container .activity{position:absolute;top:120px;left:340px;z-index:99999;display:none;text-align:center}.audit-log-map-container .is-graph-loading .activity{display:block}.audit-search-form{position:relative;margin-bottom:20px}.audit-search-form::before{display:table;content:\"\"}.audit-search-form::after{display:table;clear:both;content:\"\"}.audit-search-form .subnav-search-input{width:250px}.audit-log-map{height:277px;overflow:hidden;background-color:#0366d6;border-radius:3px;box-shadow:inset 1px 1px 0 rgba(0,0,0,0.2)}.map-background{pointer-events:all;fill:#0366d6;cursor:-webkit-grab;cursor:grab}.land{fill:none;stroke:#256aae;stroke-width:2;shape-rendering:crispedges}.country{fill:#d7c7ad;shape-rendering:crispedges;cursor:pointer}.country.hk{stroke:#a5967e}.country:hover{fill:#c8b28e}.country.active{fill:#f6e5ca}.borders{fill:none;stroke:#a5967e;shape-rendering:crispedges}.graticule{pointer-events:none;fill:none;stroke:#fff;stroke-opacity:0.2;shape-rendering:crispedges}.graticule :nth-child(2n){stroke-dasharray:2, 2}.security-map-legend circle{fill-opacity:0;stroke:#fff;stroke-width:1.5}.security-map-legend text{font-size:10px;fill:#fff;text-anchor:end}.security-map-legend .link{stroke:#fff;stroke-width:1.5}.audit-point{pointer-events:none;fill:#d73a49;fill-opacity:0.8;stroke:#d73a49}.country-info{position:absolute;top:10px;right:10px;padding:10px;pointer-events:none;background:rgba(255,255,255,0.9);border-radius:2px;opacity:0}.audit-log-search .member-info{width:300px}.audit-log-search .member-info .member-avatar{float:left;margin-right:15px}.audit-log-search .member-info .member-link{display:block}.audit-log-search .member-info .member-list-avatar{margin-right:0}.audit-log-search .member-info .ghost{display:inline-block;color:#586069}.audit-log-search .blankslate{border-top-left-radius:0;border-top-right-radius:0}.audit-log-search .export-phrase{margin:5px 0}.audit-results-actions{overflow:auto}.audit-search-clear{float:left;margin-bottom:20px;border:0}.audit-search-clear .issues-reset-query{margin-bottom:0}.audit-type{width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audit-type .octicon{margin-right:3px;font-weight:400;vertical-align:bottom}.audit-type .repo{color:#a04100}.audit-type .team{color:#28a745}.audit-type .user{color:#6f42c1}.audit-type .oauth_access{color:#cb2431}.audit-type .hook{color:#e1bf4e}.export-actions{display:inline-block;margin-left:10px}.export-actions a{margin-top:-3px;color:#6a737d}.export-actions a:hover{color:#0366d6;text-decoration:none}.export-actions .select-menu-button::after{position:absolute;top:50%;right:15px;margin-top:-2px}.export-actions .select-menu-modal{width:111px}.export-actions .select-menu-item-text{text-align:center}.export-phrase{margin-top:5px}.export-phrase pre{padding-left:10px;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;white-space:pre-wrap;border-left:1px solid #eee}.audit-log-export-button{width:110px;height:30px;transition:0.25s width ease-in-out}.audit-log-export-button .loader{position:absolute;top:50%;left:11px;display:none;margin-top:-9px}.audit-log-export-button .octicon{position:absolute;top:50%;left:11px;margin-top:-9px}.audit-log-export-button .audit-log-export-status{position:absolute;top:4px;left:35px}.audit-log-export-button.disabled{width:125px}.audit-log-export-button.disabled::after{display:none}.audit-log-export-button.disabled .octicon{display:none}.audit-log-export-button.disabled .loader{display:block}.two-factor-enforcement-form .loading-spinner{float:left;margin:0 0 0 -20px;vertical-align:middle}.saml-enabled-banner-container{background-image:linear-gradient(-1deg, #fff 0%, #f5f5f5 100%)}.saml-settings-form .test-status-indicator{width:30px;height:30px;margin-top:-4px;border-radius:50%}.saml-settings-form .test-status-indicator .octicon{display:block;margin-top:7px;margin-right:auto;margin-left:auto}.saml-settings-form .form-group.errored{margin-bottom:40px}.saml-settings-form .test-status-indicator-error{color:#fff;background-color:#cb2431}.saml-settings-form .test-status-indicator-success{color:#fff;background-color:#28a745}.saml-settings-form .details-container .method-field{display:none}.saml-settings-form .details-container .method-label{font-weight:400}.saml-settings-form .details-container .details-target{cursor:pointer}.saml-settings-form .details-container.open .method-value,.saml-settings-form .details-container.open .details-target{display:none}.saml-settings-form .details-container.open .method-field{display:inline-block}.saml-settings-form .saml-enforcement-disabled{opacity:0.5}.form-group .form-control.saml-certificate-field{width:440px;height:150px;min-height:0}.member-avatar-group{margin:-1px}.member-avatar-group::before{display:table;content:\"\"}.member-avatar-group::after{display:table;clear:both;content:\"\"}.member-avatar{float:left;margin:1px}.member-row{width:100%;min-height:40px;padding-bottom:15px;margin-top:15px;font-size:14px;color:#333;border-bottom:1px solid #eee}.member-row::before{display:table;content:\"\"}.member-row::after{display:table;clear:both;content:\"\"}.member-row a:hover{color:#0366d6;text-decoration:none}.member-row:last-child{padding-bottom:0;border-bottom:0}.member-row .member-name{display:block;padding-left:50px}.member-row .member-fullname{display:block;padding-left:50px;word-wrap:break-word}.member-fullname{color:#586069}.org-toolbar.disabled{pointer-events:none}.org-toolbar .subnav-search{width:320px;margin-right:20px;margin-left:0}.org-toolbar .subnav-search-context+.subnav-search{margin-left:-1px}.org-toolbar .subnav-search-input{width:100%}.org-toolbar-next{margin-bottom:24px}.org-toolbar-next .subnav-search{width:240px}.auto-search-group{position:relative}.auto-search-group .auto-search-input{padding-left:30px}.auto-search-group .spinner,.auto-search-group>.octicon{position:absolute;left:10px;z-index:5;width:16px;height:16px}.auto-search-group .spinner{top:9px;background-color:#fff}.auto-search-group>.octicon{top:10px;font-size:14px;color:#bbb;text-align:center}.org-list .list-item{position:relative;padding-top:15px;padding-bottom:15px;border-bottom:1px solid #eee}.org-list .list-item::before{display:table;content:\"\"}.org-list .list-item::after{display:table;clear:both;content:\"\"}.org-repos .blankslate{margin-top:15px}.org-repos-mini{padding:0;margin:0}.org-repos-mini .org-repo-mini-item:first-child .org-repo-mini-cell{border-top:0}.org-repos-mini .org-repo-name{margin-top:0;margin-bottom:0;font-size:14px;word-wrap:break-word}.org-repos-mini .org-repo-name .octicon-repo{color:#586069}.org-repos-mini .org-repo-name .octicon-lock{color:rgba(115,92,15,0.5)}.org-repos-mini .org-repo-name .repo-prefix{font-weight:400}.org-repos-mini .org-repo-name .repo-slash{display:inline-block;margin-right:-4px;margin-left:-4px}.org-repo-mini-cell{padding-top:15px;padding-bottom:15px;vertical-align:middle}.org-repo-meta{width:165px}.org-repo-meta .access-level{cursor:default}.org-repo-access-level{text-align:center}.org-repo-manage{width:270px}.with-higher-access .table-list-cell-checkbox{vertical-align:top}.permission-level-cell .select-menu-button{width:78px;text-align:left}.permission-level-cell .select-menu-button::after{position:absolute;top:10px;right:10px}.permission-level-cell .spinner,.permission-level-cell .permission-success-icon{float:none;opacity:0;transition:opacity 0.2s ease-in-out}.permission-level-cell .permission-success-icon{color:#28a745}.permission-level-cell .is-loading .spinner,.permission-level-cell .was-successful .permission-success-icon{opacity:1}.select-menu-option-title{margin-top:0;margin-bottom:0}.reinstate-org-member{position:relative;width:500px;margin:40px auto}.reinstate-org-member .reinstate-lead{margin-bottom:30px;font-size:16px}.reinstate-org-member label{cursor:pointer}.reinstate-org-member .reinstate-detail-container{margin:15px 0}.reinstate-org-member .reinstate-title{color:#333}.reinstate-org-member .reinstate-title .octicon{width:16px;margin-right:10px;color:#999}.add-member-wrapper{position:relative;width:500px;margin:40px auto}.add-member-wrapper .available-seats{color:#586069}.add-member-wrapper .buy-more-link{margin-right:5px}.cancel-invitation-form{margin-top:-34px}.add-member-lead{font-size:16px}.add-member-roles{margin:30px 0}.add-member-roles .role-make-member{display:block;margin-bottom:10px}.add-member-team-list{display:block;margin-bottom:30px;list-style:none}.add-member-team-list .team-row-header{padding:10px 20px 10px 0;font-size:12px;text-align:right;background:#fafafa;border-top-left-radius:3px;border-top-right-radius:3px}.add-member-team-list .team-row-header .team-row-teams{margin-right:245px}.add-member-team-list .team-row-header .team-row-members{margin-right:35px}.add-member-team-list .team{display:block;font-weight:400;cursor:pointer}.add-member-team-list .team:first-child{border-top:1px solid #f2f2f2}.add-member-team-list .team .btn-sm{float:right}.add-member-team-list .team-info{max-width:80%;color:#000;text-decoration:none}.add-member-team-list .team-meta{margin-top:2px;margin-bottom:2px;color:#586069}.add-member-team-list .team-description{width:260px;margin-top:2px;margin-bottom:2px}.add-member-team-list .team-toggler .turn-on{display:inline-block}.add-member-team-list .team-toggler.on .turn-off{display:inline-block}.add-member-team-list .team-toggler .turn-off{display:none}.add-member-team-list .team-toggler.on .turn-on{display:none}.team-list-footer{padding:10px 0;text-align:center;border-top:1px solid #e5e5e5}.team-list-footer .show-all-link .octicon{margin-left:5px;color:#586069}.invite-team-member-list .team{cursor:default}.invite-team-member-list .team:first-child .table-list-cell{border-top:0}.invite-team-member-list .table-list-cell-checkbox{width:42px}.invite-team-member-list .team-toggler{padding-top:12px;padding-right:3px}.invite-team-member-list .team-info{width:260px;padding:10px 15px 10px 0}.invite-team-member-list .team-description{display:block;padding-top:0;padding-bottom:0;font-weight:400}.invite-team-member-list .team-meta{width:100px;text-align:left;vertical-align:middle}.invite-team-member-list .team-link{color:#0366d6;text-align:right}.migration-jumbotron{height:70vh;min-height:450px;max-height:650px}.migration-jumbotron,.migration-sub-header{position:relative;margin-top:-1px;background-color:#3f4851;background-image:linear-gradient(#3f4851 0, #282d33 100%)}.migration-jumbotron::after,.migration-sub-header::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:\" \";background-image:url(\"/images/modules/orgs/dots-bg.png\");background-repeat:repeat;background-size:80%;opacity:0.75}.migration-jumbotron-content{position:relative;top:50%;z-index:2;width:980px;padding:100px 60px;margin:0 auto;text-align:center;transform:translateY(-50%)}.migration-jumbotron-octicons{height:60px;margin-bottom:20px;text-align:center}.migration-jumbotron-octicon-item{position:relative;display:inline-block;width:60px;height:60px;margin-right:10px;margin-left:10px;background-image:linear-gradient(-45deg, #6f42c1 30%, #f66a0a 100%);border-radius:50px}.migration-jumbotron-octicon-item::after{position:absolute;top:1px;right:1px;bottom:1px;left:1px;content:\"\";background-color:#383f47;border-radius:50px}.migration-jumbotron-octicon-item .octicon{position:relative;z-index:2;margin-top:16px;color:rgba(255,255,255,0.9)}.migration-jumbotron-title,.migration-jumbotron-lead,.migration-sub-title,.migration-sub-lead{color:#fff;text-shadow:0 1px 1px rgba(0,0,0,0.05)}.migration-jumbotron-title,.migration-section-title{margin-bottom:10px;font-weight:300}.migration-jumbotron-title{font-size:40px}.migration-section-title{margin-top:0;font-size:30px}.migration-jumbotron-lead{margin-top:0;font-size:24px;opacity:0.85}.migration-section-lead{margin-top:20px;margin-bottom:20px}.migration-jumbotron-btn{padding:12px 18px;font-size:16px;color:#6f42c1;background-color:#fff;border-width:0;box-shadow:0 3px 3px rgba(0,0,0,0.05)}.migration-jumbotron-btn:hover{color:#6f42c1;background-color:#eee}.migration-section{padding-top:100px;padding-bottom:100px;overflow:hidden;border-bottom:1px solid #ddd}.migration-feature-list{margin-top:30px;margin-bottom:20px;overflow:hidden;font-size:14px;color:#586069;list-style:none}.migration-feature-list::before{display:block;width:100px;margin-bottom:30px;content:\"\";border-top:1px solid #ddd}.migration-feature-list .octicon{width:22px;margin-left:-3px;color:#586069;text-align:center}.migration-feature-list-item{float:left;width:50%;margin-bottom:15px}.migration-section-grey{background-color:#fcfcfc}.migration-illustration-wrapper::before{display:table;content:\"\"}.migration-illustration-wrapper::after{display:table;clear:both;content:\"\"}.migration-illustration{width:700px;margin-top:-30px;margin-bottom:-50px;border:1px solid #ddd;border-radius:3px;box-shadow:0 0 15px rgba(0,0,0,0.05)}.migration-illustration-left{float:right;margin-right:50px}.migration-illustration-right{float:left;margin-left:50px}.migration-section-privileges{padding-top:80px;padding-bottom:80px}.migration-footer{position:relative;z-index:1;padding-top:60px;padding-bottom:60px;margin-bottom:-41px;border-bottom:1px solid #ddd}.migration-footer-content{width:800px;margin:0 auto;text-align:center}.migration-footer-title,.migration-footer-lead{margin-bottom:0}.migration-footer-lead{margin-top:10px}.migration-footer-btn{margin-top:20px}.migration-sub-header{padding-top:40px;padding-bottom:40px;margin-bottom:40px}.org-settings-updating{padding:15px;margin-top:0;margin-bottom:30px;background-color:#fff;border:1px solid #ddd;border-radius:3px}.org-settings-updating .spinner{display:inline-block;margin-top:-2px;vertical-align:middle}.org-disabled-settings{pointer-events:none;opacity:0.5}.migration-sub-header-content{width:68%}.migration-sub-title{margin-bottom:0}.migration-sub-lead{margin-top:10px;margin-bottom:0}.migration-org-avatar{margin-top:6px;margin-right:72px;border:3px solid #fff;border-radius:3px}.org-migration-settings-sidebar{position:-webkit-sticky;position:sticky;top:20px}.org-migration-settings-sidebar .migrate-org-roles{margin-top:0;margin-bottom:10px}.org-migration-settings-sidebar .preserve-member-privileges-btn{display:none}.org-migration-settings-sidebar .member-privilege-radios-preserved .preserve-member-privileges-btn{display:block}.org-migration-settings-sidebar .member-privilege-radios-preserved .save-member-privileges-btn{display:none}.org-migration-settings-section{position:relative;padding-bottom:50px;margin-right:60px;margin-bottom:50px;border-bottom:1px solid #ddd}.org-migration-settings-section:last-child{padding-bottom:0;margin-bottom:0;border-bottom:0}.org-migration-settings-section .disabled{pointer-events:none;opacity:0.5}.org-migration-settings-section .spinner{display:inline-block;margin-bottom:-3px}.org-migration-settings-icon{position:absolute;left:-45px;color:#ccc}.org-migration-settings-title{margin-bottom:0;font-size:22px;font-weight:400}.org-migration-settings-info{margin-top:5px;margin-bottom:30px;font-size:16px;color:#586069}.migrate-owners-wrapper{position:relative;min-height:550px}.migrate-owners-content-about{position:absolute;top:0;left:50%;width:700px;margin:30px auto 0;text-align:center;transition:opacity 0.2s ease-in-out, transform 0.3s ease-in-out;transform:translate(-50%, 0)}.migrate-owners-title{font-size:35px;font-weight:400}.migrate-owners-lead{margin-top:0;margin-bottom:20px}.migrate-owners-content-rename{width:520px;margin:auto}.delete-owners-button{color:#586069}.delete-owners-button:hover{color:#cb2431}.migrate-org-roles{display:table;width:100%;margin-top:-20px;border:1px solid #ddd;border-radius:3px}.migrate-org-roles .tooltipped::after{width:150px;white-space:normal}.no-avatars-roles-matrix .migrate-org-roles{margin-top:5px}.migrate-org-roles-item{display:table-cell;width:33.33%;border-right:1px solid #ddd}.migrate-org-roles-item:last-child{border-right:0}.migrate-ability-list{margin:15px 0;list-style:none}.migrate-ability-list-item{padding-top:5px;padding-bottom:5px;margin:0 20px;font-size:14px}.migrate-ability-list-item:first-child{border-top:0}.migrate-ability-list-item .octicon-check,.migrate-ability-list-item .octicon-x{width:15px}.migrate-ability-list-item .octicon-check{color:#28a745}.migrate-ability-list-item .octicon-x{color:#aaa}.migrate-ability-list-item .octicon-question{font-size:12px;color:#555}.migrate-ability-not-possible{color:#586069}.default-repository-permission .octicon-x,.members-can-create-repositories .octicon-x,.team-privacy .octicon-x{display:none}.default-repository-permission.migrate-ability-not-possible .octicon-x,.members-can-create-repositories.migrate-ability-not-possible .octicon-x,.team-privacy.migrate-ability-not-possible .octicon-x{display:inline-block}.default-repository-permission.migrate-ability-not-possible .octicon-check,.members-can-create-repositories.migrate-ability-not-possible .octicon-check,.team-privacy.migrate-ability-not-possible .octicon-check{display:none}.migrate-org-roles-header{padding:15px 20px;border-bottom:1px solid #ddd}.migrate-org-roles-title{margin-top:0;margin-bottom:0;font-size:18px;font-weight:400}.migrate-org-roles-lead{margin-top:4px;margin-bottom:0;font-size:14px;color:#586069}.migrate-org-roles-count{padding:10px 20px;color:#586069;border-top:1px solid #ddd}.migrate-org-avatar-list{margin-top:5px;margin-bottom:10px}.migrate-org-avatar-list::before{display:table;content:\"\"}.migrate-org-avatar-list::after{display:table;clear:both;content:\"\"}.migrate-org-avatar-list .migrate-org-avatar,.migrate-org-avatar-list .migrate-org-avatar-empty{float:left;margin-left:2px}.migrate-org-avatar-list .migrate-org-avatar:first-child,.migrate-org-avatar-list .migrate-org-avatar-empty:first-child{margin-left:0}.migrate-org-avatar-list .migrate-org-avatar-empty{width:30px;height:30px;border-radius:3px}.migrate-org-avatar-list .migrate-org-more-ellipsis,.migrate-org-avatar-list .migrate-org-zero{font-size:18px;line-height:30px;color:#586069;text-align:center}.migrate-org-avatar-list .migrate-org-more-ellipsis{font-weight:600;line-height:20px;background-color:#f5f5f5}.migrate-org-avatar-list .migrate-org-zero{color:#586069;border:1px dashed #ddd}.migrate-org-avatar-list .migrate-org-more-ellipsis:hover{text-decoration:none}.migrate-org-avatar-list .tooltipped::after{width:auto;white-space:nowrap}.menu-item .org-avatar,.menu-item .org-octicon-credit-card{position:absolute}.menu-item .org-octicon-credit-card{right:0}.org-settings-link{display:block;padding:0 30px;word-wrap:break-word}.team-stats{padding-right:15px;padding-left:15px;margin-right:-15px;margin-bottom:-15px;margin-left:-15px;border-top:1px solid #eee}.stats-group{display:table;width:100%;table-layout:fixed}.stats-group-stat{display:table-cell;padding-top:10px;padding-bottom:10px;padding-left:15px;font-size:12px;color:#586069;text-transform:uppercase}.stats-group-stat:first-child{padding-left:0;border-right:1px solid #eee}.stats-group-stat:hover,.stats-group-stat:hover .stat-number{color:#0366d6;text-decoration:none}.stats-group-stat.no-link:hover{color:#586069;text-decoration:none}.stats-group-stat.no-link:hover .stat-number{color:#333}.stat-number{display:block;font-size:16px;color:#333}.permission-title{margin-top:0}.add-to-org-wrapper{width:500px}.invite-member-results ul{margin:0}.invite-member-header{text-align:center}.add-to-org-title{font-size:21px;font-weight:400;line-height:normal}.team-member-list{list-style:none}.team-member-list .table-list-cell{padding-top:15px;padding-bottom:15px}.team-member-list .team-member-content{margin-left:50px}.team-member-list .team-member-username{margin:0;font-size:14px;font-weight:600;line-height:20px}.team-member-list .Label--gray,.team-member-list .Label--outline{cursor:default}.team-member-list .invite-icon{width:28px;color:#959da5}.menu-item-danger,.menu-item-danger.selected{color:#cb2431}.menu-item-danger:hover,.menu-item-danger[aria-selected=\"true\"],.menu-item-danger.navigation-focus,.menu-item-danger.selected:hover,.menu-item-danger.selected[aria-selected=\"true\"],.menu-item-danger.selected.navigation-focus{color:#fff;background:#d73a49}.team-member-list-avatar{float:left;margin-right:10px}.team-member-list-avatar .octicon{width:40px;color:#959da5}.org-team-form .disabled{opacity:0.5}.org-team-form .css-truncate-target{max-width:250px}.confirm-removal-container .private-fork-count{margin-top:0;font-size:12px;font-weight:400;color:#586069}.confirm-removal-container .deleting-private-forks-warning{position:relative;padding-left:26px}.confirm-removal-container .deleting-private-forks-warning .octicon{position:absolute;top:2px;left:0;color:#cb2431}.confirm-removal-list-container{margin-bottom:15px;border:1px solid #eaeaea;border-radius:3px}.confirm-removal-list-item{padding:10px;margin:0;font-size:14px;font-weight:600;border-top:1px solid #eaeaea}.confirm-removal-list-item:first-child{border-top:0}.confirm-removal-team .octicon,.confirm-removal-repo .octicon{margin-right:3px;color:#586069}.team-repo-access-list{max-height:245px}.manage-member-meta{list-style:none}.manage-member-meta-item{margin-top:12px;color:#586069}.manage-member-meta-item:first-child{margin-top:0}.manage-member-meta-item .btn-link{color:#586069}.manage-member-meta-item>.octicon{width:14px;margin-right:5px;color:#586069;text-align:center}.manage-member-meta-item>.octicon-alert{color:#a04100}.member-two-factor-disabled{color:#cb2431}.manage-member-button{margin-bottom:10px}.org-person-repo-header{margin-top:0}.org-person-repo-search{margin-top:5px;margin-right:5px}.org-user-notice-title{margin-top:0;margin-bottom:0}.org-user-notice-content{margin-top:10px;margin-bottom:10px;font-size:14px}.org-user-notice-content strong{color:#333}.org-user-notice-content:last-child{margin-bottom:0}.org-user-notice-content .octicon{color:#586069}.org-user-notice-icon{float:right;margin:10px 10px 20px;font-size:45px;color:#ccc}.manage-repo-access-header{margin-top:30px;margin-bottom:30px}.manage-repo-access-header::before{display:table;content:\"\"}.manage-repo-access-header::after{display:table;clear:both;content:\"\"}.manage-repo-access-header .btn{margin-top:8px}.manage-repo-access-header .tooltipped::after{width:250px;white-space:normal}.manage-repo-access-heading{margin-top:-2px;margin-bottom:0;font-size:24px;font-weight:400}.manage-repo-access-lead{margin-top:3px;margin-bottom:0;font-size:16px;color:#586069}.manage-repo-access-group{background-color:#fff;border:1px solid #ddd;border-radius:3px}.manage-repo-access-title{padding:12px 15px;margin-top:0;margin-bottom:0;font-size:14px;background-color:#f8f8f8;border-bottom:1px solid #ddd;border-radius:3px 3px 0 0}.manage-repo-access-wrapper{position:relative;padding-left:25px}.manage-repo-access-wrapper::before{position:absolute;top:15px;bottom:15px;left:20px;z-index:1;display:block;width:2px;content:\"\";background-color:#eee}.manage-repo-access-icon{position:relative;z-index:2;float:left;padding-top:2px;padding-bottom:2px;margin-top:-3px;margin-left:-25px;background:#fff}.manage-repo-access-icon .octicon{font-size:14px;color:#ccc}.manage-repo-access-list{list-style:none}.manage-repo-access-list-item{padding:15px}.manage-repo-access-list-item:last-child{border-bottom:0;border-radius:0 0 3px 3px}.manage-repo-access-teams-group{margin-top:-20px;list-style:none;border:1px solid #ddd;border-radius:3px}.manage-repo-access-team-item{border-top:1px solid #eee}.manage-repo-access-team-item:first-child{border-top:0}.manage-repo-access-description{margin-top:3px;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;white-space:nowrap}.manage-repo-access-not-active{color:#24292e;background-color:#fafbfc}.manage-repo-access-not-active .manage-repo-access-icon{background:#f9f9f9}.manage-access-remove-footer{padding:15px;border-top:1px solid #ddd}.manage-access-remove-footer .tooltipped::after{width:250px;white-space:normal}.manage-access-none{margin:20px 50px;text-align:center}.ldap-group-dn{display:block;font-weight:400;color:#aaa}.ldap-import-groups-container .blankslate{display:none}.ldap-import-groups-container.is-empty .blankslate{display:block}.ldap-import-groups-container.is-empty .ldap-memberships-list{display:none}.ldap-memberships-list{margin-bottom:30px}.ldap-memberships-list .table-list-cell{padding-top:10px;padding-bottom:10px;font-size:13px;vertical-align:middle}.ldap-memberships-list .table-list-cell:last-child{width:92px}.ldap-memberships-list .ldap-list-team-name{width:380px}.ldap-memberships-list .ldap-group-dn{font-size:11px}.ldap-memberships-list .ldap-mention-as{width:260px}.ldap-memberships-list .edit{position:absolute;padding:10px;margin-left:-33px;color:#0366d6;cursor:pointer}.ldap-memberships-list .edit-fields{display:none}.ldap-memberships-list .is-editing .edit-hide{display:none}.ldap-memberships-list .is-editing .edit-fields{display:block}.ldap-memberships-list .is-editing .spinner{margin-left:15px;vertical-align:middle}.ldap-memberships-list .is-removing{opacity:0.25}.ldap-memberships-list .is-removing .edit{opacity:0.5}.team-name-field{height:33px}.ldap-import-form-actions{margin-top:30px}.invited .team-member-list{margin:-20px 0}.invited .team-member-list .list-item{padding:10px 0;border-bottom:1px solid #eee}.invited .team-member-list .list-item::before{display:table;content:\"\"}.invited .team-member-list .list-item::after{display:table;clear:both;content:\"\"}.invited .team-member-list .list-item:last-of-type{border:0}.invited .team-member-list .list-item .edit-invitation{float:right;margin-top:6px}.invited-banner{margin-bottom:20px}.invited-banner::before{display:table;content:\"\"}.invited-banner::after{display:table;clear:both;content:\"\"}.invited-banner .btn-sm{float:right;margin-left:5px}.invited-banner p{font-size:15px;line-height:1.6}.invited-banner .inviter-link{font-weight:600}.manage-member-sso-sessions.has-active-sessions .blankslate{display:none}.manage-memberships-nav{position:relative;top:1px;margin-top:10px}.manage-memberships-tabs-item{color:#586069;white-space:nowrap;cursor:pointer;border:solid transparent;border-width:3px 1px 1px;border-radius:3px 3px 0 0}.manage-memberships-tabs-item:hover{color:#333}.manage-memberships-tabs-item.selected{font-weight:600;color:#24292e;background-color:#fff;border-bottom:2px solid #d26911}.owner-select-grid{margin-left:-8px}.owner-select-grid::before{display:table;content:\"\"}.owner-select-grid::after{display:table;clear:both;content:\"\"}.owner-select-target{float:left;padding:10px;margin:0 10px 20px;font-weight:600;text-align:center;cursor:pointer;background-color:#f2f2f2;border:0;border-radius:3px}.owner-select-target:hover,.owner-select-target:focus{color:#fff;background-color:#0366d6}.owner-select-target:active{color:#fff;background-color:#024ea4}.owner-select-target .css-truncate-target{max-width:90px}.owner-select-target.disabled{color:#6a737d;cursor:not-allowed}.owner-select-target.disabled .user-mention{color:#6a737d}.owner-select-target.disabled .owner-select-avatar{opacity:0.3}.owner-select-avatar{display:block;margin-bottom:9px}.theme-picker{margin-bottom:-1px;background-color:#fff;background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.1);box-shadow:0 5px 10px rgba(0,0,0,0.1)}.theme-picker>.container{position:relative;overflow:hidden;text-align:center}.theme-picker-thumbs{border-bottom:1px solid #eee}.theme-toggle{width:32px;height:32px;padding:0;color:#ccc;background:none;border:0}.theme-toggle:hover{color:#0084c8;text-decoration:none}.theme-toggle.disabled,.theme-toggle.disabled:hover{color:#ccc;cursor:not-allowed;opacity:0.3}.theme-toggle-full-left,.theme-toggle-full-right{position:absolute;top:50px;overflow:hidden}.theme-toggle-full-left{left:4px}.theme-toggle-full-right{right:4px}.theme-selector{height:102px;margin:15px 46px}.theme-selector-thumbnail{padding:2px;border:1px solid #ddd}.theme-selector-thumbnail:hover{text-decoration:none;background-color:#f5f5f5}.theme-selector-thumbnail.selected{padding:3px;background-color:#0366d6;border:0}.theme-selector-thumbnail.selected .theme-selector-img{border:1px solid #fff}.theme-selector-img{width:126px;height:96px;border-radius:1px}.theme-picker-spinner{position:absolute;top:16px;left:50%;margin-left:-16px;background-color:#fff;opacity:0;transition:0.2s, opacity ease-in-out}.theme-picker-spinner.visible{opacity:1}.theme-picker-spinner.visible ~ .theme-picker-controls .theme-name{opacity:0}.theme-picker-view-toggle{float:left}.theme-picker-view-toggle .for-hiding{display:none}.theme-picker-view-toggle.open .for-hiding{display:inline}.theme-picker-view-toggle.open .for-showing{display:none}.theme-picker-controls{position:absolute;top:15px;left:50%;width:220px;margin-left:-110px;line-height:34px;text-align:center}.theme-picker-controls .theme-toggle{vertical-align:middle}.theme-name{display:inline-block;margin-right:10px;margin-left:10px;font-size:20px;line-height:1;vertical-align:middle}.page-preview{z-index:-100;display:block;width:100%;height:6000px;padding:0;background-color:#fff;border:0}.pinned-repos-spinner{position:relative;top:2px;left:6px}.pinned-repos-reorder-error{padding-left:6px;font-size:12px;font-weight:400;color:#86181d}.pinned-repos-setting-link{font-size:13px;font-weight:400}.pinned-repo-name{color:#6a737d}.pinned-repo-checkbox:checked+.pinned-repo-name{color:#24292e;background-color:#f1f8ff}.org-pinned-repos-list.pinned-repos-list{justify-content:flex-start}.org-pinned-repo-item.pinned-repo-item{width:319px;margin-right:11px}.org-pinned-repo-item.pinned-repo-item+.org-pinned-repo-item+.org-pinned-repo-item+.org-pinned-repo-item{margin-right:11px}.org-pinned-repo-item.pinned-repo-item+.org-pinned-repo-item+.org-pinned-repo-item{margin-right:0}.org-pinned-repo-item.pinned-repo-item+.org-pinned-repo-item+.org-pinned-repo-item+.org-pinned-repo-item+.org-pinned-repo-item+.org-pinned-repo-item{margin-right:0}@media print{#serverstats,.Header,.header-search,.site-search,.reponav,.comment::before,.comment::after,.footer,.pagehead-actions,.discussion-timeline-actions,.timeline-comment-actions,.timeline-new-comment,.thread-subscription-status,.lock-toggle-link,.header,.pr-review-tools,.file-actions,.js-expandable-line,.pr-toolbar-shadow,.pr-toolbar.is-placeholder,.language-color{display:none !important}.repository-lang-stats-graph{height:0}.btn:not(.btn-outline){color:#24292e !important;background:none}p,.comment h2{page-break-inside:avoid}.markdown-body h2{page-break-after:avoid}.topic-tag{padding:0}.topic-tag::before{content:\"#\";margin-right:-2px}.blob-num{border-right:2px solid #e1e4e8}.blob-num-deletion{border-right-color:#d73a49}.blob-num-addition{border-right-color:#28a745}.blob-code-addition .x{border-bottom:2px solid #28a745;border-radius:0px}.blob-code-deletion .x{border-bottom:2px solid #d73a49;border-radius:0px}.pr-toolbar.is-stuck{position:static !important;width:100% !important}.block-diff-neutral{border:4px solid #d1d5da}.block-diff-deleted{border:4px solid #d73a49}.block-diff-added{border:4px solid #28a745}.State{border:1px #e1e4e8 solid;color:#1b1f23;border-color:none;background:none}.State--green{border:1px solid #2cbe4e;color:#28a745}.State--purple{border:1px solid #6f42c1;color:#6f42c1}.State--red{border:1px solid #cb2431;color:#cb2431}.markdown-body pre>code{white-space:pre-wrap}}.pjax-loader-bar{position:fixed;top:0;left:0;z-index:40;opacity:0;transition:opacity 0.4s linear 0.4s}.pjax-loader-bar .progress{position:fixed;top:0;left:0;height:2px;background:#77b6ff;box-shadow:0 0 10px rgba(119,182,255,0.7);transition:width 0.4s ease}.pjax-loader-bar.is-loading{opacity:1;transition:none}.project-full-screen .pagehead,.project-full-screen .Header{display:block}@media (min-width: 544px){.project-full-screen .pagehead,.project-full-screen .Header{display:none}}.project-full-screen .project-header{padding-top:10px;padding-bottom:10px;color:rgba(255,255,255,0.75)}@media (min-width: 544px){.project-full-screen .project-header{background-color:#24292e}}.project-full-screen .project-header .project-header-link{color:rgba(255,255,255,0.75) !important}.project-full-screen .project-header .project-header-link:hover{color:#fff !important}.project-full-screen .project-header .pending-cards-status{border-color:#24292e}@media (min-width: 544px){.project-full-screen .card-filter-input{color:#fff;background-color:rgba(255,255,255,0.125);border:0;outline:none;box-shadow:none}.project-full-screen .card-filter-input:-ms-input-placeholder{color:rgba(255,255,255,0.7)}.project-full-screen .card-filter-input::-ms-input-placeholder{color:rgba(255,255,255,0.7)}.project-full-screen .card-filter-input::placeholder{color:rgba(255,255,255,0.7)}.project-full-screen .card-filter-input:focus{background-color:rgba(255,255,255,0.175)}}.project-header{background-color:#eff1f3}@media (min-width: 544px){.project-header{background-color:#fff}}.project-header .select-menu-modal-holder{z-index:500}.project-updated-message{top:6px;left:50%;z-index:50;transform:translate(-50%, 0)}.pending-cards-status{top:-2px;right:-9px;z-index:2;width:14px;height:14px;background-image:linear-gradient(#54a3ff, #006eed);background-clip:padding-box;border:2px solid #fff}.project-columns{overflow-x:auto}@media (min-width: 544px){.project-columns-container{height:0;overflow-x:visible !important}}.project-column{min-width:100%;max-width:100%;background-color:#eff1f3;border-width:0 !important;border-radius:0 !important}.project-column:focus{outline:none}@media (min-width: 544px){.project-column{min-width:355px;max-width:355px;border-width:1px !important;border-radius:6px !important}.project-column:focus{border-color:#2188ff !important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3)}}.project-column.moving{background-color:#f1f8ff !important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3);transform:translateX(4px) translateY(-4px)}.project-column .automation-summary-tooltip::after{max-width:190px !important}.new-project-column{width:315px;border-color:#959da5 !important}.project-search-form .loading-indicator{top:21px;right:21px;display:none}.project-search-form.loading .loading-indicator{display:inline-block}.sortable-ghost{background-color:#f6f8fa;opacity:0.5}.project-card .project-reference-markdown>p,.project-card:last-child{margin-bottom:0 !important}.project-card:first-child{margin-top:8px !important}@media (min-width: 544px){.project-card:first-child{margin-top:3px !important}}.project-card ul,.project-card ol{margin-bottom:8px;margin-left:16px}.project-card .contains-task-list{margin-left:24px}.project-card:hover{border-color:#d1d5da !important;box-shadow:0 1px 3px rgba(106,115,125,0.3) !important}.project-card:focus{outline:none}@media (min-width: 544px){.project-card:focus{border-color:#2188ff !important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3) !important}}.project-card.moving{background-color:#f1f8ff !important;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3) !important;transform:translateX(4px) translateY(0)}.archived-project-cards-pane .project-card .archived-header{display:flex !important;color:#735c0f}.archived-project-cards-pane .project-card .archive-dropdown-item{display:none}.issue-card.draggable{cursor:move}.issue-card .issue-card-label{max-width:50%}.issue-card .issue-card-label::after{max-width:150px}.issue-card .avatar-stack:hover .from-avatar{margin-right:-4px}.issue-card pre{word-wrap:break-word;white-space:pre-wrap}@keyframes show-pane{0%{transform:translateX(390px)}100%{transform:translateX(0)}}.project-pane{z-index:30;background-clip:padding-box;box-shadow:-3px 0 5px rgba(36,41,46,0.05)}@media (min-width: 544px){.project-pane{position:absolute !important;width:360px !important;height:auto !important;animation:show-pane 0.2s cubic-bezier(0, 0, 0, 1)}}.project-pane .redacted-activity{cursor:help;border-bottom:1px dotted #959da5}.project-pane .project-body-markdown p:last-child,.project-pane .project-body-markdown ul:last-child,.project-pane .project-body-markdown ol:last-child{margin-bottom:0}.project-pane-close{color:rgba(27,31,35,0.5)}.project-pane-close:hover{color:rgba(27,31,35,0.7)}.project-note-form textarea{resize:vertical}.card-menu-container .dropdown-menu,.column-menu-container .dropdown-menu{min-width:180px}.card-octicon{top:6px;left:10px}.card-note-octicon{top:8px}.is-sending .auto-search-group .chooser-spinner{top:15px;right:21px;left:auto}.card-filter-input{width:0}@media (min-width: 544px){.card-filter-input{width:290px}}.card-filter-autocomplete-dropdown{z-index:500;float:none;min-width:240px;max-height:240px;cursor:pointer}.card-filter-autocomplete-dropdown [aria-selected=\"true\"],.card-filter-autocomplete-dropdown .navigation-focus{color:#fff !important;background-color:#0366d6;border-radius:3px}.card-filter-autocomplete-dropdown [aria-selected=\"true\"] .autocomplete-text-qualifier,.card-filter-autocomplete-dropdown .navigation-focus .autocomplete-text-qualifier{color:#fff !important}.projects-reset-query:hover .projects-reset-query-icon{background-color:#0366d6}.projects-reset-query-icon{width:18px;height:18px;padding:1px;background-color:#6a737d}.project-small-menu-dropdown::before,.project-small-menu-dropdown::after{display:none}.project-header-controls,.project-header-search{flex-grow:1}@media (min-width: 1012px){.project-header-controls,.project-header-search{flex-grow:0}}.project-header-subnav-search{flex-grow:1}@media (min-width: 544px){.project-header-subnav-search{flex-grow:0}}.project-modal{max-width:90vw}.project-page .application-main{flex-shrink:0 !important}@media (min-width: 544px){.project-page .application-main{flex-shrink:1 !important}}.project-page .reponav-small{display:none !important}@media (min-width: 544px){.project-page .reponav-small{display:block !important}}@media (min-width: 1012px){.project-page .reponav-small{display:none !important}}.project-edit-mode .column-menu-container,.project-edit-mode .column-menu-item{display:none !important}.project-edit-mode .project-move-actions{display:flex !important}.push-board-over{padding-right:0 !important;transition:all 0.2s ease}@media (min-width: 544px){.push-board-over{padding-right:360px !important}}.project-touch-scrolling{-webkit-overflow-scrolling:touch}.project-page.menu-active .project-touch-scrolling{-webkit-overflow-scrolling:auto}.projects-comment-form .comment-md-support-link{float:none;width:100%;text-align:center}.projects-comment-form .comment-form-actions{width:100%;padding:8px 16px;margin:4px 0 !important}.projects-comment-form .comment-form-actions button{width:100%;margin:4px 0 !important}.projects-comment-form .comment-form-head{padding:0 !important;margin:0 !important;border-bottom:0}.projects-comment-form .comment-form-head .tabnav-tabs{padding:8px 8px 0}.projects-comment-form .comment-form-head .toolbar-commenting{width:100%;background-color:#fff;border-top:1px solid #d1d5da}.projects-comment-form .comment-form-head .toolbar-commenting .toolbar-group{margin:10px 7px 5px !important}.projects-comment-form .comment-form-head::after{display:block;clear:both;content:\" \"}.projects-comment-form .comment-form-textarea{height:250px !important}.projects-comment-form .preview-content{margin:0;border-top:1px solid #d1d5da}.projects-comment-form .preview-content .comment-body{padding:16px}.project-issue-body-wrapper{max-height:200px;overflow:hidden}.Details--on .project-issue-body-wrapper{max-height:none;overflow:visible}.project-issue-body-blur{height:32px;background:linear-gradient(to top, #fff, rgba(255,255,255,0))}.Details--on .project-issue-body-blur{height:0}.project-comment-title-hover .comment-action,.project-comment-body-hover .comment-action{opacity:0}.project-comment-title-hover:hover .comment-action,.project-comment-body-hover:hover .comment-action{opacity:1}.project-comment-title-hover .octicon-pencil,.project-comment-body-hover .octicon-pencil{color:rgba(27,31,35,0.5)}.project-comment-title-hover .octicon-pencil:hover,.project-comment-body-hover .octicon-pencil:hover{color:#0366d6}.project-comment-body-reaction .timeline-comment-action{padding:4px 8px}.project-comment-reactions .reaction-summary-item{padding:8px}.project-comment-reactions .reaction-summary-item g-emoji{margin:0 !important}.vcard-names{line-height:1}.vcard-fullname{font-size:26px;line-height:30px}.vcard-username{font-size:20px;font-style:normal;font-weight:300;line-height:24px;color:#666}.vcard-details{list-style:none}.vcard-details .css-truncate.css-truncate-target{width:100%;max-width:100%}.vcard-details .css-truncate.css-truncate-target div{overflow:hidden;text-overflow:ellipsis}.vcard-detail{padding-left:24px;font-size:14px}.vcard-detail .octicon{float:left;width:16px;margin-top:3px;margin-left:-24px;color:#6a737d;text-align:center}.member-badge{padding-left:24px;font-size:14px;color:#0366d6}.member-badge .octicon{float:left;width:16px;margin-left:-24px;color:#6a737d;text-align:center}.member-badge+.member-badge{padding-top:0;margin-top:-3px;border-top:0}.new-user-avatar-cta{font-size:14px;color:#244f79;background-color:#f1f6fb;border:solid 1px #d0e5f8;border-radius:3px}.user-profile-bio{margin-bottom:12px;overflow:hidden;font-size:14px;color:#6a737d}.form-group .form-control.user-profile-bio-field{width:440px;height:5.35em;min-height:0}.user-profile-bio-field-container,.user-profile-company-field-container{position:relative}.user-profile-bio-message{margin:5px 0 0;font-size:12px;color:#86181d}.vcard-detail{padding-left:22px}.vcard-detail .octicon{margin-left:-22px}.member-badge{font-size:13px}.user-profile-sticky-bar{position:fixed;top:0;z-index:90;width:233px;word-break:break-all;pointer-events:none;opacity:0;transition:0.2s}.user-profile-sticky-bar::after{position:fixed;top:0;right:0;left:0;z-index:100;display:none;height:54px;content:\"\";background-color:#fff;border-bottom:solid 1px #d1d5da;box-shadow:0 1px 2px rgba(0,0,0,0.075);opacity:0;transition:0.2s}.user-profile-sticky-bar.is-stuck{pointer-events:auto;opacity:1}.user-profile-sticky-bar.is-stuck::after{display:block;opacity:1}.user-profile-mini-vcard{position:relative;top:1px;z-index:110;height:54px}.user-profile-mini-avatar{width:32px}.mini-follow-button{padding:0 8px;line-height:1.5;opacity:0;transition:0.2s}.is-follow-stuck .mini-follow-button{opacity:1}.user-profile-following-container .user-following-container.on .follow,.user-profile-following-container .user-following-container .unfollow{display:none}.user-profile-following-container .user-following-container .follow,.user-profile-following-container .user-following-container.on .unfollow{display:block}.vcard-names-container{top:0}.vcard-names-container.is-stuck{pointer-events:none}.vcard-names-container.is-stuck .vcard-names{opacity:0}.vcard-names-container.is-stuck::after{opacity:1}.blocked-user-notice{width:100%;padding:8px 16px;color:#cb2431;text-align:center;border:solid 1px #d73a49;border-radius:3px}.user-profile-nav{background-color:#fff;border-bottom:solid 1px #d1d5da}.user-profile-nav.is-stuck{z-index:90}.pinned-repos-list{display:flex;list-style:none;flex-wrap:wrap;justify-content:space-between}.pinned-repo-item{display:flex;width:359px}.pinned-repo-item .pinned-repository-handle{padding-top:1px;color:#586069}.pinned-repo-item .pinned-repository-handle:hover{cursor:-webkit-grab;cursor:grab}.pinned-repo-item.is-dragging,.pinned-repo-item.is-dragging .pinned-repository-handle{cursor:-webkit-grabbing;cursor:grabbing}.pinned-repo-item.is-dragging{background-color:#f1f8ff}.pinned-repo-item.sortable-ghost{background-color:#f1f8ff;opacity:0}.pinned-repo-item.empty{border-style:dashed;border-width:1px;align-items:center;justify-content:center}.pinned-repo-item-content{display:flex;width:100%;flex-direction:column}.pinned-repo-desc{flex:1 0 auto}.pinned-repo-meta{display:inline-block}.pinned-repo-meta+.pinned-repo-meta{margin-left:16px}.user-repo-search-results-summary{white-space:normal}.profile-timeline.discussion-timeline{float:none}.profile-timeline.discussion-timeline .profile-timeline-month-heading::after{position:absolute;top:12px;z-index:-1;width:100%;height:1px;content:\"\";background-color:#eaecef}.profile-timeline.discussion-timeline::before{left:15px;background-color:#eaecef}.profile-timeline.discussion-timeline .contribution-joined-github,.profile-timeline.discussion-timeline .contribution-first-pull-request,.profile-timeline.discussion-timeline .contribution-first-repository,.profile-timeline.discussion-timeline .contribution-first-issue{margin-top:-16px}.profile-break-word{-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;word-break:break-word}.profile-timeline-year-list{top:74px}.profile-timeline-card-wrapper{border-top:solid 2px #fff;border-bottom:solid 2px #fff}.profile-timeline-card .issue-meta-section .progress-bar{width:40px}.profile-timeline-card .issue-meta-section .octicon{color:#6a737d;vertical-align:middle}.profile-rollup-wrapper .css-truncate-target{max-width:85%}.profile-rollup-wrapper .progress-bar{height:8px;border-radius:2px}.profile-rollup-wrapper+.profile-rollup-wrapper{border-top:1px solid #eaecef}.profile-timeline-card-wrapper+.profile-timeline-card-wrapper{margin-top:24px}.profile-rollup-wrapper+.profile-timeline-card-wrapper{margin-top:0}.profile-timeline-month-heading+.profile-timeline-card-wrapper{margin-top:24px}.profile-rollup-summarized+.profile-rollup-summarized{border-top:1px solid #eaecef}.profile-rollup-icon{display:inline-block;width:16px;text-align:center}.profile-rollup-content{display:none}.profile-rollup-content .content-title:hover .link-gray-dark-underline{text-decoration:underline}.vertical-text-bottom{vertical-align:text-bottom}.profile-rollup-summarized.open>.profile-rollup-content,.profile-rollup-summarized.open .profile-rollup-toggle-closed,.profile-rollup-wrapper.open>.profile-rollup-content,.profile-rollup-wrapper.open .profile-rollup-toggle-closed{display:block}.profile-rollup-summarized.open .profile-rollup-toggle-open,.profile-rollup-wrapper.open .profile-rollup-toggle-open{display:none}.profile-rollup-toggle-closed{display:none}.profile-rollup-toggle{color:#6a737d;cursor:pointer}.profile-rollup-toggle:hover{color:#0366d6}.pull-request-tab-content{display:none}.pull-request-tab-content.is-visible{display:block}.discussion-timeline p.explain{margin:0;font-size:12px}.pull-request-ref-restore{display:none}.pull-request-ref-restore .animated-ellipsis-container{line-height:16px}.pull-request-ref-restore-text{display:block}.pull-discussion-timeline.is-pull-restorable .pull-request-ref-restore.last{display:block}.stale-files-tab{margin-bottom:10px}.files-bucket{margin-bottom:15px}.full-width .diffbar .container,.split-diff .diffbar .container{padding-right:0;padding-left:0}.pr-toolbar{position:-webkit-sticky;position:sticky;top:0;z-index:29;height:60px;padding:0 20px;margin:-20px -20px 0;background-color:#fff}.pr-toolbar .stale-files-tab{float:left;padding:5px 10px;margin-top:-5px;margin-bottom:-5px;color:#a04100;background-color:#fff8f2;border-radius:3px}.pr-toolbar .subset-files-tab{float:left;padding:5px 10px;margin-top:-5px;margin-bottom:-5px;font-size:13px;color:#0366d6;background-color:#e6f1f6;border-radius:3px}.pr-toolbar .stale-files-tab-link{font-weight:600;color:inherit}.pr-toolbar.is-stuck+.pr-toolbar-shadow{position:fixed;top:60px;right:0;left:0;z-index:28;display:block;height:5px;content:\"\";background:linear-gradient(rgba(0,0,0,0.075), rgba(0,0,0,0.001)) repeat-x 0 0;border-top:1px solid rgba(0,0,0,0.15)}.pr-toolbar .float-right .diffbar-item{margin-right:0}.pr-toolbar .float-right .diffbar-item+.diffbar-item{margin-left:20px}.files-next-bucket .file,.files-next-bucket .full-commit{margin-top:0;margin-bottom:20px}.diffbar{height:20px;padding-top:20px;padding-bottom:20px;background-color:#fff}.diffbar::before{display:table;content:\"\"}.diffbar::after{display:table;clear:both;content:\"\"}.diffbar .container{width:auto}.diffbar .table-of-contents{margin-bottom:0}.diffbar .table-of-contents ol{margin-bottom:-15px}.diffbar .table-of-contents li{border-top:1px solid #eee}.diffbar .table-of-contents li:first-child{border-top:0}.diffbar [aria-selected=\"true\"] .text-emphasized,.diffbar .navigation-focus .text-emphasized{color:#fff}.diffbar-range-menu .select-menu-modal{width:380px}.diffbar-range-menu .css-truncate-target{max-width:280px}.diffbar-range-menu .select-menu-item:not(.select-menu-action){padding:8px 10px}.diffbar-range-menu .emoji{vertical-align:bottom}.diffbar-range-menu .in-range:not([aria-selected=\"true\"]):not(.is-range-selected),.diffbar-range-menu .in-range:not(.navigation-focus):not(.is-range-selected){background-color:#f1f8ff;border-bottom-color:rgba(27,31,35,0.15)}.diffbar-range-menu .is-range-selected{color:#735c0f;cursor:default;background-color:#fffbdd;border-bottom-color:rgba(38,44,49,0.15);outline:none}.diffbar-range-menu .is-range-selected .text-emphasized{color:#776521}.diffbar-range-menu .is-range-selected .description{color:inherit}.diffbar-range-menu .is-last-in-range{cursor:pointer;background-color:#fff5b1}.diffbar-item{float:left;margin-right:20px;font-size:13px;line-height:20px;vertical-align:middle}.fork-collab-tip{width:270px;margin-top:-30px}.fork-collab-tip.dropdown-menu-s{margin-top:10px}.fork-collab-link{margin-left:15px}.conflict-resolver .conflict-loader,.conflict-resolver.loading .resolve-file-form{display:none}.conflict-resolver .resolve-file-form,.conflict-resolver.loading .conflict-loader{display:block}.conflict-resolver.loading{position:relative;height:calc(100vh + 51px);padding-top:50px;border:1px #e1e4e8 solid}.conflict-resolver .file-header{padding:9px 10px}.conflicts-nav{height:100vh;-ms-overflow-style:-ms-autohiding-scrollbar;border-width:0 0 1px}.conflict-nav-item .discussion-item-icon{display:none}.conflict-nav-item.resolved .discussion-item-icon{display:block;margin-left:-5px}.conflict-nav-item.resolved .octicon-file-code{display:none}.conflict-nav-item.selected::before{border-radius:0}.conflict-nav-item .octicon{width:22px}.conflict-nav-item .css-truncate-target{max-width:100%}.is-resolved .file-actions{display:none}.is-resolved .resolved-notice{display:block}.resolved-notice{display:none}.finish-review-label,.add-comment-label,.review-cancel-button,.is-review-pending .start-review-label{display:none}.start-review-label,.is-review-pending .finish-review-label,.is-review-pending .add-comment-label{display:inline-block}.is-review-pending .review-simple-reply-button{display:none}.is-review-pending .review-cancel-button{display:block}.is-review-pending .review-title-default{display:none}.is-review-pending .review-title-with-count{display:block}.review-title-default{display:block}.review-title-with-count{display:none}.pr-review-tools{margin-top:-4px}.pr-review-tools .Counter{display:none}.is-review-pending .pr-review-tools .Counter{display:inline-block}.pull-request-review-menu{top:30px;width:400px}.pull-request-review-menu::after,.pull-request-review-menu::before{display:none}.pull-request-review-menu .select-menu-header{border-radius:3px 3px 0 0}.pull-request-review-menu .form-actions{border-radius:0 0 3px 3px}.pull-request-review-menu .comment-form-head{display:none}.review-thread{border:1px #e1e4e8 solid;border-radius:3px}.review-thread:not(:last-child){margin-bottom:16px}.last-review-thread{padding:10px 10px 0;margin:10px -10px 0;border-top:1px solid #e1e4e8}.review-comment-contents{margin-left:44px}.review-comment-contents .timestamp{color:inherit;white-space:nowrap}.review-comment::after,.review-comment-loader::after,.review-comment.is-comment-editing::after{position:absolute;top:31px;left:29px;z-index:-1;width:3px;height:100%;content:\"\";background-color:#f6f8fa}.review-comment{position:relative;padding:8px 16px}.review-comment:first-child{padding-top:16px}.review-comment:last-child{padding-bottom:16px}.review-comment .comment-body,.review-comment .comment-reactions{padding:0}.review-comment .comment-body{padding-top:4px}.review-comment .comment-body .suggested-change-form-container:nth-last-of-type(2){margin-bottom:0 !important}.review-comment .comment-reactions{margin-top:5px;border-top:0}.review-comment .comment-reactions .add-reaction-btn{padding:4px 10px}.review-comment .comment-reactions.has-reactions{margin-top:12px}.review-comment .add-reaction-popover.dropdown-menu-sw,.review-comment .show-more-popover.dropdown-menu-sw{right:-5px;margin-top:5px}.review-comment .add-reaction-popover.dropdown-menu-ne{left:9px}.review-comment .reaction-summary-item:not(.add-reaction-btn){padding:0 8px;font-size:12px;line-height:26px;border:1px solid #d2dff0;border-radius:3px}.review-comment .reaction-summary-item:not(.add-reaction-btn) .emoji{font-size:16px;vertical-align:sub}.review-comment .reaction-summary-item:not(.add-reaction-btn)+.reaction-summary-item{margin-left:8px}.review-comment:last-child::after,.review-comment:last-child .review-comment-contents::after{display:none}.review-comment .timeline-comment-actions{opacity:0}.review-comment:hover .timeline-comment-actions,.review-comment.is-reacting .timeline-comment-actions{opacity:1}.review-comment .timeline-comment-action{padding:0 5px}.review-comment .timeline-comment-label{float:none;margin-top:0}.review-comment .is-comment-editing{position:relative;background-color:#fff;border:1px #e1e4e8 solid;border-radius:3px}.review-comment .is-comment-editing::after{top:100%;bottom:0;left:19px;height:20px}.review-comment .is-comment-editing .timeline-comment-actions,.review-comment .is-comment-editing .edit-comment-hide{display:none}.review-comment .is-comment-editing .previewable-comment-form{display:block}.review-comment.is-comment-loading .previewable-comment-form{opacity:0.5}.review-comment.is-comment-stale .comment-form-stale{display:block}.timeline-comment.is-comment-editing .discussion-item-header{display:none}.discussion-item-body .outdated-comment .hide-outdated-button{display:none}.discussion-item-body .outdated-comment.file{margin:4px 0}.discussion-item-body .outdated-comment .file-header{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.discussion-item-body .outdated-comment[open] .hide-outdated-button{display:block}.discussion-item-body .outdated-comment[open] .show-outdated-button{display:none}.discussion-item-body .outdated-comment[open] .file-header{border-bottom:1px #e1e4e8 solid;border-bottom-right-radius:0;border-bottom-left-radius:0}.discussion-item-body .outdated-comment .blob-code{position:static}.discussion-item-body .outdated-comment-label{height:26px;margin-top:3px;line-height:25px}.discussion-item-body .outdated-comment-label .octicon{top:1px}.review-thread-reply{padding:8px 16px;background-color:#f6f8fa;border-top:1px #e1e4e8 solid;border-radius:0 0 3px 3px}.discussion-item-review .review-thread-reply{margin-bottom:0;border-width:1px 0 0}.review-thread-reply .inline-comment-form{margin:-8px -16px;background-color:#fff;border:0}.review-thread-reply-button{display:inline-block;min-height:28px;padding:3px 8px;margin-left:8px;cursor:text}.review-summary-form-wrapper{display:none;margin-bottom:24px;margin-left:-20px;background-color:#fff;border:1px #e1e4e8 solid;border-radius:3px}.is-pending .review-summary-form-wrapper,.is-comment-editing .review-summary-form-wrapper{display:block}.is-pending .review-summary-form-wrapper{border-color:#d9d0a5}.tooltipped-left::after{right:auto;left:0}.tooltipped-left::before{right:auto;left:0}.discussion-item-review .edit-review{opacity:0;transition:opacity 0.15s ease 0s}.discussion-item-review:hover .edit-review{opacity:1}.diffstat-summary{padding:0 20px 0 0;font-size:16px;line-height:1.8;color:#586069;text-align:left;vertical-align:middle;border-radius:3px}.diffstat-summary a{color:#555}.diffstat-summary strong{color:#333}.authors-and-code .insertions{color:#28a745}.authors-and-code .deletions{color:#cb2431}.authors-and-code .section{display:table-cell;width:459px;height:150px}.pulse-authors-graph{position:relative;height:150px}.pulse-authors-graph>svg{width:100%}.pulse-authors-graph .dots{position:absolute;top:40px;right:0;left:0;width:64px;height:64px;margin:0 auto}.pulse-authors-graph .bar rect{fill:#f66a0a;fill-opacity:0.7}.pulse-authors-graph .bar rect:hover{fill-opacity:1}.summary-stats{display:table;width:100%;table-layout:fixed}.summary-stats li{display:table-cell;color:#586069;text-align:center;border-left:1px solid #e1e4e8}.summary-stats li a{display:block;padding-bottom:10px;color:#586069;text-decoration:none}.summary-stats li a:hover{background:#fafafa}.summary-stats li .octicon-git-pull-request{color:#6f42c1}.summary-stats li .octicon-git-branch{color:#28a745}.summary-stats li .octicon-issue-closed{color:#cb2431}.summary-stats li .octicon-issue-opened{color:#28a745}.summary-stats li:first-child{border-left:0;border-bottom-left-radius:3px}.summary-stats li .num{display:block;padding-top:10px;font-size:16px;font-weight:600;color:#000}.pulse-sections{margin-top:20px;clear:both}.pulse-section{padding:0;clear:both;font-size:14px;color:#666}.pulse-section p{margin-top:20px}.readme.contributing>div{max-height:250px;overflow:auto}.readme .markdown-body,.readme .plain{padding:45px;word-wrap:break-word;background-color:#fff;border:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.readme .plain pre{font-size:15px;white-space:pre-wrap}.file .readme .markdown-body{padding:45px;border:0;border-radius:0}.file .readme table[data-table-type=\"yaml-metadata\"]{font-size:12px;line-height:1}.file .readme table[data-table-type=\"yaml-metadata\"] table{margin:0}.release-timeline-tags .tag-timeline-date::after{position:absolute;top:50%;right:-7px;z-index:10;display:block;width:12px;height:12px;box-sizing:border-box;margin-top:-6px;content:\" \";background-color:#e1e4e8;border:2px solid #fff;border-radius:6px}.release-timeline-tags.is-collapsed .expander{display:block !important}.release-timeline-tags.is-collapsed>.collapsable{display:none}.Label--draft{color:#cb2431;border-color:#d73a49}.Label--prerelease{color:#f66a0a;border-color:#f66a0a}.uploaded-files{border-top-left-radius:3px;border-top-right-radius:3px}.uploaded-files.not-populated+.drop-target p{border-top:1px #c3c8cf;border-top-left-radius:3px;border-top-right-radius:3px}.uploaded-files.is-populated{border:1px solid #ddd;border-bottom-color:#e5e5e5}.uploaded-files.is-populated+.drop-target p{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.uploaded-files>li.delete{background:#f9f9f9}.uploaded-files>li.delete:nth-child(2){border-top-left-radius:3px;border-top-right-radius:3px}.uploaded-files>li.delete .delete-pending{display:block !important}.uploaded-files>li.delete .live{display:none !important}.uploaded-files>li:nth-child(2){border-top:0 !important}.uploaded-files .remove:hover{color:#cb2431 !important}.upload-progress{height:3px;margin-top:3px;border-radius:30px;box-shadow:0 1px 1px #fff,inset 0 1px 1px rgba(255,255,255,0.5)}.upload-progress .upload-meter{background-image:linear-gradient(#8dd2f7, #58b8f4);border-radius:30px}.release-entry{border-bottom:1px #e1e4e8 solid}.release-entry:last-child{border-bottom:0}@media (min-width: 768px){.release-tag-field{width:130px !important}.release-main-section{border-left:2px solid #e1e4e8}.release-entry{border-bottom:0}}.repo-file-upload-progress{position:relative;height:0;overflow:hidden;color:#246;background:#f7fbfe;border-bottom-right-radius:3px;border-bottom-left-radius:3px;box-shadow:0 0 0 1px #d0dbe7 inset;transition:height 0.2s ease-out}.repo-file-upload-progress.active{height:50px}.repo-file-upload-progress.is-file-list{border-bottom-right-radius:0;border-bottom-left-radius:0}.repo-file-upload-progress .repo-file-upload-meter{position:absolute;top:1px;left:1px;width:0;height:48px;background:#d8e8f7}.repo-file-upload-progress .repo-file-upload-meter-text{position:absolute;top:7px;left:10px}.repo-file-upload-progress .repo-file-upload-meter-text .repo-file-upload-info{display:block;font-weight:600}.repo-file-upload-progress .repo-file-upload-meter-text .repo-file-upload-meter-filename{display:block;margin:0}.manifest-commit-form{margin-top:20px}.repo-file-upload-outline{width:100%;height:100%}.repo-file-upload-target{position:relative;padding-top:100px;padding-bottom:80px;color:#666}.repo-file-upload-target.is-progress-bar,.repo-file-upload-target.is-uploading{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.repo-file-upload-target.is-file-list{border-bottom-right-radius:0;border-bottom-left-radius:0}.repo-file-upload-target.is-uploading .repo-file-upload-text.initial-text,.repo-file-upload-target.is-failed .repo-file-upload-text.initial-text,.repo-file-upload-target.is-default .repo-file-upload-text.initial-text{display:none}.repo-file-upload-target.is-uploading .repo-file-upload-text.alternate-text,.repo-file-upload-target.is-failed .repo-file-upload-text.alternate-text,.repo-file-upload-target.is-default .repo-file-upload-text.alternate-text{display:block}.repo-file-upload-target.is-uploading.dragover .repo-file-upload-text,.repo-file-upload-target.is-failed.dragover .repo-file-upload-text,.repo-file-upload-target.is-default.dragover .repo-file-upload-text{display:none}.repo-file-upload-target .repo-file-upload-text.initial-text{display:block}.repo-file-upload-target .repo-file-upload-text.alternate-text{display:none}.repo-file-upload-target .repo-file-upload-text,.repo-file-upload-target .repo-file-upload-drop-text{margin-bottom:5px}.repo-file-upload-target .repo-file-upload-choose{display:inline-block;margin-top:0;font-size:18px}.repo-file-upload-target .manual-file-chooser{margin-left:0}.repo-file-upload-target .repo-file-upload-outline{position:absolute;top:3%;left:1%;width:98%;height:94%}.repo-file-upload-target.is-failed .repo-file-upload-outline,.repo-file-upload-target.is-bad-file .repo-file-upload-outline,.repo-file-upload-target.is-too-big .repo-file-upload-outline,.repo-file-upload-target.is-too-many .repo-file-upload-outline,.repo-file-upload-target.is-empty .repo-file-upload-outline{height:85%}.repo-file-upload-target.dragover .repo-file-upload-text{display:none}.repo-file-upload-target.dragover .repo-file-upload-choose{visibility:hidden}.repo-file-upload-target.dragover .repo-file-upload-drop-text{display:block}.repo-file-upload-target.dragover .repo-file-upload-outline{border:6px #ddd dashed;border-radius:5px}.repo-file-upload-target .repo-file-upload-drop-text{display:none}.repo-file-upload-errors{display:none}.repo-file-upload-errors .error{display:none}.is-failed .repo-file-upload-errors,.is-bad-file .repo-file-upload-errors,.is-too-big .repo-file-upload-errors,.is-too-many .repo-file-upload-errors,.is-hidden-file .repo-file-upload-errors,.is-empty .repo-file-upload-errors{position:absolute;right:0;bottom:0;left:0;display:block;padding:5px 8px;line-height:1.5;text-align:left;background-color:#fff;border-top:1px solid #e5e5e5;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.is-file-list .repo-file-upload-errors{border-bottom-right-radius:0;border-bottom-left-radius:0}.is-failed .repo-file-upload-errors .failed-request,.is-bad-file .repo-file-upload-errors .failed-request{display:inline-block}.is-too-big .repo-file-upload-errors .too-big{display:inline-block}.is-hidden-file .repo-file-upload-errors .hidden-file{display:inline-block}.is-too-many .repo-file-upload-errors .too-many{display:inline-block}.is-empty .repo-file-upload-errors .empty{display:inline-block}.repo-file-upload-tree-target{position:fixed;top:0;left:0;z-index:1000;width:100%;height:100%;padding:12px;color:#666;visibility:hidden;background:radial-gradient(ellipse at center, #fff 0%, rgba(255,255,255,0.85) 65%, rgba(255,255,255,0.85) 100%);opacity:0;transition:visibility 0.2s, opacity 0.2s}.repo-file-upload-tree-target .repo-file-upload-outline{border:6px #ddd dashed;border-radius:5px}.dragover .repo-file-upload-tree-target{visibility:visible;opacity:1}.dragover .repo-file-upload-tree-target .repo-file-upload-slate{top:50%;opacity:1}.dragover .repo-file-upload-tree-target .files-lg>.file-graph{opacity:1;transform:translateX(4px)}.dragover .repo-file-upload-tree-target .files-lg>.file-zip{opacity:1;transform:translateX(9px)}.dragover .repo-file-upload-tree-target .files-lg>.file-generic{opacity:1;transform:translateX(-4px)}.dragover .repo-file-upload-tree-target .files-lg>.file-acrobat{opacity:1;transform:translateX(-9px)}.repo-file-upload-slate{position:absolute;top:50%;width:100%;text-align:center;transform:translateY(-50%)}.repo-file-upload-slate h2{margin-top:5px}.repo-file-upload-slate .file-graph{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275),transform 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275);transform:translateX(50px)}.repo-file-upload-slate .file-zip{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275),transform 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275);transform:translateX(90px)}.repo-file-upload-slate .file-generic{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275),transform 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275);transform:translateX(-50px)}.repo-file-upload-slate .file-acrobat{opacity:0;transition:opacity 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275),transform 0.2s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275);transform:translateX(-90px)}.repo-file-upload-file-wrap .name{color:#888}.repo-file-upload-file-wrap .actions{width:50px;padding-right:10px;text-align:right}.repo-file-upload-file-wrap .remove-file{color:#888}.repo-file-upload-file-wrap .remove-file:hover{color:#666}.repo-upload-breadcrumb{margin-bottom:18px}.labels-list .blankslate{display:none}.labels-list .table-list-header{display:block}.labels-list.is-empty .blankslate{display:block}.labels-list.is-empty .table-list-header{display:none}.labels-list-item .table-list-cell{width:100%}.label-description{padding:8px 16px}.label-delete-confirmation{line-height:34px}.labels-list-action{display:block;float:left;padding:8px 10px;color:#586069}.labels-list-action .octicon{margin-right:2px}.labels-list-action .octicon-pencil{font-size:14px}.sidebar-labels .sidebar-labels-style{margin-top:3px}.label-select-menu-item .g-emoji{font-size:12px;line-height:1;vertical-align:baseline}.new-label{padding:10px;margin-bottom:15px;background-color:#fafbfc;border:1px solid #e5e5e5;border-radius:3px}.new-label .label-edit::before{display:table;content:\"\"}.new-label .label-edit::after{display:table;clear:both;content:\"\"}.label-edit::before{display:table;content:\"\"}.label-edit::after{display:table;clear:both;content:\"\"}.label-edit label{display:block;margin-bottom:8px}.label-edit .error{float:left;margin-top:8px;margin-left:10px;color:#f00}.label-edit.is-valid .octicon-check{display:block}.label-edit.loading{display:block}.label-delete-form{display:inline}.label-delete-form.loading .label-delete-spinner{display:block}.label-delete-spinner{display:none;float:left;margin-top:10px;margin-right:10px}.label-characters-remaining{color:#586069}.emoji-size-boost .IssueLabel .g-emoji{top:0;font-size:1.15em;line-height:1.1}.repo-list{position:relative}.repo-list-item{position:relative;padding-top:30px;padding-bottom:30px;list-style:none;border-bottom:1px solid #eee}.repo-list-item-with-avatar{padding-left:42px}.repo-list-item-hanging-avatar{float:left;margin-left:-42px}.mini-repo-list-item{position:relative;display:block;padding:6px 64px 6px 30px;font-size:14px;border-top:1px solid #d1d5da}.mini-repo-list-item:hover{text-decoration:none}.mini-repo-list-item:hover .repo,.mini-repo-list-item:hover .owner{text-decoration:underline}.mini-repo-list-item .repo-icon{float:left;margin-top:2px;margin-left:-20px;color:#666}.mini-repo-list-item .repo-and-owner{max-width:220px}.mini-repo-list-item .owner{max-width:110px}.mini-repo-list-item .repo{font-weight:600}.mini-repo-list-item .stars{position:absolute;top:0;right:10px;margin-top:6px;font-size:12px;color:#6a737d}.mini-repo-list-item .repo-description{display:block;max-width:100%;font-size:12px;line-height:21px;color:#586069}.private .mini-repo-list-item{background-color:#fffdef}.private .mini-repo-list-item .repo-icon{color:rgba(27,31,35,0.7)}.filter-bar{padding:10px;background-color:#fafbfc;border-bottom:1px solid #e5e5e5}.filter-bar::before{display:table;content:\"\"}.filter-bar::after{display:table;clear:both;content:\"\"}.user-repos .filter-bar{text-align:center}.url-box{width:100%;height:26px;padding:10px 10px 0;margin-top:10px;margin-left:-10px;border-top:1px solid #ddd}.url-box p{float:left;height:26px;margin:0 0 0 5px;line-height:26px}.url-box p strong{color:#000}.clone-url-button{display:table-cell;width:1%;vertical-align:top}.clone-url-button:first-child .clone-url-link{border-top-left-radius:3px;border-bottom-left-radius:3px}.clone-url-button>.clone-url-link{position:relative;display:block;padding:0 9px;margin-right:-1px;font-size:11px;font-weight:600;line-height:26px;color:#333;text-decoration:none;white-space:nowrap;cursor:pointer;background-image:linear-gradient(#fafafa, #eaeaea);border:1px solid #ccc}.clone-url-button>.clone-url-link:hover,.clone-url-button>.clone-url-link:active{z-index:3;color:#fff;text-decoration:none;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-image:linear-gradient(#599bcd, #3072b3);border-color:#2a65a0}.clone-url-button>.clone-url-link:active{background-color:#3072b3;background-image:none;border-color:#25588c;box-shadow:inset 0 3px 5px rgba(0,0,0,0.15)}.clone-url-button>.clone-url-link:focus{outline:0}.clone-url-button+.clone-url-button>.clone-url-link{box-shadow:inset 1px 0 0 #fff}.clone-url-button+.clone-url-button>.clone-url-link:hover{box-shadow:none}.clone-url-button+.clone-url-button>.clone-url-link:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.15)}.clone-url-button.selected>.clone-url-link,.clone-url-button.selected>.clone-url-link:hover{z-index:2;color:#333;text-shadow:0 1px 0 rgba(255,255,255,0.6);background-color:#ccc;background-image:linear-gradient(#ccc, #d5d5d5);border-color:#bbb;box-shadow:inset 0 2px 3px rgba(0,0,0,0.075)}.url-box-clippy .zeroclipboard-button{margin-left:0 !important;border-left:0;border-radius:0 3px 3px 0}.repository-import .repository-import-label{display:block;margin-bottom:8px;font-size:18px;font-weight:400}.repository-import .state-header{font-size:16px}.text-yellow{color:rgba(115,92,15,0.5)}.timeout{width:auto;height:300px;padding:0;margin:20px 0;background-color:transparent;border:0}.timeout h3{padding-top:100px;color:#586069}.overall-summary{position:relative;margin-bottom:10px;border:1px solid #dfe2e5;border-radius:3px}.overall-summary-bottomless{margin-bottom:0;border-bottom:0;border-radius:3px 3px 0 0}.numbers-summary{display:table;width:100%;table-layout:fixed}.numbers-summary li{display:table-cell;padding:0;text-align:center;white-space:nowrap}.numbers-summary a,.numbers-summary .nolink{display:block;padding:10px 0;color:#586069;text-decoration:none}.numbers-summary .octicon{color:#6a737d}.numbers-summary a:hover{color:#0366d6}.numbers-summary a:hover .num{color:inherit}.repo-language-color{position:relative;top:1px;display:inline-block;width:12px;height:12px;border-radius:50%}.repository-meta{margin:0 0 20px;clear:both;font-size:16px;color:#586069}.repository-meta::before{display:table;content:\"\"}.repository-meta::after{display:table;clear:both;content:\"\"}.repository-meta .repo-description-field{width:540px}.repository-meta .repo-website-field{width:300px}.repository-meta .repository-meta-content{display:inline-block}.repository-meta .edit-repository-meta{display:none;margin-bottom:5px;font-size:13px}.repository-meta .edit-repository-meta .field{display:inline-block;margin-right:5px}.repository-meta .edit-repository-meta label{display:block;margin-bottom:6px;font-weight:600;color:#24292e}.repository-meta.open .repository-meta-content,.repository-meta.open .edit-link{display:none}.repository-meta.open .edit-repository-meta{display:block;margin-bottom:20px}.experiment-repo-nav .capped-cards .capped-card{width:480px}.experiment-repo-nav .new-issue-form{padding-top:0;border-top:0}.experiment-repo-nav.repohead .repo-mirror{padding-left:20px}.iconbutton .octicon{margin-right:0}.file-navigation::before{display:table;content:\"\"}.file-navigation::after{display:table;clear:both;content:\"\"}.file-navigation.in-mid-page{margin-top:15px}.file-navigation .select-menu-button .css-truncate-target{max-width:200px}.file-navigation .branch-select-menu{margin-right:6px;margin-bottom:10px}.file-navigation .new-pull-request-btn{float:left}.file-navigation .breadcrumb{float:left;margin-top:0;margin-left:5px;font-size:16px;line-height:26px}.file-navigation+.breadcrumb{margin-bottom:10px}.file-navigation .BtnGroup{margin-bottom:10px;margin-left:10px}.file-navigation .get-repo-select-menu{margin-left:6px}.file-navigation .get-repo-modal{top:6px;width:352px}.file-navigation .get-repo-modal .https-clone-options{display:block}.file-navigation .get-repo-modal .ssh-clone-options{display:none}.file-navigation .get-repo-modal.on .https-clone-options{display:none}.file-navigation .get-repo-modal.on .ssh-clone-options{display:block}.file-navigation .get-repo-modal .get-repo-modal-options{display:block}.file-navigation .get-repo-modal.is-downloading .get-repo-modal-options{display:none}.file-navigation .get-repo-modal .animated-ellipsis-container{width:16px;height:16px}.file-navigation .get-repo-modal .animated-ellipsis-container>.animated-ellipsis{animation:ellipsis 1s infinite}@keyframes ellipsis{from{width:2px}to{width:16px}}.file-navigation .btn-change-protocol{font-size:12px}.file-navigation .get-repo-decription-text{font-size:13px}.file-navigation .get-repo-btn{float:left;width:50%;padding:10px 0;text-align:center;border:0;border-top:1px solid #e1e4e8;border-radius:0}.file-navigation .get-repo-btn:first-child{border-right:1px solid #e1e4e8;border-bottom-left-radius:3px}.file-navigation .get-repo-btn:nth-child(1):nth-last-child(3){border-radius:0}.file-navigation .get-repo-btn:last-child{border-bottom-right-radius:3px}.file-navigation .get-repo-btn.btn-block,.file-navigation .get-repo-btn:only-child{width:100%;border-right:0;border-radius:0 0 3px 3px}.file-navigation .clone-options{padding:8px 16px 16px}.file-wrap,.details-truncate-file-list.Details--on .file-wrap{max-height:none;margin-bottom:10px;border:1px solid #dfe2e5;border-top:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.file-wrap .include-fragment-error,.details-truncate-file-list.Details--on .file-wrap .include-fragment-error{display:none}.file-wrap.is-error .include-fragment-error,.details-truncate-file-list.Details--on .file-wrap.is-error .include-fragment-error{display:table-row}.details-truncate-file-list .file-wrap{max-height:185px;margin-bottom:0;overflow-y:scroll;border-bottom-right-radius:0;border-bottom-left-radius:0}.details-truncate-file-list .file-wrap .files{border-bottom-right-radius:0;border-bottom-left-radius:0}.details-truncate-file-list .btn-truncate-file-list{background:#fff;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.details-truncate-file-list .btn-truncate-file-list:hover{background:#f6f8fa}table.files{width:100%;background:#fff;border-radius:2px}table.files tr[aria-selected=\"true\"] td,table.files tr.navigation-focus td{background:#f6f8fa}table.files td{padding:6px 3px;line-height:20px;border-top:1px solid #eaecef}table.files td.icon{width:17px;padding-right:2px;padding-left:10px;color:rgba(3,47,98,0.55)}table.files td.icon .octicon-file-directory{color:rgba(3,47,98,0.5)}table.files td.icon .spinner{position:relative;top:3px;display:none;margin-top:-3px;margin-left:-2px}table.files td .simplified-path{color:#6a737d}table.files td .css-truncate{max-width:100%}table.files td.content{max-width:180px}table.files td.message{max-width:442px;padding-left:10px;overflow:hidden;color:#6a737d}table.files td.message .emoji{vertical-align:top}table.files td.message a{color:#6a737d}table.files td.message a:hover{color:#0366d6}table.files td.age{width:125px;padding-right:10px;color:#6a737d;text-align:right;white-space:nowrap}table.files .message .tooltipped::before,table.files .message .tooltipped::after{display:none}table.files tr.is-loading td.icon .octicon{display:none}table.files tr.is-loading td.icon .spinner{display:inline-block}table.files tr.up-tree{border-top:1px solid #eaecef;border-bottom:1px solid #eaecef}table.files tr.up-tree a{padding:3px 6px;margin-left:-3px;font-weight:600;border-radius:2px}table.files tr.up-tree a:hover{background-color:#dfe2e5}table.files tbody tr:first-child td{border-top:0}.branch-infobar{padding:8px;color:#586069;background-color:#fafbfc;border:solid #dfe2e5;border-width:1px 1px 0;border-top-left-radius:3px;border-top-right-radius:3px}.branch-infobar::before{display:table;content:\"\"}.branch-infobar::after{display:table;clear:both;content:\"\"}.branch-infobar .muted-link{display:inline-block;margin-left:10px}.branch-infobar .muted-link .octicon{color:#959da5}.branch-infobar .muted-link:hover .octicon{color:inherit}.spinner-forking{display:block;margin:20px auto 40px}.prereceive-feedback{padding:15px;margin-bottom:15px;border:1px solid #dfe2e5;border-left:3px solid #caa21a;border-radius:3px}.prereceive-feedback-heading{margin-top:0;margin-bottom:10px;color:#b08800}.file-navigation-options{float:right;margin-left:3px}.file-navigation-options.active .dropdown-menu-content{display:block}.file-navigation-options .dropdown-menu{width:360px;padding:15px}.file-navigation-options .dropdown-divider{margin:15px -15px}.file-navigation-option{position:relative;display:inline-block;margin-left:3px}.file-navigation-option .select-menu{display:inline-block;margin-right:0;margin-bottom:0;vertical-align:middle}.file-navigation-option .select-menu-button .octicon:only-child{margin-left:2px}.file-navigation-option .zeroclipboard-button{padding-right:8px}.file-navigation-option .input-group{width:290px}.file-navigation-option .input-group .form-control{width:calc(100% + 2px);height:28px;min-height:0;margin-right:-1px;margin-left:-1px;border-radius:0}.file-navigation-option .input-group .select-menu-button{position:relative;z-index:2}.profile-picture{margin:10px 0 0}.profile-picture>p{float:left;margin:0;line-height:30px}.profile-picture>img{float:left;margin:0 10px 0 0;border-radius:3px}.app-owner{margin:15px 0 0}.edit-profile-avatar{width:200px}.edit-profile-avatar .drag-and-drop{padding:0;color:#666;border-width:0}.edit-profile-avatar input{cursor:pointer}.edit-profile-avatar.is-bad-file{border:0}.edit-profile-avatar .manual-file-chooser{position:absolute;top:0;left:0;height:34px;padding:0;cursor:pointer}.button-change-avatar{overflow:hidden}.profile-picture-spinner{background-image:url(\"/images/spinners/octocat-spinner-128.gif\");background-repeat:no-repeat;background-position:center;background-size:64px 64px}.avatar-upload .flash{width:100%;padding:30px 15px;border:dashed 1px #d73a49;box-shadow:none}.avatar-upload .upload-state{display:none;padding:10px 0}.avatar-upload .upload-state p{margin:0;font-size:12px;color:#586069}.avatar-upload .avatar-upload .octicon{display:inline-block}.is-uploading .avatar-upload .loading{display:block;padding:0}.is-uploading .avatar-upload .loading img{vertical-align:top}.is-uploading .avatar-upload .button-change-avatar{display:none}.is-bad-file .avatar-upload .bad-file{display:block;margin:0}.is-too-big .avatar-upload .too-big{display:block;margin:0}.is-bad-dimensions .avatar-upload .bad-dimensions{display:block;margin:0}.is-bad-format .avatar-upload .bad-format{display:block;margin:0}.is-failed .avatar-upload .failed-request{display:block;margin:0}.is-empty .avatar-upload .file-empty{display:block;margin:0}dl.new-email-form{padding:10px 10px 0;margin:0 -10px 10px;border-top:1px solid #e5e5e5}.email-actions{float:right}.email-actions>span{float:left}.email-actions form{display:inline}.email-actions span.label{padding:0 10px;font-size:13px;color:#586069}.email-actions .octicon-alert{color:#ca5633}.boxed-group .fork-flag{margin-left:16px;font-size:12px;color:#586069}.selected-user-key{background-color:#fffdef}.user-key-type{padding-right:20px;padding-left:10px;text-align:center}.user-key-badge{display:block;padding-right:5px;padding-left:5px;margin-top:3px;font-size:12px;line-height:1.4;border:solid 1px #ddd;border-radius:3px}.user-key-email-badge{display:inline-table;margin-right:4px}.user-key-email{display:table-cell;padding:1px 5px;font-size:12px;line-height:1.4;border:solid 1px #ddd;border-radius:3px}.user-key-email.unverified{border-top-right-radius:0;border-bottom-right-radius:0}.user-key-email-unverified{display:table-cell;padding-right:5px;padding-left:5px;font-size:11px;color:#666;background-color:#ecebec;border:solid 1px #ddd;border-left:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.user-key-details{width:400px;line-height:1.6;white-space:normal}.user-key-details code{font-size:13px}.recent-user-key{color:#28a745}.recent-user-key-access{color:#1e7e34}.unverified-user-key,.unverified-user-key-notice{color:#cb2431}.notification-center .overview{padding:0 10px 10px;border-bottom:1px solid #ddd}.oauth-app-info-container .float-left-container{float:left;text-align:left}.oauth-app-info-container .float-right-container{float:right;text-align:right}.oauth-app-info-container dl.keys{margin:10px 0}.oauth-app-info-container dl.keys dt{margin-top:10px;font-weight:600;color:#586069}.oauth-app-info-container dl.keys dd{font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;color:#333}.oauth-app-info-container .user-count{font-size:30px;font-weight:300;color:#586069}.logo-uploader-container{display:block}.logo-upload{position:relative;display:inline-block}.logo-upload a.delete,.logo-upload span.delete{position:absolute;left:88px;display:none;padding:8px 10px}.logo-upload a.delete:hover,.logo-upload span.delete:hover{color:#cb2431}.logo-upload-container{display:inline-block}.logo-upload-container .logo-upload-label .manual-file-chooser{top:0;left:0;width:130px;height:34px;padding:0;margin-left:0;cursor:pointer}.logo-upload-container .upload-state{padding:10px 0}.logo-upload-container .upload-state p{margin:0;font-size:12px;color:#586069}.logo-box{display:inline-block;float:left;width:120px;height:120px;background-color:#eee;border:1px solid #ccc;border-radius:3px}.logo-box img{display:none;width:118px;height:118px;border-radius:3px}.logo-placeholder{color:#586069;text-align:center;text-shadow:0 1px 0 #fff}.logo-placeholder p{margin:0;font-size:14px}.has-uploaded-logo .logo-placeholder,.has-uploaded-logo .or{display:none}.has-uploaded-logo:hover a.delete,.has-uploaded-logo:hover span.delete{display:block}.has-uploaded-logo .logo-box img{display:block}.saved-reply-form{border:1px solid #ddd;border-radius:3px}.saved-reply-form .tabnav-tab.selected{border-radius:3px 3px 0 0}.saved-reply-form .form-actions{margin-right:10px;margin-bottom:8px}.saved-reply-form .comment{border:0}.saved-reply-form .comment-body{padding:5px 5px 15px;background-color:transparent;border-bottom:1px solid #eee}.saved-reply-settings-container.has-replies .listgroup{display:block}.saved-reply-settings-container.has-replies .blankslate{display:none}.saved-reply-settings-container .listgroup{display:none}.access-token{border-bottom:1px solid #e5e5e5}.access-token:last-child{border:0}.access-token .last-used{margin-right:10px}.access-token .zeroclipboard-link{display:inline-block;vertical-align:text-bottom}.access-token.new-token{background-color:rgba(108,198,68,0.1)}.access-token.new-token .octicon-check{color:#28a745}.access-token .token-description{max-width:450px;color:#24292e}.access-token .token{font-size:14px}.access-token .sso-ready-badge{display:inline-block;padding:1px 4px;font-size:10px;line-height:16px;color:#767676;vertical-align:middle;background:none;border:1px solid #e5e5e5;border-radius:2px}.access-token .sso-ready-badge:focus{outline:none}.access-token .sso-ready-badge:hover{border-color:#ccc}.access-token .sso-ready-badge.ready{color:#55a532}.access-token .sso-ready-badge.ready:hover{border-color:#55a532}.access-token .credential-authorization-statuses{position:relative;display:inline-block}.access-token .credential-authorization-statuses.active .dropdown-menu-content{display:block}.access-token .credential-authorization-statuses .dropdown-menu{top:-4px;min-width:400px;max-width:500px;padding-top:0;padding-bottom:0}.access-token .credential-authorization-menu{padding:15px;font-size:13px;line-height:1.4}.access-token .credential-authorization-menu .status-heading{color:#24292e}.access-token .credential-authorization-status-list{max-height:235px;padding:0;margin:15px -15px -15px;overflow:scroll;border-top:1px solid #eee;transition:max-height 0.25s ease-in-out}.access-token .credential-authorization-status-item{position:relative;padding:10px 15px 10px 12px;background-color:#fafbfc;border-bottom:1px solid #eee}.access-token .credential-authorization-status-item:last-child{border-bottom:0;border-radius:0 0 2px 2px}.access-token .credential-authorization-status-icon{width:30px;margin-right:10px}.access-token .credential-authorization-status-avatar{position:relative;top:5px}.regenerate-token-cta .btn-danger{margin-left:30px}.personal-access-tokens-group{padding:0 10px}.personal-access-tokens label{display:inline}.personal-access-tokens label p{display:inline-block;margin:0;font-size:13px;font-weight:400}.personal-access-tokens .child-scopes{margin-left:20px;list-style:none}.personal-access-tokens .child-scopes .token-scope{width:180px;font-weight:400}.personal-access-tokens .child-scopes .child-scopes{margin-left:0}.token-scope{display:inline-block;width:200px;padding:2px 0;margin:0;font-size:13px;color:#24292e}.token-scope input{margin-right:5px}.callback-urls dl dd .form-control{width:100%}.callback-urls.has-many .callback-url-action-cell{display:table-cell}.callback-description{margin-top:20px}.callback-description .octicon{padding-left:0}.callback-url .label{display:none;width:64px;text-align:center}.callback-url.is-default-callback .label{display:inline-block}.callback-url.is-default-callback .btn{display:none}.callback-url-wrap{display:table;width:100%}.callback-url-field-cell{display:table-cell}.callback-url-action-cell{display:none;width:70px;text-align:right}.boxed-group.application-show-group dl.form-group>dd .form-control.wide{width:460px}.boxed-group.application-show-group dl.form-group>dd .form-control.short{height:50px;min-height:50px}.application-show-group .errored .note{display:none}.application-show-group .drag-and-drop{padding:0;text-align:left;background-color:transparent;border:0}.application-show-group .drag-and-drop img{margin-bottom:1px;vertical-align:bottom}.application-show-group .drag-and-drop span{padding:0}.application-show-group .dragover .logo-box{box-shadow:#c9ff00 0 0 3px}.application-show-group .is-uploading .loading{display:inline-block}.application-show-group .is-uploading .default{display:none}.application-show-group .is-failed .failed-request{display:inline-block}.application-show-group .is-failed .default{display:none}.application-show-group .is-bad-file .bad-file{display:inline-block}.application-show-group .is-bad-file .default{display:none}.application-show-group .is-too-big .file-too-big{display:inline-block}.application-show-group .is-too-big .default{display:none}.application-show-group .is-bad-format .bad-format{display:inline-block}.application-show-group .is-bad-format .default{display:none}.application-show-group .is-default .default{display:block}.post-recovery-token .octospinner,.post-recovery-token .create-recovery-token-error{display:none}.post-recovery-token.loading .octospinner{display:block}.post-recovery-token.failed .create-recovery-token-error{display:block}.security-history .security-history-timestamp{float:right;color:#586069}table.security-history-detail{width:100%;font-size:12px}table.security-history-detail td{max-width:200px;word-wrap:break-word}.settings-email .email-actions .settings-remove-email{float:right;padding-right:7px;padding-left:7px;margin-left:5px;line-height:24px;color:#cb2431;cursor:pointer}.settings-email .email-actions .settings-remove-email.settings-disabled-remove-email{display:block;color:#6a737d}.settings-email .octicon-info{margin-left:5px}.settings-email .css-truncate-target{max-width:300px}.email-preference-exceptions{font-size:12px}.email-preference-exceptions h5{margin:15px 0 5px;color:#666}.email-preference-exceptions .exception-list{list-style:none}.email-preference-exceptions .exception{max-width:400px;padding:5px;padding-left:0;border-top:1px solid #eee}.email-preference-exceptions .exception:last-child{border-bottom:1px solid #eee}.email-preference-exceptions.opt-in-list{display:none}.transactional-only .email-preference-exceptions.opt-in-list{display:block}.transactional-only .email-preference-exceptions.opt-out-list{display:none}.two-factor-intro{width:675px;margin:40px auto 0}.two-factor-intro .two-factor-graphic{margin:20px 0}.two-factor-intro .two-factor-explain{padding:0;margin:0 0 40px;font-size:13px;list-style:none}.two-factor-intro .two-factor-explain li{float:left;padding:0;margin:0}.two-factor-intro .two-factor-explain .step-one{width:185px;margin-right:36px}.two-factor-intro .two-factor-explain .step-two{width:230px;margin-right:42px}.two-factor-intro .two-factor-explain .step-three{width:180px}.two-factor-graphic{width:675px;height:135px;background-image:url(\"/images/modules/settings/2fa_guide.png\");background-repeat:no-repeat}.two-factor-recovery-codes{margin:30px 0;font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace;font-size:21px}.two-factor-recovery-code-mark{width:24px;height:24px;font-size:24px;line-height:16px;color:#bbb}.two-factor-recovery-code{display:inline-block;width:48%;line-height:1.6;text-align:center}.two-factor-recovery-code::before{position:relative;top:-3px;margin-right:10px;font-size:10px;color:#d8d8d8;content:\"\\25CF\"}.recovery-codes-saving-options{margin-left:35px}.recovery-codes-saving-options .recovery-code-save-button{width:115px;margin-right:15px;text-align:center}.recovery-codes-warning{margin:0 -15px}.recovery-codes-warning .recovery-codes-warning-octicon{height:40px;margin-right:15px}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.two-factor-graphic{background-image:url(\"/images/modules/settings/2fa_guide@2x.png\");background-size:675px 135px}}.btn-two-factor-state{min-width:70px}.sms-or-app{width:100%;padding:40px 0 0;margin:0;border-top:1px solid #ddd}.sms-or-app::before{display:table;content:\"\"}.sms-or-app::after{display:table;clear:both;content:\"\"}.sms-or-app li{float:left;width:325px;padding:0;list-style:none}.sms-or-app li:first-child{margin-right:25px}.sms-or-app li .btn{display:block;width:100%;height:100%;padding-top:12px;padding-bottom:12px;margin:10px 0;font-size:15px;text-align:center}.sms-or-app small{font-size:80%}.app-only{padding:20px 0 0}.app-only li{float:none;width:auto}.app-only li .btn{display:inline-block;width:auto;padding-right:20px;padding-left:20px}.two-factor-wrapper{width:500px;margin:40px auto}.two-factor-lead{font-size:16px}.two-factor-qr-code{text-align:center}.two-factor-steps{padding:15px 15px 0;margin:30px 0;border:1px solid #eee;border-radius:3px}.two-factor-steps .error-icon{position:relative;top:2px;left:5px;color:#cb2431}.two-factor-steps .sent-message{position:relative;top:2px;left:5px;color:#28a745}.container.two-factor-toggle{width:700px}.sms-country-code-field{padding-right:10px}.two-factor-toggle{margin-top:40px}.two-factor-toggle .two-factor-status{padding:20px 0;margin:0 0 20px;color:#586069;border-bottom:1px solid #eaeaea}.two-factor-toggle .two-factor-status p{margin:0}.two-factor-toggle .two-factor-status .btn{position:relative;top:-3px;float:right}.two-factor-toggle .two-factor-on{padding:3px 5px;margin-right:5px;color:#fff;text-shadow:0 1px 1px rgba(0,0,0,0.1);background-color:#28a745;border-radius:2px}.two-factor-settings-group{position:relative;padding:0 0 20px 220px;margin:0 0 20px;border-bottom:1px solid #ddd}.two-factor-settings-group>h3{position:absolute;left:0;width:200px;font-size:14px}.two-factor-settings-group>h3 .octicon{position:absolute;left:-24px;color:#cb2431}.two-factor-settings-group li{line-height:1.5;list-style:none}.u2f-registrations{padding-left:24px}.u2f-registration{position:relative;padding-bottom:8px;margin-bottom:8px;border-bottom:1px solid #f8f8f8}.u2f-registration.is-sending .u2f-registration-delete{display:none}.u2f-registration.is-sending .spinner{position:relative;top:3px}.u2f-registration-nickname{font-weight:600}.u2f-registration-icon{position:absolute;left:-24px;color:rgba(47,38,6,0.5)}.new-u2f-registration{position:relative}.new-u2f-registration .add-u2f-registration-form{display:none;margin-bottom:10px}.new-u2f-registration.is-active .add-u2f-registration-link{display:none}.new-u2f-registration.is-active .add-u2f-registration-form{display:block}.new-u2f-registration .u2f-request-interaction,.new-u2f-registration .u2f-request-error{display:none}.new-u2f-registration.is-sending .u2f-request-interaction{display:block}.new-u2f-registration.is-showing-error .u2f-request-error{display:block}.new-u2f-registration .u2f-error-icon{font-size:64px}.u2f-box .u2f-sorry{display:block}.u2f-box .new-u2f-registration{display:none}.u2f-box.available .u2f-sorry{display:none}.u2f-box.available .new-u2f-registration{display:block}.github-access-banner{position:relative;padding:10px 20px 10px 70px;margin:0 0 20px;font-size:14px;border:1px solid #ddd;border-radius:3px}.github-access-banner .octicon{position:absolute;top:20px;left:20px;color:#cb2431}.error-icon,.spinner,.sent-message,.sms-error-message{display:none}.sms-error-message{margin-top:15px}.is-sending .spinner{display:inline-block}.is-sent .sent-message{display:inline-block}.is-not-sent .sms-error-message{display:block}.is-not-sent .error-icon{display:inline-block}.qr-code-table{display:inline-block;padding:20px;margin:30px auto;border:1px solid #eee;border-radius:3px;box-shadow:0 2px 2px 0 rgba(0,0,0,0.04)}.qr-code-table tr{background:transparent;border:0}.qr-code-table th,.qr-code-table td{padding:0;border:0}.qr-code-table td{width:3px;height:3px}.qr-code-table .black{background:#000}.qr-code-table .white{background:#fff}.confirmation-phrase{font-style:italic;font-weight:400}.do-not-copy-me{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.session-device{position:relative;padding:15px;line-height:18px;color:#586069}.session-device .btn{float:right;margin-top:4px}.session-device .session-state-indicator{float:left;width:8px;height:8px;margin-top:10px;border-radius:5px}.session-device .session-state-indicator.recent{background-color:#28a745;box-shadow:0 0 10px rgba(108,198,68,0.5)}.session-device .session-state-indicator.not-recent{background-image:linear-gradient(#aaa, #ccc);box-shadow:0 1px 0 #fff}.session-device .session-icon{float:left;width:32px;margin-top:1px;margin-left:15px;color:#bbb;text-align:center}.session-device .sessions-more-info{margin-top:10px}.session-device.session-current{margin-top:0;background-color:#fff}.session-device.session-current .sessions-more-info{color:#586069}.session-device.session-current .sessions-more-info::after{border-top-color:#fff}.session-device.session-current .octicon{color:#586069}.session-details{margin-left:70px}.session-details:hover .octicon{color:#0366d6;cursor:pointer}.session-details.open .sessions-more-info{display:block}.collaborators .collab-list{border-bottom-width:0}.collaborators .collab-list-item:first-child .collab-list-cell{border-top-width:0}.collaborators .collab-list-cell{padding-top:15px;padding-bottom:15px;vertical-align:middle}.collaborators .collab-meta{width:140px}.collaborators .collab-remove{padding-right:20px;text-align:right}.collaborators .collab-remove .remove-link{color:#586069}.collaborators .collab-remove .remove-link:hover{color:#cb2431}.collaborators .collab-team-link{width:300px}.collaborators .collab-team-link:hover{text-decoration:none}.collaborators .collab-team-link .avatar{float:left;margin-top:1px;margin-right:10px}.collaborators .collab-team-link.disabled{pointer-events:none}.collaborators .collab-info{height:100%;color:#666}.collaborators .collab-info .description{padding-right:50px;margin-top:3px;margin-bottom:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.collaborators .collab-info .collab-name{display:block;font-size:14px}.collaborators .collab-info .collab-message{position:relative;top:25%;display:block}.collaborators .copy-invite-modal{width:352px}.collaborators .cancel-invite-cell{width:113px;padding-left:0}.access-sub-heading{float:right;font-weight:400;line-height:1.4;color:#586069}.access-form-wrapper{padding:10px;background-color:#fcfcfc;border-top:1px solid #ddd;border-radius:0 0 3px 3px}.access-flash{padding:8px;margin-right:10px;margin-bottom:10px;margin-left:10px}.repo-access-group .blankslate{display:none}.repo-access-group.is-empty .blankslate{display:block}.repo-access-group.no-form .add-team-form{display:none}.repo-access-group .select-menu-item.has-access{display:none}.oauth-pending-deletion-list-item{background-color:#fafbfc;box-shadow:inset 0 0 8px #eee}.oauth-pending-deletion-list-item:hover{background-color:#fafbfc}.oauth-pending-deletion-list-item .oauth-pending-deletion{display:inline-block;width:19%;line-height:30px}.oauth-pending-deletion-list-item .active{display:none}.oauth-pending-deletion{display:none;width:100%}.boxed-group-list .access-level{color:#586069}.boxed-group-list .access-level.css-truncate-target{max-width:500px}.settings-next{font-size:14px;line-height:1.5}.settings-next label{font-size:14px}.settings-next .note{font-size:13px}.settings-next .form-checkbox input[type=\"radio\"],.settings-next .form-checkbox input[type=\"checkbox\"]{margin-top:4px}dl.form-group>dd textarea.compact{height:100px;min-height:0}.form-hr{margin-top:15px;margin-bottom:15px;border-bottom-color:#e5e5e5}.listgroup{list-style:none;border:1px solid #e5e5e5;border-radius:3px}.listgroup-item{min-height:inherit;padding:10px;font-size:13px;line-height:26px;color:#586069}.listgroup-item::before{display:table;content:\"\"}.listgroup-item::after{display:table;clear:both;content:\"\"}.listgroup-item+.listgroup-item{border-top:1px solid #e5e5e5}.listgroup-item.listgroup-item-preview{line-height:inherit}.listgroup-item.listgroup-item-preview .BtnGroup{margin-top:5px}.listgroup-item .css-truncate-target{max-width:615px}.listgroup-item-title{display:block;font-weight:600}.listgroup-item-body{display:block}.listgroup-header{border-top:0;border-bottom:1px solid #e5e5e5}.listgroup-overflow{max-height:240px;overflow-y:auto;background-color:#f5f5f5}.listgroup-sm .listgroup-item{padding-top:5px;padding-bottom:5px}.protected-branches{margin-top:15px;margin-bottom:15px}.protected-branch-options,.repo-data-options{margin-left:20px;opacity:0.5}.protected-branch-options.active,.repo-data-options.active{opacity:1}.protected-branch-reviews.on .require-code-owner-review,.protected-branch-reviews.on .reviews-dismiss-on-push,.protected-branch-reviews.on .reviews-include-dismiss,.protected-branch-reviews.on .require-approving-reviews{display:block}.protected-branch-reviews .require-code-owner-review,.protected-branch-reviews .reviews-dismiss-on-push,.protected-branch-reviews .reviews-include-dismiss,.protected-branch-reviews .require-approving-reviews{display:none}.protected-branch-orgs-and-repo-admins{padding:10px;background-color:#fafbfc}.authorized-pushers{width:440px}.authorized-pushers .add-protected-branch-user-or-team{display:block}.authorized-pushers .user-or-team-limit-reached{display:none;padding:10px;font-size:13px}.authorized-pushers.at-limit .add-protected-branch-user-or-team{display:none}.authorized-pushers.at-limit .user-or-team-limit-reached{display:block;width:440px}.protected-branch-authorized-pushers-table{margin-top:10px}.protected-branch-authorized-pushers-table .boxed-group-inner{max-height:350px;overflow-y:auto}.protected-branch-authorized-pushers-table .table-list{border-bottom:0}.protected-branch-authorized-pushers-table .table-list-cell{vertical-align:middle}.protected-branch-authorized-pushers-table .table-list-cell:first-child{width:100%}.protected-branch-authorized-pushers-table .avatar,.protected-branch-authorized-pushers-table .octicon-jersey,.protected-branch-authorized-pushers-table .octicon-organization{width:36px;margin-right:10px;text-align:center}.protected-branch-pusher{color:#333}.user-already-added::after{display:inline-block;padding:1px 5px;margin-left:6px;font-size:11px;line-height:1.4;color:#fff;content:\"Already added\";background-color:#d15704;border-radius:3px}.protected-branch-admin-permission{float:left;padding:3px;margin:-2px 0 -2px -4px;line-height:normal;border:1px solid transparent;border-radius:3px}.protected-branch-admin-permission.active{animation:toggle-color 1s ease-in-out 0s}@keyframes toggle-color{0%{background-color:transparent}50%{color:#4c4a42;background-color:#fff9ea;border-color:#dfd8c2}100%{background-color:transparent}}.automated-check-options{margin-top:10px}.automated-check-options .listgroup-item label{font-size:inherit}.automated-check-options .listgroup-item input[type=\"checkbox\"]{float:none;margin-top:-2px;margin-right:5px;margin-left:0}.automated-check-options .label{margin-top:4px}.repository-merge-features .form-group.errored label{color:inherit}.repository-merge-features .form-group.errored .error{position:inherit;padding:0;margin-top:0;margin-left:6px;font-size:11px;color:#cb2431;background:transparent;border:0}.repository-merge-features .form-group.errored .error::before,.repository-merge-features .form-group.errored .error::after{display:none}.logged-out.signup .header-actions .primary,.logged-out.signup .footer,.logged-out.signup .header-search{display:none}.setup-wrapper{width:750px;padding-top:30px;margin:0 auto}.setup-wrapper::before{display:table;content:\"\"}.setup-wrapper::after{display:table;clear:both;content:\"\"}.setup-header{padding-bottom:20px;margin:0 auto 30px;overflow:hidden;text-align:left;border-bottom:1px solid #ddd}.setup-header h1{margin-top:0;margin-bottom:0;font-size:45px;font-weight:400;line-height:1.1;letter-spacing:-1px}.setup-header h1 .octicon{color:#bbb}.setup-header .lead{margin-top:2px;margin-bottom:0;font-size:21px}.setup-header .lead a{color:#586069}.setup-header .lead a:hover{color:#0366d6;text-decoration:none}.setup-org{padding-bottom:0;border-bottom:0}.setup-main{float:left;width:450px}.setup-main.without-secondary{margin-left:150px}.setup-secondary{float:right;width:250px}.setup-secondary .info{padding-top:0;padding-bottom:0;margin-top:-10px;font-size:12px;line-height:18px;color:#586069;text-align:center}.setup-info-module{margin-bottom:30px;background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.075)}.setup-info-module h2{padding:15px;margin-bottom:15px;overflow:hidden;font-size:16px;border-bottom:1px solid #ddd}.setup-info-module h2 .price{float:right;font-weight:600;color:#586069}.setup-info-module h3{padding:0 15px;margin:0 0 -7px;font-size:14px}.setup-info-module p{padding:0 15px;margin:15px 0}.setup-info-module .setup-info-note{padding:1px 0;margin:0;background:#f9f9f9;border-top:1px solid #e0e0e0}.features-list{padding:0 15px 15px;margin:0;font-size:14px;list-style:none}.features-list li{margin-top:10px}.features-list li:first-child{margin-top:0}.features-list .list-divider{margin:15px -15px;border-top:1px solid #eee}.features-list .octicon-check{margin-right:5px;color:#60b044}.features-list .octicon-question{font-size:12px;color:#555}.features-list .tooltipped::after{width:250px;white-space:normal}.features-list.features-list-org{padding-bottom:0}.setup-form-container .setup-form-title{font-size:16px}.setup-form-container .secure{float:right;margin-top:2px;font-size:11px;color:#60b044;text-transform:uppercase}.setup-form-container hr{margin-top:25px;margin-bottom:25px}.setup-form-container .form-actions{padding-top:0;padding-bottom:0;text-align:left}.team-member-container{margin-bottom:20px}.team-member-container .team-member-username{line-height:1.2}.setup-form{padding-bottom:15px}.setup-form .form-group dd .form-control{width:100%}.setup-form .form-group dd .form-control.short{width:250px}.setup-form dd{position:relative}.setup-form dd .octicon{position:absolute;top:8px;right:25px}.setup-form .octicon-alert{color:#cb2431}.setup-form .octicon-check{color:#28a745}.setup-form .tos-info,.setup-form .setup-organization-next{margin:15px 0;border-top:1px solid #eee;border-bottom:1px solid #eee}.setup-form .tos-info{padding:15px 0}.setup-form .setup-organization-next{padding-top:15px;padding-bottom:15px}.setup-form .setup-plans{border-collapse:separate;border:1px solid #d1d5da}.setup-form .setup-plans tr.selected{background-color:#f1f8ff}.setup-form .setup-plans .name{font-weight:600}.setup-form .setup-plans .choose-plan input[type=\"radio\"]{display:none}.setup-form .new-business-initial-admins td{padding:5px 10px;border:1px solid #f5f5f5}.setup-creditcard-form .cc-extras{margin-bottom:15px}.setup-creditcard-form .expiration-form select{width:80px}.setup-creditcard-form .expiration-form,.setup-creditcard-form .cvv-form,.setup-creditcard-form .country-form,.setup-creditcard-form .state-form{float:left;margin:0;word-wrap:normal}.setup-creditcard-form .country-form,.setup-creditcard-form .postal-code-form{margin-top:0;margin-bottom:15px}.setup-creditcard-form .form-group dd .input-cvv{width:80px}.setup-creditcard-form .form-group select.select-country{width:182px;margin-right:5px}.setup-creditcard-form .form-group select:invalid{color:#6a737d}.setup-creditcard-form .form-group select.select-state{width:113px}.setup-creditcard-form .form-group .card-select-number-field{width:100%}.setup-creditcard-form .form-group .input-vat{width:288px}.setup-creditcard-form .form-group .card-select-number-field-icons{top:1px;right:2px}.setup-creditcard-form .form-group .card-select-number-field-icons>.placeholder{top:8px;right:10px}.setup-creditcard-form .form-group .card-select-number-field-icons>.card{height:20px;margin-top:6px;margin-right:5px;margin-bottom:6px}.setup-creditcard-form .form-group .card-select-number-field-icons>.card.enabled{display:block}.setup-creditcard-form .form-group input.input-postal-code{width:180px}.setup-creditcard-form.is-vat-country .vat-field{display:block}.setup-creditcard-form.is-international .form-group select.select-country{width:300px}.setup-creditcard-form.is-international .state-form{display:none}.setup-creditcard-form.no-postcodes .postal-code-form{display:none}.setup-creditcard-form dd .octicon-credit-card{position:inherit}.setup-creditcard-form .enter-new-card{display:none}.setup-creditcard-form.has-credit-card .enter-new-card{display:inline-block}.setup-creditcard-form.has-credit-card .card-select-number-field-icons,.setup-creditcard-form.has-credit-card .card-select-number-field,.setup-creditcard-form.has-credit-card .cancel-enter-new-card{display:none}.setup-creditcard-form .vat-field{display:none}.setup-creditcard-form .vat-field.prefilled{display:block}.setup-creditcard-form .help-text{font-size:80%;font-weight:400;color:#586069}.org-creation-questions,.user-identification-questions{float:none;width:auto}.org-creation-questions .question,.user-identification-questions .question{margin-bottom:30px}.org-creation-questions .question-title,.user-identification-questions .question-title{padding-right:40px;margin-bottom:10px;font-size:14px;line-height:1.5}.org-creation-questions .question-title i,.user-identification-questions .question-title i{font-size:13px;font-style:normal;font-weight:400;color:#767676}.org-creation-questions .response-group label,.user-identification-questions .response-group label{font-weight:400}.org-creation-questions .form-checkbox,.user-identification-questions .form-checkbox{margin:8px 0}.org-creation-questions .other-field .form-control,.user-identification-questions .other-field .form-control{margin-top:10px}.org-creation-questions .other-field input+.form-control,.user-identification-questions .other-field input+.form-control{display:none}.org-creation-questions .other-field input:checked+.form-control,.user-identification-questions .other-field input:checked+.form-control{display:block}.org-creation-questions .alternate-action,.user-identification-questions .alternate-action{margin-left:10px;line-height:34px}.org-creation-questions .disclaimer,.user-identification-questions .disclaimer{margin:40px 0 0;text-align:center}.user-identification-questions{margin-top:40px}.user-identification-questions .form-checkbox{float:left;width:250px}.shelf{padding-top:20px;margin-bottom:20px;background-color:#fefefe;border-bottom:1px solid #eff1f3}.shelf .container{position:relative}.shelf-title{margin:0;font-size:30px;font-weight:400}.shelf-content{width:800px;margin:50px auto;text-align:center}.shelf-lead{margin-top:10px;margin-bottom:30px;font-size:18px;color:#586069}.shelf-dismiss{position:absolute;top:0;right:20px;font-size:12px;color:#959da5}.shelf-dismiss:hover{color:#0366d6;text-decoration:none}.shelf-dismiss .close-button{width:28px;height:28px;padding:3px 5px;color:rgba(27,31,35,0.7);border:1px solid rgba(27,31,35,0.15);border-radius:28px}.shelf-dismiss .close-button:hover{color:#24292e;border-color:rgba(27,31,35,0.3)}.shelf-cta{padding:10px 50px;font-size:16px}.intro-shelf{margin-top:0;color:rgba(27,31,35,0.85);background-image:linear-gradient(180deg, rgba(255,255,255,0) 60%, #fff),linear-gradient(70deg, #dbedff 32%, #ebfff0);border-bottom:#fff}.intro-shelf .shelf-lead{color:rgba(27,31,35,0.7)}.orgs-help-shelf{padding-top:20px;padding-bottom:20px;margin-top:-20px;margin-bottom:20px;border-bottom:1px solid #eff1f3}.orgs-help-shelf .orgs-help-title{font-size:30px;font-weight:400}.orgs-help-shelf-content{width:800px;margin:50px auto;text-align:center}.orgs-help-shelf-content .orgs-help-lead{padding-right:45px;padding-left:45px;font-size:18px}.orgs-help-shelf-content .orgs-help-divider{display:block;width:150px;margin:40px auto;content:\"\";border-top:1px solid #d1d5da}.orgs-help-lead{margin-top:10px;margin-bottom:30px;color:#586069}.orgs-help-items{margin-bottom:40px}.orgs-help-item-octicon{width:70px;height:70px;margin:0 auto 15px;text-align:center;background-color:#fff;border:solid 1px #e1e4e8;border-radius:50px}.orgs-help-item-octicon .octicon{margin-top:20px;color:#0366d6}.orgs-help-item-title{margin-bottom:10px;font-weight:400}.orgs-help-item-content{margin-top:0;font-size:14px;color:#586069}.orgs-help-dismiss{float:right;margin-top:5px;margin-right:10px;font-size:12px;color:#586069}.orgs-help-dismiss:hover{color:#0366d6;text-decoration:none}.orgs-help-dismiss .octicon{position:relative;top:1px}.orgs-help-title{margin-top:0;margin-bottom:0}.collection-page .column.main{margin-right:260px !important}.collection-page .column.sidebar{width:240px}.collection-search-results em{padding:0.1em;background-color:#faffa6}.draft-tag{padding:5px 10px;font-weight:600;color:#eee;background-color:#404040}.showcase-page-pattern{position:relative;z-index:-1;height:100px;margin-top:-21px;margin-bottom:-70px}.showcase-page-pattern::after{position:absolute;top:0;right:0;bottom:0;left:0;display:block;content:\"\";background-image:linear-gradient(180deg, rgba(255,255,255,0.85), #fff)}.showcase-page-repo-list{border-top:1px solid #eee}.repo-health .repo-health-loading{display:none;font-style:italic}.repo-health.is-loading .repo-health-loading{display:block}.repo-health.is-loading .repo-health-results{display:none}.sortable-button-item:first-of-type .sortable-button[data-direction=\"up\"],.sortable-button-item:last-of-type .sortable-button[data-direction=\"down\"]{display:none}.org-sso{width:340px;margin:0 auto}.org-sso .sso-title{font-size:24px;font-weight:300;letter-spacing:-0.5px}.org-sso .org-sso-panel{padding:20px;background-color:#fff;border:1px #e1e4e8 solid;border-radius:5px}.org-sso .sso-recovery-callout{padding:15px 10px;text-align:center;border:1px solid #d1d5da;border-radius:5px}.sso-modal{padding:16px}.sso-modal .org-sso{width:auto}.sso-modal .org-sso .org-sso-panel{border:0}.sso-modal .sso-prompt-success,.sso-modal .sso-prompt-error{display:none}.sso-modal.success .sso-prompt-default{display:none}.sso-modal.success .sso-prompt-success{display:block}.sso-modal.error .sso-prompt-default{display:none}.sso-modal.error .sso-prompt-error{display:block}.sso-modal.error .flash-error{margin-right:-35px;margin-left:-35px;border-right:0;border-left:0;border-radius:0}.tab-size[data-tab-size=\"1\"]{-moz-tab-size:1;tab-size:1}.tab-size[data-tab-size=\"2\"]{-moz-tab-size:2;tab-size:2}.tab-size[data-tab-size=\"3\"]{-moz-tab-size:3;tab-size:3}.tab-size[data-tab-size=\"4\"]{-moz-tab-size:4;tab-size:4}.tab-size[data-tab-size=\"5\"]{-moz-tab-size:5;tab-size:5}.tab-size[data-tab-size=\"6\"]{-moz-tab-size:6;tab-size:6}.tab-size[data-tab-size=\"7\"]{-moz-tab-size:7;tab-size:7}.tab-size[data-tab-size=\"8\"]{-moz-tab-size:8;tab-size:8}.tab-size[data-tab-size=\"9\"]{-moz-tab-size:9;tab-size:9}.tab-size[data-tab-size=\"10\"]{-moz-tab-size:10;tab-size:10}.tab-size[data-tab-size=\"11\"]{-moz-tab-size:11;tab-size:11}.tab-size[data-tab-size=\"12\"]{-moz-tab-size:12;tab-size:12}.tag-input-container{position:relative}.tag-input-container .suggester{position:absolute;z-index:100;width:100%;margin-top:-1px}.tag-input-container ul{list-style:none}.tag-input input{float:left;padding-left:2px;margin:0;background:none;border:0;box-shadow:none}.tag-input input:focus{box-shadow:none}.tag-input .tag-input-tag{float:left;margin-right:5px}.tag-input .tag-input-tag:hover{background-color:#eee}.tag-input-tag{position:relative;padding:5px 30px 5px 10px;background:#eee;border-radius:3px}.tag-input-tag:hover{background-color:#ddd}.tag-input-tag .remove{position:absolute;top:6px;right:6px;display:block;width:18px;height:18px;font-size:15px;line-height:16px;color:#fff;text-align:center;text-decoration:none;cursor:pointer;background:#c8c8c8;border-radius:18px}.tag-input-tag .remove:hover{background:#bd2c00}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item .handle{display:none}.task-list-item-checkbox{margin:0 0.2em 0.25em -1.6em;vertical-align:middle}.reorderable-task-lists .markdown-body .contains-task-list{padding:0}.reorderable-task-lists .markdown-body li:not(.task-list-item){margin-left:26px}.reorderable-task-lists .markdown-body ol:not(.contains-task-list) li,.reorderable-task-lists .markdown-body ul:not(.contains-task-list) li{margin-left:0}.reorderable-task-lists .markdown-body li p{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item{padding-right:15px;padding-left:42px;margin-right:-15px;margin-left:-15px;border:1px solid transparent}.reorderable-task-lists .markdown-body .task-list-item+.task-list-item{margin-top:0}.reorderable-task-lists .markdown-body .task-list-item .contains-task-list{padding-top:4px}.reorderable-task-lists .markdown-body .task-list-item .handle{display:block;float:left;width:20px;padding:2px 0 0 2px;margin-left:-43px;opacity:0}.reorderable-task-lists .markdown-body .task-list-item .drag-handle{fill:#333}.reorderable-task-lists .markdown-body .task-list-item.hovered{background:#fafafa;border-top-color:#ededed;border-bottom-color:#ededed}.reorderable-task-lists .markdown-body .task-list-item.hovered>.handle{opacity:1}.reorderable-task-lists .markdown-body .task-list-item.is-dragging{opacity:0}.reorderable-task-lists .markdown-body .task-list-item.is-ghost{border-right-color:#ededed;border-left-color:#ededed}.review-comment-contents .markdown-body .task-list-item{padding-left:42px;margin-right:-12px;margin-left:-12px;border-top-left-radius:3px;border-bottom-left-radius:3px}.review-comment-contents .markdown-body .task-list-item.hovered{border-left-color:#ededed}.task-run .icon-for-success,.task-run .icon-for-failure,.task-run .icon-for-pending,.task-run .icon-for-inactive{display:none}.task-run.success .icon-for-success{display:inline-block;color:#28a745}.task-run.failure .icon-for-failure{display:inline-block;color:#cb2431}.task-run.pending .icon-for-pending{display:inline-block;color:#6a737d}.task-run.inactive .icon-for-inactive{display:inline-block;color:#6a737d}.task-run .task-run-name{display:inline-block;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}.team-label-ldap{display:inline-block;padding:0 9px;line-height:25px;color:#586069;text-transform:uppercase;cursor:default;border:1px solid #eaeaea;border-radius:3px;box-shadow:none}.team-label-ldap.header-label-ldap{padding:3px 5px}.team-member-ellipsis{width:25px;height:25px;line-height:24px;color:#586069}.team-member-ellipsis:hover{color:#0366d6;background:#f6f8fa}.team-listing .table-list-cell{padding-top:10px;padding-bottom:10px;vertical-align:middle}.team-listing .table-list-cell-checkbox{width:30px;padding-right:0;padding-left:10px}.team-listing .nested-teams-checkbox{padding-left:3px}.team-listing .nested-teams-checkbox.show{padding-right:11px}.team-listing .nested-teams-checkbox.indent-1{padding-left:30px}.team-listing .nested-teams-checkbox.indent-2{padding-left:54px}.team-listing .nested-teams-checkbox.indent-3{padding-left:78px}.team-listing .nested-teams-checkbox.indent-4{padding-left:102px}.team-listing .nested-teams-checkbox.indent-5{padding-left:126px}.team-listing .nested-teams-checkbox.indent-6{padding-left:150px}.team-listing .nested-teams-checkbox.indent-7{padding-left:174px}.team-listing .nested-teams-checkbox.indent-8{padding-left:198px}.team-listing .nested-teams-checkbox.indent-9{padding-left:222px}.team-listing .nested-teams-checkbox.indent-10{padding-left:246px}.team-listing .nested-teams-checkbox.indent-11{padding-left:270px}.team-listing .nested-teams-checkbox.indent-12{padding-left:294px}.team-listing .nested-teams-checkbox.indent-13{padding-left:318px}.team-listing .nested-teams-checkbox.indent-14{padding-left:342px}.team-listing .nested-teams-checkbox.indent-15{padding-left:366px}.team-listing .team-info{width:280px}.team-listing .nested-team-info{width:650px}.team-listing .nested-team-name{max-width:268px}.team-listing .team-name{line-height:1.3;color:#0366d6}.team-listing .description{display:block}.team-listing .shortened-teams-avatars{margin-left:auto}.team-listing .shortened-teams-avatars.width-0{width:300px}.team-listing .shortened-teams-avatars.width-1{width:233px}.team-listing .shortened-teams-avatars.width-2{width:167px}.team-listing .shortened-teams-avatars.width-3{width:99px}.team-listing .team-meta{font-size:14px}.team-listing .team-members-count{width:124px;text-align:right}.team-listing .team-show-more-cell{display:block;width:980px}.team-listing .team-show-more{display:block;width:110px;height:30px;padding-top:6px;margin:auto;color:#0366d6;text-align:center;text-decoration:none;cursor:pointer}.team-listing .team-buttons{width:130px;text-align:right}.team-listing .octicon-chevron-up{display:none}.team-listing .octicon-wrapper{display:inline-block;width:10px}.team-listing .is-open.root-team{background-color:#fafbfc}.team-listing .is-open .expand-nested-team{font-weight:bold;color:#24292e}.team-listing .is-open .octicon-chevron-down{transform:rotate(180deg)}.team-listing .expand-nested-team{color:#6a737d;cursor:pointer}.team-listing .expand-nested-team:hover{color:#0366d6}.team-listing .team-menu{padding-right:15px}.traffic-graph{min-height:150px}.traffic-graph .activity{margin-top:0}.traffic-graph .activity .dots{margin-top:40px}.traffic-graph .path{fill:none;stroke-width:2}.traffic-graph path.total{stroke:#28a745}.traffic-graph path.unique{stroke:#005cc5}.traffic-graph .axis .tick:first-of-type line{stroke:#28a745;stroke-width:2px}.traffic-graph .y line{stroke:#28a745}.traffic-graph .y.unique line{stroke:#005cc5}.traffic-graph .overlay{fill-opacity:0}.uniques-graph .axis .tick:last-child line{stroke:#005cc5;stroke-width:2px}.svg-tip .date{color:#fff}.top-domains .dots{display:block;margin:167px auto 0}.top-domains-icon{display:inline-block;margin-right:5px;vertical-align:middle}table.capped-list{width:100%;line-height:100%}table.capped-list th{padding:8px;text-align:left;background:#f6f8fa;border-bottom:1px solid #dfe2e5}table.capped-list td{padding:8px;font-size:12px;border-bottom:1px solid #eaecef}table.capped-list th.middle,table.capped-list td.middle{text-align:center}table.capped-list .favicon{width:16px;height:16px;margin:0 5px;vertical-align:middle}table.capped-list .octicon{margin-right:10px;color:#444d56;vertical-align:-1px}table.capped-list tr:nth-child(even){background-color:#fafbfc}.capped-list-label{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.traffic-graph-stats{border-top:1px solid #dfe2e5}.traffic-graph-stats .summary-stats{width:100%}.traffic-graph-stats .summary-stats::before{display:table;content:\"\"}.traffic-graph-stats .summary-stats::after{display:table;clear:both;content:\"\"}.traffic-graph-stats .summary-stats li{display:block;float:left;width:50%;padding-bottom:10px}.totals circle{fill:#28a745;stroke:#fff;stroke-width:2}.uniques circle{fill:#005cc5;stroke:#fff;stroke-width:2}.top-lists .is-loading{margin:40px;text-align:center}ul.web-views li{width:140px}ul.clones li{width:170px}.tree-browser{width:100%;margin:0;border-right:0;border-bottom:1px solid #cacaca;border-left:0}.tree-browser td{padding:7px 3px;color:#484848;white-space:nowrap;vertical-align:middle;background:#f8f8f8;border-bottom:1px solid #eee}.tree-browser td.icon{width:17px;padding-right:2px;padding-left:10px}.tree-browser td:first-child{border-left:1px solid #cacaca}.tree-browser td:last-child{border-right:1px solid #cacaca}.tree-browser td a.message{color:#484848}.tree-browser td span.ref{color:#aaa}.tree-browser img{vertical-align:text-bottom}.tree-browser tbody tr:last-child td{border-bottom:0}.tree-browser .history{float:right;padding-right:5px}.tree-browser .octicon-chevron-right{color:transparent}.tree-browser tr[aria-selected=\"true\"] td,.tree-browser tr.navigation-focus td{background-color:#fff}.tree-browser tr[aria-selected=\"true\"] td .octicon-chevron-right,.tree-browser tr.navigation-focus td .octicon-chevron-right{color:#0366d6}.tree-browser .octicon-file-directory{color:rgba(3,102,214,0.75)}.tree-browser .octicon-file-submodule{color:#3cbf5e}.tree-browser .octicon-file{color:#586069}.tree-browser .content{max-width:220px}.tree-browser .message{max-width:420px}.tree-browser .css-truncate-target{max-width:100%}.tree-browser-result-template{display:none}.tree-browser-result .css-truncate-target{max-width:870px}.tree-browser-result mark{font-weight:600;color:#0366d6;background-color:transparent}.tree-finder-input,.tree-finder-input:focus{padding-left:0;margin-left:5px;font-size:inherit;line-height:inherit;border:0;outline:none;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.tree-finder .no-results{display:none}.tree-finder .no-results th{text-align:center}.tree-finder tr td.icon{cursor:pointer}.tree-finder .tree-browser{border-top:1px solid #cacaca}.filterable-empty+.no-results{display:block}.toolbar-commenting{float:right}.toolbar-commenting .dropdown.active .dropdown-menu-content{display:block}.toolbar-commenting .dropdown-menu-s{width:100px}.toolbar-commenting .dropdown-item{font-weight:600;line-height:1em;background:none;border:0}.toolbar-commenting .dropdown-item:hover{color:#0366d6}.toolbar-commenting .dropdown-item:focus{color:#0366d6;outline:none}.toolbar-item{display:block;float:left;padding:4px 5px;color:#586069;background:none;border:0}.toolbar-item.dropdown,.toolbar-item.select-menu{padding:0}.toolbar-item .select-menu-modal{margin-top:2px}.toolbar-item .select-menu-item{padding-left:8px}.toolbar-item .menu-target{display:block;padding:4px 5px;color:#586069;background:none;border:0}.toolbar-item .menu-target:hover,.toolbar-item:hover{color:#0366d6}.toolbar-item .menu-target:focus,.toolbar-item:focus{color:#0366d6;outline:none}.toolbar-item .dropdown-caret{margin-left:-3px}.toolbar-item:disabled{color:#ddd}.toolbar-item .octicon-link,.toolbar-item .octicon-tasklist{margin-left:-3px}.toolbar-item .octicon-mention{margin-left:-4px}.toolbar-item .octicon-bold{margin-left:-2px}.toolbar-group{display:inline-block;margin-left:20px}.toolbar-group:first-child{margin-left:0}.typeahead-result{position:relative;display:block;min-width:100%;padding:10px;margin-top:0;color:#333;cursor:pointer}.typeahead-result::before{display:table;content:\"\"}.typeahead-result::after{display:table;clear:both;content:\"\"}.typeahead-result:first-child{border-top:0}.typeahead-result:focus,.typeahead-result:hover,.typeahead-result[aria-selected=\"true\"],.typeahead-result.navigation-focus{text-decoration:none}.typeahead-result[aria-selected=\"true\"],.typeahead-result:hover,.typeahead-result.navigation-focus{color:#fff;background-color:#0366d6}.typeahead-result[aria-selected=\"true\"] .octicon-plus,.typeahead-result:hover .octicon-plus,.typeahead-result.navigation-focus .octicon-plus{color:#fff}.typeahead-result.disabled{pointer-events:none;opacity:0.5}.member-suggestion{padding-left:44px}.member-suggestion .avatar{float:left;margin-right:10px;margin-left:-34px}.member-suggestion .member-suggestion-info{width:90%;margin-top:2px;margin-bottom:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.member-suggestion .member-name{font-size:12px;color:#586069}.member-suggestion .member-email{margin-top:0;margin-bottom:0}.member-suggestion .octicon-plus,.member-suggestion .octicon-check{position:absolute;top:50%;right:15px;margin-top:-8px;color:#ddd}.member-suggestion .already-member-note,.member-suggestion .non-member-note,.member-suggestion .non-member-action{margin-top:0;margin-bottom:0;color:#586069}.member-suggestion .non-member-action{display:none}.member-suggestion[aria-selected=\"true\"] .member-name,.member-suggestion[aria-selected=\"true\"] .non-member-note,.member-suggestion[aria-selected=\"true\"] .already-member-note,.member-suggestion[aria-selected=\"true\"] .non-member-action,.member-suggestion[aria-selected=\"true\"] .member-email,.member-suggestion:hover .member-name,.member-suggestion:hover .non-member-note,.member-suggestion:hover .already-member-note,.member-suggestion:hover .non-member-action,.member-suggestion:hover .member-email,.member-suggestion.navigation-focus .member-name,.member-suggestion.navigation-focus .non-member-note,.member-suggestion.navigation-focus .already-member-note,.member-suggestion.navigation-focus .non-member-action,.member-suggestion.navigation-focus .member-email{color:#fff}.member-suggestion[aria-selected=\"true\"] .non-member-note,.member-suggestion:hover .non-member-note,.member-suggestion.navigation-focus .non-member-note{display:none}.member-suggestion[aria-selected=\"true\"] .non-member-action,.member-suggestion:hover .non-member-action,.member-suggestion.navigation-focus .non-member-action{display:block}.member-suggestion[aria-selected=\"true\"] .octicon,.member-suggestion:hover .octicon,.member-suggestion.navigation-focus .octicon{color:#fff}.member-suggestion.not-a-member .member-info,.member-suggestion.disabled .member-info{margin-top:-2px}.non-member-result{padding-left:31px}.team-suggestion{padding-left:32px}.team-suggestion .octicon{float:left;margin-top:2px;margin-left:-22px}.team-suggestion .team-suggestion-info{margin:2px 0 0}.team-suggestion .team-suggestion-info .css-truncate-target{max-width:none}.team-suggestion .team-size,.team-suggestion .team-description{font-size:12px;color:#586069}.team-suggestion[aria-selected=\"true\"] .team-size,.team-suggestion[aria-selected=\"true\"] .team-description,.team-suggestion.navigation-focus .team-size,.team-suggestion.navigation-focus .team-description{color:#fff}.email-suggestion{padding-left:32px}.email-suggestion .octicon-mail{margin-left:-20px;color:#959da5}.email-suggestion .member-suggestion-info{margin-top:1px}.repo-access-add-team .team-name{font-size:13px}.repo-access-add-team .team-description{display:block}.repo-access-add-team .team-size,.repo-access-add-team .team-description{font-size:12px;color:#586069}.repo-access-add-team[aria-selected=\"true\"] .team-size,.repo-access-add-team[aria-selected=\"true\"] .team-description,.repo-access-add-team.navigation-focus .team-size,.repo-access-add-team.navigation-focus .team-description{color:#fff}#user-content-toc{overflow:visible}#user-content-toc tr{border-top:0}#user-content-toc td{padding:0 20px;background-color:#f7f7f7;border:0;border-radius:3px}#user-content-toc ul{padding-left:0;font-weight:600;list-style:none}#user-content-toc ul li{padding-left:0.2em}#user-content-toc ul ul{font-weight:400}#user-content-toc ul ul li::before{float:left;margin-top:-0.2em;margin-right:0.2em;font-size:1.2em;line-height:1;color:#aaa;content:\"\\231e\"}#user-content-toc ul ul ul{padding-left:0.9em}#user-content-toctitle h2{margin-top:1em;margin-bottom:0.5em;font-size:1.25em;border-bottom:0}.user-list em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,255,140,0.5);border-radius:3px}.user-list .avatar{position:absolute;top:0;left:0}.user-list-info{min-height:48px;padding:0;font-size:18px;font-weight:400;line-height:20px}.user-list-meta{overflow:hidden}.user-list-item+.user-list-item{border-top:1px solid #e1e4e8}.follow-list{list-style-type:none}.follow-list .follow-list-item{width:305px;height:100px;padding-bottom:20px;margin-right:20px;margin-bottom:20px}.follow-list .follower-list-align-top{vertical-align:top}.follow-list .flagged-banner{width:75px;padding:3px 0;font-size:10px;font-weight:600;color:#fff;text-transform:uppercase;background-color:#cb2431;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.follow-list .follow-list-name{margin-bottom:1px;font-weight:400}.follow-list .follow-list-name a{color:inherit}.follow-list .follow-list-info{margin-bottom:0.6em;font-size:12px;color:#586069}.follow-list .css-truncate.css-truncate-target{max-width:190px}.wiki-list em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,255,140,0.5);border-radius:3px}.wiki-list .avatar{float:left}.wiki-list .title{min-height:24px;margin:-3px 0 10px 38px;font-weight:600;line-height:1.2}.wiki-list .title .updated-at{font-weight:400}.wiki-list .repo-specific .title,.wiki-list .repo-specific .full-path{margin-left:0}.wiki-list .description{margin:0 0 10px;overflow:hidden;line-height:20px}.wiki-list .wiki-list-item+.wiki-list-item{border-top:1px #e1e4e8 solid}@media (min-width: 768px){.wiki-rightbar{width:230px !important}}.wiki-rightbar .markdown-body .anchor{display:none}.wiki-rightbar .markdown-body h1{font-size:1.6em}.wiki-rightbar .markdown-body h2{font-size:1.4em}.wiki-rightbar p:last-child,.wiki-rightbar ul:last-child,.wiki-rightbar ol:last-child{margin-bottom:0}.wiki-footer .markdown-body,.wiki-rightbar .markdown-body{font-size:13px}.wiki-footer .markdown-body.wiki-writable>:nth-child(2),.wiki-rightbar .markdown-body.wiki-writable>:nth-child(2){margin-top:0 !important}.wiki-footer .markdown-body img{background:none}.wiki-pages-box .wiki-more-pages{display:none}.wiki-pages-box.wiki-show-more .wiki-more-pages,.wiki-pages-box .filterable-active .wiki-more-pages{display:block}.wiki-pages-box.wiki-show-more .wiki-more-pages-link,.wiki-pages-box .filterable-active .wiki-more-pages-link{display:none}\n/*# sourceMappingURL=github-0e12adcc19871c4c6cd3ee56bdcaad15.css.map */\n"
  },
  {
    "path": "test/resources/github.html",
    "content": "<!DOCTYPE html>\n<!-- saved from url=(0019)https://github.com/ -->\n<html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    \n  <link rel=\"dns-prefetch\" href=\"https://assets-cdn.github.com/\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars0.githubusercontent.com/\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars1.githubusercontent.com/\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars2.githubusercontent.com/\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars3.githubusercontent.com/\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com/\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-Z0JAar9+DkI1NjGVdZr3GivARUgJtA0o2eHlTv7Ou2gshR5awWVf8QGsq11Ns9ZxQLEs+G5/SuARmvpOLMzulw==\" rel=\"stylesheet\" href=\"./GitHub_files/frameworks-95aff0b550d3fe338b645a4deebdcb1b.css\">\n  <link crossorigin=\"anonymous\" media=\"all\" integrity=\"sha512-MfR1jVOd2lhEj2Lu+00k0KV9KkjZ4Y299CH2RrtFfKdMIU5k92o5huQ0PESt6tNMZ4AWa1JJ+aI018EEnY3lZg==\" rel=\"stylesheet\" href=\"./GitHub_files/github-de92aa7f3d308cf0b1abfcf91bcb5c36.css\">\n  \n  \n  \n  \n\n  <meta name=\"viewport\" content=\"width=device-width\">\n  \n  <title>GitHub</title>\n    <meta name=\"description\" content=\"GitHub is where people build software. More than 28 million people use GitHub to discover, fork, and contribute to over 85 million projects.\">\n    <link rel=\"search\" type=\"application/opensearchdescription+xml\" href=\"https://github.com/opensearch.xml\" title=\"GitHub\">\n  <link rel=\"fluid-icon\" href=\"https://github.com/fluidicon.png\" title=\"GitHub\">\n  <meta property=\"fb:app_id\" content=\"1401488693436528\">\n\n    <meta property=\"og:url\" content=\"https://github.com\">\n    <meta property=\"og:site_name\" content=\"GitHub\">\n    <meta property=\"og:title\" content=\"Build software better, together\">\n    <meta property=\"og:description\" content=\"GitHub is where people build software. More than 28 million people use GitHub to discover, fork, and contribute to over 85 million projects.\">\n    <meta property=\"og:image\" content=\"https://assets-cdn.github.com/images/modules/open_graph/github-logo.png\">\n    <meta property=\"og:image:type\" content=\"image/png\">\n    <meta property=\"og:image:width\" content=\"1200\">\n    <meta property=\"og:image:height\" content=\"1200\">\n    <meta property=\"og:image\" content=\"https://assets-cdn.github.com/images/modules/open_graph/github-mark.png\">\n    <meta property=\"og:image:type\" content=\"image/png\">\n    <meta property=\"og:image:width\" content=\"1200\">\n    <meta property=\"og:image:height\" content=\"620\">\n    <meta property=\"og:image\" content=\"https://assets-cdn.github.com/images/modules/open_graph/github-octocat.png\">\n    <meta property=\"og:image:type\" content=\"image/png\">\n    <meta property=\"og:image:width\" content=\"1200\">\n    <meta property=\"og:image:height\" content=\"620\">\n\n\n  <link rel=\"assets\" href=\"https://assets-cdn.github.com/\">\n  <link rel=\"web-socket\" href=\"wss://live.github.com/_sockets/VjI6MjUzNDQxMzY0OmY1ZDMwZTVmMTQ0Yjk1MjM1ZTk1ZjZhZjUyMGE1NTBhNjYwYjJkYmFjNTczYTEwZjFjZmQ3Zjc3YjM1NDEwZDQ=--0a87195d59aeb722e0e1ef9f033a6841f34a5d92\">\n  <meta name=\"pjax-timeout\" content=\"1000\">\n  <link rel=\"sudo-modal\" href=\"https://github.com/sessions/sudo_modal\">\n  <meta name=\"request-id\" content=\"D5BE:57D5:2E01434:4771EAA:5B85DF5D\" data-pjax-transient=\"\">\n\n\n  \n\n  <meta name=\"selected-link\" value=\"/\" data-pjax-transient=\"\">\n\n    <meta name=\"google-site-verification\" content=\"KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r1XQysX3xurLU\">\n  <meta name=\"google-site-verification\" content=\"ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVihD0exw2fsA\">\n  <meta name=\"google-site-verification\" content=\"GXs5KoUUkNCoaAZn7wPN-t01Pywp9M3sEjnt_3_ZWPc\">\n    <meta name=\"google-analytics\" content=\"UA-3769691-2\">\n\n<meta name=\"octolytics-host\" content=\"collector.githubapp.com\"><meta name=\"octolytics-app-id\" content=\"github\"><meta name=\"octolytics-event-url\" content=\"https://collector.githubapp.com/github-external/browser_event\"><meta name=\"octolytics-dimension-request_id\" content=\"D5BE:57D5:2E01434:4771EAA:5B85DF5D\"><meta name=\"octolytics-dimension-region_edge\" content=\"sea\"><meta name=\"octolytics-dimension-region_render\" content=\"iad\"><meta name=\"octolytics-actor-id\" content=\"1958953\"><meta name=\"octolytics-actor-login\" content=\"bitwiseman\"><meta name=\"octolytics-actor-hash\" content=\"7a47252dc128c34ce8d16fef570c0026023a48b7575f403656632657110f52dd\">\n<meta name=\"analytics-location\" content=\"/dashboard\" data-pjax-transient=\"true\">\n\n\n\n  <meta class=\"js-ga-set\" name=\"userId\" content=\"eec08936b8e380bb11791f649a203bfc\" %=\"\">\n\n<meta class=\"js-ga-set\" name=\"dimension1\" content=\"Logged In\">\n\n\n  \n\n      <meta name=\"hostname\" content=\"github.com\">\n    <meta name=\"user-login\" content=\"bitwiseman\">\n\n      <meta name=\"expected-hostname\" content=\"github.com\">\n    <meta name=\"js-proxy-site-detection-payload\" content=\"ODVlYWE2MTIzNWVjNTUyYTlmZDg2ZjQ1MjNhMGIzYjExMTM4Yzg3N2MzMTI5ZjQ4MThkYjMwZWI4NjBjN2EwN3x7InJlbW90ZV9hZGRyZXNzIjoiMjE2LjI0My40Ny4xNzciLCJyZXF1ZXN0X2lkIjoiRDVCRTo1N0Q1OjJFMDE0MzQ6NDc3MUVBQTo1Qjg1REY1RCIsInRpbWVzdGFtcCI6MTUzNTUwMDEyOCwiaG9zdCI6ImdpdGh1Yi5jb20ifQ==\">\n\n    <meta name=\"enabled-features\" content=\"DASHBOARD_V2_LAYOUT,DASHBOARD_V2_LAYOUT_OPT_IN,EXPLORE_DISCOVER_REPOSITORIES,UNIVERSE_BANNER,FREE_TRIALS,MARKETPLACE_INSIGHTS,MARKETPLACE_DOCKERFILE_CI_CTA,MARKETPLACE_PLAN_RESTRICTION_EDITOR,MARKETPLACE_SEARCH,MARKETPLACE_INSIGHTS_CONVERSION_PERCENTAGES,MARKETPLACE_RETARGETING\">\n\n  <meta name=\"html-safe-nonce\" content=\"6c8ae92cf53dcbb32a6a26f59e68a6f94cbbb0bc\">\n\n  <meta http-equiv=\"x-pjax-version\" content=\"3634f06c115ad7b6fa8725bfdc2b2161\">\n  \n\n      <link rel=\"alternate\" type=\"application/atom+xml\" title=\"ATOM\" href=\"https://github.com/bitwiseman.private.atom?token=AB3kKeemw0tJDm5mdwKy8T917FA48tmtks65kx_wwA==\">\n\n\n\n\n  <meta name=\"browser-stats-url\" content=\"https://api.github.com/_private/browser/stats\">\n\n  <meta name=\"browser-errors-url\" content=\"https://api.github.com/_private/browser/errors\">\n\n  <link rel=\"mask-icon\" href=\"https://assets-cdn.github.com/pinned-octocat.svg\" color=\"#000000\">\n  <link rel=\"icon\" type=\"image/x-icon\" class=\"js-site-favicon\" href=\"https://assets-cdn.github.com/favicon.ico\">\n\n<meta name=\"theme-color\" content=\"#1e2327\">\n\n\n  <meta name=\"u2f-support\" content=\"true\">\n\n  <link rel=\"manifest\" href=\"https://github.com/manifest.json\" crossorigin=\"use-credentials\">\n\n  </head>\n\n  <body class=\"logged-in env-production emoji-size-boost page-responsive min-width-0 page-dashboard full-width\">\n    \n\n  <div class=\"position-relative js-header-wrapper \">\n    <a href=\"https://github.com/#start-of-content\" tabindex=\"1\" class=\"p-3 bg-blue text-white show-on-focus js-skip-to-content\">Skip to content</a>\n    <div id=\"js-pjax-loader-bar\" class=\"pjax-loader-bar\"><div class=\"progress\"></div></div>\n\n    \n    \n    \n\n\n\n        \n<header class=\"Header js-details-container Details f5\" role=\"banner\">\n  <div class=\"d-lg-flex p-responsive flex-justify-between px-3 \">\n    <div class=\"d-flex flex-justify-between flex-items-center\">\n      <div class=\"\">\n        <a class=\"header-logo-invertocat\" href=\"https://github.com/\" data-hotkey=\"g d\" aria-label=\"Homepage\" data-ga-click=\"Header, go to dashboard, icon:logo\">\n  <svg height=\"32\" class=\"octicon octicon-mark-github\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"32\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z\"></path></svg>\n</a>\n\n      </div>\n\n\n        <div class=\"d-flex d-lg-none flex-items-center\">\n          <div class=\"mr-4\">\n            \n    <a aria-label=\"You have unread notifications\" class=\"notification-indicator tooltipped tooltipped-s my-2 my-lg-0 js-socket-channel js-notification-indicator\" data-hotkey=\"g n\" data-ga-click=\"Header, go to notifications, icon:unread\" data-channel=\"notification-changed:1958953\" href=\"https://github.com/notifications\">\n        <span class=\"mail-status unread\"></span>\n        <svg class=\"octicon octicon-bell\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M13.99 11.991v1H0v-1l.73-.58c.769-.769.809-2.547 1.189-4.416.77-3.767 4.077-4.996 4.077-4.996 0-.55.45-1 .999-1 .55 0 1 .45 1 1 0 0 3.387 1.229 4.156 4.996.38 1.879.42 3.657 1.19 4.417l.659.58h-.01zM6.995 15.99c1.11 0 1.999-.89 1.999-1.999H4.996c0 1.11.89 1.999 1.999 1.999z\"></path></svg>\n</a>\n          </div>\n          <button class=\"btn-link mt-1 js-details-target\" type=\"button\" aria-label=\"Toggle navigation\" aria-expanded=\"false\">\n            <svg height=\"24\" class=\"octicon octicon-three-bars notification-indicator\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"18\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.41 9H.59C0 9 0 8.59 0 8c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zm0-4H.59C0 5 0 4.59 0 4c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zM.59 11H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1H.59C0 13 0 12.59 0 12c0-.59 0-1 .59-1z\"></path></svg>\n          </button>\n        </div>\n\n    </div>\n\n    <div class=\"HeaderMenu d-lg-flex flex-justify-between flex-auto\">\n      <div class=\"d-lg-flex\">\n            <div class=\"py-3 py-lg-0\">\n              <div class=\"header-search   js-site-search position-relative js-jump-to\" role=\"search combobox\" aria-owns=\"jump-to-results\" aria-label=\"Search or jump to\" aria-haspopup=\"listbox\" aria-expanded=\"true\">\n  <div class=\"position-relative\">\n    <!-- '\"` --><!-- </textarea></xmp> --><form class=\"js-site-search-form\" data-unscoped-search-url=\"/search\" action=\"https://github.com/search\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"✓\">\n      <label class=\"form-control header-search-wrapper header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center js-chromeless-input-container\">\n        <input type=\"text\" class=\"form-control header-search-input jump-to-field js-jump-to-field js-site-search-focus \" data-hotkey=\"s,/\" name=\"q\" value=\"\" placeholder=\"Search or jump to…\" data-unscoped-placeholder=\"Search or jump to…\" data-scoped-placeholder=\"Search or jump to…\" autocapitalize=\"off\" aria-autocomplete=\"list\" aria-controls=\"jump-to-results\" data-jump-to-suggestions-path=\"/_graphql/GetSuggestedNavigationDestinations#csrf-token=rV69kGNr0+MEbSq+1G73sOnVnFUopFNz6Zlv/3a9DOQF0kE1PE3BcwlnkS2mMkEEGHS37jYR5B4b3s61CEHqjA==\" spellcheck=\"false\" autocomplete=\"off\">\n          <input type=\"hidden\" class=\"js-site-search-type-field\" name=\"type\">\n            <img src=\"./GitHub_files/search-shortcut-hint.svg\" alt=\"\" class=\"mr-2 header-search-key-slash\">\n\n            <div class=\"Box position-absolute overflow-hidden d-none jump-to-suggestions js-jump-to-suggestions-container\">\n              <ul class=\"d-none js-jump-to-suggestions-template-container\">\n                <li class=\"d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item\">\n                  <a tabindex=\"-1\" class=\"no-underline d-flex flex-auto flex-items-center p-2 jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open\" href=\"https://github.com/\">\n                    <div class=\"jump-to-octicon js-jump-to-octicon mr-2 text-center d-none\"></div>\n                    <img class=\"avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar\" alt=\"\" aria-label=\"Team\" src=\"https://github.com/\" width=\"28\" height=\"28\">\n\n                    <div class=\"jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target\">\n                    </div>\n\n                    <div class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search\">\n                      <span class=\"js-jump-to-badge-search-text-default d-none\" aria-label=\"in all of GitHub\">\n                        Search\n                      </span>\n                      <span class=\"js-jump-to-badge-search-text-global d-none\" aria-label=\"in all of GitHub\">\n                        All GitHub\n                      </span>\n                      <span aria-hidden=\"true\" class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n                    </div>\n\n                    <div aria-hidden=\"true\" class=\"border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump\">\n                      Jump to\n                      <span class=\"d-inline-block ml-1 v-align-middle\">↵</span>\n                    </div>\n                  </a>\n                </li>\n                <svg height=\"16\" width=\"16\" class=\"octicon octicon-repo flex-shrink-0 js-jump-to-repo-octicon-template\" title=\"Repository\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg>\n                <svg height=\"16\" width=\"16\" class=\"octicon octicon-project flex-shrink-0 js-jump-to-project-octicon-template\" title=\"Project\" aria-label=\"Project\" viewBox=\"0 0 15 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z\"></path></svg>\n                <svg height=\"16\" width=\"16\" class=\"octicon octicon-search flex-shrink-0 js-jump-to-search-octicon-template\" title=\"Search\" aria-label=\"Search\" viewBox=\"0 0 16 16\" version=\"1.1\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M15.7 13.3l-3.81-3.83A5.93 5.93 0 0 0 13 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 0 0 0-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z\"></path></svg>\n              </ul>\n              <ul class=\"d-none js-jump-to-no-results-template-container\">\n                <li class=\"d-flex flex-justify-center flex-items-center p-3 f5 d-none\">\n                  <span class=\"text-gray\">No suggested jump to results</span>\n                </li>\n              </ul>\n\n              <ul id=\"jump-to-results\" class=\"js-navigation-container jump-to-suggestions-results-container js-jump-to-suggestions-results-container\">\n                <li class=\"d-flex flex-justify-center flex-items-center p-0 f5\">\n                  <img src=\"./GitHub_files/octocat-spinner-128.gif\" alt=\"Octocat Spinner Icon\" class=\"m-2\" width=\"28\">\n                </li>\n              </ul>\n            </div>\n      </label>\n</form>  </div>\n</div>\n\n            </div>\n\n          <ul class=\"d-lg-flex pl-lg-2 flex-items-center text-bold list-style-none\" role=\"navigation\">\n            <li>\n              <a class=\"js-selected-navigation-item HeaderNavlink px-lg-2 py-2 py-lg-0\" data-hotkey=\"g p\" data-ga-click=\"Header, click, Nav menu - item:pulls context:user\" aria-label=\"Pull requests you created\" data-selected-links=\"/pulls /pulls/assigned /pulls/mentioned /pulls\" href=\"https://github.com/pulls\">\n                Pull requests\n</a>            </li>\n            <li>\n              <a class=\"js-selected-navigation-item HeaderNavlink px-lg-2 py-2 py-lg-0\" data-hotkey=\"g i\" data-ga-click=\"Header, click, Nav menu - item:issues context:user\" aria-label=\"Issues you created\" data-selected-links=\"/issues /issues/assigned /issues/mentioned /issues\" href=\"https://github.com/issues\">\n                Issues\n</a>            </li>\n              <li>\n                <a class=\"js-selected-navigation-item HeaderNavlink px-lg-2 py-2 py-lg-0\" data-ga-click=\"Header, click, Nav menu - item:marketplace context:user\" data-octo-click=\"marketplace_click\" data-octo-dimensions=\"location:nav_bar\" data-selected-links=\" /marketplace\" href=\"https://github.com/marketplace\">\n                   Marketplace\n</a>              </li>\n            <li>\n              <a class=\"js-selected-navigation-item HeaderNavlink px-lg-2 py-2 py-lg-0\" data-ga-click=\"Header, click, Nav menu - item:explore\" data-selected-links=\"/explore /trending /trending/developers /integrations /integrations/feature/code /integrations/feature/collaborate /integrations/feature/ship showcases showcases_search showcases_landing /explore\" href=\"https://github.com/explore\">\n                Explore\n</a>            </li>\n          </ul>\n      </div>\n\n      <div class=\"d-lg-flex\">\n        \n<ul class=\"user-nav d-lg-flex flex-items-center list-style-none\" id=\"user-links\">\n  <li class=\"dropdown\">\n    <span class=\"d-none d-lg-block  px-2\">\n      \n    <a aria-label=\"You have unread notifications\" class=\"notification-indicator tooltipped tooltipped-s my-2 my-lg-0 js-socket-channel js-notification-indicator\" data-hotkey=\"g n\" data-ga-click=\"Header, go to notifications, icon:unread\" data-channel=\"notification-changed:1958953\" href=\"https://github.com/notifications\">\n        <span class=\"mail-status unread\"></span>\n        <svg class=\"octicon octicon-bell\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M13.99 11.991v1H0v-1l.73-.58c.769-.769.809-2.547 1.189-4.416.77-3.767 4.077-4.996 4.077-4.996 0-.55.45-1 .999-1 .55 0 1 .45 1 1 0 0 3.387 1.229 4.156 4.996.38 1.879.42 3.657 1.19 4.417l.659.58h-.01zM6.995 15.99c1.11 0 1.999-.89 1.999-1.999H4.996c0 1.11.89 1.999 1.999 1.999z\"></path></svg>\n</a>\n    </span>\n  </li>\n\n  <li class=\"dropdown\">\n    <details class=\"details-overlay details-reset d-none d-lg-flex px-lg-2 py-2 py-lg-0 flex-items-center\">\n      <summary class=\"HeaderNavlink\" aria-label=\"Create new…\" data-ga-click=\"Header, create new, icon:add\" aria-haspopup=\"menu\">\n        <svg class=\"octicon octicon-plus float-left mr-1 mt-1\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 9H7v5H5V9H0V7h5V2h2v5h5v2z\"></path></svg>\n        <span class=\"dropdown-caret mt-1\"></span>\n      </summary>\n      <details-menu class=\"dropdown-menu dropdown-menu-sw\" role=\"menu\">\n        \n<a role=\"menuitem\" class=\"dropdown-item\" href=\"https://github.com/new\" data-ga-click=\"Header, create new repository\">\n  New repository\n</a>\n\n  <a role=\"menuitem\" class=\"dropdown-item\" href=\"https://github.com/new/import\" data-ga-click=\"Header, import a repository\">\n    Import repository\n  </a>\n\n<a role=\"menuitem\" class=\"dropdown-item\" href=\"https://gist.github.com/\" data-ga-click=\"Header, create new gist\">\n  New gist\n</a>\n\n  <a role=\"menuitem\" class=\"dropdown-item\" href=\"https://github.com/organizations/new\" data-ga-click=\"Header, create new organization\">\n    New organization\n  </a>\n\n\n\n      </details-menu>\n    </details>\n  </li>\n\n  <li class=\"dropdown\">\n      <a class=\"d-lg-none HeaderNavlink name tooltipped tooltipped-sw px-lg-2 py-2 py-lg-0\" href=\"https://github.com/bitwiseman\" aria-label=\"View profile and more\" aria-expanded=\"false\" aria-haspopup=\"false\">\n        <img alt=\"@bitwiseman\" class=\"avatar float-left mr-1\" src=\"./GitHub_files/1958953\" height=\"20\" width=\"20\">\n        <span class=\"text-bold\">bitwiseman</span>\n      </a>\n\n    <details class=\"details-overlay details-reset d-none d-lg-flex pl-lg-2 py-2 py-lg-0 flex-items-center\">\n      <summary class=\"HeaderNavlink name mt-1\" aria-label=\"View profile and more\" data-ga-click=\"Header, show menu, icon:avatar\" aria-haspopup=\"menu\">\n        <img alt=\"@bitwiseman\" class=\"avatar float-left mr-1\" src=\"./GitHub_files/1958953\" height=\"20\" width=\"20\">\n        <span class=\"dropdown-caret\"></span>\n      </summary>\n      <details-menu class=\"dropdown-menu dropdown-menu-sw\" role=\"menu\">\n        <ul>\n          <li class=\"header-nav-current-user css-truncate\"><a role=\"menuitem\" class=\"no-underline user-profile-link px-3 pt-2 pb-2 mb-n2 mt-n1 d-block\" href=\"https://github.com/bitwiseman\" data-ga-click=\"Header, go to profile, text:Signed in as\">Signed in as <strong class=\"css-truncate-target\">bitwiseman</strong></a></li>\n          <li class=\"dropdown-divider\"></li>\n          <li><a role=\"menuitem\" class=\"dropdown-item\" href=\"https://github.com/bitwiseman\" data-ga-click=\"Header, go to profile, text:your profile\">Your profile</a></li>\n          <li><a role=\"menuitem\" class=\"dropdown-item\" href=\"https://github.com/bitwiseman?tab=repositories\" data-ga-click=\"Header, go to repositories, text:your repositories\">Your repositories</a></li>\n          <li><a role=\"menuitem\" class=\"dropdown-item\" href=\"https://github.com/bitwiseman?tab=stars\" data-ga-click=\"Header, go to starred repos, text:your stars\">Your stars</a></li>\n            <li><a role=\"menuitem\" class=\"dropdown-item\" href=\"https://gist.github.com/\" data-ga-click=\"Header, your gists, text:your gists\">Your gists</a></li>\n          <li class=\"dropdown-divider\"></li>\n          <li><a role=\"menuitem\" class=\"dropdown-item\" href=\"https://help.github.com/\" data-ga-click=\"Header, go to help, text:help\">Help</a></li>\n          <li><a role=\"menuitem\" class=\"dropdown-item\" href=\"https://github.com/settings/profile\" data-ga-click=\"Header, go to settings, icon:settings\">Settings</a></li>\n          <li>\n            <!-- '\"` --><!-- </textarea></xmp> --><form class=\"logout-form\" action=\"https://github.com/logout\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"✓\"><input type=\"hidden\" name=\"authenticity_token\" value=\"FYG3XaGhkic0yFJpD/ZR8A2dNihbpAwVk3FV0E67neDPKUYO895uH6yiW83tMlaUpKlEp4f7S2pA6YqElMbG9w==\">\n              <button type=\"submit\" class=\"dropdown-item dropdown-signout\" data-ga-click=\"Header, sign out, icon:logout\" role=\"menuitem\">\n                Sign out\n              </button>\n</form>          </li>\n        </ul>\n      </details-menu>\n    </details>\n  </li>\n</ul>\n\n\n          <!-- '\"` --><!-- </textarea></xmp> --><form class=\"d-lg-none\" action=\"https://github.com/logout\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"✓\"><input type=\"hidden\" name=\"authenticity_token\" value=\"0NH6BfhVVkciUxcwJ6ptCmhHV9VVUlVn9StSQxtecWcKeQtWqiqqf7o5HpTFbmpuwXMlWokNEhgms40XwSMqcA==\">\n            <button type=\"submit\" class=\"btn-link HeaderNavlink d-block width-full text-left py-2 text-bold\" data-ga-click=\"Header, sign out, icon:logout\" style=\"padding-left: 2px;\">\n              <svg class=\"octicon octicon-sign-out v-align-middle\" style=\"margin-right: 2px;\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.992 8.994V6.996H7.995v-2h3.997V2.999l3.998 2.998-3.998 2.998zm-1.998 2.998H5.996V2.998L2 1h7.995v2.998h1V1c0-.55-.45-.999-1-.999H.999A1.001 1.001 0 0 0 0 1v11.372c0 .39.22.73.55.91L5.996 16v-3.008h3.998c.55 0 1-.45 1-1V7.996h-1v3.998z\"></path></svg>\n              Sign out\n            </button>\n</form>\n        <!-- '\"` --><!-- </textarea></xmp> --><form class=\"sr-only right-0\" action=\"https://github.com/logout\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"✓\"><input type=\"hidden\" name=\"authenticity_token\" value=\"hqe+jI4NKjlMB8zMnXXUNH3hNnXJmTxWlCaMrTHlWrxcD0/f3HLWAdRtxWh/sdNQ1NVE+hXGeylHvlP565gBqw==\">\n          <button type=\"submit\" class=\"dropdown-item dropdown-signout\" data-ga-click=\"Header, sign out, icon:logout\">\n            Sign out\n          </button>\n</form>      </div>\n    </div>\n  </div>\n</header>\n\n      \n\n  </div>\n\n  <div id=\"start-of-content\" class=\"show-on-focus\"></div>\n\n    <div id=\"js-flash-container\">\n\n\n</div>\n\n\n\n  <div role=\"main\" class=\"application-main \">\n          <div class=\"d-flex flex-wrap bg-gray\" style=\"min-height: 100vh;\">\n    <div class=\"team-left-column col-12 col-md-4 col-lg-3 bg-white border-right border-bottom hide-md hide-sm\">\n              \n\n<div class=\"dashboard-sidebar top-0 px-3 px-md-4 px-lg-4 overflow-auto is-placeholder\" style=\"visibility: hidden; display: none; height: 1287px;\"></div><div class=\"dashboard-sidebar js-sticky top-0 px-3 px-md-4 px-lg-4 overflow-auto\" style=\"width: auto; height: 1243px; position: static;\">\n    <details class=\"border-bottom py-3 my-3 width-full UnderlineNav-actions details-reset select-menu account-switcher d-inline-block js-select-menu details-overlay js-dropdown-details\" data-contents-url=\"/dashboard/ajax_context_list?current_context=bitwiseman\">\n  <summary class=\"no-underline btn-link text-gray-dark text-bold js-menu-target select-menu-button width-full\" aria-label=\"Switch account context\" aria-expanded=\"false\" aria-haspopup=\"true\" data-ga-click=\"Dashboard, click, Opened account context switcher - context:user\">\n    <div class=\"select-menu-button-gravatar js-select-button-gravatar\">\n      <img src=\"./GitHub_files/1958953\" width=\"20\" height=\"20\" alt=\"@bitwiseman\">\n    </div>\n    <span class=\"js-select-button css-truncate css-truncate-target\">bitwiseman</span>\n</summary>\n  <div class=\"position-absolute\" role=\"menu\" aria-labelledby=\"context-switch-title\" style=\"z-index: 99\">\n    <div class=\"select-menu-modal js-navigation-container\">\n      <div class=\"select-menu-header js-navigation-enable\" tabindex=\"-1\">\n        <span class=\"select-menu-title\" id=\"context-switch-title\">Switch dashboard context</span>\n      </div>\n\n\n        <div class=\"select-menu-list\">\n            <div class=\"js-select-menu-deferred-content\"><div data-filterable-for=\"context-context-filter-field\" data-filterable-type=\"fuzzy\">\n  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open selected\" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:user\" href=\"https://github.com/\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/1958953\" width=\"20\" height=\"20\" alt=\"@bitwiseman\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      bitwiseman\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/beautifier/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/22065016\" width=\"20\" height=\"20\" alt=\"@beautifier\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      beautifier\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/beautifier/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/6538164\" width=\"20\" height=\"20\" alt=\"@beautify-web\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      beautify-web\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/bitwise-jenkins/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/24939347\" width=\"20\" height=\"20\" alt=\"@bitwise-jenkins\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      bitwise-jenkins\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/cloudbees/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/235526\" width=\"20\" height=\"20\" alt=\"@cloudbees\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      cloudbees\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/jenkins-docs/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/24830755\" width=\"20\" height=\"20\" alt=\"@jenkins-docs\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      jenkins-docs\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/jenkins-inc/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/17552794\" width=\"20\" height=\"20\" alt=\"@jenkins-inc\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      jenkins-inc\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/jenkins-infra/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/7422698\" width=\"20\" height=\"20\" alt=\"@jenkins-infra\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      jenkins-infra\n    </span>\n</a>  <a role=\"menuitem\" class=\"select-menu-item js-navigation-item js-navigation-open \" data-ga-click=\"Dashboard, switch context, Switch dashboard context from:user to:organization\" href=\"https://github.com/orgs/jenkinsci/dashboard\">\n    <svg class=\"octicon octicon-check select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z\"></path></svg>\n    <div class=\"select-menu-item-gravatar\">\n      <img src=\"./GitHub_files/107424\" width=\"20\" height=\"20\" alt=\"@jenkinsci\">\n    </div>\n    <span class=\"select-menu-item-text\">\n      jenkinsci\n    </span>\n</a></div>\n</div>\n            <div class=\"select-menu-loading-overlay anim-pulse\">\n              <svg height=\"32\" class=\"octicon octicon-octoface\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"32\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M14.7 5.34c.13-.32.55-1.59-.13-3.31 0 0-1.05-.33-3.44 1.3-1-.28-2.07-.32-3.13-.32s-2.13.04-3.13.32c-2.39-1.64-3.44-1.3-3.44-1.3-.68 1.72-.26 2.99-.13 3.31C.49 6.21 0 7.33 0 8.69 0 13.84 3.33 15 7.98 15S16 13.84 16 8.69c0-1.36-.49-2.48-1.3-3.35zM8 14.02c-3.3 0-5.98-.15-5.98-3.35 0-.76.38-1.48 1.02-2.07 1.07-.98 2.9-.46 4.96-.46 2.07 0 3.88-.52 4.96.46.65.59 1.02 1.3 1.02 2.07 0 3.19-2.68 3.35-5.98 3.35zM5.49 9.01c-.66 0-1.2.8-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.54-1.78-1.2-1.78zm5.02 0c-.66 0-1.2.79-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.53-1.78-1.2-1.78z\"></path></svg>\n            </div>\n        </div>\n\n        <div class=\"select-menu-list\">\n\n          <a class=\"select-menu-item select-menu-action js-navigation-item js-navigation-open\" data-ga-click=\"Dashboard, click, Manage orgs link in context switcher - context:user\" href=\"https://github.com/account/organizations\">\n            <svg class=\"octicon octicon-organization select-menu-item-icon\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M16 12.999c0 .439-.45 1-1 1H7.995c-.539 0-.994-.447-.995-.999H1c-.54 0-1-.561-1-1 0-2.634 3-4 3-4s.229-.409 0-1c-.841-.621-1.058-.59-1-3 .058-2.419 1.367-3 2.5-3s2.442.58 2.5 3c.058 2.41-.159 2.379-1 3-.229.59 0 1 0 1s1.549.711 2.42 2.088C9.196 9.369 10 8.999 10 8.999s.229-.409 0-1c-.841-.62-1.058-.59-1-3 .058-2.419 1.367-3 2.5-3s2.437.581 2.495 3c.059 2.41-.158 2.38-1 3-.229.59 0 1 0 1s3.005 1.366 3.005 4z\"></path></svg>\n            <span class=\"select-menu-item-text\">Manage organizations</span>\n</a>            <a class=\"select-menu-item select-menu-action js-navigation-item js-navigation-open\" data-ga-click=\"Dashboard, click, Create org link in context switcher - context:user\" href=\"https://github.com/account/organizations/new\">\n              <svg class=\"octicon octicon-plus select-menu-item-icon\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M12 9H7v5H5V9H0V7h5V2h2v5h5v2z\"></path></svg>\n              <span class=\"select-menu-item-text\">Create organization</span>\n</a>        </div>\n    </div>\n  </div>\n</details>\n\n\n    <div class=\"mb-3 Details js-repos-container\" data-pjax-container=\"\" role=\"navigation\">\n      \n<div class=\"js-repos-container\" data-pjax-container=\"\">\n  <h4 class=\"f5 mb-1 d-flex flex-justify-between flex-items-center\">\n    Repositories\n      <a class=\"btn btn-sm btn-primary text-white\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;NEW_REPOSITORY_BUTTON&quot;,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"81247a6e11ea643e43924b071d493c8200e31db43e4ec6179366e488eccb55db\" data-ga-click=\"Dashboard, click, Sidebar header new repo button - context:user\" href=\"https://github.com/new\">\n        <svg class=\"octicon octicon-repo\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg> New\n</a>  </h4>\n    <div class=\"mt-2 mb-3\" role=\"search\">\n      <input type=\"text\" class=\"form-control f5 input-block mb-3 js-filterable-field js-your-repositories-search\" id=\"dashboard-repos-filter\" placeholder=\"Find a repository…\" aria-label=\"Find a repository…\" data-url=\"https://github.com/\" data-query-name=\"q\" value=\"\">\n    </div>\n    \n<ul class=\"list-style-none\" data-filterable-for=\"dashboard-repos-filter\" data-filterable-type=\"substring\">\n    <li class=\"public source \">\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex flex-items-baseline f5 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;REPOSITORY&quot;,&quot;record_id&quot;:84822,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"fc2698f36582854d595e51ca53dbb91c4b046162ba0896cbc2929e700ad4a709\" data-ga-click=\"Dashboard, click, Repo list item click - context:user visibility:public fork:false\" href=\"https://github.com/beautifier/js-beautify\">\n          <div class=\"text-gray-light mr-2\">\n              <svg aria-label=\"Repository\" class=\"octicon octicon-repo flex-shrink-0\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg>\n          </div>\n\n          <span class=\"css-truncate css-truncate-target flex-shrink-0\" style=\"max-width: 48%\" title=\"beautify-web\">beautify-web</span>/<span class=\"css-truncate css-truncate-target\" style=\"max-width: inherit\" title=\"js-beautify\">js-beautify</span>\n</a>      </div>\n    </li>\n    <li class=\"public source \">\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex flex-items-baseline f5 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;REPOSITORY&quot;,&quot;record_id&quot;:74594771,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"118cd969f8974a09b52349994cdec724b264c9924514dbca2282f00444925f93\" data-ga-click=\"Dashboard, click, Repo list item click - context:user visibility:public fork:false\" href=\"https://github.com/beautifier/beautifier.io\">\n          <div class=\"text-gray-light mr-2\">\n              <svg aria-label=\"Repository\" class=\"octicon octicon-repo flex-shrink-0\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg>\n          </div>\n\n          <span class=\"css-truncate css-truncate-target flex-shrink-0\" style=\"max-width: 48%\" title=\"beautifier\">beautifier</span>/<span class=\"css-truncate css-truncate-target\" style=\"max-width: inherit\" title=\"beautifier.io\">beautifier.io</span>\n</a>      </div>\n    </li>\n    <li class=\"public source \">\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex flex-items-baseline f5 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;REPOSITORY&quot;,&quot;record_id&quot;:44886691,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"5abc1dd7f18ed1376d7d1e2de4a5bb3e649a09c8e8632b9adff73c1ea72b8c6a\" data-ga-click=\"Dashboard, click, Repo list item click - context:user visibility:public fork:false\" href=\"https://github.com/jenkins-infra/jenkins.io\">\n          <div class=\"text-gray-light mr-2\">\n              <svg aria-label=\"Repository\" class=\"octicon octicon-repo flex-shrink-0\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg>\n          </div>\n\n          <span class=\"css-truncate css-truncate-target flex-shrink-0\" style=\"max-width: 48%\" title=\"jenkins-infra\">jenkins-infra</span>/<span class=\"css-truncate css-truncate-target\" style=\"max-width: inherit\" title=\"jenkins.io\">jenkins.io</span>\n</a>      </div>\n    </li>\n    <li class=\"public source \">\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex flex-items-baseline f5 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;REPOSITORY&quot;,&quot;record_id&quot;:103302223,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"6c5e3017457239fc89e19d1cb87b0fa7215038d46630d98951713f71946f452d\" data-ga-click=\"Dashboard, click, Repo list item click - context:user visibility:public fork:false\" href=\"https://github.com/jenkinsci/jep\">\n          <div class=\"text-gray-light mr-2\">\n              <svg aria-label=\"Repository\" class=\"octicon octicon-repo flex-shrink-0\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg>\n          </div>\n\n          <span class=\"css-truncate css-truncate-target flex-shrink-0\" style=\"max-width: 48%\" title=\"jenkinsci\">jenkinsci</span>/<span class=\"css-truncate css-truncate-target\" style=\"max-width: inherit\" title=\"jep\">jep</span>\n</a>      </div>\n    </li>\n    <li class=\"private source \">\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex flex-items-baseline f5 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;REPOSITORY&quot;,&quot;record_id&quot;:117019479,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"d2e4b5554c611d4946bb6cda7d34adb21be1c11811baeaa81487dc21fe2df0d7\" data-ga-click=\"Dashboard, click, Repo list item click - context:user visibility:private fork:false\" href=\"https://github.com/cloudbees/jep-internal-staging\">\n          <div class=\"text-gray-light mr-2\">\n              <svg class=\"octicon octicon-lock repo-private-icon flex-shrink-0\" aria-label=\"Repository\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 13H3v-1h1v1zm8-6v7c0 .55-.45 1-1 1H1c-.55 0-1-.45-1-1V7c0-.55.45-1 1-1h1V4c0-2.2 1.8-4 4-4s4 1.8 4 4v2h1c.55 0 1 .45 1 1zM3.8 6h4.41V4c0-1.22-.98-2.2-2.2-2.2-1.22 0-2.2.98-2.2 2.2v2H3.8zM11 7H2v7h9V7zM4 8H3v1h1V8zm0 2H3v1h1v-1z\"></path></svg>\n          </div>\n\n          <span class=\"css-truncate css-truncate-target flex-shrink-0\" style=\"max-width: 48%\" title=\"cloudbees\">cloudbees</span>/<span class=\"css-truncate css-truncate-target\" style=\"max-width: inherit\" title=\"jep-internal-staging\">jep-internal-staging</span>\n</a>      </div>\n    </li>\n    <li class=\"public source \">\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex flex-items-baseline f5 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;REPOSITORY&quot;,&quot;record_id&quot;:1886707,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"17564cdda2e00fb88313d26dc1c68b880a6c0dbe0d3607e8b5be2e15673273cb\" data-ga-click=\"Dashboard, click, Repo list item click - context:user visibility:public fork:false\" href=\"https://github.com/jenkins-infra/backend-extension-indexer\">\n          <div class=\"text-gray-light mr-2\">\n              <svg aria-label=\"Repository\" class=\"octicon octicon-repo flex-shrink-0\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg>\n          </div>\n\n          <span class=\"css-truncate css-truncate-target flex-shrink-0\" style=\"max-width: 48%\" title=\"jenkins-infra\">jenkins-infra</span>/<span class=\"css-truncate css-truncate-target\" style=\"max-width: inherit\" title=\"backend-extension-indexer\">backend-extension-indexer</span>\n</a>      </div>\n    </li>\n    <li class=\"public source \">\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex flex-items-baseline f5 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;REPOSITORY&quot;,&quot;record_id&quot;:68237072,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"1111488c89aafb4b03f1a8f8a7e8eb312c35afcd4abba99a323a5ddca917afbb\" data-ga-click=\"Dashboard, click, Repo list item click - context:user visibility:public fork:false\" href=\"https://github.com/Microsoft/vscode-html-languageservice\">\n          <div class=\"text-gray-light mr-2\">\n              <svg aria-label=\"Repository\" class=\"octicon octicon-repo flex-shrink-0\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z\"></path></svg>\n          </div>\n\n          <span class=\"css-truncate css-truncate-target flex-shrink-0\" style=\"max-width: 48%\" title=\"Microsoft\">Microsoft</span>/<span class=\"css-truncate css-truncate-target\" style=\"max-width: inherit\" title=\"vscode-html-languageservice\">vscode-html-languageservice</span>\n</a>      </div>\n    </li>\n</ul>\n\n  <!-- '\"` --><!-- </textarea></xmp> --><form class=\"ajax-pagination-form js-ajax-pagination js-more-repos-form\" action=\"https://github.com/dashboard/ajax_repositories\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"✓\">\n    <input name=\"repos_cursor\" type=\"hidden\" value=\"Nw==\">\n    <button name=\"button\" type=\"submit\" class=\"width-full text-left btn-link f6 muted-link text-left mt-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;REPOSITORIES&quot;,&quot;target&quot;:&quot;SEE_MORE&quot;,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"7e6e2aac376323be3b5427f57b3728a6279f807559e0bb85571d40f03f69e5b9\" data-ga-click=\"Dashboard, click, Ajax more repos link - context:user\" data-disable-with=\"Loading more&amp;hellip;\">\n      Show more\n</button></form>\n</div>\n\n    </div>\n\n    <div id=\"your_teams\" class=\"js-repos-container user-repos\" data-pjax-container=\"\">\n      \n<div class=\"mb-4 Details js-repos-container\">\n  <h4 class=\"f5 mb-1 border-top pt-3\">Your teams</h4>\n    <div class=\"mt-2 mb-3\" role=\"search\">\n      <input type=\"text\" class=\"form-control f5 input-block mb-3 js-filterable-field js-your-repositories-search\" id=\"your-teams-filter\" placeholder=\"Find a team…\" aria-label=\"Find a team…\" data-url=\"https://github.com/\" data-query-name=\"team\" value=\"\">\n      </div>\n    \n<ul class=\"list-style-none pr-4\" data-filterable-for=\"your-teams-filter\" data-filterable-type=\"substring\">\n    <li>\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;TEAM&quot;,&quot;record_id&quot;:2478842,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"430c969adea32703ba120ac0e55f745515d5cb967cb349988b1c810d723d1420\" data-ga-click=\"Dashboard, click, Team list item click - context:user\" href=\"https://github.com/orgs/jenkinsci/teams/jep-editors\">\n          <div class=\"text-gray-light mr-2\">\n            <svg class=\"octicon octicon-jersey\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4.5 6l-.5.5v5l.5.5h2l.5-.5v-5L6.5 6h-2zM6 11H5V7h1v4zm6.27-7.25C12.05 2.37 11.96 1.12 12 0H9.02c0 .27-.13.48-.39.69-.25.2-.63.3-1.13.3-.5 0-.88-.09-1.13-.3-.23-.2-.36-.42-.36-.69H3c.05 1.13-.03 2.38-.25 3.75C2.55 5.13 1.95 5.88 1 6v9c.02.27.11.48.31.69.2.21.42.3.69.31h11c.27-.02.48-.11.69-.31.21-.2.3-.42.31-.69V6c-.95-.13-1.53-.88-1.75-2.25h.02zM13 15H2V7c.89-.5 1.48-1.25 1.72-2.25S4.03 2.5 4 1h1c-.02.78.16 1.47.52 2.06.36.58 1.02.89 2 .94.98-.02 1.64-.33 2-.94.36-.59.5-1.28.48-2.06h1c.02 1.42.13 2.55.33 3.38.2.81.69 2 1.67 2.63v8V15zM8.5 6l-.5.5v5l.5.5h2l.5-.5v-5l-.5-.5h-2zm1.5 5H9V7h1v4z\"></path></svg>\n          </div>\n          <span class=\"width-fit css-truncate css-truncate-target\">\n            jenkinsci/jep-editors\n          </span>\n</a>      </div>\n    </li>\n    <li>\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;TEAM&quot;,&quot;record_id&quot;:1882929,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"a75151348c25bb38f628433c1d0aae104c5d6b61c84263f2a99ba35d3f52a3e2\" data-ga-click=\"Dashboard, click, Team list item click - context:user\" href=\"https://github.com/orgs/jenkins-infra/teams/copy-editors\">\n          <div class=\"text-gray-light mr-2\">\n            <svg class=\"octicon octicon-jersey\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4.5 6l-.5.5v5l.5.5h2l.5-.5v-5L6.5 6h-2zM6 11H5V7h1v4zm6.27-7.25C12.05 2.37 11.96 1.12 12 0H9.02c0 .27-.13.48-.39.69-.25.2-.63.3-1.13.3-.5 0-.88-.09-1.13-.3-.23-.2-.36-.42-.36-.69H3c.05 1.13-.03 2.38-.25 3.75C2.55 5.13 1.95 5.88 1 6v9c.02.27.11.48.31.69.2.21.42.3.69.31h11c.27-.02.48-.11.69-.31.21-.2.3-.42.31-.69V6c-.95-.13-1.53-.88-1.75-2.25h.02zM13 15H2V7c.89-.5 1.48-1.25 1.72-2.25S4.03 2.5 4 1h1c-.02.78.16 1.47.52 2.06.36.58 1.02.89 2 .94.98-.02 1.64-.33 2-.94.36-.59.5-1.28.48-2.06h1c.02 1.42.13 2.55.33 3.38.2.81.69 2 1.67 2.63v8V15zM8.5 6l-.5.5v5l.5.5h2l.5-.5v-5l-.5-.5h-2zm1.5 5H9V7h1v4z\"></path></svg>\n          </div>\n          <span class=\"width-fit css-truncate css-truncate-target\">\n            jenkins-infra/copy-editors\n          </span>\n</a>      </div>\n    </li>\n    <li>\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;TEAM&quot;,&quot;record_id&quot;:2188150,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"936219fc33de009e05bc9c74f8a3888fa749cd6b81d97bb83c141113f095b1dd\" data-ga-click=\"Dashboard, click, Team list item click - context:user\" href=\"https://github.com/orgs/jenkins-infra/teams/docs\">\n          <div class=\"text-gray-light mr-2\">\n            <svg class=\"octicon octicon-jersey\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4.5 6l-.5.5v5l.5.5h2l.5-.5v-5L6.5 6h-2zM6 11H5V7h1v4zm6.27-7.25C12.05 2.37 11.96 1.12 12 0H9.02c0 .27-.13.48-.39.69-.25.2-.63.3-1.13.3-.5 0-.88-.09-1.13-.3-.23-.2-.36-.42-.36-.69H3c.05 1.13-.03 2.38-.25 3.75C2.55 5.13 1.95 5.88 1 6v9c.02.27.11.48.31.69.2.21.42.3.69.31h11c.27-.02.48-.11.69-.31.21-.2.3-.42.31-.69V6c-.95-.13-1.53-.88-1.75-2.25h.02zM13 15H2V7c.89-.5 1.48-1.25 1.72-2.25S4.03 2.5 4 1h1c-.02.78.16 1.47.52 2.06.36.58 1.02.89 2 .94.98-.02 1.64-.33 2-.94.36-.59.5-1.28.48-2.06h1c.02 1.42.13 2.55.33 3.38.2.81.69 2 1.67 2.63v8V15zM8.5 6l-.5.5v5l.5.5h2l.5-.5v-5l-.5-.5h-2zm1.5 5H9V7h1v4z\"></path></svg>\n          </div>\n          <span class=\"width-fit css-truncate css-truncate-target\">\n            jenkins-infra/docs\n          </span>\n</a>      </div>\n    </li>\n    <li>\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;TEAM&quot;,&quot;record_id&quot;:2832517,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"472a0cff3fe05e38c4637b46dd4dc3128034cf0fdc8d10a5e0582118d5df0357\" data-ga-click=\"Dashboard, click, Team list item click - context:user\" href=\"https://github.com/orgs/jenkinsci/teams/jep-bdfl-delegates\">\n          <div class=\"text-gray-light mr-2\">\n            <svg class=\"octicon octicon-jersey\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4.5 6l-.5.5v5l.5.5h2l.5-.5v-5L6.5 6h-2zM6 11H5V7h1v4zm6.27-7.25C12.05 2.37 11.96 1.12 12 0H9.02c0 .27-.13.48-.39.69-.25.2-.63.3-1.13.3-.5 0-.88-.09-1.13-.3-.23-.2-.36-.42-.36-.69H3c.05 1.13-.03 2.38-.25 3.75C2.55 5.13 1.95 5.88 1 6v9c.02.27.11.48.31.69.2.21.42.3.69.31h11c.27-.02.48-.11.69-.31.21-.2.3-.42.31-.69V6c-.95-.13-1.53-.88-1.75-2.25h.02zM13 15H2V7c.89-.5 1.48-1.25 1.72-2.25S4.03 2.5 4 1h1c-.02.78.16 1.47.52 2.06.36.58 1.02.89 2 .94.98-.02 1.64-.33 2-.94.36-.59.5-1.28.48-2.06h1c.02 1.42.13 2.55.33 3.38.2.81.69 2 1.67 2.63v8V15zM8.5 6l-.5.5v5l.5.5h2l.5-.5v-5l-.5-.5h-2zm1.5 5H9V7h1v4z\"></path></svg>\n          </div>\n          <span class=\"width-fit css-truncate css-truncate-target\">\n            jenkinsci/jep-bdfl-delegates\n          </span>\n</a>      </div>\n    </li>\n    <li>\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;TEAM&quot;,&quot;record_id&quot;:2832516,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"a0ddf645699845f9c2793d5e9f9ff2415b2bbc08f2824c0ff92fa17bd5a62eac\" data-ga-click=\"Dashboard, click, Team list item click - context:user\" href=\"https://github.com/orgs/jenkinsci/teams/jep-sponsors\">\n          <div class=\"text-gray-light mr-2\">\n            <svg class=\"octicon octicon-jersey\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4.5 6l-.5.5v5l.5.5h2l.5-.5v-5L6.5 6h-2zM6 11H5V7h1v4zm6.27-7.25C12.05 2.37 11.96 1.12 12 0H9.02c0 .27-.13.48-.39.69-.25.2-.63.3-1.13.3-.5 0-.88-.09-1.13-.3-.23-.2-.36-.42-.36-.69H3c.05 1.13-.03 2.38-.25 3.75C2.55 5.13 1.95 5.88 1 6v9c.02.27.11.48.31.69.2.21.42.3.69.31h11c.27-.02.48-.11.69-.31.21-.2.3-.42.31-.69V6c-.95-.13-1.53-.88-1.75-2.25h.02zM13 15H2V7c.89-.5 1.48-1.25 1.72-2.25S4.03 2.5 4 1h1c-.02.78.16 1.47.52 2.06.36.58 1.02.89 2 .94.98-.02 1.64-.33 2-.94.36-.59.5-1.28.48-2.06h1c.02 1.42.13 2.55.33 3.38.2.81.69 2 1.67 2.63v8V15zM8.5 6l-.5.5v5l.5.5h2l.5-.5v-5l-.5-.5h-2zm1.5 5H9V7h1v4z\"></path></svg>\n          </div>\n          <span class=\"width-fit css-truncate css-truncate-target\">\n            jenkinsci/jep-sponsors\n          </span>\n</a>      </div>\n    </li>\n    <li>\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;TEAM&quot;,&quot;record_id&quot;:2670699,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"6fabd0e664f927a4c795010803f2d7837a623a5271ce5667e4edb7350c0cff3c\" data-ga-click=\"Dashboard, click, Team list item click - context:user\" href=\"https://github.com/orgs/jenkins-infra/teams/essentials\">\n          <div class=\"text-gray-light mr-2\">\n            <svg class=\"octicon octicon-jersey\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4.5 6l-.5.5v5l.5.5h2l.5-.5v-5L6.5 6h-2zM6 11H5V7h1v4zm6.27-7.25C12.05 2.37 11.96 1.12 12 0H9.02c0 .27-.13.48-.39.69-.25.2-.63.3-1.13.3-.5 0-.88-.09-1.13-.3-.23-.2-.36-.42-.36-.69H3c.05 1.13-.03 2.38-.25 3.75C2.55 5.13 1.95 5.88 1 6v9c.02.27.11.48.31.69.2.21.42.3.69.31h11c.27-.02.48-.11.69-.31.21-.2.3-.42.31-.69V6c-.95-.13-1.53-.88-1.75-2.25h.02zM13 15H2V7c.89-.5 1.48-1.25 1.72-2.25S4.03 2.5 4 1h1c-.02.78.16 1.47.52 2.06.36.58 1.02.89 2 .94.98-.02 1.64-.33 2-.94.36-.59.5-1.28.48-2.06h1c.02 1.42.13 2.55.33 3.38.2.81.69 2 1.67 2.63v8V15zM8.5 6l-.5.5v5l.5.5h2l.5-.5v-5l-.5-.5h-2zm1.5 5H9V7h1v4z\"></path></svg>\n          </div>\n          <span class=\"width-fit css-truncate css-truncate-target\">\n            jenkins-infra/essentials\n          </span>\n</a>      </div>\n    </li>\n    <li>\n      <div class=\"width-full text-bold\">\n        <a class=\"d-flex mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;TEAM&quot;,&quot;record_id&quot;:2658933,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"5240692a2a6cf4059f6e95af69a5f76e04d6fafb9cdfe846195442ccccfa8132\" data-ga-click=\"Dashboard, click, Team list item click - context:user\" href=\"https://github.com/orgs/jenkins-infra/teams/cn-jenkins-io\">\n          <div class=\"text-gray-light mr-2\">\n            <svg class=\"octicon octicon-jersey\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M4.5 6l-.5.5v5l.5.5h2l.5-.5v-5L6.5 6h-2zM6 11H5V7h1v4zm6.27-7.25C12.05 2.37 11.96 1.12 12 0H9.02c0 .27-.13.48-.39.69-.25.2-.63.3-1.13.3-.5 0-.88-.09-1.13-.3-.23-.2-.36-.42-.36-.69H3c.05 1.13-.03 2.38-.25 3.75C2.55 5.13 1.95 5.88 1 6v9c.02.27.11.48.31.69.2.21.42.3.69.31h11c.27-.02.48-.11.69-.31.21-.2.3-.42.31-.69V6c-.95-.13-1.53-.88-1.75-2.25h.02zM13 15H2V7c.89-.5 1.48-1.25 1.72-2.25S4.03 2.5 4 1h1c-.02.78.16 1.47.52 2.06.36.58 1.02.89 2 .94.98-.02 1.64-.33 2-.94.36-.59.5-1.28.48-2.06h1c.02 1.42.13 2.55.33 3.38.2.81.69 2 1.67 2.63v8V15zM8.5 6l-.5.5v5l.5.5h2l.5-.5v-5l-.5-.5h-2zm1.5 5H9V7h1v4z\"></path></svg>\n          </div>\n          <span class=\"width-fit css-truncate css-truncate-target\">\n            jenkins-infra/cn-jenkins-io\n          </span>\n</a>      </div>\n    </li>\n</ul>\n\n  <!-- '\"` --><!-- </textarea></xmp> --><form class=\"ajax-pagination-form js-ajax-pagination js-more-repos-form\" action=\"https://github.com/dashboard/ajax_your_teams\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"✓\">\n    <input name=\"your_teams_cursor\" type=\"hidden\" value=\"Y3Vyc29yOnYyOpIOzgAoknU=\">\n    <button name=\"button\" type=\"submit\" class=\"width-full text-left btn-link f6 muted-link text-left mt-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;TEAMS&quot;,&quot;target&quot;:&quot;SEE_MORE&quot;,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E01434:4771EAA:5B85DF5D&quot;,&quot;originating_url&quot;:&quot;https://github.com/&quot;}}\" data-hydro-click-hmac=\"65167d1e7e1e11999cda7dba6c1fd9548dec9eb4008fd124646f8a0af9804b93\" data-ga-click=\"Dashboard, click, Ajax more teams link - context:user\" data-disable-with=\"Loading more&amp;hellip;\">\n      Show more\n</button></form>\n</div>\n\n    </div>\n\n    <div class=\"border-top py-3 text-gray text-small\">\n  You are in the public <span class=\"d-inline-block lh-condensed px-1 rounded-1 border border-green\">Beta</span> of the dashboard!\n  <!-- '\"` --><!-- </textarea></xmp> --><form class=\"d-inline-block\" action=\"https://github.com/beta_enrollments\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"✓\"><input type=\"hidden\" name=\"_method\" value=\"delete\"><input type=\"hidden\" name=\"authenticity_token\" value=\"7thp+3tFatL+BD0uS4syYspmUiKjxd459kzktluGGc18DwXlJs2vgcRm4ZbQ9doSGhFC7EIp2cjhRF9etWdGHg==\">\n    <input type=\"hidden\" name=\"feature\" value=\"dashboard_v2_layout\">\n    <input type=\"hidden\" name=\"organization\" value=\"\">\n    <button type=\"submit\" class=\"btn-link\">Opt out</button> or\n    <a href=\"https://github.com/contact?form%5Bsubject%5D=Dashboard+beta\">send feedback</a>.\n</form></div>\n\n</div>\n\n\n    </div>\n    <div class=\"col-12 col-md-8 col-lg-6 px-3 px-md-4 px-lg-6 mt-3 border-bottom d-flex flex-auto\">\n      <div class=\"mx-auto d-flex flex-auto flex-column\" style=\"max-width: 1400px;\">\n        <div class=\"flex-auto\">\n          \n\n\n\n\n\n<div class=\"\">\n  <div id=\"dashboard\" class=\"dashboard \">\n      \n\n    <div class=\"news \">\n      \n      \n  <h4 class=\"mt-3 text-normal\">Recent activity</h4>\n  <div class=\"mt-2 mb-4 js-recent-activity-container Details js-details-container\">\n    <div class=\"Box\">\n      <ul>\n          <li class=\"Box-row d-flex p-2\">\n            \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:211533441,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"b2526a2a854ae7f06886bf7794bcd22617b165a5cd13139a95a478cd6972d9c1\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:pull request context:user\" title=\"js-beautify 1.8.1\" href=\"https://github.com/Microsoft/vscode-html-languageservice/pull/37\">\n    <svg class=\"octicon octicon-git-pull-request text-green mr-2\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0 0 10 15a1.993 1.993 0 0 0 1-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v6.56A1.993 1.993 0 0 0 2 15a1.993 1.993 0 0 0 1-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:211533441,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"b2526a2a854ae7f06886bf7794bcd22617b165a5cd13139a95a478cd6972d9c1\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:pull request context:user\" title=\"js-beautify 1.8.1\" href=\"https://github.com/Microsoft/vscode-html-languageservice/pull/37\">\n        js-beautify 1.8.1\n</a>    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4 AvatarStack--two col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"bitwiseman and aeschli\">\n            <img src=\"./GitHub_files/6461412\" alt=\"@aeschli\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/Microsoft/vscode-html-languageservice\" class=\"link-gray\">\n      Microsoft/vscode-html-languageservice\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You opened this pull request\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-28T19:34:53Z\" title=\"Aug 28, 2018, 12:34 PM PDT\">4 hours ago</relative-time></span>\n  </div>\n</div>\n\n          </li>\n          <li class=\"Box-row d-flex p-2\">\n            \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:354771281,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"7cc378819c9c8ef36f561d21bb3fc8533c7252a5ec39198d5e640a587d28b2e7\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Add tests for html  `indent_scripts` option\" href=\"https://github.com/beautifier/js-beautify/issues/1518\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:354771281,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"7cc378819c9c8ef36f561d21bb3fc8533c7252a5ec39198d5e640a587d28b2e7\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Add tests for html  `indent_scripts` option\" href=\"https://github.com/beautifier/js-beautify/issues/1518\">\n        Add tests for html  `indent_scripts` option\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"good first issue\" style=\"background-color: #c2e0c6;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                good first issue\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: task\" style=\"background-color: #02d7e1;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                type: task\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4  col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"bitwiseman\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You opened this issue\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-28T14:58:40Z\" title=\"Aug 28, 2018, 7:58 AM PDT\">9 hours ago</relative-time></span>\n  </div>\n</div>\n\n          </li>\n          <li class=\"Box-row d-flex p-2\">\n            \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:354476827,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"d07cd1c6589f448eaaf37ba9371d97de601e256e90656ec2acfe85f20a3ed118\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Rename &quot;indent_inner_html&quot;\" href=\"https://github.com/beautifier/js-beautify/issues/1515\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:354476827,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"d07cd1c6589f448eaaf37ba9371d97de601e256e90656ec2acfe85f20a3ed118\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Rename &quot;indent_inner_html&quot;\" href=\"https://github.com/beautifier/js-beautify/issues/1515\">\n        Rename \"indent_inner_html\"\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"language: html\" style=\"background-color: #006b75;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                language: html\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: enhancement\" style=\"background-color: #0b02e1;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                type: enhancement\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4  col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"bitwiseman\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You opened this issue\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-27T21:01:18Z\" title=\"Aug 27, 2018, 2:01 PM PDT\">a day ago</relative-time></span>\n  </div>\n</div>\n\n          </li>\n          <li class=\"Box-row d-flex p-2\">\n            \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:207682107,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"da84edd17010f8743a041bd1c5756389811f3b77048044e8f27efffb95b935d5\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:commented type:issue context:user\" title=\"Must pipe input or define at least one file.\" href=\"https://github.com/beautifier/js-beautify/issues/1134\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:207682107,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"da84edd17010f8743a041bd1c5756389811f3b77048044e8f27efffb95b935d5\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:commented type:issue context:user\" title=\"Must pipe input or define at least one file.\" href=\"https://github.com/beautifier/js-beautify/issues/1134\">\n        Must pipe input or define at least one file.\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"implementation: python\" style=\"background-color: #bfd4f2;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                implementation: python\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"needs more info\" style=\"background-color: #fef2c0;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                needs more info\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4 AvatarStack--three-plus col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"l29ah, bitwiseman, MacKLess, and nickkrein\">\n            <img src=\"./GitHub_files/10507154\" alt=\"@nickkrein\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/30008507\" alt=\"@MacKLess\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/31852\" alt=\"@l29ah\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n        <svg class=\"octicon octicon-comment v-align-middle\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M14 1H2c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h2v3.5L7.5 11H14c.55 0 1-.45 1-1V2c0-.55-.45-1-1-1zm0 9H7l-2 2v-2H2V2h12v8z\"></path></svg> 14\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You commented\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-26T07:08:21Z\" title=\"Aug 26, 2018, 12:08 AM PDT\">3 days ago</relative-time></span>\n  </div>\n</div>\n\n          </li>\n      </ul>\n        <button name=\"button\" type=\"submit\" class=\"Box-row--hover-blue f6 btn-link width-full text-left no-underline link-gray border-top p-2 js-details-target js-show-more-recent-items\" aria-expanded=\"false\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;SEE_MORE&quot;,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"484e0d6ef71c3c5de314b44442b7a55ac303010a1906193d1251afc33a9288da\" data-ga-click=\"Dashboard, click, Ajax more recent activity link - context:user\">\n          Show more\n</button>        <div class=\"Details-content--hidden\">\n          <ul class=\"list-style-none\">\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:353543374,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"e43fbe110f592213aeca14e3e52811cc22f15055cdf36a8495c23f429f98e6e7\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:commented type:issue context:user\" title=\"Optional &lt;p&gt; closing not implemented\" href=\"https://github.com/beautifier/js-beautify/issues/1503\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:353543374,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"e43fbe110f592213aeca14e3e52811cc22f15055cdf36a8495c23f429f98e6e7\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:commented type:issue context:user\" title=\"Optional &lt;p&gt; closing not implemented\" href=\"https://github.com/beautifier/js-beautify/issues/1503\">\n        Optional &lt;p&gt; closing not implemented\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"language: html\" style=\"background-color: #006b75;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                language: html\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: bug\" style=\"background-color: #e10c02;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                type: bug\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: enhancement\" style=\"background-color: #0b02e1;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                type: enhancement\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4 AvatarStack--two col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"MacKLess and bitwiseman\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/30008507\" alt=\"@MacKLess\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n        <svg class=\"octicon octicon-comment v-align-middle\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M14 1H2c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h2v3.5L7.5 11H14c.55 0 1-.45 1-1V2c0-.55-.45-1-1-1zm0 9H7l-2 2v-2H2V2h12v8z\"></path></svg> 1\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You commented\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-26T00:02:27Z\" title=\"Aug 25, 2018, 5:02 PM PDT\">3 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:60510165,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"317360844424b8cbcf0228c17dde4e41243a6465c3b53c29aab847616b048a6c\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:reopened type:issue context:user\" title=\"Support for &lt;% EJS %&gt; templates\" href=\"https://github.com/beautifier/js-beautify/issues/643\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:60510165,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"317360844424b8cbcf0228c17dde4e41243a6465c3b53c29aab847616b048a6c\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:reopened type:issue context:user\" title=\"Support for &lt;% EJS %&gt; templates\" href=\"https://github.com/beautifier/js-beautify/issues/643\">\n        Support for &lt;% EJS %&gt; templates\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"language: templating\" style=\"background-color: #e99695;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                language: templating\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: enhancement\" style=\"background-color: #0b02e1;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                type: enhancement\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4 AvatarStack--three-plus col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"jawshooah, bitwiseman, and wangdabing\">\n            <img src=\"./GitHub_files/8199007\" alt=\"@wangdabing\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/4551271\" alt=\"@jawshooah\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n        <svg class=\"octicon octicon-comment v-align-middle\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M14 1H2c-.55 0-1 .45-1 1v8c0 .55.45 1 1 1h2v3.5L7.5 11H14c.55 0 1-.45 1-1V2c0-.55-.45-1-1-1zm0 9H7l-2 2v-2H2V2h12v8z\"></path></svg> 2\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        Your issue was reopened\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-24T07:16:01Z\" title=\"Aug 24, 2018, 12:16 AM PDT\">5 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:210615241,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"0675993cb4b5f83b351e5d50147af41073b11b0583f085818e2e63e805e984e3\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:pull request context:user\" title=\"Refactor js beautifier\" href=\"https://github.com/beautifier/js-beautify/pull/1506\">\n    <svg class=\"octicon octicon-git-pull-request text-green mr-2\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0 0 10 15a1.993 1.993 0 0 0 1-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v6.56A1.993 1.993 0 0 0 2 15a1.993 1.993 0 0 0 1-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:210615241,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"0675993cb4b5f83b351e5d50147af41073b11b0583f085818e2e63e805e984e3\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:pull request context:user\" title=\"Refactor js beautifier\" href=\"https://github.com/beautifier/js-beautify/pull/1506\">\n        Refactor js beautifier\n</a>    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4  col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"bitwiseman\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You opened this pull request\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-24T01:14:55Z\" title=\"Aug 23, 2018, 6:14 PM PDT\">5 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:210513012,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"e5528b47a4b794746f8f82a394627821b8eff592f44041e4604824280c4e94f8\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:review_requested type:pull request context:user\" title=\"[FIXED JENKINS-52114] Make success/failure use parallel stage result\" href=\"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/285\">\n    <svg class=\"octicon octicon-git-pull-request text-green mr-2\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0 0 10 15a1.993 1.993 0 0 0 1-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v6.56A1.993 1.993 0 0 0 2 15a1.993 1.993 0 0 0 1-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:210513012,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"e5528b47a4b794746f8f82a394627821b8eff592f44041e4604824280c4e94f8\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:review_requested type:pull request context:user\" title=\"[FIXED JENKINS-52114] Make success/failure use parallel stage result\" href=\"https://github.com/jenkinsci/pipeline-model-definition-plugin/pull/285\">\n        [FIXED JENKINS-52114] Make success/failure use parallel stage result\n</a>    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4 AvatarStack--three-plus col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"abayer, dwnusbaum, and kshultzCB\">\n            <img src=\"./GitHub_files/21689198\" alt=\"@kshultzCB\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/1068968\" alt=\"@dwnusbaum\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/120218\" alt=\"@abayer\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/jenkinsci/pipeline-model-definition-plugin\" class=\"link-gray\">\n      jenkinsci/pipeline-model-definition-plugin\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        Your review was requested\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-23T16:56:19Z\" title=\"Aug 23, 2018, 9:56 AM PDT\">5 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:353151833,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"1085f7717aa47511bd1205b83850c5329d0354a47d578044078ed71d26dff33e\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Look at esformatter for ideas for simpler testing framework\" href=\"https://github.com/beautifier/js-beautify/issues/1500\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:353151833,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"1085f7717aa47511bd1205b83850c5329d0354a47d578044078ed71d26dff33e\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Look at esformatter for ideas for simpler testing framework\" href=\"https://github.com/beautifier/js-beautify/issues/1500\">\n        Look at esformatter for ideas for simpler testing framework\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"type: enhancement\" style=\"background-color: #0b02e1;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                type: enhancement\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: task\" style=\"background-color: #02d7e1;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                type: task\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4  col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"bitwiseman\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You opened this issue\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-22T22:38:43Z\" title=\"Aug 22, 2018, 3:38 PM PDT\">6 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:352218616,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"67db4c43adebb666fd93d3fecc09d20fbf78b0069f75c495a6032db30b53c83c\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Move python implementation to argparse or other modern cli parser\" href=\"https://github.com/beautifier/js-beautify/issues/1492\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:352218616,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"67db4c43adebb666fd93d3fecc09d20fbf78b0069f75c495a6032db30b53c83c\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Move python implementation to argparse or other modern cli parser\" href=\"https://github.com/beautifier/js-beautify/issues/1492\">\n        Move python implementation to argparse or other modern cli parser\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"implementation: python\" style=\"background-color: #bfd4f2;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                implementation: python\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: task\" style=\"background-color: #02d7e1;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #000000;\">\n                type: task\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4  col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"bitwiseman\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You opened this issue\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-20T17:00:43Z\" title=\"Aug 20, 2018, 10:00 AM PDT\">8 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:209577209,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"bd7cf8350827f9d14a62d2ee78a121250be0d4fe8582f8d780821b7d9faba373\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:review_requested type:pull request context:user\" title=\"Finalizing JEP-206\" href=\"https://github.com/jenkinsci/jep/pull/183\">\n    <svg class=\"octicon octicon-git-pull-request text-green mr-2\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0 0 10 15a1.993 1.993 0 0 0 1-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v6.56A1.993 1.993 0 0 0 2 15a1.993 1.993 0 0 0 1-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;PULL_REQUEST&quot;,&quot;record_id&quot;:209577209,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"bd7cf8350827f9d14a62d2ee78a121250be0d4fe8582f8d780821b7d9faba373\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:review_requested type:pull request context:user\" title=\"Finalizing JEP-206\" href=\"https://github.com/jenkinsci/jep/pull/183\">\n        Finalizing JEP-206\n</a>    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4 AvatarStack--three-plus col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"jglick, bitwiseman, and svanoort\">\n            <img src=\"./GitHub_files/5400948\" alt=\"@svanoort\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n            <img src=\"./GitHub_files/154109\" alt=\"@jglick\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/jenkinsci/jep\" class=\"link-gray\">\n      jenkinsci/jep\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        Your review was requested\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-20T16:32:25Z\" title=\"Aug 20, 2018, 9:32 AM PDT\">8 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n              <li class=\"d-flex border-top p-2 position-relative\">\n                \n<a data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:351445670,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"481fdc3d60cda037553b22c3a9c4bcacff809699f2a3b23608b69bda22a974b0\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Newline between rules adds unexpected newline to first nested rule sometimes\" href=\"https://github.com/beautifier/js-beautify/issues/1489\">\n    <svg class=\"octicon octicon-issue-opened text-green mr-2\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z\"></path></svg>\n</a>\n<div class=\"d-flex flex-column flex-auto\">\n  <div class=\"d-flex\">\n    <div class=\"col-12 mr-3\">\n      <a class=\"dashboard-break-word lh-condensed link-gray-dark text-bold mr-1 mb-2\" data-hydro-click=\"{&quot;event_type&quot;:&quot;dashboard.click&quot;,&quot;payload&quot;:{&quot;event_context&quot;:&quot;RECENT_ACTIVITY&quot;,&quot;target&quot;:&quot;ISSUE&quot;,&quot;record_id&quot;:351445670,&quot;dashboard_context&quot;:&quot;user&quot;,&quot;dashboard_version&quot;:1,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BE:57D5:2E014C4:47720D3:5B85DF60&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard/recent-activity&quot;}}\" data-hydro-click-hmac=\"481fdc3d60cda037553b22c3a9c4bcacff809699f2a3b23608b69bda22a974b0\" data-ga-click=\"Dashboard, click, Recent activity list item click - interaction:authored type:issue context:user\" title=\"Newline between rules adds unexpected newline to first nested rule sometimes\" href=\"https://github.com/beautifier/js-beautify/issues/1489\">\n        Newline between rules adds unexpected newline to first nested rule sometimes\n</a>        <span class=\"mr-1\">\n            <span class=\"IssueLabel d-inline-block \" title=\"language: css\" style=\"background-color: #0e8a16;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                language: css\n              </span>\n            </span>\n            <span class=\"IssueLabel d-inline-block \" title=\"type: bug\" style=\"background-color: #e10c02;\">\n              <span class=\"css-truncate css-truncate-target d-inline-block\" style=\"color: #ffffff;\">\n                type: bug\n              </span>\n            </span>\n        </span>\n    </div>\n\n      <div class=\"AvatarStack AvatarStack--right AvatarStack--two col-1 mr-4  col-2\">\n        <div class=\"AvatarStack-body tooltipped tooltipped-sw tooltipped-align-right-1\" aria-label=\"bitwiseman\">\n            <img src=\"./GitHub_files/1958953\" alt=\"@bitwiseman\" width=\"16\" height=\"16\" class=\"avatar\">\n        </div>\n      </div>\n\n    <div class=\"col-1 f6 text-gray text-left\">\n    </div>\n  </div>\n\n  <div class=\"dashboard-break-word lh-condensed text-gray f6 mt-1\">\n    <a href=\"https://github.com/beautifier/js-beautify\" class=\"link-gray\">\n      beautify-web/js-beautify\n    </a>\n    <span class=\"px-1\">·</span>\n    <span class=\"d-inline-block f6 text-gray\">\n        You opened this issue\n    </span>\n    <span class=\"d-inline-block\"><relative-time datetime=\"2018-08-17T03:35:26Z\" title=\"Aug 16, 2018, 8:35 PM PDT\">12 days ago</relative-time></span>\n  </div>\n</div>\n\n              </li>\n          </ul>\n        </div>\n    </div>\n  </div>\n\n\n        <h4 class=\"text-normal js-all-activity-header\">All activity</h4>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/39524986\" width=\"32\" height=\"32\" alt=\"@atreadway\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181411857,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"fadd9febfeaec288adaf5ceb12f54dd62044dd253b957eb114795cc4ae27b273\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\">atreadway</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181411857,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ed39d5d9d3fbc4f04e956b31dcc50f45dfe8ac3cd92045e1fcaa76db377e0e9f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/atreadway/cbn-site\">atreadway/cbn-site</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T22:59:19Z\" title=\"Aug 28, 2018, 3:59 PM PDT\">an hour ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>2 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181411857,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"19d2b4289fbe5f9fe23a4d5669612a54e0dfea06987b01f2ce5a08357c34a622\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/atreadway/cbn-site/tree/atreadway-trials-getting-started-revamp\">atreadway-trials-getting-started-revamp</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"atreadway\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/39524986(1)\" width=\"16\" height=\"16\" alt=\"@atreadway\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181411857,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"d945552eb2eecad4f692473eadd45073d90dab0941b74e9b05c9d68846da1738\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/ee27548903dbf7c41bfef5eacc444f77f92d00be\">ee27548</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Optimize PNG files throughout the system.\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"atreadway\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/39524986(1)\" width=\"16\" height=\"16\" alt=\"@atreadway\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181411857,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"d945552eb2eecad4f692473eadd45073d90dab0941b74e9b05c9d68846da1738\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/c7f6a602b66eec031c4be20f9a90611d3dad4abc\">c7f6a60</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update Trial Guide to match working prototype; standardize screenshot…\n              </blockquote>\n            </div>\n          </li>\n\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181334255,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9a500d6e5b06b09985b341729238f069af4d2b52562c4a570f7bc2a427f56f0b\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/156685\" width=\"32\" height=\"32\" alt=\"@MarkEWaite\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181334255,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9a500d6e5b06b09985b341729238f069af4d2b52562c4a570f7bc2a427f56f0b\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\">MarkEWaite</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181334255,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b6a6682f29acb536a3b7fd6c3030a14b9c1d8ec55622747d211358d4ce06309d\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/atreadway/cbn-site\">atreadway/cbn-site</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T22:36:35Z\" title=\"Aug 28, 2018, 3:36 PM PDT\">an hour ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181334255,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"805da42aeca93b56e28e8c8c5af34749e279878e77474a268fe6285109f0f4d5\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/atreadway/cbn-site/tree/atreadway-trials-getting-started-revamp\">atreadway-trials-getting-started-revamp</a>\n\n          <div class=\"commits pusher-is-only-committer\">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"MarkEWaite\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181334255,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9448d2050bb09f7d30b20ff13ae79848841435fee899022342912d6afdc928f9\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/a6b3c99e22791ac0a98d95a380cf939bbbede092\">a6b3c99</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Fix a menu markup\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"MarkEWaite\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181334255,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9448d2050bb09f7d30b20ff13ae79848841435fee899022342912d6afdc928f9\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/39575f90f6014b33481460abc2b000390545c8aa\">39575f9</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Improve navigation by not expanding contents\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" href=\"https://github.com/apps/renovate\"><img class=\"avatar\" src=\"./GitHub_files/2740\" width=\"32\" height=\"32\" alt=\"@renovate\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"29139614\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181133334,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c386049eedd1fa0dede72e5f4d2afd3fecbeb04b16b5fb4a13451b4bffdebe55\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/apps/renovate\" aria-describedby=\"hovercard-aria-description\">renovate</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181133334,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"e34c603e61b2d2e2f72a43a43f0b275da26c6c099ab3436e6e6d3086d0353a15\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/Unibeautify/beautifier-prettier\">Unibeautify/beautifier-prettier</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T21:46:11Z\" title=\"Aug 28, 2018, 2:46 PM PDT\">2 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n              <button class=\"btn-link text-gray-dark no-underline js-details-target\" aria-expanded=\"false\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:null,&quot;event_group&quot;:{&quot;type&quot;:&quot;PushEvent&quot;,&quot;quantity&quot;:2,&quot;includes_viewer&quot;:false},&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event_group&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:null,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b9bf2e03889abe8e71988dcf31d59362b69d73e9d9d73004b6e6d4d317efebc4\" data-ga-click=\"News feed, event_group click, Event click type: target:\">\n                <span class=\"Details-content--shown\">\n                  <svg class=\"octicon octicon-unfold link-gray mr-1\" aria-label=\"Expand\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.5 7.5L14 10c0 .55-.45 1-1 1H9v-1h3.5l-2-2h-7l-2 2H5v1H1c-.55 0-1-.45-1-1l2.5-2.5L0 5c0-.55.45-1 1-1h4v1H1.5l2 2h7l2-2H9V4h4c.55 0 1 .45 1 1l-2.5 2.5zM6 6h2V3h2L7 0 4 3h2v3zm2 3H6v3H4l3 3 3-3H8V9z\"></path></svg>\n                </span>\n                <span class=\"Details-content--hidden\">\n                  <svg class=\"octicon octicon-fold link-gray mr-1\" aria-label=\"Collapse\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 9l3 3H8v3H6v-3H4l3-3zm3-6H8V0H6v3H4l3 3 3-3zm4 2c0-.55-.45-1-1-1h-2.5l-1 1h3l-2 2h-7l-2-2h3l-1-1H1c-.55 0-1 .45-1 1l2.5 2.5L0 10c0 .55.45 1 1 1h2.5l1-1h-3l2-2h7l2 2h-3l1 1H13c.55 0 1-.45 1-1l-2.5-2.5L14 5z\"></path></svg>\n                </span>\n</button>          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>2 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181133334,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2a49b2a7037b5f504b32485d859beb95cbfd01558238191f269e278f9c9326a6\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/Unibeautify/beautifier-prettier/tree/renovate/typescript-3.x\">renovate/typescript-3.x</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"renovate-bot\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"25180681\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/renovate-bot\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/25180681\" width=\"16\" height=\"16\" alt=\"@renovate-bot\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181133334,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9ad719b59e72cc8b192a051fc5b5837fec2e49609b55a5d2eb02c1faa32a85c7\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/beautifier-prettier/commit/f89dc2a44fcc17d0c0573d72733e1867780bae85\">f89dc2a</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                chore(deps): update dependency @types/node to v10.9.3\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"renovate-bot\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"25180681\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/renovate-bot\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/25180681\" width=\"16\" height=\"16\" alt=\"@renovate-bot\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181133334,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9ad719b59e72cc8b192a051fc5b5837fec2e49609b55a5d2eb02c1faa32a85c7\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/beautifier-prettier/commit/89a40119cf07b1bf447f80284e121f2fb8a89421\">89a4011</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                chore(deps): update dependency typescript to v3\n              </blockquote>\n            </div>\n          </li>\n\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\" data-hydro-view=\"{&quot;event_type&quot;:&quot;news_feed.event.view&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181131132,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-view-hmac=\"fb5c476a0d53773e10407e173ca1ead445d51a9f06db76e8ae25535d068858c5\">\n    <span>1 commit to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181131132,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"e53ef6534cd563b61fa9cbb68b577c1e7a714e9b852abc9e244a759cf0e53c9e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/Unibeautify/beautifier-prettier/tree/master\">master</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"renovate-bot\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"25180681\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/renovate-bot\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/25180681\" width=\"16\" height=\"16\" alt=\"@renovate-bot\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:116593820,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8181131132,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"d51d377875975577e071edddb8d24ca88f11e101d169d18725d59bdb6aee5512\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/beautifier-prettier/commit/f89dc2a44fcc17d0c0573d72733e1867780bae85\">f89dc2a</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                chore(deps): update dependency @types/node to v10.9.3\n              </blockquote>\n            </div>\n          </li>\n\n\n      </ul>\n    </div>\n</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:108660666,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180600027,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"5cd436d44a8f273b279d168031df7b26b2d4dac4bb6666aa7ce405b595f44567\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/156685\" width=\"32\" height=\"32\" alt=\"@MarkEWaite\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:108660666,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180600027,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"5cd436d44a8f273b279d168031df7b26b2d4dac4bb6666aa7ce405b595f44567\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\">MarkEWaite</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:108660666,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180600027,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c1a25642e373de4fc0c65ca69439af6d81bc8bc921c0c35292a1c16a4a07100d\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite/training-pipeline-fundamentals\">MarkEWaite/training-pipeline-fundamentals</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T19:59:57Z\" title=\"Aug 28, 2018, 12:59 PM PDT\">4 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:108660666,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180600027,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b721558768d930f37bf47ffe81977764638b2c6360f13a6407e5240cf0d46473\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/MarkEWaite/training-pipeline-fundamentals/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"MarkEWaite\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:108660666,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180600027,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"210afc460025172fa81fbb49e21f0ee31fa00fe368968d0d186cf632dfe5e9b8\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-pipeline-fundamentals/commit/ae0ec6fafc96ca019663531bc084309d8d828a6e\">ae0ec6f</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #173 from romenrg/master\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"romenrg\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"1831480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/romenrg\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/1831480\" width=\"16\" height=\"16\" alt=\"@romenrg\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:108660666,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180600027,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"210afc460025172fa81fbb49e21f0ee31fa00fe368968d0d186cf632dfe5e9b8\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-pipeline-fundamentals/commit/dafbb23b65df7af6b6795f04f18eb82c9dfa40a8\">dafbb23</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Replacing Domain Scripting Language by Domain-specific Language\n                    </blockquote>\n                  </div>\n                </li>\n\n\n                <li class=\"f6 mt-2\">\n                  <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:108660666,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180600027,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"f948b5fabc6f5a93f373f2db6e85d08406a5f59a6e5a4655313859fac6c10997\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/MarkEWaite/training-pipeline-fundamentals/compare/5803034b54...ae0ec6fafc\">13 more commits »</a>\n                </li>\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/156685\" width=\"32\" height=\"32\" alt=\"@MarkEWaite\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180355570,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"008ab5a9162e233244f1b88037469262d5f093ec87a2531b8cb164d1ae255165\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\">MarkEWaite</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180355570,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"bb7ceca36afb66b4179b126ed5b96b087fb5982cf6ba3aa8862b87b03ef2b7de\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite/training-commons\">MarkEWaite/training-commons</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T19:12:14Z\" title=\"Aug 28, 2018, 12:12 PM PDT\">5 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n              <button class=\"btn-link text-gray-dark no-underline js-details-target\" aria-expanded=\"false\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:null,&quot;event_group&quot;:{&quot;type&quot;:&quot;PushEvent&quot;,&quot;quantity&quot;:2,&quot;includes_viewer&quot;:false},&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event_group&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:null,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b9bf2e03889abe8e71988dcf31d59362b69d73e9d9d73004b6e6d4d317efebc4\" data-ga-click=\"News feed, event_group click, Event click type: target:\">\n                <span class=\"Details-content--shown\">\n                  <svg class=\"octicon octicon-unfold link-gray mr-1\" aria-label=\"Expand\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.5 7.5L14 10c0 .55-.45 1-1 1H9v-1h3.5l-2-2h-7l-2 2H5v1H1c-.55 0-1-.45-1-1l2.5-2.5L0 5c0-.55.45-1 1-1h4v1H1.5l2 2h7l2-2H9V4h4c.55 0 1 .45 1 1l-2.5 2.5zM6 6h2V3h2L7 0 4 3h2v3zm2 3H6v3H4l3 3 3-3H8V9z\"></path></svg>\n                </span>\n                <span class=\"Details-content--hidden\">\n                  <svg class=\"octicon octicon-fold link-gray mr-1\" aria-label=\"Collapse\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 9l3 3H8v3H6v-3H4l3-3zm3-6H8V0H6v3H4l3 3 3-3zm4 2c0-.55-.45-1-1-1h-2.5l-1 1h3l-2 2h-7l-2-2h3l-1-1H1c-.55 0-1 .45-1 1l2.5 2.5L0 10c0 .55.45 1 1 1h2.5l1-1h-3l2-2h7l2 2h-3l1 1H13c.55 0 1-.45 1-1l-2.5-2.5L14 5z\"></path></svg>\n                </span>\n</button>          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>4 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180355570,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"e67979f3817ff9a11de3e59e1422bf665eb351d0af5b9e005ea9ffde1d362258\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/MarkEWaite/training-commons/tree/master\">master</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"Mark Waite\">\n              <img class=\"mr-1\" width=\"16\" height=\"16\" alt=\"\" src=\"./GitHub_files/68747470733a2f2f302e67726176617461722e636f6d2f6176617461722f66613061306162633966653964376265626632623363366264336232356161623f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d616765732532466772617661746172732532466772617\" data-canonical-src=\"https://0.gravatar.com/avatar/fa0a0abc9fe9d7bebf2b3c6bd3b25aab?d=https%3A%2F%2Fassets-cdn.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png&amp;r=g&amp;s=140\">\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180355570,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ce446448191fce44ead199ddc7166ce7019c2c6f74ae7b5735d4bc03fb985242\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-commons/commit/633844c53659a21061f41b85b931f9f13b275ee4\">633844c</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Add style guidelines\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"StackScribe\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"6428027\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/StackScribe\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/6428027\" width=\"16\" height=\"16\" alt=\"@StackScribe\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180355570,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ce446448191fce44ead199ddc7166ce7019c2c6f74ae7b5735d4bc03fb985242\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-commons/commit/52c39f86cf870a5d3ce6dae4c08e07feefa52903\">52c39f8</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #180 from MarkEWaite/add-style-guidelines\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180355570,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"5f251a4724858291978018e6dc34a63eaa217031775cf44e9b5bc7c33c894fe1\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/MarkEWaite/training-commons/compare/fa1a13b26c...086f0055ce\">\n              2 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\" data-hydro-view=\"{&quot;event_type&quot;:&quot;news_feed.event.view&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180352976,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-view-hmac=\"b339d70a9072b8459bd0b1d6ef31d648952e680d6da9f217382b8ae1935d0a3b\">\n    <span>3 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180352976,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"da948f7fb6ac8222e820da63acfc731dece980b52811f744fb39663426a24889\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/MarkEWaite/training-commons/tree/add-style-guidelines\">add-style-guidelines</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"StackScribe\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"6428027\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/StackScribe\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/6428027\" width=\"16\" height=\"16\" alt=\"@StackScribe\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180352976,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"988fee8117d2992c5252a4c06fb06147fad62dcbcb2a73196440a50fc8d3a906\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-commons/commit/52c39f86cf870a5d3ce6dae4c08e07feefa52903\">52c39f8</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #180 from MarkEWaite/add-style-guidelines\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"darinpope\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/121270\" width=\"16\" height=\"16\" alt=\"@darinpope\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180352976,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"988fee8117d2992c5252a4c06fb06147fad62dcbcb2a73196440a50fc8d3a906\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-commons/commit/fbd472031c40913a508b19ca82bb65baf89a420e\">fbd4720</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                align to style guide\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:114914006,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180352976,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"307c8f92213ed5e65819a00a368645a9d2b5ffe8ba65f990d245508802d71f4c\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/MarkEWaite/training-commons/compare/633844c536...086f0055ce\">\n              1 more commit »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"1831480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/romenrg\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/1831480(1)\" width=\"32\" height=\"32\" alt=\"@romenrg\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"1831480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:146322339,&quot;actor_id&quot;:1831480,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180248721,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"946cf59c677934aba078768fd8613e4ee0756c81563468e582fa8b2e2fcb5ef0\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/romenrg\" aria-describedby=\"hovercard-aria-description\">romenrg</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:146322339,&quot;actor_id&quot;:1831480,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180248721,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0a0afb542a12e50690568c468a3ae6f7c271c1595338a68cc41c22266575158e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/romenrg/training-pipeline-fundamentals\">romenrg/training-pipeline-fundamentals</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T18:51:48Z\" title=\"Aug 28, 2018, 11:51 AM PDT\">5 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>4 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:146322339,&quot;actor_id&quot;:1831480,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180248721,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"d4137115927e3fc3f35bc482343e17e499e204698a2bbcbd5b1d4d790ee8da92\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/romenrg/training-pipeline-fundamentals/tree/master\">master</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"romenrg\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"1831480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/romenrg\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/1831480\" width=\"16\" height=\"16\" alt=\"@romenrg\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:146322339,&quot;actor_id&quot;:1831480,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180248721,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2caf64d52c07a64bb9f2c42f515e44de4448edf09e24e7984867139093289e4a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/romenrg/training-pipeline-fundamentals/commit/dafbb23b65df7af6b6795f04f18eb82c9dfa40a8\">dafbb23</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Replacing Domain Scripting Language by Domain-specific Language\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"Meg McRoberts\">\n              <img class=\"mr-1\" width=\"16\" height=\"16\" alt=\"\" src=\"./GitHub_files/68747470733a2f2f322e67726176617461722e636f6d2f6176617461722f33336662363934383461353030623538386564326533613831356266623238623f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d616765732532466772617661746172732532466772617\" data-canonical-src=\"https://2.gravatar.com/avatar/33fb69484a500b588ed2e3a815bfb28b?d=https%3A%2F%2Fassets-cdn.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png&amp;r=g&amp;s=140\">\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:146322339,&quot;actor_id&quot;:1831480,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180248721,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2caf64d52c07a64bb9f2c42f515e44de4448edf09e24e7984867139093289e4a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/romenrg/training-pipeline-fundamentals/commit/f7334a4793c17c724f2533d52155c5641fa8aa17\">f7334a4</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #171 from romenrg/master\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:146322339,&quot;actor_id&quot;:1831480,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180248721,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"313b6f08f4280493b21f8d4c27dca026f036831aa1453fdaeddc682736439da3\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/romenrg/training-pipeline-fundamentals/compare/fed17aa9d0...dafbb23b65\">\n              2 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/8315038\" width=\"32\" height=\"32\" alt=\"@szeck87\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180164468,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c4c6a84d4fd0f48c004cccb18df5a1c364d6cb7d802d088d536164de0ff043a9\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\">szeck87</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180164468,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"d60053b82625d1fb4f8b9584b8b00c03a14102129059bb03388e6a54b014a2ac\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/Unibeautify/unibeautify\">Unibeautify/unibeautify</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T18:36:12Z\" title=\"Aug 28, 2018, 11:36 AM PDT\">5 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>7 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180164468,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ccf85656f1118c3e124bc4a8c1779a6de439e8c53eadb1bb40c1b55db8631bc9\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/Unibeautify/unibeautify/tree/sqlformat-options\">sqlformat-options</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"Renovate Bot\">\n              <img class=\"mr-1\" width=\"16\" height=\"16\" alt=\"\" src=\"./GitHub_files/68747470733a2f2f312e67726176617461722e636f6d2f6176617461722f39313437653130373636323339313334326362393362613933663633633162343f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d616765732532466772617661746172732532466772617\" data-canonical-src=\"https://1.gravatar.com/avatar/9147e107662391342cb93ba93f63c1b4?d=https%3A%2F%2Fassets-cdn.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png&amp;r=g&amp;s=140\">\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180164468,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"1ce4a0dc092c8bacf3b0162e7b93fbfaa74c122f133cf4ffa9f9b6761e767908\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/a7395927ddabc455a7bc39e99b41599da736ed3e\">a739592</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update dependency istanbul-api to v2\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"szeck87\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8315038(1)\" width=\"16\" height=\"16\" alt=\"@szeck87\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180164468,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"1ce4a0dc092c8bacf3b0162e7b93fbfaa74c122f133cf4ffa9f9b6761e767908\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/771cf0d6ac10840cfb1d2d034ee9d2b30d03df18\">771cf0d</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #170 from Unibeautify/renovate/istanbul-api-2.x\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180164468,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"403c68529f6836dc29f79c3c3da14ef395762b330a809e8d76a061b454bd28f3\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/Unibeautify/unibeautify/compare/a86f513011...6b7940c8cb\">\n              5 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133072891,&quot;actor_id&quot;:6428027,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180054187,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ecefa5a07c0a1e1ff508080ba7e1b98cdff47cccf0f30a3c89519c43c9267afc\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"6428027\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/StackScribe\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/6428027(1)\" width=\"32\" height=\"32\" alt=\"@StackScribe\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"6428027\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133072891,&quot;actor_id&quot;:6428027,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180054187,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ecefa5a07c0a1e1ff508080ba7e1b98cdff47cccf0f30a3c89519c43c9267afc\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/StackScribe\" aria-describedby=\"hovercard-aria-description\">StackScribe</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133072891,&quot;actor_id&quot;:6428027,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180054187,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"de78159d2308edd12ff39290fc71cd3d607b50bc0bacef4a22405b5e6638d80b\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/cloudbees/training-toolkit\">cloudbees/training-toolkit</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T18:15:49Z\" title=\"Aug 28, 2018, 11:15 AM PDT\">6 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133072891,&quot;actor_id&quot;:6428027,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180054187,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"7387882448e6cef9a66b08c97f12b04eba2642bad8ff458502bee4de7c1fc219\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/cloudbees/training-toolkit/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"StackScribe\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"6428027\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/StackScribe\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/6428027\" width=\"16\" height=\"16\" alt=\"@StackScribe\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133072891,&quot;actor_id&quot;:6428027,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180054187,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"7eab58b2a43a698a265d2cd46801e1a4d663e28f0f667ba029805b72977d1d49\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-toolkit/commit/990d4d620b86705792fbe4d6ed079dcdcb6aff0b\">990d4d6</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #25 from MarkEWaite/create-packer-cache-dir-if-mis…\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"MarkEWaite\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133072891,&quot;actor_id&quot;:6428027,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180054187,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"7eab58b2a43a698a265d2cd46801e1a4d663e28f0f667ba029805b72977d1d49\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-toolkit/commit/412a9db5d42da86a7cc90295709857d469cf5805\">412a9db</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      [EVANGELISM-1542] Create packer cache dir if it does not exist\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:67829803,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180032983,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"4f63f4816f7f56cf5d2b92e794bc89b11e3a2469eb9b737732b0d2b3f0ed3dda\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/121270(1)\" width=\"32\" height=\"32\" alt=\"@darinpope\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:67829803,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180032983,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"4f63f4816f7f56cf5d2b92e794bc89b11e3a2469eb9b737732b0d2b3f0ed3dda\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\">darinpope</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:67829803,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180032983,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"02a9ccc99b3bceff1968eeff6f28836bdb7afbacee97b68db649bcc2d2ceb824\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope/support-kb-articles\">darinpope/support-kb-articles</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T18:12:23Z\" title=\"Aug 28, 2018, 11:12 AM PDT\">6 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:67829803,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180032983,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6ecefc0240eac889b13abd5ee1c783481d92dd6d955739c14d173c322ff7746a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/darinpope/support-kb-articles/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"duemir\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"348580\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/duemir\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/348580\" width=\"16\" height=\"16\" alt=\"@duemir\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:67829803,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180032983,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"dd5c792a2a44bf0fb559412a5ae015a2b7246b0898934c0287deebfcbb788982\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/support-kb-articles/commit/038a16091c62766232e81646c209dc3cae36cba9\">038a160</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #1360 from omehegan/no-space-left\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"omehegan\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"1775894\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/omehegan\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/1775894\" width=\"16\" height=\"16\" alt=\"@omehegan\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:67829803,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180032983,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"dd5c792a2a44bf0fb559412a5ae015a2b7246b0898934c0287deebfcbb788982\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/support-kb-articles/commit/34a03d55650a9c2286e177144d5cd8225194995d\">34a03d5</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Add KB article on troubleshooting full disk\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:101647123,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180031590,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"03706384f871b59619aa6f0b9b20ec375b2d6e1090edcccb3db13e3658ecadcf\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/121270(1)\" width=\"32\" height=\"32\" alt=\"@darinpope\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:101647123,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180031590,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"03706384f871b59619aa6f0b9b20ec375b2d6e1090edcccb3db13e3658ecadcf\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\">darinpope</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:101647123,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180031590,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b210373181235b6f363a1a02ea370ae1b4c2948f4104794f71c07bf98c1a7740\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope/cbn-site\">darinpope/cbn-site</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T18:12:10Z\" title=\"Aug 28, 2018, 11:12 AM PDT\">6 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:101647123,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180031590,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"1dd11758c01be69f4f18f0a8fb9a04d46ce5b54e58cc85eb90fc92ee6979bd9d\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/darinpope/cbn-site/tree/develop\">develop</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"MarkEWaite\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:101647123,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180031590,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0550c31e203b180c991f4f4a41040ff30b5abd370cff2816aebea776db467ec8\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/cbn-site/commit/4744ee2beffac87c68119bb694176ec2516f5b3f\">4744ee2</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #889 from fdonze/TIGER-5113\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"MarkEWaite\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:101647123,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180031590,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0550c31e203b180c991f4f4a41040ff30b5abd370cff2816aebea776db467ec8\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/cbn-site/commit/d3085543bd08041d91e0fa2240bec0b5bccdc0d6\">d308554</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge branch 'develop' into TIGER-5113\n                    </blockquote>\n                  </div>\n                </li>\n\n\n                <li class=\"f6 mt-2\">\n                  <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:101647123,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180031590,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"634c0d729758a2817a20049226ec634be41afbbeb0f1e2fdfc57610316495bc6\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/darinpope/cbn-site/compare/2dc4a0a7df...4744ee2bef\">1 more commits »</a>\n                </li>\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823170,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180026980,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"adb24f0ebf57cb0c799b19e34007877ff267a576bf543a56c7b2de399866fba1\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/121270(1)\" width=\"32\" height=\"32\" alt=\"@darinpope\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823170,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180026980,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"adb24f0ebf57cb0c799b19e34007877ff267a576bf543a56c7b2de399866fba1\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\">darinpope</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823170,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180026980,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"808fed085c485e570ca7ee698d2cb5e75d1f89a0eb097ba940b52d9889f0153a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope/training-pipeline-fundamentals\">darinpope/training-pipeline-fundamentals</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T18:11:25Z\" title=\"Aug 28, 2018, 11:11 AM PDT\">6 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823170,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180026980,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"cd6a94243af6e73839c76cd5ae4f0124d461a18347ef6166b5ec6399846c093d\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/darinpope/training-pipeline-fundamentals/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"StackScribe\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"6428027\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/StackScribe\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/6428027\" width=\"16\" height=\"16\" alt=\"@StackScribe\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823170,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180026980,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"91cb0c882e65bb86156541e3c9419bd3185c1f462ac97c18d71ca7c3cdf3fc21\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/training-pipeline-fundamentals/commit/a7e6d8c285873eb47d5a4df4b3e6d7f6513f6e34\">a7e6d8c</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #172 from darinpope/style-guide-changes\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"darinpope\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/121270\" width=\"16\" height=\"16\" alt=\"@darinpope\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823170,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8180026980,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"91cb0c882e65bb86156541e3c9419bd3185c1f462ac97c18d71ca7c3cdf3fc21\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/training-pipeline-fundamentals/commit/88b3c50c41da7bfc8ca25e5496ce5df9ac096fbe\">88b3c50</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      align to style guide\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/156685\" width=\"32\" height=\"32\" alt=\"@MarkEWaite\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179986428,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"515a1e17174502a3ea7832025457cbe63cdc6d45ea5da2be6baafe5ea7e5382d\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\">MarkEWaite</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179986428,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"82bd94e1975a179bb5fa0bcafee0f088c42c18b81630202d1e8e0238099bbaf8\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite/training-toolkit\">MarkEWaite/training-toolkit</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T18:02:56Z\" title=\"Aug 28, 2018, 11:02 AM PDT\">6 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n              <button class=\"btn-link text-gray-dark no-underline js-details-target\" aria-expanded=\"false\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:null,&quot;event_group&quot;:{&quot;type&quot;:&quot;PushEvent&quot;,&quot;quantity&quot;:3,&quot;includes_viewer&quot;:false},&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event_group&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:null,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0f049836ef84433bc169b56bc718debdda337eccfdabe87617b19bbde3561e6c\" data-ga-click=\"News feed, event_group click, Event click type: target:\">\n                <span class=\"Details-content--shown\">\n                  <svg class=\"octicon octicon-unfold link-gray mr-1\" aria-label=\"Expand\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.5 7.5L14 10c0 .55-.45 1-1 1H9v-1h3.5l-2-2h-7l-2 2H5v1H1c-.55 0-1-.45-1-1l2.5-2.5L0 5c0-.55.45-1 1-1h4v1H1.5l2 2h7l2-2H9V4h4c.55 0 1 .45 1 1l-2.5 2.5zM6 6h2V3h2L7 0 4 3h2v3zm2 3H6v3H4l3 3 3-3H8V9z\"></path></svg>\n                </span>\n                <span class=\"Details-content--hidden\">\n                  <svg class=\"octicon octicon-fold link-gray mr-1\" aria-label=\"Collapse\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 9l3 3H8v3H6v-3H4l3-3zm3-6H8V0H6v3H4l3 3 3-3zm4 2c0-.55-.45-1-1-1h-2.5l-1 1h3l-2 2h-7l-2-2h3l-1-1H1c-.55 0-1 .45-1 1l2.5 2.5L0 10c0 .55.45 1 1 1h2.5l1-1h-3l2-2h7l2 2h-3l1 1H13c.55 0 1-.45 1-1l-2.5-2.5L14 5z\"></path></svg>\n                </span>\n</button>          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>2 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179986428,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6480cd24f3ac5bc6d1331823153cc5b3de073e3f54ece4d2eb7f51b3ab8be29f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/MarkEWaite/training-toolkit/tree/create-packer-cache-dir-if-missing\">create-packer-cache-dir-if-missing</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179986428,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"33c060f28cac4528a7dd66e2fc59aefb0b8519caab9f025fd30d4e2b18f4848a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-toolkit/commit/412a9db5d42da86a7cc90295709857d469cf5805\">412a9db</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                [EVANGELISM-1542] Create packer cache dir if it does not exist\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179986428,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"33c060f28cac4528a7dd66e2fc59aefb0b8519caab9f025fd30d4e2b18f4848a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-toolkit/commit/9983bb29bea1228667bf7dd4b94e9698bd38971b\">9983bb2</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Create packer cache dir if it does not exist\n              </blockquote>\n            </div>\n          </li>\n\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\" data-hydro-view=\"{&quot;event_type&quot;:&quot;news_feed.event.view&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179766135,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-view-hmac=\"2abbdf64f3ad41ab12d56e6ff8dbebc852e831017c64fb5077966db22cea65ce\">\n    <span>5 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179766135,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c09a5ec58f0f7e7671eba766d95cbe331c89e431a05649ab97cade5642264888\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/MarkEWaite/training-toolkit/tree/master\">master</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179766135,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"07cc1653e3969c3638c94877ce359074b0ad841bff2860155218f84f60b69548\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-toolkit/commit/d7790be9edc7ef3cf2a1d2c8e80d4feabf027dc7\">d7790be</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Remove leading tabs from TnT\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179766135,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"07cc1653e3969c3638c94877ce359074b0ad841bff2860155218f84f60b69548\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/MarkEWaite/training-toolkit/commit/4895110d39d5201626661ca5f9b750f19e1ef4c2\">4895110</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Remove duplicate blank lines from TnT\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:140765390,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179766135,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"e629d770286e69f4298c4c66ca70b4d1d7f3525b22011943d854494bde3ff93b\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/MarkEWaite/training-toolkit/compare/2363bd6b5a...aa1e7e7bf1\">\n              3 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"follow\"><div class=\"body\">\n<!-- follow -->\n  <div class=\"d-flex flex-items-baseline border-bottom border-gray py-3\">\n      <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"a9a1cc4b9eff764f4414189696f058fc85489e8bffd7c168b302d7af09214040\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:actor\" data-hovercard-user-id=\"669104\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/JesseScott\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/669104\" width=\"32\" height=\"32\" alt=\"@JesseScott\"></a>\n</span>\n\n\n    <div class=\"d-flex flex-column width-full\">\n        <div class=\"d-flex flex-items-baseline\">\n          <div>\n            <a data-hovercard-user-id=\"669104\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"a9a1cc4b9eff764f4414189696f058fc85489e8bffd7c168b302d7af09214040\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/JesseScott\" aria-describedby=\"hovercard-aria-description\">JesseScott</a>\n            started following\n              you\n            <span class=\"f6 text-gray-light no-wrap ml-1\">\n              <relative-time datetime=\"2018-08-28T16:18:34Z\" title=\"Aug 28, 2018, 9:18 AM PDT\">8 hours ago</relative-time>\n            </span>\n          </div>\n        </div>\n\n        <div class=\"Box p-3 mt-2\">\n          <div class=\"d-flex\">\n              <a title=\"JesseScott\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"a9a1cc4b9eff764f4414189696f058fc85489e8bffd7c168b302d7af09214040\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:actor\" href=\"https://github.com/JesseScott\"><img class=\"avatar mr-2\" alt=\"JesseScott\" src=\"./GitHub_files/669104(1)\" width=\"40\" height=\"40\"></a>\n            <div class=\"width-full ml-1\">\n              <span class=\"lh-condensed text-gray-dark\">\n\n                <span class=\"mr-1\">\n                      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"a9a1cc4b9eff764f4414189696f058fc85489e8bffd7c168b302d7af09214040\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:actor\" class=\"f4 text-bold link-gray-dark no-underline\" href=\"https://github.com/JesseScott\">Jesse Scott</a>\n                      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"a9a1cc4b9eff764f4414189696f058fc85489e8bffd7c168b302d7af09214040\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:actor\" class=\"f5 link-gray no-underline\" href=\"https://github.com/JesseScott\">JesseScott</a>\n                </span>\n\n                  \n<span class=\"float-right d-inline-block user-following-container js-toggler-container js-social-container \">\n\n  <!-- '\"` --><!-- </textarea></xmp> --><form class=\"follow\" data-remote=\"true\" action=\"https://github.com/users/follow?target=JesseScott\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"✓\"><input type=\"hidden\" name=\"authenticity_token\" value=\"/Q55g+47XufCcgcXnHAU1dRsAFYSp9blDs8ztibaEVPBeU8O8lE5u0vkMp06WgSY9QpbsYXxluq6H7K1ULTy1g==\">\n    <button name=\"button\" type=\"submit\" class=\"btn btn-sm ml-2 mb-2 js-toggler-target\" aria-label=\"Follow this person\" title=\"Follow JesseScott\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;follow&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"f6a1a9cd61efe9041cd648644e27978de030d5ad910d211521561842d0819e9c\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:follow\">Follow</button>\n</form>\n  <!-- '\"` --><!-- </textarea></xmp> --><form class=\"unfollow\" data-remote=\"true\" action=\"https://github.com/users/unfollow?target=JesseScott\" accept-charset=\"UTF-8\" method=\"post\"><input name=\"utf8\" type=\"hidden\" value=\"✓\"><input type=\"hidden\" name=\"authenticity_token\" value=\"SUO73ayNgjSklfZYXZj5RBeleDGwk5YHG6PtE1Da7KrbrFwi4dhysM+bB1eW9q/8wFZ5tj20lwS/JJYmgagoPw==\">\n    <button name=\"button\" type=\"submit\" class=\"btn btn-sm ml-2 mb-2 js-toggler-target\" aria-label=\"Unfollow this person\" title=\"Unfollow JesseScott\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;unfollow&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"898bca4eebf5e0bbfa33eefcad9c48173dd13589a3070c27ada8a521563edd19\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:unfollow\">Unfollow</button>\n</form></span>\n\n              </span>\n\n                  <div class=\"dashboard-break-word lh-condensed mb-2 mt-1 bio\">\n                    <div>\"Jesse Scott creates and exhibits work in the genre formerly known as new media.\" </div>\n                  </div>\n\n              <p class=\"f6 text-gray m-0\">\n                    <span class=\"mr-3\">\n                      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repositories&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"60a29930a0615f1d145f5c6d3d3c175e25a2cfacf2f4afcba3875b6c09870291\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:repositories\" class=\"muted-link\" href=\"https://github.com/JesseScott?tab=repositories\">78 repositories</a>\n                    </span>\n                    <span>\n                      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:null,&quot;actor_id&quot;:669104,&quot;public&quot;:false,&quot;type&quot;:&quot;FollowEvent&quot;,&quot;target_id&quot;:1958953,&quot;id&quot;:8179394765,&quot;additional_details_shown&quot;:true,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;followers&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"7a34598e7aa70cae4fd797830952e1f3c926e88c45a7f52ee2ecf6857b6cd883\" data-ga-click=\"News feed, event click, Event click type:FollowEvent target:followers\" class=\"muted-link\" href=\"https://github.com/JesseScott?tab=followers\">144 followers</a>\n                    </span>\n              </p>\n            </div>\n          </div>\n        </div>\n    </div>\n  </div>\n</div></div>\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179357997,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"375a3ed0032903ac6315c409a79a92c3ea44bc385e15eb394e3aab96950415ff\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"26594\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/rtyler\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/26594\" width=\"32\" height=\"32\" alt=\"@rtyler\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"26594\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179357997,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"375a3ed0032903ac6315c409a79a92c3ea44bc385e15eb394e3aab96950415ff\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/rtyler\" aria-describedby=\"hovercard-aria-description\">rtyler</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179357997,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9a64f97869ccbf0637ca137671a1c152390890cc9eeb8f570a8aa76f97dceb6f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkins-infra/evergreen\">jenkins-infra/evergreen</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T16:09:10Z\" title=\"Aug 28, 2018, 9:09 AM PDT\">8 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179357997,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0fb0f953e28ae53da952f44d0fac6ff18771b3d054562c28cf741d79b7087b52\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkins-infra/evergreen/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"rtyler\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"26594\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/rtyler\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/26594(1)\" width=\"16\" height=\"16\" alt=\"@rtyler\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179357997,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"329eb2ba1b1b91993370b2c90e3d65e5c59c01c81b7afb280e4cd529c98a5037\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/evergreen/commit/32a278882aee26f7075e2c219a76dcbacc7b7532\">32a2788</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #205 from batmat/JENKINS-53285\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"batmat\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"223853\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/batmat\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/223853\" width=\"16\" height=\"16\" alt=\"@batmat\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179357997,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"329eb2ba1b1b91993370b2c90e3d65e5c59c01c81b7afb280e4cd529c98a5037\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/evergreen/commit/cff09bee537285bfc47c00085573748d5ed201db\">cff09be</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      :facepalm:\n                    </blockquote>\n                  </div>\n                </li>\n\n\n                <li class=\"f6 mt-2\">\n                  <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8179357997,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"45d22e77312aa306fd9fe411422d05ff8979b340cb2588b99af2df6817969796\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/jenkins-infra/evergreen/compare/041c7aa1af...32a278882a\">3 more commits »</a>\n                </li>\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/39524986\" width=\"32\" height=\"32\" alt=\"@atreadway\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178744376,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6daec3e862d078a6db7b8424aab256c80c481a2232b62eacb93c2212591540e4\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\">atreadway</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178744376,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"8cf1d569584e0828891389d17d8bcda83d370f7e987eac9f634cbc0cf551339d\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/atreadway/cbn-site\">atreadway/cbn-site</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T14:34:51Z\" title=\"Aug 28, 2018, 7:34 AM PDT\">9 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n              <button class=\"btn-link text-gray-dark no-underline js-details-target\" aria-expanded=\"false\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:null,&quot;event_group&quot;:{&quot;type&quot;:&quot;PushEvent&quot;,&quot;quantity&quot;:4,&quot;includes_viewer&quot;:false},&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event_group&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:null,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"40a917100c1168a5168743592aa75dbae82f83db15f1bc4e503029b0f28970d4\" data-ga-click=\"News feed, event_group click, Event click type: target:\">\n                <span class=\"Details-content--shown\">\n                  <svg class=\"octicon octicon-unfold link-gray mr-1\" aria-label=\"Expand\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.5 7.5L14 10c0 .55-.45 1-1 1H9v-1h3.5l-2-2h-7l-2 2H5v1H1c-.55 0-1-.45-1-1l2.5-2.5L0 5c0-.55.45-1 1-1h4v1H1.5l2 2h7l2-2H9V4h4c.55 0 1 .45 1 1l-2.5 2.5zM6 6h2V3h2L7 0 4 3h2v3zm2 3H6v3H4l3 3 3-3H8V9z\"></path></svg>\n                </span>\n                <span class=\"Details-content--hidden\">\n                  <svg class=\"octicon octicon-fold link-gray mr-1\" aria-label=\"Collapse\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 9l3 3H8v3H6v-3H4l3-3zm3-6H8V0H6v3H4l3 3 3-3zm4 2c0-.55-.45-1-1-1h-2.5l-1 1h3l-2 2h-7l-2-2h3l-1-1H1c-.55 0-1 .45-1 1l2.5 2.5L0 10c0 .55.45 1 1 1h2.5l1-1h-3l2-2h7l2 2h-3l1 1H13c.55 0 1-.45 1-1l-2.5-2.5L14 5z\"></path></svg>\n                </span>\n</button>          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>22 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178744376,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c0b4909a005c066608edcff89a88dda935e63f7a856654ce415823b8550dc86c\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/atreadway/cbn-site/tree/atreadway-trials-getting-started-revamp\">atreadway-trials-getting-started-revamp</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"atreadway\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/39524986(1)\" width=\"16\" height=\"16\" alt=\"@atreadway\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178744376,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"dcf21fac64909fc5cb623919b280bd7b9b5db9549c23a6305c7de64ae1e504b7\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/1182ec353f6dda0358d7d9d68ea66cedd06d3ca7\">1182ec3</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                getting-started -&gt; trial-guide\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"atreadway\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"39524986\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/atreadway\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/39524986(1)\" width=\"16\" height=\"16\" alt=\"@atreadway\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178744376,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"dcf21fac64909fc5cb623919b280bd7b9b5db9549c23a6305c7de64ae1e504b7\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/c28d2d184f10a3cf6f24b461141fa4613b87543b\">c28d2d1</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Add screenshots for Trial Guide.\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178744376,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"fcb7e25e0590334dc9c01044766366c9b9631fba88a8f76194ccf8c421d299a2\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/atreadway/cbn-site/compare/1d7a6c080b...1182ec353f\">\n              20 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\" data-hydro-view=\"{&quot;event_type&quot;:&quot;news_feed.event.view&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178646076,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-view-hmac=\"ad15c6ae48934a4bba02edcba69e7f276ff16a8d67c059524ff1bb45e0447871\">\n    <span>3 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178646076,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0b62c48a9992e0f3c6ed95bcb97abf947c05ca3a59ee3f69caf9cd9d3abcb9cf\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/atreadway/cbn-site/tree/develop\">develop</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"Fabian Donze\">\n              <img class=\"mr-1\" width=\"16\" height=\"16\" alt=\"\" src=\"./GitHub_files/68747470733a2f2f312e67726176617461722e636f6d2f6176617461722f62396165623963336264363632386333383936366266373361336365666664343f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d616765732532466772617661746172732532466772617\" data-canonical-src=\"https://1.gravatar.com/avatar/b9aeb9c3bd6628c38966bf73a3ceffd4?d=https%3A%2F%2Fassets-cdn.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png&amp;r=g&amp;s=140\">\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178646076,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"231cb7b61c2b504f87618bba3521364d359c6ae98d5a667f1404ffd9d4473851\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/0cd4c44ffb15b8315679453f828e1e60d0b19078\">0cd4c44</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                [TIGER-5113] Autoscaling agent pool setup\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178646076,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"231cb7b61c2b504f87618bba3521364d359c6ae98d5a667f1404ffd9d4473851\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/atreadway/cbn-site/commit/d3085543bd08041d91e0fa2240bec0b5bccdc0d6\">d308554</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge branch 'develop' into TIGER-5113\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:141482248,&quot;actor_id&quot;:39524986,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178646076,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"e2b67c0bb909b9bc55234e2a18995b431ae890b92ba383c350866f73078d2e66\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/atreadway/cbn-site/compare/2dc4a0a7df...4744ee2bef\">\n              1 more commit »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"3728756\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/richbg\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/3728756\" width=\"32\" height=\"32\" alt=\"@richbg\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"3728756\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:134882310,&quot;actor_id&quot;:3728756,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178679382,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"3591d8f8158cdf109f7041a7f1b011222347ff2cecc04fc4dc428a1fcfdde567\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/richbg\" aria-describedby=\"hovercard-aria-description\">richbg</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:134882310,&quot;actor_id&quot;:3728756,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178679382,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2076789bf9cc6ecfecd2f4c94a9b00552c8fac7dab2642a06f801534774be912\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/richbg/cbn-site\">richbg/cbn-site</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T14:27:28Z\" title=\"Aug 28, 2018, 7:27 AM PDT\">9 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>25 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:134882310,&quot;actor_id&quot;:3728756,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178679382,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"5dcfbd529964a02514e2cd5820754a9691a3248bff51a868a5f2b0609093cbb5\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/richbg/cbn-site/tree/develop\">develop</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"Fabian Donze\">\n              <img class=\"mr-1\" width=\"16\" height=\"16\" alt=\"\" src=\"./GitHub_files/68747470733a2f2f312e67726176617461722e636f6d2f6176617461722f62396165623963336264363632386333383936366266373361336365666664343f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d616765732532466772617661746172732532466772617\" data-canonical-src=\"https://1.gravatar.com/avatar/b9aeb9c3bd6628c38966bf73a3ceffd4?d=https%3A%2F%2Fassets-cdn.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png&amp;r=g&amp;s=140\">\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:134882310,&quot;actor_id&quot;:3728756,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178679382,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b22217477574959e4394adca15cc9b597a5f042ddee1428d58ab886d29c4d5df\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/richbg/cbn-site/commit/0cd4c44ffb15b8315679453f828e1e60d0b19078\">0cd4c44</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                [TIGER-5113] Autoscaling agent pool setup\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:134882310,&quot;actor_id&quot;:3728756,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178679382,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b22217477574959e4394adca15cc9b597a5f042ddee1428d58ab886d29c4d5df\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/richbg/cbn-site/commit/d3085543bd08041d91e0fa2240bec0b5bccdc0d6\">d308554</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge branch 'develop' into TIGER-5113\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:134882310,&quot;actor_id&quot;:3728756,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178679382,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"4c7fee6f1abfb9fbc508612664ba333c5f1353db71f6366822a3baeeb8efcbbc\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/richbg/cbn-site/compare/dfe9d0b86b...2c7c7da80e\">\n              23 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:1380215,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178668675,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0eb55fb6b2b7293a0971c9c4e7941854c8e6209e81bed1208c789a425a26f93e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"1380215\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/mandie722\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/1380215\" width=\"32\" height=\"32\" alt=\"@mandie722\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"1380215\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:1380215,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178668675,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0eb55fb6b2b7293a0971c9c4e7941854c8e6209e81bed1208c789a425a26f93e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/mandie722\" aria-describedby=\"hovercard-aria-description\">mandie722</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:1380215,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178668675,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6f73cfd5b6c2f76689ee850338dfc52eecefecc6928b510a8fb1953519142d7f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkins-infra/evergreen\">jenkins-infra/evergreen</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T14:25:50Z\" title=\"Aug 28, 2018, 7:25 AM PDT\">9 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:1380215,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178668675,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"957be0e0277d5c3563b4f3b50297da3c7a5e382d37d0147533384188d4c1c3b5\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkins-infra/evergreen/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"mandie722\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"1380215\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/mandie722\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/1380215(1)\" width=\"16\" height=\"16\" alt=\"@mandie722\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:1380215,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178668675,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"289173c16fa2c80d0f3213ed7153a2429fcac58a7b436b439b5035f18697c794\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/evergreen/commit/041c7aa1af2cff3931e2423dca0b522334fb46f6\">041c7aa</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #202 from batmat/JENKINS-53147-rebrand-to-evergree…\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"batmat\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"223853\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/batmat\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/223853\" width=\"16\" height=\"16\" alt=\"@batmat\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:1380215,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178668675,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"289173c16fa2c80d0f3213ed7153a2429fcac58a7b436b439b5035f18697c794\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/evergreen/commit/60d7dd621531e9859acb9c4b281ab9b60aa99a8b\">60d7dd6</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Add back essentials plugin's tombstoned release\n                    </blockquote>\n                  </div>\n                </li>\n\n\n                <li class=\"f6 mt-2\">\n                  <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:1380215,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178668675,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"02768ec6768c50b9b7870de7d64fa714ed67c8a44645e67ab4b7b958cf16ce43\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/jenkins-infra/evergreen/compare/c2eb763392...041c7aa1af\">1 more commits »</a>\n                </li>\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178540324,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9156535ee2bb969d5529cc7abc583a34a791eeda04285d9eeccd51957669b51e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"26594\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/rtyler\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/26594\" width=\"32\" height=\"32\" alt=\"@rtyler\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"26594\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178540324,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9156535ee2bb969d5529cc7abc583a34a791eeda04285d9eeccd51957669b51e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/rtyler\" aria-describedby=\"hovercard-aria-description\">rtyler</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178540324,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"5426872cc7443bc7c77c3f755bc8ceca9ceb8dc40a5ab69261740295a894d7fb\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkins-infra/evergreen\">jenkins-infra/evergreen</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T14:04:49Z\" title=\"Aug 28, 2018, 7:04 AM PDT\">10 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178540324,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c1f171e5fbb0606a6e22809c3e0bfdfabc1c7643c0692ad9095ba899e6030b64\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkins-infra/evergreen/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"rtyler\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"26594\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/rtyler\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/26594(1)\" width=\"16\" height=\"16\" alt=\"@rtyler\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178540324,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ca0c71f022a7fc344656d5a6c4f64bdd79142183eebc86b09740f5f9a495c8cb\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/evergreen/commit/c2eb76339294f571d5d8c0863a53e5bbf8c508dc\">c2eb763</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #204 from batmat/JENKINS-53286\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"batmat\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"223853\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/batmat\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/223853\" width=\"16\" height=\"16\" alt=\"@batmat\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:119078647,&quot;actor_id&quot;:26594,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178540324,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ca0c71f022a7fc344656d5a6c4f64bdd79142183eebc86b09740f5f9a495c8cb\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/evergreen/commit/3117ccac74fe401f2f45d8c47f1fbf37b340e24e\">3117cca</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      [JENKINS-53286] Enable Sentry user capturing\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/156685\" width=\"32\" height=\"32\" alt=\"@MarkEWaite\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178515628,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"bc79cd37b44b4b968c595a8d16a4f3ea752d876a37b86c435d5191c7afe8c046\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\">MarkEWaite</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178515628,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"cea2dbbfdb0799a7270f317c4f70f5135584e26ef350b6e633d88d82091b6c99\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/cloudbees/training-assets\">cloudbees/training-assets</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T14:01:42Z\" title=\"Aug 28, 2018, 7:01 AM PDT\">10 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>2 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178515628,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"e3eb5a13965cc3b05d285a13bcaf1a6834c2983138cab6019b8c1b916d69835e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/cloudbees/training-assets/tree/master\">master</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178515628,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"24c714d8a82af7c3a41e59c80cd05300406373cdf9acad2e61d7d45c50b2dc8e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-assets/commit/b182b6c0e8c669cd0489c19759acc1eb8c91cc1a\">b182b6c</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Create the 'romen' course infrastructure\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8178515628,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"24c714d8a82af7c3a41e59c80cd05300406373cdf9acad2e61d7d45c50b2dc8e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-assets/commit/edb9c52c4776607a8aef39e03f09e989786625bc\">edb9c52</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Create the namespace, don't just echo the command\n              </blockquote>\n            </div>\n          </li>\n\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/8787186\" width=\"32\" height=\"32\" alt=\"@liucc52\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8177744447,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"43122fe3a0ce814e14a9cd8745bcbe6372a85dca0eaf742089943daa046fa040\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\">liucc52</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8177744447,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"daaf77e134cb9ec69d2c66bc124a9dfa34b19c81c31c1017a7431b9a6003fad3\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkins-infra/cn.jenkins.io\">jenkins-infra/cn.jenkins.io</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T11:47:30Z\" title=\"Aug 28, 2018, 4:47 AM PDT\">12 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>6 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8177744447,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2c11f9a6a15e0ae65b0961a25f853ca104d46bc0e0d3fe40a455558dca5e07e4\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/tree/master\">master</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"liucc52\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8787186(1)\" width=\"16\" height=\"16\" alt=\"@liucc52\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8177744447,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"fc39495d64343fb1d73403d4df4efd01f0c40f1d4e4426e8593a1e5fa1f7abd2\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/commit/512d1b9f73d05f7b6a419101092f156405c23612\">512d1b9</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update Jenkinsfile\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"liucc52\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8787186(1)\" width=\"16\" height=\"16\" alt=\"@liucc52\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8177744447,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"fc39495d64343fb1d73403d4df4efd01f0c40f1d4e4426e8593a1e5fa1f7abd2\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/commit/a11b7b3b14636844510818717db1b95fcd1e6e36\">a11b7b3</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update Jenkinsfile\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8177744447,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"04ec03c45ceb65a96c7a35c31472cfda30fff30653b6bed608a95923af8feadf\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/compare/f7725b0ad5...512d1b9f73\">\n              4 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/8787186\" width=\"32\" height=\"32\" alt=\"@liucc52\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176231193,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"44b0415008c4320e98bc475e7c792cbf7e31775041cba064ba1773a575f69eaa\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\">liucc52</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176231193,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"65ed37507d657afc9237b607f81da9db3e0daf74aa3b648ef2b83b817a192be1\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkins-infra/cn.jenkins.io\">jenkins-infra/cn.jenkins.io</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T06:44:50Z\" title=\"Aug 27, 2018, 11:44 PM PDT\">17 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>3 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176231193,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6be144d974064f02e265d05662a432e8a5faeb36d226e2efc0c9370ede0bdff5\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/tree/master\">master</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"liucc52\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8787186(1)\" width=\"16\" height=\"16\" alt=\"@liucc52\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176231193,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6baee85c263e19a0e2f5d04e57c786493a4462373b204e6de682948d2e7bfb81\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/commit/f7725b0ad5c813680660a8da4d37980d62c2f93c\">f7725b0</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update ruby\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"liucc52\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8787186(1)\" width=\"16\" height=\"16\" alt=\"@liucc52\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176231193,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6baee85c263e19a0e2f5d04e57c786493a4462373b204e6de682948d2e7bfb81\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/commit/5ceeb59b8e03c388c2defc07202b79f4cd37d59b\">5ceeb59</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update ruby\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176231193,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"17a59dffe5c31cbf24a330c9836b3b5c0b42c188b65536e217e20eb58e9232b2\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/compare/04a487cb6e...f7725b0ad5\">\n              1 more commit »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176205036,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"120e1518fb2984ce654fba01ce9d688b33a8987dc13f4b5498e738dfbd632a95\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"3000480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/oleg-nenashev\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/3000480\" width=\"32\" height=\"32\" alt=\"@oleg-nenashev\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"3000480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176205036,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"120e1518fb2984ce654fba01ce9d688b33a8987dc13f4b5498e738dfbd632a95\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/oleg-nenashev\" aria-describedby=\"hovercard-aria-description\">oleg-nenashev</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176205036,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"a1fd5f84a3ba0c66ba545855d70ab3f5f8d39942fb942d60b7844641b8bb3d85\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkinsci/jep\">jenkinsci/jep</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-28T06:38:04Z\" title=\"Aug 27, 2018, 11:38 PM PDT\">17 hours ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176205036,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"7e5f80fcbdb56886d9b788fe123f683db02cbcb0166859621a41cf80f61758d3\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkinsci/jep/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"oleg-nenashev\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"3000480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/oleg-nenashev\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/3000480(1)\" width=\"16\" height=\"16\" alt=\"@oleg-nenashev\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176205036,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9dd91533622f47245024c58e612162e8cd8e649eb106832f1c0626fa6ac80400\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkinsci/jep/commit/49d2b150024a5521645b4ce189060df5aa0cadbb\">49d2b15</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #188 from rodrigc/jep-11-grammar-fix\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"Craig Rodrigues\">\n                    <img class=\"mr-1\" width=\"16\" height=\"16\" alt=\"\" src=\"./GitHub_files/68747470733a2f2f322e67726176617461722e636f6d2f6176617461722f63333036626430343464616330643531333664343932393530343064666431313f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d616765732532466772617661746172732532466772617\" data-canonical-src=\"https://2.gravatar.com/avatar/c306bd044dac0d5136d49295040dfd11?d=https%3A%2F%2Fassets-cdn.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png&amp;r=g&amp;s=140\">\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8176205036,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9dd91533622f47245024c58e612162e8cd8e649eb106832f1c0626fa6ac80400\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkinsci/jep/commit/3646b94539c6fe228c6e1b324572b0f7350feaad\">3646b94</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Grammar fix\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/8315038\" width=\"32\" height=\"32\" alt=\"@szeck87\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175700937,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"fa8b2148e2797560a5f416d8159564371ef551178b9f2f645eaf659095313fdc\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\">szeck87</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175700937,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"284509447f9d9c1a0a68b8cbad1d0fc6bd5143a63c90014f6ac7bd2232a1e324\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/Unibeautify/unibeautify\">Unibeautify/unibeautify</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T03:39:38Z\" title=\"Aug 27, 2018, 8:39 PM PDT\">20 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>4 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175700937,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2ae71aa2917116a32ff1ced3bf31b42477150ec7a97637b67bfccc056ea4187b\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/Unibeautify/unibeautify/tree/master\">master</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"renovate-bot\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"25180681\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/renovate-bot\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/25180681\" width=\"16\" height=\"16\" alt=\"@renovate-bot\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175700937,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"4370287bfd90ab2bb34302c8d30c5135c177fcda1600aec9742b341959019895\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/90ade4c6ae9d7986d044287f63f44fdef2a08a8f\">90ade4c</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update dependency istanbul-reports to v2\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"szeck87\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8315038(1)\" width=\"16\" height=\"16\" alt=\"@szeck87\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175700937,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"4370287bfd90ab2bb34302c8d30c5135c177fcda1600aec9742b341959019895\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/7e723da4b315b33e31bfd36a70ac590468740789\">7e723da</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #171 from Unibeautify/renovate/istanbul-reports-2.x\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:8315038,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175700937,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"59417e126ec91dfbb265f247add405ca9f9aabf1a7369e799fd2fbb746ca2842\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/Unibeautify/unibeautify/compare/22ff2474c6...7e723da4b3\">\n              2 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/8787186\" width=\"32\" height=\"32\" alt=\"@liucc52\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175669871,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"113bf9a81d3dd2a55cf716a5b9164b06d7737d360bc80518f18d3aa11063cef5\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\">liucc52</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175669871,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"aec0d465ba81649489b3f6ad65caac92c1edead9332cc9c79371dbe841dacd89\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkins-infra/cn.jenkins.io\">jenkins-infra/cn.jenkins.io</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T03:28:29Z\" title=\"Aug 27, 2018, 8:28 PM PDT\">20 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>2 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175669871,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"0ed436bc8d2ac1c4a8c24c2c1b408db0c6c2c8e67ae48c5f77233a701da34715\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/tree/master\">master</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"liucc52\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8787186(1)\" width=\"16\" height=\"16\" alt=\"@liucc52\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175669871,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"f03b7578a989acd62d941ff1e7ad9cec63c69a1fd6aad33ad8a6360b261f59b8\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/commit/04a487cb6ef583c666fde3171be517e7ba969484\">04a487c</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update Jenkinsfile\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"liucc52\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8787186\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/liucc52\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8787186(1)\" width=\"16\" height=\"16\" alt=\"@liucc52\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:122231986,&quot;actor_id&quot;:8787186,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175669871,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"f03b7578a989acd62d941ff1e7ad9cec63c69a1fd6aad33ad8a6360b261f59b8\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkins-infra/cn.jenkins.io/commit/8dacd8a56585ced30c32e02d6f547a92f5ef8c4e\">8dacd8a</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update Jenkinsfile\n              </blockquote>\n            </div>\n          </li>\n\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/156685\" width=\"32\" height=\"32\" alt=\"@MarkEWaite\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175649598,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"94430451bd34b8f260e43e80e6d101dd6f3d6c2795e413d7dcc39559a7aafd14\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\">MarkEWaite</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175649598,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"866fef2be18a9ca978b2c7047b900920382d4cb9cfc6aaa4cbabdff992e989c7\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/cloudbees/training-assets\">cloudbees/training-assets</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T03:21:02Z\" title=\"Aug 27, 2018, 8:21 PM PDT\">20 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>7 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175649598,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"bd5e87da849557603bd5f8b36ea611b7f74cf8c492c6f1379c12af567ab34922\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/cloudbees/training-assets/tree/master\">master</a>\n\n    <div class=\"commits pusher-is-only-committer\">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175649598,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"14dce0607a21fed24aee9e9fab0ee77ab03e2573845cd0d65c0e938ec2f812b5\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-assets/commit/a6b173ef49295b8cb35a653526df8eec57fb7386\">a6b173e</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Add installer loop script\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175649598,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"14dce0607a21fed24aee9e9fab0ee77ab03e2573845cd0d65c0e938ec2f812b5\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-assets/commit/99027125a4a07927de43adac1ab79989e304aa47\">9902712</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Add student-02 namespace\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175649598,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"231085cc6ce92fcd4439643f8c555020640b4114874ebb7481d6aa72a8cb2d44\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/cloudbees/training-assets/compare/4d613b25f3...a6b173ef49\">\n              5 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" href=\"https://github.com/apps/renovate\"><img class=\"avatar\" src=\"./GitHub_files/2740\" width=\"32\" height=\"32\" alt=\"@renovate\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"29139614\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175648536,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"ce9e4c35b108e066ec3b49a0096f3bcae4f9857bf8bcb5d9a614df43fa07d30c\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/apps/renovate\" aria-describedby=\"hovercard-aria-description\">renovate</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175648536,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"f47362f85a259a8ed573d0d1442dac2a376d389f714ab7332ce37109f84d5d9f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/Unibeautify/unibeautify\">Unibeautify/unibeautify</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-28T03:20:38Z\" title=\"Aug 27, 2018, 8:20 PM PDT\">20 hours ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n              <button class=\"btn-link text-gray-dark no-underline js-details-target\" aria-expanded=\"false\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:null,&quot;event_group&quot;:{&quot;type&quot;:&quot;PushEvent&quot;,&quot;quantity&quot;:2,&quot;includes_viewer&quot;:false},&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event_group&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:null,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"b9bf2e03889abe8e71988dcf31d59362b69d73e9d9d73004b6e6d4d317efebc4\" data-ga-click=\"News feed, event_group click, Event click type: target:\">\n                <span class=\"Details-content--shown\">\n                  <svg class=\"octicon octicon-unfold link-gray mr-1\" aria-label=\"Expand\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M11.5 7.5L14 10c0 .55-.45 1-1 1H9v-1h3.5l-2-2h-7l-2 2H5v1H1c-.55 0-1-.45-1-1l2.5-2.5L0 5c0-.55.45-1 1-1h4v1H1.5l2 2h7l2-2H9V4h4c.55 0 1 .45 1 1l-2.5 2.5zM6 6h2V3h2L7 0 4 3h2v3zm2 3H6v3H4l3 3 3-3H8V9z\"></path></svg>\n                </span>\n                <span class=\"Details-content--hidden\">\n                  <svg class=\"octicon octicon-fold link-gray mr-1\" aria-label=\"Collapse\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7 9l3 3H8v3H6v-3H4l3-3zm3-6H8V0H6v3H4l3 3 3-3zm4 2c0-.55-.45-1-1-1h-2.5l-1 1h3l-2 2h-7l-2-2h3l-1-1H1c-.55 0-1 .45-1 1l2.5 2.5L0 10c0 .55.45 1 1 1h2.5l1-1h-3l2-2h7l2 2h-3l1 1H13c.55 0 1-.45 1-1l-2.5-2.5L14 5z\"></path></svg>\n                </span>\n</button>          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>3 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175648536,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c0992604a83726ef3fe7da37ca915227b8654126f7a8faaf237bbccb040c2d8e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/Unibeautify/unibeautify/tree/renovate/istanbul-reports-2.x\">renovate/istanbul-reports-2.x</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"renovate-bot\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"25180681\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/renovate-bot\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/25180681\" width=\"16\" height=\"16\" alt=\"@renovate-bot\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175648536,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"acbe0129632125e8bed9e902e31ebd47187654a8d26866761d0fa9b12375b611\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/a7395927ddabc455a7bc39e99b41599da736ed3e\">a739592</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update dependency istanbul-api to v2\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"szeck87\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8315038(1)\" width=\"16\" height=\"16\" alt=\"@szeck87\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175648536,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"acbe0129632125e8bed9e902e31ebd47187654a8d26866761d0fa9b12375b611\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/771cf0d6ac10840cfb1d2d034ee9d2b30d03df18\">771cf0d</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #170 from Unibeautify/renovate/istanbul-api-2.x\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175648536,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"d989566a416702adc13c9d66d9c6a93b989e8f2809d86478eb185c6ad5b68f4f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/Unibeautify/unibeautify/compare/efe00db074...90ade4c6ae\">\n              1 more commit »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\" data-hydro-view=\"{&quot;event_type&quot;:&quot;news_feed.event.view&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175647720,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-view-hmac=\"f55b80463641e603ebadfdf5b52e6b857caa267934b847596aa149222b0f7398\">\n    <span>3 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175647720,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"37ddb5317c0ee0123f2bba0db33c6cf459999a8f38897c84f31229db4f72a389\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/Unibeautify/unibeautify/tree/renovate/istanbul-reports-1.x\">renovate/istanbul-reports-1.x</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"renovate-bot\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"25180681\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/renovate-bot\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/25180681\" width=\"16\" height=\"16\" alt=\"@renovate-bot\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175647720,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2466188442e558ceefad5fcd2faaab09f516cc476331048c8fa44fb85424f0ce\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/a7395927ddabc455a7bc39e99b41599da736ed3e\">a739592</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Update dependency istanbul-api to v2\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"szeck87\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"8315038\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/szeck87\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/8315038(1)\" width=\"16\" height=\"16\" alt=\"@szeck87\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175647720,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2466188442e558ceefad5fcd2faaab09f516cc476331048c8fa44fb85424f0ce\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/Unibeautify/unibeautify/commit/771cf0d6ac10840cfb1d2d034ee9d2b30d03df18\">771cf0d</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #170 from Unibeautify/renovate/istanbul-api-2.x\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:65037362,&quot;actor_id&quot;:29139614,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8175647720,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"d710a7fd50d25978b7669dcd716f6bf152899fc197a48c6ca34e46db31ba83cf\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/Unibeautify/unibeautify/compare/2445b4e96d...cb5058e3ee\">\n              1 more commit »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174983830,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"67e3a4bae04f7006850e6656b55717476693e33ab4e7332ac0bb83b1784d4cec\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/121270(1)\" width=\"32\" height=\"32\" alt=\"@darinpope\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174983830,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"67e3a4bae04f7006850e6656b55717476693e33ab4e7332ac0bb83b1784d4cec\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\">darinpope</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174983830,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"6df93c4c50a3de876feaab0e9ed6b0e81ac0df62dcddbf20238474db8e03b507\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/cloudbees/training-assets\">cloudbees/training-assets</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-27T23:21:32Z\" title=\"Aug 27, 2018, 4:21 PM PDT\">a day ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>1 commit to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174983830,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"8e3298e6b06d7c11f6fd1be490ad91b23b53964acdbc017900e18cf651d2bc21\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/cloudbees/training-assets/tree/master\">master</a>\n\n          <div class=\"commits pusher-is-only-committer\">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"darinpope\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/121270\" width=\"16\" height=\"16\" alt=\"@darinpope\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:52177310,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174983830,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"8aa47a76f32ee81ce7d85105841998700c33068fb9c36ee77bc13ba928e0d082\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-assets/commit/4d613b25f3e4b830e9a6205412e9a86409a84a6e\">4d613b2</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      add pipeline-intermediate class\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    \n<div class=\"push\">\n  <div class=\"body\">\n    <div class=\"Details js-details-container js-news-feed-event-group border-bottom \">\n      <div class=\"d-flex flex-items-baseline py-3\">\n        <span class=\"mr-3\">\n          <a class=\"d-inline-block\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/121270(1)\" width=\"32\" height=\"32\" alt=\"@darinpope\"></a>\n        </span>\n        <div class=\"d-flex flex-column width-full\">\n          <div class=\"d-flex flex-justify-between flex-items-baseline\">\n            <div>\n                <a data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823334,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174255124,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"e9d57415594de9859bd3aa4a690777e2db0aa769f4bdfaada326970d97ed5e8e\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\">darinpope</a>\n\n              <span class=\"text-gray-dark no-underline\">\n                pushed to\n\n\n                  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823334,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174255124,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:true},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"75e18824a2d7d83646878d3b5d818788032d786fa0239e64565c226d85990a2d\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/darinpope/training-pipeline-intermediate\">darinpope/training-pipeline-intermediate</a>\n\n                \n\n                <span class=\"f6 text-gray-light no-wrap ml-1\">\n                  <relative-time datetime=\"2018-08-27T20:24:17Z\" title=\"Aug 27, 2018, 1:24 PM PDT\">a day ago</relative-time>\n                </span>\n              </span>\n            </div>\n\n          </div>\n\n          <div>\n                \n<div class=\"dashboard-rollup-item Box p-3 mt-2\">\n    <span>5 commits to</span>\n    <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823334,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174255124,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"727614a6fc4ccf54a24ebe12f365a924fb37f0d4735d2f22e87f31a1857200fe\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/darinpope/training-pipeline-intermediate/tree/master\">master</a>\n\n    <div class=\"commits \">\n      <ul class=\"pt-1\">\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"darinpope\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/121270\" width=\"16\" height=\"16\" alt=\"@darinpope\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823334,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174255124,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"3ee67656235c09d1927d52b1eaaabcdcdbf4592164d17128bf08c5d59d432613\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/training-pipeline-intermediate/commit/42e3b8d392f7301836df5fee0c0d7ea1eed9ef13\">42e3b8d</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                make README current\n              </blockquote>\n            </div>\n          </li>\n          <li class=\"d-flex flex-items-baseline m-0\">\n            <span title=\"MarkEWaite\">\n              <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n            </span>\n            <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823334,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174255124,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"3ee67656235c09d1927d52b1eaaabcdcdbf4592164d17128bf08c5d59d432613\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/darinpope/training-pipeline-intermediate/commit/2fa6c4a42d1b3cf74ba1fb00e64dea517dae6716\">2fa6c4a</a></code>\n            <div class=\"dashboard-break-word lh-condensed\">\n              <blockquote>\n                Merge pull request #28 from darinpope/update-readme\n              </blockquote>\n            </div>\n          </li>\n\n          <li class=\"f6 mt-2\">\n            <a class=\"link-gray\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:133823334,&quot;actor_id&quot;:121270,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174255124,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;comparison&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"2393489173d8c6bb78802c6df6deb889b0ae9df35f41f71b37490d5ef870b51a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:comparison\" href=\"https://github.com/darinpope/training-pipeline-intermediate/compare/028fb80249...2fa6c4a42d\">\n              3 more commits »\n</a>          </li>\n\n      </ul>\n    </div>\n</div>\n          </div>\n\n          <div class=\"Details-content--hidden dashboard-rollup-items body\">\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103686443,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174234816,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"4ad3614c67f26a2931966f692dd6aed40e01112ea6951f28b474635c126a4e1f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/156685\" width=\"32\" height=\"32\" alt=\"@MarkEWaite\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103686443,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174234816,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"4ad3614c67f26a2931966f692dd6aed40e01112ea6951f28b474635c126a4e1f\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\">MarkEWaite</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103686443,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174234816,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"85793f8f0370a7cc7b6047572b8167a45cc18ec898f718b3a7c321dc84a0af8c\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/cloudbees/training-pipeline-intermediate\">cloudbees/training-pipeline-intermediate</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-27T20:20:14Z\" title=\"Aug 27, 2018, 1:20 PM PDT\">a day ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103686443,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174234816,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"7c6c131431e1347c4a63e5f94244be6d34f0db790f3a5df11b35de34ae41a2f9\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/cloudbees/training-pipeline-intermediate/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"MarkEWaite\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"156685\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/MarkEWaite\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/156685(1)\" width=\"16\" height=\"16\" alt=\"@MarkEWaite\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103686443,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174234816,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"573b2d0a1842fa85d6277478184c7fed597d3f8f387f90a14660f2b9282d5fae\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-pipeline-intermediate/commit/2fa6c4a42d1b3cf74ba1fb00e64dea517dae6716\">2fa6c4a</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #28 from darinpope/update-readme\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"darinpope\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"121270\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/darinpope\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/121270\" width=\"16\" height=\"16\" alt=\"@darinpope\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103686443,&quot;actor_id&quot;:156685,&quot;public&quot;:false,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8174234816,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"573b2d0a1842fa85d6277478184c7fed597d3f8f387f90a14660f2b9282d5fae\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/cloudbees/training-pipeline-intermediate/commit/42e3b8d392f7301836df5fee0c0d7ea1eed9ef13\">42e3b8d</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      make README current\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n    <div class=\"push\"><div class=\"body\"><!-- push -->\n<div class=\"d-flex border-bottom py-3\">\n  <span class=\"mr-3\">\n  <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8173975282,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c21638e85c0ae72adf516fac0a7370bafc524f03d83d3c79cdc982817125261a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" data-hovercard-user-id=\"3000480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/oleg-nenashev\" aria-describedby=\"hovercard-aria-description\"><img class=\"avatar\" src=\"./GitHub_files/3000480\" width=\"32\" height=\"32\" alt=\"@oleg-nenashev\"></a>\n</span>\n\n  <div class=\"d-flex flex-column width-full\">\n    <div>\n      <a data-hovercard-user-id=\"3000480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8173975282,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;actor&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"c21638e85c0ae72adf516fac0a7370bafc524f03d83d3c79cdc982817125261a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:actor\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/oleg-nenashev\" aria-describedby=\"hovercard-aria-description\">oleg-nenashev</a>\n      \n      pushed to\n\n\n      <a data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8173975282,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;repo&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"9ed9dc8cc730196c1e45b386ef713da1cd9c4dc2fa15db798a55123aa79c3e61\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:repo\" class=\"link-gray-dark no-underline text-bold wb-break-all\" href=\"https://github.com/jenkinsci/jep\">jenkinsci/jep</a>\n      <span class=\"f6 text-gray-light no-wrap ml-1\">\n        <relative-time datetime=\"2018-08-27T19:27:30Z\" title=\"Aug 27, 2018, 12:27 PM PDT\">a day ago</relative-time>\n      </span>\n\n        <div class=\"Box p-3 mt-2\">\n          <span>2 commits to</span>\n          <a class=\"branch-name\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8173975282,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;branch&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"857d029a9673246b3db100dbc7d6155ae5f297d7fe7d133f2ae66c84ff08074a\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:branch\" href=\"https://github.com/jenkinsci/jep/tree/master\">master</a>\n\n          <div class=\"commits \">\n            <ul>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"oleg-nenashev\">\n                    <a class=\"d-inline-block\" data-hovercard-user-id=\"3000480\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/oleg-nenashev\" aria-describedby=\"hovercard-aria-description\"><img class=\"mr-1\" src=\"./GitHub_files/3000480(1)\" width=\"16\" height=\"16\" alt=\"@oleg-nenashev\"></a>\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8173975282,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"515d785245abbaf472d122439adc037fa971917ed170c5da32b526a789cfb395\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkinsci/jep/commit/28c435ba0443ac0d0e86405754a23a31b376ed6b\">28c435b</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Merge pull request #187 from rodrigc/fix-link-2\n                    </blockquote>\n                  </div>\n                </li>\n                <li class=\"d-flex flex-items-baseline\">\n                  <span title=\"Craig Rodrigues\">\n                    <img class=\"mr-1\" width=\"16\" height=\"16\" alt=\"\" src=\"./GitHub_files/68747470733a2f2f322e67726176617461722e636f6d2f6176617461722f63333036626430343464616330643531333664343932393530343064666431313f643d68747470732533412532462532466173736574732d63646e2e6769746875622e636f6d253246696d616765732532466772617661746172732532466772617\" data-canonical-src=\"https://2.gravatar.com/avatar/c306bd044dac0d5136d49295040dfd11?d=https%3A%2F%2Fassets-cdn.github.com%2Fimages%2Fgravatars%2Fgravatar-user-420.png&amp;r=g&amp;s=140\">\n                  </span>\n                  <code><a class=\"mr-1\" data-hydro-click=\"{&quot;event_type&quot;:&quot;news_feed.event.click&quot;,&quot;payload&quot;:{&quot;event&quot;:{&quot;repo_id&quot;:103302223,&quot;actor_id&quot;:3000480,&quot;public&quot;:true,&quot;type&quot;:&quot;PushEvent&quot;,&quot;target_id&quot;:null,&quot;id&quot;:8173975282,&quot;additional_details_shown&quot;:false,&quot;grouped&quot;:false},&quot;event_group&quot;:null,&quot;org_id&quot;:null,&quot;target_type&quot;:&quot;event&quot;,&quot;user_id&quot;:1958953,&quot;action_target&quot;:&quot;sha&quot;,&quot;client_id&quot;:&quot;1886818479.1491503121&quot;,&quot;originating_request_id&quot;:&quot;D5BA:57D4:1E9C95A:2ECFF64:5B85DF40&quot;,&quot;originating_url&quot;:&quot;https://github.com/dashboard-feed&quot;}}\" data-hydro-click-hmac=\"515d785245abbaf472d122439adc037fa971917ed170c5da32b526a789cfb395\" data-ga-click=\"News feed, event click, Event click type:PushEvent target:sha\" href=\"https://github.com/jenkinsci/jep/commit/92ec7c11b2ec6ac76923904ef8a0484bf87a9c54\">92ec7c1</a></code>\n                  <div class=\"dashboard-break-word lh-condensed\">\n                    <blockquote>\n                      Fix broken link\n                    </blockquote>\n                  </div>\n                </li>\n\n\n            </ul>\n          </div>\n        </div>\n    </div>\n  </div>\n</div>\n</div></div>\n\n  <!-- '\"` --><!-- </textarea></xmp> --><form class=\"ajax-pagination-form js-ajax-pagination\" action=\"https://github.com/dashboard-feed?page=2\" accept-charset=\"UTF-8\" method=\"get\"><input name=\"utf8\" type=\"hidden\" value=\"✓\">\n  <button type=\"submit\" class=\"ajax-pagination-btn\" data-ga-click=\"News feed, load more, Load more newsfeed events - page:2\" data-disable-with=\"Loading more…\">\n    More\n  </button>\n</form>\n\n\n        <div class=\"f6 text-gray mt-4\">\n          <svg class=\"octicon octicon-light-bulb text-gray\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z\"></path></svg>\n          <strong>ProTip!</strong>\n          The feed shows you events from people you <a href=\"https://github.com/bitwiseman/following\">follow</a> and repositories you <a href=\"https://github.com/watching\">watch</a>.\n          <br>\n          <a class=\"f6 link-gray mb-2 mt-2 d-inline-block\" href=\"https://github.com/bitwiseman.private.atom?token=AB3kKeemw0tJDm5mdwKy8T917FA48tmtks65kx_wwA==\" data-ga-click=\"Dashboard, click, News feed atom/RSS link- context:user\"><svg class=\"octicon octicon-rss mr-1\" viewBox=\"0 0 10 16\" version=\"1.1\" width=\"10\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M2 13H0v-2c1.11 0 2 .89 2 2zM0 3v1a9 9 0 0 1 9 9h1C10 7.48 5.52 3 0 3zm0 4v1c2.75 0 5 2.25 5 5h1c0-3.31-2.69-6-6-6z\"></path></svg>Subscribe to your news feed</a>\n        </div>\n    </div>\n  </div>\n</div>\n\n        </div>\n        \n<div class=\"d-flex flex-items-between footer container-lg my-5 px-0\" role=\"contentinfo\">\n <div class=\"col-lg-4 list-style-none mr-lg-5\">\n  <a aria-label=\"Homepage\" title=\"GitHub\" class=\"d-none d-lg-flex footer-octicon footer-octicon no-underline\" href=\"https://github.com/\">\n   <div>\n    <svg height=\"24\" class=\"octicon octicon-mark-github d-block mr-2 float-left\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"24\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z\"></path></svg>\n   </div>\n\n   <div>\n    <span class=\"f6 text-gray-light\">\n     © 2018 <span title=\"1.11280s from unicorn-59dd8cb55b-54w8x\">GitHub</span>, Inc.\n    </span>\n    <span class=\"f6 text-gray-light\">\n     \n    </span>\n\n   </div>\n</a> </div>\n\n <div class=\"d-flex flex-justify-start flex-row width-full\">\n  <ul class=\"col-4 col-sm-4 col-lg-4 col-xl-3 list-style-none f6 text-gray pl-lg-4\">\n    <li class=\"mb-1\"><a class=\"link-gray\" href=\"https://blog.github.com/\" data-ga-click=\"Footer, go to blog, text:blog\">Blog</a></li>\n    <li class=\"mb-1\"><a class=\"link-gray\" data-ga-click=\"Footer, go to about, text:about\" href=\"https://github.com/about\">About</a></li>\n   <li class=\"mb-1\"><a class=\"link-gray\" href=\"https://shop.github.com/\" data-ga-click=\"Footer, go to shop, text:shop\">Shop</a></li>\n    <li class=\"mb-1\"><a class=\"link-gray\" data-ga-click=\"Footer, go to contact, text:contact\" href=\"https://github.com/contact\">Contact GitHub</a></li>\n  </ul>\n\n  <ul class=\"col-4 col-sm-4 col-lg-4 col-xl-3 list-style-none f6 text-gray pl-lg-4\">\n    <li class=\"mb-1\"><a class=\"link-gray\" href=\"https://developer.github.com/\" data-ga-click=\"Footer, go to api, text:api\">API</a></li>\n    <li class=\"mb-1\"><a class=\"link-gray\" href=\"https://training.github.com/\" data-ga-click=\"Footer, go to training, text:training\">Training</a></li>\n\n     <li class=\"mb-1\">\n       <a class=\"link-gray\" href=\"https://status.github.com/\" data-ga-click=\"Footer, go to status, text:status\">Status</a>\n     </li>\n     <li class=\"mb-1\">\n       <a class=\"link-gray\" href=\"https://help.github.com/articles/github-security/\" data-ga-click=\"Footer, go to security, text:security\">Security</a>\n     </li>\n  </ul>\n\n    <ul class=\"col-4 col-sm-4 col-lg-4 col-xl-3 list-style-none f6 text-gray pl-lg-4\">\n      <li class=\"mb-1\">\n        <a class=\"link-gray\" data-ga-click=\"Footer, go to terms, text:terms\" href=\"https://github.com/site/terms\">Terms</a>\n      </li>\n      <li class=\"mb-1\">\n        <a class=\"link-gray\" data-ga-click=\"Footer, go to privacy, text:privacy\" href=\"https://github.com/site/privacy\">Privacy</a>\n      </li>\n      <li class=\"mb-1\">\n        <a class=\"link-gray\" data-ga-click=\"Footer, go to help, text:help\" href=\"https://help.github.com/\">Help</a>\n      </li>\n    </ul>\n </div>\n</div>\n\n      </div>\n    </div>\n      <div class=\"team-left-column col-12 col-md-3 col-lg-3 pr-5 mt-5 hide-lg hide-md hide-sm border-bottom\">\n        \n      <h4 class=\"f5 text-bold mb-1\">Discover repositories</h4>\n        <div class=\"py-2 my-2 border-bottom\">\n          <a class=\"f6 text-bold link-gray-dark d-flex no-underline\" href=\"https://github.com/Homebrew/brew\">\n            Homebrew/brew\n          </a>\n\n          <p class=\"f6 text-gray mb-2\" itemprop=\"description\">\n            <g-emoji class=\"g-emoji\" alias=\"beer\" fallback-src=\"https://assets-cdn.github.com/images/icons/emoji/unicode/1f37a.png\">🍺</g-emoji> The missing package manager for macOS\n          </p>\n\n            <span class=\"mr-2 f6 text-gray text-normal\">\n                <span class=\"repo-language-color\" style=\"background-color:#701516;\"></span>\n              <span itemprop=\"programmingLanguage\">\n                Ruby\n              </span>\n            </span>\n\n            <span class=\"f6 text-gray text-normal\">\n              <svg aria-label=\"star\" class=\"octicon octicon-star\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z\"></path></svg>\n              13.7k\n            </span>\n        </div>\n        <div class=\"py-2 my-2 border-bottom\">\n          <a class=\"f6 text-bold link-gray-dark d-flex no-underline\" href=\"https://github.com/alefragnani/vscode-project-manager\">\n            alefragnani/vscode-project-manager\n          </a>\n\n          <p class=\"f6 text-gray mb-2\" itemprop=\"description\">\n            Project Manager Extension for Visual Studio Code\n          </p>\n\n            <span class=\"mr-2 f6 text-gray text-normal\">\n                <span class=\"repo-language-color\" style=\"background-color:#2b7489;\"></span>\n              <span itemprop=\"programmingLanguage\">\n                TypeScript\n              </span>\n            </span>\n\n            <span class=\"f6 text-gray text-normal\">\n              <svg aria-label=\"star\" class=\"octicon octicon-star\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z\"></path></svg>\n              267\n            </span>\n        </div>\n        <div class=\"py-2 my-2 \">\n          <a class=\"f6 text-bold link-gray-dark d-flex no-underline\" href=\"https://github.com/Homebrew/formulae.brew.sh\">\n            Homebrew/formulae.brew.sh\n          </a>\n\n          <p class=\"f6 text-gray mb-2\" itemprop=\"description\">\n            <g-emoji class=\"g-emoji\" alias=\"racing_car\" fallback-src=\"https://assets-cdn.github.com/images/icons/emoji/unicode/1f3ce.png\">🏎</g-emoji> An online formulae browser for Homebrew\n          </p>\n\n            <span class=\"mr-2 f6 text-gray text-normal\">\n                <span class=\"repo-language-color\" style=\"background-color:#e34c26;\"></span>\n              <span itemprop=\"programmingLanguage\">\n                HTML\n              </span>\n            </span>\n\n            <span class=\"f6 text-gray text-normal\">\n              <svg aria-label=\"star\" class=\"octicon octicon-star\" viewBox=\"0 0 14 16\" version=\"1.1\" width=\"14\" height=\"16\" role=\"img\"><path fill-rule=\"evenodd\" d=\"M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z\"></path></svg>\n              38\n            </span>\n        </div>\n      <a href=\"https://github.com/discover\" class=\"d-block link-gray no-underline f6 mb-3\">Go to Explore →</a>\n\n      </div>\n  </div>\n\n\n  </div>\n\n\n\n  <div id=\"ajax-error-message\" class=\"ajax-error-message flash flash-error\">\n    <svg class=\"octicon octicon-alert\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg>\n    <button type=\"button\" class=\"flash-close js-ajax-error-dismiss\" aria-label=\"Dismiss error\">\n      <svg class=\"octicon octicon-x\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"></path></svg>\n    </button>\n    You can’t perform that action at this time.\n  </div>\n\n\n    \n    <script crossorigin=\"anonymous\" integrity=\"sha512-MQP/nsaPNRW5M9/ODnUMsjF/kGCncvWuJk2+5nloOnGGpTMi5XxTLIht4oIyOiTE1eYOfHbX4CFVnc6QXpuWtQ==\" type=\"application/javascript\" src=\"./GitHub_files/frameworks-778adb2c3d5bea3712eadb76a1dd7bdc.js\"></script>\n    \n    <script crossorigin=\"anonymous\" async=\"async\" integrity=\"sha512-zuWJYYjrY/M3FkzLka6v9pT77+d/+RAbdnpMamchi6A18hJu763SSmy3Q/6LyP6GB7L0AWr/5j2xHwyOv40R7A==\" type=\"application/javascript\" src=\"./GitHub_files/github-9cbd9b2be88271614a9f9facacf5171b.js\"></script>\n    \n    \n    \n  <div class=\"js-stale-session-flash stale-session-flash flash flash-warn flash-banner d-none\">\n    <svg class=\"octicon octicon-alert\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z\"></path></svg>\n    <span class=\"signed-in-tab-flash\">You signed in with another tab or window. <a href=\"https://github.com/\">Reload</a> to refresh your session.</span>\n    <span class=\"signed-out-tab-flash\">You signed out in another tab or window. <a href=\"https://github.com/\">Reload</a> to refresh your session.</span>\n  </div>\n  <div class=\"facebox\" id=\"facebox\" style=\"display:none;\">\n  <div class=\"facebox-popup\">\n    <div class=\"facebox-content\" role=\"dialog\" aria-labelledby=\"facebox-header\" aria-describedby=\"facebox-description\">\n    </div>\n    <button type=\"button\" class=\"facebox-close js-facebox-close\" aria-label=\"Close modal\">\n      <svg class=\"octicon octicon-x\" viewBox=\"0 0 12 16\" version=\"1.1\" width=\"12\" height=\"16\" aria-hidden=\"true\"><path fill-rule=\"evenodd\" d=\"M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z\"></path></svg>\n    </button>\n  </div>\n</div>\n\n  <template id=\"site-details-dialog\"></template>\n\n  <div class=\"Popover js-hovercard-content position-absolute\" style=\"display: none; outline: none;\" tabindex=\"0\">\n  <div class=\"Popover-message Popover-message--bottom-left Popover-message--large Box box-shadow-large\" style=\"width:360px;\">\n  </div>\n</div>\n\n<div id=\"hovercard-aria-description\" class=\"sr-only\">\n  Press h to open a hovercard with more details.\n</div>\n\n\n  \n\n\n\n</body></html>"
  },
  {
    "path": "test/resources/html-with-base64image.html",
    "content": "<p><img src=\"data:image/png;base64,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\"/><br/></p>"
  },
  {
    "path": "test/resources/underscore-min.js",
    "content": "//     Underscore.js 1.7.0\n//     http://underscorejs.org\n//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};\"undefined\"!=typeof exports?(\"undefined\"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION=\"1.7.0\";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v=\"Reduce of empty array with no initial value\";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),\"value\")};var m=function(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])<u?i=o+1:a=o}return i},h.toArray=function(n){return n?h.isArray(n)?a.call(n):n.length===+n.length?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:n.length===+n.length?n.length:h.keys(n).length},h.partition=function(n,t,r){t=h.iteratee(t,r);var e=[],u=[];return h.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},h.first=h.head=h.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.length-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.push(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,\"length\").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if(\"number\"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for(\"number\"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.call(arguments,1));if(!h.isFunction(n))throw new TypeError(\"Bind must be called on a function\");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},h.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error(\"bindAll must be passed function names\");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.defer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(arguments,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case\"[object RegExp]\":case\"[object String]\":return\"\"+n==\"\"+t;case\"[object Number]\":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case\"[object Date]\":case\"[object Boolean]\":return+n===+t}if(\"object\"!=typeof n||\"object\"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&\"constructor\"in n&&\"constructor\"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if(\"[object Array]\"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return\"[object Array]\"===l.call(n)},h.isObject=function(n){var t=typeof n;return\"function\"===t||\"object\"===t&&!!n},h.each([\"Arguments\",\"Function\",\"String\",\"Number\",\"Date\",\"RegExp\"],function(n){h[\"is\"+n]=function(t){return l.call(t)===\"[object \"+n+\"]\"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,\"callee\")}),\"function\"!=typeof/./&&(h.isFunction=function(n){return\"function\"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||\"[object Boolean]\"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#x27;\",\"`\":\"&#x60;\"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r=\"(?:\"+h.keys(n).join(\"|\")+\")\",e=RegExp(r),u=RegExp(r,\"g\");return function(n){return n=null==n?\"\":\"\"+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+\"\";return n?n+t:t},h.templateSettings={evaluate:/<%([\\s\\S]+?)%>/g,interpolate:/<%=([\\s\\S]+?)%>/g,escape:/<%-([\\s\\S]+?)%>/g};var A=/(.)^/,k={\"'\":\"'\",\"\\\\\":\"\\\\\",\"\\r\":\"r\",\"\\n\":\"n\",\"\\u2028\":\"u2028\",\"\\u2029\":\"u2029\"},O=/\\\\|'|\\r|\\n|\\u2028|\\u2029/g,F=function(n){return\"\\\\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source].join(\"|\")+\"|$\",\"g\"),u=0,i=\"__p+='\";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+=\"'+\\n((__t=(\"+r+\"))==null?'':_.escape(__t))+\\n'\":e?i+=\"'+\\n((__t=(\"+e+\"))==null?'':__t)+\\n'\":a&&(i+=\"';\\n\"+a+\"\\n__p+='\"),t}),i+=\"';\\n\",t.variable||(i=\"with(obj||{}){\\n\"+i+\"}\\n\"),i=\"var __t,__p='',__j=Array.prototype.join,\"+\"print=function(){__p+=__j.call(arguments,'');};\\n\"+i+\"return __p;\\n\";try{var a=new Function(t.variable||\"obj\",\"_\",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||\"obj\";return l.source=\"function(\"+c+\"){\\n\"+i+\"}\",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each([\"pop\",\"push\",\"reverse\",\"shift\",\"sort\",\"splice\",\"unshift\"],function(n){var t=r[n];h.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),\"shift\"!==n&&\"splice\"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each([\"concat\",\"join\",\"slice\"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},\"function\"==typeof define&&define.amd&&define(\"underscore\",[],function(){return h})}).call(this);\n//# sourceMappingURL=underscore-min.map"
  },
  {
    "path": "test/resources/underscore.js",
    "content": "//     Underscore.js 1.7.0\n//     http://underscorejs.org\n//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `exports` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n\n  // Export the Underscore object for **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.7.0';\n\n  // Internal function that returns an efficient (for current engines) version\n  // of the passed-in callback, to be repeatedly applied in other Underscore\n  // functions.\n  var optimizeCb = function(func, context, argCount) {\n    if (context === void 0) return func;\n    switch (argCount == null ? 3 : argCount) {\n      case 1: return function(value) {\n        return func.call(context, value);\n      };\n      case 2: return function(value, other) {\n        return func.call(context, value, other);\n      };\n      case 3: return function(value, index, collection) {\n        return func.call(context, value, index, collection);\n      };\n      case 4: return function(accumulator, value, index, collection) {\n        return func.call(context, accumulator, value, index, collection);\n      };\n    }\n    return function() {\n      return func.apply(context, arguments);\n    };\n  };\n\n  // A mostly-internal function to generate callbacks that can be applied\n  // to each element in a collection, returning the desired result — either\n  // identity, an arbitrary callback, a property matcher, or a property accessor.\n  var cb = function(value, context, argCount) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return optimizeCb(value, context, argCount);\n    if (_.isObject(value)) return _.matches(value);\n    return _.property(value);\n  };\n  _.iteratee = function(value, context) {\n    return cb(value, context);\n  };\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles raw objects in addition to array-likes. Treats all\n  // sparse array-likes as if they were dense.\n  _.each = _.forEach = function(obj, iteratee, context) {\n    if (obj == null) return obj;\n    iteratee = optimizeCb(iteratee, context);\n    var i, length = obj.length;\n    if (length === +length) {\n      for (i = 0; i < length; i++) {\n        iteratee(obj[i], i, obj);\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (i = 0, length = keys.length; i < length; i++) {\n        iteratee(obj[keys[i]], keys[i], obj);\n      }\n    }\n    return obj;\n  };\n\n  // Return the results of applying the iteratee to each element.\n  _.map = _.collect = function(obj, iteratee, context) {\n    if (obj == null) return [];\n    iteratee = cb(iteratee, context);\n    var keys = obj.length !== +obj.length && _.keys(obj),\n        length = (keys || obj).length,\n        results = Array(length),\n        currentKey;\n    for (var index = 0; index < length; index++) {\n      currentKey = keys ? keys[index] : index;\n      results[index] = iteratee(obj[currentKey], currentKey, obj);\n    }\n    return results;\n  };\n\n  var reduceError = 'Reduce of empty array with no initial value';\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`.\n  _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {\n    if (obj == null) obj = [];\n    iteratee = optimizeCb(iteratee, context, 4);\n    var keys = obj.length !== +obj.length && _.keys(obj),\n        length = (keys || obj).length,\n        index = 0, currentKey;\n    if (arguments.length < 3) {\n      if (!length) throw new TypeError(reduceError);\n      memo = obj[keys ? keys[index++] : index++];\n    }\n    for (; index < length; index++) {\n      currentKey = keys ? keys[index] : index;\n      memo = iteratee(memo, obj[currentKey], currentKey, obj);\n    }\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {\n    if (obj == null) obj = [];\n    iteratee = optimizeCb(iteratee, context, 4);\n    var keys = obj.length !== + obj.length && _.keys(obj),\n        index = (keys || obj).length,\n        currentKey;\n    if (arguments.length < 3) {\n      if (!index) throw new TypeError(reduceError);\n      memo = obj[keys ? keys[--index] : --index];\n    }\n    while (index--) {\n      currentKey = keys ? keys[index] : index;\n      memo = iteratee(memo, obj[currentKey], currentKey, obj);\n    }\n    return memo;\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, predicate, context) {\n    var result;\n    predicate = cb(predicate, context);\n    _.some(obj, function(value, index, list) {\n      if (predicate(value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    if (obj == null) return results;\n    predicate = cb(predicate, context);\n    _.each(obj, function(value, index, list) {\n      if (predicate(value, index, list)) results.push(value);\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, _.negate(cb(predicate)), context);\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, predicate, context) {\n    if (obj == null) return true;\n    predicate = cb(predicate, context);\n    var keys = obj.length !== +obj.length && _.keys(obj),\n        length = (keys || obj).length,\n        index, currentKey;\n    for (index = 0; index < length; index++) {\n      currentKey = keys ? keys[index] : index;\n      if (!predicate(obj[currentKey], currentKey, obj)) return false;\n    }\n    return true;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Aliased as `any`.\n  _.some = _.any = function(obj, predicate, context) {\n    if (obj == null) return false;\n    predicate = cb(predicate, context);\n    var keys = obj.length !== +obj.length && _.keys(obj),\n        length = (keys || obj).length,\n        index, currentKey;\n    for (index = 0; index < length; index++) {\n      currentKey = keys ? keys[index] : index;\n      if (predicate(obj[currentKey], currentKey, obj)) return true;\n    }\n    return false;\n  };\n\n  // Determine if the array or object contains a given value (using `===`).\n  // Aliased as `include`.\n  _.contains = _.include = function(obj, target) {\n    if (obj == null) return false;\n    if (obj.length !== +obj.length) obj = _.values(obj);\n    return _.indexOf(obj, target) >= 0;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      return (isFunc ? method : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n\n  // Convenience version of a common use case of `filter`: selecting only objects\n  // containing specific `key:value` pairs.\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matches(attrs));\n  };\n\n  // Convenience version of a common use case of `find`: getting the first object\n  // containing specific `key:value` pairs.\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matches(attrs));\n  };\n\n  // Return the maximum element (or element-based computation).\n  _.max = function(obj, iteratee, context) {\n    var result = -Infinity, lastComputed = -Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = obj.length === +obj.length ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value > result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iteratee, context) {\n    var result = Infinity, lastComputed = Infinity,\n        value, computed;\n    if (iteratee == null && obj != null) {\n      obj = obj.length === +obj.length ? obj : _.values(obj);\n      for (var i = 0, length = obj.length; i < length; i++) {\n        value = obj[i];\n        if (value < result) {\n          result = value;\n        }\n      }\n    } else {\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index, list) {\n        computed = iteratee(value, index, list);\n        if (computed < lastComputed || computed === Infinity && result === Infinity) {\n          result = value;\n          lastComputed = computed;\n        }\n      });\n    }\n    return result;\n  };\n\n  // Shuffle a collection, using the modern version of the\n  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n  _.shuffle = function(obj) {\n    var set = obj && obj.length === +obj.length ? obj : _.values(obj);\n    var length = set.length;\n    var shuffled = Array(length);\n    for (var index = 0, rand; index < length; index++) {\n      rand = _.random(0, index);\n      if (rand !== index) shuffled[index] = shuffled[rand];\n      shuffled[rand] = set[index];\n    }\n    return shuffled;\n  };\n\n  // Sample **n** random values from a collection.\n  // If **n** is not specified, returns a single random element.\n  // The internal `guard` argument allows it to work with `map`.\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (obj.length !== +obj.length) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n\n  // Sort the object's values by a criterion produced by an iteratee.\n  _.sortBy = function(obj, iteratee, context) {\n    iteratee = cb(iteratee, context);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iteratee(value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n\n  // An internal function used for aggregate \"group by\" operations.\n  var group = function(behavior) {\n    return function(obj, iteratee, context) {\n      var result = {};\n      iteratee = cb(iteratee, context);\n      _.each(obj, function(value, index) {\n        var key = iteratee(value, index, obj);\n        behavior(result, value, key);\n      });\n      return result;\n    };\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key].push(value); else result[key] = [value];\n  });\n\n  // Indexes the object's values by a criterion, similar to `groupBy`, but for\n  // when you know that your index values will be unique.\n  _.indexBy = group(function(result, value, key) {\n    result[key] = value;\n  });\n\n  // Counts instances of an object that group by a certain criterion. Pass\n  // either a string attribute to count by, or a function that returns the\n  // criterion.\n  _.countBy = group(function(result, value, key) {\n    if (_.has(result, key)) result[key]++; else result[key] = 1;\n  });\n\n  // Use a comparator function to figure out the smallest index at which\n  // an object should be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iteratee, context) {\n    iteratee = cb(iteratee, context, 1);\n    var value = iteratee(obj);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = low + high >>> 1;\n      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n    }\n    return low;\n  };\n\n  // Safely create a real, live array from anything iterable.\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (obj.length === +obj.length) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return obj.length === +obj.length ? obj.length : _.keys(obj).length;\n  };\n\n  // Split a collection into two arrays: one whose elements all satisfy the given\n  // predicate, and one whose elements all do not satisfy the predicate.\n  _.partition = function(obj, predicate, context) {\n    predicate = cb(predicate, context);\n    var pass = [], fail = [];\n    _.each(obj, function(value, key, obj) {\n      (predicate(value, key, obj) ? pass : fail).push(value);\n    });\n    return [pass, fail];\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head` and `take`. The **guard** check\n  // allows it to work with `_.map`.\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[0];\n    return _.initial(array, array.length - n);\n  };\n\n  // Returns everything but the last entry of the array. Especially useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if (n == null || guard) return array[array.length - 1];\n    return _.rest(array, Math.max(0, array.length - n));\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.\n  // Especially useful on the arguments object. Passing an **n** will return\n  // the rest N values in the array. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, n == null || guard ? 1 : n);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n\n  // Internal implementation of a recursive `flatten` function.\n  var flatten = function(input, shallow, strict, startIndex) {\n    var output = [], idx = 0, value;\n    for (var i = startIndex || 0, length = input && input.length; i < length; i++) {\n      value = input[i];\n      if (value && value.length >= 0 && (_.isArray(value) || _.isArguments(value))) {\n        //flatten current level of array or arguments object\n        if (!shallow) value = flatten(value, shallow, strict);\n        var j = 0, len = value.length;\n        output.length += len;\n        while (j < len) {\n          output[idx++] = value[j++];\n        }\n      } else if (!strict) {\n        output[idx++] = value;\n      }\n    }\n    return output;\n  };\n\n  // Flatten out an array, either recursively (by default), or just one level.\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, false);\n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iteratee, context) {\n    if (array == null) return [];\n    if (!_.isBoolean(isSorted)) {\n      context = iteratee;\n      iteratee = isSorted;\n      isSorted = false;\n    }\n    if (iteratee != null) iteratee = cb(iteratee, context);\n    var result = [];\n    var seen = [];\n    for (var i = 0, length = array.length; i < length; i++) {\n      var value = array[i],\n          computed = iteratee ? iteratee(value, i, array) : value;\n      if (isSorted) {\n        if (!i || seen !== computed) result.push(value);\n        seen = computed;\n      } else if (iteratee) {\n        if (!_.contains(seen, computed)) {\n          seen.push(computed);\n          result.push(value);\n        }\n      } else if (!_.contains(result, value)) {\n        result.push(value);\n      }\n    }\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(flatten(arguments, true, true));\n  };\n\n  // Produce an array that contains every item shared between all the\n  // passed-in arrays.\n  _.intersection = function(array) {\n    if (array == null) return [];\n    var result = [];\n    var argsLength = arguments.length;\n    for (var i = 0, length = array.length; i < length; i++) {\n      var item = array[i];\n      if (_.contains(result, item)) continue;\n      for (var j = 1; j < argsLength; j++) {\n        if (!_.contains(arguments[j], item)) break;\n      }\n      if (j === argsLength) result.push(item);\n    }\n    return result;\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = flatten(arguments, true, true, 1);\n    return _.filter(array, function(value){\n      return !_.contains(rest, value);\n    });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function(array) {\n    if (array == null) return [];\n    var length = _.max(arguments, 'length').length;\n    var results = Array(length);\n    while (length-- > 0) {\n      results[length] = _.pluck(arguments, length);\n    }\n    return results;\n  };\n\n  // Complement of _.zip. Unzip accepts an array of arrays and groups\n  // each array's elements on shared indices\n  _.unzip = function(array) {\n    return _.zip.apply(null, array);\n  };\n\n  // Converts lists into objects. Pass either a single array of `[key, value]`\n  // pairs, or two parallel arrays of the same length -- one of keys, and one of\n  // the corresponding values.\n  _.object = function(list, values) {\n    if (list == null) return {};\n    var result = {};\n    for (var i = 0, length = list.length; i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n\n  // Return the position of the first occurrence of an item in an array,\n  // or -1 if the item is not included in the array.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    var i = 0, length = array && array.length;\n    if (typeof isSorted == 'number') {\n      i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;\n    } else if (isSorted) {\n      i = _.sortedIndex(array, item);\n      return array[i] === item ? i : -1;\n    }\n    for (; i < length; i++) if (array[i] === item) return i;\n    return -1;\n  };\n\n  _.lastIndexOf = function(array, item, from) {\n    var idx = array ? array.length : 0;\n    if (typeof from == 'number') {\n      idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);\n    }\n    while (--idx >= 0) if (array[idx] === item) return idx;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = step || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var range = Array(length);\n\n    for (var idx = 0; idx < length; idx++, start += step) {\n      range[idx] = start;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Reusable constructor function for prototype setting.\n  var Ctor = function(){};\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if\n  // available.\n  _.bind = function(func, context) {\n    var args, bound;\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');\n    args = slice.call(arguments, 2);\n    bound = function() {\n      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\n      Ctor.prototype = func.prototype;\n      var self = new Ctor;\n      Ctor.prototype = null;\n      var result = func.apply(self, args.concat(slice.call(arguments)));\n      if (_.isObject(result)) return result;\n      return self;\n    };\n    return bound;\n  };\n\n  // Partially apply a function by creating a version that has had some of its\n  // arguments pre-filled, without changing its dynamic `this` context. _ acts\n  // as a placeholder, allowing any combination of arguments to be pre-filled.\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    return function() {\n      var position = 0;\n      var args = boundArgs.slice();\n      for (var i = 0, length = args.length; i < length; i++) {\n        if (args[i] === _) args[i] = arguments[position++];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return func.apply(this, args);\n    };\n  };\n\n  // Bind a number of an object's methods to that object. Remaining arguments\n  // are the method names to be bound. Useful for ensuring that all callbacks\n  // defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var i, length = arguments.length, key;\n    if (length <= 1) throw new Error('bindAll must be passed function names');\n    for (i = 1; i < length; i++) {\n      key = arguments[i];\n      obj[key] = _.bind(obj[key], obj);\n    }\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memoize = function(key) {\n      var cache = memoize.cache;\n      var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);\n      return cache[address];\n    };\n    memoize.cache = {};\n    return memoize;\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){\n      return func.apply(null, args);\n    }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time. Normally, the throttled function will run\n  // as much as it can, without ever going more than once per `wait` duration;\n  // but if you'd like to disable the execution on the leading edge, pass\n  // `{leading: false}`. To disable execution on the trailing edge, ditto.\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    if (!options) options = {};\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0 || remaining > wait) {\n        if (timeout) {\n          clearTimeout(timeout);\n          timeout = null;\n        }\n        previous = now;\n        result = func.apply(context, args);\n        if (!timeout) context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being called for\n  // N milliseconds. If `immediate` is passed, trigger the function on the\n  // leading edge, instead of the trailing.\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n\n      if (last < wait && last >= 0) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          if (!timeout) context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n\n  // Returns a negated version of the passed-in predicate.\n  _.negate = function(predicate) {\n    return function() {\n      return !predicate.apply(this, arguments);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var args = arguments;\n    var start = args.length - 1;\n    return function() {\n      var i = start;\n      var result = args[start].apply(this, arguments);\n      while (i--) result = args[i].call(this, result);\n      return result;\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n\n  // Returns a function that will only be executed before being called N times.\n  _.before = function(times, func) {\n    var memo;\n    return function() {\n      if (--times > 0) {\n        memo = func.apply(this, arguments);\n      } else {\n        func = null;\n      }\n      return memo;\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = _.partial(_.before, 2);\n\n  // Object Functions\n  // ----------------\n\n  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n  var hasEnumBug = !({toString: null}).propertyIsEnumerable('toString');\n  var nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString',\n                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n\n    // Ahem, IE < 9.\n    if (hasEnumBug) {\n      var nonEnumIdx = nonEnumerableProps.length;\n      while (nonEnumIdx--) {\n        var prop = nonEnumerableProps[nonEnumIdx];\n        if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);\n      }\n    }\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n\n  // Convert an object into a list of `[key, value]` pairs.\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n\n  // Invert the keys and values of an object. The values must be serializable.\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    var source, prop;\n    for (var i = 1, length = arguments.length; i < length; i++) {\n      source = arguments[i];\n      for (prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n    return obj;\n  };\n\n  // Return a copy of the object only containing the whitelisted properties.\n  _.pick = function(obj, iteratee, context) {\n    var result = {}, key;\n    if (obj == null) return result;\n    if (_.isFunction(iteratee)) {\n      iteratee = optimizeCb(iteratee, context);\n      for (key in obj) {\n        var value = obj[key];\n        if (iteratee(value, key, obj)) result[key] = value;\n      }\n    } else {\n      var keys = flatten(arguments, false, false, 1);\n      obj = new Object(obj);\n      for (var i = 0, length = keys.length; i < length; i++) {\n        key = keys[i];\n        if (key in obj) result[key] = obj[key];\n      }\n    }\n    return result;\n  };\n\n   // Return a copy of the object without the blacklisted properties.\n  _.omit = function(obj, iteratee, context) {\n    if (_.isFunction(iteratee)) {\n      iteratee = _.negate(iteratee);\n    } else {\n      var keys = _.map(flatten(arguments, false, false, 1), String);\n      iteratee = function(value, key) {\n        return !_.contains(keys, key);\n      };\n    }\n    return _.pick(obj, iteratee, context);\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    for (var i = 1, length = arguments.length; i < length; i++) {\n      var source = arguments[i];\n      for (var prop in source) {\n        if (obj[prop] === void 0) obj[prop] = source[prop];\n      }\n    }\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function for `isEqual`.\n  var eq = function(a, b, aStack, bStack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) return a !== 0 || 1 / a === 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwrap any wrapped objects.\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, regular expressions, dates, and booleans are compared by value.\n      case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return '' + a === '' + b;\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive.\n        // Object(NaN) is equivalent to NaN\n        if (+a !== +a) return +b !== +b;\n        // An `egal` comparison is performed for other numeric values.\n        return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n      case '[object Date]':\n      case '[object Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a === +b;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&\n                               _.isFunction(bCtor) && bCtor instanceof bCtor)\n                          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) return bStack[length] === b;\n    }\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n    var size, result;\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size === b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n        }\n      }\n    } else {\n      // Deep compare objects.\n      var keys = _.keys(a), key;\n      size = keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      result = _.keys(b).length === size;\n      if (result) {\n        while (size--) {\n          // Deep compare each member\n          key = keys[size];\n          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n        }\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    aStack.pop();\n    bStack.pop();\n    return result;\n  };\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, [], []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) === '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    var type = typeof obj;\n    return type === 'function' || type === 'object' && !!obj;\n  };\n\n  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.\n  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) === '[object ' + name + ']';\n    };\n  });\n\n  // Define a fallback version of the method in browsers (ahem, IE < 9), where\n  // there isn't any inspectable \"Arguments\" type.\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return _.has(obj, 'callee');\n    };\n  }\n\n  // Optimize `isFunction` if appropriate. Work around an IE 11 bug.\n  if (typeof /./ !== 'function') {\n    _.isFunction = function(obj) {\n      return typeof obj == 'function' || false;\n    };\n  }\n\n  // Is a given object a finite number?\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n\n  // Is the given value `NaN`? (NaN is the only number which does not equal itself).\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj !== +obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Shortcut function for checking if an object has a given property directly\n  // on itself (in other words, not on a prototype).\n  _.has = function(obj, key) {\n    return obj != null && hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iteratees.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Predicate-generating functions. Often useful outside of Underscore.\n  _.constant = function(value) {\n    return function() {\n      return value;\n    };\n  };\n\n  _.noop = function(){};\n\n  _.property = function(key) {\n    return function(obj) {\n      return obj == null ? void 0 : obj[key];\n    };\n  };\n\n  // Returns a predicate for checking whether an object has a given set of `key:value` pairs.\n  _.matches = function(attrs) {\n    var pairs = _.pairs(attrs), length = pairs.length;\n    return function(obj) {\n      if (obj == null) return !length;\n      obj = new Object(obj);\n      for (var i = 0; i < length; i++) {\n        var pair = pairs[i], key = pair[0];\n        if (pair[1] !== obj[key] || !(key in obj)) return false;\n      }\n      return true;\n    };\n  };\n\n  // Run a function **n** times.\n  _.times = function(n, iteratee, context) {\n    var accum = Array(Math.max(0, n));\n    iteratee = optimizeCb(iteratee, context, 1);\n    for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n    return accum;\n  };\n\n  // Return a random integer between min and max (inclusive).\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n\n  // A (possibly faster) way to get the current timestamp as an integer.\n  _.now = Date.now || function() {\n    return new Date().getTime();\n  };\n\n   // List of HTML entities for escaping.\n  var escapeMap = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#x27;',\n    '`': '&#x60;'\n  };\n  var unescapeMap = _.invert(escapeMap);\n\n  // Functions for escaping and unescaping strings to/from HTML interpolation.\n  var createEscaper = function(map) {\n    var escaper = function(match) {\n      return map[match];\n    };\n    // Regexes for identifying a key that needs to be escaped\n    var source = '(?:' + _.keys(map).join('|') + ')';\n    var testRegexp = RegExp(source);\n    var replaceRegexp = RegExp(source, 'g');\n    return function(string) {\n      string = string == null ? '' : '' + string;\n      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n    };\n  };\n  _.escape = createEscaper(escapeMap);\n  _.unescape = createEscaper(unescapeMap);\n\n  // If the value of the named `property` is a function then invoke it with the\n  // `object` as context; otherwise, return it.\n  _.result = function(object, property, fallback) {\n    var value = object == null ? void 0 : object[property];\n    if (value === void 0) {\n      return fallback;\n    }\n    return _.isFunction(value) ? object[property]() : value;\n  };\n\n  // Generate a unique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /(.)^/;\n\n  // Certain characters need to be escaped so that they can be put into a\n  // string literal.\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n  var escapeChar = function(match) {\n    return '\\\\' + escapes[match];\n  };\n\n  // JavaScript micro-templating, similar to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  // NB: `oldSettings` only exists for backwards compatibility.\n  _.template = function(text, settings, oldSettings) {\n    if (!settings && oldSettings) settings = oldSettings;\n    settings = _.defaults({}, settings, _.templateSettings);\n\n    // Combine delimiters into one regular expression via alternation.\n    var matcher = RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n\n    // Compile the template source, escaping string literals appropriately.\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset).replace(escaper, escapeChar);\n      index = offset + match.length;\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      } else if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      } else if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n\n      // Adobe VMs need the match returned to produce the correct offest.\n      return match;\n    });\n    source += \"';\\n\";\n\n    // If a variable is not specified, place data values in local scope.\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + 'return __p;\\n';\n\n    try {\n      var render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n\n    // Provide the compiled source as a convenience for precompilation.\n    var argument = settings.variable || 'obj';\n    template.source = 'function(' + argument + '){\\n' + source + '}';\n\n    return template;\n  };\n\n  // Add a \"chain\" function. Start chaining a wrapped Underscore object.\n  _.chain = function(obj) {\n    var instance = _(obj);\n    instance._chain = true;\n    return instance;\n  };\n\n  // OOP\n  // ---------------\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(instance, obj) {\n    return instance._chain ? _(obj).chain() : obj;\n  };\n\n  // Add your own custom functions to the Underscore object.\n  _.mixin = function(obj) {\n    _.each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result(this, func.apply(_, args));\n      };\n    });\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];\n      return result(this, obj);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  _.each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  // Extracts the result from a wrapped and chained object.\n  _.prototype.value = function() {\n    return this._wrapped;\n  };\n\n  // AMD registration happens at the end for compatibility with AMD loaders\n  // that may not enforce next-turn semantics on modules. Even though general\n  // practice for AMD registration is to be anonymous, underscore registers\n  // as a named module because, like jQuery, it is a base library that is\n  // popular enough to be bundled in a third party lib, but not be part of\n  // an AMD load request. Those cases could generate an error when an\n  // anonymous define() is called outside of a loader request.\n  if (typeof define === 'function' && define.amd) {\n    define('underscore', [], function() {\n      return _;\n    });\n  }\n}.call(this));\n"
  },
  {
    "path": "test/resources/unicode-error.js",
    "content": "T(e){var C,T,E,x,A,M,P,D,N,z,B=[],H={},j={},R={},L={},q=!1,I=null,F=null,O=null,U=0,X=[],Y=null,V=null,W=null,G=!1,Q=!1,$=10,K=30,J=!0,Z=!1,et=!1,tt=!1,nt=0,it=0,at=!1;function ot(e){e=e.replace(/https?:\\/\\/(m\\.)?vk\\.com\\/([^#]+#\\/)?/,\"\");for(var r,s,l,c=Q,u=[e,s=t(e,c)||e,l=n(e,c)||e,i(s),a(l)],d={},p=[],f=0,h=u.length;h>f;f++)u[f]&&!d[u[f]]&&(d[u[f]]=!0,r=o(u[f]),r=r.replace(/[]/gi,\"[]\").replace(/(e|yo)/gi,\"(?:e|yo)\"),p.push(new RegExp(\"(^|\\\\s|\\\\(|>)(\"+r+\")\",\"gi\")));return p}function rt(e,t,n){if(clearTimeout(F),!n)return F=setTimeout(function(){rt(e,t,!0)},10),!1;var i=r(e)||\"\";if(I==i)return!1;var a,o=\"_\"+i,l=j[o],c=ot(i);if(!l&&i.length>2&&j[\"_\"+i.slice(0,-2)]){var u=\"_\"+i.slice(0,-2);j[u]&&L[u]&&!j[u].length&&(!tt||tt&&!R[u])&&(L[o]=!0,l=j[o]=[],tt&&(R[o]=\"\"))}if(!l){l=[];var d=0;if(!i&&B.length)for(var p=U,f=U+Math.min($,B.length);f>p;p++)l.push([B[p]]),d++;else{for(var h={},_=0,p=0,f=B.length;f>p;p++){var v=B[p];if(H[v]){if(h[v]=!0,(a=lt(c,H[v][0]))&&(l.push([v,a]),++_>=K))"
  },
  {
    "path": "tools/build.sh",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\nPROJECT_DIR=\"`( cd \\\"$SCRIPT_DIR/..\\\" && pwd )`\"\n\nbuild_js()\n{\n  echo Building javascript...\n  cd $PROJECT_DIR\n\n  # jshint\n  $PROJECT_DIR/node_modules/.bin/jshint . || exit 1\n\n  # generate lib files\n  $PROJECT_DIR/node_modules/.bin/webpack || exit 1\n\n  mkdir -p ./js/lib/unpackers\n  cp -r ./js/src/unpackers ./js/lib/\n  cp ./js/src/cli.js ./js/lib/\n\n  # Wrap webkit output into an non-breaking form.\n  # In an upcoming verion these will be replaced with standard webpack umd\n  sed '/GENERATED_BUILD_OUTPUT/ r ./build/legacy/legacy_beautify_js.js' <./tools/template/beautify.wrapper.js >./js/lib/beautify.js || exit 1\n  sed '/GENERATED_BUILD_OUTPUT/ r ./build/legacy/legacy_beautify_css.js' <./tools/template/beautify-css.wrapper.js >./js/lib/beautify-css.js || exit 1\n  sed '/GENERATED_BUILD_OUTPUT/ r ./build/legacy/legacy_beautify_html.js' <./tools/template/beautify-html.wrapper.js >./js/lib/beautify-html.js || exit 1\n}\n\nbuild_beautify()\n{\n  cd $PROJECT_DIR\n    # beautify test and data\n  $PROJECT_DIR/js/bin/js-beautify.js --config $PROJECT_DIR/jsbeautifyrc -r $PROJECT_DIR/js/test/*.js || exit 1\n  $PROJECT_DIR/js/bin/js-beautify.js --config $PROJECT_DIR/jsbeautifyrc -r $PROJECT_DIR/js/test/core/*.js || exit 1\n  $PROJECT_DIR/js/bin/js-beautify.js --config $PROJECT_DIR/jsbeautifyrc -r $PROJECT_DIR/test/data/**/*.js || exit 1\n\n  # beautify product code\n  $PROJECT_DIR/js/bin/js-beautify.js --config $PROJECT_DIR/jsbeautifyrc -r $PROJECT_DIR/js/src/**/*.js || exit 1\n  $PROJECT_DIR/js/bin/js-beautify.js --config $PROJECT_DIR/jsbeautifyrc -r $PROJECT_DIR/web/*.js || exit 1\n\n  $PROJECT_DIR/js/bin/css-beautify.js --config $PROJECT_DIR/jsbeautifyrc -r $PROJECT_DIR/web/common-style.css || exit 1\n\n  $PROJECT_DIR/js/bin/html-beautify.js --config $PROJECT_DIR/jsbeautifyrc -r index.html\n\n  build_js\n}\n\nmain() {\n  cd $PROJECT_DIR\n  local ACTION\n  ACTION=build_${1:-full}\n  if [ -n \"$(type -t $ACTION)\" ] && [ \"$(type -t $ACTION)\" = \"function\" ]; then\n      $ACTION\n  else\n      build_help\n  fi\n\n}\n\n(main $*)\n"
  },
  {
    "path": "tools/generate-changelog.sh",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\n\n# based on https://gist.github.com/joelittlejohn/5937573\n#\n\nmain()\n{\n    cd $SCRIPT_DIR/..\n\n    if [ \"$#\" -ne 2 ]; then\n      echo \"Usage: ./generate-changelog.sh user/repo <github token>\"\n      exit 1\n    fi\n\n\n    local JQ\n    JQ=$(command -v jq) || {\n      echo \"Required tool 'jq' missing.  Failed.\"\n      exit 1\n    }\n\n    local GSORT\n    GSORT=$(command -v gsort || command -v sort) || {\n      echo \"Required tool 'GNU sort' missing.  Failed.\"\n      exit 1\n    }\n\n    IFS=$'\\n'\n    echo \"# Changelog\" > CHANGELOG.md\n\n    for m in $(\n        curl -s -H \"Authorization: token $2\" \"https://api.github.com/repos/$1/milestones?state=closed&per_page=100\" \\\n        | jq -c '.[] | [.title, .number]' \\\n        | sed 's/-/\\!/' | sort -rV  | sed 's/\\!/-/' # sed trick to put -alpha, -beta, etc earlier than GA release\n      ); do\n\n      echo \"Processing milestone: $title...\"\n      echo $m | sed 's/\\[\"\\(.*\\)\",.*\\]/\\n## \\1/' >> CHANGELOG.md\n      mid=$(echo $m | sed 's/.*,\\(.*\\)]/\\1/')\n\n      for i in $(curl -s -H \"Authorization: token $2\" \"https://api.github.com/repos/$1/issues?milestone=$mid&state=closed\" | jq -r '.[] | [.html_url, .number, .title, (.labels[] | select(.name == \"breaking\") | .name)] | @tsv'); do\n        if [ \"$(echo \"$i\" | cut -f 4)\" = \"breaking\" ]; then\n            echo \"* **$(echo \"$i\" | cut -f 3 | sed 's/_/\\\\_/g') ([#$(echo \"$i\" | cut -f 2)]($(echo \"$i\" | cut -f 1)))**\"  >> CHANGELOG.md\n        else\n            echo \"* $(echo \"$i\" | cut -f 3 | sed 's/_/\\\\_/g') ([#$(echo \"$i\" | cut -f 2)]($(echo \"$i\" | cut -f 1)))\"  >> CHANGELOG.md\n        fi\n      done\n    done\n\n    git commit -am \"Update Changelog\"\n}\n\n(main $*)\n"
  },
  {
    "path": "tools/git-status-clear.sh",
    "content": "#!/usr/bin/env bash\n\necho \"Post-build git status check...\"\necho \"Ensuring no changes visible to git have been made to '$*' ...\"\n\ngit status $* | egrep -q 'nothing to commit.*working (directory|tree) clean' || {\n    # we should find nothing to commit. If we don't, build has failed.\n    echo \"ERROR: Post-build git status check - FAILED.\"\n    echo \"Git status reported changes to non-git-ignore'd files.\"\n    echo \"TO REPRO: Run 'git status $*'.  The use git gui or git diff to see what was changed during the build.\"\n    echo \"TO FIX: Amend your commit and rebuild. Repeat until git status reports no changes both before and after the build.\"\n    echo \"OUTPUT FOR 'git status $*':\"\n    git status $*\n    echo \".\"\n    echo \"OUTPUT FOR 'git diff $*':\"\n    git diff $* | cat -t -e\n    exit 1\n}\necho \"Post-build git status check - Succeeded.\"\nexit 0\n"
  },
  {
    "path": "tools/node",
    "content": "#!/usr/bin/env bash\n\n/usr/bin/env node $@\n"
  },
  {
    "path": "tools/npm",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\nPROJECT_DIR=\"`( cd \\\"$SCRIPT_DIR/..\\\" && pwd )`\"\n\n# if you ask for the version from this script it will force an update to the latest version\nif [ \"$1\" == \"--version\" ]; then\n    echo Ensuring npm is up-to-date...\n    /usr/bin/env npm i npm --no-save\nfi\n\nif [ ! -f ${PROJECT_DIR}/node_modules/.bin/npm ]; then\n    /usr/bin/env npm i npm --no-save\nfi\n\n${PROJECT_DIR}/node_modules/.bin/npm $@\n\n# until this is fixed we ned to sed.\n# https://npm.community/t/some-packages-have-dist-tarball-as-http-and-not-https/285/16\nif [ -f package-lock.json ]; then\n    if [ \"`uname`\" = \"Darwin\" ]; then\n        sed -i '' -e 's/http:\\/\\//https:\\/\\//g' package-lock.json\n    else\n        sed -i -e 's/http:\\/\\//https:\\/\\//g' package-lock.json\n    fi\nfi\n"
  },
  {
    "path": "tools/python",
    "content": "#!/usr/bin/env bash\n\n/usr/bin/env python $@\n"
  },
  {
    "path": "tools/python-dev",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\nPROJECT_DIR=\"`( cd \\\"$SCRIPT_DIR/..\\\" && pwd )`\"\nPYTHON_ENV=python-dev\n\nif [ -d \"$PROJECT_DIR/build/$PYTHON_ENV/Scripts\" ]; then\n    RUN_FILE=\"$PROJECT_DIR/build/$PYTHON_ENV/Scripts/$1\"\nelse\n    RUN_FILE=\"$PROJECT_DIR/build/$PYTHON_ENV/bin/$1\"\nfi\n\nshift\n\n$RUN_FILE $@\n"
  },
  {
    "path": "tools/python-dev3",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\nPROJECT_DIR=\"`( cd \\\"$SCRIPT_DIR/..\\\" && pwd )`\"\nPYTHON_ENV=python-dev\nPYTHON_VERSION=\"`$PROJECT_DIR/build/$PYTHON_ENV/bin/python --version 2>&1`\"\n\n# only run the command on python3 \nif [ -z \"${PYTHON_VERSION##Python 3.*}\" ]; then\n    $SCRIPT_DIR/python-dev $@\nfi \n\n"
  },
  {
    "path": "tools/python-rel",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\nPROJECT_DIR=\"`( cd \\\"$SCRIPT_DIR/..\\\" && pwd )`\"\nPYTHON_ENV=python-rel\n\nif [ -d \"$PROJECT_DIR/build/$PYTHON_ENV/Scripts\" ]; then\n    RUN_FILE=\"$PROJECT_DIR/build/$PYTHON_ENV/Scripts/$1\"\nelse\n    RUN_FILE=\"$PROJECT_DIR/build/$PYTHON_ENV/bin/$1\"\nfi\n\nshift\n\n$RUN_FILE $@\n"
  },
  {
    "path": "tools/release-all.sh",
    "content": "#!/usr/bin/env bash\n\nREL_SCRIPT_DIR=\"`dirname \\\"$0\\\"`\"\nSCRIPT_DIR=\"`( cd \\\"$REL_SCRIPT_DIR\\\" && pwd )`\"\n\ncase \"$OSTYPE\" in\n    darwin*) PLATFORM=\"OSX\" ;;\n    linux*)  PLATFORM=\"LINUX\" ;;\n    bsd*)    PLATFORM=\"BSD\" ;;\n    *)       PLATFORM=\"UNKNOWN\" ;;\nesac\n\nrelease_python()\n{\n    cd $SCRIPT_DIR/..\n    git clean -xfd || exit 1\n    git fetch --all || exit 1\n\n    git checkout -B staging/release origin/staging/release\n    git clean -xfd || exit 1\n    cd python\n    # python setup.py register -r pypi\n    cp setup-js.py setup.py || exit 1\n    python setup.py sdist bdist_wheel || exit 1\n    cp setup-css.py setup.py || exit 1\n    python setup.py sdist bdist_wheel || exit 1\n    rm setup.py || exit 1\n    python -m twine upload dist/* || exit 1\n}\n\nrelease_node()\n{\n    cd $SCRIPT_DIR/..\n    git clean -xfd || exit 1\n    git fetch --all || exit 1\n\n    git checkout -B staging/release origin/staging/release\n    git clean -xfd || exit 1\n    unset NPM_TAG\n    if [[ $NEW_VERSION =~ .*(rc|beta).* ]]; then\n    NPM_TAG='--tag next'\n    fi\n    $SCRIPT_DIR/npm publish . $NPM_TAG || exit 1\n}\n\nrelease_web()\n{\n    cd $SCRIPT_DIR/..\n    git clean -xfd || exit 1\n    git fetch --all || exit 1\n\n    git checkout -B staging/gh-pages site/staging/gh-pages || exit 1\n    git reset --hard site/gh-pages || exit 1\n    git merge origin/staging/release --no-edit || exit 1\n    git push || exit 1\n\n    git checkout -B staging/main site/staging/main || exit 1\n    git reset --hard site/main || exit 1\n    git merge origin/staging/main --no-edit || exit 1\n    git push || exit 1\n}\n\nsedi() {\n    if [[ \"$PLATFORM\" == \"OSX\" || \"$PLATFORM\" == \"BSD\" ]]; then\n        sed -i \"\" $@\n    elif [ \"$PLATFORM\" == \"LINUX\" ]; then\n        sed -i $@\n    else\n        exit 1\n    fi\n}\n\nupdate_versions()\n{\n    cd $SCRIPT_DIR/..\n    git clean -xfd || exit 1\n    git fetch --all || exit 1\n\n    # trigger remote uses deploy key, push will cause downstream GitHub Actions to fire\n    git checkout -B staging/main trigger/staging/main || exit 1\n    git merge origin/main --no-edit || exit 1\n    git clean -xfd || exit 1\n\n    # Disabled due to build break\n     $SCRIPT_DIR/generate-changelog.sh beautifier/js-beautify $GITHUB_TOKEN || exit 1\n\n    $SCRIPT_DIR/npm version --no-git-tag-version $NEW_VERSION || exit 1\n\n    sedi -E 's@(cdnjs.cloudflare.+beautify/)[^/]+@\\1'$NEW_VERSION'@' README.md\n    sedi -E 's/\\((README\\.md:.js-beautify@).+\\)/(\\1'$NEW_VERSION')/' README.md\n\n    echo \"__version__ = \\\"$NEW_VERSION\\\"\" > python/jsbeautifier/__version__.py\n    echo \"__version__ = \\\"$NEW_VERSION\\\"\" > python/cssbeautifier/__version__.py\n    git add . || exit 1\n    git commit -am \"Bump version numbers for $NEW_VERSION\" || exit 1\n    git push || exit 1\n}\n\nupdate_release_branch()\n{\n    cd $SCRIPT_DIR/..\n    git clean -xfd || exit 1\n    git fetch --all || exit 1\n\n    git reset --hard\n    # trigger remote uses deploy key, push will cause downstream GitHub Actions to fire\n    git checkout -B staging/release trigger/staging/release || exit 1\n    git merge origin/release --no-edit || exit 1\n    git merge origin/staging/main --no-edit || exit 1\n\n    make js || exit 1\n    git add -f js/lib/ || exit 1\n    git add -f js/test/generated/\n    git add -f python/jsbeautifier/tests/generated/\n    git add -f python/cssbeautifier/tests/generated/\n\n    git commit -m \"Release: $NEW_VERSION\"\n    git tag \"v$NEW_VERSION\" || exit 1\n    git push || exit 1\n    git push --tags\n}\n\nmain()\n{\n    cd $SCRIPT_DIR/..\n\n    local NEW_VERSION=$1\n    NEW_VERSION=${NEW_VERSION/v/}\n\n    if [[ ! $NEW_VERSION =~ ^[0-9]+\\.[0-9]+\\.[0-9].*$ ]]; then\n        echo Version number must start with MAJOR.MINOR.INCREMENTAL numbering.\n        exit 1\n    fi\n\n    npm --version > /dev/null || {\n        echo ERROR: npm must be installed before attempting release\n        exit 1\n    }\n\n    twine -h > /dev/null || {\n        exit 1\n    }\n\n    update_versions\n    update_release_branch\n\n    release_python\n    release_node\n    release_web\n\n    git checkout main\n}\n\n(main $*)\n"
  },
  {
    "path": "tools/template/beautify-css.wrapper.js",
    "content": "/* AUTO-GENERATED. DO NOT MODIFY. */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n\n CSS Beautifier\n---------------\n\n    Written by Harutyun Amirjanyan, (amirjanyan@gmail.com)\n\n    Based on code initially developed by: Einar Lielmanis, <einar@beautifier.io>\n        https://beautifier.io/\n\n    Usage:\n        css_beautify(source_text);\n        css_beautify(source_text, options);\n\n    The options are (default in brackets):\n        indent_size (4)                         — indentation size,\n        indent_char (space)                     — character to indent with,\n        selector_separator_newline (true)       - separate selectors with newline or\n                                                  not (e.g. \"a,\\nbr\" or \"a, br\")\n        end_with_newline (false)                - end with a newline\n        newline_between_rules (true)            - add a new line after every css rule\n        space_around_selector_separator (false) - ensure space around selector separators:\n                                                  '>', '+', '~' (e.g. \"a>b\" -> \"a > b\")\n    e.g\n\n    css_beautify(css_source_text, {\n      'indent_size': 1,\n      'indent_char': '\\t',\n      'selector_separator': ' ',\n      'end_with_newline': false,\n      'newline_between_rules': true,\n      'space_around_selector_separator': true\n    });\n*/\n\n// http://www.w3.org/TR/CSS21/syndata.html#tokenization\n// http://www.w3.org/TR/css3-syntax/\n\n(function() {\n\n/* GENERATED_BUILD_OUTPUT */\n\nvar css_beautify = legacy_beautify_css;\n/* Footer */\nif (typeof define === \"function\" && define.amd) {\n    // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n    define([], function() {\n        return {\n            css_beautify: css_beautify\n        };\n    });\n} else if (typeof exports !== \"undefined\") {\n    // Add support for CommonJS. Just put this file somewhere on your require.paths\n    // and you will be able to `var html_beautify = require(\"beautify\").html_beautify`.\n    exports.css_beautify = css_beautify;\n} else if (typeof window !== \"undefined\") {\n    // If we're running a web page and don't have either of the above, add our one global\n    window.css_beautify = css_beautify;\n} else if (typeof global !== \"undefined\") {\n    // If we don't even have window, try global.\n    global.css_beautify = css_beautify;\n}\n\n}());\n"
  },
  {
    "path": "tools/template/beautify-html.wrapper.js",
    "content": "/* AUTO-GENERATED. DO NOT MODIFY. */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n\n Style HTML\n---------------\n\n  Written by Nochum Sossonko, (nsossonko@hotmail.com)\n\n  Based on code initially developed by: Einar Lielmanis, <einar@beautifier.io>\n    https://beautifier.io/\n\n  Usage:\n    style_html(html_source);\n\n    style_html(html_source, options);\n\n  The options are:\n    indent_inner_html (default false)  — indent <head> and <body> sections,\n    indent_size (default 4)          — indentation size,\n    indent_char (default space)      — character to indent with,\n    wrap_line_length (default 250)            -  maximum amount of characters per line (0 = disable)\n    brace_style (default \"collapse\") - \"collapse\" | \"expand\" | \"end-expand\" | \"none\"\n            put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line, or attempt to keep them where they are.\n    inline (defaults to inline tags) - list of tags to be considered inline tags\n    unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted\n    content_unformatted (defaults to [\"pre\", \"textarea\"] tags) - list of tags, whose content shouldn't be reformatted\n    indent_scripts (default normal)  - \"keep\"|\"separate\"|\"normal\"\n    preserve_newlines (default true) - whether existing line breaks before elements should be preserved\n                                        Only works before elements, not inside tags or for text.\n    max_preserve_newlines (default unlimited) - maximum number of line breaks to be preserved in one chunk\n    indent_handlebars (default false) - format and indent {{#foo}} and {{/foo}}\n    end_with_newline (false)          - end with a newline\n    extra_liners (default [head,body,/html]) -List of tags that should have an extra newline before them.\n\n    e.g.\n\n    style_html(html_source, {\n      'indent_inner_html': false,\n      'indent_size': 2,\n      'indent_char': ' ',\n      'wrap_line_length': 78,\n      'brace_style': 'expand',\n      'preserve_newlines': true,\n      'max_preserve_newlines': 5,\n      'indent_handlebars': false,\n      'extra_liners': ['/html']\n    });\n*/\n\n(function() {\n\n/* GENERATED_BUILD_OUTPUT */\n\nvar style_html = legacy_beautify_html;\n/* Footer */\nif (typeof define === \"function\" && define.amd) {\n    // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n    define([\"require\", \"./beautify\", \"./beautify-css\"], function(requireamd) {\n        var js_beautify = requireamd(\"./beautify\");\n        var css_beautify = requireamd(\"./beautify-css\");\n\n        return {\n            html_beautify: function(html_source, options) {\n                return style_html(html_source, options, js_beautify.js_beautify, css_beautify.css_beautify);\n            }\n        };\n    });\n} else if (typeof exports !== \"undefined\") {\n    // Add support for CommonJS. Just put this file somewhere on your require.paths\n    // and you will be able to `var html_beautify = require(\"beautify\").html_beautify`.\n    var js_beautify = require('./beautify.js');\n    var css_beautify = require('./beautify-css.js');\n\n    exports.html_beautify = function(html_source, options) {\n        return style_html(html_source, options, js_beautify.js_beautify, css_beautify.css_beautify);\n    };\n} else if (typeof window !== \"undefined\") {\n    // If we're running a web page and don't have either of the above, add our one global\n    window.html_beautify = function(html_source, options) {\n        return style_html(html_source, options, window.js_beautify, window.css_beautify);\n    };\n} else if (typeof global !== \"undefined\") {\n    // If we don't even have window, try global.\n    global.html_beautify = function(html_source, options) {\n        return style_html(html_source, options, global.js_beautify, global.css_beautify);\n    };\n}\n\n}());\n"
  },
  {
    "path": "tools/template/beautify.wrapper.js",
    "content": "/* AUTO-GENERATED. DO NOT MODIFY. */\n/*\n\n  The MIT License (MIT)\n\n  Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.\n\n  Permission is hereby granted, free of charge, to any person\n  obtaining a copy of this software and associated documentation files\n  (the \"Software\"), to deal in the Software without restriction,\n  including without limitation the rights to use, copy, modify, merge,\n  publish, distribute, sublicense, and/or sell copies of the Software,\n  and to permit persons to whom the Software is furnished to do so,\n  subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be\n  included in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n  SOFTWARE.\n\n JS Beautifier\n---------------\n\n\n  Written by Einar Lielmanis, <einar@beautifier.io>\n      https://beautifier.io/\n\n  Originally converted to javascript by Vital, <vital76@gmail.com>\n  \"End braces on own line\" added by Chris J. Shull, <chrisjshull@gmail.com>\n  Parsing improvements for brace-less statements by Liam Newman <bitwiseman@beautifier.io>\n\n\n  Usage:\n    js_beautify(js_source_text);\n    js_beautify(js_source_text, options);\n\n  The options are:\n    indent_size (default 4)          - indentation size,\n    indent_char (default space)      - character to indent with,\n    preserve_newlines (default true) - whether existing line breaks should be preserved,\n    max_preserve_newlines (default unlimited) - maximum number of line breaks to be preserved in one chunk,\n\n    jslint_happy (default false) - if true, then jslint-stricter mode is enforced.\n\n            jslint_happy        !jslint_happy\n            ---------------------------------\n            function ()         function()\n\n            switch () {         switch() {\n            case 1:               case 1:\n              break;                break;\n            }                   }\n\n    space_after_anon_function (default false) - should the space before an anonymous function's parens be added, \"function()\" vs \"function ()\",\n          NOTE: This option is overridden by jslint_happy (i.e. if jslint_happy is true, space_after_anon_function is true by design)\n\n    brace_style (default \"collapse\") - \"collapse\" | \"expand\" | \"end-expand\" | \"none\" | any of the former + \",preserve-inline\"\n            put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line, or attempt to keep them where they are.\n            preserve-inline will try to preserve inline blocks of curly braces\n\n    space_before_conditional (default true) - should the space before conditional statement be added, \"if(true)\" vs \"if (true)\",\n\n    unescape_strings (default false) - should printable characters in strings encoded in \\xNN notation be unescaped, \"example\" vs \"\\x65\\x78\\x61\\x6d\\x70\\x6c\\x65\"\n\n    wrap_line_length (default unlimited) - lines should wrap at next opportunity after this number of characters.\n          NOTE: This is not a hard limit. Lines will continue until a point where a newline would\n                be preserved if it were present.\n\n    end_with_newline (default false)  - end output with a newline\n\n\n    e.g\n\n    js_beautify(js_source_text, {\n      'indent_size': 1,\n      'indent_char': '\\t'\n    });\n\n*/\n\n(function() {\n\n/* GENERATED_BUILD_OUTPUT */\n\nvar js_beautify = legacy_beautify_js;\n/* Footer */\nif (typeof define === \"function\" && define.amd) {\n    // Add support for AMD ( https://github.com/amdjs/amdjs-api/wiki/AMD#defineamd-property- )\n    define([], function() {\n        return { js_beautify: js_beautify };\n    });\n} else if (typeof exports !== \"undefined\") {\n    // Add support for CommonJS. Just put this file somewhere on your require.paths\n    // and you will be able to `var js_beautify = require(\"beautify\").js_beautify`.\n    exports.js_beautify = js_beautify;\n} else if (typeof window !== \"undefined\") {\n    // If we're running a web page and don't have either of the above, add our one global\n    window.js_beautify = js_beautify;\n} else if (typeof global !== \"undefined\") {\n    // If we don't even have window, try global.\n    global.js_beautify = js_beautify;\n}\n\n}());\n\n"
  },
  {
    "path": "web/common-function.js",
    "content": "/*jshint strict:false, node:false */\n/*exported run_tests, read_settings_from_cookie, beautify, submitIssue, copyText, selectAll, clearAll, changeToFileContent, setPreferredColorScheme*/\nvar the = {\n  use_codemirror: !window.location.href.match(/without-codemirror/),\n  beautifier_file: window.location.href.match(/debug/) ? 'beautifier' : './beautifier.min',\n  beautifier: null,\n  beautify_in_progress: false,\n  editor: null // codemirror editor\n};\n\nrequirejs.config({\n  //By default load any module IDs from js/lib\n  baseUrl: 'js/lib',\n  paths: {\n    'beautifier': the.beautifier_file\n  }\n});\n\nrequirejs(['beautifier'],\n  function(beautifier) {\n    the.beautifier = beautifier;\n  });\n\n\nfunction any(a, b) {\n  return a || b;\n}\n\nfunction set_editor_mode() {\n  if (the.editor) {\n    var language = $('#language').val();\n    var mode = 'javascript';\n    if (language === 'js') {\n      mode = 'javascript';\n    } else if (language === 'html') {\n      mode = 'htmlmixed';\n    } else if (language === 'css') {\n      mode = 'css';\n    }\n    the.editor.setOption(\"mode\", mode);\n  }\n}\n\nfunction run_tests() {\n  $.when($.getScript(\"js/test/sanitytest.js\"),\n      $.getScript(\"js/test/generated/beautify-javascript-tests.js\"),\n      $.getScript(\"js/test/generated/beautify-css-tests.js\"),\n      $.getScript(\"js/test/generated/beautify-html-tests.js\"))\n    .done(function() {\n      var st = new SanityTest();\n      run_javascript_tests(st, Urlencoded, the.beautifier.js, the.beautifier.html, the.beautifier.css);\n      run_css_tests(st, Urlencoded, the.beautifier.js, the.beautifier.html, the.beautifier.css);\n      run_html_tests(st, Urlencoded, the.beautifier.js, the.beautifier.html, the.beautifier.css);\n      JavascriptObfuscator.run_tests(st);\n      P_A_C_K_E_R.run_tests(st);\n      Urlencoded.run_tests(st);\n      MyObfuscate.run_tests(st);\n      var results = st.results_raw()\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/ /g, '&nbsp;')\n        .replace(/\\r/g, '·')\n        .replace(/\\n/g, '<br>');\n      $('#testresults').html(results).show();\n    });\n}\n\nfunction read_settings_from_cookie() {\n  $('#tabsize').val(any(Cookies.get('tabsize'), '4'));\n  $('#brace-style').val(any(Cookies.get('brace-style'), 'collapse'));\n  $('#detect-packers').prop('checked', Cookies.get('detect-packers') === 'on');\n  $('#max-preserve-newlines').val(any(Cookies.get('max-preserve-newlines'), '5'));\n  $('#keep-array-indentation').prop('checked', Cookies.get('keep-array-indentation') === 'on');\n  $('#break-chained-methods').prop('checked', Cookies.get('break-chained-methods') === 'on');\n  $('#indent-scripts').val(any(Cookies.get('indent-scripts'), 'normal'));\n  $('#additional-options').val(any(Cookies.get('additional-options'), '{}'));\n  $('#space-before-conditional').prop('checked', Cookies.get('space-before-conditional') !== 'off');\n  $('#wrap-line-length').val(any(Cookies.get('wrap-line-length'), '0'));\n  $('#unescape-strings').prop('checked', Cookies.get('unescape-strings') === 'on');\n  $('#jslint-happy').prop('checked', Cookies.get('jslint-happy') === 'on');\n  $('#end-with-newline').prop('checked', Cookies.get('end-with-newline') === 'on');\n  $('#indent-inner-html').prop('checked', Cookies.get('indent-inner-html') === 'on');\n  $('#comma-first').prop('checked', Cookies.get('comma-first') === 'on');\n  $('#e4x').prop('checked', Cookies.get('e4x') === 'on');\n  $('#language').val(any(Cookies.get('language'), 'js'));\n  $('#indent-empty-lines').prop('checked', Cookies.get('indent-empty-lines') === 'on');\n}\n\nfunction store_settings_to_cookie() {\n  var opts = {\n    expires: 360\n  };\n  Cookies.set('tabsize', $('#tabsize').val(), opts);\n  Cookies.set('brace-style', $('#brace-style').val(), opts);\n  Cookies.set('detect-packers', $('#detect-packers').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('max-preserve-newlines', $('#max-preserve-newlines').val(), opts);\n  Cookies.set('keep-array-indentation', $('#keep-array-indentation').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('break-chained-methods', $('#break-chained-methods').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('space-before-conditional', $('#space-before-conditional').prop('checked') ? 'on' : 'off',\n    opts);\n  Cookies.set('unescape-strings', $('#unescape-strings').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('jslint-happy', $('#jslint-happy').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('end-with-newline', $('#end-with-newline').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('wrap-line-length', $('#wrap-line-length').val(), opts);\n  Cookies.set('indent-scripts', $('#indent-scripts').val(), opts);\n  Cookies.set('additional-options', $('#additional-options').val(), opts);\n  Cookies.set('indent-inner-html', $('#indent-inner-html').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('comma-first', $('#comma-first').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('e4x', $('#e4x').prop('checked') ? 'on' : 'off', opts);\n  Cookies.set('language', $('#language').val(), opts);\n  Cookies.set('indent-empty-lines', $('#indent-empty-lines').prop('checked') ? 'on' : 'off', opts);\n\n}\n\nfunction unpacker_filter(source) {\n  var leading_comments = '',\n    comment = '',\n    unpacked = '',\n    found = false;\n\n  // cuts leading comments\n  do {\n    found = false;\n    if (/^\\s*\\/\\*/.test(source)) {\n      found = true;\n      comment = source.substr(0, source.indexOf('*/') + 2);\n      source = source.substr(comment.length);\n      leading_comments += comment;\n    } else if (/^\\s*\\/\\//.test(source)) {\n      found = true;\n      comment = source.match(/^\\s*\\/\\/.*/)[0];\n      source = source.substr(comment.length);\n      leading_comments += comment;\n    }\n  } while (found);\n  leading_comments += '\\n';\n  source = source.replace(/^\\s+/, '');\n\n  var unpackers = [P_A_C_K_E_R, Urlencoded, JavascriptObfuscator /*, MyObfuscate*/ ];\n  for (var i = 0; i < unpackers.length; i++) {\n    if (unpackers[i].detect(source)) {\n      unpacked = unpackers[i].unpack(source);\n      if (unpacked !== source) {\n        source = unpacker_filter(unpacked);\n      }\n    }\n  }\n\n  return leading_comments + source;\n}\n\n/* exported downloadBeautifiedCode */\nfunction downloadBeautifiedCode() {\n  var content = the.editor ? the.editor.getValue() : $('#source').val();\n\n  // Getting the selected language to determine the file extension\n  var language = $('#language').val();\n  var fileExtension = \"txt\"; // Default extension\n\n  // Setting the  file extension based on the selected language\n  if (language === 'html') {\n    fileExtension = 'html';\n  } else if (language === 'css') {\n    fileExtension = 'css';\n  } else if (language === 'js') {\n    fileExtension = 'js';\n  }\n\n  // Creating a Blob object with the content\n  var blob = new Blob([content], { type: \"text/plain;charset=utf-8\" });\n\n  // Creating a temporary anchor element to trigger the download\n  var link = document.createElement(\"a\");\n  link.href = URL.createObjectURL(blob);\n  try {\n    link.download = \"beautified.\" + fileExtension; // Dynamic file name based on extension\n\n    // Triggering the download\n    link.click();\n  } finally {\n    // Cleanup\n    URL.revokeObjectURL(link.href);\n  }\n}\n\n\nfunction beautify() {\n  if (the.beautify_in_progress) {\n    return;\n  }\n\n  store_settings_to_cookie();\n\n  the.beautify_in_progress = true;\n\n  var source = the.editor ? the.editor.getValue() : $('#source').val(),\n    output,\n    opts = {};\n  the.lastInput = source;\n\n  var additional_options = $('#additional-options').val();\n\n  var language = $('#language').val();\n  the.language = $('#language option:selected').text();\n\n  opts.indent_size = $('#tabsize').val();\n  opts.indent_char = parseInt(opts.indent_size, 10) === 1 ? '\\t' : ' ';\n  opts.max_preserve_newlines = $('#max-preserve-newlines').val();\n  opts.preserve_newlines = opts.max_preserve_newlines !== \"-1\";\n  opts.keep_array_indentation = $('#keep-array-indentation').prop('checked');\n  opts.break_chained_methods = $('#break-chained-methods').prop('checked');\n  opts.indent_scripts = $('#indent-scripts').val();\n  opts.brace_style = $('#brace-style').val() + ($('#brace-preserve-inline').prop('checked') ? \",preserve-inline\" : \"\");\n  opts.space_before_conditional = $('#space-before-conditional').prop('checked');\n  opts.unescape_strings = $('#unescape-strings').prop('checked');\n  opts.jslint_happy = $('#jslint-happy').prop('checked');\n  opts.end_with_newline = $('#end-with-newline').prop('checked');\n  opts.wrap_line_length = $('#wrap-line-length').val();\n  opts.indent_inner_html = $('#indent-inner-html').prop('checked');\n  opts.comma_first = $('#comma-first').prop('checked');\n  opts.e4x = $('#e4x').prop('checked');\n  opts.indent_empty_lines = $('#indent-empty-lines').prop('checked');\n\n  $('#additional-options-error').hide();\n  $('#open-issue').hide();\n\n  if (additional_options && additional_options !== '{}') {\n    try {\n      additional_options = JSON.parse(additional_options);\n      opts = mergeObjects(opts, additional_options);\n    } catch (e) {\n      $('#additional-options-error').show();\n    }\n  }\n\n  var selectedOptions = JSON.stringify(opts, null, 2);\n  $('#options-selected').val(selectedOptions);\n\n  if (language === 'html') {\n    output = the.beautifier.html(source, opts);\n  } else if (language === 'css') {\n    output = the.beautifier.css(source, opts);\n  } else {\n    if ($('#detect-packers').prop('checked')) {\n      source = unpacker_filter(source);\n    }\n    output = the.beautifier.js(source, opts);\n  }\n\n  if (the.editor) {\n    the.editor.setValue(output);\n  } else {\n    $('#source').val(output);\n  }\n\n  the.lastOutput = output;\n  the.lastOpts = selectedOptions;\n\n  $('#open-issue').show();\n  set_editor_mode();\n\n  the.beautify_in_progress = false;\n}\n\nfunction mergeObjects(allOptions, additionalOptions) {\n  var finalOpts = {};\n  var name;\n\n  for (name in allOptions) {\n    finalOpts[name] = allOptions[name];\n  }\n  for (name in additionalOptions) {\n    finalOpts[name] = additionalOptions[name];\n  }\n  return finalOpts;\n}\n\nfunction submitIssue() {\n  var url = 'https://github.com/beautifier/js-beautify/issues/new?';\n\n  var encoded = encodeURIComponent(getSubmitIssueBody()).replace(/%20/g, \"+\");\n  if (encoded.length > 7168) {\n    var confirmText = [\n      'The sample text is too long for automatic template creation.',\n      '',\n      'Click OK to continue and create an issue starting with template defaults.',\n      'Click CANCEL to return to the beautifier and try beautifying a shorter sample.'\n    ];\n\n    if (!confirm(confirmText.join('\\n'))) {\n      $('#open-issue').hide();\n      return;\n    }\n    encoded = encodeURIComponent(getSubmitIssueBody(true)).replace(/%20/g, \"+\");\n  }\n  url += 'body=' + encoded;\n\n  console.log(url);\n  console.log(url.length);\n\n  window.open(url, '_blank').focus();\n}\n\nfunction getSubmitIssueBody(trucate) {\n  var input = the.lastInput;\n  var output = the.lastOutput;\n\n  if (trucate) {\n    input = '/* Your input text */';\n    output = '/* Output text currently returned by the beautifier */';\n  }\n\n  var submit_body = [\n    '# Description',\n    '<!-- Describe your scenario here -->',\n    '',\n    '## Input',\n    'The code looked like this before beautification:',\n    '```',\n    input,\n    '```',\n    '',\n    '## Current Output',\n    'The  code actually looked like this after beautification:',\n    '```',\n    output,\n    '```',\n    '',\n    '## Expected Output',\n    'The code should have looked like this after beautification:',\n    '```',\n    '/* Your desired output text */',\n    '```',\n    '',\n    '# Environment',\n    '',\n    '## Browser User Agent:',\n    navigator.userAgent,\n    '',\n    'Language Selected:',\n    the.language,\n    '',\n    '## Settings',\n    '```json',\n    the.lastOpts,\n    '```',\n    ''\n  ];\n  return submit_body.join('\\n');\n}\n\nfunction copyText() {\n  if (the.editor) {\n    the.editor.execCommand('selectAll');\n    var currentText = the.editor.getValue();\n    var copyArea = $('<textarea />')\n      .text(currentText)\n      .attr('readonly', '')\n      .css({ 'position': 'absolute', 'left': '-9999px' });\n\n    $('body').append(copyArea);\n    copyArea.select();\n    document.execCommand('copy');\n    copyArea.remove();\n  } else {\n    $('#source').select();\n    document.execCommand('copy');\n  }\n}\n\nfunction selectAll() {\n  if (the.editor) {\n    the.editor.execCommand('selectAll');\n  } else {\n    $('#source').select();\n  }\n}\n\nfunction clearAll() {\n  if (the.editor) {\n    the.editor.setValue('');\n  } else {\n    $('#source').val('');\n  }\n}\n\nfunction changeToFileContent(input) {\n  var file = input.files[0];\n  if (file) {\n    var reader = new FileReader();\n    reader.readAsText(file, \"UTF-8\");\n    reader.onload = function(event) {\n      if (the.editor) {\n        the.editor.setValue(event.target.result);\n      } else {\n        $('#source').val(event.target.result);\n      }\n    };\n  }\n}\n\nfunction setPreferredColorScheme() {\n  var themeToggleBtn = document.querySelector('#theme-toggle-btn');\n  themeToggleBtn.addEventListener('change', switchTheme, false);\n  var isPreferredColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n  if (isPreferredColorSchemeDark) {\n    themeToggleBtn.checked = true;\n    $('.CodeMirror').addClass('cm-s-darcula');\n    $('body').addClass('dark-mode');\n    $('.logo').children('img').attr(\"src\", \"web/banner-dark.svg\");\n  }\n}\n\nfunction switchTheme(themeToggleEvent) {\n  if (themeToggleEvent.target.checked) {\n    $('.CodeMirror').addClass('cm-s-darcula');\n    $('body').addClass('dark-mode');\n    $('.logo').children('img').attr(\"src\", \"web/banner-dark.svg\");\n\n    $('#theme-text').text('Enable Light Mode');\n  } else {\n    $('.CodeMirror').removeClass('cm-s-darcula');\n    $('body').removeClass('dark-mode');\n    $('.logo').children('img').attr(\"src\", \"web/banner-light.svg\");\n\n    $('#theme-text').text('Enable Dark Mode');\n  }\n}\n"
  },
  {
    "path": "web/common-style.css",
    "content": "body {\n  background: #eee;\n  color: #333;\n  height: 95vh;\n  margin: 8px;\n  max-width: 100%;\n  font: 13px/1.231 arial, sans-serif;\n}\n\na.self {\n  font-weight: bold;\n  text-decoration: none;\n  color: #444;\n  border-bottom: 1px solid #aaa\n}\n\nh1.logo {\n  display: flex;\n  line-height: 1em;\n  margin: 0;\n}\n\nh1 img {\n  font-family: montserrat, nexa, gotham, sans-serif;\n  font-weight: 600;\n}\n\np, select, label, .blurb, a.turn-off-codemirror {\n  font-size: small;\n}\n\n.sub-title {\n  margin-bottom: 8px;\n}\n\n.title {\n  margin-left: 40px;\n}\n\ntextarea {\n  width: 100%;\n}\n\ntextarea#source {\n  width: 100%;\n  height: 100%;\n}\n\na.turn-off-codemirror {\n  margin-left: 25px;\n}\n\ninput[type=\"checkbox\"], select, button {\n  cursor: pointer;\n}\n\n#version-number {\n  align-self: flex-end;\n  font-family: arial, sans-serif;\n  font-size: .5em;\n  margin-left: 10px;\n}\n\n#testresults {\n  display: none;\n  font-family: monaco, consolas, \"lucida console\", \"courier new\", monospace;\n}\n\n.CodeMirror {\n  border: 1px solid #ccc;\n  height: 100%;\n  font-size: 90%;\n  background: white;\n}\n\n.hide {\n  display: none;\n}\n\n.container {\n  max-width: 95%;\n  display: grid;\n  grid-template-columns: 65% 35%;\n  grid-template-rows: 0.2fr 1.8fr;\n  gap: 0 14px;\n  grid-auto-flow: row;\n  grid-template-areas:\n    \"title options\"\n    \"editor options\";\n}\n\n.title {\n  grid-area: title;\n}\n\n.editor {\n  grid-area: editor;\n}\n\n.options {\n  grid-area: options;\n}\n\nselect, .buttons-box button {\n  background-color: white;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  line-height: 1.5em;\n  padding: 0.5em;\n  margin: 0 0 5px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\nselect {\n  display: block;\n}\n\n.options-checkboxes, .options-select {\n  display: inline-table;\n  max-width: 100%;\n}\n\n#language {\n  font-size: 20px;\n  width: 100%;\n  padding-left: 16px;\n  font-weight: 800;\n  margin-bottom: 10px;\n}\n\n.buttons-box {\n  margin-top: 20px;\n}\n\n.buttons-box .submit {\n  margin-top: 10px;\n  margin-bottom: 10px;\n  display: block;\n  font-size: 1.5em;\n  width: 100%;\n  background-color: #7cffcb;\n  background-image: linear-gradient(315deg, #7cffcb 0%, #74f2ce 74%);\n}\n\n.buttons-box .control {\n  background-color: #2e3138;\n  color: white;\n  display: inline-flex;\n}\n\n@media only screen and (max-width: 800px) {\n  .container {\n    grid-template-columns: 100%;\n    grid-template-areas:\n      \"title\"\n      \"editor\"\n      \"options\";\n    grid-template-rows: 0.1fr 1.8fr 0.1fr;\n    max-width: 100%;\n  }\n\n  .options-checkboxes, .options-select {\n    max-width: 50%;\n  }\n\n  .title {\n    margin-left: 10px;\n  }\n\n  .editor, .title, .options {\n    max-width: 100%;\n  }\n\n  .CodeMirror {\n    height: 50vh;\n  }\n}\n\n.dark-mode {\n  background: #202124;\n  color: #f8f9fa;\n}\n\n.dark-mode a {\n  color: #9da2ff;\n}\n\n.dark-mode a:visited {\n  color: #d7affb;\n}\n\n.dark-mode a.self {\n  color: #d2d3d7;\n}\n\n.dark-mode select,\n.dark-mode textarea {\n  background-color: #2e3037;\n  color: #e8eaed;\n  border: 1px solid #333333;\n}\n\n#theme-toggle-wrapper {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  margin: 5px;\n}\n\n#theme-toggle-wrapper span {\n  margin-left: 10px;\n  font-size: 1rem;\n}\n\n#theme-toggle-label {\n  display: inline-block;\n  height: 20px;\n  position: relative;\n  width: 40px;\n}\n\n#theme-toggle-slider {\n  background-color: #ccc;\n  bottom: 0;\n  cursor: pointer;\n  left: 0;\n  position: absolute;\n  right: 0;\n  top: 0;\n  transition: .4s;\n}\n\n#theme-toggle-slider:before {\n  background-color: #fff;\n  content: \"\";\n  height: 20px;\n  position: absolute;\n  transition: .4s;\n  width: 20px;\n}\n\ninput:checked+#theme-toggle-slider {\n  background-color: #66bb6a;\n}\n\ninput:checked+#theme-toggle-slider:before {\n  transform: translateX(20px);\n}\n\n#theme-toggle-slider {\n  border-radius: 20px;\n}\n\n#theme-toggle-slider:before {\n  border-radius: 50%;\n}\n"
  },
  {
    "path": "web/google-analytics.js",
    "content": "(function(i, s, o, g, r, a, m) {\n  i['GoogleAnalyticsObject'] = r;\n  i[r] = i[r] || function() {\n    (i[r].q = i[r].q || []).push(arguments)\n  }, i[r].l = 1 * new Date();\n  a = s.createElement(o),\n    m = s.getElementsByTagName(o)[0];\n  a.async = 1;\n  a.src = g;\n  m.parentNode.insertBefore(a, m)\n})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');\n\nga('create', 'UA-7409939-1', 'auto'); // Replace with your property ID.\nga('send', 'pageview');\n"
  },
  {
    "path": "web/onload.js",
    "content": "/*jshint node:false, jquery:true, strict:false */\n$(function() {\n\n  read_settings_from_cookie();\n  $.getJSON(\"./package.json\", function(data) {\n    $('#version-number').text('(v' + data.version + ')');\n  });\n\n  var default_text =\n    \"// This is just a sample script. Paste your real code (javascript or HTML) here.\\n\\nif ('this_is'==/an_example/){of_beautifier();}else{var a=b?(c%d):e[f];}\";\n  var textArea = $('#source')[0];\n  $('#source').val(default_text);\n\n  if (the.use_codemirror && typeof CodeMirror !== 'undefined') {\n\n    the.editor = CodeMirror.fromTextArea(textArea, {\n      lineNumbers: true\n    });\n\n    set_editor_mode();\n    the.editor.focus();\n\n    $('.CodeMirror').click(function() {\n      if (the.editor.getValue() === default_text) {\n        the.editor.setValue('');\n      }\n    });\n  } else {\n    $('#source').bind('click focus', function() {\n      if ($(this).val() === default_text) {\n        $(this).val('');\n      }\n    }).bind('blur', function() {\n      if (!$(this).val()) {\n        $(this).val(default_text);\n      }\n    });\n  }\n\n  setPreferredColorScheme();\n\n  $(window).bind('keydown', function(e) {\n    if ((e.ctrlKey || e.metaKey) && e.keyCode === 13) {\n      beautify();\n    }\n  });\n\n  if (typeof window.navigator !== \"undefined\" && typeof window.navigator.platform === \"string\" && window.navigator.platform.includes(\"Mac\")) {\n    $(\".submit em\").text(\"(cmd-enter)\");\n  }\n\n  $('.submit').click(beautify);\n  $('select').change(beautify);\n  $(':checkbox').change(beautify);\n  $('#additional-options').change(beautify);\n\n\n\n\n});\n"
  },
  {
    "path": "webpack.config.js",
    "content": "var path = require('path');\n\nvar legacy = {\n  mode: 'none',\n  entry: {\n    beautify_js: './js/src/javascript/index.js',\n    beautify_css: './js/src/css/index.js',\n    beautify_html: './js/src/html/index.js'\n  },\n  resolve: {\n    modules: [ path.resolve(__dirname, \"js/src\") ]\n  },\n  output: {\n    library: 'legacy_[name]',\n    filename: 'legacy_[name].js',\n    path: path.resolve(__dirname, 'build/legacy')\n  }\n};\n\nvar dist_full = {\n  entry: './js/src/index.js',\n  mode: 'none',\n  resolve: {\n    modules: [ path.resolve(__dirname, \"js/src\") ]\n  },\n  devtool: 'source-map',\n  output: {\n    library: 'beautifier',\n    libraryTarget: 'umd',\n    umdNamedDefine: true,\n    filename: 'beautifier.js',\n    path: path.resolve(__dirname, 'js/lib'),\n    // Workaround for https://github.com/webpack/webpack/issues/6525\n    globalObject: \"typeof self !== 'undefined' ? self : typeof windows !== 'undefined' ? window : typeof global !== 'undefined' ? global : this\"\n  }\n};\n\nvar dist_prod = {\n  entry: './js/src/index.js',\n  mode: 'production',\n  resolve: {\n    modules: [ path.resolve(__dirname, \"js/src\") ]\n  },\n  devtool: 'source-map',\n  output: {\n    library: 'beautifier',\n    libraryTarget: 'umd',\n    umdNamedDefine: true,\n    filename: 'beautifier.min.js',\n    path: path.resolve(__dirname, 'js/lib'),\n    // Workaround for https://github.com/webpack/webpack/issues/6525\n    globalObject: \"typeof self !== 'undefined' ? self : typeof windows !== 'undefined' ? window : typeof global !== 'undefined' ? global : this\"\n  }\n};\n\n\nmodule.exports = [dist_full, dist_prod, legacy];\n"
  }
]