[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\n\n[*.md]\ntrim_trailing_whitespace = false"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto\n\n/.github export-ignore\n/build export-ignore\n/docs export-ignore\n/tests export-ignore\n.editorconfig export-ignore\n.gitattributes export-ignore\n.gitignore export-ignore\n/CHANGELOG.md export-ignore\nphpunit.xml.dist export-ignore\n/phpstan.neon export-ignore\n/phpstan-baseline.neon export-ignore\n/.nvmrc export-ignore\n/eslint.config.js export-ignore\n/mkdocs.yml export-ignore\n/package.json export-ignore\n/package-lock.json export-ignore\n/pint.json export-ignore\n/UPGRADE.md export-ignore\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: barryvdh\ncustom: ['https://fruitcake.nl']\n\n"
  },
  {
    "path": ".github/release-drafter.yml",
    "content": "template: |\n  ## What’s Changed\n\n  $CHANGES\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 7\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - bug\n  - enhancement\n  - discussion\n# Label to use when marking an issue as stale\nstaleLabel: stale\n# Comment to post when marking an issue as stale. Set to `false` to disable\nmarkComment: >\n  This issue has been automatically marked as stale because it has not had\n  recent activity. It will be closed if no further activity occurs. \n  \n  If this issue is still present on the latest version of this library on supported Laravel versions, \n  please let us know by replying to this issue so we can investigate further.\n  \n  Thank you for your contribution! Apologies for any delayed response on our side.\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\n# Limit to only `issues` or `pulls`\nonly: issues\n"
  },
  {
    "path": ".github/workflows/build-docs.yml",
    "content": "name: Build docs\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - master\n    paths:\n      - 'resources/**'\n      - 'docs/**'\n      - 'tests/DebugbarDocsTest.php'\npermissions:\n  contents: write\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Configure Git Credentials\n        run: |\n          git config user.name github-actions[bot]\n          git config user.email 41898282+github-actions[bot]@users.noreply.github.com\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: 8.2\n          coverage: none\n          tools: composer:v2\n\n      - name: Install dependencies\n        run: composer update --prefer-dist --no-progress\n\n      - name: Run docs test\n        run: php vendor/bin/phpunit --filter=testItInjectsOnDocs\n\n      - name: Run build script\n        run: php build/build-docs.php\n\n      - uses: actions/setup-python@v6\n        with:\n          python-version: 3.x\n\n      - run: echo \"cache_id=$(date --utc '+%V')\" >> $GITHUB_ENV\n\n      - uses: actions/cache@v5\n        with:\n          key: mkdocs-material-${{ env.cache_id }}\n          path: .cache\n          restore-keys: |\n            mkdocs-material-\n\n      - run: pip install mkdocs-material\n\n      - run: mkdocs gh-deploy --force\n"
  },
  {
    "path": ".github/workflows/fix-code-style.yml",
    "content": "name: Fix Code Style\n\non:\n    push:\n        branches:\n            - master\n        paths:\n            - '**.php'\n    pull_request:\n        branches:\n            - \"*\"\n        paths:\n            - '**.php'\n\npermissions:\n    contents: write\n\njobs:\n    cs-fix:\n        runs-on: ubuntu-24.04\n        timeout-minutes: 15\n        env:\n            COMPOSER_NO_INTERACTION: 1\n\n        steps:\n            - name: Checkout code\n              uses: actions/checkout@v6\n\n            - name: Setup PHP\n              uses: shivammathur/setup-php@v2\n              with:\n                  php-version: 8.4\n                  coverage: none\n                  tools: composer:v2\n\n            - name: Install dependencies\n              run: composer update --prefer-dist --no-progress\n\n            - name: Fix Code Style\n              run: vendor/bin/pint\n\n            - name: Commit changes\n              uses: stefanzweifel/git-auto-commit-action@v7\n              with:\n                  commit_message: Fix CS\n"
  },
  {
    "path": ".github/workflows/integration-tests.yml",
    "content": "name: Integration Tests\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - \"*\"\n\njobs:\n  php-laravel-integration-tests:\n    runs-on: ubuntu-24.04\n\n    timeout-minutes: 15\n\n    env:\n      COMPOSER_NO_INTERACTION: 1\n\n    strategy:\n      fail-fast: false\n      matrix:\n        php: [8.5, 8.4, 8.3, 8.2]\n        laravel: ['11.*', '12.*', '13.*']\n        exclude:\n          - laravel: 13.*\n            php: 8.2\n\n    name: P${{ matrix.php }} - Laravel${{ matrix.laravel }}\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n        with:\n          path: src\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          coverage: none\n          tools: composer:v2\n\n      - name: Install dependencies\n        run: |\n          composer create-project --prefer-dist laravel/laravel:${{ matrix.laravel }} --stability=dev --no-progress sample\n          cd sample\n          composer config minimum-stability dev\n          composer update --prefer-stable --prefer-dist --no-progress\n\n      - name: Add package from source\n        run: |\n          cd sample\n          sed -e 's|\"type\": \"project\",|&\\n\"repositories\": [ { \"type\": \"path\", \"url\": \"../src\" } ],|' -i composer.json\n          composer require --dev \"fruitcake/laravel-debugbar:*\"\n\n      - name: Execute generate run\n        run: |\n          cd sample\n          mkdir -p \"storage/debugbar/\" && touch \"storage/debugbar/foo.json\"\n          php artisan debugbar:clear\n\n      - name: Check file count in logs\n        run: |\n          echo \"Files in sample/storage/debugbar/:\"\n          ls -la \"sample/storage/debugbar/\"\n          FILE_COUNT=$(ls -1q \"sample/storage/debugbar/\" | wc -l)\n          echo \"File count: $FILE_COUNT\"\n          if [ \"$FILE_COUNT\" -gt 0 ]; then\n            echo \"ERROR: Expected 0 files but found $FILE_COUNT\"\n            echo \"File contents:\"\n            for f in sample/storage/debugbar/*; do\n              echo \"--- $f ---\"\n              head -c 500 \"$f\"\n              echo \"\"\n            done\n            exit 1\n          fi\n"
  },
  {
    "path": ".github/workflows/livewire-tests.yml",
    "content": "name: Livewire Tests\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - *\n\njobs:\n  unit-tests:\n    runs-on: ubuntu-24.04\n\n    timeout-minutes: 15\n\n    env:\n      COMPOSER_NO_INTERACTION: 1\n\n    strategy:\n      fail-fast: false\n      matrix:\n        php: [8.2, '8.3', '8.4', '8.5']\n        livewire: [^3, ^4]\n\n    name: Livewire${{ matrix.livewire }}\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          coverage: none\n          tools: composer:v2\n          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif\n\n      - name: Install dependencies\n        run: |\n          composer remove --dev --no-update larastan/larastan phpstan/phpstan-phpunit laravel/pint phpstan/phpstan-strict-rules shipmonk/phpstan-rules\n          composer require \"livewire/livewire:${{ matrix.livewire }}\" --no-interaction --no-update\n          composer update --prefer-stable --prefer-dist --no-progress\n\n      - name: Update Dusk Chromedriver\n        run: vendor/bin/dusk-updater detect --auto-update\n\n      - name: Execute Unit Tests\n        run: composer test\n\n      - name: Upload Failed Screenshots\n        uses: actions/upload-artifact@v6\n        if: failure()\n        with:\n          name: screenshots\n          path: tests/Browser/screenshots/*\n"
  },
  {
    "path": ".github/workflows/release-drafter.yml",
    "content": "name: Release Drafter\n\non:\n  push:\n    # branches to consider in the event; optional, defaults to all\n    branches:\n      - master\n  # pull_request event is required only for autolabeler\n  pull_request:\n    # Only following types are handled by the action, but one can default to all as well\n    types: [opened, reopened, synchronize]\n  # pull_request_target event is required for autolabeler to support PRs from forks\n  # pull_request_target:\n  #   types: [opened, reopened, synchronize]\n\npermissions:\n  contents: read\n\njobs:\n  update_release_draft:\n    permissions:\n      # write permission is required to create a github release\n      contents: write\n      # write permission is required for autolabeler\n      # otherwise, read permission is required at least\n      pull-requests: write\n    runs-on: ubuntu-latest\n    steps:\n      # (Optional) GitHub Enterprise requires GHE_HOST variable set\n      #- name: Set GHE_HOST\n      #  run: |\n      #    echo \"GHE_HOST=${GITHUB_SERVER_URL##https:\\/\\/}\" >> $GITHUB_ENV\n\n      # Drafts your next Release notes as Pull Requests are merged into \"master\"\n      - uses: release-drafter/release-drafter@v6\n        # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml\n        # with:\n        #   config-name: my-config.yml\n        #   disable-autolabeler: true\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/static-analysis.yml",
    "content": "name: Code Analysis\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - \"*\"\n\njobs:\n  static-analysis:\n    runs-on: ubuntu-24.04\n    timeout-minutes: 15\n    env:\n      COMPOSER_NO_INTERACTION: 1\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v6\n\n    - name: Setup PHP\n      uses: shivammathur/setup-php@v2\n      with:\n        php-version: 8.4\n        tools: composer:v2\n        coverage: none\n\n    - name: Install dependencies\n      run: composer update --prefer-stable --prefer-dist --no-interaction --no-progress\n\n    - name: Analyse with PHPStan\n      run: vendor/bin/phpstan --no-progress --error-format=github\n"
  },
  {
    "path": ".github/workflows/unit-tests.yml",
    "content": "name: Unit Tests\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - '*'\n  schedule:\n    - cron: '0 0 * * *'\n\njobs:\n  unit-tests:\n    runs-on: ubuntu-24.04\n\n    timeout-minutes: 15\n\n    env:\n      COMPOSER_NO_INTERACTION: 1\n\n    strategy:\n      fail-fast: false\n      matrix:\n        php: [8.5, 8.4, 8.3, 8.2]\n        laravel: [^11, ^12, ^13]\n        dependency-version: [prefer-stable]\n        exclude:\n          - laravel: ^13\n            php: 8.2\n\n    name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.dependency-version }}\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php }}\n          coverage: none\n          tools: composer:v2\n          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif\n\n      - name: Remove incompatible dependencies\n        if: matrix.laravel == '^13'\n        run: |\n            composer remove --dev --no-update laravel/octane laravel/pennant\n\n      - name: Install dependencies\n        run: |\n          composer remove --dev --no-update larastan/larastan phpstan/phpstan-phpunit laravel/pint phpstan/phpstan-strict-rules shipmonk/phpstan-rules\n          composer require \"laravel/framework:${{ matrix.laravel }}\" --no-interaction --no-update\n          composer update --${{ matrix.dependency-version }} --prefer-dist --no-progress\n\n      - name: Update Dusk Chromedriver\n        run: vendor/bin/dusk-updater detect --auto-update\n\n      - name: Execute Unit Tests\n        run: composer test\n\n      - name: Upload Failed Screenshots\n        uses: actions/upload-artifact@v6\n        if: failure()\n        with:\n          name: screenshots\n          path: tests/Browser/screenshots/*\n"
  },
  {
    "path": ".github/workflows/update-changelog.yaml",
    "content": "name: \"Update Changelog\"\n\non:\n  release:\n    types: [released]\n\njobs:\n  update:\n    runs-on: ubuntu-latest\n\n    permissions:\n      # Give the default GITHUB_TOKEN write permission to commit and push the \n      # updated CHANGELOG back to the repository.\n      # https://github.blog/changelog/2023-02-02-github-actions-updating-the-default-github_token-permissions-to-read-only/\n      contents: write\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v6\n        with:\n          ref: ${{ github.event.release.target_commitish }}\n\n      - name: Update Changelog\n        uses: stefanzweifel/changelog-updater-action@v1\n        with:\n          latest-version: ${{ github.event.release.tag_name }}\n          release-notes: ${{ github.event.release.body }}\n\n      - name: Commit updated CHANGELOG\n        uses: stefanzweifel/git-auto-commit-action@v7\n        with:\n          branch: ${{ github.event.release.target_commitish }}\n          commit_message: Update CHANGELOG\n          file_pattern: CHANGELOG.md\n"
  },
  {
    "path": ".gitignore",
    "content": "/.idea\n/vendor\ncomposer.phar\ncomposer.lock\n.DS_Store\n.phpunit*\n/tests/Browser\n/node_modules\n/build/phpstan\n/build/docs\n/site\n/docs/overrides/__pycache__/\n/docs/assets/dist\n"
  },
  {
    "path": ".nvmrc",
    "content": "24\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## v4.1.3 - 2026-03-09\n\n### What's Changed\n\n* Optin query result by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1997\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.1.2...v4.1.3\n\n## v4.1.2 - 2026-03-09\n\n### What's Changed\n\n* Fix sqlite and tweak results by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1996\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.1.1...v4.1.2\n\n## v4.1.1 - 2026-03-08\n\n### What's Changed\n\n* Catch serialization errors when populating cache stats by @miken32 in https://github.com/fruitcake/laravel-debugbar/pull/1993\n* Fix booting on console by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1995\n* Add some tests for closures in cache by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1994\n\n### New Contributors\n\n* @miken32 made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1993\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.1.0...v4.1.1\n\n## v4.1.0 - 2026-03-07\n\n### Biggest changes\n\n- Use JsonVardumper for smaller + more detailed depths\n- Add option to re-query and show results for SELECT queries\n- Popup query/explain results\n- Stricter checks for production env / non-debug mode, early exit\n\n### What's Changed\n\n* Fix CSS typo: `border-botton` → `border-bottom` by @Copilot in https://github.com/fruitcake/laravel-debugbar/pull/1975\n* Bump minimatch by @dependabot[bot] in https://github.com/fruitcake/laravel-debugbar/pull/1973\n* Cast database name to string in QueryCollector for null values by @b8ne in https://github.com/fruitcake/laravel-debugbar/pull/1979\n* Check privateIp instead of localhost range by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1977\n* Fix typo on comment by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1978\n* Add button to show query results by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1976\n* Check for json formatter by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1980\n* Add masked keys to ConfigCollector by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1981\n* Include cached items info on laravel tooltip by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1982\n* Only allow explain etc on local ip by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1983\n* use json formatter by default by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1984\n* Tweak open storage / query explain checks by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1985\n* Easy collector getter from `debugbar()` helper by @ssw1cblarrion in https://github.com/fruitcake/laravel-debugbar/pull/1989\n* [QueryCollector] Support file info on addMessage method by @ssw1cblarrion in https://github.com/fruitcake/laravel-debugbar/pull/1988\n* Use highlight on popup title for query result/explain by @parallels999 in https://github.com/fruitcake/laravel-debugbar/pull/1986\n* Quick fixes by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1990\n* Tweak boot check by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1991\n* Tweak controllers by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1992\n\n### New Contributors\n\n* @Copilot made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1975\n* @b8ne made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1979\n* @ssw1cblarrion made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1989\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.10...v4.1.0\n\n## v4.0.10 - 2026-02-26\n\n### What's Changed\n\n* Cast LARAVEL_START const to float by @daniser in https://github.com/fruitcake/laravel-debugbar/pull/1968\n* Laravel 13.x Compatibility by @laravel-shift in https://github.com/fruitcake/laravel-debugbar/pull/1969\n* GateCollector backtrace need more steps by @angeljqv in https://github.com/fruitcake/laravel-debugbar/pull/1972\n* Support custom messages on QueryCollector by @angeljqv in https://github.com/fruitcake/laravel-debugbar/pull/1970\n* Use upstream collect by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1960\n\n### New Contributors\n\n* @daniser made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1968\n* @laravel-shift made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1969\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.9...v4.0.10\n\n## v4.0.9 - 2026-02-17\n\n### What's Changed\n\n* Check mail is started by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1967\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.8...v4.0.9\n\n## v4.0.8 - 2026-02-14\n\n### What's Changed\n\n* Use message id instead of subject for mail collector by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1965\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.7...v4.0.8\n\n## v4.0.7 - 2026-02-06\n\n### What's Changed\n\n* chore: replace deprecated Request::get() with Request::input() by @calebdw in https://github.com/fruitcake/laravel-debugbar/pull/1957\n* Fix utf-8 encoding by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1959\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.6...v4.0.7\n\n## v4.0.6 - 2026-02-04\n\n### What's Changed\n\n* Use Dispatcher contract by @bytestream in https://github.com/fruitcake/laravel-debugbar/pull/1954\n* fix: urlencode cache key by @calebdw in https://github.com/fruitcake/laravel-debugbar/pull/1955\n* Handle missing bindings in SQL formatting by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1956\n\n### New Contributors\n\n* @bytestream made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1954\n* @calebdw made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1955\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.5...v4.0.6\n\n## v4.0.5 - 2026-01-29\n\n### What's Changed\n\n* Show params table for explain button by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1949\n* Change bindings return value on limited by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1948\n* use GateEvaluated event by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1951\n* Fix livewire deprecations errors by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1952\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.4...v4.0.5\n\n## v4.0.4 - 2026-01-29\n\n### What's Changed\n\n* Bump workflows actions by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1946\n* Allow ability parameter to accept integer type by @jeffersongoncalves in https://github.com/fruitcake/laravel-debugbar/pull/1947\n\n### New Contributors\n\n* @jeffersongoncalves made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1947\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.3...v4.0.4\n\n## v4.0.3 - 2026-01-26\n\n### What's Changed\n\n* Remove find cache in favor of upstream optimization by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1939\n* Update onCacheEvent to accept multiple event types by @Yahav in https://github.com/fruitcake/laravel-debugbar/pull/1943\n* Fix cache collector route by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1944\n\n### New Contributors\n\n* @Yahav made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1943\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.2...v4.0.3\n\n## v4.0.2 - 2026-01-24\n\n### What's Changed\n\n* Fix Auth Collector by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1937\n* Fix session collector by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1938\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.1...v4.0.2\n\n## v4.0.1 - 2026-01-24\n\n### What's Changed\n\n* Fix explain table css on queries widget by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1929\n* Check if Telescope is recording by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1931\n* Update namespaces in readme by @sajjadhossainshohag in https://github.com/fruitcake/laravel-debugbar/pull/1932\n* Add backtrace path by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1933\n* Update vendor name, fix release notes by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1934\n* Add link class by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1935\n* Collected jobs from queue by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1936\n\n### New Contributors\n\n* @sajjadhossainshohag made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1932\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v4.0.0...v4.0.1\n\n## v4.0.0 - 2026-01-23\n\n### Laravel Debugbar 4.0\n\n### Release notes\n\nSee https://fruitcake.nl/blog/laravel-debugbar-v4-release for the biggest changes.\n\nThis brings the updates from php-debugbar 3.x to Laravel Debugbar. See https://github.com/php-debugbar/php-debugbar/releases/tag/v3.0.0 for the upstream changes to php-debugbar.\n\n### Updating\n\nThe name has changed, so remove the old package first:\n\n`composer remove barryvdh/laravel-debugbar --dev --no-scripts`\n\nThen install the new package\n\n`composer require fruitcake/laravel-debugbar --with-dependencies`\n\nCheck the https://github.com/fruitcake/laravel-debugbar/blob/master/UPGRADE.md for any changes.\n\n### All Changes\n\n* Prepare for Debugbar 3.x by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1828\n* Fix 4.x queries by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1832\n* Remove deprecations, tweak default config by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1833\n* Always render widget in footer by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1834\n* Fix null handling quoting in emulateQuote[QueryCollector] by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1835\n* Update workflows / tools, add static analyses, fix some errors by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1836\n* Revert event config by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1837\n* Remove socket storage by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1839\n* Remove Lumen support by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1838\n* Remove icon by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1840\n* Fix phpstan by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1841\n* Remove PDO extension by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1842\n* Extend base sql widget by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1843\n* Fix shell quotes in README by @szepeviktor in https://github.com/fruitcake/laravel-debugbar/pull/1264\n* refactor: improve routes formats by @jbidad in https://github.com/fruitcake/laravel-debugbar/pull/1392\n* remove copy and hints by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1844\n* Check response for avoid inject debugbar on json ajax by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1558\n* Show estimate of cache byte usage by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1764\n* Check string by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1845\n* Use original background by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1847\n* Add DataProviders for easier maintenance by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1846\n* Feat custom collectors by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1848\n* Tweak config by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1849\n* Feat phpdebugbar symfony by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1850\n* Improve Livewire collection and view detection for components by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1853\n* Builds docs from source by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1854\n* Fix default for excluded events by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1856\n* Remove icon overrides by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1857\n* Restore Mail collector timeline by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1858\n* Add HTTP client collector by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1859\n* Add http client to docs by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1860\n* Update JavascriptRenderer for upstream changes by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1861\n* Simplify Asset Renderer by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1862\n* Bring back logs collector by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1863\n* Use message context for gate and logs by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1866\n* Updates tests for new beta by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1867\n* Reduce styling overrides by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1864\n* Use symfony-bridge by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1868\n* Set livewire sentence by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1869\n* Fix timeline by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1871\n* Fix storage by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1872\n* Seperate listeners from data in events by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1873\n* Add casters for heavy objects by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1874\n* Fix tests by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1876\n* TWeak livewire properties by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1877\n* Move namespace to Fruitcake\\LaravelDebugbar by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1875\n* Replace old package name by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1878\n* Fix explain option access in DatabaseCollectorProvider by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1879\n* Update .gitattributes by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1881\n* Stricter types by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1884\n* Add docs directory to export-ignore in .gitattributes by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1883\n* Cleanup by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1885\n* Fix docs tests by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1886\n* Fix cache widget by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1887\n* Fix checkVersion accessibility by @angeljqv in https://github.com/fruitcake/laravel-debugbar/pull/1889\n* Check signature by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1888\n* Add Inertia collector by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1890\n* Improve storage scan by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1891\n* Use upstream file storage and request generator by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1892\n* Optimize livewire by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1893\n* Test Livewire 2/3/4 by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1894\n* Reset interfaces on Octane request, use current config by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1895\n* Separate the debugbar from the application load(TimeCollector) by @erikn69 in https://github.com/fruitcake/laravel-debugbar/pull/1896\n* Optimize serviceprovider by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1897\n* Octane singleton by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1898\n* Tweak constructors and config by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1899\n* Tweak pennant by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1900\n* Time octane reset by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1901\n* Tweak booting time by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1902\n* Tweak twig by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1903\n* Always ensure time/exceptions/messages are available, to log before b… by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1904\n* Tweak config values by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1906\n* Tweak subscribers by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1905\n* Remove request instances by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1907\n* Update console collecting by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1908\n* Fix cache events by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1909\n* Tweak handle by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1910\n* Add octane request start by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1911\n* Small reset tweaks by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1912\n* Add some timeline options by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1913\n* Ensure latest request is used by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1915\n* Check if octane needs to enable/disbale by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1917\n* Use cookies instead of session, events instead of middleware by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1914\n* Update tests for Livewire 3 and 4 by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1918\n* collect on terminate by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1919\n* Bump lodash from 4.17.21 to 4.17.23 by @dependabot[bot] in https://github.com/fruitcake/laravel-debugbar/pull/1920\n* Restore ulid requestids by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1921\n* Use openhandler http driver, set etag by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1922\n* Check if params table is set by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1923\n* Fix event data by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1924\n* Update RequestCollector for CLI usage by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1925\n* Tweak ClearCommand for uninstall by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1927\n* Catch resolve errors by @barryvdh in https://github.com/fruitcake/laravel-debugbar/pull/1928\n\n### New Contributors\n\n* @szepeviktor made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1264\n* @jbidad made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1392\n* @dependabot[bot] made their first contribution in https://github.com/fruitcake/laravel-debugbar/pull/1920\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v3.16.3...v4.0.0\n\n## v3.16.4 - 2026-01-23\n\n- Add new fruitcake namespace to exclude from query backtrace.\n\n**Full Changelog**: https://github.com/fruitcake/laravel-debugbar/compare/v3.16.3...v3.16.4\n\n## v4.0-beta.11 - 2026-01-06\n\n### What's Changed\n\n* Simplify Asset Renderer by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1862\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v4.0-beta.10...v4.0-beta.11\n\n## v4.0-beta.9 - 2026-01-05\n\n### What's Changed\n\n* Remove icon overrides by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1857\n* Restore Mail collector timeline by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1858\n* Add HTTP client collector by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1859\n* Add http client to docs by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1860\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v4.0-beta.8...v4.0-beta.9\n\n## v4.0-beta.8 - 2026-01-05\n\n### What's Changed\n\n* Builds docs from source by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1854\n* Fix default for excluded events by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1856\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v4.0-beta.7...v4.0-beta.8\n\n## v4.0-beta.7 - 2026-01-05\n\n### What's Changed\n\n* Improve Livewire collection and view detection for components by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1853\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v4.0-beta.6...v4.0-beta.7\n\n## v3.16.3 - 2025-12-26\n\n### What's Changed\n\n* Update symfony/finder version constraint to include 8 by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1830\n* Allow Symfony v8 by @jnoordsij in https://github.com/barryvdh/laravel-debugbar/pull/1827\n* Add error_level config option to filter error handler reporting (#1373) by @elliota43 in https://github.com/barryvdh/laravel-debugbar/pull/1825\n* Add support for Cursor, Windsurf, and additional editor configurations by @nguyentranchung in https://github.com/barryvdh/laravel-debugbar/pull/1823\n* Don't create <a> tags with the onclick attribute by @PeterMead in https://github.com/barryvdh/laravel-debugbar/pull/1820\n* docs: Add conditional check for Debugbar alias registration by @erhanurgun in https://github.com/barryvdh/laravel-debugbar/pull/1829\n\n### New Contributors\n\n* @elliota43 made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1825\n* @nguyentranchung made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1823\n* @PeterMead made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1820\n* @erhanurgun made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1829\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.16.2...v3.16.3\n\n## v3.16.2 - 2025-12-16\n\n### What's Changed\n\n* Remove default null value env by @Erulezz in https://github.com/barryvdh/laravel-debugbar/pull/1815\n* Remove --ignore-platform-req=php+ on integration test setup by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1814\n* Remove calls to PHP 8.5-deprecated `setAccessible` by @jnoordsij in https://github.com/barryvdh/laravel-debugbar/pull/1822\n\n### New Contributors\n\n* @Erulezz made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1815\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.16.1...v3.16.2\n\n## v3.16.1 - 2025-11-19\n\n### What's Changed\n\n* Slow threshold highlight on queries by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1805\n* (fix) trim last line breaks on logs by @angeljqv in https://github.com/barryvdh/laravel-debugbar/pull/1806\n* fix: Typo by @aurac in https://github.com/barryvdh/laravel-debugbar/pull/1810\n* Test on PHP 8.5 by @jnoordsij in https://github.com/barryvdh/laravel-debugbar/pull/1811\n* Add '_boost*' to debugbar exceptions by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1818\n* Dropped Laravel 9 support\n\n### New Contributors\n\n* @aurac made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1810\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.16.0...v3.16.1\n\n## v3.16.0 - 2025-07-21\n\n### What's Changed\n\n* Make all scalar config values configurable through environment variables by @wimski in https://github.com/barryvdh/laravel-debugbar/pull/1784\n* Check if file exists on FilesystemStorage by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1790\n* Bump php-debugbar by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1791\n* Fix counter tests by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1792\n* `$group` arg support on TimelineCollectors methods by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1789\n* Collect other eloquent model events by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1781\n* Add new cache events on CacheCollector by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1773\n* Exclude events on EventCollector by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1786\n* Use `addWarning` on warnings, silenced errors, notices by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1767\n* Do not rely on DB::connection() to get information in query collector by @cweiske in https://github.com/barryvdh/laravel-debugbar/pull/1779\n* Trace file for Gate checks(GateCollector) by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1770\n* Fix support for PDOExceptions by @LukeTowers in https://github.com/barryvdh/laravel-debugbar/pull/1752\n* Time measure on cache events by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1794\n* fix debugbar for Lumen usage by @flibidi67 in https://github.com/barryvdh/laravel-debugbar/pull/1796\n* Custom path for Inertia views by @joaopms in https://github.com/barryvdh/laravel-debugbar/pull/1797\n* Better contrast in dark theme titles. by @angeljqv in https://github.com/barryvdh/laravel-debugbar/pull/1798\n\n### New Contributors\n\n* @wimski made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1784\n* @cweiske made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1779\n* @flibidi67 made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1796\n* @joaopms made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1797\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.15.4...v3.16.0\n\n## v3.15.4 - 2025-04-16\n\n### What's Changed\n\n* Remove html `<a/>` tag from route on clockwork by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1777\n* Fix default for capturing dd/dump by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1783\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.15.3...v3.15.4\n\n## v3.15.3 - 2025-04-08\n\n### What's Changed\n\n* Add condition for implemented query grammar by @rikwillems in https://github.com/barryvdh/laravel-debugbar/pull/1757\n* Collect dumps on message collector by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1759\n* Fix `capture_dumps` option on laravel `dd();` by @parallels999 in https://github.com/barryvdh/laravel-debugbar/pull/1762\n* Preserve laravel error handler by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1760\n* Fix `Trying to access array offset on false on LogsCollector.php` by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1763\n* Update css theme for views widget by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1768\n* Fix laravel-debugbar.css on query widget by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1765\n* Use htmlvardumper if available on CacheCollector by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1766\n* Update QueryCollector.php fix issue #1775 by @Mathias-DS in https://github.com/barryvdh/laravel-debugbar/pull/1776\n* Better grouping the events count by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1774\n\n### New Contributors\n\n* @rikwillems made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1757\n* @Mathias-DS made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1776\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.15.2...v3.15.3\n\n## v3.15.2 - 2025-02-25\n\n### What's Changed\n\n* Fix empty tabs on clockwork by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1750\n* fix: Ignore info query statements in Clockwork converter by @boserup in https://github.com/barryvdh/laravel-debugbar/pull/1749\n* Check if request controller is string by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1751\n\n### New Contributors\n\n* @boserup made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1749\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.15.1...v3.15.2\n\n## v3.15.1 - 2025-02-24\n\n### What's Changed\n\n* Hide more empty tabs  by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1742\n* Always show application by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1745\n* Add conflict with old debugbar by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1746\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.15.0...v3.15.1\n\n## v3.15.0 - 2025-02-21\n\n### What's Changed\n\n* Add middleware to web to save session by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1710\n* Check web middleware by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1712\n* Add special `dev` to composer keywords by @jnoordsij in https://github.com/barryvdh/laravel-debugbar/pull/1713\n* Removed extra sentence by @cheack in https://github.com/barryvdh/laravel-debugbar/pull/1714\n* Hide empty tabs by default by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1711\n* Combine route info with Request by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1720\n* fix: The log is not processed correctly when it consists of multiple lines. by @uniho in https://github.com/barryvdh/laravel-debugbar/pull/1721\n* [WIP] Use php-debugbar dark theme, move to variables by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1717\n* Remove openhandler overrides by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1723\n* Drop Lumen And Laravel 9 by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1725\n* Use tooltip for Laravel collector by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1724\n* Add more data to timeline by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1726\n* Laravel version preview as repo branch name by @angeljqv in https://github.com/barryvdh/laravel-debugbar/pull/1727\n* Laravel 12 support by @jonnott in https://github.com/barryvdh/laravel-debugbar/pull/1730\n* Preview action_name on request tooltip by @angeljqv in https://github.com/barryvdh/laravel-debugbar/pull/1728\n* Map tooltips by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1732\n* Add back L9 by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1734\n* Fix tooltip url by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1735\n* Show request status as badge by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1736\n* Fix request badge by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1737\n* Use Laravel ULID for key by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1738\n* defer datasets by config option by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1739\n* Reorder request tab by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1740\n* Defer config by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1741\n\n### New Contributors\n\n* @cheack made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1714\n* @angeljqv made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1727\n* @jonnott made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1730\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.14.10...v3.15.0\n\n## v3.14.10 - 2024-12-23\n\n### What's Changed\n\n* Fix Debugbar spelling inconsistencies by @ralphjsmit in https://github.com/barryvdh/laravel-debugbar/pull/1626\n* Fix Visual Explain confirm message by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1709\n\n### New Contributors\n\n* @ralphjsmit made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1626\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.14.9...v3.14.10\n\n## v3.14.9 - 2024-11-25\n\n### What's Changed\n\n* Fix custom prototype array by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1706\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.14.8...v3.14.9\n\n## v3.14.8 - 2024-11-25\n\n### What's Changed\n\n* Add fix + failing test for custom array prototype by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1705\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.14.7...v3.14.8\n\n## v3.14.7 - 2024-11-14\n\n### What's Changed\n\n* Make better use of query tab space by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1694\n* Do not open query details on text selecting by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1693\n* Add (initial) support for PHP 8.4 by @jnoordsij in https://github.com/barryvdh/laravel-debugbar/pull/1631\n* More warnings by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1696\n* Fix sql-duplicate highlight by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1699\n* ci: Use GitHub Actions V4 by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1700\n* Fix \"Uncaught TypeError: is not iterable\" by @erikn69 in https://github.com/barryvdh/laravel-debugbar/pull/1701\n* Fix Exception when QueryCollector softLimit exceeded by @johnkary in https://github.com/barryvdh/laravel-debugbar/pull/1702\n* Test soft/hard limit queries by @barryvdh in https://github.com/barryvdh/laravel-debugbar/pull/1703\n\n### New Contributors\n\n* @johnkary made their first contribution in https://github.com/barryvdh/laravel-debugbar/pull/1702\n\n**Full Changelog**: https://github.com/barryvdh/laravel-debugbar/compare/v3.14.6...v3.14.7\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (C) 2013-present Barry vd. Heuvel\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Reporting a Vulnerability\n\nPlease report security issues to `barryvdh@gmail.com`\n"
  },
  {
    "path": "UPGRADE.md",
    "content": "# Upgrade Guide\n\n## 3.x to 4.x\n\n### php-debugbar 3.x\nThe php-debugbar dependency has been updated to 3.x. This removes jQuery and font-awesome.\nThis should not impact your application, unless you are using custom collectors.\n\n### Updated namespace\n\nThe new namespace is `Fruitcake\\LaravelDebugbar` instead of `Barryvdh\\Debugbar`. You usually do not need to change this,\nunless you are manually registering the service provider / facade. The packge install is now `fruitcake/laravel-debugbar`.\n\n### Removed \n\n - SocketStorage (no longer maintained)\n - Lumen support (no longer maintained)\n - FileCollector (no longer useful)\n - `start_measure()`, `add_measure()`, `stop_measure()`, `measure()` helper methods (use `debugbar()->startMeasure()` etc. instead)\n\n### Other changes\n - The Query Collector now extends the php-debugbar widget. The bindings parameter has been removed in favor of 'params'.\n - Instead of 'hiddens', we now have an option 'masked' which uses the keys, not array paths.\n - Ineratia has its own collector / config. Update your config accordingly.\n\n### For packages extending Laravel Debugbar\n - modifyResponse has changed to handleResponse, and is now done with a listener instead of middleware\n - the HttpDriver is now session-less, and uses cookies.\n - Octane keeps the LaravelDebugbar state, so has to reset collectors. You can remove Laravel Debugbar from the flush config.\n"
  },
  {
    "path": "build/build-docs.php",
    "content": "<?php\n\nuse DebugBar\\Bridge\\Symfony\\SymfonyMailCollector;\nuse DebugBar\\DataCollector\\PDO\\PDOCollector;\nuse DebugBar\\DataCollector\\TemplateCollector;\nuse DebugBar\\StandardDebugBar;\n\ninclude __DIR__ . '/../vendor/autoload.php';\n\n// Rquires `php vendor/bin/phpunit --filter=testItInjectsOnDocs`\n$generatedScripts = file_get_contents(__DIR__ . '/docs/render.html');\n// Remove first style/script\n$generatedScripts = explode('</script>', $generatedScripts, 2)[1];\n\n// Read the main.html template\n$templatePath = __DIR__ . '/../docs/overrides/main.html';\n$template = file_get_contents($templatePath);\n\n// Replace the scripts block content between specific markers\n$startMarker = \"<!-- Start Debugbar -->\";\n$endMarker = \"<!-- End Debugbar -->\";\n\n// Find the positions\n$startPos = strpos($template, $startMarker);\n$endPos = strpos($template, $endMarker);\n\nif ($startPos !== false && $endPos !== false) {\n    $startPos += strlen($startMarker);\n\n    // Replace the content between markers\n    $newTemplate = substr($template, 0, $startPos)\n        . \"\\n\" . $generatedScripts . \"\\n\"\n        . substr($template, $endPos);\n\n    // Write back to the file\n    file_put_contents($templatePath, $newTemplate);\n\n    echo \"✓ Updated docs/overrides/main.html with generated debugbar scripts\\n\";\n} else {\n    echo \"✗ Could not find script markers in main.html\\n\";\n    exit(1);\n}\n\n// Copy dist folder to docs/assets/dist\n$distSource = __DIR__ . '/docs/assets';\n$distDest = __DIR__ . '/../docs/assets/dist';\n\nif (!is_dir($distSource)) {\n    echo \"✗ dist folder not found at $distSource\\n\";\n    exit(1);\n}\n\n// Create docs/assets directory if it doesn't exist\nif (!is_dir(__DIR__ . '/../docs/assets')) {\n    mkdir(__DIR__ . '/../docs/assets', 0755, true);\n}\n\n// Remove existing dist folder if it exists\nif (is_dir($distDest)) {\n    deleteDirectory($distDest);\n}\n\n// Copy dist folder\ncopyDirectory($distSource, $distDest);\n\necho \"✓ Copied dist folder to docs/assets/dist\\n\";\n\n// Update mkdocs.yml with current timestamp\n$mkdocsPath = __DIR__ . '/../mkdocs.yml';\n$mkdocsContent = file_get_contents($mkdocsPath);\n$timestamp = time();\n\n$mkdocsContent = preg_replace(\n    '/debugbar\\.css\\?v=\\d+/',\n    'debugbar.css?v=' . $timestamp,\n    $mkdocsContent\n);\n\n$mkdocsContent = preg_replace(\n    '/debugbar\\.js\\?v=\\d+/',\n    'debugbar.js?v=' . $timestamp,\n    $mkdocsContent\n);\n\nfile_put_contents($mkdocsPath, $mkdocsContent);\n\necho \"✓ Updated mkdocs.yml with timestamp: $timestamp\\n\";\n\nfunction copyDirectory($source, $dest) {\n    mkdir($dest, 0755, true);\n\n    $iterator = new RecursiveIteratorIterator(\n        new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),\n        RecursiveIteratorIterator::SELF_FIRST\n    );\n\n    foreach ($iterator as $item) {\n        $destPath = $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathname();\n        if ($item->isDir()) {\n            mkdir($destPath, 0755, true);\n        } else {\n            copy($item, $destPath);\n        }\n    }\n}\n\nfunction deleteDirectory($dir) {\n    if (!is_dir($dir)) {\n        return;\n    }\n\n    $iterator = new RecursiveIteratorIterator(\n        new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),\n        RecursiveIteratorIterator::CHILD_FIRST\n    );\n\n    foreach ($iterator as $item) {\n        if ($item->isDir()) {\n            rmdir($item);\n        } else {\n            unlink($item);\n        }\n    }\n\n    rmdir($dir);\n}\n"
  },
  {
    "path": "build/build-icons.js",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Tabler icons to include\n// Format: 'icon-name' for outline icons, or { name: 'icon-name', filled: true } for filled icons\nconst icons = [\n    // Data collector icons\n    'archive',\n    'clipboard-text',\n    'files',\n    'lock',\n    'user',\n    'share-3',\n    'subtask',\n\n    // UI control icons\n    'brand-laravel',\n    'brand-livewire',\n    'brand-inertia',\n\n    // Query widget icons\n    'pin',\n    'help-circle',\n    'list',\n    'gauge',\n\n    // Message icons\n    { name: 'star', filled: true },\n    'info-circle',\n\n    // Link icon\n    'external-link',\n];\n\nconst svgDirOutline = path.join(__dirname, '../node_modules/@tabler/icons/icons/outline');\nconst svgDirFilled = path.join(__dirname, '../node_modules/@tabler/icons/icons/filled');\nconst outputFile = path.join(__dirname, '../resources/laravel-icons.css');\nconst defaultStrokeWidth = 2; // Tabler default stroke width\nconst brandStrokeWidth = 1; // For brands, use 1\n\nfunction svgToDataUri(svgContent, strokeWidth) {\n    // Remove XML comments\n    svgContent = svgContent.replace(/<!--[\\s\\S]*?-->/g, '');\n\n    // Ensure consistent stroke-width\n    svgContent = svgContent.replace(/stroke-width=\"[^\"]*\"/g, `stroke-width=\"${strokeWidth}\"`);\n\n    // Remove unnecessary attributes for mask usage (but not stroke-width!)\n    svgContent = svgContent.replace(/\\s+class=\"[^\"]*\"/g, '');\n    svgContent = svgContent.replace(/\\s+width=\"[^\"]*\"/g, '');\n    svgContent = svgContent.replace(/\\s+height=\"[^\"]*\"/g, '');\n\n    // Minify: remove newlines and extra spaces\n    svgContent = svgContent.replace(/\\s+/g, ' ').trim();\n\n    // URL encode for data URI\n    const encoded = encodeURIComponent(svgContent)\n        .replace(/'/g, '%27')\n        .replace(/\"/g, '%22');\n    return `data:image/svg+xml,${encoded}`;\n}\n\nfunction generateIconsCSS() {\n    let css = `/* Generated file - do not edit manually */\\n/* Generated from Tabler Icons */\\n\\n`;\n\n    // First, define all CSS variables with the SVG data URIs\n    css += `:root {\\n`;\n    for (const iconEntry of icons) {\n        const iconName = typeof iconEntry === 'string' ? iconEntry : iconEntry.name;\n        const isFilled = typeof iconEntry === 'object' && iconEntry.filled;\n        const svgDir = isFilled ? svgDirFilled : svgDirOutline;\n        const svgPath = path.join(svgDir, `${iconName}.svg`);\n\n        if (!fs.existsSync(svgPath)) {\n            console.warn(`Warning: SVG file not found for icon \"${iconName}\" at ${svgPath}`);\n            continue;\n        }\n\n        const svgContent = fs.readFileSync(svgPath, 'utf8');\n        let strokeWidth = iconName.indexOf('brand-') === 0 ? brandStrokeWidth : defaultStrokeWidth;\n        const dataUri = svgToDataUri(svgContent, strokeWidth);\n\n        css += `  --debugbar-icon-${iconName}: url('${dataUri}');\\n`;\n    }\n    css += `}\\n\\n`;\n\n    // Then, apply the variables to the icon classes\n    for (const iconEntry of icons) {\n        const iconName = typeof iconEntry === 'string' ? iconEntry : iconEntry.name;\n        const isFilled = typeof iconEntry === 'object' && iconEntry.filled;\n        const svgDir = isFilled ? svgDirFilled : svgDirOutline;\n        const svgPath = path.join(svgDir, `${iconName}.svg`);\n\n        if (!fs.existsSync(svgPath)) {\n            continue;\n        }\n\n        css += `.phpdebugbar-icon-${iconName}::before {\\n`;\n        css += `  -webkit-mask-image: var(--debugbar-icon-${iconName});\\n`;\n        css += `  mask-image: var(--debugbar-icon-${iconName});\\n`;\n        css += `}\\n\\n`;\n    }\n\n    fs.writeFileSync(outputFile, css, 'utf8');\n    console.log(`✓ Generated ${outputFile} with ${icons.length} icons`);\n}\n\ntry {\n    generateIconsCSS();\n} catch (error) {\n    console.error('Error generating icons:', error);\n    process.exit(1);\n}\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"fruitcake/laravel-debugbar\",\n    \"description\": \"PHP Debugbar integration for Laravel\",\n    \"keywords\": [\n        \"laravel\",\n        \"debugbar\",\n        \"profiler\",\n        \"debug\",\n        \"webprofiler\",\n        \"barryvdh\",\n        \"dev\"\n    ],\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Fruitcake\",\n            \"homepage\": \"https://fruitcake.nl\"\n        },\n        {\n            \"name\": \"Barry vd. Heuvel\",\n            \"email\": \"barryvdh@gmail.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^8.2\",\n        \"php-debugbar/php-debugbar\": \"^3.5\",\n        \"php-debugbar/symfony-bridge\": \"^1.1\",\n        \"illuminate/routing\": \"^11|^12|^13.0\",\n        \"illuminate/session\": \"^11|^12|^13.0\",\n        \"illuminate/support\": \"^11|^12|^13.0\"\n    },\n    \"require-dev\": {\n        \"mockery/mockery\": \"^1.3.3\",\n        \"orchestra/testbench-dusk\": \"^9|^10|^11\",\n        \"phpunit/phpunit\": \"^11\",\n        \"larastan/larastan\": \"^3\",\n        \"phpstan/phpstan-phpunit\": \"^2\",\n        \"laravel/pint\": \"^1\",\n        \"livewire/livewire\": \"^3.7|^4\",\n        \"phpstan/phpstan-strict-rules\": \"^2.0\",\n        \"shipmonk/phpstan-rules\": \"^4.3\",\n        \"laravel/octane\": \"^2\",\n        \"laravel/pennant\": \"^1\",\n        \"php-debugbar/twig-bridge\": \"^2.0\",\n        \"laravel/telescope\": \"^5.16\"\n    },\n    \"replace\": {\n        \"barryvdh/laravel-debugbar\": \"self.version\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Fruitcake\\\\LaravelDebugbar\\\\\": \"src/\"\n        },\n        \"files\": [\n            \"src/helpers.php\"\n        ]\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Fruitcake\\\\LaravelDebugbar\\\\Tests\\\\\": \"tests\"\n        }\n    },\n    \"minimum-stability\": \"dev\",\n    \"prefer-stable\": true,\n    \"extra\": {\n        \"branch-alias\": {\n            \"dev-master\": \"4.1-dev\"\n        },\n        \"laravel\": {\n            \"providers\": [\n                \"Fruitcake\\\\LaravelDebugbar\\\\ServiceProvider\"\n            ],\n            \"aliases\": {\n                \"Debugbar\": \"Fruitcake\\\\LaravelDebugbar\\\\Facades\\\\Debugbar\"\n            }\n        }\n    },\n    \"scripts\": {\n        \"analyse\": \"vendor/bin/phpstan analyse --memory-limit=1G\",\n        \"check-style\": \"vendor/bin/pint --test\",\n        \"fix-style\": \"vendor/bin/pint\",\n        \"test\": \"vendor/bin/phpunit\",\n        \"docs\": \"vendor/bin/phpunit --filter=testItInjectsOnDocs && php build/build-docs.php && mkdocs build\"\n    }\n}\n"
  },
  {
    "path": "config/debugbar.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nreturn [\n\n    /*\n     |--------------------------------------------------------------------------\n     | Debugbar Settings\n     |--------------------------------------------------------------------------\n     |\n     | Debugbar is enabled by default, when debug is set to true in app.php.\n     | You can override the value by setting enable to true or false instead of null.\n     |\n     | You can provide an array of URI's that must be ignored (eg. 'api/*')\n     |\n     */\n\n    'enabled' => env('DEBUGBAR_ENABLED'),\n    'collect_jobs' => env('DEBUGBAR_COLLECT_JOBS', false),\n    'except' => [\n        'telescope*',\n        'horizon*',\n        '_boost/browser-logs',\n        'livewire-*/livewire.js',\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | DataCollectors\n    |--------------------------------------------------------------------------\n    |\n    | Enable/disable DataCollectors\n    |\n    */\n\n    'collectors' => [\n        'phpinfo'         => env('DEBUGBAR_COLLECTORS_PHPINFO', false),         // Php version\n        'messages'        => env('DEBUGBAR_COLLECTORS_MESSAGES', true),         // Messages\n        'time'            => env('DEBUGBAR_COLLECTORS_TIME', true),             // Time Datalogger\n        'memory'          => env('DEBUGBAR_COLLECTORS_MEMORY', true),           // Memory usage\n        'exceptions'      => env('DEBUGBAR_COLLECTORS_EXCEPTIONS', true),       // Exception displayer\n        'log'             => env('DEBUGBAR_COLLECTORS_LOG', true),              // Logs from Monolog (merged in messages if enabled)\n        'db'              => env('DEBUGBAR_COLLECTORS_DB', true),               // Show database (PDO) queries and bindings\n        'views'           => env('DEBUGBAR_COLLECTORS_VIEWS', true),            // Views with their data\n        'route'           => env('DEBUGBAR_COLLECTORS_ROUTE', false),           // Current route information\n        'auth'            => env('DEBUGBAR_COLLECTORS_AUTH', false),            // Display Laravel authentication status\n        'gate'            => env('DEBUGBAR_COLLECTORS_GATE', true),             // Display Laravel Gate checks\n        'session'         => env('DEBUGBAR_COLLECTORS_SESSION', false),         // Display session data\n        'symfony_request' => env('DEBUGBAR_COLLECTORS_SYMFONY_REQUEST', true),  // Default Request Data\n        'mail'            => env('DEBUGBAR_COLLECTORS_MAIL', true),             // Catch mail messages\n        'laravel'         => env('DEBUGBAR_COLLECTORS_LARAVEL', true),          // Laravel version and environment\n        'events'          => env('DEBUGBAR_COLLECTORS_EVENTS', false),          // All events fired\n        'logs'            => env('DEBUGBAR_COLLECTORS_LOGS', false),            // Add the latest log messages\n        'config'          => env('DEBUGBAR_COLLECTORS_CONFIG', false),          // Display config settings\n        'cache'           => env('DEBUGBAR_COLLECTORS_CACHE', true),            // Display cache events\n        'models'          => env('DEBUGBAR_COLLECTORS_MODELS', true),           // Display models\n        'livewire'        => env('DEBUGBAR_COLLECTORS_LIVEWIRE', true),         // Display Livewire (when available)\n        'inertia'         => env('DEBUGBAR_COLLECTORS_INERTIA', true),          // Display Inertia (when available)\n        'jobs'            => env('DEBUGBAR_COLLECTORS_JOBS', true),             // Display dispatched jobs\n        'pennant'         => env('DEBUGBAR_COLLECTORS_PENNANT', true),          // Display Pennant feature flags\n        'http_client'     => env('DEBUGBAR_COLLECTORS_HTTP_CLIENT', true),      // Display HTTP Client requests\n    ],\n\n    /*\n     |--------------------------------------------------------------------------\n     | Extra options\n     |--------------------------------------------------------------------------\n     |\n     | Configure some DataCollectors\n     |\n     */\n\n    'options' => [\n        'time' => [\n            'memory_usage' => env('DEBUGBAR_OPTIONS_TIME_MEMORY_USAGE', false), // Calculated by subtracting memory start and end, it may be inaccurate\n        ],\n        'messages' => [\n            'trace' => env('DEBUGBAR_OPTIONS_MESSAGES_TRACE', true),                  // Trace the origin of the debug message\n            'backtrace_exclude_paths' => [],                                                      // Paths to exclude from backtrace. (in addition to defaults)\n            'capture_dumps' => env('DEBUGBAR_OPTIONS_MESSAGES_CAPTURE_DUMPS', false), // Capture laravel `dump();` as message\n            'timeline' => env('DEBUGBAR_OPTIONS_MESSAGES_TIMELINE', true),            // Add messages to the timeline\n        ],\n        'memory' => [\n            'reset_peak' => env('DEBUGBAR_OPTIONS_MEMORY_RESET_PEAK', false),       // run memory_reset_peak_usage before collecting\n            'with_baseline' => env('DEBUGBAR_OPTIONS_MEMORY_WITH_BASELINE', false), // Set boot memory usage as memory peak baseline\n            'precision' => (int) env('DEBUGBAR_OPTIONS_MEMORY_PRECISION', 0),       // Memory rounding precision\n        ],\n        'auth' => [\n            'show_name' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_NAME', true),     // Also show the users name/email in the debugbar\n            'show_guards' => env('DEBUGBAR_OPTIONS_AUTH_SHOW_GUARDS', true), // Show the guards that are used\n        ],\n        'gate' => [\n            'trace' => false,      // Trace the origin of the Gate checks\n            'timeline' => env('DEBUGBAR_OPTIONS_GATE_TIMELINE', false),      // Add mails to the timeline\n        ],\n        'db' => [\n            'with_params'       => env('DEBUGBAR_OPTIONS_WITH_PARAMS', true),   // Render SQL with the parameters substituted\n            'exclude_paths'     => [       // Paths to exclude entirely from the collector\n                //'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries\n            ],\n            'backtrace'         => env('DEBUGBAR_OPTIONS_DB_BACKTRACE', true),   // Use a backtrace to find the origin of the query in your files.\n            'backtrace_exclude_paths' => [],   // Paths to exclude from backtrace. (in addition to defaults)\n            'timeline'          => env('DEBUGBAR_OPTIONS_DB_TIMELINE', false),  // Add the queries to the timeline\n            'duration_background'  => env('DEBUGBAR_OPTIONS_DB_DURATION_BACKGROUND', true),   // Show shaded background on each query relative to how long it took to execute.\n            'explain' => [                 // Show EXPLAIN output on queries\n                'enabled' => env('DEBUGBAR_OPTIONS_DB_EXPLAIN_ENABLED', true),\n            ],\n            'show_query_result' => env('DEBUGBAR_OPTIONS_DB_SHOW_QUERY_RESULT', false), // Show option to re-run SELECT queries and show the result\n            'only_slow_queries' => env('DEBUGBAR_OPTIONS_DB_ONLY_SLOW_QUERIES', true), // Only track queries that last longer than `slow_threshold`\n            'slow_threshold'    => env('DEBUGBAR_OPTIONS_DB_SLOW_THRESHOLD', false), // Max query execution time (ms). Exceeding queries will be highlighted\n            'memory_usage'      => env('DEBUGBAR_OPTIONS_DB_MEMORY_USAGE', false),   // Show queries memory usage\n            'soft_limit'       => (int) env('DEBUGBAR_OPTIONS_DB_SOFT_LIMIT', 100),  // After the soft limit, no parameters/backtrace are captured\n            'hard_limit'       => (int) env('DEBUGBAR_OPTIONS_DB_HARD_LIMIT', 500),  // After the hard limit, queries are ignored\n        ],\n        'mail' => [\n            'timeline' => env('DEBUGBAR_OPTIONS_MAIL_TIMELINE', true),  // Add mails to the timeline\n            'show_body' => env('DEBUGBAR_OPTIONS_MAIL_SHOW_BODY', true),\n        ],\n        'views' => [\n            'timeline' => env('DEBUGBAR_OPTIONS_VIEWS_TIMELINE', true),                  // Add the views to the timeline\n            'data' => env('DEBUGBAR_OPTIONS_VIEWS_DATA', false),                         // True for all data, 'keys' for only names, false for no parameters.\n            'group' => (int) env('DEBUGBAR_OPTIONS_VIEWS_GROUP', 50),                    // Group duplicate views. Pass value to auto-group, or true/false to force\n            'exclude_paths' => [    // Add the paths which you don't want to appear in the views\n                'vendor/filament',   // Exclude Filament components by default\n            ],\n        ],\n        'inertia' => [\n            'pages' => env('DEBUGBAR_OPTIONS_VIEWS_INERTIA_PAGES', 'js/Pages'),  // Path for Inertia views\n        ],\n        'route' => [\n            'label' => env('DEBUGBAR_OPTIONS_ROUTE_LABEL', true),  // Show complete route on bar\n        ],\n        'session' => [\n            'masked' => [], // List of keys that are masked\n        ],\n        'symfony_request' => [\n            'label' => env('DEBUGBAR_OPTIONS_SYMFONY_REQUEST_LABEL', true),  // Show route on bar\n            'masked' => [], // List of keys that are masked\n        ],\n        'events' => [\n            'data' => env('DEBUGBAR_OPTIONS_EVENTS_DATA', false), // Collect events data\n            'listeners' => env('DEBUGBAR_OPTIONS_EVENTS_LISTENERS', false), // Add listeners to the events data\n            'excluded' => [], // Example: ['eloquent.*', 'composing', Illuminate\\Cache\\Events\\CacheHit::class]\n        ],\n        'logs' => [\n            'file' => env('DEBUGBAR_OPTIONS_LOGS_FILE'),\n        ],\n        'config' => [\n            'masked' => [],\n        ],\n        'cache' => [\n            'values' => env('DEBUGBAR_OPTIONS_CACHE_VALUES', true), // Collect cache values\n            'timeline' => env('DEBUGBAR_OPTIONS_CACHE_TIMELINE', false),  // Add cache events to the timeline\n        ],\n        'http_client' => [\n            'masked' => [],\n            'timeline' => env('DEBUGBAR_OPTIONS_HTTP_CLIENT_TIMELINE', true),  // Add requests to the timeline\n        ],\n    ],\n\n    /**\n     * Add any additional DataCollectors by adding the class name of a DataCollector or invokable class.\n     */\n    'custom_collectors' => [\n        // MyCollector::class => env('DEBUGBAR_COLLECTORS_MYCOLLECTOR', true),\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Editor\n    |--------------------------------------------------------------------------\n    |\n    | Choose your preferred editor to use when clicking file name.\n    |\n    | Supported: \"sublime\", \"textmate\", \"emacs\", \"macvim\", \"codelite\",\n    |            \"phpstorm\", \"phpstorm-remote\", \"idea\", \"idea-remote\",\n    |            \"vscode\", \"vscode-insiders\", \"vscode-remote\", \"vscode-insiders-remote\",\n    |            \"vscodium\", \"nova\", \"xdebug\", \"atom\", \"espresso\",\n    |            \"netbeans\", \"cursor\", \"windsurf\", \"zed\", \"antigravity\"\n    |\n    */\n\n    'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Capture Ajax Requests\n    |--------------------------------------------------------------------------\n    |\n    | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors),\n    | you can use this option to disable sending the data through the headers.\n    |\n    | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools.\n    |\n    | Note for your request to be identified as ajax requests they must either send the header\n    | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header.\n    |\n    | By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar.\n    | Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading.\n    |\n    | You can defer loading the dataset, so it will be loaded with ajax after the request is done. (Experimental)\n    */\n\n    'capture_ajax' => env('DEBUGBAR_CAPTURE_AJAX', true),\n    'add_ajax_timing' => env('DEBUGBAR_ADD_AJAX_TIMING', false),\n    'ajax_handler_auto_show' => env('DEBUGBAR_AJAX_HANDLER_AUTO_SHOW', true),\n    'ajax_handler_enable_tab' => env('DEBUGBAR_AJAX_HANDLER_ENABLE_TAB', true),\n    'defer_datasets' => env('DEBUGBAR_DEFER_DATASETS', false),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Remote Path Mapping\n    |--------------------------------------------------------------------------\n    |\n    | If you are using a remote dev server, like Laravel Homestead, Docker, or\n    | even a remote VPS, it will be necessary to specify your path mapping.\n    |\n    | Leaving one, or both of these, empty or null will not trigger the remote\n    | URL changes and Debugbar will treat your editor links as local files.\n    |\n    | \"remote_sites_path\" is an absolute base path for your sites or projects\n    | in Homestead, Vagrant, Docker, or another remote development server.\n    |\n    | Example value: \"/home/vagrant/Code\"\n    |\n    | \"local_sites_path\" is an absolute base path for your sites or projects\n    | on your local computer where your IDE or code editor is running on.\n    |\n    | Example values: \"/Users/<name>/Code\", \"C:\\Users\\<name>\\Documents\\Code\"\n    |\n    */\n\n    'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'),\n    'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Storage settings\n    |--------------------------------------------------------------------------\n    |\n    | Debugbar stores data for session/ajax requests.\n    | You can disable this, so the debugbar stores data in headers/session,\n    | but this can cause problems with large data collectors.\n    | By default, file storage (in the storage folder) is used. Sqlite will\n    | create a database file in the storage folder.\n    | Redis and PDO can also be used. For PDO, run the package migrations first.\n    |\n    | Warning: Enabling storage.open will allow everyone to access previous\n    | request, do not enable open storage in publicly available environments!\n    | Specify a callback if you want to limit based on IP or authentication.\n    | Leaving it to null will allow localhost only.\n    */\n    'storage' => [\n        'enabled'    => env('DEBUGBAR_STORAGE_ENABLED', true),\n        'open'       => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback.\n        'driver'     => env('DEBUGBAR_STORAGE_DRIVER', 'file'), // redis, file, sqlite, pdo, custom\n        'path'       => env('DEBUGBAR_STORAGE_PATH', storage_path('debugbar')), // For file driver\n        'connection' => env('DEBUGBAR_STORAGE_CONNECTION'), // Leave null for default connection (Redis/PDO)\n        'provider'   => env('DEBUGBAR_STORAGE_PROVIDER', ''), // Instance of StorageInterface for custom driver\n    ],\n\n    /*\n     |--------------------------------------------------------------------------\n     | Assets\n     |--------------------------------------------------------------------------\n     |\n     | Vendor files are included by default, but can be set to false.\n     | This can also be set to 'js' or 'css', to only include javascript or css vendor files.\n     | Vendor files are for css: (none)\n     | and for js: highlight.js\n     | So if you want syntax highlighting, set it to true.\n     |\n     */\n    'use_dist_files' => env('DEBUGBAR_USE_DIST_FILES', true),\n    'include_vendors' => env('DEBUGBAR_INCLUDE_VENDORS', true),\n\n    /*\n     |--------------------------------------------------------------------------\n     | Custom Error Handler for Deprecated warnings\n     |--------------------------------------------------------------------------\n     |\n     | When enabled, the Debugbar shows deprecated warnings for Symfony components\n     | in the Messages tab.\n     |\n     | You can set a custom error reporting level to filter which errors are\n     | handled. For example, to exclude deprecation warnings:\n     |   E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED\n     |\n     | To exclude notices, strict warnings, and deprecations:\n     |   E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED & ~E_USER_DEPRECATED\n     |\n     | Defaults to E_ALL (all errors).\n     |\n     */\n    'error_handler' => env('DEBUGBAR_ERROR_HANDLER', false),\n    'error_level' => env('DEBUGBAR_ERROR_LEVEL', E_ALL),\n\n    /*\n     |--------------------------------------------------------------------------\n     | Clockwork integration\n     |--------------------------------------------------------------------------\n     |\n     | The Debugbar can emulate the Clockwork headers, so you can use the Chrome\n     | Extension, without the server-side code. It uses Debugbar collectors instead.\n     |\n     */\n    'clockwork' => env('DEBUGBAR_CLOCKWORK', false),\n\n    /*\n     |--------------------------------------------------------------------------\n     | Inject Debugbar in Response\n     |--------------------------------------------------------------------------\n     |\n     | Usually, the debugbar is added just before </body>, by listening to the\n     | Response after the App is done. If you disable this, you have to add them\n     | in your template yourself. See http://phpdebugbar.com/docs/rendering.html\n     |\n     */\n\n    'inject' => env('DEBUGBAR_INJECT', true),\n\n    /*\n     |--------------------------------------------------------------------------\n     | Debugbar route prefix\n     |--------------------------------------------------------------------------\n     |\n     | Sometimes you want to set route prefix to be used by Debugbar to load\n     | its resources from. Usually the need comes from misconfigured web server or\n     | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97\n     |\n     */\n    'route_prefix' => env('DEBUGBAR_ROUTE_PREFIX', '_debugbar'),\n\n    /*\n     |--------------------------------------------------------------------------\n     | Debugbar route middleware\n     |--------------------------------------------------------------------------\n     |\n     | Additional middleware to run on the Debugbar routes\n     */\n    'route_middleware' => [],\n\n    /*\n     |--------------------------------------------------------------------------\n     | Debugbar route domain\n     |--------------------------------------------------------------------------\n     |\n     | By default Debugbar route served from the same domain that request served.\n     | To override default domain, specify it as a non-empty value.\n     */\n    'route_domain' => env('DEBUGBAR_ROUTE_DOMAIN'),\n\n    /*\n     |--------------------------------------------------------------------------\n     | Debugbar theme\n     |--------------------------------------------------------------------------\n     |\n     | Switches between light and dark theme. If set to auto it will respect system preferences\n     | Possible values: auto, light, dark\n     */\n    'theme' => env('DEBUGBAR_THEME', 'auto'),\n\n    /*\n     |--------------------------------------------------------------------------\n     | Backtrace stack limit\n     |--------------------------------------------------------------------------\n     |\n     | By default, the Debugbar limits the number of frames returned by the 'debug_backtrace()' function.\n     | If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit.\n     */\n    'debug_backtrace_limit' => (int) env('DEBUGBAR_DEBUG_BACKTRACE_LIMIT', 50),\n];\n"
  },
  {
    "path": "database/migrations/2014_12_01_120000_create_phpdebugbar_storage_table.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration {\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('phpdebugbar', function (Blueprint $table) {\n            $table->string('id');\n            $table->longText('data');\n            $table->string('meta_utime');\n            $table->dateTime('meta_datetime');\n            $table->string('meta_uri');\n            $table->string('meta_ip');\n            $table->string('meta_method');\n\n            $table->primary('id');\n            $table->index('meta_utime');\n            $table->index('meta_datetime');\n            $table->index('meta_uri');\n            $table->index('meta_ip');\n            $table->index('meta_method');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down()\n    {\n        Schema::drop('phpdebugbar');\n    }\n};\n"
  },
  {
    "path": "docs/CNAME",
    "content": "laraveldebugbar.com"
  },
  {
    "path": "docs/assets/extra.css",
    "content": ":root {\n    --md-primary-fg-color:        #eb4432;\n    --md-primary-fg-color--light: #eb4432;\n    --md-primary-fg-color--dark:  #eb4432;\n    --md-accent-fg-color:         #eb4432;\n    --md-accent-fg-color--light:  #eb4432;\n    --md-accent-fg-color--dark:   #eb4432;\n}\n\n.mdx-badge__icon{\n    background:var(--md-accent-fg-color--transparent);\n    padding:.2rem\n}\n.mdx-badge__text{\n    font-size:.85em;\n    box-shadow:0 0 0 1px inset var(--md-accent-fg-color--transparent);\n    padding:.2rem .3rem\n}"
  },
  {
    "path": "docs/collectors.md",
    "content": "---\ndescription: Laravel Debugbar contains a lot of collectors to help you debug or profile Database Queries, Log messages, View templates, Request and Route information, etc.\npreview_image: img/preview-usage.jpg\n---\n!!! warning\n\n    Debugbar can slow the application down (because it has to gather and render data). So when experiencing slowness, try disabling some of the collectors.\n\n# Collectors\n\nThis package includes with these Collectors enabled by default:\n\n- [Queries](#db): Show all database queries\n- [Messages](#messages): Debug messages and objects\n- [Logger](#log): Show all Log messages (Show in Messages when available)\n- [Views](#views): Show the currently loaded views.\n- [Timeline](#time): Timeline with Booting and Application timing\n- [Route](#route): Show information about the current Route.\n- [Exceptions](#exceptions): Exceptions and Throwable with stacktrace\n- [Session](#session): Current session data\n- [Request](#request): Request data\n- [Livewire](#livewire): Only active when Livewire is used\n- [PhpInfo](#phpinfo): Current PHP version\n\n\nThese collectors can be enabled in the config:\n\n- [Gate](#gate): Show the gates that are checked\n- [Events](#events): Show all events\n- [Auth](#auth): Logged in status\n- [Mail](#mail): Sent emails\n- [Laravel Info](#laravel): Show the Laravel version and Environment. \n- [Memory](#memory): Memory usage\n- [Config](#config): Display the values from the config files.\n- [Cache](#cache): Display all cache events. \n- [Models](#models): Loaded Models\n- [Jobs](#jobs): Sent emails\n- [Logs](#logs): Logs from the log files\n- [Pennant](#pennant): Show Pennant flags\n- [Files](#files): Show the files that are included/required by PHP.\n\nTo enable or disable any of the collectors, set the configuration to `true` or `false`. Some collector have additional options in the configuration:\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n\n   /*\n     |--------------------------------------------------------------------------\n     | DataCollectors\n     |--------------------------------------------------------------------------\n     |\n     | Enable/disable DataCollectors\n     |\n     */\n\n    'collectors' => [\n        'phpinfo'         => true,  // Php version\n        'messages'        => true,  // Messages\n        'time'            => true,  // Time Datalogger\n        'memory'          => true,  // Memory usage\n        'exceptions'      => true,  // Exception displayer\n        'log'             => true,  // Logs from Monolog (merged in messages if enabled)\n        'db'              => true,  // Show database (PDO) queries and bindings\n        'views'           => true,  // Views with their data\n        'route'           => true,  // Current route information\n        'auth'            => false, // Display Laravel authentication status\n        'gate'            => false,  // Display Laravel Gate checks\n        'session'         => true,  // Display session data\n        'symfony_request' => true,  // Only one can be enabled..\n        'mail'            => false,  // Catch mail messages\n        'laravel'         => false, // Laravel version and environment\n        'events'          => false, // All events fired\n        'default_request' => false, // Regular or special Symfony request logger\n        'logs'            => false, // Add the latest log messages\n        'files'           => false, // Show the included files\n        'config'          => false, // Display config settings\n        'cache'           => false, // Display cache events\n        'models'          => false,  // Display models\n        'livewire'        => true,  // Display Livewire (when available)\n        'jobs'            => false, // Display dispatched jobs\n        'pennant'         => false, // Display Pennant feature flags\n    ],\n\n    \n\n\n```\n\n</details>\n\n## Database Queries { #db }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.db -->\n\nThe Query Collector has the following features\n - Show the executed queries including timing\n - Show/mark duplicate queries\n - Show used parameters\n - Run on-demand 'EXPLAIN' queries and link to Visual Explain  (disabled bu default)\n - Copy the query to clipboard\n - Show the source of the query and open in editor\n - Visualize the duration of the queries with bottom border\n - Add queries to the timeline (disabled by default)\n - Limit the number of queries to avoid slowing down the Debugbar.\n - Exclude paths (eg. for session or vendors)\n - Show memory usage (disabled by default)\n\n![Query Collector](img/queries.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n  'options' => [\n        // ...\n        'db' => [\n            'with_params'       => true,   // Render SQL with the parameters substituted\n            'exclude_paths'     => [       // Paths to exclude entirely from the collector\n                // 'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries\n            ],\n            'backtrace'         => true,   // Use a backtrace to find the origin of the query in your files.\n            'backtrace_exclude_paths' => [],   // Paths to exclude from backtrace. (in addition to defaults)\n            'timeline'          => false,  // Add the queries to the timeline\n            'duration_background'  => true,   // Show shaded background on each query relative to how long it took to execute.\n            'explain' => [                 // Show EXPLAIN output on queries\n                'enabled' => false,\n            ],\n            'hints'             => false,   // Show hints for common mistakes\n            'show_copy'         => true,    // Show copy button next to the query,\n            'slow_threshold'    => false,   // Only track queries that last longer than this time in ms\n            'memory_usage'      => false,   // Show queries memory usage\n            'soft_limit'       => 100,      // After the soft limit, no parameters/backtrace are captured\n            'hard_limit'       => 500,      // After the hard limit, queries are ignored\n        ],\n        // ...\n    ],\n```\n</details>\n\n### On-demand query EXPLAIN\n\n<!-- md:version v3.14.0 -->\n<!-- md:flag experimental -->\n<!-- md:feature options.db.explain -->\n\nEnable the `options.db.explain` option to run on-demand EXPLAIN queries for any SELECT query in the Debugbar.\nThis will update in the interface. You also have an option to navigate to mysqlexplain.com for a visual explain.\n\n![Query On-demand Explain](img/query-explain.gif)\n\n\n### Query limits\n\n<!-- md:version v3.10.0 -->\n<!-- md:feature options.db.soft_limit: 100 -->\n<!-- md:feature options.db.hard_limit: 500 -->\n\nWith Query Hard & Soft limits, you can reduce the amount of queries shown by default. When the soft limit is reached, bindings will be excluded.\nWhen the hard limit is reached, the queries are excluded altogether to prevent loading too much data.\nIf you want to avoid any limits, you can set the option to `null`\n\n![Query Limits](img/query-limits.png)\n\n\n## Messages { #messages }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.messages -->\n\nThe Message collectors gathers all messages from `debug()` calls and anything written to the logs.\n\nYou can pass multiple parameters to `debug()`, even complex object.\n\n### Trace\n\nWhen calling `debug()`, the source of the call is shown and can be opened with your IDE.\n\n<!-- md:version v3.10.0 -->\n<!-- md:feature options.messages.trace -->\n\n![Messages Collector](img/messages.png)\n\n## Logger { #log }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.log -->\n\nWhen the [Messages Collector](#messages) is enabled, Log messages are added to the Messages tab. Otherwise a Monolog tab will show with just the log messages\n\n![Monolog](img/monolog.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n  'options' => [\n        // ...\n        'db' => [\n            'with_params'       => true,   // Render SQL with the parameters substituted\n            'exclude_paths'     => [       // Paths to exclude entirely from the collector\n                // 'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries\n            ],\n            'backtrace'         => true,   // Use a backtrace to find the origin of the query in your files.\n            'backtrace_exclude_paths' => [],   // Paths to exclude from backtrace. (in addition to defaults)\n            'timeline'          => false,  // Add the queries to the timeline\n            'duration_background'  => true,   // Show shaded background on each query relative to how long it took to execute.\n            'explain' => [                 // Show EXPLAIN output on queries\n                'enabled' => false,\n            ],\n            'hints'             => false,   // Show hints for common mistakes\n            'show_copy'         => true,    // Show copy button next to the query,\n            'slow_threshold'    => false,   // Only track queries that last longer than this time in ms\n            'memory_usage'      => false,   // Show queries memory usage\n            'soft_limit'       => 100,      // After the soft limit, no parameters/backtrace are captured\n            'hard_limit'       => 500,      // After the hard limit, queries are ignored\n        ],\n        // ...\n    ],\n```\n</details>\n\n## Views { #views }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.views -->\n\nThe ViewCollector shows views and has the following features:\n\n- Show used templates and source\n- Optionally add them to the timeline\n- Group similar views (useful for components)\n- Exclude folders (eg. for Filament or other vendors)\n- Optionally show data (this can be resource heavy)\n\n![ViewCollector](img/views.png)\n\n```php\n    'options' => [\n        'views' => [\n            'timeline' => false,    // Add the views to the timeline (Experimental)\n            'data' => false,        //true for all data, 'keys' for only names, false for no parameters.\n            'group' => 50,          // Group duplicate views. Pass value to auto-group, or true/false to force\n            'exclude_paths' => [    // Add the paths which you don't want to appear in the views\n                'vendor/filament'   // Exclude Filament components by default\n            ],\n        ],\n    ]\n\n```\n\n## Timeline { #time }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.time -->\n\n![Timeline Collector](img/timeline.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'time' => [\n            'memory_usage' => false,  // Calculated by subtracting memory start and end, it may be inaccurate\n        ],\n    ]\n```\n\n</details>\n\n## Route { #route }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.route -->\n\nThis shows the current route and middleware.\n\n![RouteCollector](img/route.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'route' => [\n            'label' => true,  // show complete route on bar\n        ],    \n    ],\n```\n\n</details>\n\n## Exceptions { #exceptions }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.exceptions -->\n\nShow any errors from the application, including traces.\n\nYou can manually add exceptions by calling `debugbar()->addThrowable($throwable);`\n\n![ExceptionCollector](img/exceptions.png)\n\n## Session { #session }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.phpinfo -->\n<!-- md:default false -->\n\nA simple widget showing the current PHP Version.\n\n![Session Collector](img/session.png)\n\n\n## Request { #request }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.request -->\n\nShow Request info, like headers, data, cookies etc. Sensitive data is hidden by default, but you can add your own sensitive data to the config.\n\n![Request Collector](img/request.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'symfony_request' => [\n            'hiddens' => [], // hides sensitive values using array paths, example: request_request.password\n        ],\n    ],\n```\n\n</details>\n\n## Livewire { #livewire }\n\n<!-- md:version v3.3.3 -->\n<!-- md:feature collectors.livewire -->\n\nShow the Livewire components that are rendered on the page.\n\n![Livewire Collector](img/livewire.png)\n\n## PHP Info { #phpinfo }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.phpinfo -->\n\nA simple widget showing the current PHP Version.\n\n![PhpInfo Collector](img/phpinfo.png)\n\n## Gate { #gate }\n\n<!-- md:version v2.1.0 -->\n<!-- md:feature collectors.gate -->\n<!-- md:default false -->\n\nThe Gate Collector shows the checks that have passed or failed.\n\n![Gate Collector](img/gate.png)\n\n## Events { #events }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.events -->\n\nThis is similar to the Timeline buts adds all events. This can be a lot of data, so use with caution.\n\n![Events](img/events.gif)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'events' => [\n            'data' => false, // collect events data, listeners\n        ],\n    ],\n```\n\n</details>\n\n\n## Auth { #auth }\n\n<!-- md:version v1.2.2 -->\n<!-- md:feature collectors.auth -->\n<!-- md:default false -->\n\nA widget showing the current login status + a collector with more information.\n\n![Auth Collector](img/auth.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'auth' => [\n            'show_name' => true,   // Also show the users name/email in the debugbar\n            'show_guards' => true, // Show the guards that are used\n        ],\n    ],\n```\n\n</details>\n\n## Mail { #mail }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.mail -->\n<!-- md:default false -->\n\nA collector showing the sent emails.\n\n![Mail Collector](img/mail.png)\n\n### Mail Preview\n\n<!-- md:version v3.12.0 -->\n<!-- md:feature options.mail.show_body -->\n<!-- md:default true -->\n\nYou can open a rendered preview of the email when the body is attached, by clicking 'View Mail'\n\n![Mail Preview](img/mail-preview.png)\n\n## Laravel Info { #laravel }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.laravel -->\n<!-- md:default false -->\n\nA widget showing the current Laravel Version, environment and locale.\n\n![Laravel Collector](img/laravel-info.png)\n\n## Memory Usage { #memory }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.memory -->\n<!-- md:default false -->\n\nShow the Memory Usage of the application\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'memory' => [\n            'reset_peak' => false,     // run memory_reset_peak_usage before collecting\n            'with_baseline' => false,  // Set boot memory usage as memory peak baseline\n            'precision' => 0,          // Memory rounding precision\n        ],\n    ]\n```\n\n</details>\n\n![Memory Collector](img/memory.png)\n\n## Config { #config }\n\n<!-- md:version v3.0 -->\n<!-- md:feature collectors.config -->\n<!-- md:default false -->\n\n!!! warning\n\n     Be careful when turning this on, as it can expose sensitive credentials. Make sure your app is not publicly available.\n\n\nShows the loaded configuration values.\n\n![Config Collector](img/config.png)\n\n## Cache { #cache }\n\n<!-- md:version v3.0.0 -->\n<!-- md:feature collectors.cache -->\n<!-- md:default false -->\n\nShow the hits/misses of the Cache in a Timeline.\n\n![Cache Collector](img/cache.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'cache' => [\n            'values' => true, // collect cache values\n        ],    ],\n```\n\n</details>\n\n## Models { #models }\n\n<!-- md:version v3.2.5-->\n<!-- md:feature collectors.models -->\n<!-- md:default false -->\n\nShows how often each Model is loaded. If this is high, you might want move some logic to SQL instead of processing large Collections.\n\n![Models Collector](img/models.png)\n\n## Jobs { #jobs }\n\n<!-- md:version v3.2.5-->\n<!-- md:feature collectors.models -->\n<!-- md:default false -->\n\nShow the Jobs that are dispatched from this request.\n\n![Jobs Collector](img/jobs.png)\n\n## Logs { #logs }\n\n<!-- md:version v1.0-->\n<!-- md:feature collectors.logs -->\n<!-- md:default false -->\n\nShow the most recent logs from the log files in storage/logs\n\n![Logs Collector](img/logs.png)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    'options' => [\n        'logs' => [\n            'file' => null, // Additional files\n        ],   \n     ],\n```\n\n</details>\n\n## Pennant { #pennant }\n\n<!-- md:version v3.14.0 -->\n<!-- md:feature collectors.pennant -->\n<!-- md:default false -->\n\nShows all the Pennant flags that are checked during this request\n\n![Pennant Collector](img/pennant.png)\n\n## Files { #files }\n\n<!-- md:version v1.0 -->\n<!-- md:feature collectors.files -->\n<!-- md:default false -->\n\n!!! deprecated\n\n     This was mainly useful before OPcache was widely used, and this collector could be used for optimizing files. It's deprecated now.\n\n![Files Collector](img/files.png)\n"
  },
  {
    "path": "docs/features.md",
    "content": "---\ndescription: Laravel Debugbar contains features like collectors, capturing ajax requesting, browsing history etc.\npreview_image: img/preview-features.jpg\n---\n\n## Collectors\n\nSee the [Collectors page](collectors.md) for available collectors.\n\n## AJAX Requests\n\nLaravel Debugbar tracks AJAX/XHR request in your application. You can open these in the dropdown menu, or click the history button to show the requests.\n\nTip: you can disable he 'autoshow' toggle in the history tab to keep the current dataset active, instead of switching.\n\n![AJAX Request](img/ajax.gif)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n/*\n |--------------------------------------------------------------------------\n | Capture Ajax Requests\n |--------------------------------------------------------------------------\n |\n | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors),\n | you can use this option to disable sending the data through the headers.\n |\n | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools.\n |\n | Note for your request to be identified as ajax requests they must either send the header\n | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header.\n |\n | By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar.\n | Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading.\n */\n\n'capture_ajax' => true,\n'add_ajax_timing' => false,\n'ajax_handler_auto_show' => true,\n'ajax_handler_enable_tab' => true,\n\n```\n\n</details>\n\n## History browser\n\nBy default, Debugbar stores request history. This is useful for non-browser requests, redirects or external requests. You can open it with the 'folder' button (3rd from the right).\n\nWith the default settings, storage is only visible from your local IP. To enable browsing the history, change the `storage.open` setting or `DEBUGBAR_OPEN_STORAGE` env key.\n\n!!! warning\n\n    Do not open the history outside your local environment, to avoid leaking credentials or sensitive data.\n\n![History](img/history.gif)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n    /*\n     |--------------------------------------------------------------------------\n     | Storage settings\n     |--------------------------------------------------------------------------\n     |\n     | DebugBar stores data for session/ajax requests.\n     | You can disable this, so the debugbar stores data in headers/session,\n     | but this can cause problems with large data collectors.\n     | By default, file storage (in the storage folder) is used. Redis and PDO\n     | can also be used. For PDO, run the package migrations first.\n     |\n     | Warning: Enabling storage.open will allow everyone to access previous\n     | request, do not enable open storage in publicly available environments!\n     | Specify a callback if you want to limit based on IP or authentication.\n     | Leaving it to null will allow localhost only.\n     */\n    'storage' => [\n        'enabled'    => true,\n        'open'       => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback.\n        'driver'     => 'file', // redis, file, pdo, socket, custom\n        'path'       => storage_path('debugbar'), // For file driver\n        'connection' => null,   // Leave null for default connection (Redis/PDO)\n        'provider'   => '', // Instance of StorageInterface for custom driver\n        'hostname'   => '127.0.0.1', // Hostname to use with the \"socket\" driver\n        'port'       => 2304, // Port to use with the \"socket\" driver\n    ],\n```\n\n</details>\n\n## Light and Dark mode Theme\n\n<!-- md:version v3.4.0 -->\n<!-- md:feature theme -->\n<!-- md:default auto -->\n\nDebugbar supports Dark and Light mode. It defaults to `auto` which uses the browser setting. You can set it with `DEBUGBAR_THEME` or change the config to force th `light` or `dark`.\nSee Light Mode below:\n\n![Light Theme](img/light-theme.png)\n\n\n## Editor integration\n\nDebugbar can open links to views, exception, routes etc in your Editor directly, if you set this up correctly. By default this should just work for PHPStorm on local development. You can change your editor by setting `DEBUGBAR_EDITOR` or the config.\nIf your working in a remote host or docker, you can change the mapping between remote and local paths.\n\n![History](img/editor.gif)\n\n<details><summary>config/debugbar.php</summary>\n\n```php\n/*\n    |--------------------------------------------------------------------------\n    | Editor\n    |--------------------------------------------------------------------------\n    |\n    | Choose your preferred editor to use when clicking file name.\n    |\n    | Supported: \"phpstorm\", \"vscode\", \"vscode-insiders\", \"vscode-remote\",\n    |            \"vscode-insiders-remote\", \"vscodium\", \"textmate\", \"emacs\",\n    |            \"sublime\", \"atom\", \"nova\", \"macvim\", \"idea\", \"netbeans\",\n    |            \"xdebug\", \"espresso\"\n    |\n    */\n\n    'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Remote Path Mapping\n    |--------------------------------------------------------------------------\n    |\n    | If you are using a remote dev server, like Laravel Homestead, Docker, or\n    | even a remote VPS, it will be necessary to specify your path mapping.\n    |\n    | Leaving one, or both of these, empty or null will not trigger the remote\n    | URL changes and Debugbar will treat your editor links as local files.\n    |\n    | \"remote_sites_path\" is an absolute base path for your sites or projects\n    | in Homestead, Vagrant, Docker, or another remote development server.\n    |\n    | Example value: \"/home/vagrant/Code\"\n    |\n    | \"local_sites_path\" is an absolute base path for your sites or projects\n    | on your local computer where your IDE or code editor is running on.\n    |\n    | Example values: \"/Users/<name>/Code\", \"C:\\Users\\<name>\\Documents\\Code\"\n    |\n    */\n\n    'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'),\n    'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')),\n\n```\n\n</details>\n\n## Configuraton\n\n### Custom features { #custom }\n\nCustom features or collectors are not enabled by default, but can be enabled by enabling the configuration setting.\nThis is usually because the target audience of a feature is not large enough.\n\n### Configurable options { #config }\n\nConfigurable features are not enabled by default, but can be enabled. This is usually because the target audience of a feature is not large enough.\nYou can enable the feature by changing the mentioned value in [config/debugbar.php](https://github.com/fruitcake/laravel-debugbar/blob/master/config/debugbar.php) after [publishing the config](installation.md#publish-config).\n\n### Experimental Features  { #experimental }\n\nSome features are marked as 'Experimental'. This mostly means the feature is new and not enabled by default, but might become enable by default in the future.\nYou are welcome to test this feature and report any issues. \n\n"
  },
  {
    "path": "docs/index.md",
    "content": "---\ntitle: Debugbar for Laravel\ndescription: Laravel Debugbar is a package that integrates PHP Debug Bar with Laravel to debug database queries and profile other information.\nhide:\n  - navigation\n  - toc \n---\n\n# Laravel Debugbar\n![Unit Tests](https://github.com/fruitcake/laravel-debugbar/workflows/Unit%20Tests/badge.svg)\n[![Packagist License](https://img.shields.io/badge/Licence-MIT-blue)](http://choosealicense.com/licenses/mit/)\n[![Latest Stable Version](https://img.shields.io/packagist/v/fruitcake/laravel-debugbar?label=Stable)](https://packagist.org/packages/fruitcake/laravel-debugbar)\n[![Total Downloads](https://img.shields.io/packagist/dt/barryvdh/laravel-debugbar?label=Downloads)](https://packagist.org/packages/fruitcake/laravel-debugbar)\n[![Fruitcake](https://img.shields.io/badge/Powered%20By-Fruitcake-b2bc35.svg)](https://fruitcake.nl/)\n\nLaravel Debugbar is a package that integrates [PHP Debug Bar](https://github.com/php-debugbar/php-debugbar) with Laravel to debug [database queries](collectors.md#db) and [profile other information](collectors.md).\n\n![Debugbar Dark Mode screenshot](img/debugbar.gif)\n\n!!! example \"Live Demo\"\n    See an interactive example of the Laravel Debugbar in action below. (Don't worry, this is just dummy data)\n\n!!! tip \"4.x release\"\n    In January 2026, a new major version of the Debugbar is released. See [fruitcake.nl/blog/laravel-debugbar-v4-release](https://fruitcake.nl/blog/laravel-debugbar-v4-release) and [UPGRADE.md](https://github.com/fruitcake/laravel-debugbar/blob/master/UPGRADE.md)\n\n[Get started](installation.md){ .md-button .md-button--primary } [View code :material-github:](https://github.com/fruitcake/laravel-debugbar){ .md-button }\n"
  },
  {
    "path": "docs/installation.md",
    "content": "---\ndescription: Installing Laravel Debugbar in a project is simple. Use 'composer require fruitcake/laravel-debugbar --dev' to get started now\npreview_image: img/preview-install.jpg\n---\n\n# Installation\n\n## Install with composer\n!!! danger\n\n    Use the Debugbar only in development. Do not use Debugbar on publicly accessible websites, as it will leak information from stored requests (by design).\n\n\nRequire this package with composer. It is recommended to only require the package for development.\n\n```shell\ncomposer require fruitcake/laravel-debugbar --dev\n```\n\nLaravel uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.\n\n> If you use a catch-all/fallback route, make sure you load the Debugbar ServiceProvider before your own App ServiceProviders.\n\n\n## Enable\nBy default, Debugbar will be enabled when `APP_DEBUG` is `true`.\n\n\nThe profiler is enabled by default, if you have APP_DEBUG=true. You can override that in the config (`debugbar.enabled`) or by setting `DEBUGBAR_ENABLED` in your `.env`. See more options in `config/debugbar.php`\n\n```php\n    /*\n     |--------------------------------------------------------------------------\n     | Debugbar Settings\n     |--------------------------------------------------------------------------\n     |\n     | Debugbar is enabled by default, when debug is set to true in app.php.\n     | You can override the value by setting enable to true or false instead of null.\n     |\n     | You can provide an array of URI's that must be ignored (eg. 'api/*')\n     |\n     */\n\n    'enabled' => env('DEBUGBAR_ENABLED', null),\n    'hide_empty_tabs' => false, // Hide tabs until they have content\n    'except' => [\n        'telescope*',\n        'horizon*',\n    ],\n\n```\n\n### Publish config\n\n```shell\nphp artisan vendor:publish --provider=\"Fruitcake\\LaravelDebugbar\\ServiceProvider\"\n```\n\n## Non-default installs\n\n### Without auto-discovery\n\nIf you don't use auto-discovery, add the ServiceProvider to the providers list. For Laravel 11 or newer, add the ServiceProvider in bootstrap/providers.php. For Laravel 10 or older, add the ServiceProvider in config/app.php.\n\n```php\nFruitcake\\LaravelDebugbar\\ServiceProvider::class,\n```\n\nIf you want to use the facade to log messages, add this within the `register` method of `app/Providers/AppServiceProvider.php` class:\n\n```php\npublic function register(): void\n{\n    $loader = \\Illuminate\\Foundation\\AliasLoader::getInstance();\n    $loader->alias('Debugbar', \\Fruitcake\\LaravelDebugbar\\Facades\\Debugbar::class);\n}\n```\n\n### With Octane\n\nLaravel Debugbar 4.x works out of the box with Octane. No need to add anything to your config.\n\nIf you're upgrading from Laravel Debugbar 3.x, remove the 'flush' config for Debugbar in `config/octane.php`.\n\n### With Lumen\n\nLumen is not supported anymore, as it's no longer actively maintained.\n"
  },
  {
    "path": "docs/overrides/main.html",
    "content": "{% extends \"base.html\" %}\n\n<!-- Meta tags -->\n{% block extrahead %}\n{{ super() }}\n\n{% if page.is_homepage %}\n<meta property=\"og:title\" content=\"{{ config.site_name }}\" />\n{% elif page.meta and page.meta.title %}\n<meta property=\"og:title\" content=\"{{ page.meta.title }} - {{ config.site_name }}\" />\n{% elif page.title and not page.is_homepage %}\n<meta property=\"og:title\" content=\"{{ page.title | striptags }} - {{ config.site_name }}\" />\n{% else %}\n<meta property=\"og:title\" content=\"{{ config.site_name }}}\" />\n{% endif %}\n\n{% if page.meta and page.meta.description %}\n<meta property=\"og:description\" content=\"{{ page.meta.description }}\" />\n{% elif config.site_description %}\n<meta property=\"og:description\" content=\"{{ config.site_description }}\" />\n{% endif %}\n\n<meta property=\"og:type\" content=\"website\" />\n{% if page.canonical_url %}\n<meta property=\"og:url\" content=\"{{ page.canonical_url }}\" />\n{% endif %}\n\n{% if page.meta and page.meta.preview_image %}\n<meta property=\"og:image\" content=\"{{ config.site_url }}{{ page.meta.preview_image }}\" />\n{% else %}\n<meta property=\"og:image\" content=\"{{ config.site_url }}img/preview.jpg\" />\n{% endif %}\n\n{% endblock %}\n\n{% block scripts %}\n<!-- Add scripts that need to run before here -->\n{{ super() }}\n\n\n<!-- Start Debugbar -->\n<script> Sfdump = window.Sfdump || (function (doc) { doc.documentElement.classList.add('sf-js-enabled'); var rxEsc = /([.*+?^${}()|\\[\\]\\/\\\\])/g, idRx = /\\bsf-dump-\\d+-ref[012]\\w+\\b/, keyHint = 0 <= navigator.platform.toUpperCase().indexOf('MAC') ? 'Cmd' : 'Ctrl', addEventListener = function (e, n, cb) { e.addEventListener(n, cb, false); }; if (!doc.addEventListener) { addEventListener = function (element, eventName, callback) { element.attachEvent('on' + eventName, function (e) { e.preventDefault = function () {e.returnValue = false;}; e.target = e.srcElement; callback(e); }); }; } function toggle(a, recursive) { var s = a.nextSibling || {}, oldClass = s.className, arrow, newClass; if (/\\bsf-dump-compact\\b/.test(oldClass)) { arrow = '▼'; newClass = 'sf-dump-expanded'; } else if (/\\bsf-dump-expanded\\b/.test(oldClass)) { arrow = '▶'; newClass = 'sf-dump-compact'; } else { return false; } if (doc.createEvent && s.dispatchEvent) { var event = doc.createEvent('Event'); event.initEvent('sf-dump-expanded' === newClass ? 'sfbeforedumpexpand' : 'sfbeforedumpcollapse', true, false); s.dispatchEvent(event); } a.lastChild.innerHTML = arrow; s.className = s.className.replace(/\\bsf-dump-(compact|expanded)\\b/, newClass); if (recursive) { try { a = s.querySelectorAll('.'+oldClass); for (s = 0; s < a.length; ++s) { if (-1 == a[s].className.indexOf(newClass)) { a[s].className = newClass; a[s].previousSibling.lastChild.innerHTML = arrow; } } } catch (e) { } } return true; }; function collapse(a, recursive) { var s = a.nextSibling || {}, oldClass = s.className; if (/\\bsf-dump-expanded\\b/.test(oldClass)) { toggle(a, recursive); return true; } return false; }; function expand(a, recursive) { var s = a.nextSibling || {}, oldClass = s.className; if (/\\bsf-dump-compact\\b/.test(oldClass)) { toggle(a, recursive); return true; } return false; }; function collapseAll(root) { var a = root.querySelector('a.sf-dump-toggle'); if (a) { collapse(a, true); expand(a); return true; } return false; } function reveal(node) { var previous, parents = []; while ((node = node.parentNode || {}) && (previous = node.previousSibling) && 'A' === previous.tagName) { parents.push(previous); } if (0 !== parents.length) { parents.forEach(function (parent) { expand(parent); }); return true; } return false; } function highlight(root, activeNode, nodes) { resetHighlightedNodes(root); Array.from(nodes||[]).forEach(function (node) { if (!/\\bsf-dump-highlight\\b/.test(node.className)) { node.className = node.className + ' sf-dump-highlight'; } }); if (!/\\bsf-dump-highlight-active\\b/.test(activeNode.className)) { activeNode.className = activeNode.className + ' sf-dump-highlight-active'; } } function resetHighlightedNodes(root) { Array.from(root.querySelectorAll('.sf-dump-str, .sf-dump-key, .sf-dump-public, .sf-dump-protected, .sf-dump-private')).forEach(function (strNode) { strNode.className = strNode.className.replace(/\\bsf-dump-highlight\\b/, ''); strNode.className = strNode.className.replace(/\\bsf-dump-highlight-active\\b/, ''); }); } return function (root, x) { root = doc.getElementById(root); var indentRx = new RegExp('^('+(root.getAttribute('data-indent-pad') || ' ').replace(rxEsc, '\\\\$1')+')+', 'm'), options = {\"maxDepth\":1,\"maxStringLength\":160,\"fileLinkFormat\":false}, elt = root.getElementsByTagName('A'), len = elt.length, i = 0, s, h, t = []; while (i < len) t.push(elt[i++]); for (i in x) { options[i] = x[i]; } function a(e, f) { addEventListener(root, e, function (e, n) { if ('A' == e.target.tagName) { f(e.target, e); } else if ('A' == e.target.parentNode.tagName) { f(e.target.parentNode, e); } else { n = /\\bsf-dump-ellipsis\\b/.test(e.target.className) ? e.target.parentNode : e.target; if ((n = n.nextElementSibling) && 'A' == n.tagName) { if (!/\\bsf-dump-toggle\\b/.test(n.className)) { n = n.nextElementSibling || n; } f(n, e, true); } } }); }; function isCtrlKey(e) { return e.ctrlKey || e.metaKey; } function xpathString(str) { var parts = str.match(/[^'\"]+|['\"]/g).map(function (part) { if (\"'\" == part) { return '\"\\'\"'; } if ('\"' == part) { return \"'\\\"'\"; } return \"'\" + part + \"'\"; }); return \"concat(\" + parts.join(\",\") + \", '')\"; } function xpathHasClass(className) { return \"contains(concat(' ', normalize-space(@class), ' '), ' \" + className +\" ')\"; } a('mouseover', function (a, e, c) { if (c) { e.target.style.cursor = \"pointer\"; } }); a('click', function (a, e, c) { if (/\\bsf-dump-toggle\\b/.test(a.className)) { e.preventDefault(); if (!toggle(a, isCtrlKey(e))) { var r = doc.getElementById(a.getAttribute('href').slice(1)), s = r.previousSibling, f = r.parentNode, t = a.parentNode; t.replaceChild(r, a); f.replaceChild(a, s); t.insertBefore(s, r); f = f.firstChild.nodeValue.match(indentRx); t = t.firstChild.nodeValue.match(indentRx); if (f && t && f[0] !== t[0]) { r.innerHTML = r.innerHTML.replace(new RegExp('^'+f[0].replace(rxEsc, '\\\\$1'), 'mg'), t[0]); } if (/\\bsf-dump-compact\\b/.test(r.className)) { toggle(s, isCtrlKey(e)); } } if (c) { } else if (doc.getSelection) { try { doc.getSelection().removeAllRanges(); } catch (e) { doc.getSelection().empty(); } } else { doc.selection.empty(); } } else if (/\\bsf-dump-str-toggle\\b/.test(a.className)) { e.preventDefault(); e = a.parentNode.parentNode; e.className = e.className.replace(/\\bsf-dump-str-(expand|collapse)\\b/, a.parentNode.className); } }); elt = root.getElementsByTagName('SAMP'); len = elt.length; i = 0; while (i < len) t.push(elt[i++]); len = t.length; for (i = 0; i < len; ++i) { elt = t[i]; if ('SAMP' == elt.tagName) { a = elt.previousSibling || {}; if ('A' != a.tagName) { a = doc.createElement('A'); a.className = 'sf-dump-ref'; elt.parentNode.insertBefore(a, elt); } else { a.innerHTML += ' '; } a.title = (a.title ? a.title+'\\n[' : '[')+keyHint+'+click] Expand all children'; a.innerHTML += elt.className == 'sf-dump-compact' ? '<span>▶</span>' : '<span>▼</span>'; a.className += ' sf-dump-toggle'; x = 1; if ('sf-dump' != elt.parentNode.className) { x += elt.parentNode.getAttribute('data-depth')/1; } } else if (/\\bsf-dump-ref\\b/.test(elt.className) && (a = elt.getAttribute('href'))) { a = a.slice(1); elt.className += ' sf-dump-hover'; elt.className += ' '+a; if (/[\\[{]$/.test(elt.previousSibling.nodeValue)) { a = a != elt.nextSibling.id && doc.getElementById(a); try { s = a.nextSibling; elt.appendChild(a); s.parentNode.insertBefore(a, s); if (/^[@#]/.test(elt.innerHTML)) { elt.innerHTML += ' <span>▶</span>'; } else { elt.innerHTML = '<span>▶</span>'; elt.className = 'sf-dump-ref'; } elt.className += ' sf-dump-toggle'; } catch (e) { if ('&' == elt.innerHTML.charAt(0)) { elt.innerHTML = '…'; elt.className = 'sf-dump-ref'; } } } } } if (doc.evaluate && Array.from && root.children.length > 1) { root.setAttribute('tabindex', 0); SearchState = function () { this.nodes = []; this.idx = 0; }; SearchState.prototype = { next: function () { if (this.isEmpty()) { return this.current(); } this.idx = this.idx < (this.nodes.length - 1) ? this.idx + 1 : 0; return this.current(); }, previous: function () { if (this.isEmpty()) { return this.current(); } this.idx = this.idx > 0 ? this.idx - 1 : (this.nodes.length - 1); return this.current(); }, isEmpty: function () { return 0 === this.count(); }, current: function () { if (this.isEmpty()) { return null; } return this.nodes[this.idx]; }, reset: function () { this.nodes = []; this.idx = 0; }, count: function () { return this.nodes.length; }, }; function showCurrent(state) { var currentNode = state.current(), currentRect, searchRect; if (currentNode) { reveal(currentNode); highlight(root, currentNode, state.nodes); if ('scrollIntoView' in currentNode) { currentNode.scrollIntoView(true); currentRect = currentNode.getBoundingClientRect(); searchRect = search.getBoundingClientRect(); if (currentRect.top < (searchRect.top + searchRect.height)) { window.scrollBy(0, -(searchRect.top + searchRect.height + 5)); } } } counter.textContent = (state.isEmpty() ? 0 : state.idx + 1) + ' of ' + state.count(); } var search = doc.createElement('div'); search.className = 'sf-dump-search-wrapper sf-dump-search-hidden'; search.innerHTML = ' <input type=\"text\" class=\"sf-dump-search-input\"> <span class=\"sf-dump-search-count\">0 of 0<\\/span> <button type=\"button\" class=\"sf-dump-search-input-previous\" tabindex=\"-1\"> <svg viewBox=\"0 0 1792 1792\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1683 1331l-166 165q-19 19-45 19t-45-19L896 965l-531 531q-19 19-45 19t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19 45-19t45 19l742 741q19 19 19 45.5t-19 45.5z\"\\/><\\/svg> <\\/button> <button type=\"button\" class=\"sf-dump-search-input-next\" tabindex=\"-1\"> <svg viewBox=\"0 0 1792 1792\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1683 808l-742 741q-19 19-45 19t-45-19L109 808q-19-19-19-45.5t19-45.5l166-165q19-19 45-19t45 19l531 531 531-531q19-19 45-19t45 19l166 165q19 19 19 45.5t-19 45.5z\"\\/><\\/svg> <\\/button> '; root.insertBefore(search, root.firstChild); var state = new SearchState(); var searchInput = search.querySelector('.sf-dump-search-input'); var counter = search.querySelector('.sf-dump-search-count'); var searchInputTimer = 0; var previousSearchQuery = ''; addEventListener(searchInput, 'keyup', function (e) { var searchQuery = e.target.value; /* Don't perform anything if the pressed key didn't change the query */ if (searchQuery === previousSearchQuery) { return; } previousSearchQuery = searchQuery; clearTimeout(searchInputTimer); searchInputTimer = setTimeout(function () { state.reset(); collapseAll(root); resetHighlightedNodes(root); if ('' === searchQuery) { counter.textContent = '0 of 0'; return; } var classMatches = [ \"sf-dump-str\", \"sf-dump-key\", \"sf-dump-public\", \"sf-dump-protected\", \"sf-dump-private\", ].map(xpathHasClass).join(' or '); var xpathResult = doc.evaluate('.//span[' + classMatches + '][contains(translate(child::text(), ' + xpathString(searchQuery.toUpperCase()) + ', ' + xpathString(searchQuery.toLowerCase()) + '), ' + xpathString(searchQuery.toLowerCase()) + ')]', root, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); while (node = xpathResult.iterateNext()) state.nodes.push(node); showCurrent(state); }, 400); }); Array.from(search.querySelectorAll('.sf-dump-search-input-next, .sf-dump-search-input-previous')).forEach(function (btn) { addEventListener(btn, 'click', function (e) { e.preventDefault(); -1 !== e.target.className.indexOf('next') ? state.next() : state.previous(); searchInput.focus(); collapseAll(root); showCurrent(state); }) }); addEventListener(root, 'keydown', function (e) { var isSearchActive = !/\\bsf-dump-search-hidden\\b/.test(search.className); if ((114 === e.keyCode && !isSearchActive) || (isCtrlKey(e) && 70 === e.keyCode)) { /* F3 or CMD/CTRL + F */ if (70 === e.keyCode && document.activeElement === searchInput) { /* * If CMD/CTRL + F is hit while having focus on search input, * the user probably meant to trigger browser search instead. * Let the browser execute its behavior: */ return; } e.preventDefault(); search.className = search.className.replace(/\\bsf-dump-search-hidden\\b/, ''); searchInput.focus(); } else if (isSearchActive) { if (27 === e.keyCode) { /* ESC key */ search.className += ' sf-dump-search-hidden'; e.preventDefault(); resetHighlightedNodes(root); searchInput.value = ''; } else if ( (isCtrlKey(e) && 71 === e.keyCode) /* CMD/CTRL + G */ || 13 === e.keyCode /* Enter */ || 114 === e.keyCode /* F3 */ ) { e.preventDefault(); e.shiftKey ? state.previous() : state.next(); collapseAll(root); showCurrent(state); } } }); } if (0 >= options.maxStringLength) { return; } try { elt = root.querySelectorAll('.sf-dump-str'); len = elt.length; i = 0; t = []; while (i < len) t.push(elt[i++]); len = t.length; for (i = 0; i < len; ++i) { elt = t[i]; s = elt.innerText || elt.textContent; x = s.length - options.maxStringLength; if (0 < x) { h = elt.innerHTML; elt[elt.innerText ? 'innerText' : 'textContent'] = s.substring(0, options.maxStringLength); elt.className += ' sf-dump-str-collapse'; elt.innerHTML = '<span class=sf-dump-str-collapse>'+h+'<a class=\"sf-dump-ref sf-dump-str-toggle\" title=\"Collapse\"> ◀</a></span>'+ '<span class=sf-dump-str-expand>'+elt.innerHTML+'<a class=\"sf-dump-ref sf-dump-str-toggle\" title=\"'+x+' remaining characters\"> ▶</a></span>'; } } } catch (e) { } }; })(document); </script><style> .sf-js-enabled .phpdebugbar pre.sf-dump .sf-dump-compact, .sf-js-enabled .sf-dump-str-collapse .sf-dump-str-collapse, .sf-js-enabled .sf-dump-str-expand .sf-dump-str-expand { display: none; } .sf-dump-hover:hover { background-color: #B729D9; color: #FFF !important; border-radius: 2px; } .phpdebugbar pre.sf-dump { display: block; white-space: pre; padding: 5px; overflow: initial !important; } .phpdebugbar pre.sf-dump:after { content: \"\"; visibility: hidden; display: block; height: 0; clear: both; } .phpdebugbar pre.sf-dump .sf-dump-ellipsization { display: inline-flex; } .phpdebugbar pre.sf-dump a { text-decoration: none; cursor: pointer; border: 0; outline: none; color: inherit; } .phpdebugbar pre.sf-dump img { max-width: 50em; max-height: 50em; margin: .5em 0 0 0; padding: 0; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAHUlEQVQY02O8zAABilCaiQEN0EeA8QuUcX9g3QEAAjcC5piyhyEAAAAASUVORK5CYII=) #D3D3D3; } .phpdebugbar pre.sf-dump .sf-dump-ellipsis { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } .phpdebugbar pre.sf-dump .sf-dump-ellipsis-tail { flex-shrink: 0; } .phpdebugbar pre.sf-dump code { display:inline; padding:0; background:none; } .sf-dump-public.sf-dump-highlight, .sf-dump-protected.sf-dump-highlight, .sf-dump-private.sf-dump-highlight, .sf-dump-str.sf-dump-highlight, .sf-dump-key.sf-dump-highlight { background: rgba(111, 172, 204, 0.3); border: 1px solid #7DA0B1; border-radius: 3px; } .sf-dump-public.sf-dump-highlight-active, .sf-dump-protected.sf-dump-highlight-active, .sf-dump-private.sf-dump-highlight-active, .sf-dump-str.sf-dump-highlight-active, .sf-dump-key.sf-dump-highlight-active { background: rgba(253, 175, 0, 0.4); border: 1px solid #ffa500; border-radius: 3px; } .phpdebugbar pre.sf-dump .sf-dump-search-hidden { display: none !important; } .phpdebugbar pre.sf-dump .sf-dump-search-wrapper { font-size: 0; white-space: nowrap; margin-bottom: 5px; display: flex; position: -webkit-sticky; position: sticky; top: 5px; } .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > * { vertical-align: top; box-sizing: border-box; height: 21px; font-weight: normal; border-radius: 0; background: #FFF; color: #757575; border: 1px solid #BBB; } .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > input.sf-dump-search-input { padding: 3px; height: 21px; font-size: 12px; border-right: none; border-top-left-radius: 3px; border-bottom-left-radius: 3px; color: #000; min-width: 15px; width: 100%; } .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next, .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous { background: #F2F2F2; outline: none; border-left: none; font-size: 0; line-height: 0; } .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next > svg, .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous > svg { pointer-events: none; width: 12px; height: 12px; } .phpdebugbar pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-count { display: inline-block; padding: 0 5px; margin: 0; border-left: none; line-height: 21px; font-size: 12px; }.phpdebugbar pre.sf-dump, .phpdebugbar pre.sf-dump .sf-dump-default{word-wrap: break-word; white-space: pre-wrap; word-break: normal}.phpdebugbar pre.sf-dump .sf-dump-num{font-weight:bold; color:#1299DA}.phpdebugbar pre.sf-dump .sf-dump-const{font-weight:bold}.phpdebugbar pre.sf-dump .sf-dump-str{font-weight:bold; color:#3A9B26}.phpdebugbar pre.sf-dump .sf-dump-note{color:#1299DA}.phpdebugbar pre.sf-dump .sf-dump-ref{color:#7B7B7B}.phpdebugbar pre.sf-dump .sf-dump-public{color:#000000}.phpdebugbar pre.sf-dump .sf-dump-protected{color:#000000}.phpdebugbar pre.sf-dump .sf-dump-private{color:#000000}.phpdebugbar pre.sf-dump .sf-dump-meta{color:#B729D9}.phpdebugbar pre.sf-dump .sf-dump-key{color:#3A9B26}.phpdebugbar pre.sf-dump .sf-dump-index{color:#1299DA}.phpdebugbar pre.sf-dump .sf-dump-ellipsis{color:#A0A000}.phpdebugbar pre.sf-dump .sf-dump-virtual{font-style:italic}.phpdebugbar pre.sf-dump .sf-dump-ns{user-select:none;}.phpdebugbar pre.sf-dump .sf-dump-ellipsis-note{color:#1299DA}.phpdebugbar[data-theme='dark'] pre.sf-dump, pre.sf-dump .sf-dump-default{background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-num{font-weight:bold; color:#1299DA}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-const{font-weight:bold}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-virtual{font-style:italic}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-str{font-weight:bold; color:#56DB3A}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-note{color:#1299DA}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-ref{color:#A0A0A0}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-public{color:#FFFFFF}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-protected{color:#FFFFFF}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-private{color:#FFFFFF}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-meta{color:#B729D9}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-key{color:#56DB3A}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-index{color:#1299DA}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-ellipsis{color:#FF8400}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-ns{user-select:none;}.phpdebugbar[data-theme='dark'] pre.sf-dump .sf-dump-ellipsis-note{color:#1299DA}</style>\n<script type=\"text/javascript\">\nvar phpdebugbar = new PhpDebugBar.DebugBar({\"theme\":\"auto\",\"hideEmptyTabs\":true});\nphpdebugbar.addTab(\"request\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"arrows-left-right\",\"title\":\"Request\", \"widget\": new PhpDebugBar.Widgets.HtmlVariableListWidget()}));\nphpdebugbar.addIndicator(\"request_uri\", new PhpDebugBar.DebugBar.Indicator({\"icon\":\"share-3\",\"link\":\"request\"}), \"right\");\nphpdebugbar.addTab(\"exceptions\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"bug\",\"title\":\"Exceptions\", \"widget\": new PhpDebugBar.Widgets.ExceptionsWidget()}));\nphpdebugbar.addTab(\"messages\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"logs\",\"title\":\"Messages\", \"widget\": new PhpDebugBar.Widgets.MessagesWidget()}));\nphpdebugbar.addIndicator(\"time\", new PhpDebugBar.DebugBar.Indicator({\"icon\":\"clock\",\"tooltip\":\"Request Duration\",\"link\":\"timeline\"}), \"right\");\nphpdebugbar.addTab(\"timeline\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"chart-infographic\",\"title\":\"Timeline\", \"widget\": new PhpDebugBar.Widgets.TimelineWidget()}));\nphpdebugbar.addIndicator(\"memory\", new PhpDebugBar.DebugBar.Indicator({\"icon\":\"server-cog\",\"tooltip\":\"Memory Usage\"}), \"right\");\nphpdebugbar.addIndicator(\"version\", new PhpDebugBar.DebugBar.Indicator({\"icon\":\"brand-laravel\"}), \"right\");\nphpdebugbar.addTab(\"views\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"file-code\",\"title\":\"Views\", \"widget\": new PhpDebugBar.Widgets.TemplatesWidget()}));\nphpdebugbar.addTab(\"queries\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"database\",\"title\":\"Queries\", \"widget\": new PhpDebugBar.Widgets.LaravelQueriesWidget()}));\nphpdebugbar.addTab(\"models\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"box\",\"title\":\"Models\", \"widget\": new PhpDebugBar.Widgets.TableVariableListWidget()}));\nphpdebugbar.addTab(\"emails\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"inbox\",\"title\":\"Mails\", \"widget\": new PhpDebugBar.Widgets.MailsWidget()}));\nphpdebugbar.addTab(\"gate\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"logs\",\"title\":\"Gate\", \"widget\": new PhpDebugBar.Widgets.MessagesWidget()}));\nphpdebugbar.addTab(\"cache\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"clipboard-text\",\"title\":\"Cache\", \"widget\": new PhpDebugBar.Widgets.LaravelCacheWidget()}));\nphpdebugbar.addTab(\"jobs\", new PhpDebugBar.DebugBar.Tab({\"icon\":\"briefcase\",\"title\":\"Jobs\", \"widget\": new PhpDebugBar.Widgets.TableVariableListWidget()}));\nphpdebugbar.setDataMap({\n\"request\": [\"request.data\", {}],\n\"request:badge\": [\"request.badge\", null],\n\"request_uri\": [\"request.data.uri\", ],\n\"request_uri:tooltip\": [\"request.tooltip\", {}],\n\"exceptions\": [\"exceptions.exceptions\", []],\n\"exceptions:badge\": [\"exceptions.count\", null],\n\"messages\": [\"messages.messages\", []],\n\"messages:badge\": [\"messages.count\", null],\n\"time\": [\"time.duration_str\", '0ms'],\n\"timeline\": [\"time\", {}],\n\"memory\": [\"memory.peak_usage_str\", '0B'],\n\"version\": [\"laravel.version\", ],\n\"version:tooltip\": [\"laravel.tooltip\", {}],\n\"views\": [\"views\", []],\n\"views:badge\": [\"views.nb_templates\", 0],\n\"queries\": [\"queries\", []],\n\"queries:badge\": [\"queries.nb_statements\", 0],\n\"models\": [\"models\", {}],\n\"models:badge\": [\"models.count\", 0],\n\"emails\": [\"symfonymailer_mails.mails\", []],\n\"emails:badge\": [\"symfonymailer_mails.count\", null],\n\"gate\": [\"gate.messages\", []],\n\"gate:badge\": [\"gate.count\", null],\n\"cache\": [\"cache\", {}],\n\"cache:badge\": [\"cache.nb_measures\", null],\n\"jobs\": [\"jobs\", {}],\n\"jobs:badge\": [\"jobs.count\", 0]\n});\nphpdebugbar.restoreState();\nphpdebugbar.enableAjaxHandlerTab();\nphpdebugbar.ajaxHandler = new PhpDebugBar.AjaxHandler(phpdebugbar, undefined, true);\nphpdebugbar.ajaxHandler.bindToFetch();\nphpdebugbar.ajaxHandler.bindToXHR();\nphpdebugbar.setOpenHandler(new PhpDebugBar.OpenHandler({\"url\":\"http:\\/\\/localhost\\/_debugbar\\/open\"}));\nphpdebugbar.addDataSet({\"__meta\":{\"id\":\"01KE6YNS1G737D5PGHMQJVZKKE\",\"datetime\":\"2026-01-05 11:29:00\",\"utime\":1767612540.052934,\"method\":\"GET\",\"uri\":\"\\/docs\",\"ip\":\"127.0.0.1\"},\"request\":{\"data\":{\"uri\":\"GET docs\",\"file\":{\"value\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php:42-59\",\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Ftests%2FDebugbarDocsTest.php\\u0026line=42\",\"ajax\":false,\"filename\":\"DebugbarDocsTest.php\",\"line\":\"42\"}},\"method\":\"GET\",\"format\":\"html\",\"content_type\":\"text\\/html; charset=utf-8\",\"status_text\":\"OK\",\"status_code\":\"\\u003Cpre class=sf-dump id=sf-dump-284496784 data-indent-pad=\\u0022  \\u0022\\u003E\\u003Cspan class=sf-dump-num\\u003E200\\u003C\\/span\\u003E\\n\\u003C\\/pre\\u003E\\n\",\"request_query\":\"\\u003Cpre class=sf-dump id=sf-dump-1896855412 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"request_request\":\"\\u003Cpre class=sf-dump id=sf-dump-14564081 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"request_files\":\"\\u003Cpre class=sf-dump id=sf-dump-1363178519 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"request_headers\":\"\\u003Cpre class=sf-dump id=sf-dump-1438531029 data-indent-pad=\\u0022  \\u0022\\u003E\\u003Cspan class=sf-dump-note\\u003Earray:5\\u003C\\/span\\u003E [\\u003Csamp data-depth=1 class=sf-dump-expanded\\u003E\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Ehost\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00229 characters\\u0022\\u003Elocalhost\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Euser-agent\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00227 characters\\u0022\\u003ESymfony\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Eaccept\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002263 characters\\u0022\\u003Etext\\/html,application\\/xhtml+xml,application\\/xml;q=0.9,*\\/*;q=0.8\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Eaccept-language\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002214 characters\\u0022\\u003Een-us,en;q=0.5\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Eaccept-charset\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002230 characters\\u0022\\u003EISO-8859-1,utf-8;q=0.7,*;q=0.7\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n\\u003C\\/samp\\u003E]\\n\\u003C\\/pre\\u003E\\n\",\"request_server\":\"\\u003Cpre class=sf-dump id=sf-dump-129374896 data-indent-pad=\\u0022  \\u0022\\u003E\\u003Cspan class=sf-dump-note\\u003Earray:17\\u003C\\/span\\u003E [\\u003Csamp data-depth=1 class=sf-dump-expanded\\u003E\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003ESERVER_NAME\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00229 characters\\u0022\\u003Elocalhost\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003ESERVER_PORT\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E80\\u003C\\/span\\u003E\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EHTTP_HOST\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00229 characters\\u0022\\u003Elocalhost\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EHTTP_USER_AGENT\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00227 characters\\u0022\\u003ESymfony\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EHTTP_ACCEPT\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002263 characters\\u0022\\u003Etext\\/html,application\\/xhtml+xml,application\\/xml;q=0.9,*\\/*;q=0.8\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EHTTP_ACCEPT_LANGUAGE\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002214 characters\\u0022\\u003Een-us,en;q=0.5\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EHTTP_ACCEPT_CHARSET\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002230 characters\\u0022\\u003EISO-8859-1,utf-8;q=0.7,*;q=0.7\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EREMOTE_ADDR\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00229 characters\\u0022\\u003E127.0.0.1\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003ESCRIPT_NAME\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003ESCRIPT_FILENAME\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003ESERVER_PROTOCOL\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00228 characters\\u0022\\u003EHTTP\\/1.1\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EREQUEST_TIME\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E1767612539\\u003C\\/span\\u003E\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EREQUEST_TIME_FLOAT\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E1767612539.9284\\u003C\\/span\\u003E\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EPATH_INFO\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EREQUEST_METHOD\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003EGET\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EREQUEST_URI\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00225 characters\\u0022\\u003E\\/docs\\u003C\\/span\\u003E\\u0022\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003EQUERY_STRING\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u0022\\n\\u003C\\/samp\\u003E]\\n\\u003C\\/pre\\u003E\\n\",\"request_cookies\":\"\\u003Cpre class=sf-dump id=sf-dump-1063404810 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"request_attributes\":\"\\u003Cpre class=sf-dump id=sf-dump-675791263 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"route\":\"\",\"response_headers\":\"\\u003Cpre class=sf-dump id=sf-dump-2000826104 data-indent-pad=\\u0022  \\u0022\\u003E\\u003Cspan class=sf-dump-note\\u003Earray:3\\u003C\\/span\\u003E [\\u003Csamp data-depth=1 class=sf-dump-expanded\\u003E\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Econtent-type\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002224 characters\\u0022\\u003Etext\\/html; charset=utf-8\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Ecache-control\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002217 characters\\u0022\\u003Eno-cache, private\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n  \\u0022\\u003Cspan class=sf-dump-key\\u003Edate\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002229 characters\\u0022\\u003EMon, 05 Jan 2026 11:29:00 GMT\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n\\u003C\\/samp\\u003E]\\n\\u003C\\/pre\\u003E\\n\",\"response_cookies\":\"\\u003Cpre class=sf-dump id=sf-dump-355412417 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"session_metadata\":\"\\u003Cpre class=sf-dump id=sf-dump-192400243 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"session_attributes\":\"\\u003Cpre class=sf-dump id=sf-dump-886814494 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"flashes\":\"\\u003Cpre class=sf-dump id=sf-dump-494301180 data-indent-pad=\\u0022  \\u0022\\u003E[]\\n\\u003C\\/pre\\u003E\\n\",\"path_info\":\"\\/docs\",\"controller\":\"n\\/a\",\"locale\":\"en\"},\"tooltip\":{\"status\":\"200 OK\",\"full_url\":\"http:\\/\\/localhost\\/docs\",\"action_name\":null,\"controller_action\":\"Closure\"},\"badge\":null},\"exceptions\":{\"count\":1,\"exceptions\":[{\"type\":\"RuntimeException\",\"message\":\"Whoops! This is just a demo\",\"code\":0,\"file\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"line\":56,\"stack_trace\":null,\"stack_trace_html\":\"\\u003Cpre class=sf-dump id=sf-dump-380364022 data-indent-pad=\\u0022  \\u0022\\u003E\\u003Cspan class=sf-dump-note\\u003Earray:48\\u003C\\/span\\u003E [\\u003Csamp data-depth=1 class=sf-dump-expanded\\u003E\\n  \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022105 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E39\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002276 characters\\u0022\\u003E{closure:Barryvdh\\\\Debugbar\\\\Tests\\\\DebugbarDocsTest::testItInjectsOnDocs():42}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002240 characters\\u0022\\u003EBarryvdh\\\\Debugbar\\\\Tests\\\\DebugbarDocsTest\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002292 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E243\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00228 characters\\u0022\\u003Edispatch\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002237 characters\\u0022\\u003EIlluminate\\\\Routing\\\\CallableDispatcher\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002233 characters\\u0022\\u003E[object Illuminate\\\\Routing\\\\Route]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E2\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002292 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E214\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002211 characters\\u0022\\u003ErunCallable\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002224 characters\\u0022\\u003EIlluminate\\\\Routing\\\\Route\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E3\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002293 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Router.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E822\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002224 characters\\u0022\\u003EIlluminate\\\\Routing\\\\Route\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E4\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E180\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002262 characters\\u0022\\u003E{closure:Illuminate\\\\Routing\\\\Router::runRouteWithinStack():821}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002225 characters\\u0022\\u003EIlluminate\\\\Routing\\\\Router\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E5\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E137\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002264 characters\\u0022\\u003E{closure:Illuminate\\\\Pipeline\\\\Pipeline::prepareDestination():178}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E6\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002293 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Router.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E821\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00224 characters\\u0022\\u003Ethen\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E7\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002293 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Router.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E800\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002219 characters\\u0022\\u003ErunRouteWithinStack\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002225 characters\\u0022\\u003EIlluminate\\\\Routing\\\\Router\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002233 characters\\u0022\\u003E[object Illuminate\\\\Routing\\\\Route]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E8\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002293 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Router.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E764\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00228 characters\\u0022\\u003ErunRoute\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002225 characters\\u0022\\u003EIlluminate\\\\Routing\\\\Router\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002233 characters\\u0022\\u003E[object Illuminate\\\\Routing\\\\Route]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E9\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002293 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Router.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E753\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002215 characters\\u0022\\u003EdispatchToRoute\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002225 characters\\u0022\\u003EIlluminate\\\\Routing\\\\Router\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E10\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022101 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Kernel.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E200\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00228 characters\\u0022\\u003Edispatch\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002225 characters\\u0022\\u003EIlluminate\\\\Routing\\\\Router\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E11\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E180\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002267 characters\\u0022\\u003E{closure:Illuminate\\\\Foundation\\\\Http\\\\Kernel::dispatchToRouter():197}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002233 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Kernel\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E12\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002268 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/src\\/Middleware\\/InjectDebugbar.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E64\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002264 characters\\u0022\\u003E{closure:Illuminate\\\\Pipeline\\\\Pipeline::prepareDestination():178}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E13\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002243 characters\\u0022\\u003EBarryvdh\\\\Debugbar\\\\Middleware\\\\InjectDebugbar\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E14\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022123 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Middleware\\/TransformsRequest.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E21\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E15\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022131 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Middleware\\/ConvertEmptyStringsToNull.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E31\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002255 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Middleware\\\\TransformsRequest\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E16\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002263 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Middleware\\\\ConvertEmptyStringsToNull\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E17\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022123 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Middleware\\/TransformsRequest.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E21\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E18\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022117 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Middleware\\/TrimStrings.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E51\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002255 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Middleware\\\\TransformsRequest\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E19\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002249 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Middleware\\\\TrimStrings\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E20\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022111 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Http\\/Middleware\\/ValidatePostSize.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E27\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E21\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002243 characters\\u0022\\u003EIlluminate\\\\Http\\\\Middleware\\\\ValidatePostSize\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E22\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022138 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Middleware\\/PreventRequestsDuringMaintenance.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E109\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E23\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002270 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Middleware\\\\PreventRequestsDuringMaintenance\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E24\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022105 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Http\\/Middleware\\/HandleCors.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E48\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E25\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002237 characters\\u0022\\u003EIlluminate\\\\Http\\\\Middleware\\\\HandleCors\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E26\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022107 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Http\\/Middleware\\/TrustProxies.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E58\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E27\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002239 characters\\u0022\\u003EIlluminate\\\\Http\\\\Middleware\\\\TrustProxies\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E28\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022129 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Middleware\\/InvokeDeferredCallbacks.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E22\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E29\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002261 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Middleware\\\\InvokeDeferredCallbacks\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E30\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022115 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Http\\/Middleware\\/ValidatePathEncoding.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E26\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E31\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E219\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002247 characters\\u0022\\u003EIlluminate\\\\Http\\\\Middleware\\\\ValidatePathEncoding\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E32\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002296 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Pipeline\\/Pipeline.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E137\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003E{closure:{closure:Illuminate\\\\Pipeline\\\\Pipeline::carry():194}:195}\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E33\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022101 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Kernel.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E175\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00224 characters\\u0022\\u003Ethen\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EIlluminate\\\\Pipeline\\\\Pipeline\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002216 characters\\u0022\\u003E[object Closure]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E34\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022101 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Http\\/Kernel.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E144\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002224 characters\\u0022\\u003EsendRequestThroughRouter\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002233 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Kernel\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E35\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u0022124 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Foundation\\/Testing\\/Concerns\\/MakesHttpRequests.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E607\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00226 characters\\u0022\\u003Ehandle\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002233 characters\\u0022\\u003EIlluminate\\\\Foundation\\\\Http\\\\Kernel\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002232 characters\\u0022\\u003E[object Illuminate\\\\Http\\\\Request]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E36\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002261 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E61\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00224 characters\\u0022\\u003Ecall\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EOrchestra\\\\Testbench\\\\TestCase\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003EGET\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00224 characters\\u0022\\u003Edocs\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E37\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002284 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestCase.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E1657\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002219 characters\\u0022\\u003EtestItInjectsOnDocs\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002240 characters\\u0022\\u003EBarryvdh\\\\Debugbar\\\\Tests\\\\DebugbarDocsTest\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E38\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002284 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestCase.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E515\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00227 characters\\u0022\\u003ErunTest\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002226 characters\\u0022\\u003EPHPUnit\\\\Framework\\\\TestCase\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E39\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002297 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestRunner\\/TestRunner.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E87\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00227 characters\\u0022\\u003ErunBare\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002226 characters\\u0022\\u003EPHPUnit\\\\Framework\\\\TestCase\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E40\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002284 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestCase.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E361\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003EPHPUnit\\\\Framework\\\\TestRunner\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002249 characters\\u0022\\u003E[object Barryvdh\\\\Debugbar\\\\Tests\\\\DebugbarDocsTest]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E41\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002285 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestSuite.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E369\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002226 characters\\u0022\\u003EPHPUnit\\\\Framework\\\\TestCase\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E42\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002285 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestSuite.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E369\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002227 characters\\u0022\\u003EPHPUnit\\\\Framework\\\\TestSuite\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E43\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002285 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/Framework\\/TestSuite.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E369\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002227 characters\\u0022\\u003EPHPUnit\\\\Framework\\\\TestSuite\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E44\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002283 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/TextUI\\/TestRunner.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E64\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002227 characters\\u0022\\u003EPHPUnit\\\\Framework\\\\TestSuite\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E []\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E45\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002284 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/src\\/TextUI\\/Application.php\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E211\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002225 characters\\u0022\\u003EPHPUnit\\\\TextUI\\\\TestRunner\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:3\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002251 characters\\u0022\\u003E[object PHPUnit\\\\TextUI\\\\Configuration\\\\Configuration]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002254 characters\\u0022\\u003E[object PHPUnit\\\\Runner\\\\ResultCache\\\\DefaultResultCache]\\u003C\\/span\\u003E\\u0022\\n      \\u003Cspan class=sf-dump-index\\u003E2\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002236 characters\\u0022\\u003E[object PHPUnit\\\\Framework\\\\TestSuite]\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E46\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:6\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002265 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/phpunit\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E104\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00223 characters\\u0022\\u003Erun\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eclass\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002226 characters\\u0022\\u003EPHPUnit\\\\TextUI\\\\Application\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Etype\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00222 characters\\u0022\\u003E-\\u0026gt;\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:2\\u003C\\/span\\u003E [\\u003Csamp data-depth=4 class=sf-dump-compact\\u003E\\n        \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002218 characters\\u0022\\u003Evendor\\/bin\\/phpunit\\u003C\\/span\\u003E\\u0022\\n        \\u003Cspan class=sf-dump-index\\u003E1\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002228 characters\\u0022\\u003E--filter=testItInjectsOnDocs\\u003C\\/span\\u003E\\u0022\\n      \\u003C\\/samp\\u003E]\\n    \\u003C\\/samp\\u003E]\\n  \\u003C\\/samp\\u003E]\\n  \\u003Cspan class=sf-dump-index\\u003E47\\u003C\\/span\\u003E =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:4\\u003C\\/span\\u003E [\\u003Csamp data-depth=2 class=sf-dump-compact\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efile\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002253 characters\\u0022\\u003EUsers\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/bin\\/phpunit\\u003C\\/span\\u003E\\u0022\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eline\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-num\\u003E122\\u003C\\/span\\u003E\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Eargs\\u003C\\/span\\u003E\\u0022 =\\u003E \\u003Cspan class=sf-dump-note\\u003Earray:1\\u003C\\/span\\u003E [\\u003Csamp data-depth=3 class=sf-dump-compact\\u003E\\n      \\u003Cspan class=sf-dump-index\\u003E0\\u003C\\/span\\u003E =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u002266 characters\\u0022\\u003E\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/phpunit\\/phpunit\\/phpunit\\u003C\\/span\\u003E\\u0022\\n    \\u003C\\/samp\\u003E]\\n    \\u0022\\u003Cspan class=sf-dump-key\\u003Efunction\\u003C\\/span\\u003E\\u0022 =\\u003E \\u0022\\u003Cspan class=sf-dump-str title=\\u00227 characters\\u0022\\u003Einclude\\u003C\\/span\\u003E\\u0022\\n  \\u003C\\/samp\\u003E]\\n\\u003C\\/samp\\u003E]\\n\\u003C\\/pre\\u003E\\n\",\"surrounding_lines\":[\"\\n\",\"            view(\\u0027dashboard\\u0027)-\\u003Erender();\\n\",\"\\n\",\"            debugbar()-\\u003EaddException(new \\\\RuntimeException(\\u0027Whoops! This is just a demo\\u0027));\\n\",\"\\n\",\"            return \\u0027\\u0027;\\n\",\"        });\\n\"],\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Ftests%2FDebugbarDocsTest.php\\u0026line=56\",\"ajax\":false,\"filename\":\"DebugbarDocsTest.php\",\"line\":\"56\"}}]},\"messages\":{\"count\":3,\"messages\":[{\"message\":\"Hello Artisans!\",\"message_html\":null,\"is_string\":true,\"label\":\"info\",\"time\":1767612539.965298,\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FLaravelDebugbar.php\\u0026line=750\",\"ajax\":false,\"filename\":\"LaravelDebugbar.php\",\"line\":\"750\"}},{\"message\":\"Watch out for ..\",\"message_html\":null,\"is_string\":true,\"label\":\"warning\",\"time\":1767612539.965309,\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FLaravelDebugbar.php\\u0026line=750\",\"ajax\":false,\"filename\":\"LaravelDebugbar.php\",\"line\":\"750\"}},{\"message\":\"Bugs!\",\"message_html\":null,\"is_string\":true,\"label\":\"error\",\"time\":1767612539.965314,\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FLaravelDebugbar.php\\u0026line=750\",\"ajax\":false,\"filename\":\"LaravelDebugbar.php\",\"line\":\"750\"}}]},\"time\":{\"count\":6,\"start\":1767612539.928373,\"end\":1767612540.059387,\"duration\":0.1310138702392578,\"duration_str\":\"131ms\",\"measures\":[{\"label\":\"Booting\",\"start\":1767612539.928373,\"relative_start\":0,\"end\":1767612539.955157,\"relative_end\":1767612539.955157,\"duration\":0.02678394317626953,\"duration_str\":\"26.78ms\",\"memory\":0,\"memory_str\":\"0B\",\"params\":[],\"collector\":\"time\",\"group\":null},{\"label\":\"Application\",\"start\":1767612539.955161,\"relative_start\":0.026787996292114258,\"end\":1767612540.059388,\"relative_end\":9.5367431640625e-7,\"duration\":0.10422682762145996,\"duration_str\":\"104ms\",\"memory\":0,\"memory_str\":\"0B\",\"params\":[],\"collector\":\"time\",\"group\":null},{\"label\":\"Routing\",\"start\":1767612539.961987,\"relative_start\":0.03361392021179199,\"end\":1767612539.964743,\"relative_end\":1767612539.964743,\"duration\":0.002755880355834961,\"duration_str\":\"2.76ms\",\"memory\":0,\"memory_str\":\"0B\",\"params\":[],\"collector\":null,\"group\":null},{\"label\":\"View: dashboard\",\"start\":1767612540.046816,\"relative_start\":0.11844301223754883,\"end\":1767612540.046816,\"relative_end\":1767612540.046816,\"duration\":0,\"duration_str\":\"0\\u03bcs\",\"memory\":0,\"memory_str\":\"0B\",\"params\":[],\"collector\":\"views\",\"group\":\"View\"},{\"label\":\"Preparing Response\",\"start\":1767612540.048171,\"relative_start\":0.11979794502258301,\"end\":1767612540.050144,\"relative_end\":1767612540.050144,\"duration\":0.0019729137420654297,\"duration_str\":\"1.97ms\",\"memory\":0,\"memory_str\":\"0B\",\"params\":[],\"collector\":null,\"group\":null},{\"label\":\"Preparing Response\",\"start\":1767612540.050161,\"relative_start\":0.12178778648376465,\"end\":1767612540.05017,\"relative_end\":1767612540.05017,\"duration\":9.059906005859375e-6,\"duration_str\":\"9\\u03bcs\",\"memory\":0,\"memory_str\":\"0B\",\"params\":[],\"collector\":null,\"group\":null}]},\"memory\":{\"peak_usage\":39229400,\"peak_usage_str\":\"37MB\"},\"laravel\":{\"version\":\"12.x\",\"tooltip\":{\"Laravel Version\":\"12.44.0\",\"PHP Version\":\"8.4.16\",\"Environment\":\"testing\",\"Debug Mode\":\"Disabled\",\"URL\":\"localhost\",\"Timezone\":\"UTC\",\"Locale\":\"en\"}},\"views\":{\"count\":1,\"nb_templates\":1,\"templates\":[{\"name\":\"dashboard\",\"param_count\":null,\"params\":[],\"start\":1767612540.046809,\"type\":\"blade\",\"hash\":\"blade\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/resources\\/views\\/dashboard.blade.phpdashboard\",\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Ftests%2Fresources%2Fviews%2Fdashboard.blade.php\\u0026line=1\",\"ajax\":false,\"filename\":\"dashboard.blade.php\",\"line\":\"?\"}}]},\"queries\":{\"count\":6,\"nb_statements\":6,\"nb_visible_statements\":6,\"nb_excluded_statements\":0,\"nb_failed_statements\":0,\"accumulated_duration\":0.00015999999999999999,\"accumulated_duration_str\":\"160\\u03bcs\",\"memory_usage\":0,\"memory_usage_str\":null,\"statements\":[{\"sql\":\"insert into \\u0022users\\u0022 (\\u0022email\\u0022, \\u0022name\\u0022, \\u0022password\\u0022, \\u0022updated_at\\u0022, \\u0022created_at\\u0022) values (\\u0027demo@example.com\\u0027, \\u0027Barry\\u0027, \\u0027$2y$10$HgV.nOZIbds2jgbDzRoU6epRKgmpqulQzvGGcUnzPINJuwItC.OB.\\u0027, \\u00272026-01-05 11:29:00\\u0027, \\u00272026-01-05 11:29:00\\u0027)\",\"type\":\"query\",\"params\":[\"demo@example.com\",\"Barry\",\"$2y$10$HgV.nOZIbds2jgbDzRoU6epRKgmpqulQzvGGcUnzPINJuwItC.OB.\",\"2026-01-05 11:29:00\",\"2026-01-05 11:29:00\"],\"backtrace\":[{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},{\"index\":1,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"line\":72},{\"index\":22,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"line\":47},{\"index\":23,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"line\":39},{\"index\":24,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"line\":243}],\"start\":1767612540.034175,\"duration\":4.0e-5,\"duration_str\":\"40\\u03bcs\",\"slow\":false,\"memory\":0,\"memory_str\":null,\"filename\":\"QueryCollector.php:157\",\"source\":{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FDataCollector%2FQueryCollector.php\\u0026line=157\",\"ajax\":false,\"filename\":\"QueryCollector.php\",\"line\":\"157\"},\"connection\":\":memory:\",\"explain\":null,\"start_percent\":0,\"width_percent\":25},{\"sql\":\"select count(*) as aggregate from \\u0022users\\u0022\",\"type\":\"query\",\"params\":[],\"backtrace\":[{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},{\"index\":1,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"line\":72},{\"index\":19,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"line\":48},{\"index\":20,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"line\":39},{\"index\":21,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"line\":243}],\"start\":1767612540.035651,\"duration\":2.9999999999999997e-5,\"duration_str\":\"30\\u03bcs\",\"slow\":false,\"memory\":0,\"memory_str\":null,\"filename\":\"QueryCollector.php:157\",\"source\":{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FDataCollector%2FQueryCollector.php\\u0026line=157\",\"ajax\":false,\"filename\":\"QueryCollector.php\",\"line\":\"157\"},\"connection\":\":memory:\",\"explain\":null,\"start_percent\":25,\"width_percent\":18.75},{\"sql\":\"select * from \\u0022users\\u0022 where \\u0022name\\u0022 = \\u0027Barry\\u0027 limit 1\",\"type\":\"query\",\"params\":[\"Barry\"],\"backtrace\":[{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},{\"index\":1,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"line\":72},{\"index\":16,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"line\":49},{\"index\":17,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"line\":39},{\"index\":18,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"line\":243}],\"start\":1767612540.0358748,\"duration\":2.9999999999999997e-5,\"duration_str\":\"30\\u03bcs\",\"slow\":false,\"memory\":0,\"memory_str\":null,\"filename\":\"QueryCollector.php:157\",\"source\":{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FDataCollector%2FQueryCollector.php\\u0026line=157\",\"ajax\":false,\"filename\":\"QueryCollector.php\",\"line\":\"157\"},\"connection\":\":memory:\",\"explain\":null,\"start_percent\":43.75,\"width_percent\":18.75},{\"sql\":\"select * from \\u0022users\\u0022 where \\u0022id\\u0022 = 1\",\"type\":\"query\",\"params\":[1],\"backtrace\":[{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},{\"index\":1,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"line\":72},{\"index\":15,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"line\":50},{\"index\":16,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"line\":39},{\"index\":17,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"line\":243}],\"start\":1767612540.03718,\"duration\":2.0e-5,\"duration_str\":\"20\\u03bcs\",\"slow\":false,\"memory\":0,\"memory_str\":null,\"filename\":\"QueryCollector.php:157\",\"source\":{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FDataCollector%2FQueryCollector.php\\u0026line=157\",\"ajax\":false,\"filename\":\"QueryCollector.php\",\"line\":\"157\"},\"connection\":\":memory:\",\"explain\":null,\"start_percent\":62.5,\"width_percent\":12.5},{\"sql\":\"select * from \\u0022users\\u0022 where \\u0022id\\u0022 = 1\",\"type\":\"query\",\"params\":[1],\"backtrace\":[{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},{\"index\":1,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"line\":72},{\"index\":15,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"line\":51},{\"index\":16,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"line\":39},{\"index\":17,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"line\":243}],\"start\":1767612540.037452,\"duration\":2.9999999999999997e-5,\"duration_str\":\"30\\u03bcs\",\"slow\":false,\"memory\":0,\"memory_str\":null,\"filename\":\"QueryCollector.php:157\",\"source\":{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FDataCollector%2FQueryCollector.php\\u0026line=157\",\"ajax\":false,\"filename\":\"QueryCollector.php\",\"line\":\"157\"},\"connection\":\":memory:\",\"explain\":null,\"start_percent\":75,\"width_percent\":18.75},{\"sql\":\"select * from \\u0022users\\u0022 where \\u0022id\\u0022 = 1\",\"type\":\"query\",\"params\":[1],\"backtrace\":[{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},{\"index\":1,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/CollectorProviders\\/DatabaseCollectorProvider.php\",\"line\":72},{\"index\":15,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/tests\\/DebugbarDocsTest.php\",\"line\":52},{\"index\":16,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/CallableDispatcher.php\",\"line\":39},{\"index\":17,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/vendor\\/laravel\\/framework\\/src\\/Illuminate\\/Routing\\/Route.php\",\"line\":243}],\"start\":1767612540.0376549,\"duration\":1.0e-5,\"duration_str\":\"10\\u03bcs\",\"slow\":false,\"memory\":0,\"memory_str\":null,\"filename\":\"QueryCollector.php:157\",\"source\":{\"index\":0,\"namespace\":null,\"name\":\"Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"file\":\"\\/Users\\/barry\\/Sites\\/laravel-debugbar\\/src\\/DataCollector\\/QueryCollector.php\",\"line\":157},\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Fsrc%2FDataCollector%2FQueryCollector.php\\u0026line=157\",\"ajax\":false,\"filename\":\"QueryCollector.php\",\"line\":\"157\"},\"connection\":\":memory:\",\"explain\":null,\"start_percent\":93.75,\"width_percent\":6.25}]},\"models\":{\"data\":{\"Barryvdh\\\\Debugbar\\\\Tests\\\\Models\\\\User\":{\"created\":1,\"retrieved\":4,\"xdebug_link\":{\"url\":\"phpstorm:\\/\\/open?file=%2FUsers%2Fbarry%2FSites%2Flaravel-debugbar%2Ftests%2FModels%2FUser.php\\u0026line=1\",\"ajax\":false,\"filename\":\"User.php\",\"line\":\"?\"}}},\"count\":5,\"key_map\":{\"retrieved\":\"Retrieved\",\"created\":\"Created\",\"updated\":\"Updated\",\"deleted\":\"Deleted\"},\"is_counter\":true,\"badges\":{\"created\":1,\"retrieved\":4}},\"symfonymailer_mails\":{\"count\":0,\"mails\":[]},\"gate\":{\"count\":0,\"messages\":[]},\"cache\":{\"count\":0,\"start\":1767612539.928373,\"end\":1767612540.059841,\"duration\":0.1314678192138672,\"duration_str\":\"131ms\",\"measures\":[],\"nb_measures\":0},\"jobs\":{\"data\":[],\"count\":0,\"key_map\":{\"value\":\"Count\"},\"is_counter\":true}}, \"01KE6YNS1G737D5PGHMQJVZKKE\", \"\", true);\n\n</script>\n\n<!-- End Debugbar -->\n\n    {% endblock %}\n"
  },
  {
    "path": "docs/overrides/shortcodes.py",
    "content": "# Copyright (c) 2016-2024 Martin Donath <martin.donath@squidfunk.com>\n# Copy from https://github.com/squidfunk/mkdocs-material/blob/master/src/overrides/hooks/shortcodes.py\n\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n# IN THE SOFTWARE.\n\nfrom __future__ import annotations\n\nimport posixpath\nimport re\n\nfrom mkdocs.config.defaults import MkDocsConfig\nfrom mkdocs.structure.files import File, Files\nfrom mkdocs.structure.pages import Page\nfrom re import Match\n\n# -----------------------------------------------------------------------------\n# Hooks\n# -----------------------------------------------------------------------------\n\n# @todo\ndef on_page_markdown(\n    markdown: str, *, page: Page, config: MkDocsConfig, files: Files\n):\n\n    # Replace callback\n    def replace(match: Match):\n        type, args = match.groups()\n        args = args.strip()\n        if type == \"version\":\n            if args.startswith(\"insiders-\"):\n                return _badge_for_version_insiders(args, page, files)\n            else:\n                return _badge_for_version(args, page, files)\n        elif type == \"sponsors\":     return _badge_for_sponsors(page, files)\n        elif type == \"flag\":         return flag(args, page, files)\n        elif type == \"option\":       return option(args)\n        elif type == \"setting\":      return setting(args)\n        elif type == \"feature\":      return _badge_for_feature(args, page, files)\n        elif type == \"plugin\":       return _badge_for_plugin(args, page, files)\n        elif type == \"extension\":    return _badge_for_extension(args, page, files)\n        elif type == \"utility\":      return _badge_for_utility(args, page, files)\n        elif type == \"example\":      return _badge_for_example(args, page, files)\n        elif type == \"default\":\n            if   args == \"none\":     return _badge_for_default_none(page, files)\n            elif args == \"computed\": return _badge_for_default_computed(page, files)\n            else:                    return _badge_for_default(args, page, files)\n\n        # Otherwise, raise an error\n        raise RuntimeError(f\"Unknown shortcode: {type}\")\n\n    # Find and replace all external asset URLs in current page\n    return re.sub(\n        r\"<!-- md:(\\w+)(.*?) -->\",\n        replace, markdown, flags = re.I | re.M\n    )\n\n# -----------------------------------------------------------------------------\n# Helper functions\n# -----------------------------------------------------------------------------\n\n# Create a flag of a specific type\ndef flag(args: str, page: Page, files: Files):\n    type, *_ = args.split(\" \", 1)\n    if   type == \"experimental\":  return _badge_for_experimental(page, files)\n    elif type == \"required\":      return _badge_for_required(page, files)\n    elif type == \"customization\": return _badge_for_customization(page, files)\n    elif type == \"metadata\":      return _badge_for_metadata(page, files)\n    elif type == \"multiple\":      return _badge_for_multiple(page, files)\n    raise RuntimeError(f\"Unknown type: {type}\")\n\n# Create a linkable option\ndef option(type: str):\n    _, *_, name = re.split(r\"[.:]\", type)\n    return f\"[`{name}`](#+{type}){{ #+{type} }}\\n\\n\"\n\n# Create a linkable setting - @todo append them to the bottom of the page\ndef setting(type: str):\n    _, *_, name = re.split(r\"[.*]\", type)\n    return f\"`{name}` {{ #{type} }}\\n\\n[{type}]: #{type}\\n\\n\"\n\n# -----------------------------------------------------------------------------\n\n# Resolve path of file relative to given page - the posixpath always includes\n# one additional level of `..` which we need to remove\ndef _resolve_path(path: str, page: Page, files: Files):\n    path, anchor, *_ = f\"{path}#\".split(\"#\")\n    path = _resolve(files.get_file_from_path(path), page)\n    return \"#\".join([path, anchor]) if anchor else path\n\n# Resolve path of file relative to given page - the posixpath always includes\n# one additional level of `..` which we need to remove\ndef _resolve(file: File, page: Page):\n    path = posixpath.relpath(file.src_uri, page.file.src_uri)\n    return posixpath.sep.join(path.split(posixpath.sep)[1:])\n\n# -----------------------------------------------------------------------------\n\n# Create badge\ndef _badge(icon: str, text: str = \"\", type: str = \"\"):\n    classes = f\"mdx-badge mdx-badge--{type}\" if type else \"mdx-badge\"\n    return \"\".join([\n        f\"<span class=\\\"{classes}\\\">\",\n        *([f\"<span class=\\\"mdx-badge__icon\\\">{icon}</span>\"] if icon else []),\n        *([f\"<span class=\\\"mdx-badge__text\\\">{text}</span>\"] if text else []),\n        f\"</span>\",\n    ])\n\n# Create sponsors badge\ndef _badge_for_sponsors(page: Page, files: Files):\n    icon = \"material-heart\"\n    href = _resolve_path(\"features.md\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Sponsors only')\",\n        type = \"heart\"\n    )\n\n# Create badge for version\ndef _badge_for_version(text: str, page: Page, files: Files):\n    spec = text\n    path = f\"https://github.com/fruitcake/laravel-debugbar/releases/tag/{spec}\"\n\n    # Return badge\n    icon = \"material-tag-outline\"\n    href = f\"{path}\"\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Minimum version')\",\n        text = f\"[{text}]({path})\" if spec else \"\"\n    )\n\n# Create badge for feature\ndef _badge_for_feature(text: str, page: Page, files: Files):\n    icon = \"material-toggle-switch\"\n    href = _resolve_path(\"features.md#config\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Configurable feature')\",\n        text = text\n    )\n\n# Create badge for plugin\ndef _badge_for_plugin(text: str, page: Page, files: Files):\n    icon = \"material-floppy\"\n    href = _resolve_path(\"features.md#plugin\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Plugin')\",\n        text = text\n    )\n\n# Create badge for extension\ndef _badge_for_extension(text: str, page: Page, files: Files):\n    icon = \"material-language-markdown\"\n    href = _resolve_path(\"features.md#extension\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Markdown extension')\",\n        text = text\n    )\n\n# Create badge for utility\ndef _badge_for_utility(text: str, page: Page, files: Files):\n    icon = \"material-package-variant\"\n    href = _resolve_path(\"features.md#utility\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Third-party utility')\",\n        text = text\n    )\n\n# Create badge for example\ndef _badge_for_example(text: str, page: Page, files: Files):\n    return \"\\n\".join([\n        _badge_for_example_download(text, page, files),\n        _badge_for_example_view(text, page, files)\n    ])\n\n# Create badge for example view\ndef _badge_for_example_view(text: str, page: Page, files: Files):\n    icon = \"material-folder-eye\"\n    href = f\"https://mkdocs-material.github.io/examples/{text}/\"\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'View example')\",\n        type = \"right\"\n    )\n\n# Create badge for example download\ndef _badge_for_example_download(text: str, page: Page, files: Files):\n    icon = \"material-folder-download\"\n    href = f\"https://mkdocs-material.github.io/examples/{text}.zip\"\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Download example')\",\n        text = f\"[`.zip`]({href})\",\n        type = \"right\"\n    )\n\n# Create badge for default value\ndef _badge_for_default(text: str, page: Page, files: Files):\n    icon = \"material-water\"\n    href = _resolve_path(\"features.md#config\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Default value')\",\n        text = text\n    )\n\n# Create badge for empty default value\ndef _badge_for_default_none(page: Page, files: Files):\n    icon = \"material-water-outline\"\n    href = _resolve_path(\"features.md#config\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Default value is empty')\"\n    )\n\n# Create badge for computed default value\ndef _badge_for_default_computed(page: Page, files: Files):\n    icon = \"material-water-check\"\n    href = _resolve_path(\"features.md#default\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Default value is computed')\"\n    )\n\n# Create badge for metadata property flag\ndef _badge_for_metadata(page: Page, files: Files):\n    icon = \"material-list-box-outline\"\n    href = _resolve_path(\"features.md#metadata\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Metadata property')\"\n    )\n\n# Create badge for required value flag\ndef _badge_for_required(page: Page, files: Files):\n    icon = \"material-alert\"\n    href = _resolve_path(\"features.md#required\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Required value')\"\n    )\n\n# Create badge for customization flag\ndef _badge_for_customization(page: Page, files: Files):\n    icon = \"material-brush-variant\"\n    href = _resolve_path(\"features.md#custom\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Customization')\"\n    )\n\n# Create badge for multiple instance flag\ndef _badge_for_multiple(page: Page, files: Files):\n    icon = \"material-inbox-multiple\"\n    href = _resolve_path(\"features.md#multiple\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Multiple instances')\"\n    )\n\n# Create badge for experimental flag\ndef _badge_for_experimental(page: Page, files: Files):\n    icon = \"material-flask-outline\"\n    href = _resolve_path(\"features.md#experimental\", page, files)\n    return _badge(\n        icon = f\"[:{icon}:]({href} 'Experimental')\"\n    )\n"
  },
  {
    "path": "docs/usage.md",
    "content": "---\ndescription: Using Laravel Debugbar is simple. After installing, just enable Debug mode and you should be good. Read further for more options.\npreview_image: img/preview-usage.jpg\n---\n\n# Usage\n\n## Using the Debugbar\n\nWhen the Debugbar is enabled, the Debugbar is shown on the bottom of the screen, similar to the documentation preview.\n\nBased on your configuration, it shows the [Collectors](collectors.md) for the current request. You can open, close, restore or minimize the toolbar for your need. The state will be remembered.\n\n![Usage](img/debugbar.gif)\n\n## Debugbar Facade\nYou can now add messages using the Facade (when added), using the PSR-3 levels (debug, info, notice, warning, error, critical, alert, emergency):\n\n```php\nDebugbar::info($object);\nDebugbar::error('Error!');\nDebugbar::warning('Watch out…');\nDebugbar::addMessage('Another message', 'mylabel');\n```\n\nAnd start/stop timing:\n\n```php\nDebugbar::startMeasure('render','Time for rendering');\nDebugbar::stopMeasure('render');\nDebugbar::addMeasure('now', LARAVEL_START, microtime(true));\nDebugbar::measure('My long operation', function() {\n    // Do something…\n});\n```\n\nOr log exceptions:\n\n```php\ntry {\n    throw new Exception('foobar');\n} catch (Exception $e) {\n    Debugbar::addThrowable($e);\n}\n```\n\n## Helpers\n\nThere are also helper functions available for the most common calls:\n\n```php\n// All arguments will be dumped as a debug message\ndebug($var1, $someString, $intValue, $object);\n\n// `$collection->debug()` will return the collection and dump it as a debug message. Like `$collection->dump()`\ncollect([$var1, $someString])->debug();\n\nstart_measure('render','Time for rendering');\nstop_measure('render');\nadd_measure('now', LARAVEL_START, microtime(true));\nmeasure('My long operation', function() {\n    // Do something…\n});\n```\n\nIf you want you can add your own DataCollectors, through the Container or the Facade:\n\n```php\nDebugbar::addCollector(new DebugBar\\DataCollector\\MessagesCollector('my_messages'));\n//Or via the App container:\n$debugbar = App::make('debugbar');\n$debugbar->addCollector(new DebugBar\\DataCollector\\MessagesCollector('my_messages'));\n```\n\n## Collecting Queued Jobs\n\nIf you want to collect jobs, set `debugbar.collect_jobs` to `true` in the config (or `DEBUGBAR_COLLECT_JOBS` in your `.env`).\n\nUse the browse button to view the processed jobs.\n\n## Enabling/Disabling on run time\nYou can enable or disable the debugbar during run time.\n\n```php\ndebugbar()->enable();\ndebugbar()->disable();\n```\n\nNB. Once enabled, the collectors are added (and could produce extra overhead), so if you want to use the debugbar in production, disable in the config and only enable when needed.\n\n## Console\n\nWhen using Console Commands, you can log data to the Debugbar by manually enabling the debugbar. You can then view the data by browsing the Debugbar requests in the UI.\n\n```php\ndebugber()->enable();\n\n```\n\n\n\n## Storage\n\nDebugbar remembers previous requests, which you can view using the Browse button on the right. This will only work if you enable `debugbar.storage.open` in the config.\nMake sure you only do this on local development, because otherwise other people will be able to view previous requests.\nIn general, Debugbar should only be used locally or at least restricted by IP.\nIt's possible to pass a callback, which will receive the Request object, so you can determine access to the OpenHandler storage.\n\n## Twig Integration\n\nLaravel Debugbar comes with two Twig Extensions. These are tested with [rcrowe/TwigBridge](https://github.com/rcrowe/TwigBridge) 0.6.x\n\nAdd the following extensions to your TwigBridge config/extensions.php (or register the extensions manually)\n\n```php\n'Fruitcake\\LaravelDebugbar\\Twig\\Extension\\Debug',\n'Fruitcake\\LaravelDebugbar\\Twig\\Extension\\Dump',\n'Fruitcake\\LaravelDebugbar\\Twig\\Extension\\Stopwatch',\n```\n\nThe Dump extension will replace the [dump function](http://twig.sensiolabs.org/doc/functions/dump.html) to output variables using the DataFormatter. The Debug extension adds a `debug()` function which passes variables to the Message Collector,\ninstead of showing it directly in the template. It dumps the arguments, or when empty; all context variables.\n\n```twig\n{{ debug() }}\n{{ debug(user, categories) }}\n```\n\nThe Stopwatch extension adds a [stopwatch tag](http://symfony.com/blog/new-in-symfony-2-4-a-stopwatch-tag-for-twig)  similar to the one in Symfony/Silex Twigbridge.\n\n```twig\n{% stopwatch \"foo\" %}\n    …some things that gets timed\n{% endstopwatch %}\n```\n"
  },
  {
    "path": "eslint.config.js",
    "content": "import antfu from '@antfu/eslint-config';\nimport globals from 'globals';\n\nexport default antfu(\n    {\n        type: 'app',\n\n        // Disable TypeScript, Vue, etc. since this is vanilla JS\n        typescript: false,\n        vue: false,\n        react: false,\n        jsonc: false,\n        yaml: false,\n        markdown: false,\n\n        ignores: [\n            'vendor/**',\n            'tests/**',\n            'docs/**',\n            'resources/vendor/**'\n        ],\n\n        // Stylistic formatting rules\n        stylistic: {\n            indent: 4,\n            quotes: 'single',\n            semi: true\n        }\n    },\n\n    // Custom rules for the project\n    {\n        rules: {\n            // Allow console in debug library\n            'no-console': 'off',\n\n            // Allow unused vars with _ prefix or Widget suffix\n            'unused-imports/no-unused-vars': ['error', {\n                args: 'none',\n                varsIgnorePattern: '^(_|.*Widget)$',\n                caughtErrors: 'none'\n            }],\n            'no-unused-vars': ['error', {\n                args: 'none',\n                varsIgnorePattern: '^(_|.*Widget)$',\n                caughtErrors: 'none'\n            }],\n\n            // Code style\n            'style/brace-style': ['error', '1tbs'],\n            'style/comma-dangle': ['error', 'never'],\n            'style/no-mixed-operators': 'off',\n            'style/max-statements-per-line': 'off',\n\n            // Relax some rules for legacy patterns\n            'no-prototype-builtins': 'off',\n            'no-sequences': 'off',\n            'no-unused-expressions': 'off',\n            'no-use-before-define': ['error', { functions: false, classes: true, variables: true }],\n            'unicorn/no-array-for-each': 'off',\n\n            // JSDoc relaxed rules\n            'jsdoc/require-returns-description': 'off',\n            'jsdoc/check-param-names': 'off',\n\n            // Allow function expressions (for Widget.extend pattern)\n            'func-style': 'off',\n            'antfu/consistent-list-newline': 'off',\n\n            // Modern JavaScript requirements\n            'prefer-const': 'error',\n            'no-var': 'error',\n            'prefer-arrow-callback': 'warn',\n            'prefer-template': 'warn',\n            'object-shorthand': 'warn'\n        }\n    },\n\n    // Custom config for resources folder\n    {\n        files: ['resources/**/*.js'],\n        languageOptions: {\n            ecmaVersion: 2020,\n            sourceType: 'script',\n            globals: {\n                ...globals.browser,\n                PhpDebugBar: 'writable',\n                hljs: 'readonly'\n            }\n        }\n    }\n);\n"
  },
  {
    "path": "mkdocs.yml",
    "content": "site_name: Laravel Debugbar\nsite_author: Barry vd. Heuvel\nsite_description: Debugbar for Laravel\nsite_url: https://laraveldebugbar.com\nrepo_url: https://github.com/barryvdh/laravel-debugbar\nedit_uri: ./edit/docs/docs\ncopyright: Copyright &copy; Barry vd. Heuvel\n\nnav:\n  - Home: index.md\n  - Install: installation.md\n  - Usage: usage.md\n  - Features: features.md\n  - Collectors: collectors.md\n\ntheme:\n  name: material\n  custom_dir: docs/overrides\n  logo: assets/logo_white.png\n  favicon: assets/favicon.png\n  palette:\n    - primary: custom\n      accent: custom\n      scheme: slate\n  features:\n    - navigation.tabs\n    - navigation.tabs.sticky\n#    - navigation.instant\n    - navigation.tracking\n    - navigation.indexes\n    - navigation.top\n    - navigation.footer\n    - navigation.sections\n    - navigation.expand\n    - content.tooltips\n    - content.code.copy\n    - content.action.edit\n    - toc.follow\n    - toc.integrate\n    - search.highlight\n    - meta\nextra_css:\n  - assets/extra.css\n  - assets/dist/debugbar.css?v=1767612540\nextra_javascript:\n  - assets/dist/debugbar.js?v=1767612540\nmarkdown_extensions:\n  - admonition\n  - abbr\n  - attr_list\n  - pymdownx.emoji:\n      emoji_index: !!python/name:material.extensions.emoji.twemoji\n      emoji_generator: !!python/name:material.extensions.emoji.to_svg\n  - pymdownx.highlight:\n      use_pygments: true\n      anchor_linenums: true\n      line_spans: __span\n      pygments_lang_class: true\n      extend_pygments_lang:\n        - name: php\n          lang: php\n          options:\n            startinline: true\n  - pymdownx.inlinehilite\n  - pymdownx.snippets\n  - pymdownx.superfences\n  - pymdownx.details\n  - toc:\n      permalink: true\n  - pymdownx.magiclink:\n      normalize_issue_symbols: true\n      repo_url_shorthand: true\n      user: barryvdh\n      repo: laravel-debugbar\n\nextra:\n  analytics:\n    provider: google\n    property: G-KVHB3EWT91\n  social:\n    - icon: fontawesome/brands/github\n      link: https://github.com/barryvdh/laravel-debugbar\n\nhooks:\n  - docs/overrides/shortcodes.py\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"php-debugbar\",\n  \"version\": \"1.0.0\",\n  \"description\": \"[![Latest Stable Version](https://img.shields.io/packagist/v/php-debugbar/php-debugbar?label=Stable)](https://packagist.org/packages/php-debugbar/php-debugbar) [![Total Downloads](https://img.shields.io/packagist/dt/maximebf/debugbar?label=Downloads)](https://packagist.org/packages/php-debugbar/php-debugbar) [![License](https://img.shields.io/badge/Licence-MIT-4d9283)](https://packagist.org/packages/php-debugbar/php-debugbar) [![Tests](https://github.com/maximebf/php-debugbar/actions/workflows/run-tests.yml/badge.svg)](https://github.com/php-debugbar/php-debugbar/actions/workflows/run-tests.yml)\",\n  \"main\": \"index.js\",\n  \"directories\": {\n    \"doc\": \"docs\",\n    \"test\": \"tests\"\n  },\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"npm run build:icons\",\n    \"build:icons\": \"node build/build-icons.js\",\n    \"lint\": \"eslint resources/**/*.js\",\n    \"lint:fix\": \"eslint resources/**/*.js --fix\",\n    \"lint:report\": \"eslint resources/**/*.js --output-file eslint-report.txt --format unix\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"devDependencies\": {\n    \"@antfu/eslint-config\": \"^6.7.1\",\n    \"@eslint/js\": \"^9.39.2\",\n    \"esbuild\": \"^0.27.2\",\n    \"eslint\": \"^9.39.2\",\n    \"eslint-plugin-jquery\": \"^1.5.1\",\n    \"globals\": \"^16.5.0\"\n  },\n  \"dependencies\": {\n    \"@tabler/icons\": \"^3.36.0\"\n  }\n}\n"
  },
  {
    "path": "phpstan.neon",
    "content": "includes:\n    - vendor/phpstan/phpstan-phpunit/extension.neon\n    - vendor/phpstan/phpstan-strict-rules/rules.neon\n    - vendor/shipmonk/phpstan-rules/rules.neon\n\nparameters:\n    level: 5\n    paths:\n        - src\n    strictRules:\n        dynamicCallOnStaticMethod: false\n        booleansInConditions: false\n        disallowedShortTernary: false\n        noVariableVariables: false\n        strictArrayFilter: false\n    shipmonkRules:\n        enableAllRules: false\n        enforceNativeReturnTypehint:\n            enabled: true\n\n    tmpDir: build/phpstan\n    excludePaths:\n        - 'src/Twig'\n        - 'src/Controllers/TelescopeController.php'\n        - 'src/DataCollector/PennantCollector.php'\n"
  },
  {
    "path": "phpunit.xml.dist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit bootstrap=\"vendor/autoload.php\"\n         backupGlobals=\"false\"\n         backupStaticAttributes=\"false\"\n         colors=\"true\"\n         verbose=\"true\"\n         convertErrorsToExceptions=\"true\"\n         convertNoticesToExceptions=\"true\"\n         convertWarningsToExceptions=\"true\"\n         processIsolation=\"false\"\n         stopOnFailure=\"false\">\n    <testsuites>\n        <testsuite name=\"Laravel Debugbar Test Suite\">\n            <directory>tests</directory>\n        </testsuite>\n    </testsuites>\n    <filter>\n        <whitelist>\n            <directory suffix=\".php\">src/</directory>\n        </whitelist>\n    </filter>\n    <logging>\n        <log type=\"junit\" target=\"build/report.junit.xml\"/>\n        <log type=\"coverage-html\" target=\"build/coverage\"/>\n        <log type=\"coverage-text\" target=\"build/coverage.txt\"/>\n        <log type=\"coverage-clover\" target=\"build/logs/clover.xml\"/>\n    </logging>\n    <php>\n        <env name=\"APP_KEY\" value=\"base64:7wIIWanUEVY4708Piu6RodsiLOH1E24a9LU5vKYs0tc=\"/>\n        <env name=\"APP_ENV\" value=\"local\"/>\n        <env name=\"APP_DEBUG\" value=\"true\"/>\n        <env name=\"DB_CONNECTION\" value=\"testing\"/>\n        <ini name=\"xdebug.file_link_format\" value=\"vscode://file/%f:%l\"/>\n    </php>\n</phpunit>\n"
  },
  {
    "path": "pint.json",
    "content": "{\n    \"preset\": \"per\",\n    \"rules\": {\n        \"@autoPHPMigration\": true,\n        \"@autoPHPUnitMigration:risky\": true,\n        \"array_push\": true,\n        \"modernize_strpos\": true,\n        \"modernize_types_casting\": true,\n        \"trim_array_spaces\": true,\n        \"no_short_bool_cast\": true,\n        \"cast_spaces\": true,\n        \"no_leading_namespace_whitespace\": true,\n        \"no_unused_imports\": true,\n        \"single_space_after_construct\": true,\n        \"no_unneeded_curly_braces\": true,\n        \"no_useless_else\": true,\n        \"no_useless_return\": true,\n        \"no_extra_blank_lines\": true,\n        \"no_superfluous_phpdoc_tags\": true,\n        \"no_empty_phpdoc\": true,\n        \"phpdoc_align\": true,\n        \"phpdoc_separation\": true,\n        \"declare_strict_types\": true\n    }\n}\n"
  },
  {
    "path": "readme.md",
    "content": "## Debugbar for Laravel\n![Unit Tests](https://github.com/fruitcake/laravel-debugbar/workflows/Unit%20Tests/badge.svg)\n[![Packagist License](https://img.shields.io/badge/Licence-MIT-blue)](http://choosealicense.com/licenses/mit/)\n[![Latest Stable Version](https://img.shields.io/packagist/v/fruitcake/laravel-debugbar?label=Stable)](https://packagist.org/packages/fruitcake/laravel-debugbar)\n[![Total Downloads](https://img.shields.io/packagist/dt/barryvdh/laravel-debugbar?label=Downloads)](https://packagist.org/packages/fruitcake/laravel-debugbar)\n[![Fruitcake](https://img.shields.io/badge/Powered%20By-Fruitcake-b2bc35.svg)](https://fruitcake.nl/)\n\nThis is a package to integrate [PHP Debug Bar](https://github.com/php-debugbar/php-debugbar) with Laravel.\nIt includes a ServiceProvider to register the debugbar and attach it to the output. You can publish assets and configure it through Laravel.\nIt bootstraps some Collectors to work with Laravel and implements a couple custom DataCollectors, specific for Laravel.\nIt is configured to display Redirects and Ajax/Livewire Requests. (Shown in a dropdown)\nRead [the documentation](http://phpdebugbar.com/docs/) for more configuration options.\n\n![Debugbar Dark Mode screenshot](https://github.com/fruitcake/laravel-debugbar/assets/973269/6600837a-8b2d-4acb-ab0c-158c9ca5439c)\n\n> [!CAUTION]\n> Use the DebugBar only in development. Do not use Debugbar on publicly accessible websites, as it will leak information from stored requests (by design).\n\n> [!WARNING]\n>  It can also slow the application down (because it has to gather and render data). So when experiencing slowness, try disabling some of the collectors.\n\nThis package includes some custom collectors:\n- QueryCollector: Show all queries, including binding + timing\n- RouteCollector: Show information about the current Route.\n- ViewCollector: Show the currently loaded views. (Optionally: display the shared data)\n- EventsCollector: Show all events\n- LaravelCollector: Show the Laravel version and Environment. (disabled by default)\n- SymfonyRequestCollector: replaces the RequestCollector with more information about the request/response\n- LogsCollector: Show the latest log entries from the storage logs. (disabled by default)\n- FilesCollector: Show the files that are included/required by PHP. (disabled by default)\n- ConfigCollector: Display the values from the config files. (disabled by default)\n- CacheCollector: Display all cache events. (disabled by default)\n\nBootstraps the following collectors for Laravel:\n- LogCollector: Show all Log messages\n- SymfonyMailCollector for Mail\n\nAnd the default collectors:\n- PhpInfoCollector\n- MessagesCollector\n- TimeDataCollector (With Booting and Application timing)\n- MemoryCollector\n- ExceptionsCollector\n\nIt also provides a facade interface (`Debugbar`) for easy logging Messages, Exceptions and Time\n\n## Installation\n\nRequire this package with composer. It is recommended to only require the package for development.\n\n```shell\ncomposer require fruitcake/laravel-debugbar --dev\n```\n\n> Note: The package name has changed to `fruitcake/laravel-debugbar`. If you're using `barryvdh/laravel-debugbar`, \n> you can safely replace this with the new package name: `composer remove barryvdh/laravel-debugbar --dev --no-scripts`\n\n> Tip: Use 'composer require fruitcake/laravel-debugbar:\"^4@beta\" --dev' flag to try the new 4.x Beta version!\n\nLaravel uses Package Auto-Discovery, so doesn't require you to manually add the ServiceProvider.\n\nThe Debugbar will be enabled when `APP_DEBUG` is `true` and when the environment is not `production` or `testing`.\n\nYou can disable it in the config (`debugbar.enabled`) or by setting `DEBUGBAR_ENABLED` in your `.env`. See more options in `config/debugbar.php`\nYou can also set in your config if you want to include/exclude the vendor files also (FontAwesome, Highlight.js and jQuery). If you already use them in your site, set it to false.\nYou can also only display the js or css vendors, by setting it to 'js' or 'css'. (Highlight.js requires both css + js, so set to `true` for syntax highlighting)\n\n#### Copy the package config to your local config with the publish command:\n\n```shell\nphp artisan vendor:publish --provider='Fruitcake\\LaravelDebugbar\\ServiceProvider'\n```\n\n### Laravel with Octane:\n\nLaravel Debugbar 4.x works out of the box with Octane. No need to add anything to your config.\n\nIf you're upgrading from Laravel Debugbar 3.x, remove the 'flush' config for Debugbar in `config/octane.php`.\n\n## Usage\n\nYou can now add messages using the Facade (when added), using the PSR-3 levels (debug, info, notice, warning, error, critical, alert, emergency):\n\n```php\nDebugbar::info($object);\nDebugbar::error('Error!');\nDebugbar::warning('Watch out…');\nDebugbar::addMessage('Another message', 'mylabel');\n```\n\nAnd start/stop timing:\n\n```php\nDebugbar::startMeasure('render','Time for rendering');\nDebugbar::stopMeasure('render');\nDebugbar::addMeasure('now', LARAVEL_START, microtime(true));\nDebugbar::measure('My long operation', function() {\n    // Do something…\n});\n```\n\nOr log exceptions:\n\n```php\ntry {\n    throw new Exception('foobar');\n} catch (Exception $e) {\n    Debugbar::addThrowable($e);\n}\n```\n\nThere are also helper functions available for the most common calls:\n\n```php\n// All arguments will be dumped as a debug message\ndebug($var1, $someString, $intValue, $object);\n\n// `$collection->debug()` will return the collection and dump it as a debug message. Like `$collection->dump()`\ncollect([$var1, $someString])->debug();\n\nstart_measure('render','Time for rendering');\nstop_measure('render');\nadd_measure('now', LARAVEL_START, microtime(true));\nmeasure('My long operation', function() {\n    // Do something…\n});\n```\n\nIf you want you can add your own DataCollectors, through the Container or the Facade:\n\n```php\nDebugbar::addCollector(new DebugBar\\DataCollector\\MessagesCollector('my_messages'));\n//Or via the App container:\n$debugbar = App::make('debugbar');\n$debugbar->addCollector(new DebugBar\\DataCollector\\MessagesCollector('my_messages'));\n```\n\nBy default, the Debugbar is injected just before `</body>`. If you want to inject the Debugbar yourself,\nset the config option 'inject' to false and use the renderer yourself and follow http://phpdebugbar.com/docs/rendering.html\n\n```php\n$renderer = Debugbar::getJavascriptRenderer();\n```\n\nNote: Not using the auto-inject, will disable the Request information, because that is added After the response.\nYou can add the default_request datacollector in the config as alternative.\n\n## Enabling/Disabling on run time\nYou can enable or disable the debugbar during run time.\n\n```php\n\\Debugbar::enable();\n\\Debugbar::disable();\n```\n\nNB. Once enabled, the collectors are added (and could produce extra overhead), so if you want to use the debugbar in production, disable in the config and only enable when needed.\n\n## Storage\n\nDebugbar remembers previous requests, which you can view using the Browse button on the right. This will only work if you enable `debugbar.storage.open` in the config.\nMake sure you only do this on local development, because otherwise other people will be able to view previous requests.\nIn general, Debugbar should only be used locally or at least restricted by IP.\nIt's possible to pass a callback, which will receive the Request object, so you can determine access to the OpenHandler storage.\n\n## Twig Integration\n\nLaravel Debugbar comes with two Twig Extensions. These are tested with [rcrowe/TwigBridge](https://github.com/rcrowe/TwigBridge) 0.6.x\n\nAdd the following extensions to your TwigBridge config/extensions.php (or register the extensions manually)\n\n```php\n'Fruitcake\\LaravelDebugbar\\Twig\\Extension\\Debug',\n'Fruitcake\\LaravelDebugbar\\Twig\\Extension\\Dump',\n'Fruitcake\\LaravelDebugbar\\Twig\\Extension\\Stopwatch',\n```\n\nThe Dump extension will replace the [dump function](http://twig.sensiolabs.org/doc/functions/dump.html) to output variables using the DataFormatter. The Debug extension adds a `debug()` function which passes variables to the Message Collector,\ninstead of showing it directly in the template. It dumps the arguments, or when empty; all context variables.\n\n```twig\n{{ debug() }}\n{{ debug(user, categories) }}\n```\n\nThe Stopwatch extension adds a [stopwatch tag](http://symfony.com/blog/new-in-symfony-2-4-a-stopwatch-tag-for-twig)  similar to the one in Symfony/Silex Twigbridge.\n\n```twig\n{% stopwatch \"foo\" %}\n    …some things that gets timed\n{% endstopwatch %}\n```\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=fruitcake/laravel-debugbar&type=Date)](https://www.star-history.com/#fruitcake/laravel-debugbar&Date)\n"
  },
  {
    "path": "resources/cache/widget.js",
    "content": "(function () {\n    const csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-');\n\n    /**\n     * Widget for the displaying cache events\n     *\n     * Options:\n     *  - data\n     */\n    class LaravelCacheWidget extends PhpDebugBar.Widgets.TimelineWidget {\n        get tagName() {\n            return 'ul';\n        }\n\n        get className() {\n            return csscls('timeline cache');\n        }\n\n        onForgetClick(e, el) {\n            e.stopPropagation();\n\n            fetch(el.getAttribute('data-url'), {\n                method: 'DELETE'\n            }).then((response) => {\n                if (response.ok) {\n                    el.style.transition = 'opacity 200ms';\n                    el.style.opacity = '0';\n                    setTimeout(() => el.remove(), 200);\n                }\n            }).catch((err) => {\n                console.error('Failed to forget cache key:', err);\n            });\n        }\n\n        render() {\n            super.render();\n\n            this.bindAttr('data', function (data) {\n                if (data.measures) {\n                    const lines = this.el.querySelectorAll(`.${csscls('measure')}`);\n\n                    for (let i = 0; i < data.measures.length; i++) {\n                        const measure = data.measures[i];\n                        const m = lines[i];\n\n                        if (measure.params && Object.keys(measure.params).length > 0) {\n                            if (measure.params.delete) {\n                                const nextElement = m.nextElementSibling;\n                                if (nextElement) {\n                                    const deleteRow = Array.from(nextElement.querySelectorAll('td.phpdebugbar-widgets-name'))\n                                        .find(td => td.textContent.includes('delete'));\n                                    if (deleteRow) {\n                                        deleteRow.closest('tr')?.remove();\n                                    }\n                                }\n                            }\n                            if (measure.delete_url && measure.params.key) {\n                                const forgetLink = document.createElement('a');\n                                forgetLink.className = csscls('forget');\n                                forgetLink.textContent = 'forget';\n                                forgetLink.setAttribute('data-url', measure.delete_url);\n                                forgetLink.addEventListener('click', (e) => {\n                                    this.onForgetClick(e, forgetLink);\n                                }, { once: true });\n                                m.appendChild(forgetLink);\n                            }\n                        }\n                    }\n                }\n            });\n        }\n    }\n\n    PhpDebugBar.Widgets.LaravelCacheWidget = LaravelCacheWidget;\n})();\n"
  },
  {
    "path": "resources/laravel-debugbar.css",
    "content": "div.phpdebugbar,\ndiv.phpdebugbar-openhandler,\ndiv.phpdebugbar-widgets-datasets-panel {\n    --debugbar-red-vivid: #eb4432;\n\n    /*--debugbar-background: #fff;*/\n    /*--debugbar-background-alt: #EFEFEF;*/\n    /*--debugbar-text: #222;*/\n    /*--debugbar-text-muted: #888;*/\n    --debugbar-border: #bbb;\n\n    --debugbar-header: #fff;\n    --debugbar-header-text: #555;\n    /*--debugbar-header-border: #ddd;*/\n\n    /*--debugbar-active: #ccc;*/\n    /*--debugbar-active-text: #666;*/\n\n    --debugbar-icons: var(--debugbar-header-text);\n    --debugbar-badge: #fff;\n    --debugbar-badge-text: var(--debugbar-red-vivid);\n\n    --debugbar-badge-active: var(--debugbar-red-vivid);\n    --debugbar-badge-active-text: #fff;\n\n    --debugbar-link: #777;\n    --debugbar-hover: #666;\n\n    --debugbar-header-hover: #ebebeb;\n    --debugbar-icon-brand: var(--debugbar-icon-brand-laravel);\n}\n\n/* Dark mode */\ndiv.phpdebugbar[data-theme='dark'],\ndiv.phpdebugbar-openhandler[data-theme='dark'],\ndiv.phpdebugbar-widgets-datasets-panel[data-theme='dark'] {\n    --debugbar-white: #FFFFFF;\n    --debugbar-gray-100: #F7FAFC;\n    --debugbar-gray-200: #EDF2F7;\n    --debugbar-gray-300: #E2E8F0;\n    --debugbar-gray-400: #CBD5E0;\n    --debugbar-gray-500: #A0AEC0;\n    --debugbar-gray-600: #718096;\n    --debugbar-gray-700: #4A5568;\n    --debugbar-gray-800: #252a37;\n    --debugbar-gray-900: #18181b;\n    --debugbar-red-vivid: #eb4432;\n\n    --debugbar-background: var(--debugbar-gray-800);\n    --debugbar-background-alt: var(--debugbar-gray-900);\n    --debugbar-text: var(--debugbar-gray-100);\n    --debugbar-text-muted: var(--debugbar-gray-400);\n    --debugbar-border: var(--debugbar-gray-600);\n\n    --debugbar-header:var(--debugbar-gray-900);\n    --debugbar-header-text: var(--debugbar-gray-200);\n    --debugbar-header-border: var(--debugbar-gray-800);\n    --debugbar-header-hover: var(--debugbar-gray-700);\n\n    --debugbar-active: var(--debugbar-gray-800);\n    --debugbar-active-text: var(--debugbar-gray-100);\n\n    --debugbar-icons: var(--debugbar-header-text);\n    --debugbar-badge: var(--debugbar-white);\n    --debugbar-badge-text: var(--debugbar-red-vivid);\n\n    --debugbar-badge-active: var(--debugbar-red-vivid);\n    --debugbar-badge-active-text: var(--debugbar-white);\n\n    --debugbar-link: var(--debugbar-gray-300);\n    --debugbar-hover: var(--debugbar-gray-100);\n    --debugbar-hover-bg: var(--debugbar-gray-700);\n}\n\ndiv.phpdebugbar[data-theme='dark'] code.phpdebugbar-widgets-sql,\ndiv.phpdebugbar[data-theme='dark'] .phpdebugbar-widgets-name,\ndiv.phpdebugbar[data-theme='dark'] .phpdebugbar-widgets-key,\ndiv.phpdebugbar[data-theme='dark'] .phpdebugbar-widgets-success > pre.sf-dump > .sf-dump-note {\n    color: #fdfd96;\n}\n\n/* Force Laravel Whoops exception handler to be displayed under the debug bar */\n.Whoops.container {\n    z-index: 5999999;\n}\n\ndiv.phpdebugbar-openhandler-overlay {\n    cursor: pointer;\n}\n\ndiv.phpdebugbar-openhandler {\n    border-top: 3px solid var(--debugbar-red-vivid);\n}\n\ndiv.phpdebugbar-resize-handle {\n    height: 3px;\n    margin-top: -3px;\n    border-bottom: 0;\n    background-color: var(--debugbar-red-vivid);\n}\n\ndiv.phpdebugbar-closed,\ndiv.phpdebugbar-minimized {\n    border-top-color: var(--debugbar-border);\n}\n\ndiv.phpdebugbar code, div.phpdebugbar pre {\n    color: var(--debugbar-text);\n}\n\ndiv.phpdebugbar pre.sf-dump {\n    color: var(--debugbar-text);\n}\n\ndiv.phpdebugbar-body {\n    border-top: 1px solid var(--debugbar-header-border);\n}\n\na.phpdebugbar-restore-btn:after {\n    background: var(--debugbar-red-vivid);\n}\n\na.phpdebugbar-restore-btn {\n    border-right-color: var(--debugbar-border) !important;\n}\n\ndiv.phpdebugbar-header .phpdebugbar-tab {\n    border-left: 1px solid var(--debugbar-header-border);\n}\n\ndl.phpdebugbar-widgets-kvlist dt,\ndl.phpdebugbar-widgets-kvlist dd,\ntable.phpdebugbar-widgets-tablevar td {\n    border-top: 0px;\n}\n\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter,\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded {\n    background-color: #6d6d6d;\n    color: #FFF;\n}\n\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"alert\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"alert\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"info\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"info\"] {\n    background-color: #5896e2;\n}\n\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"debug\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"debug\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"success\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"success\"] {\n    background-color: #45ab45;\n}\n\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"critical\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"critical\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"error\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"error\"] {\n    background-color: var(--debugbar-red-vivid);\n}\n\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"notice\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"notice\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter[rel=\"warning\"],\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter.phpdebugbar-widgets-excluded[rel=\"warning\"] {\n    background-color: #f99400;\n}\n\ndiv.phpdebugbar-widgets-messages div.phpdebugbar-widgets-toolbar a.phpdebugbar-widgets-filter:hover {\n    color: #FFF;\n}\n\n\na.phpdebugbar-tab.phpdebugbar-active {\n    background: var(--debugbar-red-vivid);\n    color: #fff !important;\n}\n\na.phpdebugbar-tab.phpdebugbar-active span.phpdebugbar-badge {\n    background-color: var(--debugbar-badge);\n    color: var(--debugbar-badge-text);\n}\n\na.phpdebugbar-tab span.phpdebugbar-badge {\n    border-radius: 10px;\n    padding: 2px 8px;\n    background: var(--debugbar-red-vivid);\n    color: var(--debugbar-badge-active-text);\n}\n\n.phpdebugbar-widgets-datasets-switcher-widget .phpdebugbar-widgets-datasets-badge-count  {\n    background: var(--debugbar-red-vivid);\n    color: var(--debugbar-badge-active-text);\n    border-radius: 10px;\n    padding: 0 4px;\n}\n\n.phpdebugbar-widgets-mails ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-headers {\n    border-left: 2px solid var(--debugbar-header);\n}\n\nul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item {\n    border: none;\n}\nul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-stmt-id a {\n    color: #888;\n}\n\nul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item .phpdebugbar-widgets-stmt-id a:hover {\n    color: #aaa;\n}\n\nul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item table.phpdebugbar-widgets-params {\n    border-left: 2px solid var(--debugbar-border);\n}\n\ndiv.phpdebugbar-widgets-templates table.phpdebugbar-widgets-params th {\n    background-color: var(--debugbar-background);\n}\n\ndiv.phpdebugbar-widgets-templates ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(odd) table.phpdebugbar-widgets-params th {\n    background-color: var(--debugbar-background-alt);\n}\n\nul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(even),\ntable.phpdebugbar-widgets-tablevar tr:nth-child(even) {\n    background-color: var(--debugbar-background-alt);\n}\n\ndiv.phpdebugbar-widgets-messages li.phpdebugbar-widgets-list-item span.phpdebugbar-widgets-value.phpdebugbar-widgets-error:before {\n    color: var(--debugbar-red-vivid);\n}\n\ndiv.phpdebugbar-panel div.phpdebugbar-widgets-status {\n    background: var(--debugbar-background-alt) !important;\n    border-bottom: 1px solid var(--debugbar-border) !important;\n}\n\ndiv.phpdebugbar-panel div.phpdebugbar-widgets-status > * {\n    color: var(--debugbar-header-text)!important;\n}\n\ndiv.phpdebugbar-panel div.phpdebugbar-widgets-status > span:first-child:before {\n    background-color: var(--debugbar-icons);\n    -webkit-mask-image: var(--debugbar-icon-info-circle);\n    mask-image: var(--debugbar-icon-info-circle);\n}\n\ndiv.phpdebugbar-widgets-sqlqueries table.phpdebugbar-widgets-params th {\n    /*background-color: var(--debugbar-background-alt);*/\n}\n\ndiv.phpdebugbar-widgets-sqlqueries ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(even) table.phpdebugbar-widgets-params th {\n    /*background-color: var(--debugbar-background);*/\n}\n\nul.phpdebugbar-widgets-cache a.phpdebugbar-widgets-forget {\n    float: right;\n    font-size: 12px;\n    padding: 0 4px;\n    background: var(--debugbar-red-vivid);\n    margin: 0 2px;\n    border-radius: 4px;\n    color: #fff;\n    text-decoration: none;\n    line-height: 1.25rem;\n}\n\ndiv.phpdebugbar-header-right > * {\n    border-right: 1px solid var(--debugbar-header);\n}\n\ndl.phpdebugbar-widgets-kvlist > :nth-child(4n-1),\ndl.phpdebugbar-widgets-kvlist > :nth-child(4n) {\n    background-color: var(--debugbar-background-alt);\n}\n\ndiv.phpdebugbar dl.phpdebugbar-widgets-kvlist > :nth-child(4n)::before {\n    background-color: var(--debugbar-background-alt);\n}\n\ndiv.phpdebugbar-widgets-sqlqueries a.phpdebugbar-widgets-connection {\n    background: #737373;\n    color: #fff !important;\n}\n\ndiv.phpdebugbar-widgets-sqlqueries button.phpdebugbar-widgets-explain-btn {\n    background: #383838;\n    color: #fff;\n}\n\ndiv.phpdebugbar-widgets-explain-scroll {\n    overflow: auto;\n    max-height: 300px;\n}\n\ndiv.phpdebugbar-widgets-sqlqueries table.phpdebugbar-widgets-explain {\n    width: 100%;\n    border-collapse: collapse;\n}\n\ndiv.phpdebugbar-widgets-sqlqueries table.phpdebugbar-widgets-explain th {\n    border-bottom: 1px solid var(--debugbar-border);\n    padding: 2px 5px;\n    position: sticky;\n    top: 0;\n    z-index: 1;\n}\n\ndiv.phpdebugbar-widgets-sqlqueries table.phpdebugbar-widgets-explain td {\n    color: var(--debugbar-text-muted);\n    padding: 2px 5px;\n    max-width: 200px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    cursor: pointer;\n}\n\ndiv.phpdebugbar-widgets-sqlqueries table.phpdebugbar-widgets-explain td.phpdebugbar-widgets-cell-expanded {\n    white-space: normal;\n    word-break: break-all;\n    max-width: none;\n}\n\nul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(even) table.phpdebugbar-widgets-explain th {\n    background-color: #fff;\n}\n\nul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(odd) table.phpdebugbar-widgets-explain th {\n    background-color: #f5f5f5;\n}\n\ndiv.phpdebugbar[data-theme='dark'] ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(even) table.phpdebugbar-widgets-explain th {\n    background-color: #1e1e1e;\n}\n\ndiv.phpdebugbar[data-theme='dark'] ul.phpdebugbar-widgets-list li.phpdebugbar-widgets-list-item:nth-child(odd) table.phpdebugbar-widgets-explain th {\n    background-color: #2a2a2a;\n}\n\ndiv.phpdebugbar-widgets-explain-btnbar {\n    display: flex;\n    gap: 5px;\n    margin-bottom: 5px;\n}\n\ndiv.phpdebugbar-widgets-explain-overlay {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background: rgba(0, 0, 0, 0.5);\n    z-index: 100000010;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\ndiv.phpdebugbar-widgets-explain-popup {\n    background: #fff;\n    border: 1px solid var(--debugbar-border);\n    border-radius: 4px;\n    max-width: 90vw;\n    max-height: 80vh;\n    min-width: 400px;\n    display: flex;\n    flex-direction: column;\n    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n}\n\ndiv.phpdebugbar[data-theme='dark'] .phpdebugbar-widgets-explain-popup {\n    background: #1e1e1e;\n}\n\ndiv.phpdebugbar[data-theme='dark'] .phpdebugbar-widgets-explain-popup-close {\n    color: #999;\n}\n\ndiv.phpdebugbar[data-theme='dark'] .phpdebugbar-widgets-explain-popup-close:hover {\n    color: #fff;\n}\n\ndiv.phpdebugbar-widgets-explain-popup-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding: 8px 12px;\n    border-bottom: 1px solid var(--debugbar-border);\n}\n\nspan.phpdebugbar-widgets-explain-popup-title {\n    font-family: monospace;\n    font-size: 12px;\n    color: var(--debugbar-text-muted);\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    flex: 1;\n    margin-right: 10px;\n}\n\nbutton.phpdebugbar-widgets-explain-popup-close {\n    background: none;\n    border: none;\n    color: var(--debugbar-text-muted);\n    font-size: 16px;\n    cursor: pointer;\n    padding: 0 4px;\n}\n\nbutton.phpdebugbar-widgets-explain-popup-close:hover {\n    color: var(--debugbar-text-color);\n}\n\ndiv.phpdebugbar-widgets-explain-popup-body {\n    overflow: auto;\n    flex: 1;\n}\n\ntable.phpdebugbar-widgets-explain.phpdebugbar-widgets-explain-full td {\n    max-width: none;\n    white-space: normal;\n    word-break: break-word;\n    cursor: default;\n}\n\ndiv.phpdebugbar-widgets-explain-popup-body table.phpdebugbar-widgets-explain {\n    width: 100%;\n}\n\ndiv.phpdebugbar-widgets-explain-popup-body table.phpdebugbar-widgets-explain th {\n    padding: 6px 10px;\n    position: sticky;\n    top: 0;\n    z-index: 1;\n    background: #fff;\n    border-bottom: 2px solid var(--debugbar-border);\n}\n\ndiv.phpdebugbar[data-theme='dark'] .phpdebugbar-widgets-explain-popup-body table.phpdebugbar-widgets-explain th {\n    background: #1e1e1e;\n}\n\ndiv.phpdebugbar-widgets-explain-popup-body table.phpdebugbar-widgets-explain td {\n    padding: 6px 10px;\n}\n\nspan.phpdebugbar-widgets-visual-link a {\n    color: var(--debugbar-text-muted);\n    margin-left: 5px;\n    font-size: 11px;\n}\n"
  },
  {
    "path": "resources/laravel-icons.css",
    "content": "/* Generated file - do not edit manually */\n/* Generated from Tabler Icons */\n\n:root {\n  --debugbar-icon-archive: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M3%204m0%202a2%202%200%200%201%202%20-2h14a2%202%200%200%201%202%202v0a2%202%200%200%201%20-2%202h-14a2%202%200%200%201%20-2%20-2z%22%20%2F%3E%20%3Cpath%20d%3D%22M5%208v10a2%202%200%200%200%202%202h10a2%202%200%200%200%202%20-2v-10%22%20%2F%3E%20%3Cpath%20d%3D%22M10%2012l4%200%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-clipboard-text: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M9%205h-2a2%202%200%200%200%20-2%202v12a2%202%200%200%200%202%202h10a2%202%200%200%200%202%20-2v-12a2%202%200%200%200%20-2%20-2h-2%22%20%2F%3E%20%3Cpath%20d%3D%22M9%203m0%202a2%202%200%200%201%202%20-2h2a2%202%200%200%201%202%202v0a2%202%200%200%201%20-2%202h-2a2%202%200%200%201%20-2%20-2z%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2012h6%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2016h6%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-files: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M15%203v4a1%201%200%200%200%201%201h4%22%20%2F%3E%20%3Cpath%20d%3D%22M18%2017h-7a2%202%200%200%201%20-2%20-2v-10a2%202%200%200%201%202%20-2h4l5%205v7a2%202%200%200%201%20-2%202z%22%20%2F%3E%20%3Cpath%20d%3D%22M16%2017v2a2%202%200%200%201%20-2%202h-7a2%202%200%200%201%20-2%20-2v-10a2%202%200%200%201%202%20-2h2%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-lock: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M5%2013a2%202%200%200%201%202%20-2h10a2%202%200%200%201%202%202v6a2%202%200%200%201%20-2%202h-10a2%202%200%200%201%20-2%20-2v-6z%22%20%2F%3E%20%3Cpath%20d%3D%22M11%2016a1%201%200%201%200%202%200a1%201%200%200%200%20-2%200%22%20%2F%3E%20%3Cpath%20d%3D%22M8%2011v-4a4%204%200%201%201%208%200v4%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-user: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M8%207a4%204%200%201%200%208%200a4%204%200%200%200%20-8%200%22%20%2F%3E%20%3Cpath%20d%3D%22M6%2021v-2a4%204%200%200%201%204%20-4h4a4%204%200%200%201%204%204v2%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-share-3: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M13%204v4c-6.575%201.028%20-9.02%206.788%20-10%2012c-.037%20.206%205.384%20-5.962%2010%20-6v4l8%20-7l-8%20-7z%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-subtask: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M6%209l6%200%22%20%2F%3E%20%3Cpath%20d%3D%22M4%205l4%200%22%20%2F%3E%20%3Cpath%20d%3D%22M6%205v11a1%201%200%200%200%201%201h5%22%20%2F%3E%20%3Cpath%20d%3D%22M12%207m0%201a1%201%200%200%201%201%20-1h6a1%201%200%200%201%201%201v2a1%201%200%200%201%20-1%201h-6a1%201%200%200%201%20-1%20-1z%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2015m0%201a1%201%200%200%201%201%20-1h6a1%201%200%200%201%201%201v2a1%201%200%200%201%20-1%201h-6a1%201%200%200%201%20-1%20-1z%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-brand-laravel: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%221%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M3%2017l8%205l7%20-4v-8l-4%20-2.5l4%20-2.5l4%202.5v4l-11%206.5l-4%20-2.5v-7.5l-4%20-2.5z%22%20%2F%3E%20%3Cpath%20d%3D%22M11%2018v4%22%20%2F%3E%20%3Cpath%20d%3D%22M7%2015.5l7%20-4%22%20%2F%3E%20%3Cpath%20d%3D%22M14%207.5v4%22%20%2F%3E%20%3Cpath%20d%3D%22M14%2011.5l4%202.5%22%20%2F%3E%20%3Cpath%20d%3D%22M11%2013v-7.5l-4%20-2.5l-4%202.5%22%20%2F%3E%20%3Cpath%20d%3D%22M7%208l4%20-2.5%22%20%2F%3E%20%3Cpath%20d%3D%22M18%2010l4%20-2.5%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-brand-livewire: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%221%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M20.982%2018.777c-.372%20.548%20-.652%201.223%20-1.406%201.223c-1.269%200%20-1.337%20-1.913%20-2.607%20-1.913c-1.27%200%20-1.2%201.913%20-2.47%201.913c-1.268%200%20-1.337%20-1.913%20-2.607%20-1.913c-1.269%200%20-1.2%201.913%20-2.47%201.913c-1.268%200%20-1.337%20-1.913%20-2.607%20-1.913c-1.27%200%20-1.2%201.913%20-2.47%201.913c-.398%200%20-.679%20-.189%20-.915%20-.448a10.414%2010.414%200%200%201%20-1.43%20-5.29c0%20-5.669%204.477%20-10.262%2010%20-10.262c5.524%200%2010%204.594%2010%2010.261c0%201.62%20-.366%203.152%20-1.018%204.516z%22%20%2F%3E%20%3Cpath%20d%3D%22M20.982%2018.777c-.372%20.548%20-.652%201.223%20-1.406%201.223c-1.269%200%20-1.337%20-1.913%20-2.607%20-1.913c-1.27%200%20-1.2%201.913%20-2.47%201.913c-1.268%200%20-1.337%20-1.913%20-2.607%20-1.913c-1.269%200%20-1.2%201.913%20-2.47%201.913c-1.268%200%20-1.337%20-1.913%20-2.607%20-1.913c-1.27%200%20-1.2%201.913%20-2.47%201.913c-.398%200%20-.679%20-.189%20-.915%20-.448a10.414%2010.414%200%200%201%20-1.43%20-5.29c0%20-5.669%204.477%20-10.262%2010%20-10.262c5.524%200%2010%204.594%2010%2010.261c0%201.62%20-.366%203.152%20-1.018%204.516z%22%20%2F%3E%20%3Cpath%20d%3D%22M11.5%2016c3.167%200%204.5%20-1.748%204.5%20-4.231c0%20-2.484%20-2.014%20-4.769%20-4.5%20-4.769c-2.485%200%20-4.5%202.286%20-4.5%204.769s1.333%204.231%204.5%204.231z%22%20%2F%3E%20%3Cpath%20d%3D%22M10%2011a1%201%200%201%200%200%20-2a1%201%200%200%200%200%202z%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-brand-inertia: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%221%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M12.5%208l4%204l-4%204h4.5l4%20-4l-4%20-4z%22%20%2F%3E%20%3Cpath%20d%3D%22M3.5%208l4%204l-4%204h4.5l4%20-4l-4%20-4z%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-pin: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M15%204.5l-4%204l-4%201.5l-1.5%201.5l7%207l1.5%20-1.5l1.5%20-4l4%20-4%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2015l-4.5%204.5%22%20%2F%3E%20%3Cpath%20d%3D%22M14.5%204l5.5%205.5%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-help-circle: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M3%2012a9%209%200%201%200%2018%200a9%209%200%200%200%20-18%200%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2016v.01%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2013a2%202%200%200%200%20.914%20-3.782a1.98%201.98%200%200%200%20-2.414%20.483%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-list: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M9%206l11%200%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2012l11%200%22%20%2F%3E%20%3Cpath%20d%3D%22M9%2018l11%200%22%20%2F%3E%20%3Cpath%20d%3D%22M5%206l0%20.01%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2012l0%20.01%22%20%2F%3E%20%3Cpath%20d%3D%22M5%2018l0%20.01%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-gauge: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M12%2012m-9%200a9%209%200%201%200%2018%200a9%209%200%201%200%20-18%200%22%20%2F%3E%20%3Cpath%20d%3D%22M12%2012m-1%200a1%201%200%201%200%202%200a1%201%200%201%200%20-2%200%22%20%2F%3E%20%3Cpath%20d%3D%22M13.41%2010.59l2.59%20-2.59%22%20%2F%3E%20%3Cpath%20d%3D%22M7%2012a5%205%200%200%201%205%20-5%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-star: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22currentColor%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M8.243%207.34l-6.38%20.925l-.113%20.023a1%201%200%200%200%20-.44%201.684l4.622%204.499l-1.09%206.355l-.013%20.11a1%201%200%200%200%201.464%20.944l5.706%20-3l5.693%203l.1%20.046a1%201%200%200%200%201.352%20-1.1l-1.091%20-6.355l4.624%20-4.5l.078%20-.085a1%201%200%200%200%20-.633%20-1.62l-6.38%20-.926l-2.852%20-5.78a1%201%200%200%200%20-1.794%200l-2.853%205.78z%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-info-circle: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M3%2012a9%209%200%201%200%2018%200a9%209%200%200%200%20-18%200%22%20%2F%3E%20%3Cpath%20d%3D%22M12%209h.01%22%20%2F%3E%20%3Cpath%20d%3D%22M11%2012h1v4h1%22%20%2F%3E%20%3C%2Fsvg%3E');\n  --debugbar-icon-external-link: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20stroke%3D%22currentColor%22%20stroke-width%3D%222%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20%3E%20%3Cpath%20stroke%3D%22none%22%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%20%3Cpath%20d%3D%22M12%206h-6a2%202%200%200%200%20-2%202v10a2%202%200%200%200%202%202h10a2%202%200%200%200%202%20-2v-6%22%20%2F%3E%20%3Cpath%20d%3D%22M11%2013l9%20-9%22%20%2F%3E%20%3Cpath%20d%3D%22M15%204h5v5%22%20%2F%3E%20%3C%2Fsvg%3E');\n}\n\n.phpdebugbar-icon-archive::before {\n  -webkit-mask-image: var(--debugbar-icon-archive);\n  mask-image: var(--debugbar-icon-archive);\n}\n\n.phpdebugbar-icon-clipboard-text::before {\n  -webkit-mask-image: var(--debugbar-icon-clipboard-text);\n  mask-image: var(--debugbar-icon-clipboard-text);\n}\n\n.phpdebugbar-icon-files::before {\n  -webkit-mask-image: var(--debugbar-icon-files);\n  mask-image: var(--debugbar-icon-files);\n}\n\n.phpdebugbar-icon-lock::before {\n  -webkit-mask-image: var(--debugbar-icon-lock);\n  mask-image: var(--debugbar-icon-lock);\n}\n\n.phpdebugbar-icon-user::before {\n  -webkit-mask-image: var(--debugbar-icon-user);\n  mask-image: var(--debugbar-icon-user);\n}\n\n.phpdebugbar-icon-share-3::before {\n  -webkit-mask-image: var(--debugbar-icon-share-3);\n  mask-image: var(--debugbar-icon-share-3);\n}\n\n.phpdebugbar-icon-subtask::before {\n  -webkit-mask-image: var(--debugbar-icon-subtask);\n  mask-image: var(--debugbar-icon-subtask);\n}\n\n.phpdebugbar-icon-brand-laravel::before {\n  -webkit-mask-image: var(--debugbar-icon-brand-laravel);\n  mask-image: var(--debugbar-icon-brand-laravel);\n}\n\n.phpdebugbar-icon-brand-livewire::before {\n  -webkit-mask-image: var(--debugbar-icon-brand-livewire);\n  mask-image: var(--debugbar-icon-brand-livewire);\n}\n\n.phpdebugbar-icon-brand-inertia::before {\n  -webkit-mask-image: var(--debugbar-icon-brand-inertia);\n  mask-image: var(--debugbar-icon-brand-inertia);\n}\n\n.phpdebugbar-icon-pin::before {\n  -webkit-mask-image: var(--debugbar-icon-pin);\n  mask-image: var(--debugbar-icon-pin);\n}\n\n.phpdebugbar-icon-help-circle::before {\n  -webkit-mask-image: var(--debugbar-icon-help-circle);\n  mask-image: var(--debugbar-icon-help-circle);\n}\n\n.phpdebugbar-icon-list::before {\n  -webkit-mask-image: var(--debugbar-icon-list);\n  mask-image: var(--debugbar-icon-list);\n}\n\n.phpdebugbar-icon-gauge::before {\n  -webkit-mask-image: var(--debugbar-icon-gauge);\n  mask-image: var(--debugbar-icon-gauge);\n}\n\n.phpdebugbar-icon-star::before {\n  -webkit-mask-image: var(--debugbar-icon-star);\n  mask-image: var(--debugbar-icon-star);\n}\n\n.phpdebugbar-icon-info-circle::before {\n  -webkit-mask-image: var(--debugbar-icon-info-circle);\n  mask-image: var(--debugbar-icon-info-circle);\n}\n\n.phpdebugbar-icon-external-link::before {\n  -webkit-mask-image: var(--debugbar-icon-external-link);\n  mask-image: var(--debugbar-icon-external-link);\n}\n\n"
  },
  {
    "path": "resources/queries/widget.js",
    "content": "(function () {\n    const csscls = PhpDebugBar.utils.makecsscls('phpdebugbar-widgets-');\n\n    /**\n     * Widget for displaying sql queries with Laravel-specific features.\n     * Extends the base SQLQueriesWidget to add EXPLAIN functionality.\n     *\n     * Options:\n     *  - data\n     */\n    class LaravelQueriesWidget extends PhpDebugBar.Widgets.SQLQueriesWidget {\n\n        buildTable(rows, opts = {}) {\n            const headings = [];\n            for (const key in rows[0]) {\n                const th = document.createElement('th');\n                th.textContent = key;\n                headings.push(th);\n            }\n\n            const values = [];\n            for (const row of rows) {\n                const tr = document.createElement('tr');\n                for (const key in row) {\n                    const td = document.createElement('td');\n                    const text = row[key] == null ? '' : String(row[key]);\n                    td.textContent = text;\n                    if (!opts.expanded) {\n                        td.title = text;\n                        td.addEventListener('click', (e) => {\n                            e.stopPropagation();\n                            td.classList.toggle(csscls('cell-expanded'));\n                            if (td.classList.contains(csscls('cell-expanded'))) {\n                                const selection = window.getSelection();\n                                const range = document.createRange();\n                                range.selectNodeContents(td);\n                                selection.removeAllRanges();\n                                selection.addRange(range);\n                            }\n                        });\n                    }\n                    tr.append(td);\n                }\n                values.push(tr);\n            }\n\n            const table = document.createElement('table');\n            table.classList.add(csscls('explain'));\n            if (opts.expanded) {\n                table.classList.add(csscls('explain-full'));\n            }\n            const thead = document.createElement('thead');\n            const tbody = document.createElement('tbody');\n            const headerRow = document.createElement('tr');\n            headerRow.append(...headings);\n            thead.append(headerRow);\n            tbody.append(...values);\n            table.append(thead, tbody);\n            return table;\n        }\n\n        buildPgsqlTable(rows, opts = {}) {\n            const values = [];\n            for (const row of rows) {\n                const tr = document.createElement('tr');\n                const td = document.createElement('td');\n                td.textContent = row;\n                tr.append(td);\n                values.push(tr);\n            }\n\n            const table = document.createElement('table');\n            table.classList.add(csscls('explain'));\n            if (opts.expanded) {\n                table.classList.add(csscls('explain-full'));\n            }\n            const tbody = document.createElement('tbody');\n            tbody.append(...values);\n            table.append(tbody);\n            return table;\n        }\n\n        actionButton(label, onClick) {\n            const btn = document.createElement('button');\n            btn.textContent = label;\n            btn.classList.add(csscls('explain-btn'));\n            btn.addEventListener('click', (e) => {\n                e.preventDefault();\n                e.stopPropagation();\n                onClick(e);\n            });\n            return btn;\n        }\n\n        fetchQuery(statement, mode, format) {\n            const body = {\n                connection: statement.explain.connection,\n                query: statement.explain.query,\n                bindings: statement.params,\n                hash: statement.explain.hash,\n                mode: mode,\n            };\n            if (format) {\n                body.format = format;\n            }\n            return fetch(statement.explain.url, {\n                method: 'POST',\n                headers: {\n                    'Accept': 'application/json',\n                    'Content-Type': 'application/json'\n                },\n                body: JSON.stringify(body),\n            }).then((response) =>\n                response.json().then((json) => {\n                    if (!response.ok)\n                        throw new Error(json.message || 'Request failed');\n                    return json;\n                })\n            );\n        }\n\n        renderResult(container, statement, data, btnBar) {\n            container.innerHTML = '';\n\n            const result = data.result;\n            if (Array.isArray(result) && result.length > 0 && typeof result[0] === 'object') {\n                const wrapper = document.createElement('div');\n                wrapper.classList.add(csscls('explain-scroll'));\n                wrapper.append(this.buildTable(result));\n                container.append(wrapper);\n                btnBar.append(this.actionButton('Expand', () => {\n                    this.showPopup(statement.explain.query, this.buildTable(result, { expanded: true }));\n                }));\n            } else {\n                const empty = document.createElement('em');\n                empty.textContent = 'No results';\n                container.append(empty);\n            }\n\n            container.prepend(btnBar);\n        }\n\n        renderDump(container, statement, data, btnBar) {\n            container.innerHTML = '';\n            PhpDebugBar.Widgets.renderValueInto(container, data.result);\n            PhpDebugBar.utils.sfDump(container);\n            container.prepend(btnBar);\n        }\n\n        renderExplain(container, statement, data, driver, btnBar) {\n            container.innerHTML = '';\n\n            const rows = data;\n            const buildFn = driver === 'pgsql' ? 'buildPgsqlTable' : 'buildTable';\n\n            const wrapper = document.createElement('div');\n            wrapper.classList.add(csscls('explain-scroll'));\n            wrapper.append(this[buildFn](rows));\n            container.append(wrapper);\n\n            btnBar.append(this.actionButton('Expand', () => {\n                this.showPopup(statement.explain.query, this[buildFn](rows, { expanded: true }));\n            }));\n\n            container.prepend(btnBar);\n        }\n\n        showPopup(query, contentEl) {\n            const overlay = document.createElement('div');\n            overlay.classList.add(csscls('explain-overlay'));\n\n            const popup = document.createElement('div');\n            popup.classList.add(csscls('explain-popup'));\n\n            const header = document.createElement('div');\n            header.classList.add(csscls('explain-popup-header'));\n\n            const title = document.createElement('span');\n            title.innerHTML = PhpDebugBar.Widgets.highlight(query.length > 120 ? query.substring(0, 120) + '...' : query, 'sql');\n            title.classList.add(csscls('explain-popup-title'));\n\n            const closeBtn = document.createElement('button');\n            closeBtn.textContent = '\\u2715';\n            closeBtn.classList.add(csscls('explain-popup-close'));\n            closeBtn.addEventListener('click', () => overlay.remove());\n\n            header.append(title, closeBtn);\n\n            const body = document.createElement('div');\n            body.classList.add(csscls('explain-popup-body'));\n            body.append(contentEl);\n\n            popup.append(header, body);\n            overlay.append(popup);\n\n            overlay.addEventListener('click', (e) => {\n                if (e.target === overlay) overlay.remove();\n            });\n\n            document.addEventListener('keydown', function onEsc(e) {\n                if (e.key === 'Escape') {\n                    overlay.remove();\n                    document.removeEventListener('keydown', onEsc);\n                }\n            });\n\n            document.querySelector('div.phpdebugbar').append(overlay);\n        }\n\n        itemRenderer(li, stmt, filters) {\n            // Call parent's item renderer first\n            super.itemRenderer(li, stmt, filters);\n\n            // Add explain button if available\n            if (stmt.explain) {\n                let table = li.querySelector(`.${csscls('params')}`);\n                table.style.display = '';\n                if (stmt.explain.modes.includes('result')) {\n                    this.renderDetailSection(table, 'Result', stmt, 'result');\n                }\n                if (stmt.explain.modes.includes('explain')) {\n                    this.renderDetailSection(table, 'Performance', stmt, 'explain');\n                }\n            }\n        }\n\n        renderDetailSection(table, caption, statement, mode) {\n            const thead = document.createElement('thead');\n            const tr = document.createElement('tr');\n            const th = document.createElement('th');\n            th.colSpan = 2;\n            th.classList.add(csscls('name'));\n            th.textContent = caption;\n            tr.append(th);\n            thead.append(tr);\n            table.append(thead);\n\n            const tbody = document.createElement('tbody');\n            const bodyTr = document.createElement('tr');\n            const td = document.createElement('td');\n            td.colSpan = 2;\n\n            const driver = statement.explain.driver;\n\n            if (mode === 'result') {\n                const makeBtnBar = () => {\n                    const bar = document.createElement('div');\n                    bar.classList.add(csscls('explain-btnbar'));\n                    bar.append(\n                        this.actionButton('Run SELECT', () => {\n                            const btnBar = makeBtnBar();\n                            this.fetchQuery(statement, 'result').then((json) => {\n                                this.renderResult(td, statement, json.data, btnBar);\n                            }).catch((e) => alert(e.message)); // eslint-disable-line no-alert\n                        }),\n                        this.actionButton('Run SELECT (dump)', () => {\n                            const btnBar = makeBtnBar();\n                            this.fetchQuery(statement, 'result', 'dump').then((json) => {\n                                this.renderDump(td, statement, json.data, btnBar);\n                            }).catch((e) => alert(e.message)); // eslint-disable-line no-alert\n                        })\n                    );\n                    return bar;\n                };\n                td.append(makeBtnBar());\n            } else {\n                const run = () => {\n                    this.fetchQuery(statement, 'explain').then((json) => {\n                        const btnBar = document.createElement('div');\n                        btnBar.classList.add(csscls('explain-btnbar'));\n                        btnBar.append(this.actionButton('Re-run EXPLAIN', run));\n\n                        if (json.visual) {\n                            btnBar.append(this.buildVisualExplainButton(statement, json.visual.confirm));\n                        }\n\n                        this.renderExplain(td, statement, json.data, driver, btnBar);\n                    }).catch((e) => alert(e.message)); // eslint-disable-line no-alert\n                };\n\n                td.append(this.actionButton('Run EXPLAIN', run));\n            }\n\n            bodyTr.append(td);\n            tbody.append(bodyTr);\n            table.append(tbody);\n        }\n\n        buildVisualExplainButton(statement, confirmMessage) {\n            const linkContainer = document.createElement('span');\n            linkContainer.classList.add(csscls('visual-link'));\n\n            const btn = this.actionButton('Visual Explain', () => {\n                if (!confirm(confirmMessage)) // eslint-disable-line no-alert\n                    return;\n                this.fetchQuery(statement, 'visual').then((json) => {\n                    linkContainer.innerHTML = '';\n                    const link = document.createElement('a');\n                    link.href = json.data;\n                    link.textContent = json.data;\n                    link.target = '_blank';\n                    link.rel = 'noopener';\n                    linkContainer.append(link);\n                    window.open(json.data, '_blank', 'noopener');\n                }).catch((e) => alert(e.message)); // eslint-disable-line no-alert\n            });\n\n            const wrapper = document.createDocumentFragment();\n            wrapper.append(btn, linkContainer);\n            return wrapper;\n        }\n    }\n\n    PhpDebugBar.Widgets.LaravelQueriesWidget = LaravelQueriesWidget;\n})();\n"
  },
  {
    "path": "src/CollectorProviders/AbstractCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse DebugBar\\DataCollector\\DataCollectorInterface;\n\nabstract class AbstractCollectorProvider\n{\n    public function __construct(\n        protected readonly LaravelDebugbar $debugbar,\n    ) {}\n\n    protected function addCollector(DataCollectorInterface $collector): void\n    {\n        $this->debugbar->addCollector($collector);\n    }\n\n    public function hasCollector(string $name): bool\n    {\n        return $this->debugbar->hasCollector($name);\n    }\n\n    public function getCollector(string $name): DataCollectorInterface\n    {\n        return $this->debugbar->getCollector($name);\n    }\n\n    protected function addCollectorException(string $message, \\Throwable $exception): void\n    {\n        $this->addThrowable(\n            new \\RuntimeException(\n                $message . ' on Laravel Debugbar: ' . $exception->getMessage(),\n                (int) $exception->getCode(),\n                $exception,\n            ),\n        );\n    }\n\n    /**\n     * Adds an exception to be profiled in the debug bar\n     */\n    public function addThrowable(\\Throwable $e): void\n    {\n        if ($this->hasCollector('exceptions')) {\n            /** @var \\DebugBar\\DataCollector\\ExceptionsCollector $collector */\n            $collector = $this->getCollector('exceptions');\n            $collector->addThrowable($e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/AuthCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\MultiAuthCollector;\n\nclass AuthCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $guards = config('auth.guards', []);\n        $authCollector = new MultiAuthCollector($guards);\n        $this->addCollector($authCollector);\n\n        $authCollector->setShowName($options['show_name'] ?? false);\n        $authCollector->setShowGuardsData($options['show_guards'] ?? true);\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/CacheCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\CacheCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Http\\Request;\n\nclass CacheCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Request $request, Dispatcher $events, array $options): void\n    {\n        $collectValues = $options['values'] ?? false;\n        $startTime = (float) $request->server('REQUEST_TIME_FLOAT');\n        $cacheCollector = new CacheCollector($startTime, $collectValues);\n        $this->addCollector($cacheCollector);\n\n        if ($options['timeline'] ?? false) {\n            $cacheCollector->setTimeDataCollector($this->debugbar->getTimeCollector());\n        }\n\n        $classMap = $cacheCollector->getCacheEvents();\n        foreach (array_keys($classMap) as $eventClass) {\n            $events->listen($eventClass, function ($event) use ($cacheCollector): void {\n                if ($this->debugbar->isEnabled()) {\n                    $cacheCollector->onCacheEvent($event);\n                }\n            });\n        }\n\n        $startEvents = array_unique(array_filter(array_map(\n            fn($values) => $values[1] ?? null,\n            array_values($classMap),\n        )));\n\n        foreach ($startEvents as $eventClass) {\n            $events->listen($eventClass, function ($event) use ($cacheCollector): void {\n                if ($this->debugbar->isEnabled()) {\n                    $cacheCollector->onStartCacheEvent($event);\n                }\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/ConfigCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\ConfigCollector;\n\nclass ConfigCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $configCollector = new ConfigCollector();\n        $masked = ['app.key', 'app.previous_keys', '*.*_key', '*.*apikey', '*.*secret*', '*.*password*', '*.*token*'];\n        $configCollector->addMaskedKeys(array_merge($masked, $options['masked'] ?? []));\n        $this->addCollector($configCollector);\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/DatabaseCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Database\\Events\\ConnectionEstablished;\nuse Illuminate\\Database\\Events\\QueryExecuted;\nuse Illuminate\\Database\\Events\\TransactionBeginning;\nuse Illuminate\\Database\\Events\\TransactionCommitted;\nuse Illuminate\\Database\\Events\\TransactionRolledBack;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Router;\n\nclass DatabaseCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Dispatcher $events, Router $router, Request $request, array $options): void\n    {\n        $queryCollector = new QueryCollector();\n        if ($options['timeline'] ?? false) {\n            $timeCollector = $this->debugbar->getTimeCollector();\n            $queryCollector->setTimeDataCollector($timeCollector);\n        }\n\n        $queryCollector->setLimits($options['soft_limit'] ?? 100, $options['hard_limit'] ?? 500);\n        $queryCollector->setDurationBackground($options['duration_background'] ?? true);\n\n        $threshold = $options['slow_threshold'] ?? false;\n        if ($threshold && !($options['only_slow_queries'] ?? true)) {\n            $queryCollector->setSlowThreshold($threshold);\n        }\n\n        if ($options['with_params'] ?? true) {\n            $queryCollector->setRenderSqlWithParams(true);\n        }\n\n        if ($backtrace = ($options['backtrace'] ?? true)) {\n            $queryCollector->setFindSource($backtrace, $router->getMiddleware());\n        }\n\n        if ($excludePaths = ($options['exclude_paths'] ?? [])) {\n            $queryCollector->mergeExcludePaths($excludePaths);\n        }\n\n        if ($excludeBacktracePaths = ($options['backtrace_exclude_paths'] ?? [])) {\n            $queryCollector->mergeBacktraceExcludePaths($excludeBacktracePaths);\n        }\n\n        if (($options['explain']['enabled'] ?? false) && $this->debugbar->isStorageOpen($request)) {\n            $queryCollector->setExplainQuery(true);\n        }\n\n        if (($options['show_query_result'] ?? false) && $this->debugbar->isStorageOpen($request)) {\n            $queryCollector->setShowQueryResult(true);\n        }\n\n        $this->addCollector($queryCollector);\n\n        try {\n            $events->listen(\n                function (QueryExecuted $query) use ($queryCollector, $options): void {\n                    // In case Debugbar is disabled after the listener was attached\n                    if (!$this->debugbar->shouldCollect('db', true) || !$this->debugbar->isEnabled()) {\n                        return;\n                    }\n\n                    $threshold = $options['slow_threshold'] ?? false;\n                    $onlyThreshold = $options['only_slow_queries'] ?? true;\n\n                    //allow collecting only queries slower than a specified amount of milliseconds\n                    if (!$onlyThreshold || !$threshold || $query->time > $threshold) {\n                        $queryCollector->addQuery($query);\n                    }\n                },\n            );\n        } catch (\\Throwable $e) {\n            $this->addCollectorException('Cannot listen to Queries', $e);\n        }\n\n        try {\n            $events->listen(\n                TransactionBeginning::class,\n                fn($transaction) => $queryCollector->collectTransactionEvent('Begin Transaction', $transaction->connection),\n            );\n\n            $events->listen(\n                TransactionCommitted::class,\n                fn($transaction) => $queryCollector->collectTransactionEvent('Commit Transaction', $transaction->connection),\n            );\n\n            $events->listen(\n                TransactionRolledBack::class,\n                fn($transaction) => $queryCollector->collectTransactionEvent('Rollback Transaction', $transaction->connection),\n            );\n\n            $events->listen(\n                'connection.*.beganTransaction',\n                fn($event, $params) => $queryCollector->collectTransactionEvent('Begin Transaction', $params[0]),\n            );\n\n            $events->listen(\n                'connection.*.committed',\n                fn($event, $params) =>  $queryCollector->collectTransactionEvent('Commit Transaction', $params[0]),\n            );\n\n            $events->listen(\n                'connection.*.rollingBack',\n                fn($event, $params) => $queryCollector->collectTransactionEvent('Rollback Transaction', $params[0]),\n            );\n\n            $events->listen(\n                function (ConnectionEstablished $event) use ($queryCollector, $options): void {\n                    $queryCollector->collectTransactionEvent('Connection Established', $event->connection);\n\n                    if ($options['memory_usage'] ?? false) {\n                        $event->connection->beforeExecuting(function () use ($queryCollector): void {\n                            $queryCollector->startMemoryUsage();\n                        });\n                    }\n                },\n            );\n        } catch (\\Throwable $e) {\n            $this->addCollectorException('Cannot listen to Queries', $e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/EventsCollectorCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\EventCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Http\\Request;\n\nclass EventsCollectorCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Request $request, Dispatcher $events, array $options): void\n    {\n        $startTime = $request->server('REQUEST_TIME_FLOAT');\n\n        $collectData = $options['data'] ?? false;\n        $collectListeners = $options['listeners'] ?? false;\n        $excludedEvents = $options['excluded'] ?? [];\n\n        $eventCollector = new EventCollector($startTime ? (float) $startTime : null);\n        if ($collectData) {\n            $eventCollector->setCollectValues($collectData);\n        }\n        if ($collectListeners) {\n            $eventCollector->setCollectListeners($collectListeners);\n        }\n        if ($excludedEvents) {\n            $eventCollector->setExcludedEvents($excludedEvents);\n        }\n\n        $this->addCollector($eventCollector);\n\n        $events->listen('*', function ($event, $data = []) use ($eventCollector): void {\n            if ($this->debugbar->isEnabled()) {\n                $eventCollector->onWildcardEvent($event, $data);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/ExceptionsCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nclass ExceptionsCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $exceptionCollector = $this->debugbar->getExceptionsCollector();\n        $this->addCollector($exceptionCollector);\n        $exceptionCollector->setChainExceptions($options['chain'] ?? true);\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/GateCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\GateCollector;\nuse Illuminate\\Auth\\Access\\Events\\GateEvaluated;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\n\nclass GateCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Dispatcher $events, array $options): void\n    {\n        $gateCollector = new GateCollector('gate');\n        $this->addCollector($gateCollector);\n\n        if ($options['trace'] ?? false) {\n            $gateCollector->collectFileTrace(true);\n            $gateCollector->addBacktraceExcludePaths($options['exclude_paths'] ?? []);\n        }\n\n        if ($options['timeline'] ?? false) {\n            $gateCollector->setTimeDataCollector($this->debugbar->getTimeCollector());\n        }\n\n        $events->listen(GateEvaluated::class, fn(GateEvaluated $event) => $gateCollector->addCheck($event->user, $event->ability, $event->result, $event->arguments));\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/HttpClientCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\HttpClientCollector;\nuse DebugBar\\DataCollector\\TimeDataCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Http\\Client\\Events\\ConnectionFailed;\nuse Illuminate\\Http\\Client\\Events\\ResponseReceived;\n\nclass HttpClientCollectorProvider extends AbstractCollectorProvider\n{\n    protected ?HttpClientCollector $httpClientCollector = null;\n\n    public function __invoke(Dispatcher $events, array $options): void\n    {\n        $httpClientCollector = new HttpClientCollector('http_client');\n        if ($this->hasCollector('time') && ($options['timeline'] ?? true)) {\n            /** @var TimeDataCollector   $timeCollector */\n            $timeCollector = $this->getCollector('time');\n            $httpClientCollector->setTimeDataCollector($timeCollector);\n        }\n\n        $this->httpClientCollector = $httpClientCollector;\n\n        $masked = $options['masked'] ?? [];\n        $httpClientCollector->addMaskedKeys($masked);\n\n        $this->addCollector($httpClientCollector);\n\n        $events->listen(ResponseReceived::class, fn(ResponseReceived $e) => $this->addEvent($e));\n        $events->listen(ConnectionFailed::class, fn(ConnectionFailed $e) => $this->addEvent($e));\n    }\n\n    protected function addEvent(ResponseReceived|ConnectionFailed $event): void\n    {\n        try {\n            $this->httpClientCollector->addEvent($event);\n        } catch (\\Throwable $e) {\n            $this->addThrowable($e);\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/InertiaCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\InertiaCollector;\nuse Illuminate\\Contracts\\Foundation\\Application;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Routing\\Events\\ResponsePrepared;\n\nclass InertiaCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Application $app, Dispatcher $events, array $options): void\n    {\n        if ($app->bound('inertia.view-finder')) {\n\n            $inertiaCollector = new InertiaCollector(true, [], false);\n\n            $this->addCollector($inertiaCollector);\n\n            $events->listen(ResponsePrepared::class, fn(ResponsePrepared $e) => $inertiaCollector->addFromResponse($e->response));\n            $events->listen('composing:*', fn($event, $params) => $inertiaCollector->addFromView($params[0]));\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/CollectorProviders/JobsCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse DebugBar\\DataCollector\\ObjectCountCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Queue\\Events\\JobQueued;\n\nclass JobsCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Dispatcher $events, array $options): void\n    {\n        $jobs = new ObjectCountCollector('jobs', 'briefcase');\n        $this->addCollector($jobs);\n\n        $events->listen(JobQueued::class, function ($event) use ($jobs): void {\n            $jobs->countClass($event->job);\n        });\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/LaravelCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\LaravelCollector;\n\nclass LaravelCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $this->addCollector(new LaravelCollector());\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/LivewireCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\LivewireCollector;\nuse Illuminate\\Contracts\\Foundation\\Application;\nuse Illuminate\\Http\\Request;\nuse Livewire\\Component;\nuse Livewire\\Livewire;\n\nclass LivewireCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Application $app, Request $request): void\n    {\n        if ($app->bound('livewire')) {\n\n            $livewireCollector = new LivewireCollector(true, [], false);\n            $this->addCollector($livewireCollector);\n\n            Livewire::listen('render', fn(Component $component) => $livewireCollector->addLivewireComponent($component, $request));\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/LogCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse DebugBar\\DataCollector\\MessagesCollector;\nuse Illuminate\\Log\\Events\\MessageLogged;\nuse Illuminate\\Log\\Logger;\n\nclass LogCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Logger $logger, array $options): void\n    {\n        $logCollector = new MessagesCollector('log');\n\n        if ($this->hasCollector('messages')) {\n            /** @var MessagesCollector $messagesCollector */\n            $messagesCollector = $this->getCollector('messages');\n            $messagesCollector->aggregate($logCollector);\n        } else {\n            $this->addCollector($logCollector);\n        }\n\n        $logger->listen(\n            function (MessageLogged $log) use ($logCollector): void {\n                try {\n                    $logMessage = $log->message;\n                    if (mb_check_encoding($logMessage, 'UTF-8')) {\n                        $context = $log->context;\n                        $logMessage .= ($context ? ' ' . json_encode($context, JSON_PRETTY_PRINT) : '');\n                    } else {\n                        $logMessage = \"[INVALID UTF-8 DATA]\";\n                    }\n                } catch (\\Throwable $e) {\n                    $logMessage = \"[Exception: \" . $e->getMessage() . \"]\";\n                }\n                $logCollector->log(\n                    $log->level,\n                    '[' . date('H:i:s') . '] ' . \"LOG.{$log->level}: \" . $logMessage,\n                    $log->context,\n                );\n            },\n        );\n\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/LogsCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\LogsCollector;\nuse Illuminate\\Log\\Logger;\n\nclass LogsCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Logger $logger, array $options): void\n    {\n        $file = $options['file'] ?? 'laravel.log';\n        $this->addCollector(new LogsCollector($file));\n\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/MailCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse DebugBar\\Bridge\\Symfony\\SymfonyMailCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Mail\\Events\\MessageSending;\nuse Illuminate\\Mail\\Events\\MessageSent;\n\nclass MailCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Dispatcher $events, array $options): void\n    {\n        $mailCollector = new SymfonyMailCollector();\n        $this->addCollector($mailCollector);\n\n        $events->listen(function (MessageSent $event) use ($mailCollector): void {\n            $mailCollector->addSymfonyMessage($event->sent->getSymfonySentMessage());\n        });\n\n        if (($options['show_body'] ?? true) || ($options['full_log'] ?? false)) {\n            $mailCollector->showMessageBody();\n        }\n\n        if ($options['timeline'] ?? true) {\n            $timeCollector = $this->debugbar->getTimeCollector();\n\n            $events->listen(MessageSending::class, fn(MessageSending $e) => $timeCollector->startMeasure('Mail: ' . $e->message->getSubject()));\n            $events->listen(MessageSent::class, function (MessageSent $e) use ($timeCollector): void {\n                $name = 'Mail: ' . $e->message->getSubject();\n                if ($timeCollector->hasStartedMeasure($name)) {\n                    $timeCollector->stopMeasure($name);\n                } else {\n                    $timeCollector->addMeasure($name);\n                }\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/MemoryCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse DebugBar\\DataCollector\\MemoryCollector;\n\nclass MemoryCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $memoryCollector = new MemoryCollector();\n        $this->addCollector($memoryCollector);\n        $memoryCollector->setPrecision($options['precision'] ?? 0);\n\n        if (function_exists('memory_reset_peak_usage') && ($options['reset_peak_usage'] ?? false)) {\n            memory_reset_peak_usage();\n        }\n\n        if ($options['with_baseline'] ?? false) {\n            $memoryCollector->resetMemoryBaseline();\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/MessagesCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nclass MessagesCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $messageCollector = $this->debugbar->getMessagesCollector();\n        $this->addCollector($messageCollector);\n\n        if ($options['trace'] ?? true) {\n            $messageCollector->collectFileTrace(true);\n\n            $excludePaths = $options['backtrace_exclude_paths'] ?? [];\n            if ($excludePaths) {\n                $messageCollector->addBacktraceExcludePaths($excludePaths);\n            }\n        }\n\n        if ($options['timeline'] ?? true) {\n            $messageCollector->setTimeDataCollector($this->debugbar->getTimeCollector());\n        }\n\n        if ($options['capture_dumps'] ?? false) {\n            $originalHandler = \\Symfony\\Component\\VarDumper\\VarDumper::setHandler(function ($var) use (&$originalHandler, $messageCollector): void {\n                if ($originalHandler) {\n                    $originalHandler($var);\n                }\n\n                $messageCollector->addMessage($var);\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/ModelsCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse DebugBar\\DataCollector\\ObjectCountCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\n\nclass ModelsCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Dispatcher $events, array $options): void\n    {\n        $modelsCollector = new ObjectCountCollector('models');\n        $this->addCollector($modelsCollector);\n\n        $eventList = ['retrieved', 'created', 'updated', 'deleted'];\n        $modelsCollector->setKeyMap(array_combine($eventList, array_map('ucfirst', $eventList)));\n        $modelsCollector->collectCountSummary(true);\n        foreach ($eventList as $event) {\n            $events->listen(\"eloquent.{$event}: *\", function ($event, $models) use ($modelsCollector): void {\n                $event = explode(': ', $event);\n                $count = count(array_filter($models));\n                $modelsCollector->countClass($event[1], $count, explode('.', $event[0])[1]);\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/PennantCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\PennantCollector;\nuse Illuminate\\Contracts\\Foundation\\Application;\nuse Laravel\\Pennant\\FeatureManager;\n\nclass PennantCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Application $app, array $options): void\n    {\n        if (class_exists(FeatureManager::class) && $app->bound(FeatureManager::class)\n        ) {\n            $this->addCollector(new PennantCollector());\n        }\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/PhpInfoCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse DebugBar\\DataCollector\\PhpInfoCollector;\n\nclass PhpInfoCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $this->addCollector(new PhpInfoCollector());\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/RequestCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\RequestCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Events\\ResponsePrepared;\n\nclass RequestCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Dispatcher $events, Request $request, array $options): void\n    {\n        $sessionHiddens = (array) config('debugbar.options.session.hiddens', []);\n        $sessionMasked = (array) config('debugbar.options.session.masked', []);\n\n        // Legacy hidden values, using array path\n        $hiddens = array_map(function ($value): mixed {\n            if (str_contains($value, '.')) {\n                return substr($value, strrpos($value, '.') + 1);\n            }\n            return $value;\n        }, array_merge((array) ($options['hiddens'] ?? []), $sessionHiddens));\n\n        $masked = array_merge((array) ($options['masked'] ?? []), $sessionMasked);\n\n        $requestCollector = new RequestCollector($request);\n        $requestCollector->addMaskedKeys($hiddens);\n        $requestCollector->addMaskedKeys($masked);\n\n        $this->addCollector($requestCollector);\n\n        $events->listen(ResponsePrepared::class, fn(ResponsePrepared $e) => $requestCollector->setResponse($e->response));\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/RouteCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\RouteCollector;\n\nclass RouteCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(array $options): void\n    {\n        $this->addCollector(new RouteCollector());\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/SessionCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\SessionCollector;\nuse Illuminate\\Http\\Request;\n\nclass SessionCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Request $request, array $options): void\n    {\n        // Legacy hidden values, using array path\n        $hiddens = array_map(function ($value): mixed {\n            if (str_contains($value, '.')) {\n                return substr($value, strrpos($value, '.') + 1);\n            }\n            return $value;\n        }, (array) ($options['hiddens'] ?? []));\n\n        $sessionCollector = new SessionCollector();\n        $sessionCollector->addMaskedKeys($hiddens);\n        $sessionCollector->addMaskedKeys((array) ($options['masked'] ?? []));\n        $this->addCollector($sessionCollector);\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/TimeCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse DebugBar\\DataCollector\\TimeDataCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Contracts\\Foundation\\Application;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Events\\PreparingResponse;\nuse Illuminate\\Routing\\Events\\ResponsePrepared;\nuse Illuminate\\Routing\\Events\\RouteMatched;\nuse Illuminate\\Routing\\Events\\Routing;\n\nclass TimeCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Application $app, Request $request, Dispatcher $events, array $options): void\n    {\n        if ($this->hasCollector('time')) {\n            /** @var TimeDataCollector $timeCollector */\n            $timeCollector = $this['time'];\n        } else {\n            $timeCollector = $this->debugbar->getTimeCollector();\n            $this->addCollector($timeCollector);\n        }\n\n        if ($options['memory_usage'] ?? false) {\n            $timeCollector->showMemoryUsage();\n        }\n\n        $events->listen(Routing::class, fn() => $timeCollector->startMeasure('Routing'));\n        $events->listen(RouteMatched::class, fn() => $timeCollector->stopMeasure('Routing'));\n\n        $events->listen(PreparingResponse::class, fn() => $timeCollector->startMeasure('Preparing Response'));\n        $events->listen(ResponsePrepared::class, fn() => $timeCollector->stopMeasure('Preparing Response'));\n    }\n}\n"
  },
  {
    "path": "src/CollectorProviders/ViewsCollectorProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\CollectorProviders;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\ViewCollector;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\n\nclass ViewsCollectorProvider extends AbstractCollectorProvider\n{\n    public function __invoke(Dispatcher $events, array $options): void\n    {\n        $collectData = $options['data'] ?? false;\n        $excludePaths = $options['exclude_paths'] ?? [];\n        $group = $options['group'] ?? true;\n\n        $viewCollector = new ViewCollector($collectData, $excludePaths, $group);\n\n        if ($options['timeline'] ?? true) {\n            $timeCollector = $this->debugbar->getTimeCollector();\n            $viewCollector->setTimeDataCollector($timeCollector);\n        }\n\n        $this->addCollector($viewCollector);\n        $events->listen(\n            'composing:*',\n            function ($event, $params) use ($viewCollector): void {\n                $viewCollector->addView($params[0]);\n            },\n        );\n    }\n}\n"
  },
  {
    "path": "src/Console/ClearCommand.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Console;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Illuminate\\Console\\Command;\n\nclass ClearCommand extends Command\n{\n    protected $name = 'debugbar:clear';\n    protected $description = 'Clear the Debugbar Storage';\n\n    public function handle(LaravelDebugbar $debugbar): void\n    {\n        $debugbar->boot();\n\n        if ($storage = $debugbar->getStorage()) {\n            try {\n                $storage->clear();\n            } catch (\\InvalidArgumentException $e) {\n                // hide InvalidArgumentException if storage location does not exist\n                if (!str_contains($e->getMessage(), 'does not exist')) {\n                    throw $e;\n                }\n            }\n            $this->info('Debugbar Storage cleared!');\n        } else {\n            $this->error('No Debugbar Storage found..');\n        }\n    }\n}\n"
  },
  {
    "path": "src/Controllers/AssetController.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Controllers;\n\nuse DebugBar\\AssetHandler;\nuse DebugBar\\Bridge\\Symfony\\SymfonyHttpDriver;\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Fruitcake\\LaravelDebugbar\\LaravelHttpDriver;\nuse Fruitcake\\LaravelDebugbar\\Requests\\AssetRequest;\nuse Illuminate\\Http\\Response;\n\nclass AssetController\n{\n    public function getAssets(AssetRequest $request, AssetHandler $assetHandler, LaravelDebugbar $debugbar): Response\n    {\n        $type = $request->validated('type');\n\n        $response = new Response();\n        $driver = $debugbar->getHttpDriver();\n        if ($driver instanceof LaravelHttpDriver || $driver instanceof SymfonyHttpDriver) {\n            $driver->setResponse($response);\n        }\n\n        $assetHandler->handle([\n            'type' => $type,\n        ]);\n\n        return $response;\n    }\n}\n"
  },
  {
    "path": "src/Controllers/CacheController.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Controllers;\n\nuse Fruitcake\\LaravelDebugbar\\Requests\\CacheDeleteRequest;\nuse Illuminate\\Cache\\CacheManager;\n\nclass CacheController\n{\n    /**\n     * Forget a cache key\n     *\n     */\n    public function delete(CacheManager $cache, CacheDeleteRequest $request, string $key): \\Illuminate\\Http\\JsonResponse\n    {\n        if ($tags = $request->validated('tags')) {\n            $cache = $cache->tags($tags);\n        }\n\n        $success = $cache->forget($key);\n\n        return response()->json(compact('success'));\n    }\n}\n"
  },
  {
    "path": "src/Controllers/OpenHandlerController.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Controllers;\n\nuse DebugBar\\Bridge\\Symfony\\SymfonyHttpDriver;\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Fruitcake\\LaravelDebugbar\\LaravelHttpDriver;\nuse Fruitcake\\LaravelDebugbar\\Requests\\OpenHandlerRequest;\nuse Fruitcake\\LaravelDebugbar\\Support\\Clockwork\\Converter;\nuse DebugBar\\OpenHandler;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Response;\n\nclass OpenHandlerController\n{\n    public function handle(OpenHandlerRequest $request, LaravelDebugbar $debugbar, OpenHandler $openHandler): Response|JsonResponse\n    {\n        if ($request->validated('op') !== 'get' && !$debugbar->isStorageOpen($request)) {\n            return new JsonResponse([\n                [\n                    'datetime' => date(\"Y-m-d H:i:s\"),\n                    'id' => null,\n                    'ip' => $request->getClientIp(),\n                    'method' => 'ERROR',\n                    'uri' => '!! To enable public access to previous requests, set debugbar.storage.open to true in your config, or enable DEBUGBAR_OPEN_STORAGE if you did not publish the config. !!',\n                    'utime' => microtime(true),\n                ],\n            ]);\n        }\n\n        $response = new Response();\n        $driver = $debugbar->getHttpDriver();\n        if ($driver instanceof LaravelHttpDriver || $driver instanceof SymfonyHttpDriver) {\n            $driver->setResponse($response);\n        }\n\n        $openHandler->handle($request->input());\n\n        return $response;\n    }\n\n    /**\n     * Return Clockwork output\n     *\n     * @throws \\DebugBar\\DebugBarException\n     */\n    public function clockwork(OpenHandler $openHandler, $id): \\Illuminate\\Http\\JsonResponse\n    {\n        $request = [\n            'op' => 'get',\n            'id' => $id,\n        ];\n\n        $data = $openHandler->handle($request, false, false);\n\n        // Convert to Clockwork\n        $converter = new Converter();\n        $output = $converter->convert(json_decode($data, true));\n\n        return response()->json($output);\n    }\n}\n"
  },
  {
    "path": "src/Controllers/QueriesController.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Controllers;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Fruitcake\\LaravelDebugbar\\Requests\\QueriesExplainRequest;\nuse Fruitcake\\LaravelDebugbar\\Support\\Explain;\nuse Exception;\n\nclass QueriesController\n{\n    /**\n     * Generate explain data for query.\n     */\n    public function explain(QueriesExplainRequest $request, LaravelDebugbar $debugbar, Explain $explain): \\Illuminate\\Http\\JsonResponse\n    {\n        $validated = $request->validated();\n\n        if (($validated['mode'] ?? null) === 'result') {\n\n            if (!config('debugbar.options.db.show_query_result', false) || !$debugbar->isStorageOpen($request)) {\n                return response()->json([\n                    'success' => false,\n                    'message' => 'Query result is currently disabled in the Debugbar.',\n                ], 400);\n            }\n\n            return response()->json([\n                'success' => true,\n                'data' => $explain->generateSelectResult($validated['connection'], $validated['query'], $validated['bindings'] ?? null, $validated['hash'], $validated['format'] ?? null),\n            ]);\n        }\n\n        if (!config('debugbar.options.db.explain.enabled', false) || !$debugbar->isStorageOpen($request)) {\n            return response()->json([\n                'success' => false,\n                'message' => 'EXPLAIN is currently disabled in the Debugbar.',\n            ], 400);\n        }\n\n        try {\n            if (($validated['mode'] ?? null) === 'visual') {\n                return response()->json([\n                    'success' => true,\n                    'data' => $explain->generateVisualExplain($validated['connection'], $validated['query'], $validated['bindings'] ?? null, $validated['hash']),\n                ]);\n            }\n\n            return response()->json([\n                'success' => true,\n                'data' => $explain->generateRawExplain($validated['connection'], $validated['query'], $validated['bindings'] ?? null, $validated['hash']),\n                'visual' => $explain->isVisualExplainSupported($validated['connection']) ? [\n                    'confirm' => $explain->confirmVisualExplain($validated['connection']),\n                ] : null,\n            ]);\n        } catch (Exception $e) {\n            return response()->json([\n                'success' => false,\n                'message' => $e->getMessage(),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Controllers/TelescopeController.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Controllers;\n\nuse Laravel\\Telescope\\Contracts\\EntriesRepository;\nuse Laravel\\Telescope\\Storage\\EntryQueryOptions;\n\nclass TelescopeController\n{\n    public function show(EntriesRepository $storage, $uuid)\n    {\n        $entry = $storage->find($uuid);\n        $result = $storage->get('request', (new EntryQueryOptions())->batchId($entry->batchId))->first();\n\n        return redirect(config('telescope.domain') . '/' . config('telescope.path') . '/requests/' . $result->id);\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/CacheCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\AssetProvider;\nuse DebugBar\\DataCollector\\HasTimeDataCollector;\nuse DebugBar\\DataCollector\\Resettable;\nuse DebugBar\\DataCollector\\TimeDataCollector;\nuse Illuminate\\Cache\\Events\\{CacheEvent,\n    CacheFailedOver,\n    CacheFlushed,\n    CacheFlushFailed,\n    CacheFlushing,\n    CacheHit,\n    CacheMissed,\n    ForgettingKey,\n    KeyForgetFailed,\n    KeyForgotten,\n    KeyWriteFailed,\n    KeyWritten,\n    RetrievingKey,\n    WritingKey};\nuse Illuminate\\Support\\Facades\\Route;\nuse Throwable;\n\nclass CacheCollector extends TimeDataCollector implements AssetProvider, Resettable\n{\n    use HasTimeDataCollector;\n\n    protected bool $collectValues = false;\n\n    protected array $eventStarts = [];\n\n    protected array $classMap = [\n        CacheHit::class => ['hit', RetrievingKey::class],\n        CacheMissed::class => ['missed', RetrievingKey::class],\n        CacheFlushed::class => ['flushed', CacheFlushing::class],\n        CacheFlushFailed::class => ['flush_failed', CacheFlushing::class],\n        KeyWritten::class => ['written', WritingKey::class],\n        KeyWriteFailed::class => ['write_failed', WritingKey::class],\n        KeyForgotten::class => ['forgotten', ForgettingKey::class],\n        KeyForgetFailed::class => ['forget_failed', ForgettingKey::class],\n    ];\n\n    public function __construct(float $requestStartTime, bool $collectValues)\n    {\n        parent::__construct($requestStartTime);\n\n        $this->collectValues = $collectValues;\n        $this->memoryMeasure = true;\n    }\n\n    public function getCacheEvents(): array\n    {\n        return $this->classMap;\n    }\n\n    public function onCacheEvent(CacheEvent|CacheFailedOver|CacheFlushed|CacheFlushFailed|CacheFlushing $event): void\n    {\n        $class = get_class($event);\n        $params = get_object_vars($event);\n        $label = $this->classMap[$class][0];\n\n        if (isset($params['value'])) {\n            if (!($params['value'] instanceof \\Closure || is_resource($params['value']))) {\n                try {\n                    $params['memoryUsage'] = strlen(serialize($params['value'])) * 8;\n                } catch (Throwable) {\n                }\n            }\n\n            if (!$this->collectValues) {\n                unset($params['value']);\n            }\n        }\n\n        $time = microtime(true);\n        $startHashKey = $this->getEventHash($this->classMap[$class][1] ?? '', $params);\n        $startTime = $this->eventStarts[$startHashKey] ?? $time;\n\n        $this->addMeasure($label . \"\\t\" . ($params['key'] ?? ''), $startTime, $time, $params);\n\n        if ($this->hasTimeDataCollector()) {\n            $this->addTimeMeasure('Cache ' . $label . \"\\t\" . ($params['key'] ?? ''), $startTime, $time);\n        }\n\n        if (isset($event->key) && in_array($label, ['hit', 'written'], true) && Route::has('debugbar.cache.delete')) {\n            $measureIndex = array_key_last($this->measures);\n            $this->measures[$measureIndex]['delete_url'] = url()->signedRoute('debugbar.cache.delete', [\n                'key' => urlencode((string) $event->key),\n                'tags' => $params['tags'] ?? [],\n            ]);\n        }\n    }\n\n    public function onStartCacheEvent(mixed $event): void\n    {\n        $startHashKey = $this->getEventHash(get_class($event), get_object_vars($event));\n        $this->eventStarts[$startHashKey] = microtime(true);\n    }\n\n    protected function getEventHash(string $class, array $params): string\n    {\n        unset($params['value']);\n\n        return $class . ':' . substr(hash('sha256', json_encode($params)), 0, 12);\n    }\n\n    public function collect(): array\n    {\n        $data = parent::collect();\n        $data['nb_measures'] = $data['count'] = count($data['measures']);\n\n        return $data;\n    }\n\n    public function reset(): void\n    {\n        parent::reset();\n        $this->eventStarts = [];\n    }\n\n    public function getName(): string\n    {\n        return 'cache';\n    }\n\n    public function getWidgets(): array\n    {\n        return [\n            'cache' => [\n                'icon' => 'clipboard-text',\n                'widget' => 'PhpDebugBar.Widgets.LaravelCacheWidget',\n                'map' => 'cache',\n                'default' => '{}',\n            ],\n            'cache:badge' => [\n                'map' => 'cache.nb_measures',\n                'default' => 'null',\n            ],\n        ];\n    }\n\n    public function getAssets(): array\n    {\n        return [\n            'js' => __DIR__ . '/../../resources/cache/widget.js',\n        ];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/ConfigCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nclass ConfigCollector extends \\DebugBar\\DataCollector\\ConfigCollector\n{\n    public function collect(): array\n    {\n        // Gather data on collect\n        $this->setData(config()->all());\n\n        return parent::collect();\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/EventCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\TimeDataCollector;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Str;\n\nclass EventCollector extends TimeDataCollector\n{\n    protected array $excludedEvents = [];\n\n    protected bool $collectValues = false;\n\n    protected bool $collectListeners = false;\n\n    public function setCollectValues(bool $collectValues = true): void\n    {\n        $this->collectValues = $collectValues;\n    }\n\n    public function setCollectListeners(bool $collectListeners = true): void\n    {\n        $this->collectListeners = $collectListeners;\n    }\n\n    public function setExcludedEvents(array $excludedEvents): void\n    {\n        $this->excludedEvents = $excludedEvents;\n    }\n\n    public function onWildcardEvent(?string $name = null, array $data = []): void\n    {\n        $currentTime = microtime(true);\n        $eventClass = explode(':', $name)[0];\n\n        foreach ($this->excludedEvents as $excludedEvent) {\n            if (Str::is($excludedEvent, $eventClass)) {\n                return;\n            }\n        }\n\n        if (! $this->collectValues) {\n            $this->addMeasure($name, $currentTime, $currentTime, [], null, $eventClass);\n\n            return;\n        }\n\n        $params = $data;\n\n        if ($this->collectListeners) {\n            $params['listeners'] = Event::getListeners($name);\n        }\n\n        $this->addMeasure($name, $currentTime, $currentTime, $params, null, $eventClass);\n    }\n\n    public function collect(): array\n    {\n        $data = parent::collect();\n        $data['nb_measures'] = $data['count'] = count($data['measures']);\n\n        return $data;\n    }\n\n    public function getName(): string\n    {\n        return 'event';\n    }\n\n    public function getWidgets(): array\n    {\n        return [\n            \"events\" => [\n                \"icon\" => \"subtask\",\n                \"widget\" => \"PhpDebugBar.Widgets.TimelineWidget\",\n                \"map\" => \"event\",\n                \"default\" => \"{}\",\n            ],\n            'events:badge' => [\n                'map' => 'event.nb_measures',\n                'default' => 0,\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/GateCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\MessagesCollector;\nuse DebugBar\\DataCollector\\Resettable;\nuse Illuminate\\Auth\\Access\\Response;\nuse Illuminate\\Contracts\\Auth\\Access\\Gate;\nuse Illuminate\\Contracts\\Auth\\Authenticatable;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Str;\n\n/**\n * Collector for Laravel's gate checks\n */\nclass GateCollector extends MessagesCollector implements Resettable\n{\n    protected array $reflection = [];\n    protected int $backtraceLimit = 20;\n\n    public function addCheck(mixed $user, string|int $ability, mixed $result, array $arguments = []): void\n    {\n        $userKey = 'user';\n        $userId = null;\n\n        if ($user) {\n            $userKey = Str::snake(class_basename($user));\n            $userId = $user instanceof Authenticatable ? $user->getAuthIdentifier() : $user->getKey();\n        }\n\n        $label = $result ? 'success' : 'error';\n\n        if ($result instanceof Response) {\n            $label = $result->allowed() ? 'success' : 'error';\n        }\n\n        $target = null;\n        if (isset($arguments[0])) {\n            if ($arguments[0] instanceof Model) {\n                $model = $arguments[0];\n                if ($model->getKeyName() && isset($model[$model->getKeyName()])) {\n                    $target = get_class($model) . '(' . $model->getKeyName() . '=' . $model->getKey() . ')';\n                } else {\n                    $target = get_class($model);\n                }\n                $arguments[0] = $target;\n            } elseif (is_string($arguments[0])) {\n                $target = $arguments[0];\n            }\n        }\n\n        $this->addMessage(\"{ability} {target}\", $label, [\n            'ability' => $ability,\n            'target' => $target,\n            'result' => $result,\n            $userKey => $userId,\n            'arguments' => $arguments,\n        ]);\n    }\n\n    protected function getStackTraceItem(array $stacktrace): array\n    {\n        foreach ($stacktrace as $i => $trace) {\n            if (!isset($trace['file'])) {\n                continue;\n            }\n\n            if (str_ends_with($trace['file'], 'Illuminate/Routing/ControllerDispatcher.php')) {\n                $trace = $this->findControllerFromDispatcher($trace);\n            } elseif (str_starts_with($trace['file'], storage_path())) {\n                $hash = pathinfo($trace['file'], PATHINFO_FILENAME);\n\n                if ($file = $this->findViewFromHash($hash)) {\n                    $trace['file'] = $file;\n                }\n            }\n\n            if ($this->fileIsInExcludedPath($trace['file'])) {\n                continue;\n            }\n\n            return $trace;\n        }\n\n        return $stacktrace[0];\n    }\n\n    /**\n     * Find the route action file\n     */\n    protected function findControllerFromDispatcher(array $trace): array\n    {\n        /** @var \\Closure|string|array $action */\n        $action = app(Router::class)->current()->getAction('uses');\n\n        if (is_string($action)) {\n            [$controller, $method] = explode('@', $action);\n\n            $reflection = new \\ReflectionMethod($controller, $method);\n            $trace['file'] = $reflection->getFileName();\n            $trace['line'] = $reflection->getStartLine();\n        } elseif ($action instanceof \\Closure) {\n            $reflection = new \\ReflectionFunction($action);\n            $trace['file'] = $reflection->getFileName();\n            $trace['line'] = $reflection->getStartLine();\n        }\n\n        return $trace;\n    }\n\n    /**\n     * Find the template name from the hash.\n     */\n    protected function findViewFromHash(string $hash): ?string\n    {\n        $finder = app('view')->getFinder();\n\n        if (isset($this->reflection['viewfinderViews'])) {\n            $property = $this->reflection['viewfinderViews'];\n        } else {\n            $reflection = new \\ReflectionClass($finder);\n            $property = $reflection->getProperty('views');\n            $this->reflection['viewfinderViews'] = $property;\n        }\n\n        $xxh128Exists = in_array('xxh128', hash_algos(), true);\n\n        foreach ($property->getValue($finder) as $name => $path) {\n            if (($xxh128Exists && hash('xxh128', 'v2' . $path) === $hash) || sha1('v2' . $path) === $hash) {\n                return $path;\n            }\n        }\n\n        return null;\n    }\n\n    public function reset(): void\n    {\n        $this->reflection = [];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/HttpClientCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\HttpCollector;\nuse Illuminate\\Http\\Client\\Events\\ConnectionFailed;\nuse Illuminate\\Http\\Client\\Events\\ResponseReceived;\nuse Illuminate\\Http\\Client\\Response;\nuse Illuminate\\Support\\Str;\n\nclass HttpClientCollector extends HttpCollector\n{\n    public function addEvent(ResponseReceived|ConnectionFailed $event): void\n    {\n        $headers =  $this->hideMaskedValues($event->request->headers());\n\n        if ($event->request->isMultipart()) {\n            $requestData = '[MULTIPART]';\n        } else {\n            $requestData = $this->hideMaskedValues($event->request->data());\n        }\n\n        $status = null;\n        $duration = null;\n        $details = [\n            'request_data' => $requestData,\n            'request_headers' => $headers,\n        ];\n\n        if ($event instanceof ResponseReceived) {\n            $status = $event->response->status();\n            $duration = $event->response->transferStats?->getTransferTime();\n            $details['response'] = $this->parseResponse($event->response);\n            $details['response_headers'] = $this->hideMaskedValues($event->response->headers());\n        }\n\n        // @phpstan-ignore-next-line because exception might not be set in Laravel 10\n        if ($event instanceof ConnectionFailed && isset($event->exception)) {\n            $details['exception'] = $event->exception;\n        }\n\n        $this->addRequest(\n            $event->request->method(),\n            $event->request->url(),\n            $status,\n            $duration,\n            $details\n        );\n    }\n\n    protected function parseResponse(Response $response): string|array\n    {\n        if ($response->redirect()) {\n            return 'Redirect: ' . $response->header('Location');\n        }\n\n        // Check if stream\n        $stream = $response->toPsrResponse()->getBody();\n        if (! $stream->isSeekable()) {\n            return '[STREAM]';\n        }\n\n        $content = $response->body();\n        $stream->rewind();\n\n        if ($content === '') {\n            return '[EMPTY]';\n        }\n\n        $json = json_decode($content, true);\n        if ($json) {\n            return $json;\n        }\n\n        return Str::limit($content, 1024);\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/InertiaCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\TemplateCollector;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n * Collector for Ineratia.\n */\nclass InertiaCollector extends TemplateCollector\n{\n    public function addFromView(\\Illuminate\\View\\View $view): void\n    {\n        $data = $view->getData();\n        if (isset($data['page']['component'])) {\n            $this->addInertiaTemplate($data['page'], $view->getName(), $view->getPath());\n        }\n    }\n\n    public function addFromResponse(Response $response): void\n    {\n        if (!$response->headers->has('X-Inertia') || $response->headers->get('Content-Type') !== 'application/json') {\n            return;\n        }\n\n        $content = $response->getContent();\n        if (is_string($content)) {\n            $content = json_decode($content, true);\n        }\n\n        if (is_array($content)) {\n            $this->addInertiaTemplate($content);\n        }\n    }\n\n    private function addInertiaTemplate(array $page, ?string $name = null, ?string $path = null): void\n    {\n        if (!isset($page['component'])) {\n            return;\n        }\n\n        $type = '';\n        $component = $page['component'];\n        $props = $page['props'] ?? [];\n\n        $pagePath = config('debugbar.options.inertia.pages', 'js/Pages');\n        if ($files = glob(resource_path($pagePath . '/' . $name . '.*'))) {\n            $path = $files[0];\n            $type = pathinfo($path, PATHINFO_EXTENSION);\n\n            if (in_array($type, ['js', 'jsx'], true)) {\n                $type = 'react';\n            }\n        }\n\n        $this->addTemplate($component, $props, $type, $path);\n    }\n\n    public function collect(): array\n    {\n        $data = parent::collect();\n\n        $data['sentence'] = 'Inertia page' . ($data['nb_templates'] !== 1 ? 's' : '');\n\n        return $data;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'inertia';\n    }\n\n    public function getWidgets(): array\n    {\n        $widgets = parent::getWidgets();\n        $widgets[$this->getName()]['icon'] = 'brand-inertia';\n        return $widgets;\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/LaravelCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\Renderable;\nuse Illuminate\\Support\\Str;\n\nclass LaravelCollector extends DataCollector implements Renderable\n{\n    /**\n     * {@inheritDoc}\n     */\n    public function collect(): array\n    {\n        $app = app();\n        return [\n            \"version\" => Str::of($app->version())->explode('.')->first() . '.x',\n            'tooltip' => array_filter([\n                'Laravel Version' => $app->version(),\n                'PHP Version' => phpversion(),\n                'Environment' => $app->environment(),\n                'Debug Mode' => config('app.debug') ? 'Enabled' : 'Disabled',\n                'URL' => Str::of(config('app.url'))->replace(['http://', 'https://'], ''),\n                'Timezone' => config('app.timezone'),\n                'Locale' => config('app.locale'),\n                'Cached' => implode(', ', array_filter([\n                    $app->configurationIsCached() ? 'Configs' : null,\n                    $app->routesAreCached() ? 'Routes' : null,\n                    $app->eventsAreCached() ? 'Events' : null,\n                ])),\n            ]),\n        ];\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'laravel';\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getWidgets(): array\n    {\n        return [\n            \"version\" => [\n                \"icon\" => \"brand-laravel\",\n                \"map\" => \"laravel.version\",\n                \"default\" => \"\",\n            ],\n            \"version:tooltip\" => [\n                \"map\" => \"laravel.tooltip\",\n                \"default\" => \"{}\",\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/LivewireCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\TemplateCollector;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Str;\nuse Livewire\\Component;\n\n/**\n * Collector for Models.\n */\nclass LivewireCollector extends TemplateCollector\n{\n    public function addLivewireComponent(Component $component, ?Request $request = null): void\n    {\n        $id = $component->getId();\n        $data = $component->all();\n\n        if ((new \\ReflectionClass($component))->isAnonymous()) {\n            $key = Str::ascii($component->getName()) . ' #' . $id;\n        } else {\n            $key = get_class($component) . ' ' . $component->getName() . ' #' . $id;\n        }\n\n        if ($request && $request->request->get('id') === $id) {\n            $data['#oldData'] = $request->request->get('data');\n            $data['#actionQueue'] = $request->request->get('actionQueue');\n        }\n\n        $data['#name'] = $component->getName();\n        $data['#component'] = get_class($component);\n        $data['#id'] = $id;\n\n        $path = (new \\ReflectionClass($component))->getFileName();\n\n        $this->addTemplate($key, $data, 'livewire', $path);\n    }\n\n    /**\n     * @return array{nb_templates: int, templates: array<string, array{name: string, param_count: int, params: array<string, mixed>, type: string, xdebug_link?: string}>, sentence: string}\n     */\n    public function collect(): array\n    {\n        $data = parent::collect();\n\n        $data['sentence'] = 'Livewire component' . ($data['nb_templates'] !== 1 ? 's' : '');\n\n        return $data;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'livewire';\n    }\n\n    /**\n     * @return array<string, array{icon: string, widget: string, map: string, default: string}>\n     */\n    public function getWidgets(): array\n    {\n        $widgets = parent::getWidgets();\n        $widgets[$this->getName()]['icon'] = 'brand-livewire';\n        return $widgets;\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/LogsCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\MessagesCollector;\nuse Psr\\Log\\LogLevel;\nuse ReflectionClass;\n\nclass LogsCollector extends MessagesCollector\n{\n    protected $lines = 124;\n\n    protected array $paths = [];\n\n    public function __construct(string|array|null $path = null, string $name = 'logs')\n    {\n        parent::__construct($name);\n\n        if (is_array($path) && count($path) > 0) {\n            $this->paths = $path;\n        } elseif (is_string($path)) {\n            $this->paths = [$path];\n        } else {\n            $this->paths = [\n                storage_path('logs/laravel.log'),\n                storage_path('logs/laravel-' . date('Y-m-d') . '.log'), // for daily driver\n            ];\n        }\n    }\n\n    public function collect(): array\n    {\n        foreach ($this->paths as $logPath) {\n            $this->getStorageLogs($logPath);\n        }\n\n        return parent::collect();\n    }\n\n    /**\n     * get logs apache in app/storage/logs\n     * only 24 last of current day\n     */\n    public function getStorageLogs(string $path): void\n    {\n        if (!file_exists($path)) {\n            return;\n        }\n\n        //Load the latest lines, guessing about 15x the number of log entries (for stack traces etc)\n        $file = implode(\"\", $this->tailFile($path, $this->lines));\n        $basename = basename($path);\n\n        foreach ($this->getLogs($file) as $log) {\n            $this->messages[] = [\n                'message' => trim($log['header'] . $log['stack']),\n                'label' => $log['level'],\n                'time' => substr($log['header'], 1, 19),\n                'collector' => $basename,\n                'is_string' => false,\n            ];\n        }\n    }\n\n    /**\n     * By Ain Tohvri (ain)\n     * http://tekkie.flashbit.net/php/tail-functionality-in-php\n     */\n    protected function tailFile(string $file, int $lines): array\n    {\n        $handle = fopen($file, \"r\");\n        $linecounter = $lines;\n        $pos = -2;\n        $beginning = false;\n        $text = [];\n        try {\n            while ($linecounter > 0) {\n                $t = \" \";\n                while ($t !== \"\\n\") {\n                    if (fseek($handle, $pos, SEEK_END) === -1) {\n                        $beginning = true;\n                        break;\n                    }\n                    $t = fgetc($handle);\n                    $pos--;\n                }\n                $linecounter--;\n                if ($beginning) {\n                    rewind($handle);\n                }\n                $text[$lines - $linecounter - 1] = fgets($handle);\n                if ($beginning) {\n                    break;\n                }\n            }\n        } finally {\n            fclose($handle);\n        }\n        return array_reverse($text);\n    }\n\n    /**\n     * Search a string for log entries\n     * Based on https://github.com/mikemand/logviewer/blob/master/src/Kmd/Logviewer/Logviewer.php by mikemand\n     */\n    public function getLogs(string $file): array\n    {\n        $pattern = \"/\\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\](?:(?!\\[\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\])[\\s\\S])*/\";\n\n        $log_levels = $this->getLevels();\n\n        // There has GOT to be a better way of doing this...\n        preg_match_all($pattern, $file, $headings);\n        $log_data = preg_split($pattern, $file) ?: [];\n\n        $log = [];\n        foreach ($headings as $h) {\n            for ($i = 0, $j = count($h); $i < $j; $i++) {\n                foreach ($log_levels as $ll) {\n                    if (str_contains(strtolower($h[$i]), strtolower('.' . $ll))) {\n                        $log[] = ['level' => $ll, 'header' => $h[$i], 'stack' => $log_data[$i] ?? ''];\n                    }\n                }\n            }\n        }\n\n        return $log;\n    }\n\n    public function getMessages(): array\n    {\n        return array_reverse(parent::getMessages());\n    }\n\n    /**\n     * Get the log levels from psr/log.\n     * Based on https://github.com/mikemand/logviewer/blob/master/src/Kmd/Logviewer/Logviewer.php by mikemand\n     */\n    public function getLevels(): array\n    {\n        $class = new ReflectionClass(new LogLevel());\n        return $class->getConstants();\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/MultiAuthCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\Renderable;\nuse Illuminate\\Contracts\\Auth\\Authenticatable;\nuse Illuminate\\Support\\Str;\nuse Illuminate\\Contracts\\Support\\Arrayable;\n\n/**\n * Collector for Laravel's Auth provider\n */\nclass MultiAuthCollector extends DataCollector implements Renderable\n{\n    protected array $guards = [];\n\n    /** @var bool */\n    protected $showName = false;\n\n    /** @var bool */\n    protected $showGuardsData = true;\n\n    public function __construct(array $guards = [])\n    {\n        $this->guards = $guards;\n    }\n\n    /**\n     * Set to show the users name/email\n     */\n    public function setShowName(bool $showName): void\n    {\n        $this->showName = $showName;\n    }\n\n    /**\n     * Set to hide the guards tab, and show only name\n     */\n    public function setShowGuardsData(bool $showGuardsData): void\n    {\n        $this->showGuardsData = $showGuardsData;\n    }\n\n    /**\n     * @{inheritDoc}\n     */\n    public function collect(): array\n    {\n        $data = [\n            'guards' => [],\n        ];\n        $names = '';\n\n        foreach ($this->guards as $guardName => $config) {\n            try {\n                $guard = auth()->guard($guardName);\n                if ($guard->hasUser()) {\n                    $user = $guard->user();\n\n                    if (!is_null($user)) {\n                        $data['guards'][$guardName] = $this->getUserInformation($user);\n                        $names .= $guardName . \": \" . $data['guards'][$guardName]['name'] . ', ';\n                    }\n                } else {\n                    $data['guards'][$guardName] = null;\n                }\n            } catch (\\Exception $e) {\n                continue;\n            }\n        }\n\n        foreach ($data['guards'] as $key => $var) {\n            $data['guards'][$key] = $this->getDataFormatter()->formatVar($var);\n        }\n\n        $data['names'] = rtrim($names, ', ');\n        if (!$this->showGuardsData) {\n            unset($data['guards']);\n        }\n\n        return $data;\n    }\n\n    /**\n     * Get displayed user information\n     */\n    protected function getUserInformation(mixed $user = null): array\n    {\n        // Defaults\n        if (is_null($user)) {\n            return [\n                'name' => 'Guest',\n                'user' => ['guest' => true],\n            ];\n        }\n\n        // The default auth identifer is the ID number, which isn't all that\n        // useful. Try username, email and name.\n        $identifier = $user instanceof Authenticatable ? $user->getAuthIdentifier() : $user->getKey();\n        if (is_numeric($identifier) || Str::isUuid($identifier) || Str::isUlid($identifier)) {\n            try {\n                if (isset($user->username)) {\n                    $identifier = $user->username;\n                } elseif (isset($user->email)) {\n                    $identifier = $user->email;\n                } elseif (isset($user->name)) {\n                    $identifier = Str::limit($user->name, 24);\n                }\n            } catch (\\Throwable $e) {\n            }\n        }\n\n        return [\n            'name' => $identifier,\n            'user' => $user instanceof Arrayable ? $user->toArray() : $user,\n        ];\n    }\n\n    /**\n     * @{inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'auth';\n    }\n\n    /**\n     * @{inheritDoc}\n     */\n    public function getWidgets(): array\n    {\n        $widgets = [];\n\n        if ($this->showGuardsData) {\n            $widget = match (true) {\n                $this->isJsonVarDumperUsed() => \"PhpDebugBar.Widgets.JsonVariableListWidget\",\n                $this->isHtmlVarDumperUsed() => \"PhpDebugBar.Widgets.HtmlVariableListWidget\",\n                default => \"PhpDebugBar.Widgets.VariableListWidget\",\n            };\n            $widgets[\"auth\"] = [\n                \"icon\" => \"lock\",\n                \"widget\" => $widget,\n                \"map\" => \"auth.guards\",\n                \"default\" => \"{}\",\n            ];\n        }\n\n        if ($this->showName) {\n            $widgets['auth.name'] = [\n                'icon' => 'user',\n                'tooltip' => 'Auth status',\n                'map' => 'auth.names',\n                'default' => '',\n            ];\n        }\n\n        return $widgets;\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/PennantCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\DataCollectorInterface;\nuse DebugBar\\DataCollector\\Renderable;\nuse Laravel\\Pennant\\Feature;\n\nclass PennantCollector extends DataCollector implements DataCollectorInterface, Renderable\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function collect(): array\n    {\n        return Feature::all();\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'pennant';\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getWidgets(): array\n    {\n        return [\n            \"pennant\" => [\n                \"icon\" => \"flag\",\n                \"widget\" => \"PhpDebugBar.Widgets.VariableListWidget\",\n                \"map\" => \"pennant\",\n                \"default\" => \"{}\",\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/QueryCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\Resettable;\nuse Fruitcake\\LaravelDebugbar\\Support\\Explain;\nuse DebugBar\\DataCollector\\AssetProvider;\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\HasTimeDataCollector;\nuse DebugBar\\DataCollector\\Renderable;\nuse DebugBar\\DataFormatter\\QueryFormatter;\nuse Illuminate\\Database\\Events\\QueryExecuted;\nuse Illuminate\\Database\\Query\\Grammars\\Grammar;\nuse Illuminate\\Support\\Str;\n\n/**\n * Collects data about SQL statements executed with PDO\n */\nclass QueryCollector extends DataCollector implements Renderable, AssetProvider, Resettable\n{\n    use HasTimeDataCollector;\n\n    protected array $queries = [];\n    protected int $queryCount = 0;\n    protected int $transactionEventsCount = 0;\n    protected int $infoStatements = 0;\n    protected ?int $softLimit = null;\n    protected ?int $hardLimit = null;\n    protected ?int $lastMemoryUsage = null;\n    protected bool|int $findSource = false;\n    protected array $middleware = [];\n    protected bool $explainQuery = false;\n    protected bool $showQueryResult = false;\n    protected array $reflection = [];\n    protected array $excludePaths = [];\n    protected array $backtraceExcludePaths = [\n        '/vendor/laravel/framework/src/Illuminate/Support',\n        '/vendor/laravel/framework/src/Illuminate/Database',\n        '/vendor/laravel/framework/src/Illuminate/Events',\n        '/vendor/laravel/framework/src/Illuminate/Collections',\n        '/vendor/october/rain',\n        '/vendor/barryvdh/laravel-debugbar',\n        '/vendor/fruitcake/laravel-debugbar',\n    ];\n\n    protected ?QueryFormatter $queryFormatter = null;\n    protected bool $renderSqlWithParams = false;\n    protected bool $durationBackground = false;\n    protected ?float $slowThreshold = null;\n\n    public function getQueryFormatter(): QueryFormatter\n    {\n        if ($this->queryFormatter === null) {\n            $this->queryFormatter = new QueryFormatter();\n        }\n        return $this->queryFormatter;\n    }\n\n    /**\n     * @param int|null $softLimit After the soft limit, no parameters/backtrace are captured\n     * @param int|null $hardLimit After the hard limit, queries are ignored\n     */\n    public function setLimits(?int $softLimit, ?int $hardLimit): void\n    {\n        $this->softLimit = $softLimit;\n        $this->hardLimit = $hardLimit;\n    }\n\n    /**\n     * Renders the SQL of traced statements with params embedded\n     */\n    public function setRenderSqlWithParams(bool $enabled = true): void\n    {\n        $this->renderSqlWithParams = $enabled;\n    }\n\n    /**\n     * Enable/disable finding the source\n     */\n    public function setFindSource(bool|int $value, array $middleware): void\n    {\n        $this->findSource = $value;\n        $this->middleware = $middleware;\n    }\n\n    public function mergeExcludePaths(array $excludePaths): void\n    {\n        $this->excludePaths = array_merge($this->excludePaths, $excludePaths);\n    }\n\n    /**\n     * Set additional paths to exclude from the backtrace\n     */\n    public function mergeBacktraceExcludePaths(array $excludePaths): void\n    {\n        $this->backtraceExcludePaths = array_merge($this->backtraceExcludePaths, $excludePaths);\n    }\n\n    /**\n     * Enable/disable the shaded duration background on queries\n     */\n    public function setDurationBackground(bool $enabled): void\n    {\n        $this->durationBackground = $enabled;\n    }\n\n    /**\n     * Highlights queries that exceed the threshold\n     *\n     * @param int|float $threshold miliseconds value\n     */\n    public function setSlowThreshold(int|float $threshold): void\n    {\n        $this->slowThreshold = $threshold / 1000;\n    }\n\n    public function isSqlRenderedWithParams(): bool\n    {\n        return $this->renderSqlWithParams;\n    }\n\n    /**\n     * Enable/disable the EXPLAIN queries\n     *\n     * @deprecated use setExplainQuery()\n     */\n    public function setExplainSource(bool $enabled): void\n    {\n        $this->setExplainQuery($enabled);\n    }\n\n    /**\n     * Enable/disable the EXPLAIN queries\n     */\n    public function setExplainQuery(bool $enabled): void\n    {\n        $this->explainQuery = $enabled;\n    }\n\n    /**\n     * Enable/disable the EXPLAIN queries\n     */\n    public function setShowQueryResult(bool $enabled): void\n    {\n        $this->showQueryResult = $enabled;\n    }\n\n    public function startMemoryUsage(): void\n    {\n        $this->lastMemoryUsage = memory_get_usage(false);\n    }\n\n    public function addQuery(QueryExecuted $query): void\n    {\n        $this->queryCount++;\n\n        if ($this->hardLimit && $this->queryCount > $this->hardLimit) {\n            return;\n        }\n\n        $limited = $this->softLimit && $this->queryCount > $this->softLimit;\n\n        $sql = $query->sql;\n        $time = $query->time / 1000;\n        $endTime = microtime(true);\n        $startTime = $endTime - $time;\n\n        $source = [];\n\n        if (!$limited && $this->findSource) {\n            try {\n                $source = $this->findSource();\n            } catch (\\Exception $e) {\n            }\n        }\n\n        $bindings = match (true) {\n            $limited && filled($query->bindings) => null,\n            default => $query->connection->prepareBindings($query->bindings),\n        };\n\n        $this->queries[] = [\n            'query' => $sql,\n            'type' => 'query',\n            'bindings' => $bindings,\n            'start' => $startTime,\n            'time' => $time,\n            'memory' => $this->lastMemoryUsage ? memory_get_usage(false) - $this->lastMemoryUsage : 0,\n            'source' => $source,\n            'connection' => $query->connection,\n            'driver' => $query->connection->getConfig('driver'),\n        ];\n\n        if ($this->hasTimeDataCollector()) {\n            $this->addTimeMeasure(Str::limit($sql, 100), $startTime, $endTime, [], 'Database Query');\n        }\n    }\n\n    /**\n     * Use a backtrace to search for the origins of the query.\n     */\n    protected function findSource(): array\n    {\n        $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT, app('config')->get('debugbar.debug_backtrace_limit', 50));\n\n        $sources = [];\n\n        foreach ($stack as $index => $trace) {\n            $sources[] = $this->parseTrace($index, $trace);\n        }\n\n        return array_slice(array_filter($sources), 0, is_int($this->findSource) ? $this->findSource : 5);\n    }\n\n    /**\n     * Parse a trace element from the backtrace stack.\n     */\n    protected function parseTrace(int $index, array $trace): object|bool\n    {\n        $frame = (object) [\n            'index' => $index,\n            'namespace' => null,\n            'name' => null,\n            'file' => null,\n            'line' => $trace['line'] ?? '1',\n        ];\n\n        if (isset($trace['function']) && $trace['function'] === 'substituteBindings') {\n            $frame->name = 'Route binding';\n\n            return $frame;\n        }\n\n        if (\n            isset($trace['class'])\n            && isset($trace['file'])\n            && !$this->fileIsInExcludedPath($trace['file'])\n        ) {\n            $frame->file = $trace['file'];\n\n            if (isset($trace['object']) && is_a($trace['object'], '\\Twig\\Template')) {\n                [$frame->file, $frame->line] = $this->getTwigInfo($trace);\n            } elseif (str_contains($frame->file, storage_path())) {\n                $hash = pathinfo($frame->file, PATHINFO_FILENAME);\n\n                if ($frame->name = $this->findViewFromHash($hash)) {\n                    $frame->file = $frame->name[1];\n                    $frame->name = $frame->name[0];\n                } else {\n                    $frame->name = $hash;\n                }\n\n                $frame->namespace = 'view';\n\n                return $frame;\n            } elseif (str_contains($frame->file, 'Middleware')) {\n                $frame->name = $this->findMiddlewareFromFile($frame->file);\n\n                if ($frame->name) {\n                    $frame->namespace = 'middleware';\n                } else {\n                    $frame->name = $this->normalizeFilePath($frame->file);\n                }\n\n                return $frame;\n            }\n\n            $frame->name = $this->normalizeFilePath($frame->file);\n\n            return $frame;\n        }\n\n        return false;\n    }\n\n    /**\n     * Check if the given file is to be excluded from analysis\n     */\n    protected function fileIsInExcludedPath(string $file): bool\n    {\n        $normalizedPath = str_replace('\\\\', '/', $file);\n\n        foreach ($this->backtraceExcludePaths as $excludedPath) {\n            if (str_contains($normalizedPath, $excludedPath)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Find the middleware alias from the file.\n     */\n    protected function findMiddlewareFromFile(string $file): ?string\n    {\n        $filename = pathinfo($file, PATHINFO_FILENAME);\n\n        foreach ($this->middleware as $alias => $class) {\n            if (is_string($class) && str_contains($class, $filename)) {\n                return $alias;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Find the template name from the hash.\n     */\n    protected function findViewFromHash(string $hash): ?array\n    {\n        $finder = app('view')->getFinder();\n\n        if (isset($this->reflection['viewfinderViews'])) {\n            $property = $this->reflection['viewfinderViews'];\n        } else {\n            $reflection = new \\ReflectionClass($finder);\n            $property = $reflection->getProperty('views');\n            $this->reflection['viewfinderViews'] = $property;\n        }\n\n        $xxh128Exists = in_array('xxh128', hash_algos(), true);\n\n        foreach ($property->getValue($finder) as $name => $path) {\n            if (($xxh128Exists && hash('xxh128', 'v2' . $path) === $hash) || sha1('v2' . $path) === $hash) {\n                return [$name, $path];\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Get the filename/line from a Twig template trace\n     */\n    protected function getTwigInfo(array $trace): array\n    {\n        $file = $trace['object']->getTemplateName();\n\n        if (isset($trace['line'])) {\n            foreach ($trace['object']->getDebugInfo() as $codeLine => $templateLine) {\n                if ($codeLine <= $trace['line']) {\n                    return [$file, $templateLine];\n                }\n            }\n        }\n\n        return [$file, -1];\n    }\n\n    /**\n     * Adds a custom message to statements.\n     */\n    public function addMessage(string $message): void\n    {\n        $this->infoStatements++;\n        $source = [];\n\n        if ($this->findSource) {\n            try {\n                $source = $this->findSource();\n            } catch (\\Exception $e) {\n            }\n        }\n\n        $this->queries[] = [\n            'sql' => $message,\n            'type' => 'message',\n            'start' => microtime(true),\n            ...(count($source) ? ['xdebug_link' => $source[0]] : []),\n        ];\n    }\n\n    /**\n     * Collect a database transaction event.\n     */\n    public function collectTransactionEvent(string $event, mixed $connection): void\n    {\n        $this->transactionEventsCount++;\n        $source = [];\n\n        if ($this->findSource) {\n            try {\n                $source = $this->findSource();\n            } catch (\\Exception $e) {\n            }\n        }\n\n        $this->queries[] = [\n            'query' => $event,\n            'type' => 'transaction',\n            'bindings' => [],\n            'start' => microtime(true),\n            'time' => 0,\n            'memory' => 0,\n            'source' => $source,\n            'connection' => $connection,\n            'driver' => $connection->getConfig('driver'),\n        ];\n    }\n\n    /**\n     * Reset the queries.\n     */\n    public function reset(): void\n    {\n        $this->queries = [];\n        $this->queryCount = 0;\n        $this->infoStatements = 0 ;\n        $this->transactionEventsCount = 0;\n        $this->reflection = [];\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function collect(): array\n    {\n        $totalTime = 0;\n        $totalMemory = 0;\n        $queries = $this->queries;\n\n        $statements = [];\n        $explain = (new Explain());\n        foreach ($queries as $query) {\n            if ($query['type'] === 'message') {\n                if (isset($query['xdebug_link'])) {\n                    $source = $query['xdebug_link'];\n                    $query['xdebug_link'] = $this->getXdebugLink($source->file ?: '', $source->line);\n                }\n                $statements[] = $query;\n                continue;\n            }\n\n            $source = reset($query['source']);\n            $normalizedPath = is_object($source) ? $this->normalizeFilePath($source->file ?: '') : '';\n            if ($query['type'] !== 'transaction' && Str::startsWith($normalizedPath, $this->excludePaths)) {\n                continue;\n            }\n\n            $totalTime += $query['time'];\n            $totalMemory += $query['memory'];\n\n            $connectionName = $query['connection']->getDatabaseName();\n            if ($connectionName && str_ends_with($connectionName, '.sqlite')) {\n                $connectionName = $this->normalizeFilePath($connectionName);\n            }\n\n            $explainModes = [];\n            $isReadonly = $explain->isReadOnlyQuery($query['query'] ?? '');\n            $canRunQuery = $this->showQueryResult && $isReadonly;\n            if ($canRunQuery) {\n                $explainModes[] = 'result';\n            }\n\n            if ($isReadonly && $this->explainQuery && $explain->isRawExplainSupported($query['driver'], $query['bindings'])) {\n                $explainModes[] = 'explain';\n            }\n\n            $statements[] = [\n                'sql' => $this->getSqlQueryToDisplay($query),\n                'type' => $query['type'],\n                'params' => $query['bindings'] ?? [],\n                'backtrace' => array_values($query['source']),\n                'start' => $query['start'] ?? null,\n                'duration' => $query['time'],\n                'duration_str' => ($query['type'] === 'transaction') ? '' : $this->getDataFormatter()->formatDuration($query['time']),\n                'slow' => $this->slowThreshold && $this->slowThreshold <= $query['time'],\n                'memory' => $query['memory'],\n                'memory_str' => $query['memory'] ? $this->getDataFormatter()->formatBytes($query['memory']) : null,\n                'filename' => $source ? $this->getQueryFormatter()->formatSource($source, true) : null,\n                'source' => $source,\n                'xdebug_link' => is_object($source) ? $this->getXdebugLink($source->file ?: '', $source->line) : null,\n                'connection' => $connectionName,\n                'explain' => $explainModes ? [\n                    'url' => route('debugbar.queries.explain'),\n                    'driver' => $query['driver'],\n                    'connection' => $query['connection']->getName(),\n                    'query' => $query['query'],\n                    'modes' => $explainModes,\n                    'hash' => $explain->hash($query['connection']->getName(), $query['query'], $query['bindings']),\n                ] : null,\n            ];\n        }\n\n        if ($this->durationBackground) {\n            if ($totalTime > 0) {\n                // For showing background measure on Queries tab\n                $start_percent = 0;\n\n                foreach ($statements as $i => $statement) {\n                    if (!isset($statement['duration'])) {\n                        continue;\n                    }\n\n                    $width_percent = $statement['duration'] / $totalTime * 100;\n\n                    $statements[$i] = array_merge($statement, [\n                        'start_percent' => round($start_percent, 3),\n                        'width_percent' => round($width_percent, 3),\n                    ]);\n\n                    $start_percent += $width_percent;\n                }\n            }\n        }\n\n        if ($this->softLimit && $this->hardLimit && ($this->queryCount > $this->softLimit && $this->queryCount > $this->hardLimit)) {\n            array_unshift($statements, [\n                'sql' => '# Query soft and hard limit for Debugbar are reached. Only the first ' . $this->softLimit . ' queries show details. Queries after the first ' . $this->hardLimit . ' are ignored. Limits can be raised in the config (debugbar.options.db.soft/hard_limit).',\n                'type' => 'info',\n            ]);\n            $statements[] = [\n                'sql' => '... ' . ($this->queryCount - $this->hardLimit) . ' additional queries are executed but now shown because of Debugbar query limits. Limits can be raised in the config (debugbar.options.db.soft/hard_limit)',\n                'type' => 'info',\n            ];\n            $this->infoStatements += 2;\n        } elseif ($this->hardLimit && $this->queryCount > $this->hardLimit) {\n            array_unshift($statements, [\n                'sql' => '# Query hard limit for Debugbar is reached after ' . $this->hardLimit . ' queries, additional ' . ($this->queryCount - $this->hardLimit) . ' queries are not shown.. Limits can be raised in the config (debugbar.options.db.hard_limit)',\n                'type' => 'info',\n            ]);\n            $statements[] = [\n                'sql' => '... ' . ($this->queryCount - $this->hardLimit) . ' additional queries are executed but now shown because of Debugbar query limits. Limits can be raised in the config (debugbar.options.db.hard_limit)',\n                'type' => 'info',\n            ];\n            $this->infoStatements += 2;\n        } elseif ($this->softLimit && $this->queryCount > $this->softLimit) {\n            array_unshift($statements, [\n                'sql' => '# Query soft limit for Debugbar is reached after ' . $this->softLimit . ' queries, additional ' . ($this->queryCount - $this->softLimit) . ' queries only show the query. Limits can be raised in the config (debugbar.options.db.soft_limit)',\n                'type' => 'info',\n            ]);\n            $this->infoStatements++;\n        }\n\n        $visibleStatements = count($statements) - $this->infoStatements;\n\n        $data = [\n            'count' => $visibleStatements,\n            'nb_statements' => $this->queryCount,\n            'nb_visible_statements' => $visibleStatements,\n            'nb_excluded_statements' => $this->queryCount + $this->transactionEventsCount - $visibleStatements,\n            'nb_failed_statements' => 0,\n            'accumulated_duration' => $totalTime,\n            'accumulated_duration_str' => $this->getDataFormatter()->formatDuration($totalTime),\n            'memory_usage' => $totalMemory,\n            'memory_usage_str' => $totalMemory ? $this->getDataFormatter()->formatBytes($totalMemory) : null,\n            'statements' => $statements,\n        ];\n        return $data;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'queries';\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getWidgets(): array\n    {\n        return [\n            \"queries\" => [\n                \"icon\" => \"database\",\n                \"widget\" => \"PhpDebugBar.Widgets.LaravelQueriesWidget\",\n                \"map\" => \"queries\",\n                \"default\" => \"[]\",\n            ],\n            \"queries:badge\" => [\n                \"map\" => \"queries.nb_statements\",\n                \"default\" => 0,\n            ],\n        ];\n    }\n\n    protected function getSqlQueryToDisplay(array $query): string\n    {\n        $sql = $query['query'];\n        $grammar = $query['connection']->getQueryGrammar();\n        if ($query['type'] === 'query' && $grammar instanceof Grammar) {\n            try {\n                $sql = $grammar->substituteBindingsIntoRawSql($sql, $query['bindings'] ?? []);\n                return $this->getQueryFormatter()->formatSql($sql);\n            } catch (\\Throwable $e) {\n                // Continue using the old substitute\n            }\n        }\n\n        if ($query['type'] === 'query' && $this->renderSqlWithParams) {\n            $pdo = null;\n            try {\n                $pdo = $query['connection']->getPdo();\n            } catch (\\Throwable) {\n                // ignore error for non-pdo laravel drivers\n            }\n\n            $sql = $this->getQueryFormatter()->formatSqlWithBindings($sql, $query['bindings'] ?? [], $pdo);\n        }\n\n        return $this->getQueryFormatter()->formatSql($sql);\n    }\n\n    public function getAssets(): array\n    {\n        return [\n            'js' => [\n                'widgets/sqlqueries/widget.js',\n                __DIR__ . '/../../resources/queries/widget.js',\n            ],\n            'css' => 'widgets/sqlqueries/widget.css',\n        ];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/RequestCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\Bridge\\Symfony\\SymfonyRequestCollector;\nuse DebugBar\\DataCollector\\DataCollectorInterface;\nuse DebugBar\\DataCollector\\Renderable;\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Illuminate\\Contracts\\Queue\\Job;\nuse Illuminate\\Support\\Facades\\Artisan;\nuse Illuminate\\Support\\Str;\nuse Laravel\\Telescope\\IncomingEntry;\nuse Laravel\\Telescope\\Telescope;\nuse Livewire\\Mechanisms\\HandleComponents\\HandleComponents;\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\n\nclass RequestCollector extends SymfonyRequestCollector implements DataCollectorInterface, Renderable\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function collect(): array\n    {\n        if ($job = debugbar()->getProcessingJob()) {\n            return $this->collectJob($job);\n        }\n        if (app()->runningInConsole()) {\n            return $this->collectCli();\n        }\n\n        $this->request = request();\n        $result = parent::collect();\n        if ($this->request->hasSession()) {\n            $sessionAttributes = $this->hideMaskedValues($this->request->session()->all());\n            $sessionAttributes = $this->getDataFormatter()->formatVar($sessionAttributes);\n            $result['data']['session_attributes'] = $sessionAttributes;\n        }\n        $result['tooltip'] += [\n            'full_url' => Str::limit($this->request->fullUrl(), 100),\n        ];\n\n        $htmlData = [];\n\n        $route = $this->request->route();\n        if ($route) {   // @phpstan-ignore-line despite what phpdocs say, this can return null\n            $htmlData += $this->getRouteInformation($this->request->route());\n            $result['tooltip'] += [\n                'action_name' => $route->getName(),\n                'controller_action' => $route->getActionName(),\n            ];\n        }\n\n        if (class_exists(Telescope::class) && class_exists(IncomingEntry::class) && Telescope::isRecording()) {\n            $entry = IncomingEntry::make([\n                'requestId' => app(LaravelDebugbar::class)->getCurrentRequestId(),\n            ])->type('debugbar');\n            Telescope::$entriesQueue[] = $entry;\n            $url = route('debugbar.telescope', [$entry->uuid]);\n            $htmlData['telescope'] = '<a href=\"' . $url . '\" target=\"_blank\" class=\"phpdebugbar-widgets-external-link\">View in Telescope</a>';\n        }\n\n        unset($htmlData['as'], $htmlData['uses']);\n\n        $result['data'] = $htmlData + $result['data'];\n\n        return $result;\n    }\n\n    protected function collectCli(): array\n    {\n        $argv = new ArgvInput();\n        $command = $argv->getFirstArgument();\n        $commands = Artisan::all();\n        $commandClass = $commands[$command] ?? null;\n\n        $data = [\n            'method' => 'CLI',\n            'command' => $command,\n            'command_class' => $commandClass,\n            'args' => (new ArgvInput())->getRawTokens(),\n            'request_server' => $this->request->server->all(),\n        ];\n\n        $data = $this->hideMaskedValues($data);\n        foreach ($data as $key => $var) {\n            if (!is_string($var)) {\n                $data[$key] = $this->getDataFormatter()->formatVar($var);\n            }\n        }\n\n        if ($commandClass) {\n            $reflector = new \\ReflectionClass($commandClass);\n            $filename = $this->normalizeFilePath($reflector->getFileName());\n\n            if ($link = $this->getXdebugLink($reflector->getFileName(), $reflector->getStartLine())) {\n                $data['command_class'] = [\n                    'value' => sprintf('%s:%s-%s', $filename, $reflector->getStartLine(), $reflector->getEndLine()),\n                    'xdebug_link' => $link,\n                ];\n            }\n        }\n\n        return ['data' => $data];\n    }\n\n    protected function collectJob(Job $job): array\n    {\n        $jobClass = $job->resolveQueuedJobClass();\n\n        $data = [\n            'method' => 'CLI',\n            'job' => $job->resolveName(),\n            'job_class' => $jobClass,\n            'job_id' => $job->getJobId(),\n            'connection' => $job->getConnectionName(),\n            'queue' => $job->getQueue(),\n            'payload' => $job->payload(),\n        ];\n\n        $data = $this->hideMaskedValues($data);\n        foreach ($data as $key => $var) {\n            if (!is_string($var)) {\n                $data[$key] = $this->getDataFormatter()->formatVar($var);\n            }\n        }\n\n        if ($jobClass) {\n            $reflector = new \\ReflectionClass($jobClass);\n            $filename = $this->normalizeFilePath($reflector->getFileName());\n\n            if ($link = $this->getXdebugLink($reflector->getFileName(), $reflector->getStartLine())) {\n                $data['job_class'] = [\n                    'value' => sprintf('%s:%s-%s', $filename, $reflector->getStartLine(), $reflector->getEndLine()),\n                    'xdebug_link' => $link,\n                ];\n            }\n        }\n\n        return ['data' => $data];\n    }\n\n    protected function getRouteInformation(mixed $route): array\n    {\n        if (!is_a($route, 'Illuminate\\Routing\\Route')) {\n            return [];\n        }\n        $uri = head($route->methods()) . ' ' . $route->uri();\n        $action = $route->getAction();\n\n        $result = [\n            'uri' => $uri,\n        ];\n\n        $result = array_merge($result, $action);\n        $uses = $action['uses'] ?? null;\n        $controller = is_string($action['controller'] ?? null) ? $action['controller'] : '';\n\n        if (request()->hasHeader('X-Livewire') && class_exists(HandleComponents::class)) {\n            try {\n                $componentData = $this->request->request->all()['components'][0] ?? null;\n                if (isset($componentData['snapshot'], $componentData['updates'])) {\n                    $snapshot = json_decode($componentData['snapshot'], true);\n                    if (count($componentData['updates']) > 0) {\n                        $method = $componentData['updates'][array_key_first($componentData['updates'])] ?? null;\n                    } else {\n                        $method = null;\n                    }\n                    [$component] = app(HandleComponents::class)->fromSnapshot($snapshot);\n                    $result['controller'] = ltrim($component::class, '\\\\');\n                    $reflector = new \\ReflectionClass($component);\n                    $controller = $component::class . '@' . $method;\n                }\n            } catch (\\Throwable $e) {\n                //\n            }\n        }\n\n        if (str_contains($controller, '@')) {\n            [$controller, $method] = explode('@', $controller);\n            if (class_exists($controller) && method_exists($controller, $method)) {\n                $reflector = new \\ReflectionMethod($controller, $method);\n            }\n            unset($result['uses']);\n        } elseif ($uses instanceof \\Closure) {\n            $reflector = new \\ReflectionFunction($uses);\n            $result['uses'] = $this->getDataFormatter()->formatVar($uses);\n        } elseif (is_string($uses) && str_contains($uses, '@__invoke')) {\n            if (class_exists($controller) && method_exists($controller, 'render')) {\n                $reflector = new \\ReflectionMethod($controller, 'render');\n                $result['controller'] = $controller . '@render';\n            }\n        }\n\n        if (isset($reflector)) {\n            $filename = $this->normalizeFilePath($reflector->getFileName());\n            $result['file'] = sprintf('%s:%s-%s', $filename, $reflector->getStartLine(), $reflector->getEndLine());\n\n            if ($link = $this->getXdebugLink($reflector->getFileName(), $reflector->getStartLine())) {\n                $result['file'] = [\n                    'value' => $result['file'],\n                    'xdebug_link' => $link,\n                ];\n\n                if (isset($result['controller']) && is_string($result['controller'])) {\n                    $result['controller'] = [\n                        'value' => $result['controller'],\n                        'xdebug_link' => $link,\n                    ];\n                }\n            }\n        }\n\n        if (isset($result['middleware']) && is_array($result['middleware'])) {\n            $middleware = implode(', ', $result['middleware']);\n            unset($result['middleware']);\n            $result['middleware'] = $middleware;\n        }\n\n        return array_filter($result);\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/RouteCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse Closure;\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\Renderable;\nuse Illuminate\\Routing\\Router;\nuse Livewire\\Mechanisms\\HandleComponents\\HandleComponents;\n\n/**\n * Based on Illuminate\\Foundation\\Console\\RoutesCommand for Taylor Otwell\n * https://github.com/laravel/framework/blob/master/src/Illuminate/Foundation/Console/RoutesCommand.php\n *\n */\nclass RouteCollector extends DataCollector implements Renderable\n{\n    /**\n     * {@inheritDoc}\n     */\n    public function collect(): array\n    {\n        $route = app(Router::class)->current();\n        return $this->getRouteInformation($route);\n    }\n\n    /**\n     * Get the route information for a given route.\n     */\n    protected function getRouteInformation(mixed $route): array\n    {\n        if (!is_a($route, 'Illuminate\\Routing\\Route')) {\n            return [];\n        }\n        $uri = head($route->methods()) . ' ' . $route->uri();\n        $action = $route->getAction();\n\n        $result = [\n            'uri' => $uri,\n        ];\n\n        $result = array_merge($result, $action);\n        $uses = $action['uses'] ?? null;\n        $controller = is_string($action['controller'] ?? null) ? $action['controller'] : '';\n\n        if (request()->hasHeader('X-Livewire') && class_exists(HandleComponents::class)) {\n            try {\n                $componentData = request('components')[0] ?? null;\n                if (isset($componentData['snapshot'], $componentData['updates'])) {\n                    $snapshot = json_decode($componentData['snapshot'], true);\n                    if (count($componentData['updates']) > 0) {\n                        $method = $componentData['updates'][array_key_first($componentData['updates'])] ?? null;\n                    } else {\n                        $method = null;\n                    }\n                    [$component] = app(HandleComponents::class)->fromSnapshot($snapshot);\n                    $result['controller'] = ltrim($component::class, '\\\\');\n                    $reflector = new \\ReflectionClass($component);\n                    $controller = $component::class . '@' . $method;\n                }\n            } catch (\\Throwable $e) {\n                //\n            }\n        }\n\n        if (str_contains($controller, '@')) {\n            [$controller, $method] = explode('@', $controller);\n            if (class_exists($controller) && method_exists($controller, $method)) {\n                $reflector = new \\ReflectionMethod($controller, $method);\n            }\n            unset($result['uses']);\n        } elseif ($uses instanceof \\Closure) {\n            $reflector = new \\ReflectionFunction($uses);\n            $result['uses'] = $this->getDataFormatter()->formatVar($uses);\n        } elseif (is_string($uses) && str_contains($uses, '@__invoke')) {\n            if (class_exists($controller) && method_exists($controller, 'render')) {\n                $reflector = new \\ReflectionMethod($controller, 'render');\n                $result['controller'] = $controller . '@render';\n            }\n        }\n\n        if (isset($reflector)) {\n            $filename = $this->normalizeFilePath($reflector->getFileName());\n            $result['file'] = sprintf('%s:%s-%s', $filename, $reflector->getStartLine(), $reflector->getEndLine());\n\n            if ($link = $this->getXdebugLink($reflector->getFileName(), $reflector->getStartLine())) {\n                $result['file'] = [\n                    'value' => $result['file'],\n                    'xdebug_link' => $link,\n                ];\n\n                if (isset($result['controller'])) {\n                    $result['controller'] = [\n                        'value' => $result['controller'],\n                        'xdebug_link' => $link,\n                    ];\n                }\n            }\n        }\n\n        if ($middleware = $this->getMiddleware($route)) {\n            $result['middleware'] = $middleware;\n        }\n\n        return array_filter($result);\n    }\n\n    /**\n     * Get middleware\n     */\n    protected function getMiddleware(mixed $route): string\n    {\n        return implode(', ', array_map(function ($middleware): mixed {\n            return $middleware instanceof Closure ? 'Closure' : $middleware;\n        }, $route->gatherMiddleware()));\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'route';\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getWidgets(): array\n    {\n        $widget = match (true) {\n            $this->isJsonVarDumperUsed() => \"PhpDebugBar.Widgets.JsonVariableListWidget\",\n            $this->isHtmlVarDumperUsed() => \"PhpDebugBar.Widgets.HtmlVariableListWidget\",\n            default => \"PhpDebugBar.Widgets.VariableListWidget\",\n        };\n\n        return [\n            \"route\" => [\n                \"icon\" => \"share-3\",\n                \"widget\" => $widget,\n                \"map\" => \"route\",\n                \"default\" => \"{}\",\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/SessionCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\DataCollectorInterface;\nuse DebugBar\\DataCollector\\Renderable;\n\nclass SessionCollector extends DataCollector implements DataCollectorInterface, Renderable\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function collect(): array\n    {\n        $data = $this->hideMaskedValues(session()->all());\n\n        foreach ($data as $key => $value) {\n            $data[$key] = is_string($value) ? $value : $this->getDataFormatter()->formatVar($value);\n        }\n\n        return $data;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'session';\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getWidgets(): array\n    {\n        $widget = match (true) {\n            $this->isJsonVarDumperUsed() => \"PhpDebugBar.Widgets.JsonVariableListWidget\",\n            $this->isHtmlVarDumperUsed() => \"PhpDebugBar.Widgets.HtmlVariableListWidget\",\n            default => \"PhpDebugBar.Widgets.VariableListWidget\",\n        };\n\n        return [\n            \"session\" => [\n                \"icon\" => \"archive\",\n                \"widget\" => $widget,\n                \"map\" => \"session\",\n                \"default\" => \"{}\",\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/DataCollector/ViewCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\DataCollector;\n\nuse DebugBar\\DataCollector\\TemplateCollector;\nuse Illuminate\\Support\\Str;\nuse Illuminate\\View\\View;\n\nclass ViewCollector extends TemplateCollector\n{\n    public function getName(): string\n    {\n        return 'views';\n    }\n\n    /**\n     * Add a View instance to the Collector\n     */\n    public function addView(View $view): void\n    {\n        $name = $view->getName();\n        $type = null;\n        $data = $view->getData();\n        $path = $view->getPath();\n\n        // Skip View files from strings\n        if (Str::startsWith($name, '__components::')) {\n            if ($source = $this->getRenderSource($name, $path)) {\n                [$name, $type, $data, $path] = $source;\n            }\n        }\n\n        if (is_object($path)) {\n            $type = get_class($view);\n            $path = null;\n        }\n\n        if ($path && $type !== 'livewire') {\n            if (!$type) {\n                if (substr($path, -10) === '.blade.php') {\n                    $type = 'blade';\n                } else {\n                    $type = pathinfo($path, PATHINFO_EXTENSION);\n                }\n            }\n\n            $shortPath = $this->normalizeFilePath($path);\n            foreach ($this->exclude_paths as $excludePath) {\n                if (str_starts_with($shortPath, $excludePath)) {\n                    return;\n                }\n            }\n        }\n\n        $this->addTemplate($name, $data, $type, $path);\n    }\n\n    private function getRenderSource(string $name, ?string $path): ?array\n    {\n        $backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 20);\n\n        $component = null;\n        $render = null;\n        $view = null;\n        foreach ($backtrace as $trace) {\n            $function = $trace['function'] ?? null; //@phpstan-ignore-line\n            $class = $trace['class'] ?? null;\n            $file = $trace['file'] ?? null;\n            $object = $trace['object'] ?? null;\n            // Found an invokable class\n            if (\n                $function === '__invoke'\n                && $class === 'Livewire\\Component'\n                && $object\n                && !$component\n            ) {\n                /** @var \\Livewire\\Component $component */\n                $component = $trace['object'];\n                $name = get_class($component);\n                $type = 'livewire';\n                $path = (new \\ReflectionClass($component))->getFileName();\n                $component = [$name, $type, [], $path];\n            }\n            if (\n                (\n                    ($function === 'render' && $class === 'Illuminate\\View\\Compilers\\BladeCompiler')\n                    || ($function === '__callStatic' && $class === 'Illuminate\\Support\\Facades\\Facade' && ($trace['args'][0] ?? null) === 'render')\n                )\n                && !str_contains($file, '/Illuminate/')\n                && !$render\n            ) {\n                $render = [$name, 'render', [], $file];\n            }\n\n            if (!$view && $class === 'Illuminate\\View\\View' && $object instanceof View && !str_starts_with($object->getName(), '__components::')\n            ) {\n                $view  = [$object->getName(), null, $object->getData(), $object->getPath()];\n            }\n        }\n\n        if ($component) {\n            return $component;\n        }\n\n        if ($render) {\n            return $render;\n        }\n\n        if ($view) {\n            return $view;\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "src/Facades/Debugbar.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Facades;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse DebugBar\\DataCollector\\DataCollectorInterface;\n\n/**\n * @method static LaravelDebugbar addCollector(DataCollectorInterface $collector)\n * @method static void            addMessage(mixed $message, string $label = 'info')\n * @method static void            alert(mixed $message)\n * @method static void            critical(mixed $message)\n * @method static void            debug(mixed $message)\n * @method static void            emergency(mixed $message)\n * @method static void            error(mixed $message)\n * @method static LaravelDebugbar getCollector(string $name)\n * @method static bool            hasCollector(string $name)\n * @method static void            info(mixed $message)\n * @method static void            log(mixed $message)\n * @method static void            notice(mixed $message)\n * @method static void            warning(mixed $message)\n *\n * @see \\Fruitcake\\LaravelDebugbar\\LaravelDebugbar\n */\nclass Debugbar extends \\Illuminate\\Support\\Facades\\Facade\n{\n    /**\n     * {@inheritDoc}\n     */\n    protected static function getFacadeAccessor(): string\n    {\n        return \\Fruitcake\\LaravelDebugbar\\LaravelDebugbar::class;\n    }\n}\n"
  },
  {
    "path": "src/LaravelDebugbar.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar;\n\nuse DebugBar\\Bridge\\Symfony\\SymfonyHttpDriver;\nuse DebugBar\\DataCollector\\TimeDataCollector;\nuse DebugBar\\DataFormatter\\JsonDataFormatter;\nuse DebugBar\\JavascriptRenderer;\nuse DebugBar\\RequestIdGeneratorInterface;\nuse DebugBar\\Storage\\FileStorage;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\ConfigCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\ExceptionsCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\HttpClientCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\InertiaCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\RequestCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\SessionCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\AuthCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\CacheCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\DatabaseCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\EventsCollectorCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\GateCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\JobsCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\LaravelCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\LivewireCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\LogCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\LogsCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\MailCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\MemoryCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\MessagesCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\ModelsCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\PennantCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\PhpInfoCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\RouteCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\TimeCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\CollectorProviders\\ViewsCollectorProvider;\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\RequestCollector;\nuse Fruitcake\\LaravelDebugbar\\Support\\Clockwork\\ClockworkCollector;\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\DataCollectorInterface;\nuse DebugBar\\DataCollector\\ExceptionsCollector;\nuse DebugBar\\DataCollector\\MessagesCollector;\nuse DebugBar\\DebugBar;\nuse DebugBar\\HttpDriverInterface;\nuse DebugBar\\Storage\\PdoStorage;\nuse DebugBar\\Storage\\RedisStorage;\nuse DebugBar\\Storage\\SqliteStorage;\nuse Exception;\nuse Illuminate\\Config\\Repository;\nuse Illuminate\\Contracts\\Queue\\Job;\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Str;\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\nuse Symfony\\Component\\HttpFoundation\\IpUtils;\nuse Symfony\\Component\\HttpFoundation\\JsonResponse;\nuse Symfony\\Component\\HttpFoundation\\Response as SymfonyResponse;\nuse Symfony\\Component\\VarDumper\\Cloner\\Stub;\nuse Throwable;\n\n/**\n * Debug bar subclass which adds all without Request and with LaravelCollector.\n * Rest is added in Service Provider\n *\n * @method void emergency(...$message)\n * @method void alert(...$message)\n * @method void critical(...$message)\n * @method void error(...$message)\n * @method void warning(...$message)\n * @method void notice(...$message)\n * @method void info(...$message)\n * @method void debug(...$message)\n * @method void log(...$message)\n */\nclass LaravelDebugbar extends DebugBar\n{\n    protected Application $app;\n    protected Request $request;\n    protected ?Job $processingJob = null;\n    protected bool $booted = false;\n\n    protected ?bool $enabled = null;\n\n    protected ?bool $storageOpen = null;\n\n    /**\n     * Laravel default error handler\n     *\n     * @var callable|null\n     */\n    protected $prevErrorHandler = null;\n\n    protected ?string $editorTemplate = null;\n    protected bool $responseIsModified = false;\n    protected TimeDataCollector $timeCollector;\n    protected MessagesCollector $messagesCollector;\n    protected ExceptionsCollector $exceptionsCollector;\n\n    public function __construct(Application $app, Request $request)\n    {\n        $startTime = defined('LARAVEL_START') ? (float) LARAVEL_START : microtime(true);\n\n        $this->app = $app;\n        $this->request = $request;\n        $this->timeCollector = new TimeDataCollector($startTime);\n        $this->messagesCollector = new MessagesCollector();\n        $this->exceptionsCollector = new ExceptionsCollector();\n    }\n\n    public function setApplication(Application $app): void\n    {\n        $this->app = $app;\n    }\n\n    public function setRequest(Request $request): void\n    {\n        $this->request = $request;\n    }\n\n    public function setProcessingJob(?Job $job): void\n    {\n        $this->processingJob = $job;\n    }\n\n    public function getProcessingJob(): ?Job\n    {\n        return $this->processingJob;\n    }\n\n    public function getHttpDriver(): HttpDriverInterface\n    {\n        if ($this->httpDriver === null) {\n            $this->httpDriver = new LaravelHttpDriver($this->request);\n        }\n\n        return $this->httpDriver;\n    }\n\n    public function getRequestIdGenerator(): RequestIdGeneratorInterface\n    {\n        if ($this->requestIdGenerator === null) {\n            $this->requestIdGenerator = new class implements RequestIdGeneratorInterface {\n                public function generate(): string\n                {\n                    return (string) Str::ulid();\n                }\n            };\n        }\n\n        return $this->requestIdGenerator;\n    }\n\n    public function getTimeCollector(): TimeDataCollector\n    {\n        return $this->timeCollector;\n    }\n\n    public function getMessagesCollector(): MessagesCollector\n    {\n        return $this->messagesCollector;\n    }\n\n    public function getExceptionsCollector(): ExceptionsCollector\n    {\n        return $this->exceptionsCollector;\n    }\n\n    public function isCollecting(): bool\n    {\n        return $this->enabled && $this->booted;\n    }\n\n    /**\n     * Enable the Debugbar and boot, if not already booted.\n     */\n    public function enable(): void\n    {\n        $this->enabled = true;\n\n        if (!$this->booted) {\n            $this->boot();\n        }\n    }\n\n    /**\n     * Boot the debugbar (add collectors, renderer and listener)\n     */\n    public function boot(): void\n    {\n        if ($this->booted) {\n            return;\n        }\n\n        $config = config();\n\n        $this->editorTemplate = $config->get('debugbar.editor') ?: $config->get('app.editor');\n        $this->remotePathReplacements = $this->getRemoteServerReplacements();\n\n        // Set custom error handler\n        if ($config->get('debugbar.error_handler', false)) {\n            // Get the error_level config, default to E_ALL\n            $errorLevel = $config->get('debugbar.error_level', E_ALL);\n\n            // set error handler with configured error reporting level\n            $this->prevErrorHandler = set_error_handler([$this, 'handleError'], $errorLevel);\n        }\n\n        $this->selectStorage($this);\n\n        $this->registerDataFormatter();\n\n        $this->registerCollectors();\n\n        $this->booted = true;\n    }\n\n    public function booted(): void\n    {\n        $startTime = defined('LARAVEL_START') ? (float) LARAVEL_START : null;\n        if ($startTime) {\n            $this->addMeasure('Booting', $startTime, microtime(true));\n        }\n        $this->startMeasure('application', 'Application', 'time');\n    }\n\n    protected function registerCollectors(): void\n    {\n        // Register default Collector Provider\n        $this->registerCollectorProviders([\n            'symfony_request' => RequestCollectorProvider::class,\n            'exceptions' => ExceptionsCollectorProvider::class,\n            'phpinfo' => PhpInfoCollectorProvider::class,\n            'messages' => MessagesCollectorProvider::class,\n            'time' => TimeCollectorProvider::class,\n            'memory' => MemoryCollectorProvider::class,\n            'laravel' => LaravelCollectorProvider::class,\n            'events' => EventsCollectorCollectorProvider::class,\n            'views' => ViewsCollectorProvider::class,\n            'route' => RouteCollectorProvider::class,\n            'log' => LogCollectorProvider::class,\n            'logs' => LogsCollectorProvider::class,\n            'db' => DatabaseCollectorProvider::class,\n            'models' => ModelsCollectorProvider::class,\n            'livewire' => LivewireCollectorProvider::class,\n            'inertia' => InertiaCollectorProvider::class,\n            'mail' => MailCollectorProvider::class,\n            'auth' => AuthCollectorProvider::class,\n            'gate' => GateCollectorProvider::class,\n            'cache' => CacheCollectorProvider::class,\n            'jobs' => JobsCollectorProvider::class,\n            'pennant' => PennantCollectorProvider::class,\n            'config' => ConfigCollectorProvider::class,\n            'session' => SessionCollectorProvider::class,\n            'http_client' => HttpClientCollectorProvider::class,\n        ]);\n\n        // Register any Custom Collectors\n        $this->registerCustomCollectorProviders(config('debugbar.custom_collectors', []));\n    }\n\n    /**\n     * @param array<string, string> $providers\n     */\n    protected function registerCollectorProviders(array $providers): void\n    {\n        /** @var Repository $config */\n        $config = $this->app->get(Repository::class);\n        foreach ($providers as $name => $provider) {\n            if (!$this->shouldCollect($name)) {\n                continue;\n            }\n            try {\n                $options = $config->get('debugbar.options.' . $name, []);\n                $this->app->call($provider, ['options' => $options]);\n            } catch (Exception $e) {\n                $this->addCollectorException('Error calling ' . class_basename($provider), $e);\n            }\n        }\n    }\n\n    /**\n     * @param array<string, bool> $providers\n     */\n    protected function registerCustomCollectorProviders(array $providers): void\n    {\n        foreach ($providers as $provider => $enabled) {\n            if (!$enabled) {\n                continue;\n            }\n            try {\n                $provider = $this->app->make($provider);\n                // Add collectors directly, otherwise invoke the class\n                if (is_a($provider, DataCollectorInterface::class)) {\n                    $this->addCollector($provider);\n                } else {\n                    $this->app->call($provider);\n                }\n            } catch (Exception $e) {\n                $this->addCollectorException('Error calling ' . class_basename($provider), $e);\n            }\n        }\n    }\n\n    /**\n     * Register some Casters to avoid large objects for events etc.\n     */\n    protected function registerDataFormatter(): void\n    {\n        $formatter = new JsonDataFormatter();\n\n        $formatter->mergeClonerOptions([\n            'casters' => [\n                \\Illuminate\\View\\View::class => static function (\\Illuminate\\View\\View $view, array $a, Stub $stub): array {\n                    return [\n                        'name' => $view->getName(),\n                        'data' => $view->getData(),\n                        'path' => $view->getPath(),\n                        'engine' => get_class($view->getEngine()),\n                        'factory' => get_class($view->getFactory()),\n                    ];\n                },\n                \\Illuminate\\Database\\ConnectionInterface::class => static function (\\Illuminate\\Database\\ConnectionInterface $connection, array $a, Stub $stub): array {\n                    return [\n                        'database' => $connection->getDatabaseName(),\n                    ];\n                },\n            ],\n        ]);\n\n        DataCollector::setDefaultDataFormatter($formatter);\n    }\n\n    public function getJavascriptRenderer(?string $baseUrl = null, ?string $basePath = null): JavascriptRenderer\n    {\n        if ($this->jsRenderer !== null) {\n            return $this->jsRenderer;\n        }\n\n        $renderer = new JavascriptRenderer($this, $baseUrl, $basePath);\n\n        $config = config();\n        $renderer->setHideEmptyTabs($config->get('debugbar.hide_empty_tabs', true));\n        $renderer->setIncludeVendors($config->get('debugbar.include_vendors', true));\n        $renderer->setBindAjaxHandlerToFetch($config->get('debugbar.capture_ajax', true));\n        $renderer->setBindAjaxHandlerToXHR($config->get('debugbar.capture_ajax', true));\n        $renderer->setDeferDatasets($config->get('debugbar.defer_datasets', false));\n        $renderer->setUseDistFiles($config->get('debugbar.use_dist_files', true));\n        $renderer->setAjaxHandlerAutoShow($config->get('debugbar.ajax_handler_auto_show', true));\n        $renderer->setAjaxHandlerEnableTab($config->get('debugbar.ajax_handler_enable_tab', true));\n        $renderer->setTheme($config->get('debugbar.theme', 'auto'));\n\n        $renderer->setAssetHandlerUrl(route('debugbar.assets'));\n        $renderer->addAssets(cssFiles: ['laravel-debugbar.css', 'laravel-icons.css'], basePath: __DIR__ . '/../resources');\n\n        if ($this->getStorage()) {\n            $renderer->setOpenHandlerUrl(route('debugbar.openhandler'));\n        }\n\n        $this->jsRenderer = $renderer;\n\n        return $this->jsRenderer;\n    }\n\n    public function shouldCollect(string $name, bool $default = true): bool\n    {\n        return config('debugbar.collectors.' . $name, $default);\n    }\n\n    /**\n     * Handle silenced errors\n     */\n    public function handleError(int $level, string $message, string $file = '', int $line = 0, array $context = []): mixed\n    {\n        if ($this->hasCollector('exceptions')) {\n            /** @var ExceptionsCollector $exceptionCollector */\n            $exceptionCollector = $this['exceptions'];\n            $exceptionCollector->addWarning($level, $message, $file, $line);\n        }\n\n        if ($this->hasCollector('messages')) {\n            /** @var MessagesCollector $messagesCollector */\n            $messagesCollector = $this['messages'];\n            $file = $file ? ' on ' . $messagesCollector->normalizeFilePath($file) . \":{$line}\" : '';\n            $messagesCollector->addMessage($message . $file, 'deprecation');\n        }\n\n        if (! $this->prevErrorHandler) {\n            return null;\n        }\n\n        return call_user_func($this->prevErrorHandler, $level, $message, $file, $line, $context);\n    }\n\n    /**\n     * Starts a measure\n     *\n     * @param string      $name  Internal name, used to stop the measure\n     * @param string|null $label Public name\n     */\n    public function startMeasure(string $name, ?string $label = null, ?string $collector = null, ?string $group = null): void\n    {\n        $this->timeCollector->startMeasure($name, $label, $collector, $group);\n    }\n\n    /**\n     * Stops a measure\n     */\n    public function stopMeasure(string $name): void\n    {\n        try {\n            $this->timeCollector->stopMeasure($name);\n        } catch (Exception $e) {\n            $this->addThrowable($e);\n        }\n    }\n\n    /**\n     * Alias for addThrowable\n     *\n     */\n    public function addException(Throwable $e): void\n    {\n        $this->addThrowable($e);\n    }\n\n    /**\n     * Adds an exception to be profiled in the debug bar\n     */\n    public function addThrowable(Throwable $e): void\n    {\n        $this->exceptionsCollector->addThrowable($e);\n    }\n\n    /**\n     * Register collector exceptions\n     *\n     */\n    protected function addCollectorException(string $message, Exception $exception): void\n    {\n        $this->addThrowable(\n            new Exception(\n                $message . ' on Laravel Debugbar: ' . $exception->getMessage(),\n                (int) $exception->getCode(),\n                $exception,\n            ),\n        );\n    }\n\n    /**\n     * Modify the response and inject the debugbar (or data in headers)\n     */\n    public function handleResponse(Request $request, SymfonyResponse $response): SymfonyResponse\n    {\n        $this->setRequest($request);\n\n        if (\n            $this->responseIsModified\n            || !$this->booted\n            || !$this->isEnabled()\n            || $this->isDebugbarRequest($request)\n            || $this->requestIsExcluded($request)\n        ) {\n            return $response;\n        }\n\n        $config = $this->app->get(Repository::class);\n\n        // Prevent duplicate modification\n        $this->responseIsModified = true;\n\n        // These rely on the Response, so we add them directly here\n        $httpDriver = $this->getHttpDriver();\n        if ($httpDriver instanceof LaravelHttpDriver) {\n            $httpDriver->setRequest($request);\n            $httpDriver->setResponse($response);\n        } elseif ($httpDriver instanceof SymfonyHttpDriver) {\n            $httpDriver->setResponse($response);\n        }\n\n        // Show the Http Response Exception in the Debugbar, when available\n        if ($response instanceof Response && isset($response->exception)) {\n            $this->addThrowable($response->exception);\n        }\n\n        // Update collectors that use the request/response\n        if ($this->hasCollector('request')) {\n            $collector = $this->getCollector('request');\n            if ($collector instanceof RequestCollector) {\n                $collector->setResponse($response);\n            }\n        }\n\n        if ($config->get('debugbar.clockwork') && ! $this->hasCollector('clockwork')) {\n            try {\n                $clockworkCollector = new ClockworkCollector($request, $response);\n                $this->addCollector($clockworkCollector);\n            } catch (Exception $e) {\n                $this->addCollectorException('Cannot add ClockworkCollector', $e);\n            }\n\n            $this->addClockworkHeaders($response);\n        }\n\n        if ($config->get('debugbar.add_ajax_timing', false)) {\n            $this->addServerTimingHeaders($response);\n        }\n\n        if ($response->isRedirection()) {\n            try {\n                $this->stackData();\n            } catch (Exception $e) {\n                $this->app['log']->error('Debugbar exception: ' . $e->getMessage(), [\n                    'exception' => $e,\n                ]);\n            }\n\n            return $response;\n        }\n\n        try {\n            // Collect + store data, only inject the ID in theheaders\n            $this->sendDataInHeaders(true);\n        } catch (Exception $e) {\n            $this->app['log']->error('Debugbar exception: ' . $e->getMessage(), [\n                'exception' => $e,\n            ]);\n        }\n\n        // Check if it's safe to inject the Debugbar\n        if (\n            $config->get('debugbar.inject', true)\n            && str_contains($response->headers->get('Content-Type', 'text/html'), 'html')\n            && !$this->isJsonRequest($request)\n            && !$this->isJsonResponse($response)\n            && $response->getContent() !== false\n            && in_array($request->getRequestFormat(), [null, 'html'], true)\n        ) {\n            try {\n                $this->injectDebugbar($response);\n            } catch (Exception $e) {\n                $this->app['log']->error('Debugbar exception: ' . $e->getMessage(), [\n                    'exception' => $e,\n                ]);\n            }\n        }\n\n        return $response;\n    }\n\n    public static function canBeEnabled(): bool\n    {\n        $app = app();\n        return $app->hasDebugModeEnabled() && !$app->environment('testing', 'production');\n    }\n\n    /**\n     * Check if the Debugbar is enabled\n     */\n    public function isEnabled(): bool\n    {\n        if ($this->enabled === null) {\n            if (!static::canBeEnabled()) {\n                $this->enabled = false;\n            } else {\n                $configEnabled = value(config('debugbar.enabled'));\n\n                if ($configEnabled === null) {\n                    $configEnabled = config('app.debug');\n                }\n\n                $this->enabled = $configEnabled && !$this->app->runningInConsole();\n            }\n        }\n\n        return $this->enabled;\n    }\n\n    public function isStorageOpen(Request $request): bool\n    {\n        // Additional safeguards that may never have storage open\n        if (!$this->isEnabled() || !config('app.debug') || app()->isProduction()) {\n            return false;\n        }\n\n        if ($this->storageOpen === null) {\n            $open = config('debugbar.storage.open');\n\n            if (is_callable($open)) {\n                $this->storageOpen = ($open)($request);\n                return $this->storageOpen;\n            }\n\n            if (is_string($open) && class_exists($open)) {\n                $this->storageOpen =  method_exists($open, 'resolve') ? $open::resolve($request) : false;\n                return $this->storageOpen;\n            }\n\n            if (is_bool($open)) {\n                $this->storageOpen = $open;\n                return $this->storageOpen;\n            }\n\n            // Allow localhost request when not explicitly allowed/disallowed\n            $this->storageOpen = IpUtils::isPrivateIp($request->getClientIp());\n        }\n\n        return $this->storageOpen;\n    }\n\n    public function requestIsExcluded(Request $request): bool\n    {\n        $except = config('debugbar.except') ?: [];\n        if (!$except) {\n            return false;\n        }\n\n        $except = array_map(function ($item): string {\n            return $item !== '/' ? trim($item, '/') : $item;\n        }, $except);\n\n        return $request->is($except);\n    }\n\n    /**\n     * Check if this is a request to the Debugbar OpenHandler\n     */\n    protected function isDebugbarRequest(Request $request): bool\n    {\n        return $request->is(config('debugbar.route_prefix') . '*');\n    }\n\n    protected function isJsonRequest(Request $request): bool\n    {\n        // If XmlHttpRequest, Live or HTMX, return true\n        if (\n            $request->isXmlHttpRequest()\n            || $request->headers->has('X-Livewire')\n            || ($request->headers->has('Hx-Request') && $request->headers->has('Hx-Target'))\n        ) {\n            return true;\n        }\n\n        // Check if the request wants Json\n        $acceptable = $request->getAcceptableContentTypes();\n        if (isset($acceptable[0]) && in_array($acceptable[0], ['application/json', 'application/javascript'], true)) {\n            return true;\n        }\n\n        return false;\n    }\n\n    protected function isJsonResponse(SymfonyResponse $response): bool\n    {\n        if ($response instanceof JsonResponse || $response->headers->get('Content-Type') === 'application/json') {\n            return true;\n        }\n\n        $content = $response->getContent();\n        if (is_string($content)) {\n            $content = trim($content);\n            if ($content === '') {\n                return false;\n            }\n\n            // Quick check to see if it looks like JSON\n            $first = $content[0];\n            $last  = $content[strlen($content) - 1];\n            if (\n                ($first === '{' && $last === '}')\n                || ($first === '[' && $last === ']')\n            ) {\n                // Must contain a colon or comma\n                return strpbrk($content, ':,') !== false;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Collects meta data about the current request\n     */\n    public function collectMetaData(): array\n    {\n        $meta = [\n            'id' => $this->getCurrentRequestId(),\n            'datetime' => date('Y-m-d H:i:s'),\n            'utime' => microtime(true),\n            'method' => $this->request->getMethod(),\n            'uri' => $this->request->getRequestUri(),\n            'ip' => $this->request->getClientIp(),\n        ];\n\n        if ($this->processingJob) {\n            $meta['method'] = 'JOB';\n            $meta['uri'] =  $this->processingJob->resolveName() . '@' . $this->processingJob->getConnectionName();\n        } elseif ($this->app->runningInConsole()) {\n            $meta['method'] = 'CLI';\n            $meta['uri'] = implode(' ', (new ArgvInput())->getRawTokens());\n        }\n\n        return $meta;\n    }\n\n    public function terminate(): void\n    {\n        if ($this->isCollecting() && $this->data === null && !$this->isDebugbarRequest($this->request)) {\n            $this->collect();\n        }\n    }\n\n    /**\n     * Injects the web debug toolbar into the given Response.\n     *\n     * Based on https://github.com/symfony/WebProfilerBundle/blob/master/EventListener/WebDebugToolbarListener.php\n     */\n    public function injectDebugbar(SymfonyResponse $response): void\n    {\n        $content = $response->getContent();\n\n        $renderer = $this->getJavascriptRenderer();\n\n        $widget = \"<!-- Laravel Debugbar Widget -->\\n\" . $renderer->renderHead() . $renderer->render();\n\n        // Try to put the widget at the end, directly before the </body>\n        $pos = strripos($content, '</body>');\n        if (false !== $pos) {\n            $content = substr($content, 0, $pos) . $widget . substr($content, $pos);\n        } else {\n            $content = $content . $widget;\n        }\n\n        $original = null;\n        if ($response instanceof Response && $response->getOriginalContent()) {\n            $original = $response->getOriginalContent();\n        }\n\n        // Update the new content and reset the content length\n        $response->setContent($content);\n        $response->headers->remove('Content-Length');\n\n        // Restore original response (e.g. the View or Ajax data)\n        if ($response instanceof Response && $original) {\n            $response->original = $original;\n        }\n    }\n\n    /**\n     * Disable the Debugbar\n     */\n    public function disable(): void\n    {\n        $this->enabled = false;\n    }\n\n    public function reset(): void\n    {\n        parent::reset();\n        $this->timeCollector->reset();\n        $this->exceptionsCollector->reset();\n        $this->messagesCollector->reset();\n        $this->enabled = null;\n        $this->storageOpen = null;\n        $this->responseIsModified = false;\n        $this->httpDriver = null;\n    }\n\n    /**\n     * Adds a measure\n     */\n    public function addMeasure(string $label, float $start, ?float $end = null, array $params = [], ?string $collector = null, ?string $group = null): void\n    {\n        $this->timeCollector->addMeasure($label, $start, $end, $params, $collector, $group);\n    }\n\n    /**\n     * Utility function to measure the execution of a Closure\n     */\n    public function measure(string $label, \\Closure $closure, ?string $collector = null, ?string $group = null): mixed\n    {\n        return $this->timeCollector->measure($label, $closure, $collector, $group);\n    }\n\n    /**\n     * Magic calls for adding messages\n     */\n    public function __call(string $method, array $args): void\n    {\n        $messageLevels = ['emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug', 'log'];\n        if (in_array($method, $messageLevels, true)) {\n            foreach ($args as $arg) {\n                $this->addMessage($arg, $method);\n            }\n        }\n    }\n\n    /**\n     * Adds a message to the MessagesCollector\n     *\n     * A message can be anything from an object to a string\n     */\n    public function addMessage(mixed $message, string $label = 'info', array $context = []): void\n    {\n        $this->messagesCollector->addMessage($message, $label, $context);\n    }\n\n    /**\n     * Check the version of Laravel\n     */\n    public function checkVersion(string $version, string $operator = \">=\"): bool\n    {\n        return version_compare($this->app->version(), $version, $operator);\n    }\n\n    protected function selectStorage(DebugBar $debugbar): void\n    {\n        /** @var Repository $config */\n        $config = config();\n        if ($config->get('debugbar.storage.enabled')) {\n            $driver = strtolower($config->get('debugbar.storage.driver', 'file'));\n\n            switch ($driver) {\n                case 'pdo':\n                    $connection = $config->get('debugbar.storage.connection');\n                    $table = $this->app['db']->getTablePrefix() . 'phpdebugbar';\n                    $pdo = $this->app['db']->connection($connection)->getPdo();\n                    $storage = new PdoStorage($pdo, $table);\n                    break;\n                case 'redis':\n                    $connection = $config->get('debugbar.storage.connection');\n                    $client = $this->app['redis']->connection($connection);\n                    if (is_a($client, 'Illuminate\\Redis\\Connections\\Connection', false)) {\n                        $client = $client->client();\n                    }\n                    $storage = new RedisStorage($client);\n                    break;\n                case 'custom':\n                    $class = $config->get('debugbar.storage.provider');\n                    $storage = $this->app->make($class);\n                    break;\n                case 'socket':\n                    throw new \\RuntimeException('Socket storage is not supported anymore.');\n                case 'file':\n                    $path = $config->get('debugbar.storage.path');\n                    $storage = new FileStorage($path);\n                    break;\n                case 'sqlite':\n                    $path = $config->get('debugbar.storage.path');\n                    $storage = new SqliteStorage($path . '/debugbar.sqlite');\n                    break;\n                default:\n                    throw new \\RuntimeException('Invalid storage selected: ' . $driver);\n\n            }\n\n            $debugbar->setStorage($storage);\n        }\n    }\n\n    protected function addClockworkHeaders(SymfonyResponse $response): void\n    {\n        $prefix = config('debugbar.route_prefix');\n        $response->headers->set('X-Clockwork-Id', $this->getCurrentRequestId(), true);\n        $response->headers->set('X-Clockwork-Version', \"9\", true);\n        $response->headers->set('X-Clockwork-Path', $prefix . '/clockwork/', true);\n    }\n\n    /**\n     * Add Server-Timing headers for the TimeData collector\n     *\n     * @see https://www.w3.org/TR/server-timing/\n     */\n    protected function addServerTimingHeaders(SymfonyResponse $response): void\n    {\n        if ($this->hasCollector('time')) {\n            $collector = $this->timeCollector;\n\n            $headers = [];\n            foreach ($collector->collect()['measures'] as $m) {\n                $headers[] = sprintf('app;desc=\"%s\";dur=%F', str_replace([\"\\n\", \"\\r\"], ' ', str_replace('\"', \"'\", $m['label'])), $m['duration'] * 1000);\n            }\n\n            $response->headers->set('Server-Timing', $headers, false);\n        }\n    }\n\n    private function getRemoteServerReplacements(): array\n    {\n        $localPath = config('debugbar.local_sites_path') ?: base_path();\n        $remotePaths = array_filter(explode(',', config('debugbar.remote_sites_path') ?: '')) ?: [base_path()];\n\n        return array_fill_keys($remotePaths, $localPath);\n    }\n}\n"
  },
  {
    "path": "src/LaravelHttpDriver.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar;\n\nuse DebugBar\\HttpDriverInterface;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Cookie;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nclass LaravelHttpDriver implements HttpDriverInterface\n{\n    public function __construct(protected Request $request, protected ?Response $response = null) {}\n\n    public function setRequest(Request $request): void\n    {\n        $this->request = $request;\n    }\n\n    public function setResponse(?Response $response): void\n    {\n        $this->response = $response;\n    }\n\n    public function setHeaders(array $headers): void\n    {\n        if (!is_null($this->response)) {\n            $this->response->headers->add($headers);\n        }\n    }\n\n    public function output(string $content): void\n    {\n        if (!is_null($this->response)) {\n            $existingContent = $this->response->getContent();\n            $content = $existingContent ? $existingContent . $content : $content;\n            $this->response->setContent($content);\n        }\n    }\n\n    public function isSessionStarted(): bool\n    {\n        return true;\n    }\n\n    public function setSessionValue(string $name, mixed $value): void\n    {\n        if ($value !== null) {\n            $value = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);\n        }\n\n        $cookie = Cookie::make($name, $value, 0);\n        if ($this->response) {\n            $this->response->headers->setCookie($cookie);\n        } else {\n            Cookie::queue($cookie);\n        }\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function hasSessionValue(string $name): bool\n    {\n        return $this->request->hasCookie($name);\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getSessionValue(string $name): mixed\n    {\n        $value = $this->request->cookie($name);\n        if ($value !== null) {\n            $value = json_decode($value, true);\n        }\n\n        return $value;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function deleteSessionValue(string $name): void\n    {\n        $this->setSessionValue($name, null);\n    }\n}\n"
  },
  {
    "path": "src/Middleware/DebugbarEnabled.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\n\nreadonly class DebugbarEnabled\n{\n    /**\n     * Create a new middleware instance.\n     *\n     */\n    public function __construct(protected LaravelDebugbar $debugbar) {}\n\n    /**\n     * Handle an incoming request.\n     *\n     * @param Request $request\n     */\n    public function handle($request, Closure $next): mixed\n    {\n        if (!$this->debugbar->isEnabled()) {\n            abort(404);\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "src/Middleware/StopRecordingTelescope.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Laravel\\Telescope\\Telescope;\n\nreadonly class StopRecordingTelescope\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param Request $request\n     */\n    public function handle($request, Closure $next): mixed\n    {\n        if (class_exists(Telescope::class)) {\n            Telescope::stopRecording();\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "src/Requests/AssetRequest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass AssetRequest extends FormRequest\n{\n    public function rules(): array\n    {\n        return [\n            'type' => ['required', 'string', 'in:js,css'],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/Requests/CacheDeleteRequest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass CacheDeleteRequest extends FormRequest\n{\n    public function authorize(): bool\n    {\n        return $this->hasValidSignature() && debugbar()->isStorageOpen($this);\n    }\n\n    public function rules(): array\n    {\n        return [\n            'tags' => ['sometimes', 'array'],\n            'tags.*' => ['string'],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/Requests/OpenHandlerRequest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass OpenHandlerRequest extends FormRequest\n{\n    public function rules(): array\n    {\n        return [\n            'op' => ['nullable', 'string'],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/Requests/QueriesExplainRequest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass QueriesExplainRequest extends FormRequest\n{\n    public function rules(): array\n    {\n        return [\n            'connection' => ['required', 'string'],\n            'query' => ['required', 'string'],\n            'bindings' => ['nullable', 'array'],\n            'hash' => ['required', 'string'],\n            'mode' => ['nullable', 'string', 'in:explain,visual,result'],\n            'format' => ['nullable', 'string'],\n        ];\n    }\n}\n"
  },
  {
    "path": "src/ServiceProvider.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar;\n\nuse DebugBar\\DataFormatter\\DataFormatter;\nuse DebugBar\\DataFormatter\\DataFormatterInterface;\nuse DebugBar\\DebugBar;\nuse Fruitcake\\LaravelDebugbar\\Console\\ClearCommand;\nuse Fruitcake\\LaravelDebugbar\\Support\\Octane\\ResetDebugbar;\nuse Illuminate\\Cookie\\Middleware\\EncryptCookies;\nuse Illuminate\\Contracts\\Events\\Dispatcher;\nuse Illuminate\\Foundation\\Events\\Terminating;\nuse Illuminate\\Foundation\\Http\\Events\\RequestHandled;\nuse Illuminate\\Queue\\Events\\JobProcessed;\nuse Illuminate\\Queue\\Events\\JobProcessing;\nuse Illuminate\\Support\\Collection;\nuse Laravel\\Octane\\Events\\RequestReceived;\n\nclass ServiceProvider extends \\Illuminate\\Support\\ServiceProvider\n{\n    /**\n     * Register the service provider.\n     *\n     */\n    public function register(): void\n    {\n        $configPath = __DIR__ . '/../config/debugbar.php';\n        $this->mergeConfigFrom($configPath, 'debugbar');\n\n        $this->app->alias(\n            DataFormatter::class,\n            DataFormatterInterface::class,\n        );\n\n        $this->app->singleton(LaravelDebugbar::class);\n        $this->app->alias(LaravelDebugbar::class, 'debugbar');\n        $this->app->alias(LaravelDebugbar::class, DebugBar::class);\n\n        Collection::macro('debug', function (): \\Illuminate\\Support\\Collection {\n            debug($this);\n            return $this;\n        });\n    }\n\n    /**\n     * Bootstrap the application events.\n     *\n     */\n    public function boot(Dispatcher $events): void\n    {\n        if ($this->app->runningInConsole()) {\n            $configPath = __DIR__ . '/../config/debugbar.php';\n            $this->publishes([$configPath => $this->getConfigPath()], 'config');\n\n            $this->commands([ClearCommand::class]);\n        }\n\n        // Eearly return if debugbar can not enabled\n        if (!LaravelDebugbar::canBeEnabled()) {\n            return;\n        }\n\n        $this->loadRoutesFrom(__DIR__ . '/debugbar-routes.php');\n        // Resolve the LaravelDebugbar instance during boot to force it to be loaded in the Octane sandbox\n        try {\n            $debugbar = $this->app->make(LaravelDebugbar::class);\n        } catch (\\Throwable $e) {\n            // Errors can occur when removing LaravelDebugbar with composer scripts, when php-debugbar is not installed\n            report($e);\n            return;\n        }\n\n        // Reset the debugbar instance on each new Octane request\n        $events->listen(RequestReceived::class, ResetDebugbar::class);\n\n        // Handle response\n        $events->listen(RequestHandled::class, function ($event) use ($debugbar): void {\n            $debugbar->handleResponse($event->request, $event->response);\n        });\n\n        // Store any data collected during termination but not already stored\n        $events->listen(Terminating::class, function ($event) use ($debugbar): void {\n            $debugbar->terminate();\n        });\n\n        if (config('debugbar.collect_jobs')) {\n            $events->listen(JobProcessing::class, function (JobProcessing $event) use ($debugbar): void {\n                // Sync jobs in non-console jobs are just requests\n                if ($event->connectionName === 'sync' && !$this->app->runningInConsole()) {\n                    return;\n                }\n\n                $debugbar->enable();\n                $debugbar->setProcessingJob($event->job);\n            });\n\n            $events->listen(JobProcessed::class, function (JobProcessed $event) use ($debugbar): void {\n                if ($debugbar->getProcessingJob()) {\n                    $debugbar->collect();\n                    $debugbar->setProcessingJob(null);\n                    $debugbar->reset();\n                }\n            });\n        }\n\n        // Exclude debugbar cookies from encryption\n        EncryptCookies::except($debugbar->getStackDataSessionNamespace());\n\n        // Attach listeners when debugbar should be enabled\n        if ($debugbar->isEnabled() && !$debugbar->requestIsExcluded($this->app['request'])) {\n            $debugbar->boot();\n        }\n\n        // Register boot time, regardless of already being booted\n        $this->booted(fn() => $debugbar->booted());\n    }\n\n    /**\n     * Get the config path\n     *\n     */\n    protected function getConfigPath(): string\n    {\n        return config_path('debugbar.php');\n    }\n}\n"
  },
  {
    "path": "src/Support/Clockwork/ClockworkCollector.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Support\\Clockwork;\n\nuse DebugBar\\DataCollector\\DataCollector;\nuse DebugBar\\DataCollector\\DataCollectorInterface;\nuse DebugBar\\DataCollector\\Renderable;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\n/**\n *\n * Based on \\Symfony\\Component\\HttpKernel\\DataCollector\\RequestDataCollector by Fabien Potencier <fabien@symfony.com>\n *\n */\nclass ClockworkCollector extends DataCollector implements DataCollectorInterface, Renderable\n{\n    protected Request $request;\n    protected Response $response;\n\n    public function __construct(\n        Request $request,\n        Response $response\n    ) {\n        $this->request = $request;\n        $this->response = $response;\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getName(): string\n    {\n        return 'clockwork';\n    }\n\n    /**\n     * {@inheritDoc}\n     */\n    public function getWidgets(): array\n    {\n        return [];\n    }\n\n    /**\n     * {@inheritdoc}\n     */\n    public function collect(): array\n    {\n        $request = $this->request;\n        $response = $this->response;\n\n        $data = [\n            'getData' => $request->query->all(),\n            'postData' => $request->request->all(),\n            'headers' => $request->headers->all(),\n            'cookies' => $request->cookies->all(),\n            'uri' => $request->getRequestUri(),\n            'method' => $request->getMethod(),\n            'responseStatus' => $response->getStatusCode(),\n        ];\n\n        if ($this->request->hasSession()) {\n            $data['sessionData'] = $this->request->getSession()->all();\n        }\n\n        if (isset($data['headers']['authorization'][0])) {\n            $data['headers']['authorization'][0] = substr($data['headers']['authorization'][0], 0, 12) . '******';\n        }\n\n        return $this->hideMaskedValues($data);\n    }\n}\n"
  },
  {
    "path": "src/Support/Clockwork/Converter.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Support\\Clockwork;\n\nclass Converter\n{\n    /**\n     * Convert the phpdebugbar data to Clockwork format.\n     *\n     * @param array $data\n     *\n     */\n    public function convert($data): array\n    {\n        $meta = $data['__meta'];\n\n        // Default output\n        $output = [\n            'id' => $meta['id'],\n            'method' => $meta['method'],\n            'uri' => $meta['uri'],\n            'time' => $meta['utime'],\n            'headers' => [],\n            'cookies' => [],\n            'emailsData' => [],\n            'getData' => [],\n            'log' => [],\n            'postData' => [],\n            'sessionData' => [],\n            'timelineData' => [],\n            'viewsData' => [],\n            'controller' => null,\n            'responseTime' => null,\n            'responseStatus' => null,\n            'responseDuration' => 0,\n        ];\n\n        if (isset($data['clockwork'])) {\n            $output = array_merge($output, $data['clockwork']);\n        }\n\n        if (isset($data['memory']['peak_usage'])) {\n            $output['memoryUsage'] = $data['memory']['peak_usage'];\n        }\n\n        if (isset($data['time']['measures'])) {\n            $time = $data['time'];\n            $output['time'] = $time['start'];\n            $output['responseTime'] = $time['end'];\n            $output['responseDuration'] = $time['duration'] * 1000;\n            foreach ($time['measures'] as $measure) {\n                $output['timelineData'][] = [\n                    'data' => [],\n                    'description' => $measure['label'],\n                    'duration' => $measure['duration'] * 1000,\n                    'end' => $measure['end'],\n                    'start' => $measure['start'],\n                    'relative_start' => $measure['start'] - $time['start'],\n                ];\n            }\n        }\n\n        if (isset($data['route'])) {\n            $route = $data['route'];\n\n            $controller = null;\n            if (isset($route['controller'])) {\n                $controller = $route['controller'];\n            } elseif (isset($route['uses'])) {\n                $controller = $route['uses'];\n            }\n\n            $output['controller'] = preg_replace('/<a\\b[^>]*>(.*?)<\\/a>/i', '', (string) $controller) ?: null;\n\n            [$method, $uri] = explode(' ', $route['uri'], 2);\n\n            $output['routes'][] = [\n                'action' => $output['controller'],\n                'after' => $route['after'] ?? null,\n                'before' => $route['before'] ?? null,\n                'method' => $method,\n                'name' => $route['as'] ?? null,\n                'uri' => $uri,\n            ];\n        }\n\n        if (isset($data['messages']['messages'])) {\n            foreach ($data['messages']['messages'] as $message) {\n                $output['log'][] = [\n                    'message' => $message['message'],\n                    'time' => $message['time'],\n                    'level' => $message['label'],\n                ];\n            }\n        }\n\n        if (isset($data['queries']['statements'])) {\n            $queries = $data['queries'];\n            foreach ($queries['statements'] as $statement) {\n                if ($statement['type'] === 'explain' || $statement['type'] === 'info') {\n                    continue;\n                }\n                $output['databaseQueries'][] = [\n                    'query' => $statement['sql'],\n                    'bindings' => $statement['params'],\n                    'duration' => $statement['duration'] * 1000,\n                    'time' => $statement['start'] ?? null,\n                    'connection' => $statement['connection'],\n                ];\n            }\n\n            $output['databaseDuration'] = $queries['accumulated_duration'] * 1000;\n        }\n\n        if (isset($data['models']['data'])) {\n            $output['modelsActions'] = [];\n            $output['modelsCreated'] = [];\n            $output['modelsUpdated'] = [];\n            $output['modelsDeleted'] = [];\n            $output['modelsRetrieved'] = [];\n\n            foreach ($data['models']['data'] as $model => $value) {\n                foreach ($value as $event => $count) {\n                    $eventKey = 'models' . ucfirst($event);\n                    if (isset($output[$eventKey])) {\n                        $output[$eventKey][$model] = $count;\n                    }\n                }\n            }\n        }\n\n        if (isset($data['views']['templates'])) {\n            foreach ($data['views']['templates'] as $view) {\n                $output['viewsData'][] = [\n                    'description' => 'Rendering a view',\n                    'duration' => 0,\n                    'end' => 0,\n                    'start' => $view['start'] ?? 0,\n                    'data' => [\n                        'name' => $view['name'],\n                        'data' => $view['params'],\n                    ],\n                ];\n            }\n        }\n\n        if (isset($data['event']['measures'])) {\n            foreach ($data['event']['measures'] as $event) {\n                $event['data'] = [];\n                $event['listeners'] = [];\n                foreach ($event['params'] ?? [] as $key => $param) {\n                    $event[is_numeric($key) ? 'data' : 'listeners'] = $param;\n                }\n                $output['events'][] = [\n                    'event' => ['event' => $event['label']],\n                    'data' => $event['data'],\n                    'time' => $event['start'],\n                    'duration' => $event['duration'] * 1000,\n                    'listeners' => $event['listeners'],\n                ];\n            }\n        }\n\n        if (isset($data['symfonymailer_mails']['mails'])) {\n            foreach ($data['symfonymailer_mails']['mails'] as $mail) {\n                $output['emailsData'][] = [\n                    'data' => [\n                        'to' => implode(', ', $mail['to']),\n                        'subject' => $mail['subject'],\n                        'headers' => isset($mail['headers']) ? explode(\"\\n\", $mail['headers']) : null,\n                    ],\n                ];\n            }\n        }\n\n        return $output;\n    }\n}\n"
  },
  {
    "path": "src/Support/Explain.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Support;\n\nuse DebugBar\\DataCollector\\DataCollector;\nuse Exception;\nuse Illuminate\\Database\\ConnectionInterface;\nuse Illuminate\\Database\\QueryException;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Http;\n\nclass Explain\n{\n    public function isReadOnlyQuery(string $query): bool\n    {\n        return (bool) preg_match('/^(SELECT|WITH)\\b/i', ltrim($query));\n    }\n\n    public function isRawExplainSupported(string $driver, ?array $bindings): bool\n    {\n        return in_array($driver, ['mariadb', 'mysql', 'pgsql'], true) && $bindings !== null;\n    }\n\n    public function isVisualExplainSupported(string $connection): bool\n    {\n        $driver = DB::connection($connection)->getDriverName();\n        if ($driver === 'pgsql') {\n            return true;\n        }\n        if ($driver === 'mysql') {\n            // Laravel 11 added a new MariaDB database driver but older Laravel versions handle MySQL and MariaDB with\n            // the same driver - and even with new versions you can use the MySQL driver while connection to a MariaDB\n            // database. This query uses a feature implemented only in MariaDB to differentiate them.\n            try {\n                DB::connection($connection)->select('SELECT * FROM seq_1_to_1');\n\n                return false;\n            } catch (QueryException) {\n                // This exception is expected when using MySQL as sequence tables are only available with MariaDB. So\n                // the exception gets silenced as the check for MySQL has succeeded.\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    public function confirmVisualExplain(string $connection): ?string\n    {\n        return match (DB::connection($connection)->getDriverName()) {\n            'mysql' => 'The query and EXPLAIN output is sent to mysqlexplain.com. Do you want to continue?',\n            'pgsql' => 'The query and EXPLAIN output is sent to explain.dalibo.com. Do you want to continue?',\n            default => null,\n        };\n    }\n\n    public function hash(string $connection, string $sql, ?array $bindings): string\n    {\n        $bindings = json_encode($bindings);\n\n        return hash_hmac('sha256', \"{$connection}::{$sql}::{$bindings}\", config('app.key'));\n    }\n\n    private function verify(string $connection, string $sql, array $bindings, string $hash): void\n    {\n        $computedHash = $this->hash($connection, $sql, $bindings);\n\n        if (!hash_equals($computedHash, $hash)) {\n            throw new Exception('Query to execute could not be verified.');\n        }\n    }\n\n    public function generateSelectResult(string $connection, string $sql, array $bindings, string $hash, ?string $format): array\n    {\n        $this->verify($connection, $sql, $bindings, $hash);\n        $this->validateReadOnlyQuery($sql);\n\n        $result = DB::connection($connection)->select($sql, $bindings);\n\n        if ($format === 'dump') {\n            $result = DataCollector::getDefaultDataFormatter()->formatVar($result);\n        }\n\n        return ['result' => $result];\n    }\n\n    public function generateRawExplain(string $connection, string $sql, array $bindings, string $hash): array\n    {\n        $this->verify($connection, $sql, $bindings, $hash);\n        $this->validateReadOnlyQuery($sql);\n\n        $connection = DB::connection($connection);\n\n        return match ($driver = $connection->getDriverName()) {\n            'mariadb', 'mysql' => $connection->select(\"EXPLAIN {$sql}\", $bindings),\n            'pgsql' => array_column($connection->select(\"EXPLAIN {$sql}\", $bindings), 'QUERY PLAN'),\n            default => throw new Exception(\"Visual explain not available for driver '{$driver}'.\"),\n        };\n    }\n\n    public function generateVisualExplain(string $connection, string $sql, array $bindings, string $hash): string\n    {\n        $this->verify($connection, $sql, $bindings, $hash);\n        $this->validateReadOnlyQuery($sql);\n\n        if (!$this->isVisualExplainSupported($connection)) {\n            throw new Exception('Visual explain not available for this connection.');\n        }\n\n        $connection = DB::connection($connection);\n\n        return match ($connection->getDriverName()) {\n            'mysql' => $this->generateVisualExplainMysql($connection, $sql, $bindings),\n            'pgsql' => $this->generateVisualExplainPgsql($connection, $sql, $bindings),\n            default => throw new Exception(\"Visual explain not available for driver '{$connection->getDriverName()}'.\"),\n        };\n    }\n\n    private function validateReadOnlyQuery(string $sql): void\n    {\n        $normalized = ltrim($sql);\n\n        if (!$this->isReadOnlyQuery($normalized)) {\n            throw new Exception('Only SELECT queries can be explained or executed.');\n        }\n    }\n\n    private static function redactBindings(array $bindings): array\n    {\n        return array_map(fn() => '?', $bindings);\n    }\n\n    private function generateVisualExplainMysql(ConnectionInterface $connection, string $query, array $bindings): string\n    {\n        return Http::withHeaders([\n            'User-Agent' => 'fruitcake/laravel-debugbar',\n        ])->post('https://api.mysqlexplain.com/v2/explains', [\n            'query' => $query,\n            'bindings' => self::redactBindings($bindings),\n            'version' => $connection->selectOne(\"SELECT VERSION()\")->{'VERSION()'},\n            'explain_json' => $connection->selectOne(\"EXPLAIN FORMAT=JSON {$query}\", $bindings)->EXPLAIN,\n            'explain_tree' => rescue(fn() => $connection->selectOne(\"EXPLAIN FORMAT=TREE {$query}\", $bindings)->EXPLAIN, report: false),\n        ])->throw()->json('url');\n    }\n\n    private function generateVisualExplainPgsql(ConnectionInterface $connection, string $query, array $bindings): string\n    {\n        return (string) Http::asForm()->post('https://explain.dalibo.com/new', [\n            'query' => $query,\n            'plan' => $connection->selectOne(\"EXPLAIN (FORMAT JSON) {$query}\", $bindings)->{'QUERY PLAN'},\n            'title' => '',\n        ])->effectiveUri();\n    }\n}\n"
  },
  {
    "path": "src/Support/Octane/ResetDebugbar.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Support\\Octane;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Laravel\\Octane\\Events\\RequestReceived;\n\nclass ResetDebugbar\n{\n    /**\n     * Handle the event.\n     *\n     */\n    public function handle(RequestReceived $event): void\n    {\n        if (! $event->sandbox->resolved(LaravelDebugbar::class)) {\n            return;\n        }\n\n        with($event->sandbox->make(LaravelDebugbar::class), function (LaravelDebugbar $debugbar) use ($event): void {\n            $debugbar->setApplication($event->sandbox);\n            $debugbar->setRequest($event->request);\n            $debugbar->reset();\n\n            if ($debugbar->isEnabled() && !$debugbar->requestIsExcluded($event->request)) {\n                $debugbar->boot();\n            }\n\n            if ($requestStartTime = $event->request->server->get('REQUEST_TIME_FLOAT')) {\n                $debugbar->getTimeCollector()->setRequestStartTime((float) $requestStartTime);\n            }\n            $debugbar->startMeasure('application', 'Application', 'time');\n        });\n    }\n}\n"
  },
  {
    "path": "src/Twig/Extension/Debug.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Twig\\Extension;\n\nuse DebugBar\\Bridge\\Twig\\DebugTwigExtension;\nuse Twig\\Environment;\n\n/**\n * Access debugbar debug in your Twig templates.\n */\nclass Debug extends DebugTwigExtension\n{\n    public function debug(Environment $env, $context)\n    {\n        if (!$this->messagesCollector) {\n            $app = app();\n            if ($app->bound('debugbar') && $app['debugbar']->hasCollector('messages')) {\n                $this->messagesCollector = $app['debugbar']['messages'];\n            }\n        }\n\n        parent::debug($env, $context);\n    }\n}\n"
  },
  {
    "path": "src/Twig/Extension/Dump.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Twig\\Extension;\n\nuse DebugBar\\Bridge\\Twig\\DumpTwigExtension;\n\n/**\n * Dump variables using the DataFormatter\n */\nclass Dump extends DumpTwigExtension {}\n"
  },
  {
    "path": "src/Twig/Extension/Stopwatch.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Twig\\Extension;\n\nuse DebugBar\\Bridge\\Twig\\MeasureTwigExtension;\nuse DebugBar\\Bridge\\Twig\\MeasureTwigTokenParser;\nuse Illuminate\\Foundation\\Application;\n\n/**\n * Access debugbar time measures in your Twig templates.\n * Based on Symfony\\Bridge\\Twig\\Extension\\StopwatchExtension\n */\nclass Stopwatch extends MeasureTwigExtension\n{\n    /**\n     * @var \\Fruitcake\\LaravelDebugbar\\LaravelDebugbar\n     */\n    protected $debugbar;\n\n    /**\n     * Create a new time measure extension.\n     *\n     */\n    public function __construct(Application $app)\n    {\n        if ($app->bound('debugbar')) {\n            $this->debugbar = $app['debugbar'];\n        }\n\n        parent::__construct(null, 'stopwatch');\n    }\n\n    public function getDebugbar()\n    {\n        return $this->debugbar;\n    }\n\n    public function getTokenParsers()\n    {\n        return [\n            /*\n             * {% measure foo %}\n             * Some stuff which will be recorded on the timeline\n             * {% endmeasure %}\n             */\n            new MeasureTwigTokenParser(!is_null($this->debugbar), $this->tagName, $this->getName()),\n        ];\n    }\n\n    public function startMeasure(...$arg)\n    {\n        if (!$this->debugbar || !$this->debugbar->hasCollector('time')) {\n            return;\n        }\n\n        $this->debugbar->getCollector('time')->startMeasure(...$arg);\n    }\n\n    public function stopMeasure(...$arg)\n    {\n        if (!$this->debugbar || !$this->debugbar->hasCollector('time')) {\n            return;\n        }\n\n        $this->debugbar->getCollector('time')->stopMeasure(...$arg);\n    }\n}\n"
  },
  {
    "path": "src/debugbar-routes.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nuse Fruitcake\\LaravelDebugbar\\Controllers\\AssetController;\nuse Fruitcake\\LaravelDebugbar\\Controllers\\CacheController;\nuse Fruitcake\\LaravelDebugbar\\Controllers\\OpenHandlerController;\nuse Fruitcake\\LaravelDebugbar\\Controllers\\QueriesController;\nuse Fruitcake\\LaravelDebugbar\\Controllers\\TelescopeController;\nuse Fruitcake\\LaravelDebugbar\\Middleware\\DebugbarEnabled;\nuse Fruitcake\\LaravelDebugbar\\Middleware\\StopRecordingTelescope;\n\n$routeConfig = [\n    'prefix' => app('config')->get('debugbar.route_prefix'),\n    'domain' => app('config')->get('debugbar.route_domain'),\n    'middleware' => array_merge(\n        app('config')->get('debugbar.route_middleware', []),\n        [DebugbarEnabled::class, StopRecordingTelescope::class]\n    ),\n];\n\napp('router')->group($routeConfig, function ($router): void {\n    $router->get('open', [OpenHandlerController::class, 'handle'])->name('debugbar.openhandler');\n    $router->delete('cache/{key}', [CacheController::class, 'delete'])->where('key', '.*')->name('debugbar.cache.delete');\n    $router->post('queries/explain', [QueriesController::class, 'explain'])->name('debugbar.queries.explain');\n    $router->get('clockwork/{id}', [OpenHandlerController::class, 'clockwork'])->name('debugbar.clockwork');\n    $router->get('assets', [AssetController::class, 'getAssets'])->name('debugbar.assets');\n\n    if (class_exists(\\Laravel\\Telescope\\Telescope::class)) {\n        $router->get('telescope/{id}', [TelescopeController::class, 'show'])->name('debugbar.telescope');\n    }\n});\n"
  },
  {
    "path": "src/helpers.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nif (!function_exists('debugbar')) {\n    /**\n     * Get the Debugbar instance\n     *\n     */\n    function debugbar(?string $collector = null): \\Fruitcake\\LaravelDebugbar\\LaravelDebugbar|\\DebugBar\\DataCollector\\DataCollectorInterface|null\n    {\n        $debugbar = app(\\Fruitcake\\LaravelDebugbar\\LaravelDebugbar::class);\n        if ($collector) {\n            return $debugbar->hasCollector($collector) ? $debugbar->getCollector($collector) : null;\n        }\n\n        return $debugbar;\n    }\n}\n\nif (!function_exists('debug')) {\n    /**\n     * Adds one or more messages to the MessagesCollector\n     *\n     */\n    function debug(mixed ...$value): void\n    {\n        $debugbar = debugbar();\n        foreach ($value as $message) {\n            $debugbar->addMessage($message, 'debug');\n        }\n    }\n}\n"
  },
  {
    "path": "tests/BrowserTestCase.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests;\n\nuse Fruitcake\\LaravelDebugbar\\Facades\\Debugbar;\nuse Fruitcake\\LaravelDebugbar\\ServiceProvider;\n\nclass BrowserTestCase extends \\Orchestra\\Testbench\\Dusk\\TestCase\n{\n    protected static $baseServeHost = '127.0.0.1';\n    protected static $baseServePort = 9292;\n\n    /**\n     * Get package providers.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return array\n     */\n    protected function getPackageProviders($app)\n    {\n        return [ServiceProvider::class];\n    }\n\n    /**\n     * Get package aliases.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return array\n     */\n    protected function getPackageAliases($app)\n    {\n        return ['Debugbar' => Debugbar::class];\n    }\n}\n"
  },
  {
    "path": "tests/Controllers/AssetControllerTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Controllers;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\DebugbarTest;\n\nclass AssetControllerTest extends DebugbarTest\n{\n    public function testAssetRouteRequiresTypeParameter(): void\n    {\n        $response = $this->getJson('/_debugbar/assets');\n\n        $response->assertUnprocessable();\n    }\n\n    public function testAssetRouteRejectsInvalidType(): void\n    {\n        $response = $this->getJson('/_debugbar/assets?type=invalid');\n\n        $response->assertUnprocessable();\n    }\n\n    public function testAssetRouteAcceptsCssType(): void\n    {\n        $response = $this->get('/_debugbar/assets?type=css');\n\n        $response->assertOk();\n    }\n\n    public function testAssetRouteAcceptsJsType(): void\n    {\n        $response = $this->get('/_debugbar/assets?type=js');\n\n        $response->assertOk();\n    }\n}\n"
  },
  {
    "path": "tests/Controllers/CacheControllerTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Controllers;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\DebugbarTest;\nuse Illuminate\\Support\\Facades\\Cache;\nuse PHPUnit\\Framework\\Attributes\\DataProvider;\n\nclass CacheControllerTest extends DebugbarTest\n{\n    #[DataProvider('cacheKeyProvider')]\n    public function testItDeletesCacheKeyWithSignedUrl(string $key): void\n    {\n        Cache::put($key, 'test-value');\n        static::assertTrue(Cache::has($key));\n\n        $url = url()->signedRoute('debugbar.cache.delete', ['key' => urlencode($key)]);\n\n        $this->delete($url)->assertOk()->assertJson(['success' => true]);\n\n        static::assertFalse(Cache::has($key));\n    }\n\n    public function testItRejectsRequestWithInvalidSignature(): void\n    {\n        $key = 'test-key';\n        Cache::put($key, 'test-value');\n\n        $this->delete('/_debugbar/cache/' . $key)->assertForbidden();\n\n        static::assertTrue(Cache::has($key));\n    }\n\n    public function testItRejectsRequestWhenStorageIsNotOpen(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', false);\n        $this->resetStorageOpen();\n\n        $key = 'test-key';\n        Cache::put($key, 'test-value');\n\n        $url = url()->signedRoute('debugbar.cache.delete', ['key' => urlencode($key)]);\n\n        $this->delete($url)->assertForbidden();\n\n        static::assertTrue(Cache::has($key));\n    }\n\n    public function testItRejectsInvalidTagsParameter(): void\n    {\n        $key = 'test-key';\n        Cache::put($key, 'test-value');\n\n        $url = url()->signedRoute('debugbar.cache.delete', ['key' => urlencode($key), 'tags' => 'not-an-array']);\n\n        $this->deleteJson($url)->assertUnprocessable();\n    }\n\n    /** @return array<string, list<string>> */\n    public static function cacheKeyProvider(): array\n    {\n        return [\n            'simple key'                      => ['test-delete-key'],\n            'key with route parameter syntax' => ['pattern::category,resources/{resource}'],\n            'key with colons and slashes'     => ['key:with:colons/and/slashes'],\n        ];\n    }\n}\n"
  },
  {
    "path": "tests/Controllers/DebugbarEnabledMiddlewareTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Controllers;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse ReflectionObject;\n\nclass DebugbarEnabledMiddlewareTest extends TestCase\n{\n    public function testRoutesReturn404WhenDebugbarIsDisabled(): void\n    {\n        $this->get('/_debugbar/open')->assertNotFound();\n        $this->get('/_debugbar/assets?type=js')->assertNotFound();\n        $this->postJson('/_debugbar/queries/explain')->assertNotFound();\n        $this->delete('/_debugbar/cache/test-key')->assertNotFound();\n    }\n\n    public function testRoutesAreAccessibleWhenDebugbarIsEnabled(): void\n    {\n        $this->enableDebugbar();\n\n        // Assets route should work (or return validation error, not 404)\n        $this->get('/_debugbar/assets?type=js')->assertOk();\n\n        // OpenHandler should be accessible (not 404)\n        $response = $this->get('/_debugbar/open');\n        static::assertNotEquals(404, $response->getStatusCode());\n    }\n\n    protected function enableDebugbar(): void\n    {\n        $debugbar = app(LaravelDebugbar::class);\n        (new ReflectionObject($debugbar))\n            ->getProperty('enabled')\n            ->setValue($debugbar, true);\n    }\n}\n"
  },
  {
    "path": "tests/Controllers/OpenHandlerControllerTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Controllers;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\DebugbarTest;\n\nclass OpenHandlerControllerTest extends DebugbarTest\n{\n    public function testOpenHandlerReturnsStorageClosedMessageWhenStorageIsNotOpen(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', false);\n        $this->resetStorageOpen();\n\n        $response = $this->get('/_debugbar/open?op=find');\n\n        $response->assertOk();\n        $response->assertJsonFragment(['method' => 'ERROR']);\n    }\n\n    public function testOpenHandlerAllowsGetOpWithoutStorageOpen(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', false);\n        $this->resetStorageOpen();\n\n        // op=get is always allowed even without storage open\n        $response = $this->get('/_debugbar/open');\n\n        $response->assertOk();\n    }\n\n    public function testOpenHandlerWorksWhenStorageIsOpen(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', true);\n        $this->resetStorageOpen();\n        $this->ensureStorageDirectory();\n\n        $response = $this->get('/_debugbar/open?op=find');\n\n        $response->assertOk();\n    }\n\n    public function testOpenHandlerStorageOpenCallbackReceivesRequest(): void\n    {\n        $receivedRequest = null;\n\n        $this->app['config']->set('debugbar.storage.open', function ($request) use (&$receivedRequest) {\n            $receivedRequest = $request;\n\n            return $request->header('X-Debugbar-Token') === 'valid-token';\n        });\n        $this->resetStorageOpen();\n\n        // Without the header, callback returns false — storage is closed\n        $response = $this->get('/_debugbar/open?op=find');\n        $response->assertOk();\n        $response->assertJsonFragment(['method' => 'ERROR']);\n        static::assertNotNull($receivedRequest);\n\n        // With the header, callback returns true — storage is open\n        $this->resetStorageOpen();\n        $this->ensureStorageDirectory();\n        $response = $this->get('/_debugbar/open?op=find', ['X-Debugbar-Token' => 'valid-token']);\n        $response->assertOk();\n\n        $data = $response->json();\n        if (is_array($data) && isset($data[0]['method'])) {\n            static::assertNotEquals('ERROR', $data[0]['method']);\n        }\n    }\n\n    private function ensureStorageDirectory(): void\n    {\n        $path = config('debugbar.storage.path', storage_path('debugbar'));\n        if (!is_dir($path)) {\n            mkdir($path, 0o755, true);\n        }\n    }\n}\n"
  },
  {
    "path": "tests/Controllers/QueriesControllerTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Controllers;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\DebugbarTest;\n\nclass QueriesControllerTest extends DebugbarTest\n{\n    public function testExplainReturnsErrorWhenStorageIsNotOpen(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', false);\n        $this->app['config']->set('debugbar.options.db.explain.enabled', true);\n        $this->resetStorageOpen();\n\n        $response = $this->postJson('/_debugbar/queries/explain', [\n            'connection' => 'sqlite',\n            'query' => 'SELECT 1',\n            'bindings' => [],\n            'hash' => 'abc123',\n        ]);\n\n        $response->assertStatus(400);\n        $response->assertJson(['success' => false]);\n    }\n\n    public function testExplainReturnsErrorWhenExplainIsDisabled(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', true);\n        $this->app['config']->set('debugbar.options.db.explain.enabled', false);\n\n        $response = $this->postJson('/_debugbar/queries/explain', [\n            'connection' => 'sqlite',\n            'query' => 'SELECT 1',\n            'bindings' => [],\n            'hash' => 'abc123',\n        ]);\n\n        $response->assertStatus(400);\n        $response->assertJson([\n            'success' => false,\n            'message' => 'EXPLAIN is currently disabled in the Debugbar.',\n        ]);\n    }\n\n    public function testExplainValidatesRequiredFields(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', true);\n        $this->app['config']->set('debugbar.options.db.explain.enabled', true);\n\n        $response = $this->postJson('/_debugbar/queries/explain', []);\n\n        $response->assertUnprocessable();\n        $response->assertJsonValidationErrors(['connection', 'query', 'hash']);\n    }\n\n    public function testExplainValidatesModeValues(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', true);\n        $this->app['config']->set('debugbar.options.db.explain.enabled', true);\n\n        $response = $this->postJson('/_debugbar/queries/explain', [\n            'connection' => 'sqlite',\n            'query' => 'SELECT 1',\n            'bindings' => [],\n            'hash' => 'abc123',\n            'mode' => 'invalid',\n        ]);\n\n        $response->assertUnprocessable();\n        $response->assertJsonValidationErrors(['mode']);\n    }\n\n    public function testExplainAcceptsValidModeValues(): void\n    {\n        $this->app['config']->set('debugbar.storage.open', true);\n        $this->app['config']->set('debugbar.options.db.explain.enabled', true);\n\n        foreach (['visual', 'result'] as $mode) {\n            $response = $this->postJson('/_debugbar/queries/explain', [\n                'connection' => 'sqlite',\n                'query' => 'SELECT 1',\n                'bindings' => [],\n                'hash' => 'abc123',\n                'mode' => $mode,\n            ]);\n\n            static::assertNotEquals(422, $response->getStatusCode(), \"Mode '{$mode}' should be accepted\");\n        }\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/CacheCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\CacheCollector;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Illuminate\\Cache\\Events\\CacheHit;\nuse Illuminate\\Cache\\Events\\CacheMissed;\nuse Illuminate\\Cache\\Events\\KeyForgotten;\nuse Illuminate\\Cache\\Events\\KeyWritten;\nuse Illuminate\\Cache\\Events\\RetrievingKey;\nuse Illuminate\\Cache\\Events\\WritingKey;\nuse PHPUnit\\Framework\\Attributes\\DataProvider;\n\nclass CacheCollectorTest extends TestCase\n{\n    public function testItCollectsCacheEvents(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new KeyWritten('array', 'test-key', 'test-value', 60, []));\n        $collector->onCacheEvent(new CacheHit('array', 'test-key', 'test-value', []));\n\n        $data = $collector->collect();\n\n        static::assertEquals(2, $data['nb_measures']);\n    }\n\n    #[DataProvider('cacheKeyProvider')]\n    public function testItGeneratesDeleteUrlForCacheHit(string $key): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new CacheHit('array', $key, 'value', []));\n\n        $data        = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        static::assertArrayHasKey('delete_url', $lastMeasure);\n        static::assertStringContainsString('_debugbar/cache/', $lastMeasure['delete_url']);\n        static::assertStringContainsString(urlencode($key), $lastMeasure['delete_url']);\n    }\n\n    #[DataProvider('cacheKeyProvider')]\n    public function testItGeneratesDeleteUrlForKeyWritten(string $key): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new KeyWritten('array', $key, 'value', 60, []));\n\n        $data        = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        static::assertArrayHasKey('delete_url', $lastMeasure);\n        static::assertStringContainsString(urlencode($key), $lastMeasure['delete_url']);\n    }\n\n    #[DataProvider('sizeDataProvider')]\n    public function testItCalculatesMemoryUsageForKeyWritten(mixed $value, int $expectedSize): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new KeyWritten('array', 'size-key', $value, 60, []));\n\n        $data = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        static::assertEquals($expectedSize, $lastMeasure['memory']);\n    }\n\n    #[DataProvider('sizeDataProvider')]\n    public function testItCalculatesMemoryUsageForCacheHit(mixed $value, int $expectedSize): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new CacheHit('array', 'size-key', $value, []));\n\n        $data = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        static::assertEquals($expectedSize, $lastMeasure['memory']);\n    }\n\n    public function testItHandlesClosureValueGracefully(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new KeyWritten('array', 'closure-key', function () {\n            return 'hello';\n        }, 60, []));\n\n        $data = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        // Closures can't be serialized, so memory should be 0\n        static::assertEquals(0, $lastMeasure['memory']);\n        static::assertEquals(1, $data['nb_measures']);\n    }\n\n    public function testItHandlesClosureValueInCacheHitGracefully(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new CacheHit('array', 'closure-key', function () {\n            return 'hello';\n        }, []));\n\n        $data = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        // Closures can't be serialized, so memory should be 0\n        static::assertEquals(0, $lastMeasure['memory']);\n        static::assertEquals(1, $data['nb_measures']);\n    }\n\n    public function testCacheMissHasNoMemoryUsage(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new CacheMissed('array', 'miss-key', []));\n\n        $data = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        // CacheMissed has no value, so memory should be 0\n        static::assertEquals(0, $lastMeasure['memory']);\n    }\n\n    public function testItCollectsRememberMissPattern(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        // Simulate a remember() call: first a RetrievingKey, then a miss, then a write\n        $collector->onStartCacheEvent(new RetrievingKey('array', 'remember-key', []));\n        $collector->onCacheEvent(new CacheMissed('array', 'remember-key', []));\n\n        $collector->onStartCacheEvent(new WritingKey('array', 'remember-key', 'computed-value', 300, []));\n        $collector->onCacheEvent(new KeyWritten('array', 'remember-key', 'computed-value', 300, []));\n\n        $data = $collector->collect();\n\n        static::assertEquals(2, $data['nb_measures']);\n\n        $measures = array_values($data['measures']);\n        static::assertStringContainsString('missed', $measures[0]['label']);\n        static::assertStringContainsString('written', $measures[1]['label']);\n        static::assertGreaterThan(0, $measures[1]['memory']);\n    }\n\n    public function testItCollectsRememberHitPattern(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        // Simulate a remember() call that hits cache\n        $collector->onStartCacheEvent(new RetrievingKey('array', 'remember-key', []));\n        $collector->onCacheEvent(new CacheHit('array', 'remember-key', 'cached-value', []));\n\n        $data = $collector->collect();\n\n        static::assertEquals(1, $data['nb_measures']);\n\n        $lastMeasure = end($data['measures']);\n        static::assertStringContainsString('hit', $lastMeasure['label']);\n        static::assertGreaterThan(0, $lastMeasure['memory']);\n    }\n\n    public function testItCollectsForgottenEvent(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        $collector->onCacheEvent(new KeyForgotten('array', 'forget-key', []));\n\n        $data = $collector->collect();\n\n        static::assertEquals(1, $data['nb_measures']);\n\n        $lastMeasure = end($data['measures']);\n        static::assertStringContainsString('forgotten', $lastMeasure['label']);\n    }\n\n    public function testStartEventTimingIsUsed(): void\n    {\n        debugbar()->boot();\n\n        /** @var CacheCollector $collector */\n        $collector = debugbar()->getCollector('cache');\n\n        // Use CacheMissed (no value property) so the event hash matches between start and end\n        $collector->onStartCacheEvent(new RetrievingKey('array', 'timed-key', []));\n\n        usleep(10000);\n\n        $collector->onCacheEvent(new CacheMissed('array', 'timed-key', []));\n\n        $data = $collector->collect();\n        $lastMeasure = end($data['measures']);\n\n        static::assertGreaterThan(0.001, $lastMeasure['duration']);\n    }\n\n    /** @return array<string, array{mixed, int}> */\n    public static function sizeDataProvider(): array\n    {\n        return [\n            'string value' => ['hello world', strlen(serialize('hello world')) * 8],\n            'integer value' => [42, strlen(serialize(42)) * 8],\n            'float value' => [3.14, strlen(serialize(3.14)) * 8],\n            'boolean value' => [true, strlen(serialize(true)) * 8],\n            'null value' => [null, 0], // null fails isset() check, so no memoryUsage is calculated\n            'array value' => [['a', 'b', 'c'], strlen(serialize(['a', 'b', 'c'])) * 8],\n            'nested array' => [['key' => ['nested' => 'value']], strlen(serialize(['key' => ['nested' => 'value']])) * 8],\n            'empty string' => ['', strlen(serialize('')) * 8],\n            'large string' => [str_repeat('x', 1000), strlen(serialize(str_repeat('x', 1000))) * 8],\n            'stdClass object' => [(object) ['foo' => 'bar'], strlen(serialize((object) ['foo' => 'bar'])) * 8],\n        ];\n    }\n\n    /** @return array<string, list<string>> */\n    public static function cacheKeyProvider(): array\n    {\n        return [\n            'simple key'                      => ['simple-key'],\n            'key with route parameter syntax' => ['pattern::category,resources/{resource}'],\n            'key with colons and slashes'     => ['key:with:colons/and/slashes'],\n        ];\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/GateCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\Models\\User;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse DebugBar\\DataFormatter\\DataFormatter;\nuse Illuminate\\Support\\Facades\\Gate;\n\nclass GateCollectorTest extends TestCase\n{\n    public function testItCollectsGateChecks()\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\GateCollector $collector */\n        $collector = debugbar()->getCollector('gate');\n        $collector->setDataFormatter(new DataFormatter());\n\n        $user = new User([\n            'id' => 1,\n            'name' => 'John Doe',\n            'email' => 'john@example.com',\n            'password' => 'password',\n        ]);\n\n        $user->can('view', $user);\n\n        Gate::before(function ($user, $ability, $result, $arguments = []) {\n            return true;\n        });\n\n        $user->can('view', $user);\n\n        $collect = $collector->collect();\n        static::assertEquals(2, $collect['count']);\n\n        $gateError = $collect['messages'][0];\n        static::assertEquals('error', $gateError['label']);\n        static::assertEquals(\n            'view Fruitcake\\LaravelDebugbar\\Tests\\Models\\User(id=1)',\n            $gateError['message'],\n        );\n        static::assertEquals(\n            [\n                'ability' => '\"view\"',\n                'target' => '\"Fruitcake\\LaravelDebugbar\\Tests\\Models\\User(id=1)\"',\n                'result' => 'null',\n                'user' => '1',\n                'arguments' => 'array:1 [\n  0 => \"Fruitcake\\LaravelDebugbar\\Tests\\Models\\User(id=1)\"\n]',\n            ],\n            $gateError['context']\n        );\n\n        $gateSuccess = $collect['messages'][1];\n        static::assertEquals('success', $gateSuccess['label']);\n        static::assertEquals(\n            'view Fruitcake\\LaravelDebugbar\\Tests\\Models\\User(id=1)',\n            $gateSuccess['message'],\n        );\n        static::assertEquals(\n            $gateSuccess['context'],\n            [\n                'ability' => '\"view\"',\n                'target' => '\"Fruitcake\\LaravelDebugbar\\Tests\\Models\\User(id=1)\"',\n                'result' => 'true',\n                'user' => '1',\n                'arguments' => 'array:1 [\n  0 => \"Fruitcake\\LaravelDebugbar\\Tests\\Models\\User(id=1)\"\n]',\n            ],\n        );\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/HttpClientCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse DebugBar\\DataFormatter\\HtmlDataFormatter;\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\HttpClientCollector;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse GuzzleHttp\\Psr7\\Response as Psr7Response;\nuse Illuminate\\Http\\Client\\ConnectionException;\nuse Illuminate\\Http\\Client\\Events\\ConnectionFailed;\nuse Illuminate\\Http\\Client\\Events\\ResponseReceived;\nuse Illuminate\\Http\\Client\\Request;\nuse Illuminate\\Http\\Client\\Response;\n\nclass HttpClientCollectorTest extends TestCase\n{\n    public function testItCollectsResponseReceivedEvents()\n    {\n        $collector = new HttpClientCollector();\n\n        $request = new Request(new \\GuzzleHttp\\Psr7\\Request('GET', 'https://example.com/api/test'));\n        $psrResponse = new Psr7Response(200, ['Content-Type' => 'application/json'], '{\"success\":true}');\n        $response = new Response($psrResponse);\n\n        $event = new ResponseReceived($request, $response);\n        $collector->addEvent($event);\n\n        $data = $collector->collect();\n\n        static::assertEquals(1, $data['nb_requests']);\n        static::assertCount(1, $data['requests']);\n\n        $requestData = $data['requests'][0];\n        static::assertEquals('GET', $requestData['method']);\n        static::assertEquals('https://example.com/api/test', $requestData['url']);\n        static::assertEquals(200, $requestData['status']);\n        static::assertArrayHasKey('details', $requestData);\n    }\n\n    public function testItCollectsConnectionFailedEvents()\n    {\n        $collector = new HttpClientCollector();\n\n        $request = new Request(new \\GuzzleHttp\\Psr7\\Request('POST', 'https://example.com/api/fail'));\n        $exception = new ConnectionException('Connection failed');\n\n        $event = new ConnectionFailed($request, $exception);\n        $collector->addEvent($event);\n\n        $data = $collector->collect();\n\n        static::assertEquals(1, $data['nb_requests']);\n        static::assertCount(1, $data['requests']);\n\n        $requestData = $data['requests'][0];\n        static::assertEquals('POST', $requestData['method']);\n        static::assertEquals('https://example.com/api/fail', $requestData['url']);\n        static::assertNull($requestData['status']);\n        static::assertArrayHasKey('details', $requestData);\n\n        // Exception is not available in Laravel 10\n        if (isset($event->exception)) {\n            static::assertArrayHasKey('exception', $requestData['details']);\n        }\n    }\n\n    public function testItMasksAuthorizationHeader()\n    {\n        HttpClientCollector::setDefaultDataFormatter(new HtmlDataFormatter());\n        $collector = new HttpClientCollector();\n\n        $request = new Request(\n            new \\GuzzleHttp\\Psr7\\Request(\n                'GET',\n                'https://example.com/api/test',\n                ['Authorization' => 'Bearer secret-token']\n            )\n        );\n        $psrResponse = new Psr7Response(200, [], '');\n        $response = new Response($psrResponse);\n\n        $event = new ResponseReceived($request, $response);\n        $collector->addEvent($event);\n\n        $data = $collector->collect();\n\n        $requestData = $data['requests'][0];\n        static::assertArrayHasKey('request_headers', $requestData['details']);\n        static::assertStringNotContainsString('secret-token', $requestData['details']['request_headers']);\n    }\n\n    public function testItCollectsMultipleEvents()\n    {\n        $collector = new HttpClientCollector();\n\n        $request1 = new Request(new \\GuzzleHttp\\Psr7\\Request('GET', 'https://example.com/api/1'));\n        $psrResponse1 = new Psr7Response(200, [], '{\"id\":1}');\n        $response1 = new Response($psrResponse1);\n        $event1 = new ResponseReceived($request1, $response1);\n\n        $request2 = new Request(new \\GuzzleHttp\\Psr7\\Request('POST', 'https://example.com/api/2'));\n        $psrResponse2 = new Psr7Response(201, [], '{\"id\":2}');\n        $response2 = new Response($psrResponse2);\n        $event2 = new ResponseReceived($request2, $response2);\n\n        $collector->addEvent($event1);\n        $collector->addEvent($event2);\n\n        $data = $collector->collect();\n\n        static::assertEquals(2, $data['nb_requests']);\n        static::assertCount(2, $data['requests']);\n        static::assertEquals('GET', $data['requests'][0]['method']);\n        static::assertEquals('POST', $data['requests'][1]['method']);\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/JobsCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\Jobs\\OrderShipped;\nuse Fruitcake\\LaravelDebugbar\\Tests\\Jobs\\SendNotification;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Illuminate\\Support\\Facades\\Schema;\n\nclass JobsCollectorTest extends TestCase\n{\n    use RefreshDatabase;\n\n    protected function getEnvironmentSetUp($app)\n    {\n        $app['config']->set('debugbar.collectors.jobs', true);\n        // The `sync` and `null` driver don't dispatch events\n        // `database` or `redis` driver work great\n        $app['config']->set('queue.default', 'database');\n\n        parent::getEnvironmentSetUp($app);\n    }\n\n    public function testItCollectsDispatchedJobs()\n    {\n        $this->loadLaravelMigrations();\n        $this->createJobsTable();\n\n        debugbar()->boot();\n\n        /** @var \\DebugBar\\DataCollector\\ObjectCountCollector $collector */\n        $collector = debugbar()->getCollector('jobs');\n        $collector->setXdebugLinkTemplate('');\n        $collector->setKeyMap([]);\n        $data = [];\n\n        static::assertEquals(\n            [\n                'data' => $data,\n                'count' => 0,\n                'is_counter' => true,\n                'key_map' => [],\n            ],\n            $collector->collect(),\n        );\n\n        OrderShipped::dispatch(1);\n\n        $data[OrderShipped::class] = ['value' => 1];\n        static::assertEquals(\n            [\n                'data' => $data,\n                'count' => 1,\n                'is_counter' => true,\n                'key_map' => [],\n            ],\n            $collector->collect(),\n        );\n\n        dispatch(new SendNotification());\n        dispatch(new SendNotification());\n        dispatch(new SendNotification());\n\n        $data[SendNotification::class] = ['value' => 3];\n        static::assertEquals(\n            [\n                'data' => $data,\n                'count' => 4,\n                'is_counter' => true,\n                'key_map' => [],\n            ],\n            $collector->collect(),\n        );\n    }\n\n    protected function createJobsTable()\n    {\n        (new class extends Migration {\n            public function up()\n            {\n                if (Schema::hasTable('jobs')) {\n                    return;\n                }\n\n                Schema::create('jobs', function (Blueprint $table) {\n                    $table->bigIncrements('id');\n                    $table->string('queue')->index();\n                    $table->longText('payload');\n                    $table->unsignedTinyInteger('attempts');\n                    $table->unsignedInteger('reserved_at')->nullable();\n                    $table->unsignedInteger('available_at');\n                    $table->unsignedInteger('created_at');\n                });\n            }\n        })->up();\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/Livewire/DummyComponent.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector\\Livewire;\n\nuse Livewire\\Component;\n\nclass DummyComponent extends Component\n{\n    public string $title = 'MyComponent';\n\n    public int $counter = 1;\n\n    public function increment()\n    {\n        $this->counter++;\n    }\n\n    public function render()\n    {\n        return <<<'blade'\n                <div>\n                    Hello. You are #{{ $counter }}!\n                    <br/>\n                    <a wire:click=\"increment\" id=\"increaseLink\">Increase</a>\n                </div>\n            blade;\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/LivewireCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Composer\\InstalledVersions;\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\LivewireCollector;\nuse Fruitcake\\LaravelDebugbar\\ServiceProvider;\nuse Fruitcake\\LaravelDebugbar\\Tests\\DataCollector\\Livewire\\DummyComponent;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Livewire\\Component;\nuse Livewire\\LivewireServiceProvider;\n\nclass LivewireCollectorTest extends TestCase\n{\n    /**\n     * Get package providers.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return array\n     */\n    protected function getPackageProviders($app)\n    {\n        return [ServiceProvider::class, LivewireServiceProvider::class];\n    }\n\n    public function testItCollectsLivewireComponents()\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\GateCollector $collector */\n        $collector = debugbar()->getCollector('livewire');\n\n        static::assertInstanceOf(LivewireCollector::class, $collector);\n\n        if (version_compare(InstalledVersions::getVersion('livewire/livewire'), '3.0', '<')) {\n            $component = new DummyComponent('123');\n            $view = view('dashboard', ['_instance' => $component]);\n            $collector->addLivewire2View($view, request());\n        } else {\n            $component = new DummyComponent();\n            $component->setId('123');\n            $component->setName('fruitcake.laravel-debugbar.tests.data-collector.livewire.dummy-component');\n            $collector->addLivewireComponent($component, request());\n        }\n\n        $data = $collector->collect();\n\n        static::assertEquals('Fruitcake\\LaravelDebugbar\\Tests\\DataCollector\\Livewire\\DummyComponent fruitcake.laravel-debugbar.tests.data-collector.livewire.dummy-component #123', $data['templates'][0]['name']);\n        static::assertStringContainsString('MyComponent', $data['templates'][0]['params']['title']);\n    }\n\n    public function testItCollectsAnonymousLivewireComponents()\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\GateCollector $collector */\n        $collector = debugbar()->getCollector('livewire');\n\n        static::assertInstanceOf(LivewireCollector::class, $collector);\n\n        $component = new class extends Component {\n            public $title = 'MyComponent';\n        };\n\n        if (version_compare(InstalledVersions::getVersion('livewire/livewire'), '3.0', '<')) {\n            $component->id = '123';\n            $view = view('dashboard', ['_instance' => $component]);\n            $collector->addLivewire2View($view, request());\n        } else {\n            $component->setId('123');\n            $component->setName('fruitcake.laravel-debugbar.tests.data-collector.livewire.dummy-component');\n            $collector->addLivewireComponent($component, request());\n        }\n\n        $data = $collector->collect();\n\n        if (version_compare(InstalledVersions::getVersion('livewire/livewire'), '3.0', '<')) {\n            static::assertStringContainsString('livewire.component@anonymous.', $data['templates'][0]['name']);\n            static::assertStringContainsString('tests.data-collector.livewire-collector-test.php:', $data['templates'][0]['name']);\n            static::assertStringContainsString(' #123', $data['templates'][0]['name']);\n        } else {\n            static::assertEquals('fruitcake.laravel-debugbar.tests.data-collector.livewire.dummy-component #123', $data['templates'][0]['name']);\n        }\n        static::assertStringContainsString('MyComponent', $data['templates'][0]['params']['title']);\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/MailCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse DebugBar\\Bridge\\Symfony\\SymfonyMailCollector;\nuse DebugBar\\DataCollector\\TimeDataCollector;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Illuminate\\Support\\Facades\\Mail;\n\nclass MailCollectorTest extends TestCase\n{\n    public function testItCollectsSentMails(): void\n    {\n        debugbar()->boot();\n\n        /** @var SymfonyMailCollector $collector */\n        $collector = debugbar()->getCollector('symfonymailer_mails');\n\n        Mail::raw('Test body content', function ($message) {\n            $message->to('recipient@example.com')\n                ->subject('Test Subject');\n        });\n\n        $data = $collector->collect();\n\n        static::assertEquals(1, $data['count']);\n        static::assertCount(1, $data['mails']);\n        static::assertEquals('Test Subject', $data['mails'][0]['subject']);\n        static::assertContains('recipient@example.com', $data['mails'][0]['to']);\n    }\n\n    public function testItCollectsMultipleMails(): void\n    {\n        debugbar()->boot();\n\n        /** @var SymfonyMailCollector $collector */\n        $collector = debugbar()->getCollector('symfonymailer_mails');\n\n        Mail::raw('First mail', function ($message) {\n            $message->to('first@example.com')\n                ->subject('First Subject');\n        });\n\n        Mail::raw('Second mail', function ($message) {\n            $message->to('second@example.com')\n                ->subject('Second Subject');\n        });\n\n        $data = $collector->collect();\n\n        static::assertEquals(2, $data['count']);\n        static::assertCount(2, $data['mails']);\n        static::assertEquals('First Subject', $data['mails'][0]['subject']);\n        static::assertEquals('Second Subject', $data['mails'][1]['subject']);\n    }\n\n    public function testItAddsMailsToTimelineCollector(): void\n    {\n        debugbar()->boot();\n\n        /** @var TimeDataCollector $timeCollector */\n        $timeCollector = debugbar()->getTimeCollector();\n\n        Mail::raw('Timeline test body', function ($message) {\n            $message->to('timeline@example.com')\n                ->subject('Timeline Test');\n        });\n\n        $data = $timeCollector->collect();\n\n        $mailMeasures = array_filter($data['measures'], function ($measure) {\n            return str_starts_with($measure['label'], 'Mail: ');\n        });\n\n        static::assertNotEmpty($mailMeasures, 'Expected a mail measure in the timeline');\n\n        $mailMeasure = reset($mailMeasures);\n        static::assertEquals('Mail: Timeline Test', $mailMeasure['label']);\n        static::assertGreaterThan(0, $mailMeasure['duration']);\n    }\n\n    public function testItDoesNotAddToTimelineWhenDisabled(): void\n    {\n        $this->app['config']->set('debugbar.options.mail.timeline', false);\n\n        debugbar()->boot();\n\n        /** @var TimeDataCollector $timeCollector */\n        $timeCollector = debugbar()->getTimeCollector();\n\n        Mail::raw('No timeline body', function ($message) {\n            $message->to('notimeline@example.com')\n                ->subject('No Timeline Test');\n        });\n\n        $data = $timeCollector->collect();\n\n        $mailMeasures = array_filter($data['measures'], function ($measure) {\n            return str_starts_with($measure['label'], 'Mail: ');\n        });\n\n        static::assertEmpty($mailMeasures, 'Expected no mail measures in the timeline');\n    }\n\n    public function testItCollectsMailBody(): void\n    {\n        debugbar()->boot();\n\n        /** @var SymfonyMailCollector $collector */\n        $collector = debugbar()->getCollector('symfonymailer_mails');\n\n        Mail::raw('This is the plain text body', function ($message) {\n            $message->to('body@example.com')\n                ->subject('Body Test');\n        });\n\n        $data = $collector->collect();\n\n        static::assertEquals(1, $data['count']);\n        static::assertStringContainsString('This is the plain text body', $data['mails'][0]['body']);\n    }\n\n    public function testItHidesMailBodyWhenDisabled(): void\n    {\n        $this->app['config']->set('debugbar.options.mail.show_body', false);\n\n        debugbar()->boot();\n\n        /** @var SymfonyMailCollector $collector */\n        $collector = debugbar()->getCollector('symfonymailer_mails');\n\n        Mail::raw('Hidden body content', function ($message) {\n            $message->to('nobody@example.com')\n                ->subject('Hidden Body Test');\n        });\n\n        $data = $collector->collect();\n\n        static::assertEquals(1, $data['count']);\n        static::assertNull($data['mails'][0]['body']);\n        static::assertNull($data['mails'][0]['html']);\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/ModelsCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\Models\\Person;\nuse Fruitcake\\LaravelDebugbar\\Tests\\Models\\User;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Illuminate\\Support\\Facades\\Hash;\n\nclass ModelsCollectorTest extends TestCase\n{\n    use RefreshDatabase;\n\n    public function testItCollectsRetrievedModels()\n    {\n        $this->loadLaravelMigrations();\n        debugbar()->boot();\n\n        /** @var \\DebugBar\\DataCollector\\ObjectCountCollector $collector */\n        $collector = debugbar()->getCollector('models');\n        $collector->setXdebugLinkTemplate('');\n        $collector->collectCountSummary(false);\n        $collector->setKeyMap([]);\n        $data = [];\n\n        static::assertEquals(\n            ['data' => $data, 'key_map' => [], 'count' => 0, 'is_counter' => true],\n            $collector->collect(),\n        );\n\n        User::create([\n            'name' => 'John Doe',\n            'email' => 'john@example.com',\n            'password' => Hash::make('password'),\n        ]);\n\n        User::create([\n            'name' => 'Jane Doe',\n            'email' => 'jane@example.com',\n            'password' => Hash::make('password'),\n        ]);\n\n        $data[User::class] = ['created' => 2];\n        static::assertEquals(\n            [\n                'data' => $data,\n                'count' => 2,\n                'is_counter' => true,\n                'key_map' => [\n                ],\n            ],\n            $collector->collect(),\n        );\n\n        $user = User::first();\n\n        $data[User::class]['retrieved'] = 1;\n        static::assertEquals(\n            ['data' => $data, 'key_map' => [], 'count' => 3, 'is_counter' => true],\n            $collector->collect(),\n        );\n\n        $user->update(['name' => 'Jane Doe']);\n\n        $data[User::class]['updated'] = 1;\n        static::assertEquals(\n            [\n                'data' => $data,\n                'count' => 4,\n                'is_counter' => true,\n                'key_map' => [],\n            ],\n            $collector->collect(),\n        );\n\n        Person::all();\n\n        $data[Person::class] = ['retrieved' => 2];\n        static::assertEquals(\n            ['data' => $data, 'key_map' => [], 'count' => 6, 'is_counter' => true],\n            $collector->collect(),\n        );\n\n        $user->delete();\n\n        $data[User::class]['deleted'] = 1;\n        static::assertEquals(\n            [\n                'data' => $data,\n                'count' => 7,\n                'is_counter' => true,\n                'key_map' => [\n                ],\n            ],\n            $collector->collect(),\n        );\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/PennantCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\PennantCollector;\nuse Fruitcake\\LaravelDebugbar\\ServiceProvider;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\n\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Laravel\\Pennant\\Feature;\nuse Laravel\\Pennant\\PennantServiceProvider;\n\nclass PennantCollectorTest extends TestCase\n{\n    use RefreshDatabase;\n\n    /**\n     * Get package providers.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return array\n     */\n    protected function getPackageProviders($app)\n    {\n        if (!class_exists(PennantServiceProvider::class)) {\n            static::markTestSkipped('Pennant is not installed');\n        }\n        return [ServiceProvider::class, PennantServiceProvider::class];\n    }\n\n    /**\n     * Define database migrations.\n     *\n     * @return void\n     */\n    protected function defineDatabaseMigrations()\n    {\n        $reflection = new \\ReflectionClass(Feature::class);\n        // Load Pennant migrations\n        $this->loadMigrationsFrom(\n            dirname($reflection->getFileName()) . '/../database/migrations'\n        );\n    }\n\n    public function testItCollectsPennantValues()\n    {\n        debugbar()->boot();\n\n        Feature::define('new-api', true);\n        Feature::define('old-api', fn() => false);\n        Feature::define('api-version', fn() => '3.x');\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\GateCollector $collector */\n        $collector = debugbar()->getCollector('pennant');\n\n        static::assertInstanceOf(PennantCollector::class, $collector);\n        $data = $collector->collect();\n\n        static::assertCount(3, $data);\n        static::assertTrue($data['new-api']);\n        static::assertFalse($data['old-api']);\n        static::assertEquals('3.x', $data['api-version']);\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/QueryCollectorRuntimeDatabaseTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Illuminate\\Database\\Connection;\n\nclass QueryCollectorRuntimeDatabaseTest extends TestCase\n{\n    protected function getEnvironmentSetUp($app)\n    {\n        $app['config']->set('database.default', null);\n        $app['config']->set('database.connections', []);\n        $app['config']->set('debugbar.options.db.explain.enabled', false);\n    }\n\n    public function testCollectsQueriesFromRuntimeConnections()\n    {\n        if (version_compare($this->app->version(), '10', '<')) {\n            static::markTestSkipped('This test is not compatible with Laravel 9.x and below');\n        }\n\n        debugbar()->enable();\n\n        /** @var Connection $connection */\n        $connection = $this->app['db']->connectUsing(\n            'runtime-connection',\n            [\n                'driver' => 'sqlite',\n                'database' => ':memory:',\n            ],\n        );\n\n        $connection->statement('SELECT 1');\n\n        /** @var \\Debugbar\\DataCollector\\ExceptionsCollector $collector */\n        $exceptions = debugbar()->getCollector('exceptions');\n\n        static::assertEmpty($exceptions->getExceptions());\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector  = debugbar()->getCollector('queries');\n\n        tap($collector->collect(), function (array $collection) {\n            $this->assertEquals(1, $collection['nb_statements']);\n\n            self::assertSame('SELECT 1', $collection['statements'][1]['sql']);\n        });\n    }\n\n    public function testCollectsQueriesFromRuntimeConnectionsWithoutConnectUsing()\n    {\n        debugbar()->enable();\n\n        $this->app['config']->set('database.connections.dynamic-connection', [\n            'driver' => 'sqlite',\n            'database' => ':memory:',\n        ]);\n\n        $this->app['config']->set('database.default', 'dynamic-connection');\n\n        /** @var Connection $connection */\n        $connection = $this->app['db']->connection('dynamic-connection');\n\n        $connection->statement('SELECT 1');\n\n        /** @var \\Debugbar\\DataCollector\\ExceptionsCollector $collector */\n        $exceptions = debugbar()->getCollector('exceptions');\n\n        static::assertEmpty($exceptions->getExceptions());\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector  = debugbar()->getCollector('queries');\n\n        tap($collector->collect(), function (array $collection) {\n            $this->assertEquals(1, $collection['nb_statements']);\n\n            self::assertSame('SELECT 1', $collection['statements'][1]['sql']);\n        });\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/QueryCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Illuminate\\Database\\Events\\QueryExecuted;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Illuminate\\Support\\Arr;\n\nclass QueryCollectorTest extends TestCase\n{\n    use RefreshDatabase;\n\n    public function testItReplacesQuestionMarksBindingsCorrectly()\n    {\n        $this->loadLaravelMigrations();\n\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector  = debugbar()->getCollector('queries');\n        $collector->addQuery(new QueryExecuted(\n            \"SELECT ('[1, 2, 3]'::jsonb ?? ?) as a, ('[4, 5, 6]'::jsonb ??| ?) as b, 'hello world ? example ??' as c\",\n            [3, '{4}'],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap($collector->collect(), function (array $collection) {\n            $this->assertEquals(1, $collection['nb_statements']);\n\n            tap(Arr::first($collection['statements']), function (array $statement) {\n                $this->assertEquals([3, '{4}'], $statement['params']);\n                $this->assertEquals(<<<SQL\n                    SELECT ('[1, 2, 3]'::jsonb ? 3) as a, ('[4, 5, 6]'::jsonb ?| '{4}') as b, 'hello world ? example ??' as c\n                    SQL, $statement['sql']);\n            });\n        });\n    }\n\n    public function testDollarBindingsArePresentedCorrectly()\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->addQuery(new QueryExecuted(\n            \"SELECT a FROM b WHERE c = ? AND d = ? AND e = ?\",\n            ['$10', '$2y$10_DUMMY_BCRYPT_HASH', '$_$$_$$$_$2_$3'],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertEquals(\n                \"SELECT a FROM b WHERE c = '$10' AND d = '$2y$10_DUMMY_BCRYPT_HASH' AND e = '\\$_$\\$_$$\\$_$2_$3'\",\n                $statement['sql'],\n            );\n        });\n    }\n\n    public function testResultModeForSelectQuery(): void\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->setShowQueryResult(true);\n        $collector->addQuery(new QueryExecuted(\n            'SELECT * FROM users WHERE id = ?',\n            [1],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertNotNull($statement['explain']);\n            $this->assertContains('result', $statement['explain']['modes']);\n        });\n    }\n\n    public function testResultModeForWithQuery(): void\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->setShowQueryResult(true);\n        $collector->addQuery(new QueryExecuted(\n            'WITH cte AS (SELECT 1) SELECT * FROM cte',\n            [],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertNotNull($statement['explain']);\n            $this->assertContains('result', $statement['explain']['modes']);\n        });\n    }\n\n    public function testResultModeExcludedForNonSelectQuery(): void\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->setShowQueryResult(true);\n        $collector->addQuery(new QueryExecuted(\n            'INSERT INTO users (name) VALUES (?)',\n            ['test'],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertNull($statement['explain']);\n        });\n    }\n\n    public function testResultModeExcludedWhenDisabled(): void\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->setShowQueryResult(false);\n        $collector->addQuery(new QueryExecuted(\n            'SELECT * FROM users',\n            [],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertNull($statement['explain']);\n        });\n    }\n\n    public function testExplainModeExcludedForSqlite(): void\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->setExplainQuery(true);\n        $collector->addQuery(new QueryExecuted(\n            'SELECT * FROM users',\n            [],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertNull($statement['explain']);\n        });\n    }\n\n    public function testExplainModeExcludedWhenBindingsNull(): void\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->setExplainQuery(true);\n        $collector->setLimits(0, null);\n        $collector->addQuery(new QueryExecuted(\n            'SELECT * FROM users WHERE id = ?',\n            [1],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertNull($statement['explain']);\n        });\n    }\n\n    public function testExplainModeExcludedForNonSelectQuery(): void\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n        $collector->setExplainQuery(true);\n        $collector->addQuery(new QueryExecuted(\n            'UPDATE users SET name = ?',\n            ['test'],\n            0,\n            $this->app['db']->connection(),\n        ));\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertNull($statement['explain']);\n        });\n    }\n\n    public function testFindingCorrectPathForView()\n    {\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\QueryCollector $collector */\n        $collector = debugbar()->getCollector('queries');\n\n        view('query')\n            ->with('db', $this->app['db']->connection())\n            ->with('collector', $collector)\n            ->render();\n\n        tap(Arr::first($collector->collect()['statements']), function (array $statement) {\n            $this->assertEquals(\n                \"SELECT a FROM b WHERE c = '$10' AND d = '$2y$10_DUMMY_BCRYPT_HASH' AND e = '\\$_$\\$_$$\\$_$2_$3'\",\n                $statement['sql'],\n            );\n\n            $this->assertTrue(@file_exists($statement['backtrace'][1]->file));\n            $this->assertEquals(\n                realpath(__DIR__ . '/../resources/views/query.blade.php'),\n                realpath($statement['backtrace'][1]->file),\n            );\n        });\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/RouteCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse DebugBar\\DataFormatter\\HtmlDataFormatter;\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\RouteCollector;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse DebugBar\\DataCollector\\DataCollector;\n\nclass RouteCollectorTest extends TestCase\n{\n    /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\RouteCollector $collector */\n    private DataCollector $routeCollector;\n    protected function setUp(): void\n    {\n        parent::setUp();\n        debugbar()->boot();\n\n        $this->routeCollector = debugbar()->getCollector('route');\n    }\n\n    protected function getEnvironmentSetUp($app)\n    {\n        $app['config']->set('debugbar.collectors.route', true);\n\n        parent::getEnvironmentSetUp($app);\n    }\n\n    public function testItCollectsRouteUri()\n    {\n        $this->get('web/html');\n        static::assertSame('GET web/html', $this->routeCollector->collect()['uri']);\n\n        $this->call('POST', 'web/mw');\n        static::assertSame('POST web/mw', $this->routeCollector->collect()['uri']);\n    }\n\n    /**\n     * @dataProvider controllerData\n     */\n    public function testItCollectsWithControllerHandler($controller, $file, $url)\n    {\n        $this->get('web/show');\n\n        $collected = $this->routeCollector->collect();\n\n        static::assertNotEmpty($collected);\n        static::assertArrayHasKey('file', $collected);\n        static::assertArrayHasKey('controller', $collected);\n        static::assertStringContainsString($file, $collected['file']['value']);\n        static::assertStringContainsString($url, $collected['file']['xdebug_link']['url']);\n        static::assertStringContainsString($controller, $collected['controller']['value']);\n        static::assertStringContainsString($url, $collected['controller']['xdebug_link']['url']);\n    }\n\n    /**\n     * @dataProvider viewComponentData\n     */\n    public function testItCollectsWithViewComponentHandler($controller, $file, $url)\n    {\n        $this->get('web/view');\n\n        $collected = $this->routeCollector->collect();\n\n        static::assertStringContainsString($file, $collected['file']['value']);\n        static::assertStringContainsString($url, $collected['file']['xdebug_link']['url']);\n        static::assertStringContainsString($controller, $collected['controller']['value']);\n        static::assertStringContainsString($url, $collected['controller']['xdebug_link']['url']);\n    }\n\n    /**\n     * @dataProvider closureData\n     */\n    public function testItCollectsWithClosureHandler($file)\n    {\n        RouteCollector::setDefaultDataFormatter(new HtmlDataFormatter());\n\n        $this->get('web/html');\n\n        $collected = $this->routeCollector->collect();\n\n        static::assertNotEmpty($collected);\n        static::assertArrayHasKey('uses', $collected);\n        static::assertArrayHasKey('file', $collected);\n        static::assertStringContainsString('Closure', $collected['uses']);\n        static::assertStringContainsString($file, $collected['file']['value']);\n    }\n\n    public function testItCollectsMiddleware()\n    {\n        $this->call('POST', 'web/mw');\n\n        $collected = $this->routeCollector->collect();\n\n        static::assertNotEmpty($collected);\n        static::assertArrayHasKey('middleware', $collected);\n        static::assertStringContainsString('MockMiddleware', $collected['middleware']);\n    }\n\n    public static function controllerData()\n    {\n        $filePath = urlencode(str_replace('\\\\', '/', realpath(__DIR__ . '/../Mocks/MockController.php')));\n        return [['MockController@show',\n            'MockController.php',\n            sprintf('phpstorm://open?file=%s', $filePath),\n        ]];\n    }\n\n    public static function viewComponentData()\n    {\n        $filePath = urlencode(str_replace('\\\\', '/', realpath(__DIR__ . '/../Mocks/MockViewComponent.php')));\n        return [['MockViewComponent@render',\n            'MockViewComponent.php',\n            sprintf('phpstorm://open?file=%s', $filePath),\n        ]];\n    }\n\n    public static function closureData()\n    {\n        return [['TestCase.php']];\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/SessionCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Fruitcake\\LaravelDebugbar\\DataCollector\\SessionCollector;\nuse DebugBar\\DataFormatter\\DataFormatter;\n\nclass SessionCollectorTest extends TestCase\n{\n    protected function getEnvironmentSetUp($app)\n    {\n        parent::getEnvironmentSetUp($app);\n    }\n\n    public function testItCollectsSessionVariables()\n    {\n        $collector = new SessionCollector();\n        $collector->setDataFormatter(new DataFormatter());\n\n        static::assertEmpty($collector->collect());\n\n        $this->withSession(['testVariable' => \"1\", 'secret' => 'testSecret'])->get('/');\n\n        $collected = $collector->collect();\n\n        static::assertNotEmpty($collected);\n        static::assertArrayHasKey('secret', $collected);\n        static::assertArrayHasKey('testVariable', $collected);\n        static::assertEquals('te***et', $collected['secret']);\n        static::assertEquals(\"1\", $collected['testVariable']);\n\n        $this->flushSession();\n        static::assertCount(0, $collector->collect());\n    }\n}\n"
  },
  {
    "path": "tests/DataCollector/ViewCollectorTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataCollector;\n\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Illuminate\\Support\\Arr;\n\nclass ViewCollectorTest extends TestCase\n{\n    use RefreshDatabase;\n\n    public function testIdeLinksAreAbsolutePaths()\n    {\n\n        debugbar()->boot();\n\n        /** @var \\Fruitcake\\LaravelDebugbar\\DataCollector\\ViewCollector $collector */\n        $collector = debugbar()->getCollector('views');\n        $collector->addView(\n            view('dashboard'),\n        );\n\n        tap(Arr::first($collector->collect()['templates']), function (array $template) {\n            $this->assertEquals(\n                'phpstorm://open?file=' . urlencode(str_replace('\\\\', '/', realpath(__DIR__ . '/../resources/views/dashboard.blade.php'))) . '&line=1',\n                $template['xdebug_link']['url'],\n            );\n        });\n    }\n}\n"
  },
  {
    "path": "tests/DataFormatter/QueryFormatterTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\DataFormatter;\n\nuse DebugBar\\DataFormatter\\QueryFormatter;\nuse Fruitcake\\LaravelDebugbar\\Tests\\TestCase;\n\nclass QueryFormatterTest extends TestCase\n{\n    public function testItFormatsArrayBindings()\n    {\n\n        $bindings = [\n            'some string',\n            [\n                'string',\n                \"Another ' string\",\n                [\n                    'nested',\n                    'array',\n                ],\n            ],\n        ];\n\n        $queryFormatter = new QueryFormatter();\n\n        $output = $queryFormatter->checkBindings($bindings);\n\n        static::assertSame($output, [\"some string\", \"[string,Another ' string,[nested,array]]\"]);\n    }\n\n    public function testItFormatsObjectBindings()\n    {\n        $object = new \\StdClass();\n        $object->attribute1 = 'test';\n\n        $bindings = [\n            'some string',\n            $object,\n        ];\n\n        $queryFormatter = new QueryFormatter();\n\n        $output = $queryFormatter->checkBindings($bindings);\n\n        static::assertSame($output, ['some string', '{\"attribute1\":\"test\"}']);\n    }\n}\n"
  },
  {
    "path": "tests/DebugbarBrowserTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests;\n\nuse Illuminate\\Routing\\Router;\nuse Laravel\\Dusk\\Browser;\nuse Illuminate\\Database\\Events\\QueryExecuted;\nuse Illuminate\\Database\\Connection;\n\nclass DebugbarBrowserTest extends BrowserTestCase\n{\n    /**\n     * Define environment setup.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return void\n     */\n    protected function getEnvironmentSetUp($app)\n    {\n        parent::getEnvironmentSetUp($app);\n\n        $app['env'] = 'local';\n        $app['config']->set('app.debug', true);\n        $app['config']->set('debugbar.hide_empty_tabs', false);\n\n        /** @var Router $router */\n        $router = $app['router'];\n\n        $this->addWebRoutes($router);\n        $this->addApiRoutes($router);\n        $this->addViewPaths();\n\n        $kernel = app(\\Illuminate\\Contracts\\Http\\Kernel::class);\n        $kernel->pushMiddleware(\\Illuminate\\Session\\Middleware\\StartSession::class);\n        $kernel->pushMiddleware(\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class);\n\n        \\Orchestra\\Testbench\\Dusk\\Options::withoutUI();\n    }\n\n    protected function addWebRoutes(Router $router)\n    {\n        $router->get('web/redirect', [\n            'uses' => function () {\n                return redirect($this->applicationBaseUrl() . '/web/plain');\n            },\n        ]);\n\n        $router->get('web/plain', [\n            'uses' => function () {\n                return 'PONG';\n            },\n        ]);\n\n        $router->get('web/html', [\n            'uses' => function () {\n                return '<html><head></head><body>HTMLPONG</body></html>';\n            },\n        ]);\n\n        $router->get('web/ajax', [\n            'uses' => function () {\n                return view('ajax');\n            },\n        ]);\n\n        $router->get('web/custom-prototype', [\n            'uses' => function () {\n\n                /** @var Connection $connection */\n                $connection = $this->app['db']->connectUsing(\n                    'runtime-connection',\n                    [\n                        'driver' => 'sqlite',\n                        'database' => ':memory:',\n                    ],\n                );\n                event(new QueryExecuted('SELECT * FROM users WHERE username = ?', ['debuguser'], 0, $connection));\n                return view('custom-prototype');\n            },\n        ]);\n\n        $router->get('web/query/{num?}', [\n            'uses' => function ($num = 1) {\n                debugbar()->boot();\n\n                /** @var Connection $connection */\n                $connection = $this->app['db']->connectUsing(\n                    'runtime-connection',\n                    [\n                        'driver' => 'sqlite',\n                        'database' => ':memory:',\n                    ],\n                );\n\n                foreach (range(1, $num) as $i) {\n                    $executedQuery = new QueryExecuted('SELECT * FROM users WHERE username = ?', ['debuguser' . $i], 0, $connection);\n                    event($executedQuery);\n                }\n                return 'PONG';\n            },\n        ]);\n    }\n\n    protected function addApiRoutes(Router $router)\n    {\n        $router->get('api/ping', [\n            'uses' => function () {\n                return response()->json(['status' => 'pong']);\n            },\n        ]);\n    }\n\n    protected function addViewPaths()\n    {\n        config(['view.paths' => array_merge(config('view.paths'), [__DIR__ . '/resources/views'])]);\n    }\n\n    public function testItStacksOnRedirect()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/redirect')\n                ->assertSee('PONG')\n                ->waitFor('.phpdebugbar')\n                ->assertSee('GET /web/plain')\n                ->click('.phpdebugbar-widgets-datasets-switcher-widget')\n                ->waitForTextIn('.phpdebugbar-widgets-datasets-list', 'web/redirect')\n                ->assertSee('(stacked)')\n                ->assertSee('web/redirect');\n        });\n    }\n\n    public function testItInjectsOnPlainText()\n    {\n        $this->browse(function ($browser) {\n            $browser->visit('web/plain')\n                ->assertSee('PONG')\n                ->waitFor('.phpdebugbar')\n                ->assertSee('GET /web/plain');\n        });\n    }\n\n    public function testItInjectsOnHtml()\n    {\n        $this->browse(function ($browser) {\n            $browser->visit('web/html')\n                ->assertSee('HTMLPONG')\n                ->waitFor('.phpdebugbar')\n                ->assertSee('GET /web/html');\n        });\n    }\n\n    public function testItDoesntInjectOnJson()\n    {\n        $this->browse(function ($browser) {\n            $browser->visit('api/ping')\n                ->assertSee('pong')\n                ->assertSourceMissing('debugbar')\n                ->assertDontSee('GET /api/ping');\n        });\n    }\n\n    public function testItCapturesAjaxRequests()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/ajax')\n                ->waitFor('.phpdebugbar')\n                ->assertSee('GET /web/ajax')\n                ->click('#ajax-link')\n                ->waitForTextIn('#result', 'pong')\n                ->assertSee('GET /api/ping');\n        });\n    }\n\n    public function testDatabaseTabIsClickable()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/plain')\n                ->waitFor('.phpdebugbar')\n                ->click('.phpdebugbar-tab-settings')\n                ->assertDontSee('0 statements were executed')\n                ->click('.phpdebugbar-tab[data-collector=\"queries\"]')\n                ->assertSee('0 statements were executed');\n        });\n    }\n\n    public function testDatabaseCollectsQueries()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/query')\n                ->waitFor('.phpdebugbar')\n                ->click('.phpdebugbar-tab-settings')\n                ->waitForTextIn('.phpdebugbar-tab[data-collector=\"queries\"] .phpdebugbar-badge', 1)\n                ->click('.phpdebugbar-tab[data-collector=\"queries\"]')\n                ->screenshotElement('.phpdebugbar', 'queries-tab')\n                ->waitForText('executed')\n                ->waitForText('1 statements were executed')\n                ->with('.phpdebugbar-widgets-sqlqueries', function ($queriesPane) {\n                    $queriesPane->assertSee('SELECT * FROM users')\n                        ->click('.phpdebugbar-widgets-list-item:nth-child(2)')\n                        ->assertSee('Params')\n                        ->assertSee('debuguser')\n                        ->assertSee('Backtrace')\n                        ->assertSee('DatabaseCollectorProvider.php:');\n                })\n                ->screenshotElement('.phpdebugbar', 'queries-expanded');\n        });\n    }\n\n    public function testDatabaseCollectsQueriesWithCustomPrototype()\n    {\n        if (version_compare($this->app->version(), '10', '<')) {\n            static::markTestSkipped('This test is not compatible with Laravel 9.x and below');\n        }\n\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/custom-prototype')\n                ->waitFor('.phpdebugbar')\n                ->click('.phpdebugbar-tab-settings')\n                ->waitForTextIn('.phpdebugbar-tab[data-collector=\"queries\"] .phpdebugbar-badge', 1)\n                ->click('.phpdebugbar-tab[data-collector=\"queries\"]')\n                ->screenshotElement('.phpdebugbar', 'queries-tab')\n                ->waitForText('executed')\n                ->assertSee('1 statements were executed')\n                ->with('.phpdebugbar-widgets-sqlqueries', function ($queriesPane) {\n                    $queriesPane->assertSee('SELECT * FROM users')\n                        ->click('.phpdebugbar-widgets-list-item:nth-child(2)')\n                        ->assertSee('Params')\n                        ->assertSee('debuguser')\n                        ->assertSee('Backtrace')\n                        ->assertSee('DatabaseCollectorProvider.php:');\n                })\n                ->screenshotElement('.phpdebugbar', 'queries-expanded');\n        });\n    }\n\n    public function testDatabaseCollectsQueriesWithSoftLimit()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/query/200')\n                ->waitFor('.phpdebugbar')\n                ->click('.phpdebugbar-tab-settings')\n                ->waitForTextIn('.phpdebugbar-tab[data-collector=\"queries\"] .phpdebugbar-badge', 200, 30)\n                ->click('.phpdebugbar-tab[data-collector=\"queries\"]')\n                ->screenshotElement('.phpdebugbar', 'queries-tab')\n                ->waitForText('executed')\n                ->waitForText('200 statements were executed, 100 of which were duplicates, 100 unique.')\n                ->waitForText('Query soft limit for Debugbar is reached after 100 queries, additional 100 queries only show the query.')\n                ->screenshotElement('.phpdebugbar', 'queries-expanded');\n        });\n    }\n\n    public function testDatabaseCollectsQueriesWithHardLimit()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/query/600')\n                ->waitFor('.phpdebugbar')\n                ->click('.phpdebugbar-tab-settings')\n                ->waitForTextIn('.phpdebugbar-tab[data-collector=\"queries\"] .phpdebugbar-badge', 600)\n                ->click('.phpdebugbar-tab[data-collector=\"queries\"]')\n                ->screenshotElement('.phpdebugbar', 'queries-tab')\n                ->waitForText('executed')\n                ->waitForText('600 statements were executed, 100 have been excluded, 400 of which were duplicates, 200 unique.')\n                ->waitForText('Query soft and hard limit for Debugbar are reached. Only the first 100 queries show details. Queries after the first 500 are ignored. ')\n                ->screenshotElement('.phpdebugbar', 'queries-expanded');\n        });\n    }\n}\n"
  },
  {
    "path": "tests/DebugbarDocsTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Fruitcake\\LaravelDebugbar\\Tests\\Models\\User;\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Facades\\Http;\nuse Illuminate\\Support\\Str;\n\nclass DebugbarDocsTest extends TestCase\n{\n    /**\n     * Define environment setup.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return void\n     */\n    protected function getEnvironmentSetUp($app)\n    {\n        parent::getEnvironmentSetUp($app);\n\n        // Force the Debugbar to Enable on test/cli applications\n        $app->resolving(LaravelDebugbar::class, function ($debugbar) {\n            $refObject = new \\ReflectionObject($debugbar);\n            $refProperty = $refObject->getProperty('enabled');\n            $refProperty->setValue($debugbar, true);\n        });\n    }\n\n    public function testItInjectsOnDocs()\n    {\n        /** @var Router $router */\n        $router = $this->app['router'];\n        $this->app['config']->set('debugbar.hide_empty_tabs', true);\n\n        $this->loadLaravelMigrations();\n\n        Http::fake([\n            'packagist.org/*' => Http::response([\n                'downloads' => [\n                    'total' => 117241469,\n                    'monthly' => 2006302,\n                    'daily' => 109736,\n                ],\n            ], 200, []),\n        ]);\n\n        $router->get('docs', function () {\n            debugbar()->addMessage('Hello Artisans!');\n            debugbar()->warning('Watch out for ..');\n            debugbar()->error('Bugs!');\n\n            User::create(['email' => 'demo@example.com', 'name' => 'Barry', 'password' => bcrypt('secret')]);\n            User::count();\n            User::where('name', 'Barry')->first();\n            User::where('id', 1)->get();\n            User::where('id', 1)->get();\n            User::where('id', 1)->get();\n\n            view('dashboard')->render();\n\n            Http::get('https://packagist.org/packages/barryvdh/laravel-debugbar/stats.json')->json();\n\n            debugbar()->addException(new \\RuntimeException('Whoops! This is just a demo'));\n\n            return '';\n        });\n\n        $crawler = $this->call('GET', 'docs');\n\n        static::assertTrue(Str::contains($crawler->content(), 'debugbar'));\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n        static::assertEquals(200, $crawler->getStatusCode());\n\n        @mkdir(__DIR__ . '/../build/docs/assets', 0o777, true);\n\n        // Store output for test\n        file_put_contents(__DIR__ . '/../build/docs/render.html', $crawler->getContent());\n\n        $css = $this->call('GET', '/_debugbar/assets?type=css');\n        static::assertEquals(200, $css->getStatusCode());\n        static::assertNotEmpty($css->getContent());\n        file_put_contents(__DIR__ . '/../build/docs/assets/debugbar.css', $css->getContent());\n\n        $js = $this->call('GET', '/_debugbar/assets?type=js');\n        static::assertEquals(200, $js->getStatusCode());\n        static::assertNotEmpty($js->getContent());\n        file_put_contents(__DIR__ . '/../build/docs/assets/debugbar.js', $this->call('GET', '/_debugbar/assets?type=js')->getContent());\n\n    }\n}\n"
  },
  {
    "path": "tests/DebugbarTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Illuminate\\Support\\Str;\n\nclass DebugbarTest extends TestCase\n{\n    /**\n     * Define environment setup.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return void\n     */\n    protected function getEnvironmentSetUp($app)\n    {\n        parent::getEnvironmentSetUp($app);\n\n        // Force the Debugbar to Enable on test/cli applications\n        $app->resolving(LaravelDebugbar::class, function ($debugbar) {\n            $refObject = new \\ReflectionObject($debugbar);\n            $refProperty = $refObject->getProperty('enabled');\n            $refProperty->setValue($debugbar, true);\n        });\n    }\n\n    public function testItInjectsOnPlainText()\n    {\n        $crawler = $this->call('GET', 'web/plain');\n\n        static::assertTrue(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n\n    public function testItInjectsOnEmptyResponse()\n    {\n        $crawler = $this->call('GET', 'web/empty');\n\n        static::assertTrue(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n\n    public function testItInjectsOnNullyResponse()\n    {\n        $crawler = $this->call('GET', 'web/null');\n\n        static::assertTrue(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n\n    public function testItInjectsOnHtml()\n    {\n        $crawler = $this->call('GET', 'web/html');\n\n        static::assertTrue(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n\n    public function testItDoesntInjectOnJson()\n    {\n        $crawler = $this->call('GET', 'api/ping');\n\n        static::assertFalse(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n\n    public function testItDoesntInjectOnJsonLookingString()\n    {\n        $crawler = $this->call('GET', 'web/fakejson');\n\n        static::assertFalse(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n\n    public function testItDoesntInjectsOnHxRequestWithHxTarget()\n    {\n        $crawler = $this->get('web/html', [\n            'Hx-Request' => 'true',\n            'Hx-Target' => 'main',\n        ]);\n\n        static::assertFalse(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n\n    public function testItInjectsOnHxRequestWithoutHxTarget()\n    {\n        $crawler = $this->get('web/html', [\n            'Hx-Request' => 'true',\n        ]);\n\n        static::assertTrue(Str::contains($crawler->content(), 'debugbar'));\n        static::assertEquals(200, $crawler->getStatusCode());\n        static::assertNotEmpty($crawler->headers->get('phpdebugbar-id'));\n    }\n}\n"
  },
  {
    "path": "tests/ErrorHandlerTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests;\n\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse ReflectionObject;\n\nclass ErrorHandlerTest extends TestCase\n{\n    /**\n     * Define environment setup.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return void\n     */\n    protected function getEnvironmentSetUp($app)\n    {\n        parent::getEnvironmentSetUp($app);\n\n        // Force the Debugbar to Enable on test/cli applications\n        $app->resolving(LaravelDebugbar::class, function ($debugbar) {\n            $refObject = new ReflectionObject($debugbar);\n            $refProperty = $refObject->getProperty('enabled');\n            $refProperty->setValue($debugbar, true);\n        });\n\n        // Enable collectors needed for error handling\n        $app['config']->set('debugbar.collectors.messages', true);\n        $app['config']->set('debugbar.collectors.exceptions', true);\n\n        $app['config']->set('debugbar.error_handler', true);\n        // Exclude deprecation warnings\n        $app['config']->set('debugbar.error_level', E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED);\n    }\n\n    public function testErrorHandlerRespectsCustomErrorLevel()\n    {\n        $app = $this->app;\n\n        $debugbar = $app->make(LaravelDebugbar::class);\n        $debugbar->boot();\n\n        // Get initial message count\n        $initialCount = 0;\n        if ($debugbar->hasCollector('messages')) {\n            $initialCount = count($debugbar->getCollector('messages')->collect()['messages']);\n        }\n\n        // Trigger a deprecation warning - should NOT be captured\n        @trigger_error('Test deprecation warning', E_USER_DEPRECATED);\n\n        // Check that error was NOT captured\n        if ($debugbar->hasCollector('messages')) {\n            $messages = $debugbar->getCollector('messages')->collect();\n            $newCount = count($messages['messages']);\n            static::assertEquals($initialCount, $newCount, 'Deprecation warning should not be captured when excluded from error_level');\n        }\n\n        // Trigger a warning (not a deprecation) - should be captured\n        @trigger_error('Test warning', E_USER_WARNING);\n\n        // Check that warning WAS captured\n        if ($debugbar->hasCollector('messages')) {\n            $messages = $debugbar->getCollector('messages')->collect();\n            $finalCount = count($messages['messages']);\n            static::assertGreaterThan($initialCount, $finalCount, 'Non-deprecation errors should still be captured');\n        }\n    }\n}\n"
  },
  {
    "path": "tests/Jobs/OrderShipped.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Jobs;\n\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\n\nclass OrderShipped implements ShouldQueue\n{\n    use Dispatchable;\n\n    private $orderId;\n\n    public function __construct($orderId)\n    {\n        $this->orderId = $orderId;\n    }\n\n    public function handle()\n    {\n        // Do Nothing\n    }\n}\n"
  },
  {
    "path": "tests/Jobs/SendNotification.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Jobs;\n\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\n\nclass SendNotification implements ShouldQueue\n{\n    use Dispatchable;\n\n    public function handle()\n    {\n        // Do Nothing\n    }\n}\n"
  },
  {
    "path": "tests/LivewireBrowserTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests;\n\nuse Fruitcake\\LaravelDebugbar\\ServiceProvider;\nuse Fruitcake\\LaravelDebugbar\\Tests\\DataCollector\\Livewire\\DummyComponent;\nuse Illuminate\\Routing\\Router;\nuse Laravel\\Dusk\\Browser;\nuse Livewire\\Livewire;\nuse Livewire\\LivewireServiceProvider;\n\nclass LivewireBrowserTest extends BrowserTestCase\n{\n    /**\n     * Define environment setup.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return void\n     */\n    protected function getEnvironmentSetUp($app)\n    {\n        parent::getEnvironmentSetUp($app);\n\n        $app['env'] = 'local';\n        $app['config']->set('app.debug', true);\n        $app['config']->set('debugbar.hide_empty_tabs', false);\n        config(['view.paths' => array_merge(config('view.paths'), [__DIR__ . '/resources/views'])]);\n\n        // Set app layout\n        config([\n            'livewire.layout' => 'layouts.app',    // Livewire 3\n            'livewire.component_layout' => 'layouts.app',   // Livewire 4\n        ]);\n\n        /** @var Router $router */\n        $router = $app['router'];\n\n        // Register Component\n        Livewire::component('dummy-component', DummyComponent::class);\n        $router->get('web/livewire-component', [\n            'uses' => DummyComponent::class,\n        ]);\n\n        $router->get('web/livewire-view', function () {\n            return view('livewire-component');\n        });\n\n        $kernel = app(\\Illuminate\\Contracts\\Http\\Kernel::class);\n        $kernel->pushMiddleware(\\Illuminate\\Session\\Middleware\\StartSession::class);\n        $kernel->pushMiddleware(\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class);\n\n        \\Orchestra\\Testbench\\Dusk\\Options::withoutUI();\n    }\n\n    protected function getPackageProviders($app)\n    {\n        return [ServiceProvider::class, LivewireServiceProvider::class];\n    }\n\n    public function testLivewireCollectsComponents()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/livewire-component')\n                ->waitFor('[wire\\\\:id]')\n                ->waitFor('.phpdebugbar')\n                ->click('.phpdebugbar-tab-settings')\n                ->waitForTextIn('.phpdebugbar-tab[data-collector=\"livewire\"] .phpdebugbar-badge', 1)\n                ->click('.phpdebugbar-tab[data-collector=\"livewire\"]')\n                ->assertSee('1 Livewire component')\n                ->assertSee('You are #1')\n                ->with('.phpdebugbar-widgets-list-item', function ($queriesPane) {\n                    $queriesPane->assertSee('DummyComponent')\n                        ->click('.phpdebugbar-widgets-name')\n                        ->assertSee('Params')\n                        ->assertSee('title')\n                        ->assertSee('MyComponent');\n                })\n                ->click('.phpdebugbar-tab[data-collector=\"request\"]')\n                ->waitForText('Tests\\DataCollector\\Livewire\\DummyComponent', 3)\n                ->clickLink('Increase')\n                ->waitForText('You are #2', 30);\n        });\n    }\n\n    public function testLivewireCollectsView()\n    {\n        $this->browse(function (Browser $browser) {\n            $browser->visit('web/livewire-view')\n                ->waitFor('.phpdebugbar')\n                ->click('.phpdebugbar-tab-settings')\n                ->waitForTextIn('.phpdebugbar-tab[data-collector=\"livewire\"] .phpdebugbar-badge', 1)\n                ->click('.phpdebugbar-tab[data-collector=\"livewire\"]')\n                ->assertSee('1 Livewire component')\n                ->assertSee('You are #1')\n                ->with('.phpdebugbar-widgets-list-item', function ($queriesPane) {\n                    $queriesPane->assertSee('DummyComponent')\n                        ->click('.phpdebugbar-widgets-name')\n                        ->assertSee('Params')\n                        ->assertSee('title')\n                        ->assertSee('MyComponent');\n                })\n                ->click('.phpdebugbar-tab[data-collector=\"request\"]')\n                ->clickLink('Increase')\n                ->waitForText('You are #2', 3)\n                ->assertSee('Tests\\DataCollector\\Livewire\\DummyComponent');\n        });\n    }\n}\n"
  },
  {
    "path": "tests/Mocks/MockController.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Mocks;\n\nuse Illuminate\\Routing\\Controller;\n\nclass MockController extends Controller\n{\n    public function show()\n    {\n        return view('dashboard');\n    }\n}\n"
  },
  {
    "path": "tests/Mocks/MockMiddleware.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Mocks;\n\nuse Closure;\n\nclass MockMiddleware\n{\n    public function handle($request, Closure $next)\n    {\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "tests/Mocks/MockViewComponent.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Mocks;\n\nuse Illuminate\\View\\InvokableComponentVariable;\n\nclass MockViewComponent extends InvokableComponentVariable\n{\n    public function render()\n    {\n        return view('dashboard');\n    }\n}\n"
  },
  {
    "path": "tests/Models/Person.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Models;\n\nclass Person extends User {}\n"
  },
  {
    "path": "tests/Models/User.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Models;\n\nuse Illuminate\\Foundation\\Auth\\User as Model;\n\nclass User extends Model\n{\n    protected $table = 'users';\n    protected $guarded = [];\n}\n"
  },
  {
    "path": "tests/Support/ExplainTest.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests\\Support;\n\nuse Fruitcake\\LaravelDebugbar\\Support\\Explain;\nuse PHPUnit\\Framework\\TestCase;\n\nclass ExplainTest extends TestCase\n{\n    private Explain $explain;\n\n    protected function setUp(): void\n    {\n        parent::setUp();\n\n        $this->explain = new Explain();\n    }\n\n    public function testSelectQueryIsReadOnly(): void\n    {\n        static::assertTrue($this->explain->isReadOnlyQuery('SELECT * FROM users'));\n    }\n\n    public function testSelectQueryWithLeadingWhitespaceIsReadOnly(): void\n    {\n        static::assertTrue($this->explain->isReadOnlyQuery('  SELECT * FROM users'));\n    }\n\n    public function testSelectQueryCaseInsensitiveIsReadOnly(): void\n    {\n        static::assertTrue($this->explain->isReadOnlyQuery('select * FROM users'));\n    }\n\n    public function testWithQueryIsReadOnly(): void\n    {\n        static::assertTrue($this->explain->isReadOnlyQuery('WITH cte AS (SELECT 1) SELECT * FROM cte'));\n    }\n\n    public function testWithQueryCaseInsensitiveIsReadOnly(): void\n    {\n        static::assertTrue($this->explain->isReadOnlyQuery('with cte AS (SELECT 1) SELECT * FROM cte'));\n    }\n\n    public function testInsertQueryIsNotReadOnly(): void\n    {\n        static::assertFalse($this->explain->isReadOnlyQuery('INSERT INTO users (name) VALUES (?)'));\n    }\n\n    public function testUpdateQueryIsNotReadOnly(): void\n    {\n        static::assertFalse($this->explain->isReadOnlyQuery('UPDATE users SET name = ? WHERE id = ?'));\n    }\n\n    public function testDeleteQueryIsNotReadOnly(): void\n    {\n        static::assertFalse($this->explain->isReadOnlyQuery('DELETE FROM users WHERE id = ?'));\n    }\n\n    public function testDropQueryIsNotReadOnly(): void\n    {\n        static::assertFalse($this->explain->isReadOnlyQuery('DROP TABLE users'));\n    }\n\n    public function testSelectAsSubstringIsNotReadOnly(): void\n    {\n        static::assertFalse($this->explain->isReadOnlyQuery('SELECTFOO'));\n    }\n\n    public function testWithAsSubstringIsNotReadOnly(): void\n    {\n        static::assertFalse($this->explain->isReadOnlyQuery('WITHFOO'));\n    }\n\n    public function testRawExplainSupportedForMysql(): void\n    {\n        static::assertTrue($this->explain->isRawExplainSupported('mysql', []));\n    }\n\n    public function testRawExplainSupportedForMariadb(): void\n    {\n        static::assertTrue($this->explain->isRawExplainSupported('mariadb', []));\n    }\n\n    public function testRawExplainSupportedForPgsql(): void\n    {\n        static::assertTrue($this->explain->isRawExplainSupported('pgsql', []));\n    }\n\n    public function testRawExplainNotSupportedForSqlite(): void\n    {\n        static::assertFalse($this->explain->isRawExplainSupported('sqlite', []));\n    }\n\n    public function testRawExplainNotSupportedForSqlsrv(): void\n    {\n        static::assertFalse($this->explain->isRawExplainSupported('sqlsrv', []));\n    }\n\n    public function testRawExplainNotSupportedWhenBindingsNull(): void\n    {\n        static::assertFalse($this->explain->isRawExplainSupported('mysql', null));\n    }\n\n    public function testRawExplainSupportedWithEmptyBindings(): void\n    {\n        static::assertTrue($this->explain->isRawExplainSupported('mysql', []));\n    }\n}\n"
  },
  {
    "path": "tests/TestCase.php",
    "content": "<?php\n\ndeclare(strict_types=1);\n\nnamespace Fruitcake\\LaravelDebugbar\\Tests;\n\nuse Fruitcake\\LaravelDebugbar\\Facades\\Debugbar;\nuse Fruitcake\\LaravelDebugbar\\LaravelDebugbar;\nuse Fruitcake\\LaravelDebugbar\\ServiceProvider;\nuse Illuminate\\Routing\\Router;\nuse Orchestra\\Testbench\\TestCase as Orchestra;\nuse Fruitcake\\LaravelDebugbar\\Tests\\Mocks\\MockController;\nuse Fruitcake\\LaravelDebugbar\\Tests\\Mocks\\MockViewComponent;\nuse Fruitcake\\LaravelDebugbar\\Tests\\Mocks\\MockMiddleware;\nuse ReflectionObject;\n\nclass TestCase extends Orchestra\n{\n    /**\n     * Get package providers.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return array\n     */\n    protected function getPackageProviders($app)\n    {\n        return [ServiceProvider::class];\n    }\n\n    /**\n     * Get package aliases.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return array\n     */\n    protected function getPackageAliases($app)\n    {\n        return ['Debugbar' => Debugbar::class];\n    }\n\n    /**\n     * Define environment setup.\n     *\n     * @param \\Illuminate\\Foundation\\Application $app\n     *\n     * @return void\n     */\n    protected function getEnvironmentSetUp($app)\n    {\n        /** @var Router $router */\n        $router = $app['router'];\n        $app['config']->set('debugbar.enabled', false);\n        $app['config']->set('debugbar.hide_empty_tabs', false);\n        $app['config']->set('app.debug', true);\n        $app['env'] = 'local';\n\n        $this->addWebRoutes($router);\n        $this->addApiRoutes($router);\n        $this->addViewPaths();\n    }\n\n    protected function addWebRoutes(Router $router)\n    {\n        $router->get('web/plain', function () {\n            return 'PONG';\n        });\n\n        $router->get('web/empty', function () {\n            return '';\n        });\n\n        $router->get('web/null', function () {\n            return null;\n        });\n\n        $router->get('web/html', function () {\n            return '<html><head></head><body>Pong</body></html>';\n        });\n\n        $router->get('web/fakejson', function () {\n            return '{\"foo\":\"bar\"}';\n        });\n\n        $router->get('web/show', [MockController::class, 'show']);\n\n        $router->get('web/view', MockViewComponent::class);\n\n        $router->post('web/mw')->middleware(MockMiddleware::class);\n    }\n\n    protected function addApiRoutes(Router $router)\n    {\n        $router->get('api/ping', [\n            'uses' => function () {\n                return response()->json(['status' => 'pong']);\n            },\n        ]);\n    }\n\n    protected function addViewPaths()\n    {\n        config(['view.paths' => array_merge(config('view.paths'), [__DIR__ . '/resources/views'])]);\n    }\n\n    protected function resetStorageOpen(): void\n    {\n        $debugbar = app(LaravelDebugbar::class);\n        (new ReflectionObject($debugbar))\n            ->getProperty('storageOpen')\n            ->setValue($debugbar, null);\n    }\n}\n"
  },
  {
    "path": "tests/resources/views/ajax.blade.php",
    "content": "<html>\n<body>\n\n<a href=\"#\" id=\"ajax-link\" onclick=\"loadAjax();return false;\">Click me</a>\n<div id=\"result\">Waiting..</div>\n\n<script>\n    async function loadAjax() {\n        try {\n            const response = await fetch('/api/ping');\n            if (!response.ok) {\n                throw new Error(`Response status: ${response.status}`);\n            }\n\n            const json = await response.json();\n\n            document.getElementById('result').innerText = json.status;\n        } catch (error) {\n            console.error(error.message);\n        }\n    }\n\n</script>\n</body>\n"
  },
  {
    "path": "tests/resources/views/custom-prototype.blade.php",
    "content": "<html>\n<body>\n\n<script>\n    Array.prototype.customRemove = function(item) {\n        const i = this.indexOf(item)\n        if (i > -1) {\n            this.splice(i, 1)\n        }\n        return this\n    }\n</script>\n</body>\n"
  },
  {
    "path": "tests/resources/views/dashboard.blade.php",
    "content": "<div>\n    <p>Basic view</p>\n</div>\n"
  },
  {
    "path": "tests/resources/views/layouts/app.blade.php",
    "content": "<head>\n    @livewireStyles\n</head>\n<body>\n{{ $slot }}\n\n@livewireScripts\n</body>\n"
  },
  {
    "path": "tests/resources/views/livewire-component.blade.php",
    "content": "<html>\n<head>\n    @livewireStyles\n</head>\n<body>\n<h1>Livewire Test</h1>\n\n<livewire:dummy-component title=\"MyComponent\" />\n\n@livewireScripts\n\n</body>\n</html>\n"
  },
  {
    "path": "tests/resources/views/query.blade.php",
    "content": "@php\n    $collector->addQuery(new \\Illuminate\\Database\\Events\\QueryExecuted(\n        \"SELECT a FROM b WHERE c = ? AND d = ? AND e = ?\",\n        ['$10', '$2y$10_DUMMY_BCRYPT_HASH', '$_$$_$$$_$2_$3'],\n        0,\n        $db\n    ));\n@endphp\n"
  }
]