[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"projectName\": \"Less.js\",\n  \"projectOwner\": \"The Less CSS Team\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com/less/less.js\",\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": true,\n  \"commitConvention\": \"gitmoji\",\n  \"contributors\": [\n    {\n      \"login\": \"matthew-dean\",\n      \"name\": \"Matthew Dean\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/414752?v=4\",\n      \"profile\": \"https://github.com/matthew-dean\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"maintenance\",\n        \"projectManagement\"\n      ]\n    },\n    {\n      \"login\": \"cloudhead\",\n      \"name\": \"Alexis Sellier\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/40774?v=4\",\n      \"profile\": \"https://cloudhead.io/\",\n      \"contributions\": [\n        \"code\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"lukeapage\",\n      \"name\": \"Luke Page\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/309321?v=4\",\n      \"profile\": \"https://github.com/lukeapage\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"seven-phases-max\",\n      \"name\": \"Max Mikhailov\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/5304376?v=4\",\n      \"profile\": \"https://github.com/seven-phases-max\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"iChenLei\",\n      \"name\": \"Lei Chen\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/14012511?v=4\",\n      \"profile\": \"https://github.com/iChenLei\",\n      \"contributions\": [\n        \"code\",\n        \"bug\",\n        \"doc\"\n      ]\n    },\n    {\n      \"login\": \"puckowski\",\n      \"name\": \"Daniel Puckowski\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3059609?v=4\",\n      \"profile\": \"https://github.com/puckowski\",\n      \"contributions\": [\n        \"code\",\n        \"bug\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7,\n  \"linkToUsage\": true\n}\n"
  },
  {
    "path": ".coderabbit.yaml",
    "content": "reviews:\n  max_files: 200\n"
  },
  {
    "path": ".editorconfig",
    "content": "# @see http://editorconfig.org/\n\n# the buck stops here\nroot = true\n\n# all files\n[*]\nend_of_line = LF\nindent_style = space\nindent_size = 4\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.js text eol=lf\n*.svg text eol=lf\nlessc text eol=lf\n*.less text eol=lf\n*.css text eol=lf\n*.htm text eol=lf\n*.html text eol=lf\n*.jpg binary\n*.png binary\n*.jpeg binary\n\n# From https://github.com/alexkaratarakis/gitattributes/blob/master/Web.gitattributes\n*.lock            text -diff\npackage-lock.json text -diff\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.md",
    "content": "---\nname: \"\\U0001F41E Bug report\"\nabout: Something isn’t working as expected\ntitle: ''\nlabels: 'bug'\nassignees: ''\n---\n\n**To reproduce:**\n\n<!-- If the issue you reported requires a complex codebase to reproduce, please provide a replicable method such as a Github repository, Codesandbox link, Stackblitz link, or other relevant method for maintainers to investigate your feedback effectively. Thanks ! -->\n```less\n// less code here\n```\n\n**Current behavior:**\n\n<!-- A clear and concise description of what the bug is -->\n\n**Expected behavior:**\n\n<!-- A clear and concise description of what you expected to happen -->\n\n**Environment information:**\n\n<!-- Provide the `less` and `nodejs` packages versions -->\n\n- `less` version:\n- `nodejs` version:\n- `operating system`:\n<!-- macos, linux or windows ? -->\n\n<!-- feel free to add additional comments -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: ✨ Feature Request / idea\n    url: https://github.com/less/less.js/discussions/new\n    about: Missing something in Less? Let us know.\n  - name: 💬 Question / Discussion\n    url: https://github.com/less/less.js/discussions/new\n    about: Feel free to ask anything\n  - name: 📖 View documentation\n    url: https://lesscss.org\n    about: Official Less documentation    \n  - name: ❓ StackOverflow\n    url: https://stackoverflow.com/questions/tagged/less\n    about: Ask question or find answers on Stack overflow\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nThanks for your interest in the project. I appreciate bugs filed and PRs submitted!\nPlease make sure that you are familiar with and follow the Code of Conduct for\nthis project (found in the CODE_OF_CONDUCT.md file).\nAlso, please make sure you're familiar with and follow the instructions in the\ncontributing guidelines (found in the CONTRIBUTING.md file).\nIf you're new to contributing to open source projects, you might find this free\nvideo course helpful: http://kcd.im/pull-request\nPlease fill out the information below to expedite the review and (hopefully)\nmerge of your pull request!\n-->\n\n<!-- What changes are being made? (What feature/bug is being fixed here?) -->\n\n**What**:\n\n<!-- Why are these changes necessary? -->\n\n**Why**:\n\n<!-- Have you done all of these things?  -->\n\n**Checklist**:\n\n<!-- add \"N/A\" to the end of each line that's irrelevant to your changes -->\n<!-- to check an item, place an \"x\" in the box like so: \"- [x] Documentation\" -->\n\n- [ ] Documentation\n- [ ] Added/updated unit tests\n- [ ] Code complete\n\n<!-- feel free to add additional comments -->\n"
  },
  {
    "path": ".github/SECURITY.md",
    "content": "## Security contact information\n\nTo report a security vulnerability, please use the\n[Tidelift security contact](https://tidelift.com/security).\nTidelift will coordinate the fix and disclosure.\n"
  },
  {
    "path": ".github/TESTING_PUBLISHING.md",
    "content": "# Testing the Publishing Flow\n\nThis guide explains how to test the publishing workflow without actually publishing to npm.\n\n## Dry Run Mode\n\nThe publishing script supports a dry-run mode that shows what would happen without making any changes:\n\n```bash\n# Test from master branch\ngit checkout master\nDRY_RUN=true pnpm run publish\n\n# Or use the flag\npnpm run publish --dry-run\n```\n\nDry-run mode will:\n- ✅ Show what version would be created\n- ✅ Show what packages would be published\n- ✅ Show what git operations would happen\n- ❌ **NOT** commit any changes\n- ❌ **NOT** create git tags\n- ❌ **NOT** push to remote\n- ❌ **NOT** publish to npm\n\n## Testing Locally\n\n### 1. Test Version Calculation\n\n```bash\n# Check current version\nnode -p \"require('./packages/less/package.json').version\"\n\n# Run dry-run to see what version would be created\nDRY_RUN=true pnpm run publish\n```\n\n### 2. Test Branch Validation\n\n```bash\n# Try from a feature branch (should fail)\ngit checkout -b test-branch\npnpm run publish\n# Should error: \"Publishing is only allowed from 'master' or 'alpha' branches\"\n```\n\n### 3. Test Alpha Branch Validations\n\n```bash\n# Switch to alpha branch\ngit checkout alpha\n\n# Test with dry-run\nDRY_RUN=true GITHUB_REF_NAME=alpha pnpm run publish\n\n# This will show:\n# - Version validation (must contain -alpha.)\n# - Master sync check\n# - Version comparison with master\n```\n\n### 4. Test Version Override\n\n```bash\n# Test explicit version override\nEXPLICIT_VERSION=4.5.0 DRY_RUN=true pnpm run publish\n# Should show: \"✨ Using explicit version: 4.5.0\"\n```\n\n## Testing the GitHub Actions Workflow\n\n### 1. Test Workflow Syntax\n\n```bash\n# Validate workflow YAML\ngh workflow view publish.yml\n# Or use act (local GitHub Actions runner)\nact push -W .github/workflows/publish.yml\n```\n\n### 2. Test on a Test Branch\n\nCreate a test branch that mimics master/alpha:\n\n```bash\n# Create test branch from master\ngit checkout -b test-publish-master master\n\n# Make a small change\necho \"# test\" >> TEST.md\ngit add TEST.md\ngit commit -m \"test: publishing workflow\"\n\n# Push to trigger workflow (if you want to test the full flow)\n# Note: This will actually try to publish if version changed!\n```\n\n### 3. Test Workflow Manually\n\nYou can manually trigger the workflow from GitHub Actions UI:\n1. Go to Actions tab\n2. Select \"Publish to NPM\" workflow\n3. Click \"Run workflow\"\n4. Select branch and run\n\n**Warning**: This will actually publish if conditions are met!\n\n## Testing Specific Scenarios\n\n### Test Master Branch Publishing\n\n```bash\ngit checkout master\nDRY_RUN=true pnpm run publish\n\n# Should show:\n# - Patch version increment (e.g., 4.4.2 → 4.4.3)\n# - Publishing with 'latest' tag\n# - Regular release creation\n```\n\n### Test Alpha Branch Publishing\n\n```bash\ngit checkout alpha\nDRY_RUN=true GITHUB_REF_NAME=alpha pnpm run publish\n\n# Should show:\n# - Alpha version increment (e.g., 5.0.0-alpha.1 → 5.0.0-alpha.2)\n# - Publishing with 'alpha' tag\n# - Pre-release creation\n# - All alpha validations passing\n```\n\n### Test Version Validation\n\n```bash\n# Test that alpha versions can't go to latest\n# (This is enforced in the script, so it will fail before publishing)\n\n# Test that non-alpha versions can't go to alpha tag\n# (Also enforced in the script)\n```\n\n## Safe Testing Checklist\n\nBefore actually publishing:\n\n- [ ] Run dry-run mode to verify version calculation\n- [ ] Verify branch restrictions work (try from wrong branch)\n- [ ] Test alpha validations (if testing alpha branch)\n- [ ] Check that version override works (if needed)\n- [ ] Verify package.json files would be updated correctly\n- [ ] Review what git operations would happen\n- [ ] Confirm npm tag assignment is correct\n\n## Troubleshooting\n\n### Script fails with \"branch not allowed\"\n\nMake sure you're on `master` or `alpha` branch, or set `GITHUB_REF_NAME` environment variable:\n\n```bash\nGITHUB_REF_NAME=master DRY_RUN=true pnpm run publish\n```\n\n### Version calculation seems wrong\n\nCheck the current version in `packages/less/package.json`:\n\n```bash\nnode -p \"require('./packages/less/package.json').version\"\n```\n\n### Alpha validations failing\n\nMake sure:\n- Alpha branch is up-to-date with master\n- Current version contains `-alpha.`\n- Alpha base version is >= master version\n\n## Real Publishing Test (Use with Caution)\n\nIf you want to test the actual publishing flow:\n\n1. **Use a test npm package** (create a scoped package like `@your-username/less-test`)\n2. **Temporarily modify the script** to use your test package name\n3. **Test on a separate branch** that won't trigger the workflow\n4. **Clean up** after testing\n\n**Never test on the actual `less` package unless you're ready to publish!**\n"
  },
  {
    "path": ".github/stale.yml",
    "content": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 120\n# Number of days of inactivity before a stale issue is closed\ndaysUntilClose: 30\n# Issues with these labels will never be considered stale\nexemptLabels:\n  - up-for-grabs\n  - bug\n  - \"high priority\" # if it's been prioritized, don't mark stale\n  - \"medium priority\"\n  - \"low priority\"\n  - \"needs decision\"\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. Thank you\n  for your contributions.\n# Comment to post when closing a stale issue. Set to `false` to disable\ncloseComment: false\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "# Github actions workflow name\r\nname: CI\r\n\r\n# Triggers the workflow on push or pull request events\r\non:\r\n  push:\r\n    branches: [main, master]\r\n  pull_request:\r\n    branches: [main, master]\r\n\r\njobs:\r\n  test:\r\n    name: 'Tests on ${{matrix.os}} with Node \"${{matrix.node}}\"'\r\n    strategy:\r\n      fail-fast: false\r\n      matrix:\r\n        # Test all mainstream operating systems\r\n        os: [ubuntu-latest, macos-latest, windows-latest]\r\n        node: ['current']\r\n        include:\r\n          - os: ubuntu-latest\r\n            node: 'lts/*'\r\n          - os: ubuntu-latest\r\n            node: 'lts/-1'\r\n          - os: ubuntu-latest\r\n            node: 'lts/-2'\r\n          - os: ubuntu-latest\r\n            node: 'lts/-3'\r\n\r\n    runs-on: ${{ matrix.os }}\r\n    # This has copy/paste steps and should be refactored using DRY\r\n    steps:\r\n      - uses: actions/checkout@v4\r\n      - name: Install pnpm\r\n        uses: pnpm/action-setup@v4\r\n      - uses: actions/setup-node@v4\r\n        with:\r\n          node-version: ${{ matrix.node }}\r\n          cache: 'pnpm'\r\n      - name: Install dependencies\r\n        run: pnpm install\r\n      - name: Print put node & npm version\r\n        run: node --version && pnpm --version \r\n      - name: Install chromium\r\n        run: pnpm exec playwright install chromium\r\n      - name: Run node tests (ESM + CJS)\r\n        run: pnpm run test:node\r\n"
  },
  {
    "path": ".github/workflows/create-release-pr.yml",
    "content": "name: Create Release PR\n\n# When code lands on master or alpha (not a release PR merge itself),\n# automatically create or update a release pull request that bumps the\n# version.  Maintainers then merge that PR to trigger publishing.\n#\n#   master → \"chore: release vX.Y.Z\"        PR targets master\n#   alpha  → \"chore: alpha release vX.Y.Z\"  PR targets alpha\non:\n  push:\n    branches:\n      - master\n      - alpha\n    # Only trigger for commits that touch package source files.\n    paths:\n      - 'packages/**'\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  create-release-pr:\n    name: Create or Update Release PR\n    runs-on: ubuntu-latest\n    # Skip if this push is itself the merge of a release PR (prevents an\n    # infinite loop).  We catch both squash-merged and regular-merged commits\n    # for both the master and alpha release PR title conventions.\n    if: |\n      github.repository == 'less/less.js' &&\n      !contains(github.event.head_commit.message, 'chore: release v') &&\n      !contains(github.event.head_commit.message, 'chore: alpha release v') &&\n      !contains(github.event.head_commit.message, '/release-v') &&\n      !contains(github.event.head_commit.message, '/alpha-release-v')\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          token: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 'lts/*'\n          cache: 'pnpm'\n\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Determine next version\n        id: version\n        run: |\n          BRANCH=\"${{ github.ref_name }}\"\n          CURRENT=$(node -p \"require('./packages/less/package.json').version\")\n\n          if [ \"$BRANCH\" = \"alpha\" ]; then\n            # Alpha: increment the alpha prerelease number.\n            # X.Y.Z-alpha.N → X.Y.Z-alpha.(N+1)\n            # If package.json doesn't carry an alpha version yet, bump the\n            # major and start a fresh alpha.1 series.\n            NEXT=$(node -e \"\n              const cur = process.argv[1];\n              const m = cur.match(/^(\\d+\\.\\d+\\.\\d+)-alpha\\.(\\d+)$/);\n              if (m) {\n                process.stdout.write(m[1] + '-alpha.' + (parseInt(m[2], 10) + 1));\n              } else {\n                const parts = cur.replace(/-.*/, '').split('.');\n                const nextMajor = parseInt(parts[0], 10) + 1;\n                process.stdout.write(nextMajor + '.0.0-alpha.1');\n              }\n            \" \"$CURRENT\")\n            echo \"next_version=$NEXT\" >> \"$GITHUB_OUTPUT\"\n            echo \"branch=chore/alpha-release-v$NEXT\" >> \"$GITHUB_OUTPUT\"\n            echo \"release_base=alpha\" >> \"$GITHUB_OUTPUT\"\n          else\n            # Master: patch-increment from the latest npm published version.\n            NPM_VERSION=$(npm view less version 2>/dev/null || echo \"\")\n            NEXT=$(node -e \"\n              const semver = require('semver');\n              const cur = process.argv[1];\n              const npm = process.argv[2] || null;\n              if (npm && semver.valid(cur) && semver.gt(cur, npm)) {\n                process.stdout.write(cur);\n              } else {\n                const base = npm || cur;\n                process.stdout.write(semver.inc(base, 'patch'));\n              }\n            \" \"$CURRENT\" \"$NPM_VERSION\")\n            echo \"next_version=$NEXT\" >> \"$GITHUB_OUTPUT\"\n            echo \"branch=chore/release-v$NEXT\" >> \"$GITHUB_OUTPUT\"\n            echo \"release_base=master\" >> \"$GITHUB_OUTPUT\"\n          fi\n\n      - name: Configure Git\n        run: |\n          git config --global user.name \"github-actions[bot]\"\n          git config --global user.email \"github-actions[bot]@users.noreply.github.com\"\n\n      - name: Create or update release branch and PR\n        env:\n          NEXT_VERSION: ${{ steps.version.outputs.next_version }}\n          RELEASE_BRANCH: ${{ steps.version.outputs.branch }}\n          RELEASE_BASE: ${{ steps.version.outputs.release_base }}\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          set -euo pipefail\n          if [ \"$RELEASE_BASE\" = \"alpha\" ]; then\n            TITLE=\"chore: alpha release v${NEXT_VERSION}\"\n          else\n            TITLE=\"chore: release v${NEXT_VERSION}\"\n          fi\n\n          # Create or reset the release branch off the latest base branch so it\n          # always includes all recent commits.\n          if git ls-remote --exit-code origin \"refs/heads/${RELEASE_BRANCH}\" &>/dev/null; then\n            git fetch origin \"${RELEASE_BRANCH}\"\n            git checkout -B \"${RELEASE_BRANCH}\" \"origin/${RELEASE_BASE}\"\n          else\n            git checkout -b \"${RELEASE_BRANCH}\"\n          fi\n\n          # Bump version in all package.json files.\n          node -e \"\n            const fs = require('fs');\n            const version = process.env.NEXT_VERSION;\n            const dirs = fs.readdirSync('packages', { withFileTypes: true })\n              .filter(d => d.isDirectory())\n              .map(d => 'packages/' + d.name + '/package.json');\n            for (const f of ['package.json', ...dirs].filter(f => fs.existsSync(f))) {\n              const pkg = JSON.parse(fs.readFileSync(f, 'utf8'));\n              if (!pkg.version) continue;\n              pkg.version = version;\n              fs.writeFileSync(f, JSON.stringify(pkg, null, '\\t') + '\\n');\n            }\n          \"\n\n          git add package.json packages/*/package.json\n          COMMITTED=false\n          if git diff --cached --quiet; then\n            echo \"No version changes; branch is already at v${NEXT_VERSION}\"\n          else\n            git commit -m \"${TITLE}\"\n            COMMITTED=true\n          fi\n\n          # If no new commit was created the release branch has no commits\n          # ahead of master, so pushing it and trying to open a PR would fail\n          # with \"no commits between head and base\".  Instead, just report\n          # whether an existing release PR is open and exit cleanly.\n          if [ \"$COMMITTED\" = \"false\" ]; then\n            EXISTING=$(gh pr list --head \"${RELEASE_BRANCH}\" --base \"${RELEASE_BASE}\" \\\n              --json number --jq '.[0].number' 2>/dev/null || echo \"\")\n            if [ -n \"${EXISTING}\" ]; then\n              echo \"✅ No new changes; release PR #${EXISTING} already exists\"\n            else\n              echo \"✅ No version bump needed and no existing release PR; nothing to do\"\n            fi\n            exit 0\n          fi\n\n          # --force-with-lease refuses to overwrite if the remote has advanced\n          # past what we fetched, which protects against concurrent workflow\n          # runs.  This is intentional: if two code PRs land simultaneously the\n          # second run will fail-fast here and the release branch stays coherent.\n          git push origin \"${RELEASE_BRANCH}\" --force-with-lease\n\n          # Open a PR if one doesn't already exist for this version.\n          EXISTING=$(gh pr list --head \"${RELEASE_BRANCH}\" --base \"${RELEASE_BASE}\" \\\n            --json number --jq '.[0].number' 2>/dev/null || echo \"\")\n\n          if [ -z \"${EXISTING}\" ]; then\n            BODY=\"## Release v${NEXT_VERSION}\n\n          This PR bumps the version to \\`${NEXT_VERSION}\\` and will trigger an npm publish when merged.\n\n          **Before merging:**\n          - [ ] Update CHANGELOG.md with changes for this release\n          - [ ] Verify all CI checks pass\"\n\n            gh pr create \\\n              --title \"${TITLE}\" \\\n              --body \"${BODY}\" \\\n              --base \"${RELEASE_BASE}\" \\\n              --head \"${RELEASE_BRANCH}\"\n            echo \"✅ Created release PR for v${NEXT_VERSION}\"\n          else\n            echo \"✅ Release PR #${EXISTING} already exists; branch updated to include latest ${RELEASE_BASE} commits\"\n          fi\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "name: Publish to NPM\n\non:\n  # Publish when a release PR is merged:\n  #   master branch: \"chore: release vX.Y.Z\"       PR → publishes latest\n  #   alpha branch:  \"chore: alpha release vX.Y.Z\"  PR → publishes alpha\n  # Both release PRs are created automatically by create-release-pr.yml.\n  pull_request:\n    types: [closed]\n    branches:\n      - master\n      - alpha\n\npermissions:\n  id-token: write  # Required for OIDC trusted publishing\n  contents: write  # Required for creating releases and pushing tags\n\njobs:\n  publish:\n    name: Publish to NPM\n    runs-on: ubuntu-latest\n    # Only run when a release PR with the expected title is merged into master\n    # or alpha.  Any other PR close (or merge without the right title) is\n    # silently skipped.\n    if: |\n      github.repository == 'less/less.js' &&\n      github.event.pull_request.merged == true &&\n      (\n        (github.event.pull_request.base.ref == 'master' &&\n         startsWith(github.event.pull_request.title, 'chore: release v')) ||\n        (github.event.pull_request.base.ref == 'alpha' &&\n         startsWith(github.event.pull_request.title, 'chore: alpha release v'))\n      )\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          token: ${{ secrets.GITHUB_TOKEN }}\n          # Check out the base branch (master or alpha) post-merge so the\n          # version bump from the release PR is already present.\n          ref: ${{ github.event.pull_request.base.ref }}\n\n      - name: Install pnpm\n        uses: pnpm/action-setup@v4\n\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 'lts/*'\n          registry-url: 'https://registry.npmjs.org'\n          cache: 'pnpm'\n\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile\n\n      - name: Run node tests (ESM + CJS)\n        run: pnpm run test:node\n\n      - name: Build\n        run: |\n          cd packages/less\n          pnpm run build\n\n      - name: Configure Git\n        run: |\n          git config --global user.name \"github-actions[bot]\"\n          git config --global user.email \"github-actions[bot]@users.noreply.github.com\"\n\n      - name: Determine branch and tag type\n        id: branch-info\n        run: |\n          # Always a pull_request event; base.ref is master or alpha.\n          BRANCH=\"${{ github.event.pull_request.base.ref }}\"\n          echo \"branch=$BRANCH\" >> $GITHUB_OUTPUT\n          if [ \"$BRANCH\" = \"alpha\" ]; then\n            echo \"is_alpha=true\" >> $GITHUB_OUTPUT\n            echo \"npm_tag=alpha\" >> $GITHUB_OUTPUT\n            echo \"release_type=prerelease\" >> $GITHUB_OUTPUT\n          else\n            echo \"is_alpha=false\" >> $GITHUB_OUTPUT\n            echo \"npm_tag=latest\" >> $GITHUB_OUTPUT\n            echo \"release_type=release\" >> $GITHUB_OUTPUT\n          fi\n\n      - name: Validate alpha branch requirements\n        if: steps.branch-info.outputs.is_alpha == 'true'\n        run: |\n          # Fetch master branch\n          git fetch origin master:master || true\n          \n          # Check 1: Alpha branch must not be behind master\n          echo \"🔍 Checking if alpha branch is up to date with master...\"\n          MASTER_COMMITS=$(git rev-list --count alpha..master 2>/dev/null || echo \"0\")\n          \n          if [ \"$MASTER_COMMITS\" -gt 0 ]; then\n            echo \"❌ ERROR: Alpha branch is behind master by $MASTER_COMMITS commit(s)\"\n            echo \"   Alpha branch must include all commits from master before publishing\"\n            exit 1\n          fi\n          echo \"✅ Alpha branch is up to date with master\"\n          \n          # Check 2: Get current version and validate it contains 'alpha'\n          CURRENT_VERSION=$(node -p \"require('./packages/less/package.json').version\")\n          echo \"📦 Current version: $CURRENT_VERSION\"\n          \n          if [[ ! \"$CURRENT_VERSION\" =~ -alpha\\. ]]; then\n            echo \"❌ ERROR: Alpha branch version must contain '-alpha.'\"\n            echo \"   Current version: $CURRENT_VERSION\"\n            echo \"   Expected format: X.Y.Z-alpha.N\"\n            exit 1\n          fi\n          echo \"✅ Version contains 'alpha' suffix\"\n          \n          # Check 3: Alpha base version must be >= master version\n          echo \"🔍 Comparing alpha base version with master version...\"\n          MASTER_VERSION=$(git show master:packages/less/package.json 2>/dev/null | node -p \"try { JSON.parse(require('fs').readFileSync(0, 'utf-8')).version } catch(e) { '0.0.0' }\" || echo \"0.0.0\")\n          \n          if [ \"$MASTER_VERSION\" = \"0.0.0\" ]; then\n            echo \"⚠️  Could not determine master version, skipping comparison\"\n          else\n            echo \"📦 Master version: $MASTER_VERSION\"\n            \n            # Extract base version (remove -alpha.X suffix)\n            ALPHA_BASE=$(echo \"$CURRENT_VERSION\" | sed 's/-alpha\\.[0-9]*$//')\n            echo \"📦 Alpha base version: $ALPHA_BASE\"\n            \n            # Compare versions using semver from root workspace\n            COMPARE_RESULT=$(node -e \"\n              const semver = require('semver');\n              const alphaBase = process.argv[1];\n              const master = process.argv[2];\n              if (semver.lt(alphaBase, master)) {\n                console.log('ERROR');\n              } else {\n                console.log('OK');\n              }\n            \" \"$ALPHA_BASE\" \"$MASTER_VERSION\" 2>/dev/null || echo \"ERROR\")\n            \n            if [ \"$COMPARE_RESULT\" = \"ERROR\" ]; then\n              echo \"❌ ERROR: Alpha base version ($ALPHA_BASE) is lower than master version ($MASTER_VERSION)\"\n              echo \"   According to semver, alpha base version must be >= master version\"\n              exit 1\n            fi\n            echo \"✅ Alpha base version is >= master version\"\n          fi\n\n      - name: Ensure npm 11.5.1 or later for trusted publishing\n        run: npm install -g npm@latest\n\n      - name: Bump version and publish\n        id: publish\n        env:\n          # Pass the resolved base branch name (master or alpha) so that\n          # bump-and-publish.js knows which branch it is publishing for.\n          GITHUB_REF_NAME: ${{ steps.branch-info.outputs.branch }}\n        run: |\n          pnpm run publish\n          \n          # Extract version from package.json\n          VERSION=$(node -p \"require('./packages/less/package.json').version\")\n          echo \"version=$VERSION\" >> $GITHUB_OUTPUT\n          echo \"tag=v$VERSION\" >> $GITHUB_OUTPUT\n\n      - name: Create GitHub Release\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          TAG=\"${{ steps.publish.outputs.tag }}\"\n          VERSION=\"${{ steps.publish.outputs.version }}\"\n          IS_ALPHA=\"${{ steps.branch-info.outputs.is_alpha }}\"\n\n          if [ \"$IS_ALPHA\" = \"true\" ]; then\n            TITLE=\"Alpha Release $TAG\"\n            PRERELEASE=\"--prerelease\"\n            BODY=\"## Alpha Release\n\n          This is an alpha release from the alpha branch.\n\n          ## Installation\n\n          \\`\\`\\`bash\n          npm install less@${VERSION} --tag alpha\n          \\`\\`\\`\n\n          Or:\n\n          \\`\\`\\`bash\n          npm install less@alpha\n          \\`\\`\\`\"\n          else\n            TITLE=\"Release $TAG\"\n            PRERELEASE=\"\"\n            BODY=\"## Changes\n\n          See [CHANGELOG.md](https://github.com/less/less.js/blob/master/CHANGELOG.md) for details.\n\n          ## Installation\n\n          \\`\\`\\`bash\n          npm install less@${VERSION}\n          \\`\\`\\`\"\n          fi\n\n          if gh release view \"$TAG\" &>/dev/null; then\n            echo \"Release $TAG already exists, uploading assets to existing release\"\n            gh release upload \"$TAG\" packages/less/dist/less.js packages/less/dist/less.min.js --clobber\n          else\n            gh release create \"$TAG\" \\\n              --title \"$TITLE\" \\\n              $PRERELEASE \\\n              --notes \"$BODY\" \\\n              packages/less/dist/less.js \\\n              packages/less/dist/less.min.js\n          fi\n"
  },
  {
    "path": ".gitignore",
    "content": "# OS and IDE\n.emacs*\n*.flymake\n*~\n.#*\n.idea\n*.iml\n*.sublime-*\n.DS_Store\n\n# npm\nnode_modules\n!package-lock.json\nnpm-debug.log\n\n# Coverage\n.nyc_output\ncoverage\n*.lcov\n\n# Build output\ndist\n\n# Claude Code\n.claude/\n"
  },
  {
    "path": ".husky/post-merge",
    "content": "#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\n# Post-merge hook to preserve alpha versions when merging master into alpha\nnode scripts/post-merge-version-fix.js\n"
  },
  {
    "path": ".husky/pre-commit",
    "content": "cd packages/less && npm run typecheck && cd ../..\npnpm test\n"
  },
  {
    "path": ".nvmrc",
    "content": "v18"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n  \"version\": \"0.2.0\",\n  \"configurations\": [  \n    {\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"name\": \"Less test\",\n      \"program\": \"${workspaceFolder}/packages/less/test/index.js\",\n      \"cwd\": \"${workspaceFolder}/packages/less\",\n      \"console\": \"integratedTerminal\"\n    },\n    {\n      \"type\": \"node\",\n      \"request\": \"launch\",\n      \"name\": \"Benchmark test\",\n      \"program\": \"${workspaceFolder}/packages/less/benchmark/index.js\",\n      \"cwd\": \"${workspaceFolder}/packages/less\",\n      \"console\": \"integratedTerminal\"\n    }\n  ]\n}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "## Change Log\n\n### v4.6.0 (2026-03-09)\n\n#### Bug Fixes\n\n- [#4414](https://github.com/less/less.js/pull/4414) Fix pre-existing bugs in tree nodes: selector `this` binding, atrule parenting, mixin-call error propagation, container/media functionRegistry guard (@matthew-dean)\n- [#4408](https://github.com/less/less.js/pull/4408) Fix [#4358](https://github.com/less/less.js/issues/4358) Resolve parent selectors in comma-separated pseudo-selector lists (@matthew-dean)\n- [#4407](https://github.com/less/less.js/pull/4407) Fix [#4331](https://github.com/less/less.js/issues/4331) Exclude CSS at-rule keywords from declarationCall parsing (@matthew-dean)\n- [#4389](https://github.com/less/less.js/pull/4389) Fix [#4354](https://github.com/less/less.js/issues/4354) Unknown at-rule expression commas (@puckowski)\n- [#4404](https://github.com/less/less.js/pull/4404) Fix no-prototype-builtins issues in Ruleset and ToCSSVisitor (@matthew-dean)\n- [#4236](https://github.com/less/less.js/pull/4236) Fix import subpath module bug (@nicolo-ribaudo)\n- [#4327](https://github.com/less/less.js/pull/4327) Remove duplicate length check from expression.genCSS() (@nicolo-ribaudo)\n- [#3791](https://github.com/less/less.js/pull/3791) Handle the lack of optional dependencies (@nicolo-ribaudo)\n\n#### Features & Improvements\n\n- [#4413](https://github.com/less/less.js/pull/4413) Add JSDoc type annotations for all tree node files (@matthew-dean)\n- [#4412](https://github.com/less/less.js/pull/4412) Convert prototype-based tree nodes to ES6 classes (@matthew-dean)\n- [#4411](https://github.com/less/less.js/pull/4411) Migrate to native ESM with no build step (@matthew-dean)\n- [#4410](https://github.com/less/less.js/pull/4410) Optimize hot paths and fix benchmark infrastructure (@matthew-dean)\n- [#4409](https://github.com/less/less.js/pull/4409) Code quality cleanup for container queries and related code (@matthew-dean)\n\n#### Deprecation Warnings\n\n- [#4402](https://github.com/less/less.js/pull/4402) Add deprecation warnings for features removed in Less 5.x, container query variable name fix, deprecation notice fix (@matthew-dean, @puckowski)\n\n#### Chores\n\n- [#4406](https://github.com/less/less.js/pull/4406) Add test for number with underscore parsing (@matthew-dean)\n- [#4386](https://github.com/less/less.js/pull/4386) Update README.md copyright (@matthew-dean)\n- [#3782](https://github.com/less/less.js/pull/3782) Remove phantom stuff (@nicolo-ribaudo)\n- [#3702](https://github.com/less/less.js/pull/3702) Replace deprecated String.prototype.substr() (@nicolo-ribaudo)\n- [#4265](https://github.com/less/less.js/pull/4265) Remove redundant return from parsers.blockRuleset() (@nicolo-ribaudo)\n- [#4271](https://github.com/less/less.js/pull/4271) Remove unused parsers.entities.propertyCurly() (@nicolo-ribaudo)\n\n### v4.5.1 (2025-12-28)\n\n_Automated patch release — no user-facing changes._\n\n### v4.4.2 (2025-08-27)\n\n- [#4357](https://github.com/less/less.js/pull/4357) Migrate Less test data to use valid CSS (@matthew-dean)\n- [#4363](https://github.com/less/less.js/pull/4363) Fix [#4362] no spacing regression for function (@puckowski)\n\n### v4.4.1 (2025-07-25)\n\n- [#4342](https://github.com/less/less.js/pull/4342) Add support for CSS scroll state container queries (@puckowski)\n- [#4349](https://github.com/less/less.js/pull/4349) Fix [#4348](https://github.com/less/less.js/issues/4348) parse layer nesting syntax (@puckowski)\n\n### v4.4.0 (2025-05-31)\n\n- [#4337](https://github.com/less/less.js/pull/4337) Add support for layer at-rule (@puckowski)\n- [#4340](https://github.com/less/less.js/pull/4340) Add support for import at-rule layer functionality (@puckowski)\n- [#4346](https://github.com/less/less.js/pull/4346) Fix [#4343](https://github.com/less/less.js/issues/4343) add color operands (@puckowski)\n\n### v4.3.0 (2025-04-04)\n\n- [#4319](https://github.com/less/less.js/pull/4319) Add deprecation warnings to Less output during parsing and new quiet flag (@matthew-dean)\n- [#4320](https://github.com/less/less.js/pull/4320) Update README.md to remove Lerna reference (@matthew-dean)\n- [#4322](https://github.com/less/less.js/pull/4322) Revise Playwright install method for CI stability (@puckowski)\n- [#4333](https://github.com/less/less.js/pull/4333) Add support for ```starting-style``` at rule. (@puckowski)\n\n### v4.2.2 (2025-01-04)\n\n- [#4290](https://github.com/less/less.js/pull/4290) Fix [#4268](https://github.com/less/less.js/issues/4268) nested pseudo-selector parsing (@puckowski)\n- [#4291](https://github.com/less/less.js/pull/4291) Enhance Less.js test environment setup (#4291) (@iChenLei)\n- [#4295](https://github.com/less/less.js/pull/4295) Fix [#4252](https://github.com/less/less.js/issues/4252) container queries created via mixin evaluating variables incorrectly (@puckowski)\n- [#4294](https://github.com/less/less.js/pull/4294) Fix [#3737](https://github.com/less/less.js/issues/3737) allow blank variable declarationd (@puckowski)\n- [#4292](https://github.com/less/less.js/pull/4292) Fix [#4258](https://github.com/less/less.js/issues/4258) variable interpolation after math (@puckowski)\n- [#4293](https://github.com/less/less.js/pull/4293) Fix [#4264](https://github.com/less/less.js/issues/4264) strip line comment from expression (@puckowski)\n- [#4302](https://github.com/less/less.js/pull/4302) Fix [#4301](https://github.com/less/less.js/issues/4301) at-rule declarations missing (@puckowski)\n- [#4309](https://github.com/less/less.js/pull/4309) Fix Node 23 CI (#4309) (@iChenLei)\n\n### v4.2.1 (2024-09-26)\n\n- [#4237](https://github.com/less/less.js/pull/4237) Fix [#4235](https://github.com/less/less.js/issues/4235) container style queries extra space resolved (@puckowski)\n\n### v4.2.0 (2023-08-06)\n- [#3811](https://github.com/less/less.js/pull/3811) add support for [container queries](https://www.w3.org/TR/css-contain-3) (@puckowski)\n- [#3761](https://github.com/less/less.js/pull/3761) fix faulty source map generation with variables in selectors, fixes [#3567](https://github.com/less/less.js/issues/3567) (@pgoldberg)\n- [#3700](https://github.com/less/less.js/pull/3700) parsing variables fail when there is no trailing semicolon (@b-kelly)\n- [#3719](https://github.com/less/less.js/pull/3719) modify `this` pointer so that it is not empty. (@lumburr)\n- [#3649](https://github.com/less/less.js/pull/3649) fixes [#2991](https://github.com/less/less.js/issues/2991) empty @media queries generated when compiling less file with (reference) to bootstrap (@MoonCoral)\n\n### v4.1.3 (2022-06-09)\n- [#3673](https://github.com/less/less.js/pull/3673) Feat: add support for case-insensitive attribute selectors (#3673) (@iChenLei)\n- [#3710](https://github.com/less/less.js/pull/3701) Feat: add `disablePluginRule` flag for render() options (#3710) (@broofa @edhgoose)\n- [#3656](https://github.com/less/less.js/pull/3656) Fix [#3655](https://github.com/less/less.js/issues/3655) for param tag is null (#3658) (@langren1353)\n- [#3658](https://github.com/less/less.js/pull/3658) Fix [#3646](https://github.com/less/less.js/issues/3656) forcefully change unsupported input to strings (#3658) (@gzb1128)\n- [#3668](https://github.com/less/less.js/pull/3668) Fix change keyword plugin and import regexp (#3668) (@iChenLei)\n- [#3613](https://github.com/less/less.js/pull/3613) Fix [#3591](https://github.com/less/less.js/issues/3591): refactor debugInfo from class to function (#3613) (@drdevlin)\n- [#3716](https://github.com/less/less.js/pull/3716) Fix https failures on macOS (#3716) (@joeyparrish)\n\n### v4.1.2 (2021-10-04)\n- [#3602](https://github.com/less/less.js/pull/3602) Fix currentFileInfo and index properties on nodes (#3602) (@bjpbakker)\n- [#3626](https://github.com/less/less.js/pull/3626) Fix [#3616](https://github.com/less/less.js/issues/3616) IfStatement requires double parentheses when dividing (#3626) (@iChenLei)\n- [#3630](https://github.com/less/less.js/pull/3630) Fix needle dependency warning typo. (#3630) (@cjwilsontech)\n\n### v4.1.1 (2021-01-31)\n- [#3597](https://github.com/less/less.js/pull/3597) Fix expected response when there's a socket error (#3597) (@zxfrank)\n- [#3589](https://github.com/less/less.js/pull/3589) Fixes [#3586](https://github.com/less/less.js/issues/3586) (#3589) (@matthew-dean)\n\n### v4.1.0 (2021-01-10)\n- [#3582](https://github.com/less/less.js/pull/3582) Fix [#3576](https://github.com/less/less.js/issues/3576) import redirects. Replace native-request with needle. (#3582) (@zaquest)\n- [#3583](https://github.com/less/less.js/pull/3583) Update rollup and other build dependencies (#3583) (@pravi)\n- [#3588](https://github.com/less/less.js/pull/3588) Roll back paren requirement on mixin calls (#3588) (@matthew-dean)\n\n### v4.0.0 (2020-12-18)\n- [#3573](https://github.com/less/less.js/pull/3573) v4.0.0 (#3573) (@matthew-dean)\n\n### v3.13.1 (2020-12-18)\n- [#3575](https://github.com/less/less.js/pull/3575) Fixes #3574 (#3575) (@matthew-dean)\n\n### v3.13.0 (2020-12-12)\n- [#3572](https://github.com/less/less.js/pull/3572) Fixes #3434 - memory / runtime improvements (#3572) (@matthew-dean)\n- [#3550](https://github.com/less/less.js/pull/3550) Examples contain more valid CSS, to test with a new parser (#3550) (@matthew-dean)\n- [#3546](https://github.com/less/less.js/pull/3546) Bug fixes - fixes #3446 #3368 (#3546) (@matthew-dean)\n\n### v3.12.2 (2020-07-16)\n- [#3545](https://github.com/less/less.js/pull/3545) Release 3.12.2 (#3545) (@matthew-dean)\n\n### v3.12.1 (2020-07-16)\n- [#3544](https://github.com/less/less.js/pull/3544) Fixes #3533 (#3544) (@matthew-dean)\n- [#3543](https://github.com/less/less.js/pull/3543) Fixes #3541 (#3543) (@matthew-dean)\n\n### v3.12.0 (2020-07-13)\n- [#3540](https://github.com/less/less.js/pull/3540) v3.12.0-RC.2 (#3540) (@matthew-dean)\n- [#3532](https://github.com/less/less.js/pull/3532) Fixes #3371 Allow conditional evaluation of function args (#3532) (@matthew-dean)\n- [#3531](https://github.com/less/less.js/pull/3531) Remove lib folder from git (#3531) (@matthew-dean)\n- [#3530](https://github.com/less/less.js/pull/3530) Move changelog to root (#3530) (@matthew-dean)\n- [#3529](https://github.com/less/less.js/pull/3529) Duplicate dist files in root for older links (#3529) (@matthew-dean)\n- [#3525](https://github.com/less/less.js/pull/3525) Test-data module (#3525) (@matthew-dean)\n- [#3523](https://github.com/less/less.js/pull/3523) Fixes #3504 / organizes tests (#3523) (@matthew-dean)\n- [#3501](https://github.com/less/less.js/pull/3501) Restore nuked scripts (?), replace dependencies (#3501) (#3522) (@matthew-dean)\n- [#3521](https://github.com/less/less.js/pull/3521) Lerna refactor / TS compiling w/o bundling (#3521) (@matthew-dean)\n- [#3517](https://github.com/less/less.js/pull/3517) Resolve #3398 Add flag to disable sourcemap url annotation (#3517) (@hirosato)\n- [#3294](https://github.com/less/less.js/pull/3294) fix(#3294): use loadFileSync when loading plugins with syncImport: true (#3506) (@Justineo)\n\n### v3.11.3 (2020-06-05)\n- [#3509](https://github.com/less/less.js/pull/3509) Fixes #3508 (#3509) (@matthew-dean)\n\n### v3.11.2 (2020-06-01)\n- [#3498](https://github.com/less/less.js/pull/3498) Remove tree caching in import manager (#3498) (@matthew-dean)\n- [#3482](https://github.com/less/less.js/pull/3482) issue#3481 ignore missing debugInfo (#3482) (@5UtJAjiRWj1q)\n- [#3494](https://github.com/less/less.js/pull/3494) Additional check to avoid evaluating an expression if it is a comment (#3494) (@rgroothuijsen)\n- [#3490](https://github.com/less/less.js/pull/3490) fix: Use make-dir instead of mkdirp (#3490) (@eps1lon)\n- [#3493](https://github.com/less/less.js/pull/3493) Properly exit calc mode after use (#3493) (@rgroothuijsen)\n- [#3477](https://github.com/less/less.js/pull/3477) Convert to auto-changelog (#3477) (@matthew-dean)\n\n### v3.11.1 (2020-02-11)\n- [#3475](https://github.com/less/less.js/pull/3475) Fixes #3469  - Include tslib dependency (#3475) (@matthew-dean)\n\n### v3.11.0 (2020-02-09)\n- [#3468](https://github.com/less/less.js/pull/3468) 3.11.0 (#3468) (@matthew-dean)\n- [#3453](https://github.com/less/less.js/pull/3453) Import file with dots in file name (#3453) (@life777)\n- [#3460](https://github.com/less/less.js/pull/3460) - Fixed replacer when visitor returns array of nodes (#3460) (@lmartorella)\n- [#3454](https://github.com/less/less.js/pull/3454) Added financial contributors to the README (#3454) (@monkeywithacupcake)\n- [#3431](https://github.com/less/less.js/pull/3431) Fixes #3430: Removed unnecessary 'important' from NamespaceValue. (#3431) (@batchunag)\n- [#3426](https://github.com/less/less.js/pull/3426) Fixes #3405 (#3426) (@matthew-dean)\n\n### v3.10.3 (2019-08-23)\n- [#3424](https://github.com/less/less.js/pull/3424) Fixes #3423 #3420 (#3424) (@matthew-dean)\n- [#3421](https://github.com/less/less.js/pull/3421) Rollup changed for Node 4 compatibility (#3421) (@matthew-dean)\n\n### v3.10.0 (2019-08-17)\n- [#3413](https://github.com/less/less.js/pull/3413) Release v3.10.0 (#3413) (@matthew-dean)\n\n### v3.10.0-beta.2 (2019-08-07)\n- [#3412](https://github.com/less/less.js/pull/3412) v3.10.0-beta.2 -- Cleanup NPM and git included files (#3412) (@matthew-dean)\n\n### v3.10.0-beta (2019-08-03)\n- [#3411](https://github.com/less/less.js/pull/3411) Conversion of Less to ES6 w/ TypeScript type linting support (#3411) (@matthew-dean)\n- [#3363](https://github.com/less/less.js/pull/3363) Fixes #3346 #3338 #3345 (#3363) (@matthew-dean)\n- [#3364](https://github.com/less/less.js/pull/3364) Operation.prototype.accept Issues#3327 (#3364) (@legu2009)\n- [#3360](https://github.com/less/less.js/pull/3360) Ignore undefined content in generating source maps (#3360) (@cthrax)\n- [#3305](https://github.com/less/less.js/pull/3305) Avoid Buffer constructor on newer Node.js (#3305) (#3307) (@gabrielschulhof)\n- [#3352](https://github.com/less/less.js/pull/3352) Do not pollute window object in less-browser bootstrap (#3352) (@gaiazov)\n- [#3337](https://github.com/less/less.js/pull/3337) Use the correct mime type when loading a plugin (#3337) (@g3rv4)\n\n### v3.9.0 (2018-11-29)\n- [#3334](https://github.com/less/less.js/pull/3334) Adds range() function for lists (#3334) (@matthew-dean)\n- [#3333](https://github.com/less/less.js/pull/3333) Fixes #3325 #3313 #3328 - each() function fixes (#3333) (@matthew-dean)\n- [#3335](https://github.com/less/less.js/pull/3335) Prevent Browserify from bundling Buffer (#3335) (@matthew-dean)\n\n### v3.8.1 (2018-08-08)\n- [#3302](https://github.com/less/less.js/pull/3302) v3.8.1 (#3302) (@matthew-dean)\n- [#3301](https://github.com/less/less.js/pull/3301) Fixes: #3300 (#3301) (@matthew-dean)\n- [#3292](https://github.com/less/less.js/pull/3292) Demonstrate 3.7 fixes #3160 (#3292) (@matthew-dean)\n- [#3291](https://github.com/less/less.js/pull/3291) Color function updates - #RRGGBBAA and CSS Variables (#3291) (@matthew-dean)\n\n### v3.8.0 (2018-07-23)\n- [#3293](https://github.com/less/less.js/pull/3293) v3.8.0 (#3293) (@matthew-dean)\n- [#3248](https://github.com/less/less.js/pull/3248) Feature/rewrite urls (#3248) (@matthew-dean)\n\n### v3.7.1 (2018-07-11)\n- [#3284](https://github.com/less/less.js/pull/3284) Release v3.7.1 (#3284) (@matthew-dean)\n- [#3283](https://github.com/less/less.js/pull/3283) Fix #3281: console.warning → console.warn (#3283) (@calvinjuarez)\n\n### v3.7.0 (2018-07-11)\n- [#3279](https://github.com/less/less.js/pull/3279) v3.7.0 (#3279) (@matthew-dean)\n- [#3274](https://github.com/less/less.js/pull/3274) Fixes #1880 - Adds two new math modes and deprecates strictMath (@matthew-dean)\n- [#3258](https://github.com/less/less.js/pull/3258) Fixes #2824 - Expressions require a delimiter of some kind in mixin args (@matthew-dean)\n- [#3263](https://github.com/less/less.js/pull/3263) Fixes #2270 - Adds each() function to Less functions (@calvinjuarez, @matthew-dean)\n\n### v3.6.0 (2018-07-10)\n- [#3278](https://github.com/less/less.js/pull/3278) v3.6.0 (@matthew-dean)\n- [#3252](https://github.com/less/less.js/pull/3252) Removes `less-rhino` (broken for a long time) - Fixes #3241 (@matthew-dean)\n- [#3259](https://github.com/less/less.js/pull/3259) Removes \"double paren\" issue for boolean / if function (@matthew-dean)\n- [#3276](https://github.com/less/less.js/pull/3276) Bump Jasmine version (@matthew-dean)\n- [#3275](https://github.com/less/less.js/pull/3275) Adds Promise polyfill for PhantomJS under Node 9 (@matthew-dean)\n- [#3261](https://github.com/less/less.js/pull/3261) Fixes #2791 - svg-gradient() not working in Firefox (@matthew-dean)\n- [#3270](https://github.com/less/less.js/pull/3270) Fixes #3231 - Adds UIKit, Bootstrap 3, and Bootstrap 4 to verified tests (@matthew-dean)\n\n### v3.5.3 (2018-07-06)\n- [#3272](https://github.com/less/less.js/pull/3272) Reverts operations not being performed in media queries (@matthew-dean)\n- [#3257](https://github.com/less/less.js/pull/3257) Fixes #3182 (@matthew-dean)\n\n### v3.5.1 (2018-07-05)\n- [#3267](https://github.com/less/less.js/pull/3267) Fixes issue with parentheses following variable in expressions (@matthew-dean)\n\n### v3.5.0 (2018-07-05)\n- [#3264](https://github.com/less/less.js/pull/3264) Release v3.5.0 (@matthew-dean)\n\n### v3.5.0-beta.7 (2018-07-04)\n- [#3260](https://github.com/less/less.js/pull/3260) Release v3.5.0-beta.7 (#3260) (@matthew-dean)\n- [#3256](https://github.com/less/less.js/pull/3256) Allow [] to resolve to last declaration's value (#3256) (@matthew-dean)\n\n### v3.5.0-beta.6 (2018-07-03)\n- [#3255](https://github.com/less/less.js/pull/3255) v3.5.0-beta.6 (#3255) (@matthew-dean)\n- [#3247](https://github.com/less/less.js/pull/3247) Plugins: If minVersion >= 3.0.0, don't \"pre-run\" .setOptions() (#3247) (@calvinjuarez)\n- [#3254](https://github.com/less/less.js/pull/3254) Tests and parser fixes for namespace values in MQ and mixin args (#3254) (@matthew-dean)\n\n### v3.5.0-beta.5 (2018-07-02)\n- [#3251](https://github.com/less/less.js/pull/3251) Bugfix -  namespace values (#3251) (@matthew-dean)\n- [#3250](https://github.com/less/less.js/pull/3250) Added small breakpoints example with namespaced values (#3250) (@matthew-dean)\n\n### v3.5.0-beta.4 (2018-06-30)\n- [#3242](https://github.com/less/less.js/pull/3242) [Feature] Namespaced values (#3242) (@matthew-dean)\n- [#3246](https://github.com/less/less.js/pull/3246) Release/v3.5.0 beta.3 (#3246) (@matthew-dean)\n- [#3229](https://github.com/less/less.js/pull/3229) Fixes #3187 (couldn't repo, but found bugs) (#3229) (@matthew-dean)\n- [#3237](https://github.com/less/less.js/pull/3237) Fixes #3235 (#3237) (@matthew-dean)\n\n### v3.5.0-beta.3 (2018-06-29)\n- [#3239](https://github.com/less/less.js/pull/3239) fix: browser cache is always considered stale if .modifyVars wasn't set (#3239) (@balpha)\n\n### v3.5.0-beta.2 (2018-06-27)\n- [#3236](https://github.com/less/less.js/pull/3236) v3.5.0-beta.2 (#3236) (@matthew-dean)\n- [#3228](https://github.com/less/less.js/pull/3228) Fixes #3205, partial 3.0 math regression #1880 (#3228) (@matthew-dean)\n- [#3227](https://github.com/less/less.js/pull/3227) Fixes #1421 - re-parses variable-interpolated elements to selectors (no.2) (#3227) (@matthew-dean)\n- [#3223](https://github.com/less/less.js/pull/3223) Fixes #3191 (#3223) (@matthew-dean)\n\n### v3.5.0-beta (2018-06-25)\n- [#3230](https://github.com/less/less.js/pull/3230) Release v3.5.0 beta (#3230) (@matthew-dean)\n- [#3219](https://github.com/less/less.js/pull/3219) Invalidate less-node file cache if modified (#3219) (@matthew-dean)\n- [#3213](https://github.com/less/less.js/pull/3213) Fixes #3147 #2715 (#3213) (@matthew-dean)\n- [#3220](https://github.com/less/less.js/pull/3220) Revert \"Fixes #1421 - re-parses variable-interpolated elements to selectors\" (@matthew-dean)\n- [#3217](https://github.com/less/less.js/pull/3217) Revert \"Fixes #1421 - re-parses variable-interpolated elements to selectors (#3217)\" (@matthew-dean)\n- [#3212](https://github.com/less/less.js/pull/3212) Revert \"Pull missed code merged into 3.x branch (#3212)\" (@matthew-dean)\n- [#3215](https://github.com/less/less.js/pull/3215) Revert \"Fixes #3195 (#3215)\" (@matthew-dean)\n- [#3215](https://github.com/less/less.js/pull/3215) Fixes #3195 (#3215) (@matthew-dean)\n- [#3212](https://github.com/less/less.js/pull/3212) Pull missed code merged into 3.x branch (#3212) (@matthew-dean)\n- [#3217](https://github.com/less/less.js/pull/3217) Fixes #1421 - re-parses variable-interpolated elements to selectors (#3217) (@matthew-dean)\n- [#3207](https://github.com/less/less.js/pull/3207) update changelog for 3.0.4 (@akkumar)\n- [#3206](https://github.com/less/less.js/pull/3206) Release v3.0.4 (@matthew-dean)\n\n### v3.0.4 (2018-05-07)\n- [#3180](https://github.com/less/less.js/pull/3180) update source_map to 0.6.x (@akkumar)\n- [#3172](https://github.com/less/less.js/pull/3172) Type checking length units (@jacobwarduk)\n- [#3200](https://github.com/less/less.js/pull/3200) Fixes #3181 (@matthew-dean)\n\n### v3.0.3 (2018-04-18)\n- [#1](https://github.com/less/less.js/pull/1) Type checking length units (@jacobwarduk)\n- [#3177](https://github.com/less/less.js/pull/3177) chore(package): update request to 2.83.0 (@Kartoffelsalat)\n- [#3170](https://github.com/less/less.js/pull/3170) `inline` and `less` imports of the same name = race condition (@thorn0)\n- [#3168](https://github.com/less/less.js/pull/3168) Fixes #3116 - lessc not loading plugins in 3.0 (@matthew-dean)\n\n### v3.0.1 (2018-02-15)\n- [#3163](https://github.com/less/less.js/pull/3163) Merge 3.x into master (@matthew-dean, @barnabycolby, @kirillrogovoy, @maxbrunsfeld, @seven-phases-max, @ryysud, @bdsomer, @wiinci, @nikeee, @anthony-redFox)\n\n### v3.0.0-RC.2 (2018-02-11)\n- [#3161](https://github.com/less/less.js/pull/3161) Remove legacy upgrade (@matthew-dean)\n- [#3159](https://github.com/less/less.js/pull/3159) Bump to 3.0.0-RC.1 (@matthew-dean)\n\n### v3.0.0-RC.1 (2018-02-04)\n- [#3150](https://github.com/less/less.js/pull/3150) Drop node 0.10 and 0.12 and added node 9 matrix testing (@anthony-redFox)\n\n### v2.7.3 (2017-10-24)\n- [#3122](https://github.com/less/less.js/pull/3122) Mime update (@nikeee)\n- [#3120](https://github.com/less/less.js/pull/3120) Issue3115 ext in node path (@robhuzzey)\n- [#3119](https://github.com/less/less.js/pull/3119) Update © year (@wiinci)\n- [#3107](https://github.com/less/less.js/pull/3107) pinned request dep to v2.81.0 (@MarkSG93)\n\n### v3.0.0-alpha.3 (2017-10-09)\n- [#3096](https://github.com/less/less.js/pull/3096) Switch from request to phin! (@bdsomer)\n- [#3082](https://github.com/less/less.js/pull/3082) Add Node.js v8 to Travis CI and AppVeyor (@ryysud)\n- [#3079](https://github.com/less/less.js/pull/3079) Initial support for custom parsed functions (`boolean`, `if` etc.) (@seven-phases-max)\n- [#3076](https://github.com/less/less.js/pull/3076) Update mergeRules (@seven-phases-max)\n\n### v2.7.2 (2017-01-05)\n- [#2908](https://github.com/less/less.js/pull/2908) Added 'request' as optional dependency. (@maxrd2)\n- [#2955](https://github.com/less/less.js/pull/2955) Allow less imports of paths like 'dir/css' (@maxbrunsfeld)\n- [#2975](https://github.com/less/less.js/pull/2975) Refactor LessError and lesscHelper.formatError (@kirillrogovoy)\n- [#2988](https://github.com/less/less.js/pull/2988) Fixes #2987, --source-map-map-inline works as expected (@nicoschoenmaker)\n- [#2946](https://github.com/less/less.js/pull/2946) Fixed sourceMapBasepath bug as the option had no affect on the sourceMapURL value. (@barnabycolby)\n- [#2941](https://github.com/less/less.js/pull/2941) CI Build Fixes. (@bd82)\n- [#2905](https://github.com/less/less.js/pull/2905) Download PhantomJS from CDN (@abrobston)\n- [#2866](https://github.com/less/less.js/pull/2866) Changed octals to hex for ES6 strict mode (@mlowijs)\n- [#2891](https://github.com/less/less.js/pull/2891) Fix error reporting of lessc executable II (@jhnns)\n\n### v2.7.0 (2016-05-08)\n- [#2894](https://github.com/less/less.js/pull/2894) Update my name. (@nex3)\n- [#2892](https://github.com/less/less.js/pull/2892) Fix invalid extraction of the host part from URL (@Taritsyn)\n- [#2874](https://github.com/less/less.js/pull/2874) removed dependency to unused package \"request\" (@jeremyVignelles)\n- [#2830](https://github.com/less/less.js/pull/2830) make --depends generate no CSS output (@gtalusan)\n- [#2860](https://github.com/less/less.js/pull/2860) Remove unreachable code (@shkdee)\n- [#2859](https://github.com/less/less.js/pull/2859) Fix typos found by codespell (@stweil)\n- [#2858](https://github.com/less/less.js/pull/2858) Fix AST to include text for single line comments (@zzzzBov)\n- [#2853](https://github.com/less/less.js/pull/2853) bin/lessc: Make sure path.dirname gets passed strings (@addaleax)\n- [#2754](https://github.com/less/less.js/pull/2754) Update contrast function and tests, fixes #2743 (@Synchro)\n- [#2785](https://github.com/less/less.js/pull/2785) Allows root (non-value) functions in Less (@seven-phases-max)\n- [#2834](https://github.com/less/less.js/pull/2834) Make sourcemap generation a bit faster (@Medium)\n\n### v2.6.1 (2016-03-04)\n- [#2827](https://github.com/less/less.js/pull/2827) Revert \"Update jit-grunt to version 0.10.0\" (@seven-phases-max)\n- [#2821](https://github.com/less/less.js/pull/2821) Update jit-grunt to version 0.10.0 (@greenkeeperio-bot)\n- [#2797](https://github.com/less/less.js/pull/2797) Disallow whitespace in variable calls (i.e \"DR\"-calls) (@seven-phases-max)\n- [#2820](https://github.com/less/less.js/pull/2820) update grunt-contrib-concat to version 1.0.0 (@greenkeeperio-bot)\n- [#2819](https://github.com/less/less.js/pull/2819) Guard expressions regression in 2.6.0 (#2798) (@SomMeri)\n- [#2804](https://github.com/less/less.js/pull/2804) use instanceof operator instead of class comparison optimization (@marijaselakovic)\n- [#2817](https://github.com/less/less.js/pull/2817) Update grunt-contrib-jshint to version 1.0.0 🚀 (@greenkeeperio-bot)\n- [#2815](https://github.com/less/less.js/pull/2815) Update grunt-contrib-clean to version 1.0.0 🚀 (@greenkeeperio-bot)\n- [#2813](https://github.com/less/less.js/pull/2813) Fix typo on and/or change (@mbrodala)\n- [#2811](https://github.com/less/less.js/pull/2811) Update CHANGELOG.md (@Justineo)\n- [#2806](https://github.com/less/less.js/pull/2806) Fix comments after named color regression (@seven-phases-max)\n- [#2794](https://github.com/less/less.js/pull/2794) Update grunt-jscs to version 2.7.0 🚀 (@greenkeeperio-bot)\n- [#2784](https://github.com/less/less.js/pull/2784) Update grunt-contrib-jasmine to version 1.0.0 🚀 (@greenkeeperio-bot)\n- [#2773](https://github.com/less/less.js/pull/2773) Update all dependencies 🌴 (@lukeapage, @greenkeeperio-bot)\n\n### v2.6.0 (2016-01-29)\n- [#2788](https://github.com/less/less.js/pull/2788) Update license year in README.md (@prayagverma)\n- [#2735](https://github.com/less/less.js/pull/2735) Fix for #2384 and caching enabled with modifyVars set (@less)\n- [#2783](https://github.com/less/less.js/pull/2783) Allow unknown non-{}-block at-rules (@seven-phases-max)\n- [#2779](https://github.com/less/less.js/pull/2779) Logical operator and now has higher precedence then logical operator or. (@SomMeri)\n- [#2775](https://github.com/less/less.js/pull/2775) Parsing Error \"Unrecognised input\" for color operations with color names #2124 (@SomMeri)\n- [#2763](https://github.com/less/less.js/pull/2763) Added \"or\" keyword and allowed arbitrary logical expression in guards. (@SomMeri)\n- [#2731](https://github.com/less/less.js/pull/2731) Faster builds and update npm versions to test against (@paladox)\n- [#2759](https://github.com/less/less.js/pull/2759) Fixed extend leaking through nested parent selector. (@SomMeri)\n- [#2738](https://github.com/less/less.js/pull/2738) Fail when image-size functions are used in browser-less. (@niom)\n- [#2485](https://github.com/less/less.js/pull/2485) Allow underscore in a dimension unit (@seven-phases-max)\n- [#2729](https://github.com/less/less.js/pull/2729) Fixing import by reference (@SomMeri)\n\n### v2.5.2 (2015-09-24)\n- [#2609](https://github.com/less/less.js/pull/2609) Skip missing optional imports (@mmelvin0)\n- [#2644](https://github.com/less/less.js/pull/2644) `percentage` function should throw error if result would be `NaN` (@SomMeri)\n- [#2646](https://github.com/less/less.js/pull/2646) Parametric mixins: parameters don't match error (@SomMeri)\n- [#2688](https://github.com/less/less.js/pull/2688) Converted CLRFs in error tests (@mishal)\n- [#2687](https://github.com/less/less.js/pull/2687) Updated test data files (@mishal)\n- [#2642](https://github.com/less/less.js/pull/2642) Fixes import by reference inlines source's inline imports - 2620 (@SomMeri)\n- [#2643](https://github.com/less/less.js/pull/2643) Keep shorthand color form the same way as named colors are kept. (@SomMeri)\n- [#2677](https://github.com/less/less.js/pull/2677) Reference inline comments. (@betaorbust)\n- [#2685](https://github.com/less/less.js/pull/2685) Update travis Node.js version & remove io.js (@demohi)\n- [#2637](https://github.com/less/less.js/pull/2637) Undefined source map should result in an empty map file. (@SomMeri)\n- [#2607](https://github.com/less/less.js/pull/2607) Remove moot `version` property from bower.json (@kkirsche)\n\n### v2.5.1 (2015-05-21)\n- [#2591](https://github.com/less/less.js/pull/2591) Update license attribute (@pdehaan)\n- [#2575](https://github.com/less/less.js/pull/2575) Fix synchronously loading/applying stylesheets on page load. (@chipx86)\n- [#2568](https://github.com/less/less.js/pull/2568) Add a Gitter chat badge to README.md (@gitter-badger)\n- [#2559](https://github.com/less/less.js/pull/2559) Fix for #2558 (@seven-phases-max)\n- [#2574](https://github.com/less/less.js/pull/2574) Fix `Ruleset.prototype.find` failing for certain frames (@seven-phases-max)\n- [#2550](https://github.com/less/less.js/pull/2550) Update CHANGELOG.md (@chharvey)\n\n### v2.5.0 (2015-04-03)\n- [#2530](https://github.com/less/less.js/pull/2530) Proper non-primitive value replacement for `%` and `replace` (@seven-phases-max)\n- [#2526](https://github.com/less/less.js/pull/2526) Image size (@bassjobsen)\n- [#2533](https://github.com/less/less.js/pull/2533) Fix formatting to meet jscs settings (@seven-phases-max)\n- [#2525](https://github.com/less/less.js/pull/2525) Add browser field (@whitecolor)\n- [#2522](https://github.com/less/less.js/pull/2522) Fix `@plugin` scoping rules (@rjgotten)\n- [#2527](https://github.com/less/less.js/pull/2527) Fix grunt shell:benchmark command (@seven-phases-max)\n- [#2520](https://github.com/less/less.js/pull/2520) Fix 2440 (@lukeapage)\n- [#2517](https://github.com/less/less.js/pull/2517) Quick fix for naked `url` imports (@seven-phases-max, @wahuneke, @bassjobsen)\n- [#2515](https://github.com/less/less.js/pull/2515) re: #2508 - revert #2510 - undo all fixes. issue == WONTFIX (@wahuneke)\n- [#2504](https://github.com/less/less.js/pull/2504) optional relative amounts for color functions, see#975 (@bassjobsen)\n- [#2512](https://github.com/less/less.js/pull/2512) Fix selectors folding into directives (@rjgotten)\n- [#2510](https://github.com/less/less.js/pull/2510) Fix issue 2508 (@wahuneke)\n- [#2505](https://github.com/less/less.js/pull/2505) fix for issue #2500 (@bassjobsen)\n- [#2479](https://github.com/less/less.js/pull/2479) Import plugin (@rjgotten, @bassjobsen)\n- [#2497](https://github.com/less/less.js/pull/2497) Allow detached rulesets as mixin argument defaults (@calvinjuarez)\n- [#2488](https://github.com/less/less.js/pull/2488) add jit-grunt to the build chain (@bassjobsen)\n- [#2489](https://github.com/less/less.js/pull/2489) add browser postProcessor Plugin test (@bassjobsen)\n- [#2473](https://github.com/less/less.js/pull/2473) Bubbling of nested directives (@SomMeri)\n- [#2445](https://github.com/less/less.js/pull/2445) allow a list of colors as argument for the svg-gradient function (@bassjobsen)\n\n### v2.4.0 (2015-02-08)\n- [#2439](https://github.com/less/less.js/pull/2439) Fix empty sourcemaps (@OhJeez)\n- [#2429](https://github.com/less/less.js/pull/2429) Implementing preprocessing plugins (@Justineo, @lukeapage)\n- [#2427](https://github.com/less/less.js/pull/2427) Nested mixin changing important 2421 (@SomMeri)\n- [#2423](https://github.com/less/less.js/pull/2423) Bug: extend doesn't work when appended on nested selector with & (@SomMeri)\n- [#2420](https://github.com/less/less.js/pull/2420) endlines and comments (@bassjobsen)\n\n### v2.3.1 (2015-01-28)\n- [#2400](https://github.com/less/less.js/pull/2400) Nested parent selectors &:not(&)  - 2026 (@SomMeri)\n\n### v2.3.0 (2015-01-27)\n- [#2401](https://github.com/less/less.js/pull/2401) Allow selector interpolation inside pseudoselectors. #1294 (@SomMeri)\n- [#2404](https://github.com/less/less.js/pull/2404) Important on parametrized mixin (@SomMeri)\n- [#2414](https://github.com/less/less.js/pull/2414) explain inline maps (@bassjobsen)\n- [#2392](https://github.com/less/less.js/pull/2392) add support for `isruleset` (@Justineo)\n- [#2390](https://github.com/less/less.js/pull/2390) message when sourcemap has been written (@bassjobsen)\n- [#2391](https://github.com/less/less.js/pull/2391) Remove BOM in imports. (@DotNetSparky)\n- [#2387](https://github.com/less/less.js/pull/2387) Data uri support for include-path (@lukeapage)\n- [#2385](https://github.com/less/less.js/pull/2385) checking for doubles when warning for empty extends (@ddprrt)\n- [#2380](https://github.com/less/less.js/pull/2380) Colour keyword as variable name reference (@seven-phases-max)\n- [#2369](https://github.com/less/less.js/pull/2369) making sure :extend warning does not bubble up, fixes #1618 (@ddprrt)\n\n### v2.2.0 (2015-01-04)\n- [#2363](https://github.com/less/less.js/pull/2363) Change error message when caching fails (@bassjobsen)\n- [#2337](https://github.com/less/less.js/pull/2337) Better output for the warning when file size exceeds (@bassjobsen)\n- [#2319](https://github.com/less/less.js/pull/2319) Expose Less parsing as a top level feature of the less package (@jackwanders)\n\n### v2.1.2 (2014-12-20)\n- [#2315](https://github.com/less/less.js/pull/2315) Support non-JSON script attributes (@guybedford)\n- [#2313](https://github.com/less/less.js/pull/2313) Remove second 'env:' in .travis.yml. (@vsn4ik)\n\n### v2.1.1 (2014-11-27)\n- [#2312](https://github.com/less/less.js/pull/2312) Fix double handling of exceptions (@ForbesLindesay)\n- [#2311](https://github.com/less/less.js/pull/2311) Pass this from promise based calling (@ForbesLindesay)\n- [#2309](https://github.com/less/less.js/pull/2309) Improve keyword and anonymous input for replace function (fixes #2308). (@seven-phases-max)\n\n### v2.1.0 (2014-11-23)\n- [#2298](https://github.com/less/less.js/pull/2298) Small improve in README.md and bower.json. (@vsn4ik)\n- [#2297](https://github.com/less/less.js/pull/2297) Package: Updates request to 2.48.0 (@am11)\n- [#2296](https://github.com/less/less.js/pull/2296) Fix getting of character at index (@Taritsyn)\n- [#2279](https://github.com/less/less.js/pull/2279) Remove livereload cache buster param in extractId (@cgross)\n\n### v2.0.0 (2014-11-09)\n- [#2277](https://github.com/less/less.js/pull/2277) create index and browser scripts in root as require targets (@jackwanders, @lukeapage, @seven-phases-max, @Justineo, @lejenome)\n- [#2269](https://github.com/less/less.js/pull/2269) Fix for wrong check in abstractFileManager.getPath (@dexif, @lukeapage, @seven-phases-max, @Justineo, @lejenome)\n- [#2267](https://github.com/less/less.js/pull/2267) CLI: Fixes source-map-url description (#2264) (@am11)\n- [#2268](https://github.com/less/less.js/pull/2268) typo fixes (@vlajos)\n- [#2264](https://github.com/less/less.js/pull/2264) CLI: Fixes source-map-url description. (#2264) (@am11)\n\n### v2.0.0-b3 (2014-11-01)\n- [#2254](https://github.com/less/less.js/pull/2254) Fix for import relative path for url with parameters (@dexif)\n\n### v2.0.0-b2 (2014-10-26)\n- [#2246](https://github.com/less/less.js/pull/2246) Attempt to fix import sequencing (@lukeapage)\n- [#2247](https://github.com/less/less.js/pull/2247) Add support for rebeccapurple (#663399) (@le717)\n- [#663399](https://github.com/less/less.js/pull/663399) Add rebeccapurple (#663399) (Triangle717)\n- [#2243](https://github.com/less/less.js/pull/2243) Support reading less options from its script tag data attributes (@lejenome)\n- [#2241](https://github.com/less/less.js/pull/2241) Update CHANGELOG.md (@Justineo)\n\n### v2.0.0-b1 (2014-10-19)\n- [#1902](https://github.com/less/less.js/pull/1902) 2.0.0 Pull Request (@lukeapage, @seven-phases-max, @XhmikosR, @levithomason)\n- [#2233](https://github.com/less/less.js/pull/2233) Method to scan for and register stylesheets (@levithomason)\n- [#2226](https://github.com/less/less.js/pull/2226) Notify when less.js is done processing (@levithomason)\n- [#2209](https://github.com/less/less.js/pull/2209) Remove unnecessary semicolon (@joscha)\n- [#2217](https://github.com/less/less.js/pull/2217) Fix interpolated selector match regression (@seven-phases-max)\n- [#2185](https://github.com/less/less.js/pull/2185) Use SVGs for all readme badges (@theodorejb)\n- [#2182](https://github.com/less/less.js/pull/2182) Fixes #1973 (@seven-phases-max)\n- [#2181](https://github.com/less/less.js/pull/2181) Case insensitive units parsing and comparison (@lukeapage)\n\n### v1.7.5 (2014-09-03)\n- [#2173](https://github.com/less/less.js/pull/2173) Property interpolation fix for `@*` values (@seven-phases-max)\n- [#2169](https://github.com/less/less.js/pull/2169) Accept comments in @keyframe and after rule name - merging for next patch release. (@SomMeri)\n- [#1921](https://github.com/less/less.js/pull/1921) Pass options object to parser.parse in less.render (@rback)\n- [#2136](https://github.com/less/less.js/pull/2136) Fragment handling in data-uri function 1959 (@SomMeri)\n- [#2135](https://github.com/less/less.js/pull/2135) Charsets should float on top #2126 (@SomMeri)\n- [#2128](https://github.com/less/less.js/pull/2128) Mixin wrongly called (@SomMeri, @obecker, @dhaber)\n- [#2144](https://github.com/less/less.js/pull/2144) Updating request dependency (@pdehaan)\n- [#2123](https://github.com/less/less.js/pull/2123) Import into media 1645 (@SomMeri, @obecker, @dhaber)\n\n### v1.7.4 (2014-07-27)\n- [#2100](https://github.com/less/less.js/pull/2100) Update bower for 1.7.3 (@joscha)\n- [#2121](https://github.com/less/less.js/pull/2121) Properties merging should work also inside directives #2035 (@SomMeri)\n- [#2120](https://github.com/less/less.js/pull/2120) Misleading error message 2069 (@SomMeri, @obecker, @dhaber)\n- [#2117](https://github.com/less/less.js/pull/2117) Fix ordering of @import and @charset rules #1954 #2013 (@SomMeri)\n\n### v1.7.3 (2014-06-22)\n- [#2062](https://github.com/less/less.js/pull/2062) Don't round values returned by colour query functions. (@seven-phases-max)\n\n### v1.7.2 (2014-06-22)\n- [#2045](https://github.com/less/less.js/pull/2045) Base64 encode source maps (@tim-smart)\n\n### v1.7.1 (2014-06-08)\n- [#2022](https://github.com/less/less.js/pull/2022) 2.0.0 refactor chunker and less error (@ForbesLindesay)\n- [#2021](https://github.com/less/less.js/pull/2021) 2.0.0 promises (@ForbesLindesay)\n- [#1976](https://github.com/less/less.js/pull/1976) Added condition to check if HEX code contain only valid characters (issue #1015) (@peruginni)\n- [#2019](https://github.com/less/less.js/pull/2019) Remove the \"done\" message displayed at the end of the compilation with Rhino. (@gdelhumeau)\n- [#2031](https://github.com/less/less.js/pull/2031) Fix a bug: if the less file end line is comments, the lessc command option \"modify-var\" will have no effect. (@chenboxiang)\n- [#2046](https://github.com/less/less.js/pull/2046) window.ActiveXObject in IE11: fix boolean casting (@dkrnl)\n- [#2016](https://github.com/less/less.js/pull/2016) e(\"\") fix (@seven-phases-max)\n- [#2000](https://github.com/less/less.js/pull/2000) Set CSS text after style element is added to DOM, to fix crash on IE < 9... (@David-Hari)\n- [#2002](https://github.com/less/less.js/pull/2002) Fixes #2001 (@seven-phases-max)\n- [#1981](https://github.com/less/less.js/pull/1981) fix bug with ../.. paths joining (@kolipka)\n- [#1974](https://github.com/less/less.js/pull/1974) Change paths determination for CLI (@dominicbarnes)\n- [#1929](https://github.com/less/less.js/pull/1929) Recursive mixin calls regression fix. (@seven-phases-max)\n- [#1936](https://github.com/less/less.js/pull/1936) Fix error message when using cleancss with sourcemap (@danielchatfield)\n- [#1919](https://github.com/less/less.js/pull/1919) Usage info for url-args option (@bcluca)\n- [#1907](https://github.com/less/less.js/pull/1907) Remove trailing spaces from the license header. (@XhmikosR)\n- [#1906](https://github.com/less/less.js/pull/1906) Remove twitter-bootstrap tag from SO link (@zlatanvasovic)\n\n### v1.7.0 (2014-02-27)\n- [#1890](https://github.com/less/less.js/pull/1890) Let `luma` follow spec (@seven-phases-max, @lukeapage)\n- [#1859](https://github.com/less/less.js/pull/1859) detached rulesets (@lukeapage)\n- [#1884](https://github.com/less/less.js/pull/1884) Minor `replace` and `%` funcs improvement. (@seven-phases-max)\n- [#1855](https://github.com/less/less.js/pull/1855) Adding replace function (@jakebellacera, @mouyang)\n- [#1866](https://github.com/less/less.js/pull/1866) Fixed empty args matching for named variadics. (@seven-phases-max)\n- [#1860](https://github.com/less/less.js/pull/1860) Support for variables in certain at-rules. (@seven-phases-max)\n- [#1847](https://github.com/less/less.js/pull/1847) Property merge with `+_` (replaces #1788) (@seven-phases-max, @mouyang)\n\n### v1.6.3 (2014-02-08)\n- [#1844](https://github.com/less/less.js/pull/1844) fix broken test case (@mouyang)\n\n### v1.6.2 (2014-02-02)\n- [#1841](https://github.com/less/less.js/pull/1841) Improved missing `(` and `{` error detection. (@seven-phases-max)\n- [#1828](https://github.com/less/less.js/pull/1828) Updates bower.json for current version (@ruyadorno)\n- [#1823](https://github.com/less/less.js/pull/1823) Improved multiple `default()` guards conflict detection. (@seven-phases-max)\n- [#1822](https://github.com/less/less.js/pull/1822) Normalize require-calls for Browserify (@pateketrueke)\n- [#1814](https://github.com/less/less.js/pull/1814) Rounding of output numbers. (@seven-phases-max)\n- [#1806](https://github.com/less/less.js/pull/1806) rhino version not up to date (#1405) (@obecker, @dhaber)\n- [#1815](https://github.com/less/less.js/pull/1815) Correct arguments for tree.Element (@oyejorge)\n- [#16](https://github.com/less/less.js/pull/16) Don't lint source-map since its owned by another project (@dhaber)\n- [#17](https://github.com/less/less.js/pull/17) Fix empty test (@dhaber)\n- [#1803](https://github.com/less/less.js/pull/1803) ability to insert uppercase color names (@wareczek)\n- [#1804](https://github.com/less/less.js/pull/1804) small compatibility fix for prototype.js (@cettox)\n- [#13](https://github.com/less/less.js/pull/13) Add Support-Map Tests for Rhino (@dhaber)\n- [#12](https://github.com/less/less.js/pull/12) Fix for some tests that were failing on my Mac (@dhaber)\n- [#11](https://github.com/less/less.js/pull/11) Fix for issue #3: Tests should automatically take latest rhino file (@dhaber)\n\n### v1.6.1 (2014-01-12)\n- [#1780](https://github.com/less/less.js/pull/1780) #1778 standardised using starting index, to fix incorrectly mapped sourcemaps (@brenmar)\n- [#1797](https://github.com/less/less.js/pull/1797) Updated .jshintrc to highlight for ... in without isOwnProperty (@DHainzl)\n- [#1795](https://github.com/less/less.js/pull/1795) Fix for running test cases in a regular browser like Firefox or Chrome (@dhaber)\n- [#1773](https://github.com/less/less.js/pull/1773) Fixes \"function\" test against regular expressions (@matthew-dean)\n\n### v1.6.0 (2014-01-01)\n- [#1737](https://github.com/less/less.js/pull/1737) Clamped rgba format color output (@seven-phases-max)\n- [#1769](https://github.com/less/less.js/pull/1769) If result of evaluated javascript is a number return it as Dimension. (@lesswtf)\n- [#1766](https://github.com/less/less.js/pull/1766) Improved error message for undefined variable in js eval statement. (@seven-phases-max)\n- [#1758](https://github.com/less/less.js/pull/1758) Removed redundant code from tree.Selector.match() (@seven-phases-max)\n- [#1757](https://github.com/less/less.js/pull/1757) Tree functions cleanup + CSS Guards `default` error. (@seven-phases-max)\n- [#1624](https://github.com/less/less.js/pull/1624) Experimental support for mixins with interpolated selectors (@seven-phases-max)\n- [#1743](https://github.com/less/less.js/pull/1743) Interleaved property merge fix (@seven-phases-max)\n- [#1744](https://github.com/less/less.js/pull/1744) Fix CHANGELOG broken link in README. (@jeffslofish)\n- [#1733](https://github.com/less/less.js/pull/1733) Remove alpha from contrast calc (@Synchro)\n- [#1704](https://github.com/less/less.js/pull/1704) Color blending functions with transparency. (@seven-phases-max)\n- [#1708](https://github.com/less/less.js/pull/1708) Updated Readme for full examples (@SomMeri, @Synchro)\n- [#1717](https://github.com/less/less.js/pull/1717) Minifier complains about annotation in non-JSDoc tag (@joscha)\n- [#1714](https://github.com/less/less.js/pull/1714) Fix for math expr/ops error messages line/column numbers. (@seven-phases-max)\n\n### v1.5.1 (2013-11-17)\n- [#1658](https://github.com/less/less.js/pull/1658) Fixes #1619 (@joshuaspence)\n- [#1643](https://github.com/less/less.js/pull/1643) Check location.port for truthiness (@matthewp)\n- [#1655](https://github.com/less/less.js/pull/1655) Support specifying custom variables when calling lessc and less.js. (@chipx86)\n- [#1628](https://github.com/less/less.js/pull/1628) update bower.json main script (@tomfuertes)\n\n### v1.5.0 (2013-10-21)\n- [#1570](https://github.com/less/less.js/pull/1570) proposed solution to #1568: percentage as attribute (@MSamman, @danielfttorres)\n- [#1572](https://github.com/less/less.js/pull/1572) util.error is deprecated (@robocoder)\n- [#1542](https://github.com/less/less.js/pull/1542) Added `length` function (#1542). Added scalar value handling for `extract` and `length` (#1576). (@seven-phases-max)\n- [#1558](https://github.com/less/less.js/pull/1558) Bower package: purge unnecessary files (@danielfttorres)\n\n### v1.5.0-b3 (2013-09-17)\n- [#1552](https://github.com/less/less.js/pull/1552) Replace deprecated sys.puts with console.log, resolve #1529 (@picomancer)\n- [#1543](https://github.com/less/less.js/pull/1543) Sourcemap basepath option (@andjo)\n- [#1412](https://github.com/less/less.js/pull/1412) Allow imports from self-signed SSL hosts (@christopherobin)\n\n### v1.5.0-b2 (2013-09-09)\n- [#1537](https://github.com/less/less.js/pull/1537) Fix Changelog link (@radium-v)\n\n### v1.5.0-b1 (2013-09-03)\n- [#1519](https://github.com/less/less.js/pull/1519) Update main property value of bower.json (@JacopKane)\n- [#1](https://github.com/less/less.js/pull/1) Refactoring browser unit tests into grunt-contrib-jasmine (@SomMeri)\n- [#1449](https://github.com/less/less.js/pull/1449) resolves #964 (@jonschlinkert)\n\n### v1.4.2 (2013-07-20)\n- [#1425](https://github.com/less/less.js/pull/1425) Windows path fixes (@SLaks)\n- [#1388](https://github.com/less/less.js/pull/1388) Add .gitattributes to .npmignore (@dpatti)\n\n### v1.4.0-b3 (2013-04-30)\n- [#1278](https://github.com/less/less.js/pull/1278) Better fix for local path (cross-platform) (@losnir)\n- [#1277](https://github.com/less/less.js/pull/1277) contributing.md updates. Fellow nerds! please wrap words with `@` signs in backticks! (@jonschlinkert)\n- [#1273](https://github.com/less/less.js/pull/1273) Fix for local paths (@losnir)\n- [#1244](https://github.com/less/less.js/pull/1244) Add Less license to package.json (@theoreticaLee)\n- [#1236](https://github.com/less/less.js/pull/1236) Fixes small typo in command prompt usage text (@buley)\n\n### v1.4.0-b2 (2013-03-18)\n- [#1230](https://github.com/less/less.js/pull/1230) package.json edited (@jonschlinkert)\n\n### v1.4.0-b1 (2013-03-08)\n- [#1197](https://github.com/less/less.js/pull/1197) Updates copyright year in README.md (@Starefossen)\n- [#1148](https://github.com/less/less.js/pull/1148) Better implementation of luma (@Synchro)\n- [#1147](https://github.com/less/less.js/pull/1147) HSV support for #1143 (@Synchro)\n- [#1145](https://github.com/less/less.js/pull/1145) Contrast percentage fix for #1144 (@Synchro)\n- [#933](https://github.com/less/less.js/pull/933) Allow flexible naming for amd support (#933) (@guybedford)\n\n### v1.3.1 (2012-10-18)\n- [#889](https://github.com/less/less.js/pull/889) Add dppx and dpcm units to parser dimensions (@feelepxyz)\n- [#890](https://github.com/less/less.js/pull/890) Add vmin unit to parser dimensions (@feelepxyz)\n- [#879](https://github.com/less/less.js/pull/879) Allow numbers and underscores in attribute selectors (@dmcass)\n- [#857](https://github.com/less/less.js/pull/857) Revert adding \"transparent\" as a color name (@clmsnskr)\n- [#753](https://github.com/less/less.js/pull/753) Adding \"dpi\" as a valid dimensions for media queries (@clarkni5)\n- [#800](https://github.com/less/less.js/pull/800) Added 'transparent' as a named color (@SpadarShut)\n- [#804](https://github.com/less/less.js/pull/804) Fix for unnamed parameters test fail & failing test for import-once (@jreading)\n- [#796](https://github.com/less/less.js/pull/796) fixed issue #795 (@comfuture)\n- [#268](https://github.com/less/less.js/pull/268) Implemented named arguments (@jamesfoster)\n\n### v1.3.0 (2012-03-10)\n- [#673](https://github.com/less/less.js/pull/673) mocha found a couple global variable leaks. Here's the fix. (@andrewjstone)\n- [#634](https://github.com/less/less.js/pull/634) Add @media bubbling/nesting/merging (@NDMarcel)\n- [#631](https://github.com/less/less.js/pull/631) Fixed spelling error on benchmark/less-benchmark.js (@highergroundstudio)\n- [#601](https://github.com/less/less.js/pull/601) Make parse error handler more robust (@adrianheine)\n- [#595](https://github.com/less/less.js/pull/595) Fix callback called two times (@hokaccha, @cloudhead, @chrizel, @fat)\n- [#604](https://github.com/less/less.js/pull/604) Fixes #602 (@treshugart)\n- [#585](https://github.com/less/less.js/pull/585) newline all selectors whose combined length is greater than 25 chars (@fat)\n- [#479](https://github.com/less/less.js/pull/479) CommonJS/AMD module support (@tobias104)\n- [#516](https://github.com/less/less.js/pull/516) Improve Windows path support in lessc (@chrizel)\n- [#557](https://github.com/less/less.js/pull/557) Fix for issue #466 (@kmchugh)\n- [#515](https://github.com/less/less.js/pull/515) Shift the type setting in order to work with Webkit, and fix typo for IE (@imcotton)\n- [#527](https://github.com/less/less.js/pull/527) Add function `percentage` (@hokaccha)\n\n### 1.1.5-extend_patch (2011-12-13)\n- [#496](https://github.com/less/less.js/pull/496) Removed call to put header into minified build, because it's already there. (@freeeve)\n- [#379](https://github.com/less/less.js/pull/379) Accept 2xx statuses even for file requests (@khalsah)\n- [#494](https://github.com/less/less.js/pull/494) Adding support for absolute paths on Windows. (@jmcclell)\n- [#514](https://github.com/less/less.js/pull/514) Fix java.io.FileNotFoundException when @importing from LESS in subdirectory (@eager)\n- [#461](https://github.com/less/less.js/pull/461) require 'util' instead of 'sys' in lessc and less-benchmark.js (@dmcass)\n- [#506](https://github.com/less/less.js/pull/506) Issue #393 Add support for \"rem\" dimensions (@feelepxyz)\n- [#507](https://github.com/less/less.js/pull/507) Fixed lessc require('sys') for nodejs 0.6.* (@garth)\n- [#492](https://github.com/less/less.js/pull/492) fix comments in operations (ex: *height: 2px * 4 /* ie hack */) (@fat)\n- [#458](https://github.com/less/less.js/pull/458) Assignment entities (@fat, @cloudhead, @asolove)\n\n### 1.1.4-lastest (2011-11-14)\n- [#445](https://github.com/less/less.js/pull/445) fix undefined reference (@asolove)\n- [#450](https://github.com/less/less.js/pull/450) store index on selector element objects for line number inference (@fat)\n- [#432](https://github.com/less/less.js/pull/432) #361: Fix for quoted data URIs getting prepended with path (@asolove)\n- [#388](https://github.com/less/less.js/pull/388) Rhino support (@erwan)\n- [#355](https://github.com/less/less.js/pull/355) support imports with querystrings (google fonts) fix #265 (@revolunet)\n- [#340](https://github.com/less/less.js/pull/340) Read less-content from stdin (@snorkypie)\n- [#341](https://github.com/less/less.js/pull/341) patch for Issue 322 (@ttfkam)\n- [#335](https://github.com/less/less.js/pull/335) update ARGB support, fix IE9 style injection (@ttfkam)\n- [#229](https://github.com/less/less.js/pull/229) add fade() function (@bennyschudel)\n- [#347](https://github.com/less/less.js/pull/347) support @-moz-keyframes. (@idris)\n- [#169](https://github.com/less/less.js/pull/169) (fix) including .less files via absolute path with IE7 (@ldaley)\n- [#189](https://github.com/less/less.js/pull/189) Google Chrome(Chromium) support for extensions (@dz0ny)\n- [#247](https://github.com/less/less.js/pull/247) New \"escape\" function (@gilt)\n- [#134](https://github.com/less/less.js/pull/134) Fixed issue (#134) where subfiles' @imports were regarding #, ? and url portions thereafter as part of the base url. (@dbergey)\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Less.js\n\nThank you for your interest in contributing to Less.js! Contributions come in many forms—fixing bugs, improving code quality, enhancing tooling, updating documentation, and occasionally adding new features. This guide will help you get started.\n\n## Getting Started\n\nBefore you begin, please note: **Words that begin with the at sign (`@`) must be wrapped in backticks!** This prevents unintended notifications to GitHub users. For example, use `` `@username` `` instead of `@username`.\n\nGitHub has many great markdown features—[learn more about them here](https://help.github.com/articles/github-flavored-markdown).\n\n## Reporting Issues\n\nWe welcome bug reports and feature requests! To help us help you, please follow these guidelines:\n\n1. **Search for existing issues first.** Many issues have already been reported or resolved. Checking first saves everyone time.\n2. **Create an isolated and reproducible test case.** Include [reduced test cases](http://css-tricks.com/reduced-test-cases/) that demonstrate the problem clearly.\n3. **Test with the latest version.** Many issues are resolved in newer versions—please update first.\n4. **Include examples with source code.** You can use [Less Preview](http://lesscss.org/less-preview/) to create a short test case.\n5. **Share as much information as possible.** Include:\n   - Operating system and version\n   - How you're using Less (browser, command line, build tool, etc.)\n   - Browser and version (if applicable)\n   - Version of Less.js you're using\n   - Clear steps to reproduce the issue\n6. **Suggest solutions if you have them.** If you know how to fix it, share your approach or submit a pull request!\n\nPlease report documentation issues in [the documentation project](https://github.com/less/less-docs).\n\n## Feature Requests\n\nWhen suggesting features:\n\n* **Search existing feature requests first** to see if something similar already exists. Many features are already planned or under consideration.\n* **Include a clear and specific use-case.** Help us understand the practical need and how it would be used.\n* **Consider alternatives.** Sometimes a function or a 3rd-party build system might be a better fit than a core language feature.\n\n**Note:** Most helpful contributions to Less.js are organizational—addressing bugs, improving code quality, enhancing tooling, and updating documentation. The language features are generally stable, even if not all planned features have been implemented yet.\n\n## Pull Requests\n\nPull requests are welcome! Here's how to make them go smoothly:\n\n* **For new features, start with a feature request** to get feedback and see how your idea is received.\n* **If your PR solves an existing issue**, but approaches it differently, please create a new issue first and discuss it with core contributors. This helps avoid wasted effort.\n* The `dist/` folder is gitignored—builds happen automatically during releases.\n* **Please add tests** for your work. Run tests using `pnpm test`, which runs both Node.js and browser (Headless Chrome) tests.\n\n### Coding Standards\n\n* Always use spaces, never tabs\n* End lines with semicolons\n* Aim for ESLint standards\n\n## Developing\n\nIf you want to work on an issue, add a comment saying you're taking it on—this helps prevent duplicate work.\n\nLearn more about [developing Less.js](http://lesscss.org/usage/#developing-less).\n\n## Releases\n\nReleases are fully automated! Here's how it works:\n\n### Automated Publishing\n\nWhen code is pushed to specific branches, GitHub Actions automatically:\n\n1. **Runs tests and builds** the project\n2. **Bumps the version** automatically\n3. **Publishes to npm** with the appropriate tag\n4. **Creates a GitHub release**\n\n### Release Branches\n\n- **`master` branch**: \n  - Publishes regular releases (e.g., `4.4.2` → `4.4.3`)\n  - Published to npm with `latest` tag\n  - Creates regular GitHub releases\n  - Version auto-increments by patch unless explicitly set\n\n- **`alpha` branch**:\n  - Publishes alpha releases (e.g., `5.0.0-alpha.1` → `5.0.0-alpha.2`)\n  - Published to npm with `alpha` tag\n  - Creates GitHub pre-releases\n  - Version auto-increments alpha suffix\n\n### How to Publish\n\n**For patch releases (automatic):**\n1. Merge your PR into `master`\n2. The workflow compares `package.json` against the latest npm version\n3. If `package.json` is ahead, it uses that version; otherwise it bumps to the next patch\n4. Publishes to npm and creates a GitHub release with `less.js` and `less.min.js` attached\n\n**For minor/major releases:**\n1. Create a release branch (e.g., `release/v4.7.0`)\n2. Update `version` in all `package.json` files and update `CHANGELOG.md`\n3. Merge into `master`\n4. The workflow detects the version is ahead of npm and publishes it directly\n\n**For alpha releases:**\n1. Make your changes on the `alpha` branch\n2. Commit and push\n3. The workflow automatically increments the alpha version and publishes\n\n### Version Override\n\nTo force a specific version (useful for CI or manual runs), set the `EXPLICIT_VERSION` environment variable:\n\n```bash\nEXPLICIT_VERSION=4.7.0 pnpm run publish\n```\n\n### Release Assets\n\nEach GitHub release automatically includes:\n- `less.js` — the full browser build\n- `less.min.js` — the minified browser build\n\nThese are built during the workflow and attached to the release. They are not committed to git (the `dist/` directory is gitignored).\n\n### Security\n\nWe use npm's [trusted publishing](https://docs.npmjs.com/trusted-publishers) with OIDC authentication. This means:\n- No long-lived tokens needed\n- Automatic provenance generation\n- Enhanced security through short-lived, workflow-specific credentials\n\nThe publishing workflow (`.github/workflows/publish.yml`) handles both release types automatically.\n\n### Important Notes\n\n- Publishing only works from `master` or `alpha` branches\n- Alpha versions must contain `-alpha.` and are published to the `alpha` tag\n- Regular versions are published to the `latest` tag\n- Alpha branch must be up-to-date with master before publishing\n- Alpha base version must be >= master version (semver)\n\n### Merging Master into Alpha\n\nWhen merging `master` into `alpha`, the version in `package.json` might be overwritten. We have two layers of protection:\n\n1. **Post-merge git hook** (automatic): Automatically restores alpha versions after merges\n   - Installed automatically via husky when you run `pnpm install`\n   - Runs automatically after `git merge`\n   - Restores and increments the alpha version if it was overwritten\n   - Prompts you to commit the restored version\n\n2. **Publishing script detection** (safety net): The publishing script also detects overwritten versions\n   - Searches git history for the last alpha version\n   - Restores and increments it (e.g., if it was `5.0.0-alpha.3`, it becomes `5.0.0-alpha.4`)\n   - Updates all package.json files accordingly\n\n**Note**: The git hook is managed by husky and installs automatically. The publishing script protection works as a backup even if the hook isn't installed.\n\n---\n\nThank you for contributing to Less.js!\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                              Apache License\n                        Version 2.0, January 2004\n                     http://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n1. Definitions.\n\n   \"License\" shall mean the terms and conditions for use, reproduction,\n   and distribution as defined by Sections 1 through 9 of this document.\n\n   \"Licensor\" shall mean the copyright owner or entity authorized by\n   the copyright owner that is granting the License.\n\n   \"Legal Entity\" shall mean the union of the acting entity and all\n   other entities that control, are controlled by, or are under common\n   control with that entity. For the purposes of this definition,\n   \"control\" means (i) the power, direct or indirect, to cause the\n   direction or management of such entity, whether by contract or\n   otherwise, or (ii) ownership of fifty percent (50%) or more of the\n   outstanding shares, or (iii) beneficial ownership of such entity.\n\n   \"You\" (or \"Your\") shall mean an individual or Legal Entity\n   exercising permissions granted by this License.\n\n   \"Source\" form shall mean the preferred form for making modifications,\n   including but not limited to software source code, documentation\n   source, and configuration files.\n\n   \"Object\" form shall mean any form resulting from mechanical\n   transformation or translation of a Source form, including but\n   not limited to compiled object code, generated documentation,\n   and conversions to other media types.\n\n   \"Work\" shall mean the work of authorship, whether in Source or\n   Object form, made available under the License, as indicated by a\n   copyright notice that is included in or attached to the work\n   (an example is provided in the Appendix below).\n\n   \"Derivative Works\" shall mean any work, whether in Source or Object\n   form, that is based on (or derived from) the Work and for which the\n   editorial revisions, annotations, elaborations, or other modifications\n   represent, as a whole, an original work of authorship. For the purposes\n   of this License, Derivative Works shall not include works that remain\n   separable from, or merely link (or bind by name) to the interfaces of,\n   the Work and Derivative Works thereof.\n\n   \"Contribution\" shall mean any work of authorship, including\n   the original version of the Work and any modifications or additions\n   to that Work or Derivative Works thereof, that is intentionally\n   submitted to Licensor for inclusion in the Work by the copyright owner\n   or by an individual or Legal Entity authorized to submit on behalf of\n   the copyright owner. For the purposes of this definition, \"submitted\"\n   means any form of electronic, verbal, or written communication sent\n   to the Licensor or its representatives, including but not limited to\n   communication on electronic mailing lists, source code control systems,\n   and issue tracking systems that are managed by, or on behalf of, the\n   Licensor for the purpose of discussing and improving the Work, but\n   excluding communication that is conspicuously marked or otherwise\n   designated in writing by the copyright owner as \"Not a Contribution.\"\n\n   \"Contributor\" shall mean Licensor and any individual or Legal Entity\n   on behalf of whom a Contribution has been received by Licensor and\n   subsequently incorporated within the Work.\n\n2. Grant of Copyright License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   copyright license to reproduce, prepare Derivative Works of,\n   publicly display, publicly perform, sublicense, and distribute the\n   Work and such Derivative Works in Source or Object form.\n\n3. Grant of Patent License. Subject to the terms and conditions of\n   this License, each Contributor hereby grants to You a perpetual,\n   worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n   (except as stated in this section) patent license to make, have made,\n   use, offer to sell, sell, import, and otherwise transfer the Work,\n   where such license applies only to those patent claims licensable\n   by such Contributor that are necessarily infringed by their\n   Contribution(s) alone or by combination of their Contribution(s)\n   with the Work to which such Contribution(s) was submitted. If You\n   institute patent litigation against any entity (including a\n   cross-claim or counterclaim in a lawsuit) alleging that the Work\n   or a Contribution incorporated within the Work constitutes direct\n   or contributory patent infringement, then any patent licenses\n   granted to You under this License for that Work shall terminate\n   as of the date such litigation is filed.\n\n4. Redistribution. You may reproduce and distribute copies of the\n   Work or Derivative Works thereof in any medium, with or without\n   modifications, and in Source or Object form, provided that You\n   meet the following conditions:\n\n   (a) You must give any other recipients of the Work or\n       Derivative Works a copy of this License; and\n\n   (b) You must cause any modified files to carry prominent notices\n       stating that You changed the files; and\n\n   (c) You must retain, in the Source form of any Derivative Works\n       that You distribute, all copyright, patent, trademark, and\n       attribution notices from the Source form of the Work,\n       excluding those notices that do not pertain to any part of\n       the Derivative Works; and\n\n   (d) If the Work includes a \"NOTICE\" text file as part of its\n       distribution, then any Derivative Works that You distribute must\n       include a readable copy of the attribution notices contained\n       within such NOTICE file, excluding those notices that do not\n       pertain to any part of the Derivative Works, in at least one\n       of the following places: within a NOTICE text file distributed\n       as part of the Derivative Works; within the Source form or\n       documentation, if provided along with the Derivative Works; or,\n       within a display generated by the Derivative Works, if and\n       wherever such third-party notices normally appear. The contents\n       of the NOTICE file are for informational purposes only and\n       do not modify the License. You may add Your own attribution\n       notices within Derivative Works that You distribute, alongside\n       or as an addendum to the NOTICE text from the Work, provided\n       that such additional attribution notices cannot be construed\n       as modifying the License.\n\n   You may add Your own copyright statement to Your modifications and\n   may provide additional or different license terms and conditions\n   for use, reproduction, or distribution of Your modifications, or\n   for any such Derivative Works as a whole, provided Your use,\n   reproduction, and distribution of the Work otherwise complies with\n   the conditions stated in this License.\n\n5. Submission of Contributions. Unless You explicitly state otherwise,\n   any Contribution intentionally submitted for inclusion in the Work\n   by You to the Licensor shall be under the terms and conditions of\n   this License, without any additional terms or conditions.\n   Notwithstanding the above, nothing herein shall supersede or modify\n   the terms of any separate license agreement you may have executed\n   with Licensor regarding such Contributions.\n\n6. Trademarks. This License does not grant permission to use the trade\n   names, trademarks, service marks, or product names of the Licensor,\n   except as required for reasonable and customary use in describing the\n   origin of the Work and reproducing the content of the NOTICE file.\n\n7. Disclaimer of Warranty. Unless required by applicable law or\n   agreed to in writing, Licensor provides the Work (and each\n   Contributor provides its Contributions) on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n   implied, including, without limitation, any warranties or conditions\n   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n   PARTICULAR PURPOSE. You are solely responsible for determining the\n   appropriateness of using or redistributing the Work and assume any\n   risks associated with Your exercise of permissions under this License.\n\n8. Limitation of Liability. In no event and under no legal theory,\n   whether in tort (including negligence), contract, or otherwise,\n   unless required by applicable law (such as deliberate and grossly\n   negligent acts) or agreed to in writing, shall any Contributor be\n   liable to You for damages, including any direct, indirect, special,\n   incidental, or consequential damages of any character arising as a\n   result of this License or out of the use or inability to use the\n   Work (including but not limited to damages for loss of goodwill,\n   work stoppage, computer failure or malfunction, or any and all\n   other commercial damages or losses), even if such Contributor\n   has been advised of the possibility of such damages.\n\n9. Accepting Warranty or Additional Liability. While redistributing\n   the Work or Derivative Works thereof, You may choose to offer,\n   and charge a fee for, acceptance of support, warranty, indemnity,\n   or other liability obligations and/or rights consistent with this\n   License. However, in accepting such obligations, You may act only\n   on Your own behalf and on Your sole responsibility, not on behalf\n   of any other Contributor, and only if You agree to indemnify,\n   defend, and hold each Contributor harmless for any liability\n   incurred by, or claims asserted against, such Contributor by reason\n   of your accepting any such warranty or additional liability.\n\nEND OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"><img src=\"http://lesscss.org/public/img/less_logo.png\" width=\"264\" height=\"117\"></p>\n\n<p align=\"center\">\n    <a href=\"https://github.com/less/less.js/actions?query=branch%3Amaster\"><img src=\"https://github.com/less/less.js/actions/workflows/ci.yml/badge.svg?branch=master\" alt=\"Github Actions CI\"/></a>\n    <a href=\"https://www.npmtrends.com/less\"><img src=\"https://img.shields.io/npm/dm/less.svg?sanitize=true\" alt=\"Downloads\"></a>\n    <a href=\"https://www.npmjs.com/package/less\"><img src=\"https://img.shields.io/npm/v/less.svg?sanitize=true\" /></a>\n    <a href=\"https://twitter.com/lesstocss\"><img alt=\"Twitter Follow\" src=\"https://img.shields.io/twitter/follow/lesstocss.svg?style=flat-square\" style=\"max-width:100%;\" /></a>\n</p>\n\nThis is the Less.js monorepo.\n\n## More information\n\nFor general information on the language, configuration options or usage visit [lesscss.org](http://lesscss.org).\n\nHere are other resources for using Less.js:\n\n* [stackoverflow.com][so] is a great place to get answers about Less.\n* [Less.js Issues][issues] for reporting bugs\n\n\n## Contributing\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md). Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com).\n\n### Reporting Issues\n\nBefore opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas). After that if you find a bug or would like to make feature request, [please open a new issue][issues].\n\nPlease report documentation issues in [the documentation project](https://github.com/less/less-docs).\n\n### Development\n\nRead [Developing Less](http://lesscss.org/usage/#developing-less).\n\n## Release History\nSee the [changelog](CHANGELOG.md)\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n<a href=\"https://github.com/less/less.js/graphs/contributors\"><img src=\"https://opencollective.com/less/contributors.svg?width=890&button=false\" /></a>\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore-start -->\n<!-- markdownlint-disable -->\n<table>\n  <tbody>\n    <tr>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/matthew-dean\"><img src=\"https://avatars.githubusercontent.com/u/414752?v=4?s=100\" width=\"100px;\" alt=\"Matthew Dean\"/><br /><sub><b>Matthew Dean</b></sub></a><br /><a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=matthew-dean\" title=\"Code\">💻</a> <a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=matthew-dean\" title=\"Documentation\">📖</a> <a href=\"#maintenance-matthew-dean\" title=\"Maintenance\">🚧</a> <a href=\"#projectManagement-matthew-dean\" title=\"Project Management\">📆</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://cloudhead.io/\"><img src=\"https://avatars.githubusercontent.com/u/40774?v=4?s=100\" width=\"100px;\" alt=\"Alexis Sellier\"/><br /><sub><b>Alexis Sellier</b></sub></a><br /><a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=cloudhead\" title=\"Code\">💻</a> <a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=cloudhead\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/lukeapage\"><img src=\"https://avatars.githubusercontent.com/u/309321?v=4?s=100\" width=\"100px;\" alt=\"Luke Page\"/><br /><sub><b>Luke Page</b></sub></a><br /><a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=lukeapage\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/seven-phases-max\"><img src=\"https://avatars.githubusercontent.com/u/5304376?v=4?s=100\" width=\"100px;\" alt=\"Max Mikhailov\"/><br /><sub><b>Max Mikhailov</b></sub></a><br /><a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=seven-phases-max\" title=\"Code\">💻</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/iChenLei\"><img src=\"https://avatars.githubusercontent.com/u/14012511?v=4?s=100\" width=\"100px;\" alt=\"Lei Chen\"/><br /><sub><b>Lei Chen</b></sub></a><br /><a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=iChenLei\" title=\"Code\">💻</a> <a href=\"https://github.com/The Less CSS Team/Less.js/issues?q=author%3AiChenLei\" title=\"Bug reports\">🐛</a> <a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=iChenLei\" title=\"Documentation\">📖</a></td>\n      <td align=\"center\" valign=\"top\" width=\"14.28%\"><a href=\"https://github.com/puckowski\"><img src=\"https://avatars.githubusercontent.com/u/3059609?v=4?s=100\" width=\"100px;\" alt=\"Daniel Puckowski\"/><br /><sub><b>Daniel Puckowski</b></sub></a><br /><a href=\"https://github.com/The Less CSS Team/Less.js/commits?author=puckowski\" title=\"Code\">💻</a> <a href=\"https://github.com/The Less CSS Team/Less.js/issues?q=author%3Apuckowski\" title=\"Bug reports\">🐛</a></td>\n    </tr>\n  </tbody>\n  <tfoot>\n    <tr>\n      <td align=\"center\" size=\"13px\" colspan=\"7\">\n        <img src=\"https://raw.githubusercontent.com/all-contributors/all-contributors-cli/1b8533af435da9854653492b1327a23a4dbd0a10/assets/logo-small.svg\">\n          <a href=\"https://all-contributors.js.org/docs/en/bot/usage\">Add your contributions</a>\n        </img>\n      </td>\n    </tr>\n  </tfoot>\n</table>\n\n<!-- markdownlint-restore -->\n<!-- prettier-ignore-end -->\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\n\n## [License](LICENSE)\n\nCopyright (c) 2009-2025 [Alexis Sellier](http://cloudhead.io) & The Core Less Team\nLicensed under the [Apache License](LICENSE).\n\n\n[so]: http://stackoverflow.com/questions/tagged/less \"StackOverflow.com\"\n[issues]: https://github.com/less/less.js/issues \"GitHub Issues for Less.js\"\n[download]: https://github.com/less/less.js/zipball/master \"Download Less.js\"\n"
  },
  {
    "path": "package-lock.json",
    "content": "{\n\t\"name\": \"@less/root\",\n\t\"version\": \"4.6.3\",\n\t\"lockfileVersion\": 3,\n\t\"requires\": true,\n\t\"packages\": {\n\t\t\"\": {\n\t\t\t\"name\": \"@less/root\",\n\t\t\t\"version\": \"4.6.3\",\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"license\": \"Apache-2.0\",\n\t\t\t\"devDependencies\": {\n\t\t\t\t\"all-contributors-cli\": \"~6.26.1\",\n\t\t\t\t\"github-changes\": \"^1.1.2\",\n\t\t\t\t\"husky\": \"~9.1.7\",\n\t\t\t\t\"npm-run-all\": \"^4.1.5\",\n\t\t\t\t\"playwright\": \"1.50.1\",\n\t\t\t\t\"semver\": \"^6.3.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/@babel/runtime\": {\n\t\t\t\"version\": \"7.28.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz\",\n\t\t\t\"integrity\": \"sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6.9.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/all-contributors-cli\": {\n\t\t\t\"version\": \"6.26.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/all-contributors-cli/-/all-contributors-cli-6.26.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Ymgo3FJACRBEd1eE653FD1J/+uD0kqpUNYfr9zNC1Qby0LgbhDBzB3EF6uvkAbYpycStkk41J+0oo37Lc02yEw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/runtime\": \"^7.7.6\",\n\t\t\t\t\"async\": \"^3.1.0\",\n\t\t\t\t\"chalk\": \"^4.0.0\",\n\t\t\t\t\"didyoumean\": \"^1.2.1\",\n\t\t\t\t\"inquirer\": \"^7.3.3\",\n\t\t\t\t\"json-fixer\": \"^1.6.8\",\n\t\t\t\t\"lodash\": \"^4.11.2\",\n\t\t\t\t\"node-fetch\": \"^2.6.0\",\n\t\t\t\t\"pify\": \"^5.0.0\",\n\t\t\t\t\"yargs\": \"^15.0.1\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"all-contributors\": \"dist/cli.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t},\n\t\t\t\"optionalDependencies\": {\n\t\t\t\t\"prettier\": \"^2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ansi-escapes\": {\n\t\t\t\"version\": \"4.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"type-fest\": \"^0.21.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ansi-regex\": {\n\t\t\t\"version\": \"5.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ansi-styles\": {\n\t\t\t\"version\": \"4.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"color-convert\": \"^2.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/chalk/ansi-styles?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/application-config\": {\n\t\t\t\"version\": \"0.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/application-config/-/application-config-0.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Ryjni0MtYYW9Qz2iTIMF5B/4uRJV3dt5f7PYgQ7sjTh3BUf4EvOo83F84Z2//2HP+mUbwRw35/W1jhM5EZhk9Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"application-config-path\": \"^0.1.0\",\n\t\t\t\t\"mkdirp\": \"^0.5.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/application-config-path\": {\n\t\t\t\"version\": \"0.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/array-buffer-byte-length\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"is-array-buffer\": \"^3.0.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/arraybuffer.prototype.slice\": {\n\t\t\t\"version\": \"1.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"array-buffer-byte-length\": \"^1.0.1\",\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-abstract\": \"^1.23.5\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\",\n\t\t\t\t\"is-array-buffer\": \"^3.0.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/asn1\": {\n\t\t\t\"version\": \"0.1.11\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz\",\n\t\t\t\"integrity\": \"sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.4.9\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/assert-plus\": {\n\t\t\t\"version\": \"0.1.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz\",\n\t\t\t\"integrity\": \"sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/async\": {\n\t\t\t\"version\": \"3.2.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/async/-/async-3.2.6.tgz\",\n\t\t\t\"integrity\": \"sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/async-function\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/available-typed-arrays\": {\n\t\t\t\"version\": \"1.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"possible-typed-array-names\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/aws-sign\": {\n\t\t\t\"version\": \"0.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-pEMJAknifcXqXqYVXzGPIu8mJvxtJxIdpVpAs8HNS+paT+9srRUDMQn+3hULS7WbLmttcmvgMvnDcFujqXJyPw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/balanced-match\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/bl\": {\n\t\t\t\"version\": \"0.9.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bl/-/bl-0.9.5.tgz\",\n\t\t\t\"integrity\": \"sha512-njlCs8XLBIK7LCChTWfzWuIAxkpmmLXcL7/igCofFT1B039Sz0IPnAmosN5QaO22lU4qr8LcUz2ojUlE6pLkRQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"readable-stream\": \"~1.0.26\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/bluebird\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/bluebird/-/bluebird-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-97HxegERaUQxXTDVTITyt7QuXEapf5uVXPVXKg6UjPvFC3N46KGvg/obSNZQbekkDbZlzxppDdTjAxel7WSXaA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/boom\": {\n\t\t\t\"version\": \"0.4.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/boom/-/boom-0.4.2.tgz\",\n\t\t\t\"integrity\": \"sha512-OvfN8y1oAxxphzkl2SnCS+ztV/uVKTATtgLjWYg/7KwcNyf3rzpHxNQJZCKtsZd4+MteKczhWbSjtEX4bGgU9g==\",\n\t\t\t\"deprecated\": \"This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"hoek\": \"0.9.x\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/boom/node_modules/hoek\": {\n\t\t\t\"version\": \"0.9.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz\",\n\t\t\t\"integrity\": \"sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==\",\n\t\t\t\"deprecated\": \"This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/brace-expansion\": {\n\t\t\t\"version\": \"1.1.12\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz\",\n\t\t\t\"integrity\": \"sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"balanced-match\": \"^1.0.0\",\n\t\t\t\t\"concat-map\": \"0.0.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/call-bind\": {\n\t\t\t\"version\": \"1.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind-apply-helpers\": \"^1.0.0\",\n\t\t\t\t\"es-define-property\": \"^1.0.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.4\",\n\t\t\t\t\"set-function-length\": \"^1.2.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/call-bind-apply-helpers\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"function-bind\": \"^1.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/call-bound\": {\n\t\t\t\"version\": \"1.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind-apply-helpers\": \"^1.0.2\",\n\t\t\t\t\"get-intrinsic\": \"^1.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/camelcase\": {\n\t\t\t\"version\": \"5.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/chalk\": {\n\t\t\t\"version\": \"4.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-styles\": \"^4.1.0\",\n\t\t\t\t\"supports-color\": \"^7.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/chalk/chalk?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/chardet\": {\n\t\t\t\"version\": \"0.7.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz\",\n\t\t\t\"integrity\": \"sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/cli-cursor\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"restore-cursor\": \"^3.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/cli-width\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/cliui\": {\n\t\t\t\"version\": \"6.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"string-width\": \"^4.2.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.0\",\n\t\t\t\t\"wrap-ansi\": \"^6.2.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/color-convert\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"color-name\": \"~1.1.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=7.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/color-name\": {\n\t\t\t\"version\": \"1.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/colors\": {\n\t\t\t\"version\": \"0.5.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/colors/-/colors-0.5.1.tgz\",\n\t\t\t\"integrity\": \"sha512-XjsuUwpDeY98+yz959OlUK6m7mLBM+1MEG5oaenfuQnNnrQk1WvtcvFgN3FNDP3f2NmZ211t0mNEfSEN1h0eIg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.1.90\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/combined-stream\": {\n\t\t\t\"version\": \"0.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"delayed-stream\": \"0.0.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/concat-map\": {\n\t\t\t\"version\": \"0.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/cookie-jar\": {\n\t\t\t\"version\": \"0.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-dX1400pzPULr+ZovkIsDEqe7XH8xCAYGT5Dege4Eot44Qs2mS2iJmnh45TxTO5MIsCfrV/JGZVloLhm46AHxNw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/core-util-is\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/cross-spawn\": {\n\t\t\t\"version\": \"6.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"nice-try\": \"^1.0.4\",\n\t\t\t\t\"path-key\": \"^2.0.1\",\n\t\t\t\t\"semver\": \"^5.5.0\",\n\t\t\t\t\"shebang-command\": \"^1.2.0\",\n\t\t\t\t\"which\": \"^1.2.9\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/cross-spawn/node_modules/semver\": {\n\t\t\t\"version\": \"5.7.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n\t\t\t\"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/cryptiles\": {\n\t\t\t\"version\": \"0.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==\",\n\t\t\t\"deprecated\": \"This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"boom\": \"0.4.x\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ctype\": {\n\t\t\t\"version\": \"0.5.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz\",\n\t\t\t\"integrity\": \"sha512-T6CEkoSV4q50zW3TlTHMbzy1E5+zlnNcY+yb7tWVYlTwPhx9LpnfAkd4wecpWknDyptp4k97LUZeInlf6jdzBg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/data-view-buffer\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"is-data-view\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/data-view-byte-length\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"is-data-view\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/inspect-js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/data-view-byte-offset\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"is-data-view\": \"^1.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/decamelize\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/define-data-property\": {\n\t\t\t\"version\": \"1.1.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz\",\n\t\t\t\"integrity\": \"sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-define-property\": \"^1.0.0\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"gopd\": \"^1.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/define-properties\": {\n\t\t\t\"version\": \"1.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"define-data-property\": \"^1.0.1\",\n\t\t\t\t\"has-property-descriptors\": \"^1.0.0\",\n\t\t\t\t\"object-keys\": \"^1.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/delayed-stream\": {\n\t\t\t\"version\": \"0.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.4.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/didyoumean\": {\n\t\t\t\"version\": \"1.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"Apache-2.0\"\n\t\t},\n\t\t\"node_modules/dunder-proto\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind-apply-helpers\": \"^1.0.1\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"gopd\": \"^1.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/duplexer2\": {\n\t\t\t\"version\": \"0.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"BSD\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"readable-stream\": \"~1.1.9\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/duplexer2/node_modules/readable-stream\": {\n\t\t\t\"version\": \"1.1.14\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz\",\n\t\t\t\"integrity\": \"sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"core-util-is\": \"~1.0.0\",\n\t\t\t\t\"inherits\": \"~2.0.1\",\n\t\t\t\t\"isarray\": \"0.0.1\",\n\t\t\t\t\"string_decoder\": \"~0.10.x\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/emoji-regex\": {\n\t\t\t\"version\": \"8.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/error-ex\": {\n\t\t\t\"version\": \"1.3.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz\",\n\t\t\t\"integrity\": \"sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-arrayish\": \"^0.2.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-abstract\": {\n\t\t\t\"version\": \"1.24.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz\",\n\t\t\t\"integrity\": \"sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"array-buffer-byte-length\": \"^1.0.2\",\n\t\t\t\t\"arraybuffer.prototype.slice\": \"^1.0.4\",\n\t\t\t\t\"available-typed-arrays\": \"^1.0.7\",\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.4\",\n\t\t\t\t\"data-view-buffer\": \"^1.0.2\",\n\t\t\t\t\"data-view-byte-length\": \"^1.0.2\",\n\t\t\t\t\"data-view-byte-offset\": \"^1.0.1\",\n\t\t\t\t\"es-define-property\": \"^1.0.1\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"es-object-atoms\": \"^1.1.1\",\n\t\t\t\t\"es-set-tostringtag\": \"^2.1.0\",\n\t\t\t\t\"es-to-primitive\": \"^1.3.0\",\n\t\t\t\t\"function.prototype.name\": \"^1.1.8\",\n\t\t\t\t\"get-intrinsic\": \"^1.3.0\",\n\t\t\t\t\"get-proto\": \"^1.0.1\",\n\t\t\t\t\"get-symbol-description\": \"^1.1.0\",\n\t\t\t\t\"globalthis\": \"^1.0.4\",\n\t\t\t\t\"gopd\": \"^1.2.0\",\n\t\t\t\t\"has-property-descriptors\": \"^1.0.2\",\n\t\t\t\t\"has-proto\": \"^1.2.0\",\n\t\t\t\t\"has-symbols\": \"^1.1.0\",\n\t\t\t\t\"hasown\": \"^2.0.2\",\n\t\t\t\t\"internal-slot\": \"^1.1.0\",\n\t\t\t\t\"is-array-buffer\": \"^3.0.5\",\n\t\t\t\t\"is-callable\": \"^1.2.7\",\n\t\t\t\t\"is-data-view\": \"^1.0.2\",\n\t\t\t\t\"is-negative-zero\": \"^2.0.3\",\n\t\t\t\t\"is-regex\": \"^1.2.1\",\n\t\t\t\t\"is-set\": \"^2.0.3\",\n\t\t\t\t\"is-shared-array-buffer\": \"^1.0.4\",\n\t\t\t\t\"is-string\": \"^1.1.1\",\n\t\t\t\t\"is-typed-array\": \"^1.1.15\",\n\t\t\t\t\"is-weakref\": \"^1.1.1\",\n\t\t\t\t\"math-intrinsics\": \"^1.1.0\",\n\t\t\t\t\"object-inspect\": \"^1.13.4\",\n\t\t\t\t\"object-keys\": \"^1.1.1\",\n\t\t\t\t\"object.assign\": \"^4.1.7\",\n\t\t\t\t\"own-keys\": \"^1.0.1\",\n\t\t\t\t\"regexp.prototype.flags\": \"^1.5.4\",\n\t\t\t\t\"safe-array-concat\": \"^1.1.3\",\n\t\t\t\t\"safe-push-apply\": \"^1.0.0\",\n\t\t\t\t\"safe-regex-test\": \"^1.1.0\",\n\t\t\t\t\"set-proto\": \"^1.0.0\",\n\t\t\t\t\"stop-iteration-iterator\": \"^1.1.0\",\n\t\t\t\t\"string.prototype.trim\": \"^1.2.10\",\n\t\t\t\t\"string.prototype.trimend\": \"^1.0.9\",\n\t\t\t\t\"string.prototype.trimstart\": \"^1.0.8\",\n\t\t\t\t\"typed-array-buffer\": \"^1.0.3\",\n\t\t\t\t\"typed-array-byte-length\": \"^1.0.3\",\n\t\t\t\t\"typed-array-byte-offset\": \"^1.0.4\",\n\t\t\t\t\"typed-array-length\": \"^1.0.7\",\n\t\t\t\t\"unbox-primitive\": \"^1.1.0\",\n\t\t\t\t\"which-typed-array\": \"^1.1.19\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-define-property\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-errors\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-object-atoms\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-set-tostringtag\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\",\n\t\t\t\t\"hasown\": \"^2.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/es-to-primitive\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-callable\": \"^1.2.7\",\n\t\t\t\t\"is-date-object\": \"^1.0.5\",\n\t\t\t\t\"is-symbol\": \"^1.0.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/escape-string-regexp\": {\n\t\t\t\"version\": \"1.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/external-editor\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"chardet\": \"^0.7.0\",\n\t\t\t\t\"iconv-lite\": \"^0.4.24\",\n\t\t\t\t\"tmp\": \"^0.0.33\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/figures\": {\n\t\t\t\"version\": \"3.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/figures/-/figures-3.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"escape-string-regexp\": \"^1.0.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/find-up\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"locate-path\": \"^5.0.0\",\n\t\t\t\t\"path-exists\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/for-each\": {\n\t\t\t\"version\": \"0.3.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz\",\n\t\t\t\"integrity\": \"sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-callable\": \"^1.2.7\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/foreach\": {\n\t\t\t\"version\": \"2.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/forever-agent\": {\n\t\t\t\"version\": \"0.5.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz\",\n\t\t\t\"integrity\": \"sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/form-data\": {\n\t\t\t\"version\": \"0.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/form-data/-/form-data-0.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-yzpBIhe8Ll+dYTXjd+4ORxbQktke+abD0dJjedvqsVVayMkb+PgLGatJNLwo95Va75l3YDZ01SrouzyW9bC2Fg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"async\": \"~0.2.7\",\n\t\t\t\t\"combined-stream\": \"~0.0.4\",\n\t\t\t\t\"mime\": \"~1.2.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/form-data/node_modules/async\": {\n\t\t\t\"version\": \"0.2.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/async/-/async-0.2.10.tgz\",\n\t\t\t\"integrity\": \"sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/fsevents\": {\n\t\t\t\"version\": \"2.3.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz\",\n\t\t\t\"integrity\": \"sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"hasInstallScript\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"optional\": true,\n\t\t\t\"os\": [\n\t\t\t\t\"darwin\"\n\t\t\t],\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"^8.16.0 || ^10.6.0 || >=11.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/function-bind\": {\n\t\t\t\"version\": \"1.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/function.prototype.name\": {\n\t\t\t\"version\": \"1.1.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz\",\n\t\t\t\"integrity\": \"sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"functions-have-names\": \"^1.2.3\",\n\t\t\t\t\"hasown\": \"^2.0.2\",\n\t\t\t\t\"is-callable\": \"^1.2.7\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/functions-have-names\": {\n\t\t\t\"version\": \"1.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/generator-function\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-caller-file\": {\n\t\t\t\"version\": \"2.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"6.* || 8.* || >= 10.*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-intrinsic\": {\n\t\t\t\"version\": \"1.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind-apply-helpers\": \"^1.0.2\",\n\t\t\t\t\"es-define-property\": \"^1.0.1\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"es-object-atoms\": \"^1.1.1\",\n\t\t\t\t\"function-bind\": \"^1.1.2\",\n\t\t\t\t\"get-proto\": \"^1.0.1\",\n\t\t\t\t\"gopd\": \"^1.2.0\",\n\t\t\t\t\"has-symbols\": \"^1.1.0\",\n\t\t\t\t\"hasown\": \"^2.0.2\",\n\t\t\t\t\"math-intrinsics\": \"^1.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-proto\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"dunder-proto\": \"^1.0.1\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/get-symbol-description\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/ghauth\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ghauth/-/ghauth-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Ds/q5leXoYu8e+MUJyI1C2mqcvdQ4iTzoOM2WN/p9sh/Z0r609dPUq7mLNa0CoGeKdmesyUmVJOAJeWxQ3tcag==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"application-config\": \"~0.1.1\",\n\t\t\t\t\"bl\": \"~0.9.4\",\n\t\t\t\t\"hyperquest\": \"~1.2.0\",\n\t\t\t\t\"mkdirp\": \"~0.5.0\",\n\t\t\t\t\"read\": \"~1.0.5\",\n\t\t\t\t\"xtend\": \"~4.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/github\": {\n\t\t\t\"version\": \"0.1.16\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/github/-/github-0.1.16.tgz\",\n\t\t\t\"integrity\": \"sha512-IVtcAhrb2HsThCNs1MTPuntLk6C1km0Q4A+md/FD/00SgyyJc4+2XsG1UsF2SUM7enumAgP5VKGVqzyyUmuNCw==\",\n\t\t\t\"deprecated\": \"'github' has been renamed to '@octokit/rest' (https://git.io/vNB11)\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/github-changes\": {\n\t\t\t\"version\": \"1.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/github-changes/-/github-changes-1.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-S4lzHQHyPSyHm22JjE+Vsyr8/d797NPmYYpBqwfkPj9qHIbSwENoqKngyfGbaVbmPFTeE6QMgDbcX12TWy+fpg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"bluebird\": \"1.0.3\",\n\t\t\t\t\"ghauth\": \"3.0.0\",\n\t\t\t\t\"github\": \"0.1.16\",\n\t\t\t\t\"github-commit-stream\": \"0.1.0\",\n\t\t\t\t\"lodash\": \"2.4.1\",\n\t\t\t\t\"moment-timezone\": \"0.5.5\",\n\t\t\t\t\"nomnom\": \"1.6.2\",\n\t\t\t\t\"parse-link-header\": \"0.1.0\",\n\t\t\t\t\"semver\": \"5.4.1\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"github-changes\": \"bin/index.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/github-changes/node_modules/lodash\": {\n\t\t\t\"version\": \"2.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-qa6QqjA9jJB4AYw+NpD2GI4dzHL6Mv0hL+By6iIul4Ce0C1refrjZJmcGvWdnLUwl4LIPtvzje3UQfGH+nCEsQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": [\n\t\t\t\t\"node\",\n\t\t\t\t\"rhino\"\n\t\t\t],\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/github-changes/node_modules/semver\": {\n\t\t\t\"version\": \"5.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/github-commit-stream\": {\n\t\t\t\"version\": \"0.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/github-commit-stream/-/github-commit-stream-0.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-rWmtBtoK/yViLU7VfxXzLCY9aW/cipSGzUz3TE0wNRcHEPxDjI26gFtkRV+lLhJ69cr+MR+NvFUT+MVPZRXLCw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"async\": \"~0.2.9\",\n\t\t\t\t\"parse-link-header\": \"~0.1.0\",\n\t\t\t\t\"request\": \"~2.22.0\",\n\t\t\t\t\"through\": \"~2.3.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/github-commit-stream/node_modules/async\": {\n\t\t\t\"version\": \"0.2.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/async/-/async-0.2.10.tgz\",\n\t\t\t\"integrity\": \"sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/globalthis\": {\n\t\t\t\"version\": \"1.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"gopd\": \"^1.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/gopd\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/graceful-fs\": {\n\t\t\t\"version\": \"4.2.11\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz\",\n\t\t\t\"integrity\": \"sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/has-bigints\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-flag\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-property-descriptors\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-define-property\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-proto\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"dunder-proto\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-symbols\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/has-tostringtag\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"has-symbols\": \"^1.0.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hasown\": {\n\t\t\t\"version\": \"2.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"function-bind\": \"^1.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hawk\": {\n\t\t\t\"version\": \"0.13.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hawk/-/hawk-0.13.1.tgz\",\n\t\t\t\"integrity\": \"sha512-f/1H9bruKJfgLN2KFd+666ILQvJYsJcxaCoIdHaaD2zgl7RUa08/202pGJXhOmQ1kTEdMTSxPnbCsu4l6JARhQ==\",\n\t\t\t\"deprecated\": \"This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"boom\": \"0.4.x\",\n\t\t\t\t\"cryptiles\": \"0.2.x\",\n\t\t\t\t\"hoek\": \"0.8.x\",\n\t\t\t\t\"sntp\": \"0.2.x\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hoek\": {\n\t\t\t\"version\": \"0.8.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hoek/-/hoek-0.8.5.tgz\",\n\t\t\t\"integrity\": \"sha512-NoKdeYUBOlQ7j9dgvT9BEX90rE6HtDkaMFwR6hfOj26LA2Mwyg5026jOpNBhmNrWIGdPnbBK3sQJI3POwh8wqg==\",\n\t\t\t\"deprecated\": \"This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hosted-git-info\": {\n\t\t\t\"version\": \"2.8.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz\",\n\t\t\t\"integrity\": \"sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/http-signature\": {\n\t\t\t\"version\": \"0.10.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz\",\n\t\t\t\"integrity\": \"sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"asn1\": \"0.1.11\",\n\t\t\t\t\"assert-plus\": \"^0.1.5\",\n\t\t\t\t\"ctype\": \"0.5.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/husky\": {\n\t\t\t\"version\": \"9.1.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/husky/-/husky-9.1.7.tgz\",\n\t\t\t\"integrity\": \"sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"bin\": {\n\t\t\t\t\"husky\": \"bin.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/typicode\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/hyperquest\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hyperquest/-/hyperquest-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-N6QwIYr/ENmsE3+0aNA/x8M+jHF0wedvc9ZiGAhg7KK6TxwtJTSR95b0invqaLFPqUrsngYUrc4LVmLtrl7kvw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"duplexer2\": \"~0.0.2\",\n\t\t\t\t\"through2\": \"~0.6.3\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/iconv-lite\": {\n\t\t\t\"version\": \"0.4.24\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz\",\n\t\t\t\"integrity\": \"sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"safer-buffer\": \">= 2.1.2 < 3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/indexof\": {\n\t\t\t\"version\": \"0.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/inherits\": {\n\t\t\t\"version\": \"2.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/inquirer\": {\n\t\t\t\"version\": \"7.3.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz\",\n\t\t\t\"integrity\": \"sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-escapes\": \"^4.2.1\",\n\t\t\t\t\"chalk\": \"^4.1.0\",\n\t\t\t\t\"cli-cursor\": \"^3.1.0\",\n\t\t\t\t\"cli-width\": \"^3.0.0\",\n\t\t\t\t\"external-editor\": \"^3.0.3\",\n\t\t\t\t\"figures\": \"^3.0.0\",\n\t\t\t\t\"lodash\": \"^4.17.19\",\n\t\t\t\t\"mute-stream\": \"0.0.8\",\n\t\t\t\t\"run-async\": \"^2.4.0\",\n\t\t\t\t\"rxjs\": \"^6.6.0\",\n\t\t\t\t\"string-width\": \"^4.1.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.0\",\n\t\t\t\t\"through\": \"^2.3.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/internal-slot\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"hasown\": \"^2.0.2\",\n\t\t\t\t\"side-channel\": \"^1.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is\": {\n\t\t\t\"version\": \"0.2.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is/-/is-0.2.7.tgz\",\n\t\t\t\"integrity\": \"sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-array-buffer\": {\n\t\t\t\"version\": \"3.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-arrayish\": {\n\t\t\t\"version\": \"0.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/is-async-function\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"async-function\": \"^1.0.0\",\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"get-proto\": \"^1.0.1\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\",\n\t\t\t\t\"safe-regex-test\": \"^1.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-bigint\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"has-bigints\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-boolean-object\": {\n\t\t\t\"version\": \"1.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-callable\": {\n\t\t\t\"version\": \"1.2.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz\",\n\t\t\t\"integrity\": \"sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-core-module\": {\n\t\t\t\"version\": \"2.16.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz\",\n\t\t\t\"integrity\": \"sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"hasown\": \"^2.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-data-view\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\",\n\t\t\t\t\"is-typed-array\": \"^1.1.13\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-date-object\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-finalizationregistry\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-fullwidth-code-point\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-generator-function\": {\n\t\t\t\"version\": \"1.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.4\",\n\t\t\t\t\"generator-function\": \"^2.0.0\",\n\t\t\t\t\"get-proto\": \"^1.0.1\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\",\n\t\t\t\t\"safe-regex-test\": \"^1.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-map\": {\n\t\t\t\"version\": \"2.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-negative-zero\": {\n\t\t\t\"version\": \"2.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-number-object\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-object\": {\n\t\t\t\"version\": \"0.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/is-regex\": {\n\t\t\t\"version\": \"1.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"gopd\": \"^1.2.0\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\",\n\t\t\t\t\"hasown\": \"^2.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-set\": {\n\t\t\t\"version\": \"2.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-shared-array-buffer\": {\n\t\t\t\"version\": \"1.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-string\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-symbol\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"has-symbols\": \"^1.1.0\",\n\t\t\t\t\"safe-regex-test\": \"^1.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-typed-array\": {\n\t\t\t\"version\": \"1.1.15\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz\",\n\t\t\t\"integrity\": \"sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"which-typed-array\": \"^1.1.16\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-weakmap\": {\n\t\t\t\"version\": \"2.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-weakref\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/is-weakset\": {\n\t\t\t\"version\": \"2.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/isarray\": {\n\t\t\t\"version\": \"0.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/isexe\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/json-fixer\": {\n\t\t\t\"version\": \"1.6.15\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-fixer/-/json-fixer-1.6.15.tgz\",\n\t\t\t\"integrity\": \"sha512-TuDuZ5KrgyjoCIppdPXBMqiGfota55+odM+j2cQ5rt/XKyKmqGB3Whz1F8SN8+60yYGy/Nu5lbRZ+rx8kBIvBw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"@babel/runtime\": \"^7.18.9\",\n\t\t\t\t\"chalk\": \"^4.1.2\",\n\t\t\t\t\"pegjs\": \"^0.10.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/json-parse-better-errors\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/json-stringify-safe\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-qzEpz1SDUb9xvA+LDOkNgjekdV7tuC7zDQf14sqMBtujh8kVbQhF11VWm4DeR99yFNjVSjTTfKa40c9ZQOtwXA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"BSD\"\n\t\t},\n\t\t\"node_modules/load-json-file\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"graceful-fs\": \"^4.1.2\",\n\t\t\t\t\"parse-json\": \"^4.0.0\",\n\t\t\t\t\"pify\": \"^3.0.0\",\n\t\t\t\t\"strip-bom\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/load-json-file/node_modules/pify\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pify/-/pify-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/locate-path\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-locate\": \"^4.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/lodash\": {\n\t\t\t\"version\": \"4.17.23\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz\",\n\t\t\t\"integrity\": \"sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/math-intrinsics\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/memorystream\": {\n\t\t\t\"version\": \"0.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mime\": {\n\t\t\t\"version\": \"1.2.11\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mime/-/mime-1.2.11.tgz\",\n\t\t\t\"integrity\": \"sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/mimic-fn\": {\n\t\t\t\"version\": \"2.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/minimatch\": {\n\t\t\t\"version\": \"3.1.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz\",\n\t\t\t\"integrity\": \"sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"brace-expansion\": \"^1.1.7\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/minimist\": {\n\t\t\t\"version\": \"1.2.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz\",\n\t\t\t\"integrity\": \"sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mkdirp\": {\n\t\t\t\"version\": \"0.5.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz\",\n\t\t\t\"integrity\": \"sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"minimist\": \"^1.2.6\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"mkdirp\": \"bin/cmd.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/moment\": {\n\t\t\t\"version\": \"2.30.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/moment/-/moment-2.30.1.tgz\",\n\t\t\t\"integrity\": \"sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/moment-timezone\": {\n\t\t\t\"version\": \"0.5.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.5.tgz\",\n\t\t\t\"integrity\": \"sha512-/aaLDQVE4gnDiDIcX2wWgAfBvfmZAz5UEmVkSOL5FIPlVwsDGqvMzp/0N3MttZKUxeofRdnQhB1t7xI0FHLhZw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"moment\": \">= 2.6.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/mute-stream\": {\n\t\t\t\"version\": \"0.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/nice-try\": {\n\t\t\t\"version\": \"1.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/node-fetch\": {\n\t\t\t\"version\": \"2.7.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz\",\n\t\t\t\"integrity\": \"sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"whatwg-url\": \"^5.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"4.x || >=6.0.0\"\n\t\t\t},\n\t\t\t\"peerDependencies\": {\n\t\t\t\t\"encoding\": \"^0.1.0\"\n\t\t\t},\n\t\t\t\"peerDependenciesMeta\": {\n\t\t\t\t\"encoding\": {\n\t\t\t\t\t\"optional\": true\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\"node_modules/node-uuid\": {\n\t\t\t\"version\": \"1.4.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz\",\n\t\t\t\"integrity\": \"sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==\",\n\t\t\t\"deprecated\": \"Use uuid module instead\",\n\t\t\t\"dev\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"uuid\": \"bin/uuid\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/nomnom\": {\n\t\t\t\"version\": \"1.6.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz\",\n\t\t\t\"integrity\": \"sha512-mscrcqifc/QKP6/afmtoC84/mK6SKcDTDEfKPMSgJKeV5dtshiw5+AF90uwHyAqHkMIYIEcGkSAJnV6+T9PY/g==\",\n\t\t\t\"deprecated\": \"Package no longer supported. Contact support@npmjs.com for more info.\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"colors\": \"0.5.x\",\n\t\t\t\t\"underscore\": \"~1.4.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/normalize-package-data\": {\n\t\t\t\"version\": \"2.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"BSD-2-Clause\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"hosted-git-info\": \"^2.1.4\",\n\t\t\t\t\"resolve\": \"^1.10.0\",\n\t\t\t\t\"semver\": \"2 || 3 || 4 || 5\",\n\t\t\t\t\"validate-npm-package-license\": \"^3.0.1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/normalize-package-data/node_modules/semver\": {\n\t\t\t\"version\": \"5.7.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-5.7.2.tgz\",\n\t\t\t\"integrity\": \"sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/npm-run-all\": {\n\t\t\t\"version\": \"4.1.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz\",\n\t\t\t\"integrity\": \"sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-styles\": \"^3.2.1\",\n\t\t\t\t\"chalk\": \"^2.4.1\",\n\t\t\t\t\"cross-spawn\": \"^6.0.5\",\n\t\t\t\t\"memorystream\": \"^0.3.1\",\n\t\t\t\t\"minimatch\": \"^3.0.4\",\n\t\t\t\t\"pidtree\": \"^0.3.0\",\n\t\t\t\t\"read-pkg\": \"^3.0.0\",\n\t\t\t\t\"shell-quote\": \"^1.6.1\",\n\t\t\t\t\"string.prototype.padend\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"npm-run-all\": \"bin/npm-run-all/index.js\",\n\t\t\t\t\"run-p\": \"bin/run-p/index.js\",\n\t\t\t\t\"run-s\": \"bin/run-s/index.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/npm-run-all/node_modules/ansi-styles\": {\n\t\t\t\"version\": \"3.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"color-convert\": \"^1.9.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/npm-run-all/node_modules/chalk\": {\n\t\t\t\"version\": \"2.4.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz\",\n\t\t\t\"integrity\": \"sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-styles\": \"^3.2.1\",\n\t\t\t\t\"escape-string-regexp\": \"^1.0.5\",\n\t\t\t\t\"supports-color\": \"^5.3.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/npm-run-all/node_modules/color-convert\": {\n\t\t\t\"version\": \"1.9.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz\",\n\t\t\t\"integrity\": \"sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"color-name\": \"1.1.3\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/npm-run-all/node_modules/color-name\": {\n\t\t\t\"version\": \"1.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/npm-run-all/node_modules/has-flag\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/npm-run-all/node_modules/supports-color\": {\n\t\t\t\"version\": \"5.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"has-flag\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/oauth-sign\": {\n\t\t\t\"version\": \"0.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-Tr31Sh5FnK9YKm7xTUPyDMsNOvMqkVDND0zvK/Wgj7/H9q8mpye0qG2nVzrnsvLhcsX5DtqXD0la0ks6rkPCGQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/object-inspect\": {\n\t\t\t\"version\": \"1.13.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz\",\n\t\t\t\"integrity\": \"sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/object-keys\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/object.assign\": {\n\t\t\t\"version\": \"4.1.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz\",\n\t\t\t\"integrity\": \"sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\",\n\t\t\t\t\"has-symbols\": \"^1.1.0\",\n\t\t\t\t\"object-keys\": \"^1.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/onetime\": {\n\t\t\t\"version\": \"5.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"mimic-fn\": \"^2.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/os-tmpdir\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/own-keys\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\",\n\t\t\t\t\"object-keys\": \"^1.1.1\",\n\t\t\t\t\"safe-push-apply\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/p-limit\": {\n\t\t\t\"version\": \"2.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-try\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/p-locate\": {\n\t\t\t\"version\": \"4.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"p-limit\": \"^2.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/p-try\": {\n\t\t\t\"version\": \"2.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/parse-json\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"error-ex\": \"^1.3.1\",\n\t\t\t\t\"json-parse-better-errors\": \"^1.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/parse-link-header\": {\n\t\t\t\"version\": \"0.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/parse-link-header/-/parse-link-header-0.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-VZ0pZwX3LRTfpDARULYD2C0fHuQqg7TPSGmPoKEHfBBmBhH7KMG3LV27GkUtjezoixE/CCJNAVnNw54IxkskWg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"xtend\": \"~2.0.5\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/parse-link-header/node_modules/object-keys\": {\n\t\t\t\"version\": \"0.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==\",\n\t\t\t\"deprecated\": \"Please update to the latest object-keys\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"foreach\": \"~2.0.1\",\n\t\t\t\t\"indexof\": \"~0.0.1\",\n\t\t\t\t\"is\": \"~0.2.6\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/parse-link-header/node_modules/xtend\": {\n\t\t\t\"version\": \"2.0.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz\",\n\t\t\t\"integrity\": \"sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-object\": \"~0.1.2\",\n\t\t\t\t\"object-keys\": \"~0.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-exists\": {\n\t\t\t\"version\": \"4.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-key\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-parse\": {\n\t\t\t\"version\": \"1.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/path-type\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"pify\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/path-type/node_modules/pify\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pify/-/pify-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pegjs\": {\n\t\t\t\"version\": \"0.10.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz\",\n\t\t\t\"integrity\": \"sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"bin\": {\n\t\t\t\t\"pegjs\": \"bin/pegjs\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pidtree\": {\n\t\t\t\"version\": \"0.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"bin\": {\n\t\t\t\t\"pidtree\": \"bin/pidtree.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/pify\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/pify/-/pify-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/playwright\": {\n\t\t\t\"version\": \"1.50.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz\",\n\t\t\t\"integrity\": \"sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"Apache-2.0\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"playwright-core\": \"1.50.1\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"playwright\": \"cli.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18\"\n\t\t\t},\n\t\t\t\"optionalDependencies\": {\n\t\t\t\t\"fsevents\": \"2.3.2\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/playwright-core\": {\n\t\t\t\"version\": \"1.50.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz\",\n\t\t\t\"integrity\": \"sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"Apache-2.0\",\n\t\t\t\"bin\": {\n\t\t\t\t\"playwright-core\": \"cli.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=18\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/possible-typed-array-names\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/prettier\": {\n\t\t\t\"version\": \"2.8.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz\",\n\t\t\t\"integrity\": \"sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"optional\": true,\n\t\t\t\"bin\": {\n\t\t\t\t\"prettier\": \"bin-prettier.js\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10.13.0\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/prettier/prettier?sponsor=1\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/qs\": {\n\t\t\t\"version\": \"0.6.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/qs/-/qs-0.6.6.tgz\",\n\t\t\t\"integrity\": \"sha512-kN+yNdAf29Jgp+AYHUmC7X4QdJPR8czuMWLNLc0aRxkQ7tB3vJQEONKKT9ou/rW7EbqVec11srC9q9BiVbcnHA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read\": {\n\t\t\t\"version\": \"1.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/read/-/read-1.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"mute-stream\": \"~0.0.4\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/read-pkg\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"load-json-file\": \"^4.0.0\",\n\t\t\t\t\"normalize-package-data\": \"^2.3.2\",\n\t\t\t\t\"path-type\": \"^3.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/readable-stream\": {\n\t\t\t\"version\": \"1.0.34\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz\",\n\t\t\t\"integrity\": \"sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"core-util-is\": \"~1.0.0\",\n\t\t\t\t\"inherits\": \"~2.0.1\",\n\t\t\t\t\"isarray\": \"0.0.1\",\n\t\t\t\t\"string_decoder\": \"~0.10.x\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/reflect.getprototypeof\": {\n\t\t\t\"version\": \"1.0.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz\",\n\t\t\t\"integrity\": \"sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-abstract\": \"^1.23.9\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.7\",\n\t\t\t\t\"get-proto\": \"^1.0.1\",\n\t\t\t\t\"which-builtin-type\": \"^1.2.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/regexp.prototype.flags\": {\n\t\t\t\"version\": \"1.5.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz\",\n\t\t\t\"integrity\": \"sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"get-proto\": \"^1.0.1\",\n\t\t\t\t\"gopd\": \"^1.2.0\",\n\t\t\t\t\"set-function-name\": \"^2.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/request\": {\n\t\t\t\"version\": \"2.22.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/request/-/request-2.22.0.tgz\",\n\t\t\t\"integrity\": \"sha512-s05oCBjWuzNi/UbZtvwOnSJ85/lHUdYPriJyFUwdxHKr8VcZHB0wx0eTX8y5hCH3p7OTDi9iQUqMFyDkW6K7EQ==\",\n\t\t\t\"deprecated\": \"request has been deprecated, see https://github.com/request/request/issues/3142\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": [\n\t\t\t\t\"node >= 0.8.0\"\n\t\t\t],\n\t\t\t\"dependencies\": {\n\t\t\t\t\"aws-sign\": \"~0.3.0\",\n\t\t\t\t\"cookie-jar\": \"~0.3.0\",\n\t\t\t\t\"forever-agent\": \"~0.5.0\",\n\t\t\t\t\"form-data\": \"0.0.8\",\n\t\t\t\t\"hawk\": \"~0.13.0\",\n\t\t\t\t\"http-signature\": \"~0.10.0\",\n\t\t\t\t\"json-stringify-safe\": \"~4.0.0\",\n\t\t\t\t\"mime\": \"~1.2.9\",\n\t\t\t\t\"node-uuid\": \"~1.4.0\",\n\t\t\t\t\"oauth-sign\": \"~0.3.0\",\n\t\t\t\t\"qs\": \"~0.6.0\",\n\t\t\t\t\"tunnel-agent\": \"~0.3.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/require-directory\": {\n\t\t\t\"version\": \"2.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/require-main-filename\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/resolve\": {\n\t\t\t\"version\": \"1.22.11\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz\",\n\t\t\t\"integrity\": \"sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-core-module\": \"^2.16.1\",\n\t\t\t\t\"path-parse\": \"^1.0.7\",\n\t\t\t\t\"supports-preserve-symlinks-flag\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"resolve\": \"bin/resolve\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/restore-cursor\": {\n\t\t\t\"version\": \"3.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"onetime\": \"^5.1.0\",\n\t\t\t\t\"signal-exit\": \"^3.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/run-async\": {\n\t\t\t\"version\": \"2.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.12.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/rxjs\": {\n\t\t\t\"version\": \"6.6.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz\",\n\t\t\t\"integrity\": \"sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"Apache-2.0\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"tslib\": \"^1.9.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"npm\": \">=2.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/safe-array-concat\": {\n\t\t\t\"version\": \"1.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.6\",\n\t\t\t\t\"has-symbols\": \"^1.1.0\",\n\t\t\t\t\"isarray\": \"^2.0.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/safe-array-concat/node_modules/isarray\": {\n\t\t\t\"version\": \"2.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/safe-push-apply\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"isarray\": \"^2.0.5\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/safe-push-apply/node_modules/isarray\": {\n\t\t\t\"version\": \"2.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/safe-regex-test\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"is-regex\": \"^1.2.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/safer-buffer\": {\n\t\t\t\"version\": \"2.1.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz\",\n\t\t\t\"integrity\": \"sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/semver\": {\n\t\t\t\"version\": \"6.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/semver/-/semver-6.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"bin\": {\n\t\t\t\t\"semver\": \"bin/semver.js\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/set-blocking\": {\n\t\t\t\"version\": \"2.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/set-function-length\": {\n\t\t\t\"version\": \"1.2.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz\",\n\t\t\t\"integrity\": \"sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"define-data-property\": \"^1.1.4\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"function-bind\": \"^1.1.2\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.4\",\n\t\t\t\t\"gopd\": \"^1.0.1\",\n\t\t\t\t\"has-property-descriptors\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/set-function-name\": {\n\t\t\t\"version\": \"2.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"define-data-property\": \"^1.1.4\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"functions-have-names\": \"^1.2.3\",\n\t\t\t\t\"has-property-descriptors\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/set-proto\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"dunder-proto\": \"^1.0.1\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/shebang-command\": {\n\t\t\t\"version\": \"1.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"shebang-regex\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/shebang-regex\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.10.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/shell-quote\": {\n\t\t\t\"version\": \"1.8.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz\",\n\t\t\t\"integrity\": \"sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/side-channel\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"object-inspect\": \"^1.13.3\",\n\t\t\t\t\"side-channel-list\": \"^1.0.0\",\n\t\t\t\t\"side-channel-map\": \"^1.0.1\",\n\t\t\t\t\"side-channel-weakmap\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/side-channel-list\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"object-inspect\": \"^1.13.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/side-channel-map\": {\n\t\t\t\"version\": \"1.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.5\",\n\t\t\t\t\"object-inspect\": \"^1.13.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/side-channel-weakmap\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"get-intrinsic\": \"^1.2.5\",\n\t\t\t\t\"object-inspect\": \"^1.13.3\",\n\t\t\t\t\"side-channel-map\": \"^1.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/signal-exit\": {\n\t\t\t\"version\": \"3.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/sntp\": {\n\t\t\t\"version\": \"0.2.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz\",\n\t\t\t\"integrity\": \"sha512-bDLrKa/ywz65gCl+LmOiIhteP1bhEsAAzhfMedPoiHP3dyYnAevlaJshdqb9Yu0sRifyP/fRqSt8t+5qGIWlGQ==\",\n\t\t\t\"deprecated\": \"This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.\",\n\t\t\t\"dev\": true,\n\t\t\t\"dependencies\": {\n\t\t\t\t\"hoek\": \"0.9.x\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/sntp/node_modules/hoek\": {\n\t\t\t\"version\": \"0.9.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz\",\n\t\t\t\"integrity\": \"sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==\",\n\t\t\t\"deprecated\": \"This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.8.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spdx-correct\": {\n\t\t\t\"version\": \"3.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"Apache-2.0\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-expression-parse\": \"^3.0.0\",\n\t\t\t\t\"spdx-license-ids\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spdx-exceptions\": {\n\t\t\t\"version\": \"2.5.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz\",\n\t\t\t\"integrity\": \"sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"CC-BY-3.0\"\n\t\t},\n\t\t\"node_modules/spdx-expression-parse\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-exceptions\": \"^2.1.0\",\n\t\t\t\t\"spdx-license-ids\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/spdx-license-ids\": {\n\t\t\t\"version\": \"3.0.23\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz\",\n\t\t\t\"integrity\": \"sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"CC0-1.0\"\n\t\t},\n\t\t\"node_modules/stop-iteration-iterator\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"internal-slot\": \"^1.1.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/string_decoder\": {\n\t\t\t\"version\": \"0.10.31\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz\",\n\t\t\t\"integrity\": \"sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/string-width\": {\n\t\t\t\"version\": \"4.2.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz\",\n\t\t\t\"integrity\": \"sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"emoji-regex\": \"^8.0.0\",\n\t\t\t\t\"is-fullwidth-code-point\": \"^3.0.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/string.prototype.padend\": {\n\t\t\t\"version\": \"3.1.6\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz\",\n\t\t\t\"integrity\": \"sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.7\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-abstract\": \"^1.23.2\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/string.prototype.trim\": {\n\t\t\t\"version\": \"1.2.10\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz\",\n\t\t\t\"integrity\": \"sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"define-data-property\": \"^1.1.4\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-abstract\": \"^1.23.5\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\",\n\t\t\t\t\"has-property-descriptors\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/string.prototype.trimend\": {\n\t\t\t\"version\": \"1.0.9\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz\",\n\t\t\t\"integrity\": \"sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/string.prototype.trimstart\": {\n\t\t\t\"version\": \"1.0.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz\",\n\t\t\t\"integrity\": \"sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.7\",\n\t\t\t\t\"define-properties\": \"^1.2.1\",\n\t\t\t\t\"es-object-atoms\": \"^1.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/strip-ansi\": {\n\t\t\t\"version\": \"6.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-regex\": \"^5.0.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/strip-bom\": {\n\t\t\t\"version\": \"3.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/supports-color\": {\n\t\t\t\"version\": \"7.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"has-flag\": \"^4.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/supports-preserve-symlinks-flag\": {\n\t\t\t\"version\": \"1.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/through\": {\n\t\t\t\"version\": \"2.3.8\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/through/-/through-2.3.8.tgz\",\n\t\t\t\"integrity\": \"sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/through2\": {\n\t\t\t\"version\": \"0.6.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/through2/-/through2-0.6.5.tgz\",\n\t\t\t\"integrity\": \"sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"readable-stream\": \">=1.0.33-1 <1.1.0-0\",\n\t\t\t\t\"xtend\": \">=4.0.0 <4.1.0-0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/tmp\": {\n\t\t\t\"version\": \"0.0.33\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz\",\n\t\t\t\"integrity\": \"sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"os-tmpdir\": \"~1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.6.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/tr46\": {\n\t\t\t\"version\": \"0.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/tslib\": {\n\t\t\t\"version\": \"1.14.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz\",\n\t\t\t\"integrity\": \"sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"0BSD\"\n\t\t},\n\t\t\"node_modules/tunnel-agent\": {\n\t\t\t\"version\": \"0.3.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz\",\n\t\t\t\"integrity\": \"sha512-jlGqHGoKzyyjhwv/c9omAgohntThMcGtw8RV/RDLlkbbc08kni/akVxO62N8HaXMVbVsK1NCnpSK3N2xCt22ww==\",\n\t\t\t\"dev\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \"*\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/type-fest\": {\n\t\t\t\"version\": \"0.21.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz\",\n\t\t\t\"integrity\": \"sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"(MIT OR CC0-1.0)\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=10\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/sindresorhus\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/typed-array-buffer\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"es-errors\": \"^1.3.0\",\n\t\t\t\t\"is-typed-array\": \"^1.1.14\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/typed-array-byte-length\": {\n\t\t\t\"version\": \"1.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"for-each\": \"^0.3.3\",\n\t\t\t\t\"gopd\": \"^1.2.0\",\n\t\t\t\t\"has-proto\": \"^1.2.0\",\n\t\t\t\t\"is-typed-array\": \"^1.1.14\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/typed-array-byte-offset\": {\n\t\t\t\"version\": \"1.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"available-typed-arrays\": \"^1.0.7\",\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"for-each\": \"^0.3.3\",\n\t\t\t\t\"gopd\": \"^1.2.0\",\n\t\t\t\t\"has-proto\": \"^1.2.0\",\n\t\t\t\t\"is-typed-array\": \"^1.1.15\",\n\t\t\t\t\"reflect.getprototypeof\": \"^1.0.9\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/typed-array-length\": {\n\t\t\t\"version\": \"1.0.7\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz\",\n\t\t\t\"integrity\": \"sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bind\": \"^1.0.7\",\n\t\t\t\t\"for-each\": \"^0.3.3\",\n\t\t\t\t\"gopd\": \"^1.0.1\",\n\t\t\t\t\"is-typed-array\": \"^1.1.13\",\n\t\t\t\t\"possible-typed-array-names\": \"^1.0.0\",\n\t\t\t\t\"reflect.getprototypeof\": \"^1.0.6\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/unbox-primitive\": {\n\t\t\t\"version\": \"1.1.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz\",\n\t\t\t\"integrity\": \"sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.3\",\n\t\t\t\t\"has-bigints\": \"^1.0.2\",\n\t\t\t\t\"has-symbols\": \"^1.1.0\",\n\t\t\t\t\"which-boxed-primitive\": \"^1.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/underscore\": {\n\t\t\t\"version\": \"1.4.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz\",\n\t\t\t\"integrity\": \"sha512-ZqGrAgaqqZM7LGRzNjLnw5elevWb5M8LEoDMadxIW3OWbcv72wMMgKdwOKpd5Fqxe8choLD8HN3iSj3TUh/giQ==\",\n\t\t\t\"dev\": true\n\t\t},\n\t\t\"node_modules/validate-npm-package-license\": {\n\t\t\t\"version\": \"3.0.4\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz\",\n\t\t\t\"integrity\": \"sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"Apache-2.0\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"spdx-correct\": \"^3.0.0\",\n\t\t\t\t\"spdx-expression-parse\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/webidl-conversions\": {\n\t\t\t\"version\": \"3.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"BSD-2-Clause\"\n\t\t},\n\t\t\"node_modules/whatwg-url\": {\n\t\t\t\"version\": \"5.0.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz\",\n\t\t\t\"integrity\": \"sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"tr46\": \"~0.0.3\",\n\t\t\t\t\"webidl-conversions\": \"^3.0.0\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/which\": {\n\t\t\t\"version\": \"1.3.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which/-/which-1.3.1.tgz\",\n\t\t\t\"integrity\": \"sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"isexe\": \"^2.0.0\"\n\t\t\t},\n\t\t\t\"bin\": {\n\t\t\t\t\"which\": \"bin/which\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/which-boxed-primitive\": {\n\t\t\t\"version\": \"1.1.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz\",\n\t\t\t\"integrity\": \"sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-bigint\": \"^1.1.0\",\n\t\t\t\t\"is-boolean-object\": \"^1.2.1\",\n\t\t\t\t\"is-number-object\": \"^1.1.1\",\n\t\t\t\t\"is-string\": \"^1.1.1\",\n\t\t\t\t\"is-symbol\": \"^1.1.1\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/which-builtin-type\": {\n\t\t\t\"version\": \"1.2.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz\",\n\t\t\t\"integrity\": \"sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"call-bound\": \"^1.0.2\",\n\t\t\t\t\"function.prototype.name\": \"^1.1.6\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\",\n\t\t\t\t\"is-async-function\": \"^2.0.0\",\n\t\t\t\t\"is-date-object\": \"^1.1.0\",\n\t\t\t\t\"is-finalizationregistry\": \"^1.1.0\",\n\t\t\t\t\"is-generator-function\": \"^1.0.10\",\n\t\t\t\t\"is-regex\": \"^1.2.1\",\n\t\t\t\t\"is-weakref\": \"^1.0.2\",\n\t\t\t\t\"isarray\": \"^2.0.5\",\n\t\t\t\t\"which-boxed-primitive\": \"^1.1.0\",\n\t\t\t\t\"which-collection\": \"^1.0.2\",\n\t\t\t\t\"which-typed-array\": \"^1.1.16\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/which-builtin-type/node_modules/isarray\": {\n\t\t\t\"version\": \"2.0.5\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz\",\n\t\t\t\"integrity\": \"sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\"\n\t\t},\n\t\t\"node_modules/which-collection\": {\n\t\t\t\"version\": \"1.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"is-map\": \"^2.0.3\",\n\t\t\t\t\"is-set\": \"^2.0.3\",\n\t\t\t\t\"is-weakmap\": \"^2.0.2\",\n\t\t\t\t\"is-weakset\": \"^2.0.3\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/which-module\": {\n\t\t\t\"version\": \"2.0.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz\",\n\t\t\t\"integrity\": \"sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/which-typed-array\": {\n\t\t\t\"version\": \"1.1.20\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz\",\n\t\t\t\"integrity\": \"sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"available-typed-arrays\": \"^1.0.7\",\n\t\t\t\t\"call-bind\": \"^1.0.8\",\n\t\t\t\t\"call-bound\": \"^1.0.4\",\n\t\t\t\t\"for-each\": \"^0.3.5\",\n\t\t\t\t\"get-proto\": \"^1.0.1\",\n\t\t\t\t\"gopd\": \"^1.2.0\",\n\t\t\t\t\"has-tostringtag\": \"^1.0.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">= 0.4\"\n\t\t\t},\n\t\t\t\"funding\": {\n\t\t\t\t\"url\": \"https://github.com/sponsors/ljharb\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/wrap-ansi\": {\n\t\t\t\"version\": \"6.2.0\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz\",\n\t\t\t\"integrity\": \"sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"ansi-styles\": \"^4.0.0\",\n\t\t\t\t\"string-width\": \"^4.1.0\",\n\t\t\t\t\"strip-ansi\": \"^6.0.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/xtend\": {\n\t\t\t\"version\": \"4.0.2\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz\",\n\t\t\t\"integrity\": \"sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=0.4\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/y18n\": {\n\t\t\t\"version\": \"4.0.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz\",\n\t\t\t\"integrity\": \"sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\"\n\t\t},\n\t\t\"node_modules/yargs\": {\n\t\t\t\"version\": \"15.4.1\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz\",\n\t\t\t\"integrity\": \"sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"MIT\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"cliui\": \"^6.0.0\",\n\t\t\t\t\"decamelize\": \"^1.2.0\",\n\t\t\t\t\"find-up\": \"^4.1.0\",\n\t\t\t\t\"get-caller-file\": \"^2.0.1\",\n\t\t\t\t\"require-directory\": \"^2.1.1\",\n\t\t\t\t\"require-main-filename\": \"^2.0.0\",\n\t\t\t\t\"set-blocking\": \"^2.0.0\",\n\t\t\t\t\"string-width\": \"^4.2.0\",\n\t\t\t\t\"which-module\": \"^2.0.0\",\n\t\t\t\t\"y18n\": \"^4.0.0\",\n\t\t\t\t\"yargs-parser\": \"^18.1.2\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=8\"\n\t\t\t}\n\t\t},\n\t\t\"node_modules/yargs-parser\": {\n\t\t\t\"version\": \"18.1.3\",\n\t\t\t\"resolved\": \"https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz\",\n\t\t\t\"integrity\": \"sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==\",\n\t\t\t\"dev\": true,\n\t\t\t\"license\": \"ISC\",\n\t\t\t\"dependencies\": {\n\t\t\t\t\"camelcase\": \"^5.0.0\",\n\t\t\t\t\"decamelize\": \"^1.2.0\"\n\t\t\t},\n\t\t\t\"engines\": {\n\t\t\t\t\"node\": \">=6\"\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n\t\"name\": \"@less/root\",\n\t\"private\": true,\n\t\"version\": \"4.6.3\",\n\t\"description\": \"Less monorepo\",\n\t\"homepage\": \"http://lesscss.org\",\n\t\"scripts\": {\n\t\t\"publish\": \"node scripts/bump-and-publish.js\",\n\t\t\"publish:dry-run\": \"DRY_RUN=true node scripts/bump-and-publish.js\",\n\t\t\"publish:beta\": \"node scripts/publish-beta.js\",\n\t\t\"prepare\": \"husky\",\n\t\t\"changelog\": \"github-changes -o less -r less.js -a --only-pulls --use-commit-body -m \\\"(YYYY-MM-DD)\\\"\",\n\t\t\"test\": \"cd packages/less && npm test\",\n\t\t\"test:node\": \"cd packages/less && npm run test:node\",\n\t\t\"test:release\": \"node scripts/test-release-automation.js\",\n\t\t\"postinstall\": \"npx only-allow pnpm\"\n\t},\n\t\"author\": \"Alexis Sellier <self@cloudhead.net>\",\n\t\"contributors\": [\n\t\t\"The Core Less Team\"\n\t],\n\t\"license\": \"Apache-2.0\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/less/less.js/issues\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/less/less.js.git\"\n\t},\n\t\"devDependencies\": {\n\t\t\"all-contributors-cli\": \"~6.26.1\",\n\t\t\"github-changes\": \"^1.1.2\",\n\t\t\"husky\": \"~9.1.7\",\n\t\t\"npm-run-all\": \"^4.1.5\",\n\t\t\"playwright\": \"1.50.1\",\n\t\t\"semver\": \"^6.3.1\"\n\t},\n\t\"packageManager\": \"pnpm@8.15.0\"\n}\n"
  },
  {
    "path": "packages/less/.eslintignore",
    "content": "Gruntfile.js\ndist/*\ntmp/*\nlib/*\ntest/browser/less.min.js\nnode_modules"
  },
  {
    "path": "packages/less/.eslintrc.cjs",
    "content": "module.exports = {\n    'parser': '@typescript-eslint/parser',\n    'extends': 'eslint:recommended',\n    'parserOptions': {\n        'ecmaVersion': 2018,\n        'sourceType': 'module'\n    },\n    'plugins': ['@typescript-eslint'],\n    'env': {\n        'browser': true,\n        'node': true,\n        'mocha': true\n    },\n    'globals': {},\n    'rules': {\n        indent: ['error', 4, {\n            SwitchCase: 1\n        }],\n        'no-empty': ['error', { 'allowEmptyCatch': true }],\n        quotes: ['error', 'single', {\n            avoidEscape: true\n        }],\n        /**\n         * The codebase uses some while(true) statements.\n         * Refactor to remove this rule.\n         */\n        'no-constant-condition': 0,\n        /**\n         * Less combines assignments with conditionals sometimes\n         */\n        'no-cond-assign': 0,\n        /**\n         * @todo - remove when some kind of code style (XO?) is added\n         */\n        'no-multiple-empty-lines': 'error'\n    },\n    'overrides': [\n        {\n            files: ['*.ts'],\n            extends: ['plugin:@typescript-eslint/recommended'],\n            rules: {\n                /**\n                 * Suppress until Less has better-defined types\n                 * @see https://github.com/less/less.js/discussions/3786\n                 */\n                '@typescript-eslint/no-explicit-any': 0\n            }\n        },\n        {\n            files: ['test/**/*.{js,ts}', 'benchmark/index.js'],\n            /**\n             * @todo - fix later\n             */\n            rules: {\n                'no-undef': 0,\n                'no-useless-escape': 0,\n                'no-unused-vars': 0,\n                'no-redeclare': 0,\n                '@typescript-eslint/no-unused-vars': 0\n            }\n        },\n    ]\n}\n"
  },
  {
    "path": "packages/less/.gitignore",
    "content": "# project-specific\ntmp\ndist\ntest/browser/less.min.js\ntest/browser/less.min.js.map\ntest/sourcemaps/**/*.map\ntest/sourcemaps/*.map\ntest/sourcemaps/*.css\ntest/less-bom\nlib/**/*.css.map"
  },
  {
    "path": "packages/less/.npmignore",
    "content": ".git\n.gitattributes\n.travis.yml\n.grunt/\nappveyor.yml\nbuild/\nbenchmark/\nsrc/\ntest/\ntest/less-bom/\n# re-include test files as they can be useful for plugins that do testing\n!test/*.js\ntmp/\n"
  },
  {
    "path": "packages/less/Gruntfile.cjs",
    "content": "'use strict';\n\nvar resolve = require('resolve');\nvar path = require('path');\n\nvar testFolder = path.relative(process.cwd(), path.dirname(resolve.sync('@less/test-data')));\nvar lessFolder = testFolder;\n\nmodule.exports = function(grunt) {\n    grunt.option('stack', true);\n\n    // Report the elapsed execution time of tasks.\n    require('time-grunt')(grunt);\n\n    var git = require('git-rev');\n\n    // Sauce Labs browser\n    var browsers = [\n        // Desktop browsers\n        {\n            browserName: 'chrome',\n            version: 'latest',\n            platform: 'Windows 7'\n        },\n        {\n            browserName: 'firefox',\n            version: 'latest',\n            platform: 'Linux'\n        },\n        {\n            browserName: 'safari',\n            version: '9',\n            platform: 'OS X 10.11'\n        },\n        {\n            browserName: 'internet explorer',\n            version: '8',\n            platform: 'Windows XP'\n        },\n        {\n            browserName: 'internet explorer',\n            version: '11',\n            platform: 'Windows 8.1'\n        },\n        {\n            browserName: 'edge',\n            version: '13',\n            platform: 'Windows 10'\n        },\n        // Mobile browsers\n        {\n            browserName: 'ipad',\n            deviceName: 'iPad Air Simulator',\n            deviceOrientation: 'portrait',\n            version: '8.4',\n            platform: 'OS X 10.9'\n        },\n        {\n            browserName: 'iphone',\n            deviceName: 'iPhone 5 Simulator',\n            deviceOrientation: 'portrait',\n            version: '9.3',\n            platform: 'OS X 10.11'\n        },\n        {\n            browserName: 'android',\n            deviceName: 'Google Nexus 7 HD Emulator',\n            deviceOrientation: 'portrait',\n            version: '4.4',\n            platform: 'Linux'\n        }\n    ];\n\n    var sauceJobs = {};\n\n    var browserTests = [\n        'filemanager-plugin',\n        'visitor-plugin',\n        'global-vars',\n        'modify-vars',\n        'production',\n        'rootpath-relative',\n        'rootpath-rewrite-urls',\n        'rootpath',\n        'relative-urls',\n        'rewrite-urls',\n        'browser',\n        'no-js-errors'\n    ];\n\n    function makeJob(testName) {\n        sauceJobs[testName] = {\n            options: {\n                urls:\n                    testName === 'all'\n                        ? browserTests.map(function(name) {\n                            return (\n                                'http://localhost:8081/tmp/browser/test-runner-' +\n                                  name +\n                                  '.html'\n                            );\n                        })\n                        : [\n                            'http://localhost:8081/tmp/browser/test-runner-' +\n                                  testName +\n                                  '.html'\n                        ],\n                testname:\n                    testName === 'all' ? 'Unit Tests for Less.js' : testName,\n                browsers: browsers,\n                public: 'public',\n                recordVideo: false,\n                videoUploadOnPass: false,\n                recordScreenshots: process.env.TRAVIS_BRANCH !== 'master',\n                build:\n                    process.env.TRAVIS_BRANCH === 'master'\n                        ? process.env.TRAVIS_JOB_ID\n                        : undefined,\n                tags: [\n                    process.env.TRAVIS_BUILD_NUMBER,\n                    process.env.TRAVIS_PULL_REQUEST,\n                    process.env.TRAVIS_BRANCH\n                ],\n                statusCheckAttempts: -1,\n                sauceConfig: {\n                    'idle-timeout': 100\n                },\n                throttled: 5,\n                onTestComplete: function(result, callback) {\n                    // Called after a unit test is done, per page, per browser\n                    // 'result' param is the object returned by the test framework's reporter\n                    // 'callback' is a Node.js style callback function. You must invoke it after you\n                    // finish your work.\n                    // Pass a non-null value as the callback's first parameter if you want to throw an\n                    // exception. If your function is synchronous you can also throw exceptions\n                    // directly.\n                    // Passing true or false as the callback's second parameter passes or fails the\n                    // test. Passing undefined does not alter the test result. Please note that this\n                    // only affects the grunt task's result. You have to explicitly update the Sauce\n                    // Labs job's status via its REST API, if you want so.\n\n                    // This should be the encrypted value in Travis\n                    var user = process.env.SAUCE_USERNAME;\n                    var pass = process.env.SAUCE_ACCESS_KEY;\n\n                    git.short(function(hash) {\n                        require('phin')(\n                            {\n                                method: 'PUT',\n                                url: [\n                                    'https://saucelabs.com/rest/v1',\n                                    user,\n                                    'jobs',\n                                    result.job_id\n                                ].join('/'),\n                                auth: { user: user, pass: pass },\n                                data: {\n                                    passed: result.passed,\n                                    build: 'build-' + hash\n                                }\n                            },\n                            function(error, response) {\n                                if (error) {\n                                    console.log(error);\n                                    callback(error);\n                                } else if (response.statusCode !== 200) {\n                                    console.log(response);\n                                    callback(\n                                        new Error('Unexpected response status')\n                                    );\n                                } else {\n                                    callback(null, result.passed);\n                                }\n                            }\n                        );\n                    });\n                }\n            }\n        };\n    }\n\n    // Make the SauceLabs jobs\n    ['all'].concat(browserTests).map(makeJob);\n\n    // Project configuration.\n    grunt.initConfig({\n        shell: {\n            options: {\n                stdout: true,\n                failOnError: true,\n                execOptions: {\n                    maxBuffer: Infinity\n                }\n            },\n            build: {\n                command: 'node build/rollup.js --dist'\n            },\n            testbuild: {\n                command: 'node build/rollup.js --browser --out=./tmp/browser/less.min.js'\n            },\n            testbrowser: {\n                command: 'node build/rollup.js --browser --out=./tmp/browser/less.min.js'\n            },\n            test: {\n                command: 'node test/test-es6.js && node test/test-cjs.cjs && node test/exports/import-patterns.cjs && node test/exports/webpack-browser.cjs && node test/index.js'\n            },\n            testcjs: {\n                command: 'node test/test-cjs-suite.cjs'\n            },\n            generatebrowser: {\n                command: 'node test/browser/generator/generate.js'\n            },\n            runbrowser: {\n                command: 'node test/browser/generator/runner.js'\n            },\n            benchmark: {\n                command: 'node benchmark/index.js'\n            },\n            opts: {\n                // test running with all current options (using `opts` since `options` means something already)\n                command: [\n                    // @TODO: make this more thorough\n                    // CURRENT OPTIONS\n                    `node bin/lessc --ie-compat ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`,\n                    // --math\n                    `node bin/lessc --math=always ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`,\n                    `node bin/lessc --math=parens-division ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`,\n                    `node bin/lessc --math=parens ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`,\n                    `node bin/lessc --math=strict ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`,\n                    `node bin/lessc --math=strict-legacy ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`,\n\n                    // DEPRECATED OPTIONS\n                    // --strict-math\n                    `node bin/lessc --strict-math=on ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`\n                ].join(' && ')\n            },\n            plugin: {\n                command: [\n                    `node bin/lessc --clean-css=\"--s1 --advanced\" ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`,\n                    'cd lib',\n                    `node ../bin/lessc --clean-css=\"--s1 --advanced\" ../${lessFolder}/tests-unit/lazy-eval/lazy-eval.less ../tmp/lazy-eval.css`,\n                    `node ../bin/lessc --source-map=lazy-eval.css.map --autoprefix ../${lessFolder}/tests-unit/lazy-eval/lazy-eval.less ../tmp/lazy-eval.css`,\n                    'cd ..',\n                    // Test multiple plugins\n                    `node bin/lessc --plugin=clean-css=\"--s1 --advanced\" --plugin=autoprefix=\"ie 11,Edge >= 13,Chrome >= 47,Firefox >= 45,iOS >= 9.2,Safari >= 9\" ${lessFolder}/tests-unit/lazy-eval/lazy-eval.less tmp/lazy-eval.css`\n                ].join(' && ')\n            },\n            'sourcemap-test': {\n                // quoted value doesn't seem to get picked up by time-grunt, or isn't output, at least; maybe just \"sourcemap\" is fine?\n                command: [\n                    `node bin/lessc --source-map=test/sourcemaps/maps/import-map.map ${lessFolder}/tests-unit/import/import.less test/sourcemaps/import.css`,\n                    `node bin/lessc --source-map ${lessFolder}/tests-config/sourcemaps/basic.less test/sourcemaps/basic.css`\n                ].join(' && ')\n            }\n        },\n\n        eslint: {\n            target: [\n                'test/**/*.js',\n                'lib/less*/**/*.js',\n                '!test/less/errors/plugin/plugin-error.js'\n            ],\n            options: {\n                configFile: '.eslintrc.cjs',\n                fix: true\n            }\n        },\n\n        connect: {\n            server: {\n                options: {\n                    port: 8081,\n                    base: '../..'\n                }\n            }\n        },\n\n        'saucelabs-mocha': sauceJobs,\n\n        // Clean the version of less built for the tests\n        clean: {\n            test: ['test/browser/less.js', 'tmp', 'test/less-bom'],\n            'sourcemap-test': [\n                'test/sourcemaps/*.css',\n                'test/sourcemaps/*.map'\n            ],\n            sauce_log: ['sc_*.log']\n        }\n    });\n\n    // Load these plugins to provide the necessary tasks\n    grunt.loadNpmTasks('grunt-saucelabs');\n\n    require('jit-grunt')(grunt);\n\n    // by default, run tests\n    grunt.registerTask('default', ['test']);\n\n    // Release\n    grunt.registerTask('dist', [\n        'shell:build'\n    ]);\n\n    // Create the browser version of less.js\n    grunt.registerTask('browsertest-lessjs', [\n        'shell:testbrowser'\n    ]);\n\n    // Run all browser tests\n    grunt.registerTask('browsertest', [\n        'browsertest-lessjs',\n        'connect',\n        'shell:runbrowser'\n    ]);\n\n    // setup a web server to run the browser tests in a browser rather than phantom\n    grunt.registerTask('browsertest-server', [\n        'browsertest-lessjs',\n        'shell:generatebrowser',\n        'connect::keepalive'\n    ]);\n\n    var previous_force_state = grunt.option('force');\n\n    grunt.registerTask('force', function(set) {\n        if (set === 'on') {\n            grunt.option('force', true);\n        } else if (set === 'off') {\n            grunt.option('force', false);\n        } else if (set === 'restore') {\n            grunt.option('force', previous_force_state);\n        }\n    });\n\n    grunt.registerTask('sauce', [\n        'browsertest-lessjs',\n        'shell:generatebrowser',\n        'connect',\n        'sauce-after-setup'\n    ]);\n\n    grunt.registerTask('sauce-after-setup', [\n        'saucelabs-mocha:all',\n        'clean:sauce_log'\n    ]);\n\n    var testTasks = [\n        'clean',\n        'eslint',\n        'shell:build',\n        'shell:testbuild',\n        'shell:test',\n        'shell:opts',\n        'shell:plugin',\n        'connect',\n        'shell:runbrowser'\n    ];\n\n    var nodeTestTasks = [\n        'shell:build',\n        'shell:test',\n        'shell:testcjs',\n        'shell:opts',\n        'shell:plugin'\n    ];\n\n    if (\n        isNaN(Number(process.env.TRAVIS_PULL_REQUEST, 10)) &&\n        (process.env.TRAVIS_BRANCH === 'master')\n    ) {\n        testTasks.push('force:on');\n        testTasks.push('sauce-after-setup');\n        testTasks.push('force:off');\n    }\n\n    // Run all tests\n    grunt.registerTask('test', testTasks);\n\n    // Node tests only (ESM + CJS) — for prepublish, CI\n    grunt.registerTask('test:node', nodeTestTasks);\n\n    // Run shell option tests (includes deprecated options)\n    grunt.registerTask('shell-options', ['shell:opts']);\n\n    // Run shell plugin test\n    grunt.registerTask('shell-plugin', ['shell:plugin']);\n\n    // Quickly run Node tests (no build step needed)\n    grunt.registerTask('quicktest', [\n        'shell:test'\n    ]);\n\n    // generate a good test environment for testing sourcemaps\n    grunt.registerTask('sourcemap-test', [\n        'clean:sourcemap-test',\n        'shell:build:lessc',\n        'shell:sourcemap-test',\n        'connect::keepalive'\n    ]);\n\n    // Run benchmark\n    grunt.registerTask('benchmark', [\n        'shell:benchmark'\n    ]);\n};\n"
  },
  {
    "path": "packages/less/README.md",
    "content": "<p align=\"center\"><img src=\"http://lesscss.org/public/img/less_logo.png\" width=\"264\" height=\"117\" alt=\"Less.js logo\"></p>\n\n<p align=\"center\">\n    <a href=\"https://github.com/less/less.js/actions?query=branch%3Amaster\"><img src=\"https://github.com/less/less.js/actions/workflows/ci.yml/badge.svg?branch=master\" alt=\"Github Actions CI\"/></a>\n    <a href=\"https://www.npmtrends.com/less\"><img src=\"https://img.shields.io/npm/dm/less.svg?sanitize=true\" alt=\"Downloads\"></a>\n    <a href=\"https://www.npmjs.com/package/less\"><img src=\"https://img.shields.io/npm/v/less.svg?sanitize=true\" alt=\"npm version\" /></a>\n</p>\n\n# Less.js\n\n> The dynamic stylesheet language. [lesscss.org](http://lesscss.org)\n\nLess extends CSS with variables, mixins, functions, nesting, and more — then compiles to standard CSS. Write cleaner stylesheets with less code.\n\n```less\n@primary: #4a90d9;\n\n.button {\n  color: @primary;\n  &:hover {\n    color: darken(@primary, 10%);\n  }\n}\n```\n\n## Install\n\n```sh\nnpm install less\n```\n\n## Usage\n\n### Node.js\n\n```js\nimport less from 'less';\n\nconst output = await less.render('.class { width: (1 + 1) }');\nconsole.log(output.css);\n```\n\n### Command Line\n\n```sh\nnpx lessc styles.less styles.css\n```\n\n### Browser\n\n```html\n<link rel=\"stylesheet/less\" type=\"text/css\" href=\"styles.less\" />\n<script src=\"https://cdn.jsdelivr.net/npm/less\"></script>\n```\n\n## Why Less?\n\n- **Variables** — define reusable values once\n- **Mixins** — reuse groups of declarations across rulesets\n- **Nesting** — mirror HTML structure in your stylesheets\n- **Functions** — transform colors, manipulate strings, do math\n- **Imports** — split stylesheets into manageable pieces\n- **Extend** — reduce output size by combining selectors\n\n## Documentation\n\nFull documentation, usage guides, and configuration options at **[lesscss.org](http://lesscss.org)**.\n\n## Contributing\n\nLess.js is open source. [Report bugs](https://github.com/less/less.js/issues), submit pull requests, or help improve the [documentation](https://github.com/less/less-docs).\n\nSee [CONTRIBUTING.md](https://github.com/less/less.js/blob/master/CONTRIBUTING.md) for development setup.\n\n## License\n\nCopyright (c) 2009-2025 [Alexis Sellier](http://cloudhead.io) & The Core Less Team\nLicensed under the [Apache License](https://github.com/less/less.js/blob/master/LICENSE).\n"
  },
  {
    "path": "packages/less/benchmark/benchmark-import-reference-target.less",
    "content": "// Target for @import (reference) benchmarking\n// These should NOT appear in output unless extended\n\n.ref-button {\n  display: inline-block;\n  padding: 8px 16px;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  cursor: pointer;\n  background: #f0f0f0;\n  color: #333;\n  text-decoration: none;\n  font-size: 14px;\n  line-height: 1.5;\n  text-align: center;\n  vertical-align: middle;\n  &:hover {\n    background: #e0e0e0;\n    border-color: #999;\n  }\n  &:active {\n    background: #d0d0d0;\n  }\n  &.primary {\n    background: #3498db;\n    color: #fff;\n    border-color: #2980b9;\n    &:hover {\n      background: #2980b9;\n    }\n  }\n  &.danger {\n    background: #e74c3c;\n    color: #fff;\n    border-color: #c0392b;\n    &:hover {\n      background: #c0392b;\n    }\n  }\n}\n\n.ref-alert {\n  padding: 12px 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  margin-bottom: 16px;\n  &.success {\n    color: #155724;\n    background: #d4edda;\n    border-color: #c3e6cb;\n  }\n  &.warning {\n    color: #856404;\n    background: #fff3cd;\n    border-color: #ffeeba;\n  }\n  &.error {\n    color: #721c24;\n    background: #f8d7da;\n    border-color: #f5c6cb;\n  }\n}\n\n.ref-grid-system {\n  .row {\n    display: flex;\n    flex-wrap: wrap;\n    margin: 0 -15px;\n  }\n  .col {\n    flex: 1;\n    padding: 0 15px;\n  }\n  .generate-cols(@n, @i: 1) when (@i =< @n) {\n    .col-@{i} {\n      flex: 0 0 percentage((@i / @n));\n      max-width: percentage((@i / @n));\n    }\n    .generate-cols(@n, (@i + 1));\n  }\n  .generate-cols(12);\n}\n"
  },
  {
    "path": "packages/less/benchmark/benchmark-import-target.less",
    "content": "// Shared mixins and variables for import benchmarking\n@import-base-color: #3498db;\n@import-accent: #e74c3c;\n@import-spacing: 8px;\n\n.imported-mixin(@size: 14px, @weight: normal) {\n  font-size: @size;\n  font-weight: @weight;\n  line-height: @size * 1.5;\n}\n\n.imported-box(@w: 100px, @h: 100px) {\n  width: @w;\n  height: @h;\n  background: @import-base-color;\n  border: 1px solid darken(@import-base-color, 15%);\n  margin: @import-spacing;\n}\n\n.imported-flex(@dir: row, @justify: flex-start, @align: stretch) {\n  display: flex;\n  flex-direction: @dir;\n  justify-content: @justify;\n  align-items: @align;\n}\n\n.imported-grid(@cols: 12, @gap: @import-spacing) {\n  display: grid;\n  grid-template-columns: repeat(@cols, 1fr);\n  gap: @gap;\n}\n\n.imported-base {\n  color: @import-base-color;\n  padding: @import-spacing;\n  .imported-mixin();\n}\n\n.imported-card {\n  .imported-box(300px, auto);\n  padding: @import-spacing * 2;\n  border-radius: 4px;\n}\n"
  },
  {
    "path": "packages/less/benchmark/benchmark-runner.js",
    "content": "#!/usr/bin/env node\n// Portable benchmark runner - dropped into each version's worktree\n// Finds the Less compiler, compiles the given file N times, reports JSON results.\n//\n// Usage: node benchmark-runner.js <benchmark-file> [runs=30] [warmup=5]\n\nvar fs = require('fs');\nvar path = require('path');\n\nvar file = process.argv[2];\nvar totalRuns = parseInt(process.argv[3]) || 30;\nvar warmupRuns = parseInt(process.argv[4]) || 5;\nvar extraOpts = {};\n\n// Parse --key=value options from remaining args\nfor (var ai = 5; ai < process.argv.length; ai++) {\n  var optMatch = process.argv[ai].match(/^--([a-z-]+)=(.*)$/);\n  if (optMatch) { extraOpts[optMatch[1]] = optMatch[2]; }\n}\n\nif (!file) {\n  console.error('Usage: node benchmark-runner.js <file.less> [runs] [warmup]');\n  process.exit(1);\n}\n\n// Find Less compiler - try multiple paths for different version eras\nvar less;\nvar lessPath = '';\nvar tryPaths = [\n  // v4.x monorepo (after build)\n  './packages/less',\n  // v3.x / v2.x (lib in repo)\n  '.',\n  './lib/less-node',\n  // Fallback\n  'less'\n];\n\nfor (var i = 0; i < tryPaths.length; i++) {\n  try {\n    var p = tryPaths[i];\n    // Use path.resolve for relative paths, but keep bare package names for Node resolution\n    var mod = require(p.startsWith('.') ? path.resolve(p) : p);\n    // Handle both direct export and .default (ESM interop)\n    less = mod && mod.default ? mod.default : mod;\n    if (less && (less.render || less.parse)) {\n      lessPath = p;\n      break;\n    }\n    less = null;\n  } catch (e) {\n    // try next\n  }\n}\n\nif (!less) {\n  console.error(JSON.stringify({ error: 'Could not find Less compiler', tried: tryPaths }));\n  process.exit(2);\n}\n\n// Determine version\nvar version = 'unknown';\nif (less.version) {\n  if (Array.isArray(less.version)) {\n    version = less.version.join('.');\n  } else {\n    version = String(less.version);\n  }\n}\n\nvar filePath = path.resolve(file);\nvar data = fs.readFileSync(filePath, 'utf8');\nvar fileDir = path.dirname(filePath);\n\n// Use less.render() - stable across all versions\nvar renderTimes = [];\nvar parseTimes = [];\nvar completed = 0;\nvar errors = [];\n\nfunction hrNow() {\n  var hr = process.hrtime();\n  return hr[0] * 1000 + hr[1] / 1e6;\n}\n\nfunction runOnce(callback) {\n  var start = hrNow();\n  var opts = {\n    filename: filePath,\n    paths: [fileDir]\n  };\n  // Forward extra options (e.g. --math=always)\n  for (var key in extraOpts) { opts[key] = extraOpts[key]; }\n  less.render(data, opts, function (err, output) {\n    var end = hrNow();\n    if (err) {\n      errors.push({ run: completed, error: err.message || String(err) });\n      callback(err);\n      return;\n    }\n    renderTimes.push(end - start);\n    completed++;\n    callback(null);\n  });\n}\n\nfunction runAll(i) {\n  if (i >= totalRuns) {\n    reportResults();\n    return;\n  }\n  runOnce(function (err) {\n    if (err && errors.length > 3) {\n      // Too many errors, bail\n      reportResults();\n      return;\n    }\n    runAll(i + 1);\n  });\n}\n\nfunction analyze(times, skipWarmup) {\n  var start = skipWarmup ? warmupRuns : 0;\n  if (times.length <= start) return null;\n  var effective = times.slice(start);\n  var total = 0, min = Infinity, max = 0;\n  for (var i = 0; i < effective.length; i++) {\n    total += effective[i];\n    min = Math.min(min, effective[i]);\n    max = Math.max(max, effective[i]);\n  }\n  var avg = total / effective.length;\n\n  // Median\n  var sorted = effective.slice().sort(function (a, b) { return a - b; });\n  var mid = Math.floor(sorted.length / 2);\n  var median = sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;\n\n  // Standard deviation and coefficient of variation\n  var sumSqDiff = 0;\n  for (var i = 0; i < effective.length; i++) {\n    sumSqDiff += (effective[i] - avg) * (effective[i] - avg);\n  }\n  var stddev = Math.sqrt(sumSqDiff / effective.length);\n  var variancePct = avg === 0 ? 0 : (stddev / avg) * 100;\n\n  return {\n    min: Math.round(min * 100) / 100,\n    max: Math.round(max * 100) / 100,\n    avg: Math.round(avg * 100) / 100,\n    median: Math.round(median * 100) / 100,\n    stddev: Math.round(stddev * 100) / 100,\n    variance_pct: Math.round(variancePct * 100) / 100,\n    samples: effective.length,\n    throughput_kbs: Math.round(1000 / avg * data.length / 1024)\n  };\n}\n\nfunction reportResults() {\n  var result = {\n    version: version,\n    lessPath: lessPath,\n    file: path.basename(file),\n    fileSize: data.length,\n    fileSizeKB: Math.round(data.length / 1024 * 10) / 10,\n    totalRuns: totalRuns,\n    warmupRuns: warmupRuns,\n    completedRuns: completed,\n    errors: errors.length > 0 ? errors : undefined,\n    render: analyze(renderTimes, true)\n  };\n  console.log(JSON.stringify(result));\n}\n\nrunAll(0);\n"
  },
  {
    "path": "packages/less/benchmark/benchmark-v3.less",
    "content": "// Benchmark for Less v3.0+ features: if(), boolean(), $prop accessor, @plugin\n// This file is standalone and does NOT import the base benchmark.\n\n// --- if() function ---\n@mode: dark;\n@size: large;\n\n.if-card {\n  background: if((@mode = dark), #1a1a2e, #ffffff);\n  color: if((@mode = dark), #eaeaea, #333333);\n  font-size: if((@size = large), 18px, 14px);\n  padding: if((@size = large), 24px, 12px);\n  border: 1px solid if((@mode = dark), #444, #ddd);\n}\n\n// if() in loops\n.gen-if-variants(@n, @i: 1) when (@i =< @n) {\n  .variant-@{i} {\n    color: if((@i > 5), #ff0000, #0000ff);\n    font-weight: if((mod(@i, 2) = 0), bold, normal);\n    opacity: if((@i > 8), 0.5, 1);\n    display: if((@i = @n), none, block);\n  }\n  .gen-if-variants(@n, (@i + 1));\n}\n.gen-if-variants(12);\n\n// --- boolean() function (added v3.6.0) ---\n@is-dark: boolean(@mode = dark);\n@is-large: boolean(@size = large);\n@is-rtl: boolean(1 = 0);\n\n.boolean-test {\n  .responsive(@flag) when (@flag) {\n    max-width: 1200px;\n    margin: 0 auto;\n  }\n  .responsive(@flag) when not (@flag) {\n    width: 100%;\n  }\n  .responsive(@is-large);\n}\n\n// --- Property accessor $prop ---\n.color-definitions {\n  primary: #3498db;\n  secondary: #2ecc71;\n  accent: #e74c3c;\n  neutral: #95a5a6;\n  warning: #f39c12;\n}\n\n.prop-button {\n  color: .color-definitions[primary];\n  border-color: .color-definitions[secondary];\n}\n\n.prop-alert-success {\n  background: .color-definitions[secondary];\n  border-color: darken(.color-definitions[secondary], 10%);\n}\n\n.prop-alert-danger {\n  background: .color-definitions[accent];\n  border-color: darken(.color-definitions[accent], 10%);\n}\n\n.prop-alert-warning {\n  background: .color-definitions[warning];\n  border-color: darken(.color-definitions[warning], 10%);\n}\n\n// Spacing scale via property accessor\n.spacing-scale {\n  xs: 4px;\n  sm: 8px;\n  md: 16px;\n  lg: 24px;\n  xl: 32px;\n  xxl: 48px;\n}\n\n.card-compact {\n  padding: .spacing-scale[sm];\n  margin: .spacing-scale[xs];\n}\n.card-normal {\n  padding: .spacing-scale[md];\n  margin: .spacing-scale[sm];\n}\n.card-spacious {\n  padding: .spacing-scale[xl];\n  margin: .spacing-scale[lg];\n}\n\n// --- Complex guard + if combos ---\n.button-variant(@bg, @border: darken(@bg, 10%), @color: #fff) {\n  background: @bg;\n  border-color: @border;\n  color: if((lightness(@bg) > 60%), #333, @color);\n  &:hover {\n    background: darken(@bg, 8%);\n    border-color: darken(@border, 12%);\n  }\n  &:active {\n    background: darken(@bg, 12%);\n  }\n}\n\n.btn-primary { .button-variant(#3498db); }\n.btn-success { .button-variant(#2ecc71); }\n.btn-warning { .button-variant(#f1c40f); }\n.btn-danger { .button-variant(#e74c3c); }\n.btn-light { .button-variant(#f8f9fa); }\n.btn-dark { .button-variant(#343a40); }\n\n// --- Stress: many property lookups in a loop ---\n.z-index-scale {\n  dropdown: 1000;\n  sticky: 1020;\n  fixed: 1030;\n  modal-backdrop: 1040;\n  modal: 1050;\n  popover: 1060;\n  tooltip: 1070;\n}\n\n.dropdown { z-index: .z-index-scale[dropdown]; }\n.sticky-top { z-index: .z-index-scale[sticky]; }\n.fixed-top { z-index: .z-index-scale[fixed]; }\n.modal-backdrop { z-index: .z-index-scale[modal-backdrop]; }\n.modal { z-index: .z-index-scale[modal]; }\n.popover { z-index: .z-index-scale[popover]; }\n.tooltip { z-index: .z-index-scale[tooltip]; }\n"
  },
  {
    "path": "packages/less/benchmark/benchmark-v37.less",
    "content": "// Benchmark for Less v3.7+ features: each()\n// Standalone file.\n\n// --- each() with lists ---\n@breakpoints: xs, sm, md, lg, xl;\n\neach(@breakpoints, {\n  .container-@{value} {\n    max-width: if((@value = xs), 100%, if((@value = sm), 540px, if((@value = md), 720px, if((@value = lg), 960px, 1140px))));\n    margin: 0 auto;\n    padding: 0 15px;\n  }\n});\n\n// --- each() with maps ---\n@colors: {\n  primary: #3498db;\n  secondary: #2ecc71;\n  success: #27ae60;\n  danger: #e74c3c;\n  warning: #f39c12;\n  info: #17a2b8;\n  light: #f8f9fa;\n  dark: #343a40;\n};\n\neach(@colors, {\n  .text-@{key} { color: @value; }\n  .bg-@{key} { background-color: @value; }\n  .border-@{key} { border-color: @value; }\n  .btn-@{key} {\n    background: @value;\n    border: 1px solid darken(@value, 10%);\n    color: if((lightness(@value) > 60%), #333, #fff);\n    &:hover {\n      background: darken(@value, 8%);\n    }\n  }\n});\n\n// --- each() generating utility classes ---\n@spacings: {\n  0: 0;\n  1: 4px;\n  2: 8px;\n  3: 16px;\n  4: 24px;\n  5: 32px;\n};\n\n@directions: top, right, bottom, left;\n\neach(@spacings, .(@size, @key) {\n  each(@directions, .(@dir) {\n    .m@{dir}-@{key} {\n      margin-@{dir}: @size;\n    }\n    .p@{dir}-@{key} {\n      padding-@{dir}: @size;\n    }\n  });\n});\n\n// --- each() with display properties ---\n@displays: block, inline, inline-block, flex, inline-flex, grid, none;\n\neach(@displays, {\n  .d-@{value} { display: @value; }\n});\n\n// --- each() generating component sizes ---\n@sm-font: 12px; @sm-pad: 4px 8px; @sm-radius: 2px;\n@md-font: 14px; @md-pad: 8px 16px; @md-radius: 4px;\n@lg-font: 18px; @lg-pad: 12px 24px; @lg-radius: 6px;\n@component-size-names: sm, md, lg;\n\neach(@component-size-names, {\n  .input-@{value} {\n    border: 1px solid #ccc;\n    line-height: 1.5;\n  }\n  .badge-@{value} {\n    display: inline-block;\n  }\n});\n\n// --- each() with float utilities ---\n@positions: static, relative, absolute, fixed, sticky;\neach(@positions, {\n  .position-@{value} { position: @value; }\n});\n\n// --- Nested each() stress ---\n@font-weights: 100, 200, 300, 400, 500, 600, 700, 800, 900;\neach(@font-weights, {\n  .fw-@{value} { font-weight: @value; }\n});\n\n@opacities: {\n  0: 0;\n  25: 0.25;\n  50: 0.5;\n  75: 0.75;\n  100: 1;\n};\neach(@opacities, .(@val, @key) {\n  .opacity-@{key} { opacity: @val; }\n});\n"
  },
  {
    "path": "packages/less/benchmark/benchmark-v39.less",
    "content": "// Benchmark for Less v3.9+ features: range()\n// Standalone file.\n\n// --- range() basic ---\n@columns: range(1, 12);\n\neach(@columns, {\n  .col-@{value} {\n    flex: 0 0 percentage((@value / 12));\n    max-width: percentage((@value / 12));\n  }\n});\n\n// --- range() for spacing scale ---\n@spacing-steps: range(0, 20);\n\neach(@spacing-steps, {\n  .gap-@{value} {\n    gap: (@value * 4px);\n  }\n  .space-x-@{value} > * + * {\n    margin-left: (@value * 4px);\n  }\n  .space-y-@{value} > * + * {\n    margin-top: (@value * 4px);\n  }\n});\n\n// --- range() with step for font sizes ---\n@font-sizes: range(10px, 48px, 2);\n\neach(@font-sizes, .(@size, @idx) {\n  .text-size-@{idx} {\n    font-size: @size;\n    line-height: @size * 1.5;\n  }\n});\n\n// --- range() for generating a color palette ---\n@hue-steps: range(0, 350, 30);\n\neach(@hue-steps, .(@hue, @idx) {\n  .hue-@{idx} {\n    color: hsl(@hue, 70%, 50%);\n    background: hsl(@hue, 70%, 95%);\n    border-color: hsl(@hue, 70%, 80%);\n  }\n});\n\n// --- range() for grid system ---\n@grid-cols: range(1, 24);\n\neach(@grid-cols, {\n  .grid-span-@{value} {\n    grid-column: span @value;\n  }\n});\n\n// --- range() for z-index layers ---\n@layers: range(1, 10);\n\neach(@layers, {\n  .z-@{value} {\n    z-index: @value * 100;\n  }\n});\n\n// --- range() for opacity scale ---\n@opacity-steps: range(0, 100, 5);\n\neach(@opacity-steps, .(@val) {\n  .o-@{val} {\n    opacity: @val / 100;\n  }\n});\n\n// --- range() for border-radius scale ---\n@radius-steps: range(0, 24, 2);\n\neach(@radius-steps, .(@val) {\n  .rounded-@{val} {\n    border-radius: (@val * 1px);\n  }\n});\n"
  },
  {
    "path": "packages/less/benchmark/benchmark.less",
    "content": "@bg: #f01;\n@white: #fff;\n@grey: #eee;\n@black: #000;\n@blue: #000;\n@accent_colour: #000;\n@light_grey: #eee;\n@dark_grey: #eee;\n@yellow: #422;\n@red: #ff0000;\n@colour_positive: #ff0000;\n@colour_negative: #ff0000;\n\n.box_shadow (...) {\n}\n.text_shadow (...) {\n}\n.border_radius (...) {\n}\n.border_radius_top_left (...) {\n}\n.border_radius_top_right (...) {\n}\n.border_radius_bottom_right (...) {\n}\n.border_radius_bottom_left (...) {\n}\n.border_radius_top (...) {\n}\n.border_radius_right (...) {\n}\n.border_radius_bottom (...) {\n}\n.border_radius_left (...) {\n}\ndiv.browse {\n  margin: 0 0 20px;\n  &.class {\n    padding: 0;\n  }\n  div.header {\n    padding: 10px 10px 9px; text-align: left; background: @bg url('/images/panel_header_bg.png') repeat-x top left;\n    border-bottom: 1px solid (@bg * 0.66 + @black * 0.33); line-height: 1; height: 18px;\n    .border_radius_top(3); color: @light_grey;\n    h3 { font-size: 16px; margin: 0; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); }\n    span.filter {\n      float: left; display: block; overflow: hidden; position: relative; z-index: 5;\n      a {\n        margin: 0 1px 0 0; display: block; float: left; padding: 0 8px; height: 18px; font-weight: bold; font-size: 10px; line-height: 18px;\n        text-transform: uppercase; background: url('/images/transparent_backgrounds/black_50.png'); color: @light_grey; text-decoration: none; position: relative; z-index: 3;\n        .active {\n          background: @white; color: @black; z-index: 4;\n          :hover { color: @black; }\n        }\n        :hover { color: @white; }\n        :first-child { .border_radius_left(2); }\n        :last-child { .border_radius_right(2); margin-right: 0; }\n      }\n    }\n\n    span.filter.dropdown {\n      margin: 0; position: relative; overflow: visible;\n      a {\n        .border_radius(2); background: @white; color: @black; margin: 0; position: relative; padding-right: 25px;\n        img { float: left; margin: 4px 5px 0 0; }\n        b.arrow {\n          float: right; display: block; height: 0; width: 0; border: 5px solid transparent; border-top: 5px solid @black; border-bottom: none;\n          position: absolute; top: 6px; right: 10px;\n        }\n        :hover {\n          background: @accent_colour; color: @white;\n          b.arrow { border-top: 5px solid @white; }\n        }\n      }\n      ul {\n        position: absolute; top: 100%; left: 0; margin: 1px 0 0; padding: 0; background: @white; .border_radius(2);\n        .box_shadow(0, 1, 1, @black);\n        li {\n          list-style: none; display: block; padding: 0; margin: 0;\n          a {\n            display: block; height: 18px; line-height: 18px; color: @black; font-size: 10px; text-transform: uppercase; background: transparent;\n            border-bottom: 1px solid (@light_grey * 0.66 + @white * 0.33); float: none; margin: 0; .border_radius(0); white-space: nowrap;\n            :hover { background: url('/images/transparent_backgrounds/accent_colour_25.png'); color: @black; }\n          }\n          :last-child {\n            a { border: none; }\n          }\n        }\n      }\n    }\n    span.filter.dropdown.sort { float: left; margin: 0 0 0 10px; }\n    span.filter.dropdown.localisation { float: left; margin: 0 0 0 10px; }\n    a.more {\n      float: right; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); font-size: 14px; font-weight: bold;\n      position: relative; top: 2px;\n      :hover { text-decoration: none; }\n    }\n  }\n  > ul {\n    margin: 0; background: @white; padding: 10px 0 0 10px; .border_radius(3); position: relative;\n    li {\n      display: block; float: left; list-style: none; margin: 0 10px 10px 0; padding: 5px; position: relative;\n      background: @white; width: 130px; border: 1px solid (@light_grey * 0.33 + @white * 0.66); .border_radius(2);\n      a.remove {\n        position: absolute; height: 16px; width: 16px; padding: 3px; background: @accent_colour;\n        .border_radius(99); display: none; z-index: 3; top: -8px; right: -8px;\n        img { vertical-align: middle; }\n      }\n      div.thumbnail {\n        .border_radius_top(3); position: relative; z-index: 3;\n        .marker {\n          position: absolute; padding: 2px; .border_radius(2); z-index: 3;\n          background: url('/images/transparent_backgrounds/white_75.png'); height: 12px; width: 12px;\n        }\n        .marker.coupon {\n          height: auto; width: auto; top: 10px; right: -3px; padding: 0; background: transparent; overflow: hidden; position: absolute;\n          b {\n            display: block; height: 0; width: 0; float: left; border: 14px solid transparent; border-top: 14px solid @accent_colour;\n            border-bottom: none; border-right: none; float: left;\n          }\n          span {\n            color: @white; font-size: 10px; font-weight: bold; text-transform: uppercase; height: 14px; line-height: 14px; display: block;\n            padding: 0 4px 0 2px; background: @accent_colour; .text_shadow(1, 1, 0px, (@accent_colour * 0.75 + @black * 0.25)); margin: 0 0 0 14px;\n          }\n        }\n        .marker.video {\n          position: absolute; left: 50%; top: 50%; background: @white; width: 10px; height: 10px;\n          b { display: block; width: 0; height: 0; border: 5px solid transparent; border-left: 10px solid @black; border-right: none; }\n        }\n        .marker.endorsed_by_me { background: none; padding: 0; right: 0; bottom: -32px; .border_radius(2); background: @white; }\n        a.thumbnail {\n          display: block; overflow: hidden; position: relative; text-align: center;\n          img { position: relative; display: block; margin: auto; }\n        }\n      }\n      div.text {\n        margin: 3px 0 0; display: block;\n        a { text-decoration: none; }\n        a.title {\n          display: block; text-decoration: none; font-weight: bold; font-size: 12px; line-height: 16px;\n          white-space: nowrap; height: 16px; overflow: hidden;\n          :before {\n            display: block; height: 32px; width: 20px; content: \" \"; float: right; right: -15px; top: -8px;\n            background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white);\n          }\n        }\n        small {\n          font-size: 11px; line-height: 13px; color: @grey; display: block; height: 13px; overflow: hidden; white-space: nowrap;\n          a { font-weight: bold; }\n          :before {\n            display: block; height: 32px; width: 20px; content: \" \"; float: right; right: -15px; top: -8px;\n            background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white);\n          }\n        }\n      }\n      :hover {\n        background: @accent_colour;\n        a.remove { display: block; }\n        div.thumbnail {\n          a.marker.remove, a.marker.video {\n            b { display: inline-block; }\n          }\n          a.marker.video { .box_shadow(0, 0, 2, @black); }\n        }\n        div.text {\n          a { color: @white; }\n          a.title:before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); }\n          small {\n            color: @white * 0.75 + @accent_colour * 0.25;\n            :before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); }\n          }\n        }\n        div.footer a { color: @white; }\n      }\n    }\n    > li.ad div.thumbnail a.thumbnail {\n      width: 130px; height: 97px;\n      img { width: 100%; height: 100%; }\n    }\n    > li.brand div.thumbnail a.thumbnail {\n      width: 120px; height: 87px; padding: 5px; background: @white; .border_radius(2);\n      img { max-width: 120px; max-height: 87px; }\n    }\n    li.paginate {\n      margin-bottom: 0;\n      a {\n        display: block; position: relative; text-decoration: none; height: 131px;\n        div.arrow {\n          background: #81c153 url('/images/button_bg.png') repeat-x left top; border: 1px solid (@accent_colour * 0.75 + @black * 0.25);\n          height: 44px; .border_radius(99); width: 44px; margin: 0 auto; position: relative; top: 32px;\n          b { text-indent: -9000px; display: block; border: 10px solid transparent; width: 0; height: 0; position: relative; top: 12px; }\n        }\n        div.label {\n          position: absolute; bottom: 5px; left: 0; right: 0; line-height: 13px;\n          color: @accent_colour * 0.85 + @black * 0.15; text-decoration: none;\n          font-weight: bold; font-size: 12px; text-align: center;\n        }\n        :hover {\n          div.arrow { background: #abd56e url('/images/button_bg.png') repeat-x left -44px; }\n        }\n      }\n      :hover { background: transparent; }\n    }\n    li.paginate.previous a div b { border-right: 15px solid @white; border-left: none; left: 12px; }\n    li.paginate.next a div b { border-left: 15px solid @white; border-right: none; left: 16px; }\n  }\n  > div.footer {\n    padding: 9px 10px 10px; background: @light_grey * 0.75 + @white * 0.25; overflow: hidden;\n    border-top: 1px solid @light_grey; .border_radius_bottom(3);\n    div.info {\n      float: left; color: @grey;\n      strong { color: @black; font-weight: normal; }\n    }\n    div.pagination {\n      float: right;\n      > * {\n        display: inline-block; line-height: 1; padding: 0 6px; line-height: 18px; height: 18px; background: @white;\n        .border_radius(3); text-decoration: none; font-weight: bold;\n        font-size: 10px; text-transform: uppercase;\n      }\n      a { color: @grey; }\n      a:hover { color: @black; }\n      span.disabled { color: @light_grey; }\n      span.current { color: @white; background: @bg; border: none; }\n      span.current:hover { color: @white; }\n    }\n  }\n}\ndiv.browse.with_categories { margin: 0 0 0 160px; }\ndiv.browse.with_options > ul { .border_radius_top(0); }\ndiv.browse.with_footer > ul { .border_radius_bottom(0); }\n/* Browse List */\ndiv.browse.list {\n  > ul {\n    margin: 0; min-height: 320px;\n    padding: 10px 0 0 10px; overflow: hidden;\n    > li {\n      display: block; list-style: none; margin: 0 10px 10px 0; padding: 5px;\n      .border_radius(3); position: relative; line-height: normal;\n      .marker {\n        position: absolute; padding: 2px; .border_radius(2);\n        background: url('/images/transparent_backgrounds/white_75.png');\n        img { height: 12px; width: 12px; }\n      }\n      img.marker { height: 12px; width: 12px; }\n      span.marker.new {\n        color: black; left: -5px; top: -5px; background: none; background-color: @white * 0.1 + @yellow * 0.6 + @red * 0.3; line-height: 1; padding: 2px 5px;\n        font-weight: bold;\n      }\n      a.marker.media_type {\n        display: inline-block; text-decoration: none; top: 39px; left: 8px;\n        font-size: 10px;\n        b { font-weight: normal; margin: 0 0 0 2px; line-height: 1; display: none; }\n        img { vertical-align: middle; }\n      }\n      a.thumbnail {\n        float: left;\n        width: 68px; display: block; overflow: hidden;\n        border: 1px solid @light_grey;\n        :hover { border-color: @accent_colour; }\n      }\n      span.title_brand {\n        display: block; margin: 0 0 2px 75px;\n        a { margin: 0; display: inline; }\n        a.brand_name { font-weight: normal; font-size: 12px; }\n      }\n      a.ad_title {\n        font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block;\n      }\n      a.brand_name {\n        font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block;\n      }\n      small {\n        display: block; color: @grey; margin: 0 0 0 75px; font-size: 12px;\n      }\n      small.brand_name { display: inline; margin: 0; }\n      ul.chart {\n        margin: 0 0 0 80px;\n        height: 39px;\n      }\n      ul.networks {\n        margin: 3px 0 0 75px; padding: 0; overflow: hidden;\n        li { display: block; float: left; margin: 0 5px 0 0; line-height: 1; }\n      }\n      div.points {\n        display: none;\n        font-size: 12px; text-align: right;\n        label { color: @grey; }\n      }\n      a.remove { bottom: -3px; right: -3px; }\n    }\n    li.ad {\n      a.thumbnail { height: 51px; }\n      span.title_brand {\n        small.brand_name {\n          display: block;\n        }\n      }\n    }\n    li.brand {\n      a.thumbnail { height: 68px; }\n    }\n  }\n}\ndiv.browse.list.with_options ul { .border_radius_top(0); }\ndiv.browse.list.with_footer ul { .border_radius_bottom(0); }\ndiv.browse.list.cols_2 {\n  > ul {\n    > li {\n      width: 285px; float: left;\n      :hover {\n        background: @white;\n      }\n    }\n  }\n}\ndiv.browse.ads.list {\n  > ul {\n    > li {\n      height: 53px;\n      a.thumbnail {\n        height: 51px;\n      }\n    }\n  }\n}\ndiv.browse.brands.list {\n  > ul {\n    > li {\n      height: 68px;\n      a.thumbnail {\n        height: 66px;\n      }\n    }\n  }\n}\n\n/* Categories List */\n#categories {\n  margin: 40px 0 0; width: 160px; float: left; position: relative; z-index: 1;\n  ul {\n    margin: 0; padding: 10px 0 0;\n    li {\n      list-style: none; margin: 0; padding: 0; font-size: 14px;\n      a { color: @grey; display: block; padding: 5px 10px 5px 15px; text-decoration: none; .border_radius_left(3); }\n      a:hover { color: @black; background: @light_grey * 0.15 + @white * 0.85; }\n    }\n    .all a { font-weight: bold; }\n    .current a {\n      background: @white; color: @black; border: 1px solid (@light_grey * 0.25 + @white * 0.75); border-right: none; border-left: 5px solid @bg;\n      padding-left: 10px;\n    }\n  }\n}\n\n/* Ads > Show */\n#ad {\n  div.header {\n    overflow: hidden;\n    h3 { font-size: 16px; margin: 0 0 3px; }\n    small {\n      a.category { font-weight: bold; color: @accent_colour; }\n      span.networks img { position: relative; top: 3px; }\n    }\n    span.brand {\n      float: right; color: @white;\n      a.brand_name { font-weight: bold; color: @accent_colour; }\n    }\n  }\n  div.content {\n    padding: 0; position: relative;\n    a.toggle_size {\n      display: block; .border_radius(3); background-color: @black; padding: 0 5px 0 26px;\n      background-position: 5px center; background-repeat: no-repeat; text-decoration: none; margin: 5px 5px 0 0;\n      position: absolute; top: 0; right: 0; line-height: 25px; z-index: 45;\n    }\n    img.creative { margin: 0 auto; max-width: 540px; display: block; }\n    object { position: relative; z-index: 44; }\n    object.video { line-height: 0; font-size: 0; }\n    object embed { position: relative; z-index: 45; line-height: 0; font-size: 0; }\n  }\n  div.content.not_video {\n    padding: 40px; text-align: center;\n    * { margin-left: auto; margin-right: auto; }\n    object.flash { margin-bottom: 0; }\n  }\n  div.footer {\n    padding: 0;\n    div.vote_views {\n      padding: 5px 10px; overflow: hidden;\n      div.share { float: right; margin: 2px 0 0 0; }\n      #login_register_msg, #encourage_vote_msg { line-height: 22px; font-weight: bold; color: @black; }\n    }\n  }\n}\n#sidebar {\n  #meta {\n    table {\n      margin: 0;\n      tr:last-child td { padding-bottom: 0; }\n      td {\n        padding: 0 0 5px;\n        ul.networks {\n          margin: 0; padding: 0;\n          li {\n            list-style: none; display: inline;\n          }\n          li {\n          }\n        }\n      }\n      td.label { color: @grey; white-space: nowrap; width: 1%; text-align: right; padding-right: 5px; }\n    }\n  }\n}\n\n/* Voting */\ndiv.voted {\n  font-size: 12px; line-height: 22px; color: @black; display: inline-block; font-weight: bold;\n  img { float: left; margin-right: 5px; padding: 3px; .border_radius(3); }\n}\n#voted_up {\n  img { background: @colour_positive * 0.66 + @bg * 0.15; }\n}\n#voted_down {\n  img { background: @colour_negative * 0.66 + @bg * 0.15; }\n}\n#encourage_comment {\n  display: inline-block; line-height: 22px; font-weight: bold;\n}\n#vote {\n  overflow: hidden; font-size: 12px; line-height: 22px; color: @black; float: left;\n  a {\n    color: @white; font-weight: bold; overflow: hidden; display: block;\n    width: 16px; text-decoration: none; text-align: center; font-size: 10px; padding: 3px; text-transform: uppercase;\n  }\n  a.up {\n    float: left; background: @colour_positive * 0.66 + @bg * 0.15; .border_radius_left(3);\n    :hover { background: @colour_positive * 0.85 + @bg * 0.15; }\n  }\n  a.down {\n    float: left; background: @colour_negative * 0.66 + @bg * 0.15; .border_radius_right(3);\n    margin: 0 5px 0 1px;\n    :hover { background: @colour_negative * 0.85 + @bg * 0.15; }\n  }\n}\n#vote.disabled {\n  a.up {\n    background: (@colour_positive * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85;\n    :hover { background: (@colour_positive * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; }\n  }\n  a.down {\n    background: (@colour_negative * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85;\n    :hover { background: (@colour_negative * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; }\n  }\n}\n\n/* Panels */\ndiv.panel {\n  margin: 0 0 20px; position: relative; .box_shadow(0, 0, 3, @light_grey * 0.66 + @white * 0.33); .border_radius(3);\n  > div.header {\n    background: @bg url('/images/panel_header_bg.png') repeat-x top left; border-bottom: 1px solid (@bg * 0.66 + @black * 0.33);\n    padding: 5px 10px 4px; .border_radius_top(3); min-height: 18px;\n    h2 { font-size: 16px; margin: 0; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); }\n    h3 { color: @white; font-size: 14px; margin: 0; line-height: 18px; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); }\n    small { display: block; font-size: 12px; color: @light_grey * 0.25 + @white * 0.75; }\n    span.filter {\n      float: left; display: block; overflow: hidden; position: relative; z-index: 5;\n      a {\n        margin: 0 1px 0 0; display: block; float: left; padding: 0 8px; height: 18px; font-weight: bold; font-size: 10px; line-height: 18px;\n        text-transform: uppercase; background: url('/images/transparent_backgrounds/black_50.png'); color: @light_grey; text-decoration: none; position: relative; z-index: 3;\n      }\n      a:first-child { .border_radius_left(2); }\n      a:last-child { .border_radius_right(2); margin-right: 0; }\n      a.active { background: @white; color: @black; z-index: 4; }\n      a:hover { color: @white; }\n      a.active:hover { color: @black; }\n    }\n\n    span.filter.dropdown {\n      margin: 0; position: relative; overflow: visible;\n      a {\n        .border_radius(2); background: @white; color: @black; margin: 0; position: relative; padding-right: 25px;\n        img { float: left; margin: 4px 5px 0 0; }\n        b.arrow {\n          float: right; display: block; height: 0; width: 0; border: 5px solid transparent; border-top: 5px solid @black; border-bottom: none;\n          position: absolute; top: 6px; right: 10px;\n        }\n        :hover {\n          background: @accent_colour; color: @white;\n          b.arrow { border-top: 5px solid @white; }\n        }\n      }\n\n      ul {\n        position: absolute; top: 100%; left: 0; margin: 1px 0 0; padding: 0; background: @white; .border_radius(2);\n        .box_shadow(0, 1, 1, @black);\n        li {\n          list-style: none; display: block; padding: 0; margin: 0;\n          a {\n            display: block; height: 18px; line-height: 18px; color: @black; font-size: 10px; text-transform: uppercase; background: transparent;\n            border-bottom: 1px solid (@light_grey * 0.66 + @white * 0.33); float: none; margin: 0; .border_radius(0); white-space: nowrap;\n            :hover { background: url('/images/transparent_backgrounds/accent_colour_25.png'); color: @black; }\n          }\n        }\n        li:last-child {\n          a { border: none; }\n        }\n      }\n    }\n    span.filter.dropdown.sort { float: left; margin: 0 0 0 10px; }\n    span.filter.dropdown.localisation { float: left; margin: 0 0 0 10px; }\n\n    a.more {\n      float: right; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); font-size: 14px; font-weight: bold;\n      position: relative; top: 2px;\n      :hover { text-decoration: none; }\n    }\n  }\n  > div.content {\n    background: @white; padding: 10px;\n    .no_padding { padding: 0; }\n  }\n  > div.footer {\n    background: @light_grey * 0.33 + @white * 0.66; border-top: 1px solid (@light_grey * 0.5 + @white * 0.5);\n    padding: 4px 10px 5px; .border_radius_bottom(3);\n  }\n}\ndiv.panel.no_footer div.content { .border_radius_bottom(3); }\ndiv.panel.no_header div.content { .border_radius_top(3); }\ndiv.panel.collapsable {\n  div.header {\n    cursor: pointer;\n    b.toggle { float: right; border: 5px solid transparent; border-bottom: 5px solid @white; border-top: none; display: block; width: 0; height: 0; margin: 6px 0 0 0; }\n  }\n  div.header:hover {\n    background-color: @bg * 0.75 + @white * 0.25;\n  }\n}\ndiv.panel.collapsed {\n  div.header {\n    border-bottom: none; .border_radius(3);\n    b.toggle { border-bottom: none; border-top: 5px solid @white; }\n  }\n  div.blank { border-bottom: none; .border_radius_bottom(3); }\n  div.content, div.footer { display: none; }\n}\n\n\n/* Sidebar Actions */\n#sidebar {\n  #actions {\n    .box_shadow(0, 0, 0, transparent);\n    div.content {\n      background: url('/images/transparent_backgrounds/accent_colour_10.png'); text-align: center;\n      p.endorsement {\n        margin: 0 0 10px; font-size: 14px; font-weight: bold;\n        small { font-weight: normal; line-height: inherit; margin: 10px 0 0; }\n        :last-child { margin: 0; }\n      }\n      div.share { margin: 5px 0 0; }\n      a.button {\n        font-size: 16px; line-height: normal; height: auto; padding: 5px 10px 5px 35px; font-weight: bold; margin: 0; position: relative;\n        img { position: absolute; top: 3px; left: 6px; }\n      }\n      div.flash.notice {\n        margin: 10px 0 0; font-size: 22px;\n        small { font-weight: normal; margin: 0 0 10px; }\n      }\n      div.flash.notice.done { margin: 0; }\n      small {\n        display: block; margin: 10px 0 0; font-size: 11px; color: #808080; line-height: 12px;\n        img.favicon { vertical-align: middle; }\n      }\n      div.blank {\n        border: none; background: none; padding: 10px 0 0; border-top: 1px solid (@accent_colour * 0.5 + @white * 0.5);\n        margin: 10px 0 0;\n      }\n    }\n  }\n}\n\n/* People Lists */\nul.people {\n  margin: 0; padding: 10px 0 0 10px; background: @white;\n  > li {\n    display: block; margin: 0 10px 10px 0; float: left; padding: 2px; width: 57px; position: relative;\n    .border_radius(2); background: @white; list-style: none; border: 1px solid (@light_grey * 0.33 + @white * 0.66);\n    a.avatar {\n      display: block; width: 59px; height: 59px; overflow: hidden;\n      img { width: 100%; height: 100%; }\n    }\n    a.name { display: block; font-size: 10px; text-align: center; }\n    :hover {\n      background: @accent_colour;\n      a.name { color: @white; }\n    }\n  }\n}\nul.people.list {\n  padding: 0;\n  > li {\n    margin: 0 0 10px; padding: 0 0 10px; overflow: hidden; float: none; width: auto; .border_radius(0);\n    border: none; border-bottom: 1px solid (@light_grey * 0.33 + @white * 0.66);\n    span.points {\n      float: right; display: block; padding: 5px; background: @light_grey * 0.15 + @white * 0.85; line-height: 1;\n      text-align: center; width: 50px; height: 30px; .border_radius(3); margin: 0 0 0 10px;\n      strong { display: block; color: @black; font-size: 16px; margin: 2px 0 0; }\n      label { color: @grey; text-transform: uppercase; font-size: 10px; }\n      label.long { display: block; }\n      label.short { display: none; }\n    }\n    a.avatar { float: left; width: 40px; height: 40px; }\n    a.name { font-size: 14px; font-weight: bold; margin: 0 0 0 50px; text-align: left; }\n    a.name.long { display: inline; }\n    a.name.short { display: none; }\n    span.networks {\n      display: block; margin: 0 0 0 50px;\n      img.favicon { vertical-align: middle; }\n    }\n    :hover {\n      background: transparent;\n      a.name { color: @accent_colour * 0.85 + @black * 0.15; }\n    }\n    :last-child { padding-bottom: 0; border-bottom: none; margin-bottom: 0; }\n  }\n}\nul.people.list.small {\n  > li {\n    span.points {\n      padding: 3px 6px; height: 18px; font-size: 9px; line-height: 17px; width: 60px;\n      strong { font-size: 12px; margin: 0; display: inline; }\n      label { font-size: 9px; }\n      label.long { display: none; }\n      label.short { display: inline; }\n    }\n    a.avatar { width: 24px; height: 24px; }\n    a.name { display: inline; line-height: 24px; margin: 0 0 0 5px; font-size: 12px; height: 24px; }\n    a.name.long { display: none; }\n    a.name.short { display: inline; }\n    span.networks { display: inline; margin: 0; }\n    :last-child { padding-bottom: 0; border-bottom: none; margin-bottom: 0; }\n  }\n}\nul.people.tiled {\n  > li {\n    width: 28px; padding: 2px;\n    a.avatar { width: 24px; height: 24px; background: @white; padding: 2px; }\n    a.name, small, span.networks, span.points { display: none; }\n  }\n}\n\n/* Comments */\n#comments {\n  ul {\n    margin: 0 0 20px; padding: 0;\n    li {\n      display: block; list-style: none; padding: 0; margin: 0 0 10px;\n      span.meta {\n        margin: 0; overflow: hidden; display: block;\n        small { font-size: 12px; color: @light_grey; float: right; line-height: 16px; display: inline-block; }\n        a.avatar {\n          display: inline-block; height: 16px; width: 16px; position: relative; top: 3px;\n          img { height: 100%; width: 100%; }\n        }\n        a.name { font-weight: bold; line-height: 16px; display: inline-block; }\n        span.inactive { color: @grey; font-weight: bold; line-height: 16px; display: inline-block; }\n      }\n      b.tail {\n        display: block; width: 0; height: 0; margin: 3px 0 0 10px; border: 5px solid transparent; border-top: none;\n        border-bottom: 5px solid @white; position: relative; z-index: 2;\n      }\n      blockquote {\n        margin: 0; padding: 10px; .border_radius(3); font-style: normal; background: @white;\n        color: @dark_grey; .box_shadow(0, 0, 3, @light_grey * 0.66 + @white * 0.33);\n      }\n    }\n  }\n  form {\n    margin: 0;\n    textarea { width: 500px; }\n  }\n}\n\n/* Sidebar Categories */\n#sidebar {\n  #categories {\n    margin: 0 0 20px;\n    width: auto;\n    p { margin: 0; }\n  }\n}\n\n#sidebar {\n  #ads > ul li, #recommendations > ul li {\n    width: 81px;\n    div.thumbnail {\n      a.thumbnail { height: 60px; width: 81px; }\n    }\n    div.text {\n      a.title { font-size: 11px; height: 14px; line-height: 14px; }\n      small { display: none; }\n    }\n  }\n  #brands > ul li {\n    width: 55px;\n    div.thumbnail {\n      a.thumbnail {\n        height: 45px; width: 45px;\n        img { max-height: 45px; max-width: 45px; }\n      }\n    }\n    div.text { display: none; }\n  }\n}\n\n/* My Account */\n#accounts_controller {\n  #top {\n    #page_title {\n      #page_options {\n        a.button.public_profile {\n          float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 35px 8px 15px; position: relative;\n          b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; right: 15px; border: 6px solid transparent; border-right: none; border-left: 6px solid @white; margin: 0; }\n        }\n        a.button.goto_dashboard {\n          float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 15px 8px 35px; margin-right: 5px; position: relative;\n          b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; left: 15px; border: 6px solid transparent; border-left: none; border-right: 6px solid @white; margin: 0; }\n        }\n      }\n    }\n  }\n  #account_nav {\n    float: left; width: 200px; margin: 0 20px 0 0;\n    ul.nav {\n      margin: 0; padding: 0;\n      li {\n        margin: 0 0 5px; display: block; list-style: none; padding: 0;\n        a {\n          display: block; height: 30px; text-decoration: none; color: @white;\n          b {\n            border: 15px solid transparent; border-right: none; border-left: 10px solid transparent; width: 0;\n            height: 0; float: right; display: none;\n          }\n          span {\n            .border_radius(3); background: @bg; display: block;\n            line-height: 30px; padding: 0 10px; font-size: 14px; font-weight: bold; margin: 0 10px 0 0;\n          }\n        }\n        :hover {\n          a {\n            color: @white;\n            b { border-left-color: @bg; display: block; }\n            span { background: @bg; .border_radius_right(0); }\n          }\n        }\n      }\n      li.current a {\n        b { border-left-color: @accent_colour; display: block; }\n        span { background: @accent_colour; color: @white; .border_radius_right(0); }\n      }\n    }\n  }\n  #main {\n    > div {\n      margin: 0 0 20px;\n      form { margin: 0; }\n    }\n    #profile {\n      a.avatar {\n        float: left; display: block;\n        width: 70px; overflow: hidden; position: relative; text-decoration: none;\n        img { width: 100%; }\n        span {\n          display: block; line-height: 1; padding: 3px; margin: 5px 0 0; color: @white; background: @accent_colour;\n          .border_radius(3); .text_shadow(1, 1, 0, @grey);\n          text-align: center; font-size: 10px; font-weight: bold; text-transform: uppercase;\n        }\n      }\n      form {\n        margin: 0 0 0 90px;\n        h4 { margin: 10px 0 20px; border-bottom: 1px solid (@light_grey * 0.5 + @white * 0.5); padding: 0; color: @bg; font-size: 16px; }\n        ul.choices {\n          li { width: 30%; }\n        }\n        div.extra { margin-top: 20px; }\n      }\n    }\n\n    #networks {\n      ul { margin: 0 -10px -10px 0; padding: 0; overflow: hidden;\n        li:hover\n        {\n          background: @light_grey; display: block; float: left; width: 180px;\n          padding: 10px; margin: 0 10px 10px 0; list-style: none; .border_radius(3);\n          position: relative;\n          * { line-height: normal; }\n          img { vertical-align: middle; float: left; }\n          .name { font-weight: bold; font-size: 14px; display: block; margin: -2px 0 0 42px; }\n          small {\n            font-size: 12px; color: @grey; display: block; margin-left: 42px;\n            strong { color: @black; font-weight: normal; }\n          }\n          :hover {\n          }\n        }\n        li.installed {\n          background: @white;\n          border: 2px solid @accent_colour; padding: 8px;\n        }\n        li.unavailable {\n          .name { color: @black; }\n          :hover {\n            background: @light_grey;\n          }\n        }\n        li:hover {\n          background: @light_grey * 0.5 + @white * 0.5;\n        }\n      }\n    }\n  }\n}\n\n/* Shopping Style Panel */\n#shopping_style {\n  div.header a.button.small { float: right; }\n  div.content {\n    p {\n      margin: 0 0 10px;\n      label { text-transform: uppercase; font-size: 11px; display: block; color: @bg; font-weight: bold; }\n      span { color: @black; }\n      span.toggle { white-space: nowrap; color: @grey; }\n      :last-child { margin: 0; }\n    }\n    p.more { text-align: left; font-weight: normal; }\n    p.less { display: none; margin: 0; }\n  }\n}\n\n/* People Controller */\n#people_controller.index {\n  #main {\n    div.panel {\n      float: left; width: 300px; margin: 0 20px 0 0;\n      :last-child { margin-right: 0; }\n    }\n  }\n}\n#people_controller.show {\n  #person_overview, #shopping_style {\n    a.button.small {\n    }\n  }\n  #content {\n    #shopping_style {\n      float: left; width: 240px; margin: 0 20px 0 0;\n    }\n    #main { width: 360px; }\n  }\n}\n\n/* Search Results */\n#search_results {\n  margin: 0 0 20px;\n  li {\n    :hover {\n      small { color: @white * 0.75 + @accent_colour * 0.25; }\n    }\n  }\n}\n#search {\n  div.content {\n    padding: 20px;\n    form {\n      margin: 0; float: none;\n      span.submit_and_options {\n        display: block;\n      }\n    }\n    p { margin: 0 0 15px; }\n    h4 { font-weight: normal; margin: 0 0 5px; }\n  }\n}\n\n/* Recommendations */\n#recommendations {\n  div.browse {\n    margin: 0; padding: 0; background: none;\n    ul { min-height: 0; .border_radius(0); }\n  }\n}\n\n/* Blank States */\ndiv.blank {\n  padding: 20px; background: @bg * 0.05 + @blue * 0.05 + @white * 0.9; position: relative;\n  border: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); z-index: 1;\n  h4 { font-size: 18px; margin: 0 0 10px; }\n  h4:last-child { margin: 0; }\n  p { font-size: 16px; margin: 0 0 10px; }\n  p:last-child { margin: 0; }\n  p.with_list_number.large {\n    span { margin-left: 48px; display: block; color: @white; }\n  }\n  p.earn span { font-size: 22px; color: @white; line-height: 48px; font-weight: bold; }\n  a { white-space: nowrap; }\n  a.hide {\n    position: absolute; top: -5px; right: -5px; display: block; height: 16px; width: 16px; padding: 3px; background: #E7E9F6; .border_radius(99);\n  }\n}\n\ndiv.blank.small {\n  padding: 10px 20px;\n  h4 { font-weight: normal; font-size: 16px; }\n  p { margin: 0; }\n}\ndiv.blank.tiny {\n  padding: 10px 20px;\n  h4 { font-weight: normal; font-size: 14px; }\n  p { margin: 0; font-size: 12px; }\n}\ndiv.blank.rounded {\n  .border_radius(3); margin: 0 0 20px;\n}\ndiv.blank.rounded.bottom { .border_radius_top(0); }\ndiv.blank.with_border_bottom { border-bottom: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); }\ndiv.blank.no_border_top { border-top: none; }\ndiv.blank.no_border_bottom { border-bottom: none; }\ndiv.blank.no_side_borders { border-right: none; border-left: none; }\ndiv.panel {\n  div.blank {\n    padding: 10px 20px; overflow: hidden; margin: 0;\n    h4 { font-weight: normal; font-size: 14px; }\n    p, ul { margin: 0 0 10px; font-size: 12px; }\n    p:last-child, ul:last-child { margin: 0; }\n  }\n}\n\n/* Sidebar Browse */\n#sidebar {\n  div.panel {\n    div.content.browse {\n      padding: 0; margin: 0;\n      > ul {\n        min-height: 0; .border_radius(0);\n        > li {\n          div.thumbnail {\n            a.thumbnail { padding: 5px; }\n            img.marker.media_type { top: 48px; left: 8px; }\n          }\n          div.footer {\n            a.title, a.name { font-size: 11px; font-weight: normal; }\n          }\n        }\n      }\n    }\n\n    div.content.browse.ads > ul > li {\n      width: 93px;\n      > div.thumbnail a.thumbnail { width: 83px; height: 62px; }\n    }\n    div.content.browse.brands {\n      .border_radius(3);\n      > ul {\n        background: none;\n        > li {\n          width: 52px;\n          > div.thumbnail {\n            padding: 3px;\n            a.thumbnail { width: 42px; height: 42px; padding: 2px; }\n          }\n          li.active { background: @accent_colour; }\n        }\n      }\n    }\n    div.footer {\n      div.info { float: none; }\n      div.pagination { float: none; margin: 3px 0 0; }\n    }\n  }\n}\n\n/* List Numbers */\nlabel.list_number {\n  float: left; background: url('/images/transparent_backgrounds/black_15.png'); padding: 2px; width: 24px; height: 24px; display: block;\n  .border_radius(99);\n  b {\n    display: block; font-weight: bold; font-size: 14px; color: @white; background: @accent_colour; height: 20px; width: 20px; line-height: 20px;\n    text-align: center; .border_radius(99); .text_shadow(1, 1, 0px, (@accent_colour * 0.75 + @black * 0.25));\n    border: 2px solid @white;\n  }\n}\nlabel.list_number.large {\n  padding: 4px; width: 48px; height: 48px; .border_radius(99); position: relative; left: -10px;\n  b {\n    font-size: 28px; height: 40px; width: 40px; .border_radius(99); line-height: 40px;\n    .text_shadow(2, 2, 0px, (@accent_colour * 0.75 + @black * 0.25)); border-width: 4px;\n  }\n}\n\n/* Dashboard */\n#dashboard_controller {\n  #ads {\n    span.filter.state { float: right; }\n  }\n  #sidebar {\n    #shopping_style div.content {\n      p.less { display: block; }\n      p.more { display: none; }\n    }\n    #influences {\n      div.header {\n        padding-bottom: 0;\n        ul.tabs {\n          position: relative; top: 1px; z-index: 3;\n          li {\n            margin: 0 5px 0 0;\n            a {\n              border: none; background: url('/images/transparent_backgrounds/white_75.png');\n              :hover { color: @black; }\n            }\n          }\n          li.active {\n            a {\n              background: @white; border: none;\n              :hover { color: @black; }\n            }\n          }\n        }\n      }\n\n      div.tab_content {\n        overflow: hidden; padding: 0;\n        > ul {\n          padding: 10px 10px 0; max-height: 280px; min-height: 120px; overflow-y: scroll; .border_radius_bottom(3px);\n        }\n      }\n      div.footer {\n        form {\n          p {\n            margin: 0 0 5px;\n            img.marker { float: right; margin: 5px 0 0 0; }\n            span.invitee {\n              line-height: 26px; padding: 3px 3px 0; font-size: 14px;\n              small { color: @grey; font-size: 12px; }\n            }\n          }\n          p.indent { margin-left: 36px; }\n          p.submit { margin-top: 10px; }\n        }\n      }\n    }\n  }\n\n  div.panel.full {\n    > div.content {\n      margin: 0; padding: 0; background: none;\n      ul {\n        li {\n          width: 148px;\n          div.thumbnail {\n            img.marker.media_type { top: 90px; }\n            a.thumbnail { width: 138px; height: 104px; }\n          }\n        }\n      }\n    }\n  }\n  #people {\n    form {\n      padding: 0 0 5px;\n      input { width: 225px; float: left; margin: 0 5px 0 0; }\n      a.button { height: 23px; line-height: 23px; width: 60px; padding: 0; text-align: center; }\n    }\n  }\n}\n\n/* Remove Pages Titles when Browsing */\n#ads_controller, #brands_controller {\n  #page_title { display: none; }\n}\n\n/* Brands > Show */\n#brands_controller.show {\n  #ads {\n    div.filters {\n      h3 { font-size: 16px; margin: 0; }\n      span.show { float: right; }\n      span.filter.dropdown.localisation { float: right; margin: 0 0 0 10px; }\n      span.filter.state { float: right; margin: 0 0 0 10px; }\n    }\n  }\n}\n\n/* FAQ */\n#pages_controller.faq {\n  #answers {\n    h3 { margin-top: 20px; padding-top: 20px; border-top: 1px solid (@light_grey * 0.75 + @white * 0.25); }\n    h3.first { margin-top: 0; padding-top: 0; border: none; }\n  }\n  #questions {\n    div.content {\n      padding: 20px;\n      ul {\n        margin: 0; padding: 0;\n        li {\n          margin: 0 0 10px; list-style: none; display: block; padding: 0;\n          a { font-size: 14px; }\n        }\n        li:last-child {\n          margin: 0;\n        }\n      }\n    }\n  }\n}\n\n/* Person Overview */\n#person_overview {\n  padding: 20px 10px; position: relative; z-index: 25;\n  #person {\n    float: left; width: 620px;\n    a.avatar {\n      display: block; float: left; width: 60px; height: 60px;\n      img { height: 100%; width: 100%; }\n    }\n    > div {\n      margin: 0 0 0 75px; color: @white; font-size: 14px; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33);\n    }\n    div.name {\n      h2 {\n        margin: 0 0 5px; display: inline;\n        a {\n          font-size: 20px; font-weight: bold; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33);\n          line-height: 1; color: @white; text-decoration: none;\n          :hover { text-decoration: underline; }\n        }\n        a.button.small {\n          font-size: 10px;\n          :hover { text-decoration: none; }\n        }\n      }\n\n      span.points {\n        float: right; display: block; padding: 5px 10px; .border_radius(2); text-align: center; background: @white; position: relative;\n        min-width: 45px;\n        strong { color: @black; font-weight: bold; font-size: 24px; line-height: 1; display: block; .text_shadow(0, 0, 0, transparent); }\n        label { font-size: 9px; text-transform: uppercase; color: @grey; display: block; .text_shadow(0, 0, 0, transparent); font-weight: bold; }\n      }\n      span.points.with_redeem {\n        .border_radius_bottom(0);\n        a.button {\n          display: block; text-align: center; .border_radius_top(0); font-size: 10px; font-weight: bold; padding: 0;\n          position: absolute; height: 18px; left: 0; right: 0; bottom: -19px; line-height: 18px; text-transform: uppercase; border: none;\n        }\n      }\n      div.options { margin: 0; }\n    }\n    div.meta {\n      color: @white * 0.66 + @bg * 0.33;\n      span { color: @white; }\n      label { color: @white * 0.66 + @bg * 0.33; }\n      ul.networks {\n        display: inline; margin: 0; padding: 0;\n        li {\n          display: inline; line-height: 1;\n          img { position: relative; vertical-align: middle; top: -1px; }\n        }\n      }\n    }\n\n    div.extra {\n      font-size: 12px; margin-top: 20px; margin-bottom: 20px;\n      span.toggle {\n        .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33);\n        a { font-size: 10px; font-weight: bold; text-transform: uppercase; text-decoration: none; color: @accent_colour; }\n        b.arrow { display: inline-block; width: 0; height: 0; border: 5px solid transparent; position: relative; top: -2px; }\n      }\n      #less_info {\n        span.toggle {\n          b.arrow { border-top: 5px solid @accent_colour; border-bottom: 0; }\n        }\n      }\n      #more_info {\n        span.toggle {\n          float: right;\n          b.arrow { border-bottom: 5px solid @accent_colour; border-top: 0; }\n        }\n        h4 {\n          color: @white; margin: 0 0 10px 0; border-bottom: 1px solid (@white * 0.25 + @bg * 0.75); .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33);\n          span { font-size: 12px; }\n        }\n        p {\n          margin: 0 0 5px;\n          label { display: block; float: left; width: 120px; color: @white * 0.66 + @bg * 0.33; }\n          span { display: block; margin: 0 0 0 130px; }\n        }\n        p:last-child { margin: 0; }\n\n      }\n    }\n    div.login {\n      margin: 0 0 0 75px;\n      a.button { font-weight: bold; }\n    }\n  }\n}\n\n/* Dashboard Nav */\n#dashboard_nav {\n  position: absolute; bottom: 0; left: 10px; margin: 0; padding: 0; overflow: hidden;\n  li {\n    display: block; float: left; margin: 0 5px 0 0;\n    a {\n      display: block; height: 28px; padding: 0 10px; line-height: 28px; .border_radius_top(2);\n      text-decoration: none; color: @white; background: url('/images/transparent_backgrounds/accent_colour_30.png'); font-size: 14px;\n      font-weight: bold;\n      :hover { background: url('/images/transparent_backgrounds/accent_colour_45.png'); }\n    }\n  }\n  li.active {\n    a {\n      background: @white; color: @black;\n      :hover { color: @black; }\n    }\n  }\n}\n\n/* Dwellometer */\n#dwellometer {\n  z-index: 45; float: right; .box_shadow(0, 0, 0, transparent); margin: 0;\n  div.content {\n    text-align: center; position: relative;\n    object, object embed { position: relative; z-index: 46; line-height: 0; }\n    div.title {\n      position: absolute; bottom: 10px; left: 0; right: 0; z-index: 50;\n      img { width: 120px; display: block; margin: 0 auto; position: relative; left: -5px; }\n    }\n  }\n}\n\n/* Activity Stream */\n#activity {\n  div.content {\n    ul.events {\n      padding: 0; margin: 0 0 -10px;\n      li {\n        margin: 0; padding: 10px 0; border-bottom: 1px solid (@light_grey * 0.33 + @white * 0.66);\n        list-style: none; overflow: hidden;\n        small.meta {\n          font-size: 12px; color: @light_grey; float: right;\n        }\n        a.button { float: right; margin: 0 0 10px 10px; }\n        a.avatar, a.logo, a.thumbnail {\n          height: 32px; display: block; float: left;\n          img { width: 100%; height: 100%; }\n        }\n        a.avatar, a.logo, a.icon { width: 32px; }\n        a.thumbnail { width: 42px; }\n        div.symbols {\n          float: left; overflow: hidden;\n          b {\n            display: block; float: left; margin: 10px 5px 0;\n            img { height: 12px; width: 12px; }\n          }\n          b.voted { margin: 10px 3px 0; padding: 2px; .border_radius(2); }\n          b.voted.for { background: @colour_positive * 0.33 + @white * 0.66; }\n          b.voted.against { background: @colour_negative * 0.33 + @white * 0.66; }\n        }\n        /* Temporarily removed avatar and symbol */\n        /*        div.symbols a.agent, b { display: none; }*/\n        div.description {\n          font-size: 12px; color: @grey;\n          a.agent { font-weight: bold; }\n        }\n        div.comment {\n          margin-top: 2px;\n          b.tail {\n            display: block; margin: 0 0 0 10px; width: 0; height: 0; border: 5px solid transparent;\n            border-top: none; border-bottom: 5px solid (@light_grey * 0.25 + @white * 0.75);\n          }\n          blockquote {\n            margin: 0; font-style: normal; color: @dark_grey;\n            .border_radius(3); background: @light_grey * 0.25 + @white * 0.75; padding: 5px 10px;\n            span.view_comment {\n              color: @grey;\n            }\n          }\n        }\n        div.content {\n          overflow: hidden;\n        }\n      }\n      li.new_comment.ad, li.endorsed.ad, li.voted {\n        div.description, div.content { margin-left: 106px; }\n        /*        div.description, div.content { margin-left: 53px; }*/\n      }\n      li.new_comment.brand, li.replied_to, li.endorsed.brand, li.connected, li.sn_setup {\n        div.description, div.content { margin-left: 96px; }\n        /*        div.description, div.content { margin-left: 43px; }*/\n      }\n      li.replied_to {\n        div.content {\n          a.thumbnail, a.logo { margin-top: 7px; }\n        }\n      }\n      li.replied_to.ad {\n        div.content {\n          div.comment { margin-left: 52px; }\n        }\n      }\n      li.replied_to.brand {\n        div.content {\n          div.comment { margin-left: 42px; }\n        }\n      }\n      li.voted div.description span.action { .border_radius(2); color: @dark_grey; padding: 0 3px; white-space: nowrap; }\n      li.voted.for div.description span.action { background: @colour_positive * 0.15 + @white * 0.85; }\n      li.voted.against div.description span.action { background: @colour_negative * 0.15 + @white * 0.85; }\n      li:first-child { padding-top: 0; }\n      li:last-child { border-bottom: none; }\n      li:hover div.content div.comment blockquote span.view_comment {\n      }\n    }\n  }\n}\n\n/* Login/Register Modal */\n#login_register {\n  div.location_select,\n  div.location_search { margin-left: 130px; }\n  h3 {\n    small { font-size: 14px; font-weight: normal; display: block; color: @grey; text-align: left; margin: 0; display: block; }\n  }\n}\n\n/* Contact Form in Pages */\n#pages_controller {\n  #sidebar {\n    #contact {\n      margin: 15px 0 0;\n      form {\n        label { text-align: left; float: none; width: auto; font-size: 12px; font-weight: bold; line-height: 1; margin: 0 0 5px; }\n        p.submit.indent {\n          margin: 0;\n          span.with_cancel { display: none; }\n        }\n      }\n    }\n  }\n}\n\n/* Exclusive Offers */\n#offers {\n  div.content {\n    a.gift {\n      display: block; text-align: center;\n      img { height: 100px; }\n    }\n  }\n}\n\ndiv.browse {\n  margin: 0 0 20px;\n  &.class {\n    padding: 0;\n  }\n  div.header {\n    padding: 10px 10px 9px; text-align: left; background: @bg url('/images/panel_header_bg.png') repeat-x top left;\n    border-bottom: 1px solid (@bg * 0.66 + @black * 0.33); line-height: 1; height: 18px;\n    .border_radius_top(3); color: @light_grey;\n    h3 { font-size: 16px; margin: 0; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); }\n    span.filter {\n      float: left; display: block; overflow: hidden; position: relative; z-index: 5;\n      a {\n        margin: 0 1px 0 0; display: block; float: left; padding: 0 8px; height: 18px; font-weight: bold; font-size: 10px; line-height: 18px;\n        text-transform: uppercase; background: url('/images/transparent_backgrounds/black_50.png'); color: @light_grey; text-decoration: none; position: relative; z-index: 3;\n        .active {\n          background: @white; color: @black; z-index: 4;\n          :hover { color: @black; }\n        }\n        :hover { color: @white; }\n        :first-child { .border_radius_left(2); }\n        :last-child { .border_radius_right(2); margin-right: 0; }\n      }\n    }\n\n    span.filter.dropdown {\n      margin: 0; position: relative; overflow: visible;\n      a {\n        .border_radius(2); background: @white; color: @black; margin: 0; position: relative; padding-right: 25px;\n        img { float: left; margin: 4px 5px 0 0; }\n        b.arrow {\n          float: right; display: block; height: 0; width: 0; border: 5px solid transparent; border-top: 5px solid @black; border-bottom: none;\n          position: absolute; top: 6px; right: 10px;\n        }\n        :hover {\n          background: @accent_colour; color: @white;\n          b.arrow { border-top: 5px solid @white; }\n        }\n      }\n      ul {\n        position: absolute; top: 100%; left: 0; margin: 1px 0 0; padding: 0; background: @white; .border_radius(2);\n        .box_shadow(0, 1, 1, @black);\n        li {\n          list-style: none; display: block; padding: 0; margin: 0;\n          a {\n            display: block; height: 18px; line-height: 18px; color: @black; font-size: 10px; text-transform: uppercase; background: transparent;\n            border-bottom: 1px solid (@light_grey * 0.66 + @white * 0.33); float: none; margin: 0; .border_radius(0); white-space: nowrap;\n            :hover { background: url('/images/transparent_backgrounds/accent_colour_25.png'); color: @black; }\n          }\n          :last-child {\n            a { border: none; }\n          }\n        }\n      }\n    }\n    span.filter.dropdown.sort { float: left; margin: 0 0 0 10px; }\n    span.filter.dropdown.localisation { float: left; margin: 0 0 0 10px; }\n    a.more {\n      float: right; color: @white; .text_shadow(1, 1, 0, @bg * 0.66 + @black * 0.33); font-size: 14px; font-weight: bold;\n      position: relative; top: 2px;\n      :hover { text-decoration: none; }\n    }\n  }\n  > ul {\n    margin: 0; background: @white; padding: 10px 0 0 10px; .border_radius(3); position: relative;\n    li {\n      display: block; float: left; list-style: none; margin: 0 10px 10px 0; padding: 5px; position: relative;\n      background: @white; width: 130px; border: 1px solid (@light_grey * 0.33 + @white * 0.66); .border_radius(2);\n      a.remove {\n        position: absolute; height: 16px; width: 16px; padding: 3px; background: @accent_colour;\n        .border_radius(99); display: none; z-index: 3; top: -8px; right: -8px;\n        img { vertical-align: middle; }\n      }\n      div.thumbnail {\n        .border_radius_top(3); position: relative; z-index: 3;\n        .marker {\n          position: absolute; padding: 2px; .border_radius(2); z-index: 3;\n          background: url('/images/transparent_backgrounds/white_75.png'); height: 12px; width: 12px;\n        }\n        .marker.coupon {\n          height: auto; width: auto; top: 10px; right: -3px; padding: 0; background: transparent; overflow: hidden; position: absolute;\n          b {\n            display: block; height: 0; width: 0; float: left; border: 14px solid transparent; border-top: 14px solid @accent_colour;\n            border-bottom: none; border-right: none; float: left;\n          }\n          span {\n            color: @white; font-size: 10px; font-weight: bold; text-transform: uppercase; height: 14px; line-height: 14px; display: block;\n            padding: 0 4px 0 2px; background: @accent_colour; .text_shadow(1, 1, 0px, (@accent_colour * 0.75 + @black * 0.25)); margin: 0 0 0 14px;\n          }\n        }\n        .marker.video {\n          position: absolute; left: 50%; top: 50%; background: @white; width: 10px; height: 10px;\n          b { display: block; width: 0; height: 0; border: 5px solid transparent; border-left: 10px solid @black; border-right: none; }\n        }\n        .marker.endorsed_by_me { background: none; padding: 0; right: 0; bottom: -32px; .border_radius(2); background: @white; }\n        a.thumbnail {\n          display: block; overflow: hidden; position: relative; text-align: center;\n          img { position: relative; display: block; margin: auto; }\n        }\n      }\n      div.text {\n        margin: 3px 0 0; display: block;\n        a { text-decoration: none; }\n        a.title {\n          display: block; text-decoration: none; font-weight: bold; font-size: 12px; line-height: 16px;\n          white-space: nowrap; height: 16px; overflow: hidden;\n          :before {\n            display: block; height: 32px; width: 20px; content: \" \"; float: right; right: -15px; top: -8px;\n            background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white);\n          }\n        }\n        small {\n          font-size: 11px; line-height: 13px; color: @grey; display: block; height: 13px; overflow: hidden; white-space: nowrap;\n          a { font-weight: bold; }\n          :before {\n            display: block; height: 32px; width: 20px; content: \" \"; float: right; right: -15px; top: -8px;\n            background: @white; position: relative; z-index: 1; .box_shadow(-5, 0, 10, @white);\n          }\n        }\n      }\n      :hover {\n        background: @accent_colour;\n        a.remove { display: block; }\n        div.thumbnail {\n          a.marker.remove, a.marker.video {\n            b { display: inline-block; }\n          }\n          a.marker.video { .box_shadow(0, 0, 2, @black); }\n        }\n        div.text {\n          a { color: @white; }\n          a.title:before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); }\n          small {\n            color: @white * 0.75 + @accent_colour * 0.25;\n            :before { background: @accent_colour; .box_shadow(-5, 0, 10, @accent_colour); }\n          }\n        }\n        div.footer a { color: @white; }\n      }\n    }\n    > li.ad div.thumbnail a.thumbnail {\n      width: 130px; height: 97px;\n      img { width: 100%; height: 100%; }\n    }\n    > li.brand div.thumbnail a.thumbnail {\n      width: 120px; height: 87px; padding: 5px; background: @white; .border_radius(2);\n      img { max-width: 120px; max-height: 87px; }\n    }\n    li.paginate {\n      margin-bottom: 0;\n      a {\n        display: block; position: relative; text-decoration: none; height: 131px;\n        div.arrow {\n          background: #81c153 url('/images/button_bg.png') repeat-x left top; border: 1px solid (@accent_colour * 0.75 + @black * 0.25);\n          height: 44px; .border_radius(99); width: 44px; margin: 0 auto; position: relative; top: 32px;\n          b { text-indent: -9000px; display: block; border: 10px solid transparent; width: 0; height: 0; position: relative; top: 12px; }\n        }\n        div.label {\n          position: absolute; bottom: 5px; left: 0; right: 0; line-height: 13px;\n          color: @accent_colour * 0.85 + @black * 0.15; text-decoration: none;\n          font-weight: bold; font-size: 12px; text-align: center;\n        }\n        :hover {\n          div.arrow { background: #abd56e url('/images/button_bg.png') repeat-x left -44px; }\n        }\n      }\n      :hover { background: transparent; }\n    }\n    li.paginate.previous a div b { border-right: 15px solid @white; border-left: none; left: 12px; }\n    li.paginate.next a div b { border-left: 15px solid @white; border-right: none; left: 16px; }\n  }\n  > div.footer {\n    padding: 9px 10px 10px; background: @light_grey * 0.75 + @white * 0.25; overflow: hidden;\n    border-top: 1px solid @light_grey; .border_radius_bottom(3);\n    div.info {\n      float: left; color: @grey;\n      strong { color: @black; font-weight: normal; }\n    }\n    div.pagination {\n      float: right;\n      > * {\n        display: inline-block; line-height: 1; padding: 0 6px; line-height: 18px; height: 18px; background: @white;\n        .border_radius(3); text-decoration: none; font-weight: bold;\n        font-size: 10px; text-transform: uppercase;\n      }\n      a { color: @grey; }\n      a:hover { color: @black; }\n      span.disabled { color: @light_grey; }\n      span.current { color: @white; background: @bg; border: none; }\n      span.current:hover { color: @white; }\n    }\n  }\n}\ndiv.browse.with_categories { margin: 0 0 0 160px; }\ndiv.browse.with_options > ul { .border_radius_top(0); }\ndiv.browse.with_footer > ul { .border_radius_bottom(0); }\n/* Browse List */\ndiv.browse.list {\n  > ul {\n    margin: 0; min-height: 320px;\n    padding: 10px 0 0 10px; overflow: hidden;\n    > li {\n      display: block; list-style: none; margin: 0 10px 10px 0; padding: 5px;\n      .border_radius(3); position: relative; line-height: normal;\n      .marker {\n        position: absolute; padding: 2px; .border_radius(2);\n        background: url('/images/transparent_backgrounds/white_75.png');\n        img { height: 12px; width: 12px; }\n      }\n      img.marker { height: 12px; width: 12px; }\n      span.marker.new {\n        color: black; left: -5px; top: -5px; background: none; background-color: @white * 0.1 + @yellow * 0.6 + @red * 0.3; line-height: 1; padding: 2px 5px;\n        font-weight: bold;\n      }\n      a.marker.media_type {\n        display: inline-block; text-decoration: none; top: 39px; left: 8px;\n        font-size: 10px;\n        b { font-weight: normal; margin: 0 0 0 2px; line-height: 1; display: none; }\n        img { vertical-align: middle; }\n      }\n      a.thumbnail {\n        float: left;\n        width: 68px; display: block; overflow: hidden;\n        border: 1px solid @light_grey;\n        :hover { border-color: @accent_colour; }\n      }\n      span.title_brand {\n        display: block; margin: 0 0 2px 75px;\n        a { margin: 0; display: inline; }\n        a.brand_name { font-weight: normal; font-size: 12px; }\n      }\n      a.ad_title {\n        font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block;\n      }\n      a.brand_name {\n        font-weight: bold; font-size: 14px; margin: 0 0 0 75px; display: block;\n      }\n      small {\n        display: block; color: @grey; margin: 0 0 0 75px; font-size: 12px;\n      }\n      small.brand_name { display: inline; margin: 0; }\n      ul.chart {\n        margin: 0 0 0 80px;\n        height: 39px;\n      }\n      ul.networks {\n        margin: 3px 0 0 75px; padding: 0; overflow: hidden;\n        li { display: block; float: left; margin: 0 5px 0 0; line-height: 1; }\n      }\n      div.points {\n        display: none;\n        font-size: 12px; text-align: right;\n        label { color: @grey; }\n      }\n      a.remove { bottom: -3px; right: -3px; }\n    }\n    li.ad {\n      a.thumbnail { height: 51px; }\n      span.title_brand {\n        small.brand_name {\n          display: block;\n        }\n      }\n    }\n    li.brand {\n      a.thumbnail { height: 68px; }\n    }\n  }\n}\ndiv.browse.list.with_options ul { .border_radius_top(0); }\ndiv.browse.list.with_footer ul { .border_radius_bottom(0); }\ndiv.browse.list.cols_2 {\n  > ul {\n    > li {\n      width: 285px; float: left;\n      :hover {\n        background: @white;\n      }\n    }\n  }\n}\ndiv.browse.ads.list {\n  > ul {\n    > li {\n      height: 53px;\n      a.thumbnail {\n        height: 51px;\n      }\n    }\n  }\n}\ndiv.browse.brands.list {\n  > ul {\n    > li {\n      height: 68px;\n      a.thumbnail {\n        height: 66px;\n      }\n    }\n  }\n}\n\n/* Categories List */\n#categories {\n  margin: 40px 0 0; width: 160px; float: left; position: relative; z-index: 1;\n  ul {\n    margin: 0; padding: 10px 0 0;\n    li {\n      list-style: none; margin: 0; padding: 0; font-size: 14px;\n      a { color: @grey; display: block; padding: 5px 10px 5px 15px; text-decoration: none; .border_radius_left(3); }\n      a:hover { color: @black; background: @light_grey * 0.15 + @white * 0.85; }\n    }\n    .all a { font-weight: bold; }\n    .current a {\n      background: @white; color: @black; border: 1px solid (@light_grey * 0.25 + @white * 0.75); border-right: none; border-left: 5px solid @bg;\n      padding-left: 10px;\n    }\n  }\n}\n\n/* Ads > Show */\n#ad {\n  div.header {\n    overflow: hidden;\n    h3 { font-size: 16px; margin: 0 0 3px; }\n    small {\n      a.category { font-weight: bold; color: @accent_colour; }\n      span.networks img { position: relative; top: 3px; }\n    }\n    span.brand {\n      float: right; color: @white;\n      a.brand_name { font-weight: bold; color: @accent_colour; }\n    }\n  }\n  div.content {\n    padding: 0; position: relative;\n    a.toggle_size {\n      display: block; .border_radius(3); background-color: @black; padding: 0 5px 0 26px;\n      background-position: 5px center; background-repeat: no-repeat; text-decoration: none; margin: 5px 5px 0 0;\n      position: absolute; top: 0; right: 0; line-height: 25px; z-index: 45;\n    }\n    img.creative { margin: 0 auto; max-width: 540px; display: block; }\n    object { position: relative; z-index: 44; }\n    object.video { line-height: 0; font-size: 0; }\n    object embed { position: relative; z-index: 45; line-height: 0; font-size: 0; }\n  }\n  div.content.not_video {\n    padding: 40px; text-align: center;\n    * { margin-left: auto; margin-right: auto; }\n    object.flash { margin-bottom: 0; }\n  }\n  div.footer {\n    padding: 0;\n    div.vote_views {\n      padding: 5px 10px; overflow: hidden;\n      div.share { float: right; margin: 2px 0 0 0; }\n      #login_register_msg, #encourage_vote_msg { line-height: 22px; font-weight: bold; color: @black; }\n    }\n  }\n}\n#sidebar {\n  #meta {\n    table {\n      margin: 0;\n      tr:last-child td { padding-bottom: 0; }\n      td {\n        padding: 0 0 5px;\n        ul.networks {\n          margin: 0; padding: 0;\n          li {\n            list-style: none; display: inline;\n          }\n          li {\n          }\n        }\n      }\n      td.label { color: @grey; white-space: nowrap; width: 1%; text-align: right; padding-right: 5px; }\n    }\n  }\n}\n\n/* Voting */\ndiv.voted {\n  font-size: 12px; line-height: 22px; color: @black; display: inline-block; font-weight: bold;\n  img { float: left; margin-right: 5px; padding: 3px; .border_radius(3); }\n}\n#voted_up {\n  img { background: @colour_positive * 0.66 + @bg * 0.15; }\n}\n#voted_down {\n  img { background: @colour_negative * 0.66 + @bg * 0.15; }\n}\n#encourage_comment {\n  display: inline-block; line-height: 22px; font-weight: bold;\n}\n#vote {\n  overflow: hidden; font-size: 12px; line-height: 22px; color: @black; float: left;\n  a {\n    color: @white; font-weight: bold; overflow: hidden; display: block;\n    width: 16px; text-decoration: none; text-align: center; font-size: 10px; padding: 3px; text-transform: uppercase;\n  }\n  a.up {\n    float: left; background: @colour_positive * 0.66 + @bg * 0.15; .border_radius_left(3);\n    :hover { background: @colour_positive * 0.85 + @bg * 0.15; }\n  }\n  a.down {\n    float: left; background: @colour_negative * 0.66 + @bg * 0.15; .border_radius_right(3);\n    margin: 0 5px 0 1px;\n    :hover { background: @colour_negative * 0.85 + @bg * 0.15; }\n  }\n}\n#vote.disabled {\n  a.up {\n    background: (@colour_positive * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85;\n    :hover { background: (@colour_positive * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; }\n  }\n  a.down {\n    background: (@colour_negative * 0.66 + @bg * 0.15) * 0.15 + @grey * 0.85;\n    :hover { background: (@colour_negative * 0.85 + @bg * 0.15) * 0.25 + @grey * 0.75; }\n  }\n}\n#sidebar {\n  #ads > ul li, #recommendations > ul li {\n    width: 81px;\n    div.thumbnail {\n      a.thumbnail { height: 60px; width: 81px; }\n    }\n    div.text {\n      a.title { font-size: 11px; height: 14px; line-height: 14px; }\n      small { display: none; }\n    }\n  }\n  #brands > ul li {\n    width: 55px;\n    div.thumbnail {\n      a.thumbnail {\n        height: 45px; width: 45px;\n        img { max-height: 45px; max-width: 45px; }\n      }\n    }\n    div.text { display: none; }\n  }\n}\n\n/* My Account */\n#accounts_controller {\n  #top {\n    #page_title {\n      #page_options {\n        a.button.public_profile {\n          float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 35px 8px 15px; position: relative;\n          b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; right: 15px; border: 6px solid transparent; border-right: none; border-left: 6px solid @white; margin: 0; }\n        }\n        a.button.goto_dashboard {\n          float: right; font-size: 16px; line-height: 1; height: auto; padding: 8px 15px 8px 35px; margin-right: 5px; position: relative;\n          b.arrow { display: block; height: 0; width: 0; position: absolute; top: 10px; left: 15px; border: 6px solid transparent; border-left: none; border-right: 6px solid @white; margin: 0; }\n        }\n      }\n    }\n  }\n  #account_nav {\n    float: left; width: 200px; margin: 0 20px 0 0;\n    ul.nav {\n      margin: 0; padding: 0;\n      li {\n        margin: 0 0 5px; display: block; list-style: none; padding: 0;\n        a {\n          display: block; height: 30px; text-decoration: none; color: @white;\n          b {\n            border: 15px solid transparent; border-right: none; border-left: 10px solid transparent; width: 0;\n            height: 0; float: right; display: none;\n          }\n          span {\n            .border_radius(3); background: @bg; display: block;\n            line-height: 30px; padding: 0 10px; font-size: 14px; font-weight: bold; margin: 0 10px 0 0;\n          }\n        }\n        :hover {\n          a {\n            color: @white;\n            b { border-left-color: @bg; display: block; }\n            span { background: @bg; .border_radius_right(0); }\n          }\n        }\n      }\n      li.current a {\n        b { border-left-color: @accent_colour; display: block; }\n        span { background: @accent_colour; color: @white; .border_radius_right(0); }\n      }\n    }\n  }\n  #main {\n    > div {\n      margin: 0 0 20px;\n      form { margin: 0; }\n    }\n    #profile {\n      a.avatar {\n        float: left; display: block;\n        width: 70px; overflow: hidden; position: relative; text-decoration: none;\n        img { width: 100%; }\n        span {\n          display: block; line-height: 1; padding: 3px; margin: 5px 0 0; color: @white; background: @accent_colour;\n          .border_radius(3); .text_shadow(1, 1, 0, @grey);\n          text-align: center; font-size: 10px; font-weight: bold; text-transform: uppercase;\n        }\n      }\n      form {\n        margin: 0 0 0 90px;\n        h4 { margin: 10px 0 20px; border-bottom: 1px solid (@light_grey * 0.5 + @white * 0.5); padding: 0; color: @bg; font-size: 16px; }\n        ul.choices {\n          li { width: 30%; }\n        }\n        div.extra { margin-top: 20px; }\n      }\n    }\n\n    #networks {\n      ul { margin: 0 -10px -10px 0; padding: 0; overflow: hidden;\n        li:hover\n        {\n          background: @light_grey; display: block; float: left; width: 180px;\n          padding: 10px; margin: 0 10px 10px 0; list-style: none; .border_radius(3);\n          position: relative;\n          * { line-height: normal; }\n          img { vertical-align: middle; float: left; }\n          .name { font-weight: bold; font-size: 14px; display: block; margin: -2px 0 0 42px; }\n          small {\n            font-size: 12px; color: @grey; display: block; margin-left: 42px;\n            strong { color: @black; font-weight: normal; }\n          }\n          :hover {\n          }\n        }\n        li.installed {\n          background: @white;\n          border: 2px solid @accent_colour; padding: 8px;\n        }\n        li.unavailable {\n          .name { color: @black; }\n          :hover {\n            background: @light_grey;\n          }\n        }\n        li:hover {\n          background: @light_grey * 0.5 + @white * 0.5;\n        }\n      }\n    }\n  }\n}\n\n/* Shopping Style Panel */\n#shopping_style {\n  div.header a.button.small { float: right; }\n  div.content {\n    p {\n      margin: 0 0 10px;\n      label { text-transform: uppercase; font-size: 11px; display: block; color: @bg; font-weight: bold; }\n      span { color: @black; }\n      span.toggle { white-space: nowrap; color: @grey; }\n      :last-child { margin: 0; }\n    }\n    p.more { text-align: left; font-weight: normal; }\n    p.less { display: none; margin: 0; }\n  }\n}\n\n/* People Controller */\n#people_controller.index {\n  #main {\n    div.panel {\n      float: left; width: 300px; margin: 0 20px 0 0;\n      :last-child { margin-right: 0; }\n    }\n  }\n}\n#people_controller.show {\n  #person_overview, #shopping_style {\n    a.button.small {\n    }\n  }\n  #content {\n    #shopping_style {\n      float: left; width: 240px; margin: 0 20px 0 0;\n    }\n    #main { width: 360px; }\n  }\n}\n\n/* Search Results */\n#search_results {\n  margin: 0 0 20px;\n  li {\n    :hover {\n      small { color: @white * 0.75 + @accent_colour * 0.25; }\n    }\n  }\n}\n#search {\n  div.content {\n    padding: 20px;\n    form {\n      margin: 0; float: none;\n      span.submit_and_options {\n        display: block;\n      }\n    }\n    p { margin: 0 0 15px; }\n    h4 { font-weight: normal; margin: 0 0 5px; }\n  }\n}\n\n/* Recommendations */\n#recommendations {\n  div.browse {\n    margin: 0; padding: 0; background: none;\n    ul { min-height: 0; .border_radius(0); }\n  }\n}\n\n/* Blank States */\ndiv.blank {\n  padding: 20px; background: @bg * 0.05 + @blue * 0.05 + @white * 0.9; position: relative;\n  border: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); z-index: 1;\n  h4 { font-size: 18px; margin: 0 0 10px; }\n  h4:last-child { margin: 0; }\n  p { font-size: 16px; margin: 0 0 10px; }\n  p:last-child { margin: 0; }\n  p.with_list_number.large {\n    span { margin-left: 48px; display: block; color: @white; }\n  }\n  p.earn span { font-size: 22px; color: @white; line-height: 48px; font-weight: bold; }\n  a { white-space: nowrap; }\n  a.hide {\n    position: absolute; top: -5px; right: -5px; display: block; height: 16px; width: 16px; padding: 3px; background: #E7E9F6; .border_radius(99);\n  }\n}\n\ndiv.blank.small {\n  padding: 10px 20px;\n  h4 { font-weight: normal; font-size: 16px; }\n  p { margin: 0; }\n}\ndiv.blank.tiny {\n  padding: 10px 20px;\n  h4 { font-weight: normal; font-size: 14px; }\n  p { margin: 0; font-size: 12px; }\n}\ndiv.blank.rounded {\n  .border_radius(3); margin: 0 0 20px;\n}\ndiv.blank.rounded.bottom { .border_radius_top(0); }\ndiv.blank.with_border_bottom { border-bottom: 1px solid (@bg * 0.1 + @blue * 0.1 + @white * 0.8); }\ndiv.blank.no_border_top { border-top: none; }\ndiv.blank.no_border_bottom { border-bottom: none; }\ndiv.blank.no_side_borders { border-right: none; border-left: none; }\ndiv.panel {\n  div.blank {\n    padding: 10px 20px; overflow: hidden; margin: 0;\n    h4 { font-weight: normal; font-size: 14px; }\n    p, ul { margin: 0 0 10px; font-size: 12px; }\n    p:last-child, ul:last-child { margin: 0; }\n  }\n}\n\n#yelow {\n  #short {\n    color: #fea;\n  }\n  #long {\n    color: #ffeeaa;\n  }\n  #rgba {\n    color: rgba(255, 238, 170, 0.1);\n  }\n}\n\n#blue {\n  #short {\n    color: #00f;\n  }\n  #long {\n    color: #0000ff;\n  }\n  #rgba {\n    color: rgba(0, 0, 255, 0.1);\n  }\n}\n\n#overflow {\n  .a { color: #111111 - #444444; } // #000000\n  .b { color: #eee + #fff; } // #ffffff\n  .c { color: #aaa * 3; } // #ffffff\n  .d { color: #00ee00 + #009900; } // #00ff00\n}\n\n#grey {\n  color: rgb(200, 200, 200);\n}\n\n#808080 {\n  color: hsl(50, 0%, 50%);\n}\n\n#00ff00 {\n  color: hsl(120, 100%, 50%);\n}\n/******************\\\n*                  *\n*  Comment Header  *\n*                  *\n\\******************/\n\n/*\n\n    Comment\n\n*/\n\n/*\n * Comment Test\n *\n * - cloudhead (http://cloudhead.net)\n *\n */\n\n////////////////\n@var: \"content\";\n////////////////\n\n/* Colors\n * ------\n *   #EDF8FC (background blue)\n *   #166C89 (darkest blue)\n *\n * Text:\n *   #333 (standard text) // A comment within a comment!\n *   #1F9EC9 (standard link)\n *\n */\n\n/* @group Variables\n------------------- */\n#comments /* boo */ {\n  /**/ // An empty comment\n  color: red; /* A C-style comment */\n  background-color: orange; // A little comment\n  font-size: 12px;\n\n  /* lost comment */ content: @var;\n\n  border: 1px solid black;\n\n  // padding & margin //\n  padding: 0;\n  margin: 2em;\n} //\n\n/* commented out\n  #more-comments {\n    color: grey;\n  }\n*/\n\n#last { color: blue }\n//\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n  text-shadow: -1px -1px 1px red, 6px 5px 5px yellow;\n  -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset,\n  0pt 4px 6px rgba(255, 255, 255, 0.4) inset;\n}\n@font-face {\n  font-family: Headline;\n  src: local(Futura-Medium),\n  url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n.other {\n  -moz-transform: translate(0, 11em) rotate(-90deg);\n}\np:not([class*=\"lead\"]) {\n  color: black;\n}\n\ninput[type=\"text\"].class#id[attr=32]:not(1) {\n                                      color: white;\n                                    }\n\ndiv#id.class[a=1][b=2].class:not(1) {\n                        color: white;\n                      }\n\nul.comma > li:not(:only-child)::after {\n  color: white;\n}\n\nol.comma > li:nth-last-child(2)::after {\n  color: white;\n}\n\nli:nth-child(4n+1),\nli:nth-child(-5n),\nli:nth-child(-n+2) {\n  color: white;\n}\n\na[href^=\"http://\"] {\n  color: black;\n}\n\na[href$=\"http://\"] {\n  color: black;\n}\n\nform[data-disabled] {\n  color: black;\n}\n\np::before {\n  color: black;\n}\n@charset \"utf-8\";\ndiv { color: black; }\ndiv { width: 99%; }\n\n* {\n  min-width: 45em;\n}\n\nh1, h2 > a > p, h3 {\n  color: none;\n}\n\ndiv.class {\n  color: blue;\n}\n\ndiv#id {\n  color: green;\n}\n\n.class#id {\n  color: purple;\n}\n\n.one.two.three {\n  color: grey;\n}\n\n@media print {\n  font-size: 3em;\n}\n\n@media screen {\n  font-size: 10px;\n}\n\n@font-face {\n  font-family: 'Garamond Pro';\n  src: url(\"/fonts/garamond-pro.ttf\");\n}\n\na:hover, a:link {\n  color: #999;\n}\n\np, p:first-child {\n  text-transform: none;\n}\n\nq:lang(no) {\n  quotes: none;\n}\n\np + h1 {\n  font-size: 2.2em;\n}\n\n#shorthands {\n  border: 1px solid #000;\n  font: 12px/16px Arial;\n  margin: 1px 0;\n  padding: 0 auto;\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n\n#more-shorthands {\n  margin: 0;\n  padding: 1px 0 2px 0;\n  font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;\n}\n\n.misc {\n  -moz-border-radius: 2px;\n  display: -moz-inline-stack;\n  width: .1em;\n  background-color: #009998;\n  background-image: url(images/image.jpg);\n  background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));\n  margin: ;\n}\n\n#important {\n  color: red !important;\n  width: 100%!important;\n  height: 20px ! important;\n}\n\n#functions {\n  @var: 10;\n  color: color(\"red\");\n  width: increment(15);\n  height: undefined(\"self\");\n  border-width: add(2, 3);\n  variable: increment(@var);\n}\n\n#built-in {\n  @r: 32;\n  escaped: e(\"-Some::weird(#thing, y)\");\n  lighten: lighten(#ff0000, 50%);\n  darken: darken(#ff0000, 50%);\n  saturate: saturate(#29332f, 20%);\n  desaturate: desaturate(#203c31, 20%);\n  greyscale: greyscale(#203c31);\n  format: %(\"rgb(%d, %d, %d)\", @r, 128, 64);\n  format-string: %(\"hello %s\", \"world\");\n  eformat: e(%(\"rgb(%d, %d, %d)\", @r, 128, 64));\n}\n\n@var: @a;\n@a: 100%;\n\n.lazy-eval {\n  width: @var;\n}\n.mixin (@a: 1px, @b: 50%) {\n  width: @a * 5;\n  height: @b - 1%;\n}\n\n.mixina (@style, @width, @color: black) {\n  border: @width @style @color;\n}\n\n.mixiny\n(@a: 0, @b: 0) {\n  margin: @a;\n  padding: @b;\n}\n\n.hidden() {\n  color: transparent;\n}\n\n.two-args {\n  color: blue;\n  .mixin(2px, 100%);\n  .mixina(dotted, 2px);\n}\n\n.one-arg {\n  .mixin(3px);\n}\n\n.no-parens {\n  .mixin();\n}\n\n.no-args {\n  .mixin();\n}\n\n.var-args {\n  @var: 9;\n  .mixin(@var, @var * 2);\n}\n\n.multi-mix {\n  .mixin(2px, 30%);\n  .mixiny(4, 5);\n}\n\n.maxa(@arg1: 10, @arg2: #f00) {\n  padding: @arg1 * 2px;\n  color: @arg2;\n}\n\nbody {\n  .maxa(15);\n}\n\n@glob: 5;\n.global-mixin(@a:2) {\n  width: @glob + @a;\n}\n\n.scope-mix {\n  .global-mixin(3);\n}\n\n.nested-ruleset (@width: 200px) {\n  width: @width;\n  .column { margin: @width; }\n}\n.content {\n  .nested-ruleset(600px);\n}\n\n//\n\n.same-var-name2(@radius) {\n  radius: @radius;\n}\n.same-var-name(@radius) {\n  .same-var-name2(@radius);\n}\n#same-var-name {\n  .same-var-name(5px);\n}\n\n//\n\n.var-inside () {\n  @var: 10px;\n  width: @var;\n}\n#var-inside { .var-inside(); }\n.mix-inner (@var) {\n  border-width: @var;\n}\n\n.mix (@a: 10) {\n  .inner {\n    height: @a * 10;\n\n    .innest {\n      width: @a;\n      .mix-inner(@a * 2);\n    }\n  }\n}\n\n.class {\n  .mix(30);\n}\n.mixin () {\n  zero: 0;\n}\n.mixin (@a: 1px) {\n  one: 1;\n}\n.mixin (@a) {\n  one-req: 1;\n}\n.mixin (@a: 1px, @b: 2px) {\n  two: 2;\n}\n\n.mixin (@a, @b, @c) {\n  three-req: 3;\n}\n\n.mixin (@a: 1px, @b: 2px, @c: 3px) {\n  three: 3;\n}\n\n.zero {\n  .mixin();\n}\n\n.one {\n  .mixin(1);\n}\n\n.two {\n  .mixin(1, 2);\n}\n\n.three {\n  .mixin(1, 2, 3);\n}\n\n//\n\n.mixout ('left') {\n  left: 1;\n}\n\n.mixout ('right') {\n  right: 1;\n}\n\n.left {\n  .mixout('left');\n}\n.right {\n  .mixout('right');\n}\n\n//\n\n.border (@side, @width) {\n  color: black;\n  .border-side(@side, @width);\n}\n.border-side (left, @w) {\n  border-left: @w;\n}\n.border-side (right, @w) {\n  border-right: @w;\n}\n\n.border-right {\n  .border(right, 4px);\n}\n.border-left {\n  .border(left, 4px);\n}\n\n//\n\n\n.border-radius (@r) {\n  both: @r * 10;\n}\n.border-radius (@r, left) {\n  left: @r;\n}\n.border-radius (@r, right) {\n  right: @r;\n}\n\n.only-right {\n  .border-radius(33, right);\n}\n.only-left {\n  .border-radius(33, left);\n}\n.left-right {\n  .border-radius(33);\n}\n.mixin { border: 1px solid black; }\n.mixout { border-color: orange; }\n.borders { border-style: dashed; }\n\n#namespace {\n  .borders {\n    border-style: dotted;\n  }\n  .biohazard {\n    content: \"death\";\n    .man {\n      color: transparent;\n    }\n  }\n}\n#theme {\n  > .mixin {\n    background-color: grey;\n  }\n}\n#container {\n  color: black;\n  .mixin();\n  .mixout();\n  #theme > .mixin();\n}\n\n#header {\n  .milk {\n    color: white;\n    .mixin();\n    #theme > .mixin();\n  }\n  #cookie {\n    .chips {\n      #namespace .borders();\n      .calories {\n        #container();\n      }\n    }\n    .borders();\n  }\n}\n.secure-zone { #namespace .biohazard .man(); }\n.direct {\n  #namespace > .borders();\n}\n#operations {\n  color: #110000 + #000011 + #001100; // #111111\n  height: (10px / 2px) + 6px - 1px * 2; // 9px\n  width: 2 * 4 - 5em; // 3em\n  .spacing {\n    height: (10px / 2px)+6px-1px*2;\n    width: 2  * 4-5em;\n  }\n  subtraction: 20 - 10 - 5 - 5; // 0\n  division: (20 / 5 / 4); // 1\n}\n\n@x: 4;\n@y: 12em;\n\n.with-variables {\n  height: @x + @y; // 16em\n  width: 12 + @y; // 24em\n  size: 5cm - @x; // 1cm\n}\n\n@z: -2;\n\n.negative {\n  height: 2px + @z; // 0px\n  width: 2px - @z; // 4px\n}\n\n.shorthands {\n  padding: -1px 2px 0 -4px; //\n}\n\n.colors {\n  color: #123; // #112233\n  border-color: #234 + #111111; // #334455\n  background-color: #222222 - #fff; // #000000\n  .other {\n    color: 2 * #111; // #222222\n    border-color: (#333333 / 3) + #111; // #222222\n  }\n}\n.parens {\n  @var: 1px;\n  border: (@var * 2) solid black;\n  margin: (@var * 1) (@var + 2) (4 * 4) 3;\n  width: (6 * 6);\n  padding: 2px (6px * 6px);\n}\n\n.more-parens {\n  @var: (2 * 2);\n  padding: (2 * @var) 4 4 (@var * 1px);\n  width: (@var * @var) * 6;\n  height: (7 * 7) + (8 * 8);\n  margin: 4 * ((5 + 5) / 2) - (@var * 2);\n  //margin: (6 * 6)px;\n}\n\n.nested-parens {\n  width: 2 * (4 * (2 + (1 + 6))) - 1;\n  height: ((2+3)*(2+3) / (9-4)) + 1;\n}\n\n.mixed-units {\n  margin: 2px 4em 1 5pc;\n  padding: (2px + 4px) 1em 2px 2;\n}\n#first > .one {\n  > #second .two > #deux {\n    width: 50%;\n    #third {\n      &:focus {\n        color: black;\n        #fifth {\n          > #sixth {\n            .seventh #eighth {\n              + #ninth {\n                color: purple;\n              }\n            }\n          }\n        }\n      }\n      height: 100%;\n    }\n    #fourth, #five, #six {\n      color: #110000;\n      .seven, .eight > #nine {\n        border: 1px solid black;\n      }\n      #ten {\n        color: red;\n      }\n    }\n  }\n  font-size: 2em;\n}\n@x: blue;\n@z: transparent;\n@mix: none;\n\n.mixin {\n  @mix: #989;\n}\n\n.tiny-scope {\n  color: @mix; // #989\n  .mixin();\n}\n\n.scope1 {\n  @y: orange;\n  @z: black;\n  color: @x; // blue\n  border-color: @z; // black\n  .hidden {\n    @x: #131313;\n  }\n  .scope2 {\n    @y: red;\n    color: @x; // blue\n    .scope3 {\n      @local: white;\n      color: @y; // red\n      border-color: @z; // black\n      background-color: @local; // white\n    }\n  }\n}h1, h2, h3 {\n   a, p {\n     &:hover {\n       color: red;\n     }\n   }\n }\n\n#all { color: blue; }\n#the { color: blue; }\n#same { color: blue; }\n\nul, li, div, q, blockquote, textarea {\n  margin: 0;\n}\n\ntd {\n  margin: 0;\n  padding: 0;\n}\n\ntd, input {\n  line-height: 1em;\n}\n#strings {\n  background-image: url(\"http://son-of-a-banana.com\");\n  quotes: \"~\" \"~\";\n  content: \"#*%:&^,)!.(~*})\";\n  empty: \"\";\n  brackets: \"{\" \"}\";\n}\n#comments {\n  content: \"/* hello */ // not-so-secret\";\n}\n#single-quote {\n  quotes: \"'\" \"'\";\n  content: '\"\"#!&\"\"';\n  empty: '';\n}\n@a: 2;\n@x: @a * @a;\n@y: @x + 1;\n@z: @x * 2 + @y;\n\n.variables {\n  width: @z + 1cm; // 14cm\n}\n\n@b: @a * 10;\n@c: #888;\n\n@fonts: \"Trebuchet MS\", Verdana, sans-serif;\n@f: @fonts;\n\n@quotes: \"~\" \"~\";\n@q: @quotes;\n\n.variables {\n  height: @b + @x + 0px; // 24px\n  color: @c;\n  font-family: @f;\n  quotes: @q;\n}\n\n.redefinition {\n  @var: 4;\n  @var: 2;\n  @var: 3;\n  three: @var;\n}\n\n.values {\n  @a: 'Trebuchet';\n  font-family: @a, @a, @a;\n}\n\n\n.whitespace\n{ color: white; }\n\n.whitespace\n{\n  color: white;\n}\n.whitespace\n{ color: white; }\n\n.whitespace{color:white;}\n.whitespace { color : white ; }\n\n.white,\n.space,\n.mania\n{ color: white; }\n\n.no-semi-column { color: white }\n.no-semi-column {\n  color: white;\n  white-space: pre\n}\n.no-semi-column {border: 2px solid white}\n.newlines {\n  background: the,\n  great,\n  wall;\n  border: 2px\n  solid\n  black;\n}\n.empty {\n\n}\n#yelow {\n  #short {\n    color: #fea;\n  }\n  #long {\n    color: #ffeeaa;\n  }\n  #rgba {\n    color: rgba(255, 238, 170, 0.1);\n  }\n}\n\n#blue {\n  #short {\n    color: #00f;\n  }\n  #long {\n    color: #0000ff;\n  }\n  #rgba {\n    color: rgba(0, 0, 255, 0.1);\n  }\n}\n\n#overflow {\n  .a { color: #111111 - #444444; } // #000000\n  .b { color: #eee + #fff; } // #ffffff\n  .c { color: #aaa * 3; } // #ffffff\n  .d { color: #00ee00 + #009900; } // #00ff00\n}\n\n#grey {\n  color: rgb(200, 200, 200);\n}\n\n#808080 {\n  color: hsl(50, 0%, 50%);\n}\n\n#00ff00 {\n  color: hsl(120, 100%, 50%);\n}\n/******************\\\n*                  *\n*  Comment Header  *\n*                  *\n\\******************/\n\n/*\n\n    Comment\n\n*/\n\n/*\n * Comment Test\n *\n * - cloudhead (http://cloudhead.net)\n *\n */\n\n////////////////\n@var: \"content\";\n////////////////\n\n/* Colors\n * ------\n *   #EDF8FC (background blue)\n *   #166C89 (darkest blue)\n *\n * Text:\n *   #333 (standard text) // A comment within a comment!\n *   #1F9EC9 (standard link)\n *\n */\n\n/* @group Variables\n------------------- */\n#comments /* boo */ {\n  /**/ // An empty comment\n  color: red; /* A C-style comment */\n  background-color: orange; // A little comment\n  font-size: 12px;\n\n  /* lost comment */ content: @var;\n\n  border: 1px solid black;\n\n  // padding & margin //\n  padding: 0;\n  margin: 2em;\n} //\n\n/* commented out\n  #more-comments {\n    color: grey;\n  }\n*/\n\n#last { color: blue }\n//\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n  text-shadow: -1px -1px 1px red, 6px 5px 5px yellow;\n  -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset,\n  0pt 4px 6px rgba(255, 255, 255, 0.4) inset;\n}\n@font-face {\n  font-family: Headline;\n  src: local(Futura-Medium),\n  url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n.other {\n  -moz-transform: translate(0, 11em) rotate(-90deg);\n}\np:not([class*=\"lead\"]) {\n  color: black;\n}\n\ninput[type=\"text\"].class#id[attr=32]:not(1) {\n                                      color: white;\n                                    }\n\ndiv#id.class[a=1][b=2].class:not(1) {\n                        color: white;\n                      }\n\nul.comma > li:not(:only-child)::after {\n  color: white;\n}\n\nol.comma > li:nth-last-child(2)::after {\n  color: white;\n}\n\nli:nth-child(4n+1),\nli:nth-child(-5n),\nli:nth-child(-n+2) {\n  color: white;\n}\n\na[href^=\"http://\"] {\n  color: black;\n}\n\na[href$=\"http://\"] {\n  color: black;\n}\n\nform[data-disabled] {\n  color: black;\n}\n\np::before {\n  color: black;\n}\n@charset \"utf-8\";\ndiv { color: black; }\ndiv { width: 99%; }\n\n* {\n  min-width: 45em;\n}\n\nh1, h2 > a > p, h3 {\n  color: none;\n}\n\ndiv.class {\n  color: blue;\n}\n\ndiv#id {\n  color: green;\n}\n\n.class#id {\n  color: purple;\n}\n\n.one.two.three {\n  color: grey;\n}\n\n@media print {\n  font-size: 3em;\n}\n\n@media screen {\n  font-size: 10px;\n}\n\n@font-face {\n  font-family: 'Garamond Pro';\n  src: url(\"/fonts/garamond-pro.ttf\");\n}\n\na:hover, a:link {\n  color: #999;\n}\n\np, p:first-child {\n  text-transform: none;\n}\n\nq:lang(no) {\n  quotes: none;\n}\n\np + h1 {\n  font-size: 2.2em;\n}\n\n#shorthands {\n  border: 1px solid #000;\n  font: 12px/16px Arial;\n  margin: 1px 0;\n  padding: 0 auto;\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n\n#more-shorthands {\n  margin: 0;\n  padding: 1px 0 2px 0;\n  font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;\n}\n\n.misc {\n  -moz-border-radius: 2px;\n  display: -moz-inline-stack;\n  width: .1em;\n  background-color: #009998;\n  background-image: url(images/image.jpg);\n  background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));\n  margin: ;\n}\n\n#important {\n  color: red !important;\n  width: 100%!important;\n  height: 20px ! important;\n}\n\n#functions {\n  @var: 10;\n  color: color(\"red\");\n  width: increment(15);\n  height: undefined(\"self\");\n  border-width: add(2, 3);\n  variable: increment(@var);\n}\n\n#built-in {\n  @r: 32;\n  escaped: e(\"-Some::weird(#thing, y)\");\n  lighten: lighten(#ff0000, 50%);\n  darken: darken(#ff0000, 50%);\n  saturate: saturate(#29332f, 20%);\n  desaturate: desaturate(#203c31, 20%);\n  greyscale: greyscale(#203c31);\n  format: %(\"rgb(%d, %d, %d)\", @r, 128, 64);\n  format-string: %(\"hello %s\", \"world\");\n  eformat: e(%(\"rgb(%d, %d, %d)\", @r, 128, 64));\n}\n\n@var: @a;\n@a: 100%;\n\n.lazy-eval {\n  width: @var;\n}\n.mixin (@a: 1px, @b: 50%) {\n  width: @a * 5;\n  height: @b - 1%;\n}\n\n.mixina (@style, @width, @color: black) {\n  border: @width @style @color;\n}\n\n.mixiny\n(@a: 0, @b: 0) {\n  margin: @a;\n  padding: @b;\n}\n\n.hidden() {\n  color: transparent;\n}\n\n.two-args {\n  color: blue;\n  .mixin(2px, 100%);\n  .mixina(dotted, 2px);\n}\n\n.one-arg {\n  .mixin(3px);\n}\n\n.no-parens {\n  .mixin();\n}\n\n.no-args {\n  .mixin();\n}\n\n.var-args {\n  @var: 9;\n  .mixin(@var, @var * 2);\n}\n\n.multi-mix {\n  .mixin(2px, 30%);\n  .mixiny(4, 5);\n}\n\n.maxa(@arg1: 10, @arg2: #f00) {\n  padding: @arg1 * 2px;\n  color: @arg2;\n}\n\nbody {\n  .maxa(15);\n}\n\n@glob: 5;\n.global-mixin(@a:2) {\n  width: @glob + @a;\n}\n\n.scope-mix {\n  .global-mixin(3);\n}\n\n.nested-ruleset (@width: 200px) {\n  width: @width;\n  .column { margin: @width; }\n}\n.content {\n  .nested-ruleset(600px);\n}\n\n//\n\n.same-var-name2(@radius) {\n  radius: @radius;\n}\n.same-var-name(@radius) {\n  .same-var-name2(@radius);\n}\n#same-var-name {\n  .same-var-name(5px);\n}\n\n//\n\n.var-inside () {\n  @var: 10px;\n  width: @var;\n}\n#var-inside { .var-inside(); }\n.mix-inner (@var) {\n  border-width: @var;\n}\n\n.mix (@a: 10) {\n  .inner {\n    height: @a * 10;\n\n    .innest {\n      width: @a;\n      .mix-inner(@a * 2);\n    }\n  }\n}\n\n.class {\n  .mix(30);\n}\n.mixin () {\n  zero: 0;\n}\n.mixin (@a: 1px) {\n  one: 1;\n}\n.mixin (@a) {\n  one-req: 1;\n}\n.mixin (@a: 1px, @b: 2px) {\n  two: 2;\n}\n\n.mixin (@a, @b, @c) {\n  three-req: 3;\n}\n\n.mixin (@a: 1px, @b: 2px, @c: 3px) {\n  three: 3;\n}\n\n.zero {\n  .mixin();\n}\n\n.one {\n  .mixin(1);\n}\n\n.two {\n  .mixin(1, 2);\n}\n\n.three {\n  .mixin(1, 2, 3);\n}\n\n//\n\n.mixout ('left') {\n  left: 1;\n}\n\n.mixout ('right') {\n  right: 1;\n}\n\n.left {\n  .mixout('left');\n}\n.right {\n  .mixout('right');\n}\n\n//\n\n.border (@side, @width) {\n  color: black;\n  .border-side(@side, @width);\n}\n.border-side (left, @w) {\n  border-left: @w;\n}\n.border-side (right, @w) {\n  border-right: @w;\n}\n\n.border-right {\n  .border(right, 4px);\n}\n.border-left {\n  .border(left, 4px);\n}\n\n//\n\n\n.border-radius (@r) {\n  both: @r * 10;\n}\n.border-radius (@r, left) {\n  left: @r;\n}\n.border-radius (@r, right) {\n  right: @r;\n}\n\n.only-right {\n  .border-radius(33, right);\n}\n.only-left {\n  .border-radius(33, left);\n}\n.left-right {\n  .border-radius(33);\n}\n.mixin { border: 1px solid black; }\n.mixout { border-color: orange; }\n.borders { border-style: dashed; }\n\n#namespace {\n  .borders {\n    border-style: dotted;\n  }\n  .biohazard {\n    content: \"death\";\n    .man {\n      color: transparent;\n    }\n  }\n}\n#theme {\n  > .mixin {\n    background-color: grey;\n  }\n}\n#container {\n  color: black;\n  .mixin();\n  .mixout();\n  #theme > .mixin();\n}\n\n#header {\n  .milk {\n    color: white;\n    .mixin();\n    #theme > .mixin();\n  }\n  #cookie {\n    .chips {\n      #namespace .borders();\n      .calories {\n        #container();\n      }\n    }\n    .borders();\n  }\n}\n.secure-zone { #namespace .biohazard .man(); }\n.direct {\n  #namespace > .borders();\n}\n#operations {\n  color: #110000 + #000011 + #001100; // #111111\n  height: (10px / 2px) + 6px - 1px * 2; // 9px\n  width: 2 * 4 - 5em; // 3em\n  .spacing {\n    height: (10px / 2px)+6px-1px*2;\n    width: 2  * 4-5em;\n  }\n  subtraction: 20 - 10 - 5 - 5; // 0\n  division: (20 / 5 / 4); // 1\n}\n\n@x: 4;\n@y: 12em;\n\n.with-variables {\n  height: @x + @y; // 16em\n  width: 12 + @y; // 24em\n  size: 5cm - @x; // 1cm\n}\n\n@z: -2;\n\n.negative {\n  height: 2px + @z; // 0px\n  width: 2px - @z; // 4px\n}\n\n.shorthands {\n  padding: -1px 2px 0 -4px; //\n}\n\n.colors {\n  color: #123; // #112233\n  border-color: #234 + #111111; // #334455\n  background-color: #222222 - #fff; // #000000\n  .other {\n    color: 2 * #111; // #222222\n    border-color: (#333333 / 3) + #111; // #222222\n  }\n}\n.parens {\n  @var: 1px;\n  border: (@var * 2) solid black;\n  margin: (@var * 1) (@var + 2) (4 * 4) 3;\n  width: (6 * 6);\n  padding: 2px (6px * 6px);\n}\n\n.more-parens {\n  @var: (2 * 2);\n  padding: (2 * @var) 4 4 (@var * 1px);\n  width: (@var * @var) * 6;\n  height: (7 * 7) + (8 * 8);\n  margin: 4 * ((5 + 5) / 2) - (@var * 2);\n  //margin: (6 * 6)px;\n}\n\n.nested-parens {\n  width: 2 * (4 * (2 + (1 + 6))) - 1;\n  height: ((2+3)*(2+3) / (9-4)) + 1;\n}\n\n.mixed-units {\n  margin: 2px 4em 1 5pc;\n  padding: (2px + 4px) 1em 2px 2;\n}\n#first > .one {\n  > #second .two > #deux {\n    width: 50%;\n    #third {\n      &:focus {\n        color: black;\n        #fifth {\n          > #sixth {\n            .seventh #eighth {\n              + #ninth {\n                color: purple;\n              }\n            }\n          }\n        }\n      }\n      height: 100%;\n    }\n    #fourth, #five, #six {\n      color: #110000;\n      .seven, .eight > #nine {\n        border: 1px solid black;\n      }\n      #ten {\n        color: red;\n      }\n    }\n  }\n  font-size: 2em;\n}\n@x: blue;\n@z: transparent;\n@mix: none;\n\n.mixin {\n  @mix: #989;\n}\n\n.tiny-scope {\n  color: @mix; // #989\n  .mixin();\n}\n\n.scope1 {\n  @y: orange;\n  @z: black;\n  color: @x; // blue\n  border-color: @z; // black\n  .hidden {\n    @x: #131313;\n  }\n  .scope2 {\n    @y: red;\n    color: @x; // blue\n    .scope3 {\n      @local: white;\n      color: @y; // red\n      border-color: @z; // black\n      background-color: @local; // white\n    }\n  }\n}h1, h2, h3 {\n   a, p {\n     &:hover {\n       color: red;\n     }\n   }\n }\n\n#all { color: blue; }\n#the { color: blue; }\n#same { color: blue; }\n\nul, li, div, q, blockquote, textarea {\n  margin: 0;\n}\n\ntd {\n  margin: 0;\n  padding: 0;\n}\n\ntd, input {\n  line-height: 1em;\n}\n#strings {\n  background-image: url(\"http://son-of-a-banana.com\");\n  quotes: \"~\" \"~\";\n  content: \"#*%:&^,)!.(~*})\";\n  empty: \"\";\n  brackets: \"{\" \"}\";\n}\n#comments {\n  content: \"/* hello */ // not-so-secret\";\n}\n#single-quote {\n  quotes: \"'\" \"'\";\n  content: '\"\"#!&\"\"';\n  empty: '';\n}\n@a: 2;\n@x: @a * @a;\n@y: @x + 1;\n@z: @x * 2 + @y;\n\n.variables {\n  width: @z + 1cm; // 14cm\n}\n\n@b: @a * 10;\n@c: #888;\n\n@fonts: \"Trebuchet MS\", Verdana, sans-serif;\n@f: @fonts;\n\n@quotes: \"~\" \"~\";\n@q: @quotes;\n\n.variables {\n  height: @b + @x + 0px; // 24px\n  color: @c;\n  font-family: @f;\n  quotes: @q;\n}\n\n.redefinition {\n  @var: 4;\n  @var: 2;\n  @var: 3;\n  three: @var;\n}\n\n.values {\n  @a: 'Trebuchet';\n  font-family: @a, @a, @a;\n}\n\n\n.whitespace\n{ color: white; }\n\n.whitespace\n{\n  color: white;\n}\n.whitespace\n{ color: white; }\n\n.whitespace{color:white;}\n.whitespace { color : white ; }\n\n.white,\n.space,\n.mania\n{ color: white; }\n\n.no-semi-column { color: white }\n.no-semi-column {\n  color: white;\n  white-space: pre\n}\n.no-semi-column {border: 2px solid white}\n.newlines {\n  background: the,\n  great,\n  wall;\n  border: 2px\n  solid\n  black;\n}\n.empty {\n\n}\n#yelow {\n  #short {\n    color: #fea;\n  }\n  #long {\n    color: #ffeeaa;\n  }\n  #rgba {\n    color: rgba(255, 238, 170, 0.1);\n  }\n}\n\n#blue {\n  #short {\n    color: #00f;\n  }\n  #long {\n    color: #0000ff;\n  }\n  #rgba {\n    color: rgba(0, 0, 255, 0.1);\n  }\n}\n\n#overflow {\n  .a { color: #111111 - #444444; } // #000000\n  .b { color: #eee + #fff; } // #ffffff\n  .c { color: #aaa * 3; } // #ffffff\n  .d { color: #00ee00 + #009900; } // #00ff00\n}\n\n#grey {\n  color: rgb(200, 200, 200);\n}\n\n#808080 {\n  color: hsl(50, 0%, 50%);\n}\n\n#00ff00 {\n  color: hsl(120, 100%, 50%);\n}\n/******************\\\n*                  *\n*  Comment Header  *\n*                  *\n\\******************/\n\n/*\n\n    Comment\n\n*/\n\n/*\n * Comment Test\n *\n * - cloudhead (http://cloudhead.net)\n *\n */\n\n////////////////\n@var: \"content\";\n////////////////\n\n/* Colors\n * ------\n *   #EDF8FC (background blue)\n *   #166C89 (darkest blue)\n *\n * Text:\n *   #333 (standard text) // A comment within a comment!\n *   #1F9EC9 (standard link)\n *\n */\n\n/* @group Variables\n------------------- */\n#comments /* boo */ {\n  /**/ // An empty comment\n  color: red; /* A C-style comment */\n  background-color: orange; // A little comment\n  font-size: 12px;\n\n  /* lost comment */ content: @var;\n\n  border: 1px solid black;\n\n  // padding & margin //\n  padding: 0;\n  margin: 2em;\n} //\n\n/* commented out\n  #more-comments {\n    color: grey;\n  }\n*/\n\n#last { color: blue }\n//\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n  text-shadow: -1px -1px 1px red, 6px 5px 5px yellow;\n  -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset,\n  0pt 4px 6px rgba(255, 255, 255, 0.4) inset;\n}\n@font-face {\n  font-family: Headline;\n  src: local(Futura-Medium),\n  url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n.other {\n  -moz-transform: translate(0, 11em) rotate(-90deg);\n}\np:not([class*=\"lead\"]) {\n  color: black;\n}\n\ninput[type=\"text\"].class#id[attr=32]:not(1) {\n                                      color: white;\n                                    }\n\ndiv#id.class[a=1][b=2].class:not(1) {\n                        color: white;\n                      }\n\nul.comma > li:not(:only-child)::after {\n  color: white;\n}\n\nol.comma > li:nth-last-child(2)::after {\n  color: white;\n}\n\nli:nth-child(4n+1),\nli:nth-child(-5n),\nli:nth-child(-n+2) {\n  color: white;\n}\n\na[href^=\"http://\"] {\n  color: black;\n}\n\na[href$=\"http://\"] {\n  color: black;\n}\n\nform[data-disabled] {\n  color: black;\n}\n\np::before {\n  color: black;\n}\n@charset \"utf-8\";\ndiv { color: black; }\ndiv { width: 99%; }\n\n* {\n  min-width: 45em;\n}\n\nh1, h2 > a > p, h3 {\n  color: none;\n}\n\ndiv.class {\n  color: blue;\n}\n\ndiv#id {\n  color: green;\n}\n\n.class#id {\n  color: purple;\n}\n\n.one.two.three {\n  color: grey;\n}\n\n@media print {\n  font-size: 3em;\n}\n\n@media screen {\n  font-size: 10px;\n}\n\n@font-face {\n  font-family: 'Garamond Pro';\n  src: url(\"/fonts/garamond-pro.ttf\");\n}\n\na:hover, a:link {\n  color: #999;\n}\n\np, p:first-child {\n  text-transform: none;\n}\n\nq:lang(no) {\n  quotes: none;\n}\n\np + h1 {\n  font-size: 2.2em;\n}\n\n#shorthands {\n  border: 1px solid #000;\n  font: 12px/16px Arial;\n  margin: 1px 0;\n  padding: 0 auto;\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n\n#more-shorthands {\n  margin: 0;\n  padding: 1px 0 2px 0;\n  font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;\n}\n\n.misc {\n  -moz-border-radius: 2px;\n  display: -moz-inline-stack;\n  width: .1em;\n  background-color: #009998;\n  background-image: url(images/image.jpg);\n  background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));\n  margin: ;\n}\n\n#important {\n  color: red !important;\n  width: 100%!important;\n  height: 20px ! important;\n}\n\n#functions {\n  @var: 10;\n  color: color(\"red\");\n  width: increment(15);\n  height: undefined(\"self\");\n  border-width: add(2, 3);\n  variable: increment(@var);\n}\n\n#built-in {\n  @r: 32;\n  escaped: e(\"-Some::weird(#thing, y)\");\n  lighten: lighten(#ff0000, 50%);\n  darken: darken(#ff0000, 50%);\n  saturate: saturate(#29332f, 20%);\n  desaturate: desaturate(#203c31, 20%);\n  greyscale: greyscale(#203c31);\n  format: %(\"rgb(%d, %d, %d)\", @r, 128, 64);\n  format-string: %(\"hello %s\", \"world\");\n  eformat: e(%(\"rgb(%d, %d, %d)\", @r, 128, 64));\n}\n\n@var: @a;\n@a: 100%;\n\n.lazy-eval {\n  width: @var;\n}\n.mixin (@a: 1px, @b: 50%) {\n  width: @a * 5;\n  height: @b - 1%;\n}\n\n.mixina (@style, @width, @color: black) {\n  border: @width @style @color;\n}\n\n.mixiny\n(@a: 0, @b: 0) {\n  margin: @a;\n  padding: @b;\n}\n\n.hidden() {\n  color: transparent;\n}\n\n.two-args {\n  color: blue;\n  .mixin(2px, 100%);\n  .mixina(dotted, 2px);\n}\n\n.one-arg {\n  .mixin(3px);\n}\n\n.no-parens {\n  .mixin();\n}\n\n.no-args {\n  .mixin();\n}\n\n.var-args {\n  @var: 9;\n  .mixin(@var, @var * 2);\n}\n\n.multi-mix {\n  .mixin(2px, 30%);\n  .mixiny(4, 5);\n}\n\n.maxa(@arg1: 10, @arg2: #f00) {\n  padding: @arg1 * 2px;\n  color: @arg2;\n}\n\nbody {\n  .maxa(15);\n}\n\n@glob: 5;\n.global-mixin(@a:2) {\n  width: @glob + @a;\n}\n\n.scope-mix {\n  .global-mixin(3);\n}\n\n.nested-ruleset (@width: 200px) {\n  width: @width;\n  .column { margin: @width; }\n}\n.content {\n  .nested-ruleset(600px);\n}\n\n//\n\n.same-var-name2(@radius) {\n  radius: @radius;\n}\n.same-var-name(@radius) {\n  .same-var-name2(@radius);\n}\n#same-var-name {\n  .same-var-name(5px);\n}\n\n//\n\n.var-inside () {\n  @var: 10px;\n  width: @var;\n}\n#var-inside { .var-inside(); }\n.mix-inner (@var) {\n  border-width: @var;\n}\n\n.mix (@a: 10) {\n  .inner {\n    height: @a * 10;\n\n    .innest {\n      width: @a;\n      .mix-inner(@a * 2);\n    }\n  }\n}\n\n.class {\n  .mix(30);\n}\n.mixin () {\n  zero: 0;\n}\n.mixin (@a: 1px) {\n  one: 1;\n}\n.mixin (@a) {\n  one-req: 1;\n}\n.mixin (@a: 1px, @b: 2px) {\n  two: 2;\n}\n\n.mixin (@a, @b, @c) {\n  three-req: 3;\n}\n\n.mixin (@a: 1px, @b: 2px, @c: 3px) {\n  three: 3;\n}\n\n.zero {\n  .mixin();\n}\n\n.one {\n  .mixin(1);\n}\n\n.two {\n  .mixin(1, 2);\n}\n\n.three {\n  .mixin(1, 2, 3);\n}\n\n//\n\n.mixout ('left') {\n  left: 1;\n}\n\n// ============================================================================\n// v2.0+ Features: Extend, Guards, Imports, Property Merging, Detached Rulesets\n// ============================================================================\n\n// --- Imports ---\n@import \"benchmark-import-target.less\";\n@import (reference) \"benchmark-import-reference-target.less\";\n\n// --- Extend ---\n// Basic extend\n.base-button {\n  display: inline-block;\n  padding: 8px 16px;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  cursor: pointer;\n  font-size: 14px;\n  text-align: center;\n}\n\n.action-button:extend(.base-button) {\n  background: #3498db;\n  color: #fff;\n}\n\n.cancel-button:extend(.base-button) {\n  background: #e74c3c;\n  color: #fff;\n}\n\n// Extend all\n.nav-base {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n  li {\n    display: inline-block;\n    a {\n      text-decoration: none;\n      padding: 8px 12px;\n      color: #333;\n    }\n  }\n}\n\n.main-nav:extend(.nav-base all) {\n  background: #f8f9fa;\n  border-bottom: 1px solid #dee2e6;\n}\n\n.side-nav:extend(.nav-base all) {\n  background: #343a40;\n  li a {\n    color: #fff;\n  }\n}\n\n// Extend from imported reference\n.my-button:extend(.ref-button) {}\n.my-primary-button:extend(.ref-button all) {}\n.my-alert:extend(.ref-alert all) {}\n.my-grid:extend(.ref-grid-system all) {}\n\n// Nested extend\n.panel {\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  .panel-heading {\n    padding: 10px 15px;\n    background: #f5f5f5;\n    border-bottom: 1px solid #ddd;\n  }\n  .panel-body {\n    padding: 15px;\n  }\n  .panel-footer {\n    padding: 10px 15px;\n    background: #f5f5f5;\n    border-top: 1px solid #ddd;\n  }\n}\n\n.card {\n  &:extend(.panel all);\n  box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.widget {\n  &:extend(.panel all);\n  margin-bottom: 20px;\n}\n\n// Extend with pseudo-classes\n.link-base {\n  color: #3498db;\n  text-decoration: none;\n  &:hover {\n    color: #2980b9;\n    text-decoration: underline;\n  }\n  &:visited {\n    color: #8e44ad;\n  }\n  &:active {\n    color: #e74c3c;\n  }\n}\n\n.nav-link:extend(.link-base all) {\n  font-weight: bold;\n}\n\n// --- Guards ---\n.generate-spacing(@n, @i: 1) when (@i =< @n) {\n  .m-@{i} { margin: (@i * 4px); }\n  .p-@{i} { padding: (@i * 4px); }\n  .mt-@{i} { margin-top: (@i * 4px); }\n  .mb-@{i} { margin-bottom: (@i * 4px); }\n  .ml-@{i} { margin-left: (@i * 4px); }\n  .mr-@{i} { margin-right: (@i * 4px); }\n  .pt-@{i} { padding-top: (@i * 4px); }\n  .pb-@{i} { padding-bottom: (@i * 4px); }\n  .pl-@{i} { padding-left: (@i * 4px); }\n  .pr-@{i} { padding-right: (@i * 4px); }\n  .generate-spacing(@n, (@i + 1));\n}\n.generate-spacing(10);\n\n.generate-font-sizes(@n, @i: 1) when (@i =< @n) {\n  .fs-@{i} { font-size: (10px + @i * 2); }\n  .generate-font-sizes(@n, (@i + 1));\n}\n.generate-font-sizes(12);\n\n.generate-widths(@n, @i: 1) when (@i =< @n) {\n  .w-@{i} { width: percentage((@i / @n)); }\n  .generate-widths(@n, (@i + 1));\n}\n.generate-widths(12);\n\n// Guards with multiple conditions\n.responsive-mixin(@size) when (@size < 576px) {\n  font-size: 12px;\n  padding: 4px;\n}\n.responsive-mixin(@size) when (@size >= 576px) and (@size < 768px) {\n  font-size: 14px;\n  padding: 8px;\n}\n.responsive-mixin(@size) when (@size >= 768px) and (@size < 992px) {\n  font-size: 16px;\n  padding: 12px;\n}\n.responsive-mixin(@size) when (@size >= 992px) {\n  font-size: 18px;\n  padding: 16px;\n}\n\n.sm { .responsive-mixin(400px); }\n.md { .responsive-mixin(700px); }\n.lg { .responsive-mixin(800px); }\n.xl { .responsive-mixin(1200px); }\n\n// Type-checking guards\n.type-guard(@val) when (isnumber(@val)) {\n  width: @val;\n}\n.type-guard(@val) when (iscolor(@val)) {\n  color: @val;\n}\n.type-guard(@val) when (isstring(@val)) {\n  content: @val;\n}\n\n.guard-number { .type-guard(100px); }\n.guard-color { .type-guard(#ff0000); }\n.guard-string { .type-guard(\"hello\"); }\n\n// --- Property Merging ---\n.shadow-base {\n  box-shadow+: 0 1px 3px rgba(0,0,0,0.12);\n}\n.shadow-elevated {\n  .shadow-base();\n  box-shadow+: 0 4px 6px rgba(0,0,0,0.1);\n}\n.shadow-floating {\n  .shadow-elevated();\n  box-shadow+: 0 10px 20px rgba(0,0,0,0.15);\n}\n\n.transform-base {\n  transform+_: translateX(10px);\n}\n.transform-combo {\n  .transform-base();\n  transform+_: rotate(45deg);\n  transform+_: scale(1.2);\n}\n\n.transition-multi {\n  transition+: color 0.3s ease;\n  transition+: background 0.3s ease;\n  transition+: border-color 0.3s ease;\n  transition+: box-shadow 0.3s ease;\n}\n\n.font-stack {\n  font-family+: \"Helvetica Neue\";\n  font-family+: Arial;\n  font-family+: sans-serif;\n}\n\n// --- Detached Rulesets ---\n@media-mobile: {\n  font-size: 14px;\n  padding: 8px;\n  margin: 4px;\n};\n\n@media-desktop: {\n  font-size: 16px;\n  padding: 16px;\n  margin: 8px;\n};\n\n@theme-light: {\n  background: #ffffff;\n  color: #333333;\n  border-color: #dddddd;\n};\n\n@theme-dark: {\n  background: #1a1a2e;\n  color: #eaeaea;\n  border-color: #444444;\n};\n\n.mobile-component {\n  @media-mobile();\n  border: 1px solid #ccc;\n}\n\n.desktop-component {\n  @media-desktop();\n  border: 1px solid #999;\n}\n\n.light-section {\n  @theme-light();\n  .heading { font-weight: bold; }\n}\n\n.dark-section {\n  @theme-dark();\n  .heading { font-weight: bold; }\n}\n\n// Detached rulesets passed as arguments\n.apply-theme(@theme) {\n  @theme();\n  padding: 20px;\n  border-radius: 8px;\n}\n\n.themed-card-light {\n  .apply-theme(@theme-light);\n}\n.themed-card-dark {\n  .apply-theme(@theme-dark);\n}\n\n// --- Complex Nesting & Selectors ---\n.component {\n  display: block;\n  & + & { margin-top: 16px; }\n  & > &-inner { padding: 8px; }\n  &&-active { background: #e8f4fd; }\n  &-header, &-footer { padding: 12px; }\n  &-body {\n    padding: 16px;\n    &--large { padding: 24px; }\n    &--compact { padding: 8px; }\n  }\n}\n\n// --- Color Functions Stress ---\n@base-hue: 210;\n.color-gen(@i) when (@i > 0) {\n  .color-@{i} {\n    color: hsl(@base-hue, percentage((@i / 20)), 50%);\n    background: lighten(hsl(@base-hue, 80%, 50%), @i * 2%);\n    border-color: darken(hsl(@base-hue, 80%, 50%), @i * 2%);\n    outline-color: spin(hsl(@base-hue, 80%, 50%), @i * 15);\n    text-shadow: 0 1px 0 fade(#000, @i * 5%);\n    box-shadow: 0 0 (@i * 1px) saturate(hsl(@base-hue, 50%, 50%), @i * 3%);\n  }\n  .color-gen((@i - 1));\n}\n.color-gen(20);\n\n// --- String Interpolation & Escaping ---\n@base-url: \"/assets/images\";\n@icon-prefix: \"icon\";\n.generate-icons(@n, @i: 1) when (@i =< @n) {\n  .@{icon-prefix}-@{i} {\n    background-image: url(\"@{base-url}/@{icon-prefix}-@{i}.svg\");\n    width: (16px + @i * 2);\n    height: (16px + @i * 2);\n  }\n  .generate-icons(@n, (@i + 1));\n}\n.generate-icons(20);\n\n// --- Namespaces ---\n#util {\n  .clearfix() {\n    &::after {\n      content: \"\";\n      display: table;\n      clear: both;\n    }\n  }\n  .ellipsis() {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .visually-hidden() {\n    position: absolute;\n    width: 1px;\n    height: 1px;\n    padding: 0;\n    margin: -1px;\n    overflow: hidden;\n    clip: rect(0, 0, 0, 0);\n    border: 0;\n  }\n  .center-block() {\n    display: block;\n    margin-left: auto;\n    margin-right: auto;\n  }\n}\n\n.container { #util > .clearfix(); }\n.title { #util > .ellipsis(); }\n.sr-only { #util > .visually-hidden(); }\n.image { #util > .center-block(); }\n\n// --- Math & Unit Functions ---\n.math-stress {\n  a: ceil(4.3px);\n  b: floor(4.7px);\n  c: round(4.567px, 2);\n  d: percentage(0.5);\n  e: sqrt(25px);\n  f: abs(-18px);\n  g: min(3px, 42px, 1px, 16px);\n  h: max(3px, 42px, 1px, 16px);\n  i: mod(11px, 3);\n  j: convert(1s, ms);\n  k: unit(5em, px);\n  l: unit(100px);\n}\n\n// --- Large Loop Stress (recursive mixin) ---\n.gen-grid(@cols, @i: 1) when (@i =< @cols) {\n  .grid-col-@{i}-of-@{cols} {\n    width: percentage((@i / @cols));\n    float: left;\n    padding: 0 15px;\n    box-sizing: border-box;\n  }\n  .grid-push-@{i}-of-@{cols} {\n    margin-left: percentage((@i / @cols));\n  }\n  .grid-pull-@{i}-of-@{cols} {\n    margin-right: percentage((@i / @cols));\n  }\n  .grid-offset-@{i}-of-@{cols} {\n    margin-left: percentage((@i / @cols));\n  }\n  .gen-grid(@cols, (@i + 1));\n}\n.gen-grid(24);\n\n// --- Deeply Nested Extend Chains ---\n.typography-base {\n  font-family: sans-serif;\n  line-height: 1.6;\n}\n.heading-base:extend(.typography-base) {\n  font-weight: bold;\n  margin-bottom: 0.5em;\n}\nh1:extend(.heading-base) { font-size: 2.5em; }\nh2:extend(.heading-base) { font-size: 2em; }\nh3:extend(.heading-base) { font-size: 1.75em; }\nh4:extend(.heading-base) { font-size: 1.5em; }\nh5:extend(.heading-base) { font-size: 1.25em; }\nh6:extend(.heading-base) { font-size: 1em; }\n\n.prose {\n  h1:extend(h1) {}\n  h2:extend(h2) {}\n  h3:extend(h3) {}\n  p:extend(.typography-base) {\n    margin-bottom: 1em;\n  }\n}\n\n// --- Mixin with Variable Argument Lists ---\n.multi-bg(@bgs...) {\n  background: @bgs;\n}\n.hero-section {\n  .multi-bg(\n    linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.3)),\n    url(\"/images/hero.jpg\") center/cover no-repeat\n  );\n  min-height: 400px;\n}\n\n// --- Scope & Variable Hoisting Stress ---\n.scope-outer {\n  @var: outer;\n  .scope-inner {\n    @var: inner;\n    .scope-deepest {\n      content: @var;\n      @var: deepest;\n    }\n    content: @var;\n  }\n  content: @var;\n}\n\n// --- Guard + Extend Combo ---\n.status-mixin(@type) when (@type = success) {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n.status-mixin(@type) when (@type = warning) {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n.status-mixin(@type) when (@type = danger) {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n.status-mixin(@type) when (@type = info) {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n.alert-success { .status-mixin(success); }\n.alert-warning { .status-mixin(warning); }\n.alert-danger { .status-mixin(danger); }\n.alert-info { .status-mixin(info); }\n.toast-success:extend(.alert-success all) {}\n.toast-warning:extend(.alert-warning all) {}\n.toast-danger:extend(.alert-danger all) {}\n.toast-info:extend(.alert-info all) {}"
  },
  {
    "path": "packages/less/benchmark/index.js",
    "content": "import path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\nimport less from '../lib/less-node/index.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nlet file = path.join(__dirname, 'benchmark.less');\n\nif (process.argv[2]) { file = path.resolve(process.argv[2]); }\n\nfs.readFile(file, 'utf8', function (e, data) {\n    console.log('Benchmarking...\\n', path.basename(file) + ' (' +\n             parseInt(data.length / 1024) + ' KB)', '');\n\n    const renderBenchmark = [];\n    const parserBenchmark = [];\n    const evalBenchmark = [];\n\n    const totalruns = 30;\n    const ignoreruns = 5;\n\n    let i = 0;\n\n    nextRun();\n\n    function nextRun() {\n        const start = performance.now();\n\n        less.parse(data, { filename: file, paths: [path.dirname(file)] }, function(err, root, imports, options) {\n            if (err) {\n                console.log(err);\n                process.exit(3);\n            }\n            const parserEnd = performance.now();\n\n            const tree = new less.ParseTree(root, imports);\n            tree.toCSS(options);\n\n            const renderEnd = performance.now();\n\n            renderBenchmark.push(renderEnd - start);\n            parserBenchmark.push(parserEnd - start);\n            evalBenchmark.push(renderEnd - parserEnd);\n\n            i += 1;\n            if (i < totalruns) {\n                nextRun();\n            }\n            else {\n                finish();\n            }\n        });\n    }\n\n    function finish() {\n        function analyze(benchmark, benchMarkData) {\n            console.log('----------------------');\n            console.log(benchmark);\n            console.log('----------------------');\n            let totalTime = 0;\n            let mintime = Infinity;\n            let maxtime = 0;\n            for (let i = ignoreruns; i < totalruns; i++) {\n                totalTime += benchMarkData[i];\n                mintime = Math.min(mintime, benchMarkData[i]);\n                maxtime = Math.max(maxtime, benchMarkData[i]);\n            }\n            const avgtime = totalTime / (totalruns - ignoreruns);\n            const variation = maxtime - mintime;\n            const variationperc = (variation / avgtime) * 100;\n\n            console.log('Min. Time: ' + Math.round(mintime) + ' ms');\n            console.log('Max. Time: ' + Math.round(maxtime) + ' ms');\n            console.log('Total Average Time: ' + Math.round(avgtime) + ' ms (' +\n                parseInt(1000 / avgtime *\n                data.length / 1024) + ' KB\\/s)');\n            console.log('+/- ' + Math.round(variationperc) + '%');\n            console.log('');\n        }\n\n        analyze('Parsing', parserBenchmark);\n        analyze('Evaluation', evalBenchmark);\n        analyze('Render Time', renderBenchmark);\n    }\n});\n"
  },
  {
    "path": "packages/less/benchmark/results/.gitignore",
    "content": "# Legacy flat files (migrated to runs/ + latest/)\nsystem-info.json\nbenchmark-results.json\nv*.json\n"
  },
  {
    "path": "packages/less/benchmark/results/latest/macbook-pro_arm64.json",
    "content": "{\n  \"system\": {\n    \"system_id\": \"macbook-pro_arm64\",\n    \"hostname\": \"MacBook-Pro.local\",\n    \"platform\": \"Darwin\",\n    \"arch\": \"arm64\",\n    \"os_version\": \"25.3.0\",\n    \"cpus\": \"14\",\n    \"cpu_model\": \"Apple M4 Pro\",\n    \"total_memory_gb\": 48.0,\n    \"node_version\": \"v24.11.1\",\n    \"date\": \"2026-03-09T21:34:11Z\"\n  },\n  \"versions\": [\n    {\n      \"tag\": \"v2.0.0\",\n      \"version\": \"2.0.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:21Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 29.27,\n            \"max\": 87.45,\n            \"avg\": 46.87,\n            \"median\": 46.89,\n            \"stddev\": 16.56,\n            \"variance_pct\": 35.33,\n            \"samples\": 12,\n            \"throughput_kbs\": 2224\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.1.2\",\n      \"version\": \"2.1.2\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:26Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"error\": \"Extra data: line 2 column 1 (char 283)\"\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.2.0\",\n      \"version\": \"2.2.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:42Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.2.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 28.99,\n            \"max\": 62.52,\n            \"avg\": 38.51,\n            \"median\": 31.32,\n            \"stddev\": 12.38,\n            \"variance_pct\": 32.15,\n            \"samples\": 12,\n            \"throughput_kbs\": 2706\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.3.1\",\n      \"version\": \"2.3.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:47Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.3.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 30.8,\n            \"max\": 63.72,\n            \"avg\": 38.42,\n            \"median\": 33.57,\n            \"stddev\": 11.47,\n            \"variance_pct\": 29.85,\n            \"samples\": 12,\n            \"throughput_kbs\": 2713\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.4.0\",\n      \"version\": \"2.4.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:52Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.4.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 27.39,\n            \"max\": 57.2,\n            \"avg\": 35.24,\n            \"median\": 31.11,\n            \"stddev\": 9.93,\n            \"variance_pct\": 28.18,\n            \"samples\": 12,\n            \"throughput_kbs\": 2957\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.5.3\",\n      \"version\": \"2.5.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:56Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.5.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 29.83,\n            \"max\": 63.6,\n            \"avg\": 37.57,\n            \"median\": 30.87,\n            \"stddev\": 11.91,\n            \"variance_pct\": 31.69,\n            \"samples\": 12,\n            \"throughput_kbs\": 2774\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.6.1\",\n      \"version\": \"2.6.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:02Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.6.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 33.64,\n            \"max\": 69,\n            \"avg\": 42.08,\n            \"median\": 37.52,\n            \"stddev\": 11.96,\n            \"variance_pct\": 28.41,\n            \"samples\": 12,\n            \"throughput_kbs\": 2477\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.7.3\",\n      \"version\": \"2.7.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:08Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.7.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 33.99,\n            \"max\": 72.46,\n            \"avg\": 44.36,\n            \"median\": 36.95,\n            \"stddev\": 13,\n            \"variance_pct\": 29.29,\n            \"samples\": 12,\n            \"throughput_kbs\": 2349\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.0.4\",\n      \"version\": \"3.0.4\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:14Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.0.4\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 37.07,\n            \"max\": 75.95,\n            \"avg\": 43.98,\n            \"median\": 39.29,\n            \"stddev\": 10.66,\n            \"variance_pct\": 24.25,\n            \"samples\": 12,\n            \"throughput_kbs\": 2370\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.5.3\",\n      \"version\": \"3.5.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:18Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.5.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 35.09,\n            \"max\": 52.73,\n            \"avg\": 43.96,\n            \"median\": 42.4,\n            \"stddev\": 5.5,\n            \"variance_pct\": 12.5,\n            \"samples\": 12,\n            \"throughput_kbs\": 2371\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.6.0\",\n      \"version\": \"3.6.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:23Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.6.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 37.97,\n            \"max\": 49.87,\n            \"avg\": 42.39,\n            \"median\": 40.92,\n            \"stddev\": 3.8,\n            \"variance_pct\": 8.97,\n            \"samples\": 12,\n            \"throughput_kbs\": 2459\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.6.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.16,\n            \"max\": 4.09,\n            \"avg\": 2.94,\n            \"median\": 2.87,\n            \"stddev\": 0.63,\n            \"variance_pct\": 21.61,\n            \"samples\": 12,\n            \"throughput_kbs\": 1076\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.7.1\",\n      \"version\": \"3.7.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:28Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.7.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 37.82,\n            \"max\": 52.26,\n            \"avg\": 43.33,\n            \"median\": 40.85,\n            \"stddev\": 4.7,\n            \"variance_pct\": 10.84,\n            \"samples\": 12,\n            \"throughput_kbs\": 2405\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.7.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.02,\n            \"max\": 3.55,\n            \"avg\": 2.74,\n            \"median\": 2.89,\n            \"stddev\": 0.52,\n            \"variance_pct\": 19.1,\n            \"samples\": 12,\n            \"throughput_kbs\": 1154\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.7.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.63,\n            \"max\": 3.59,\n            \"avg\": 2.81,\n            \"median\": 2.9,\n            \"stddev\": 0.67,\n            \"variance_pct\": 23.77,\n            \"samples\": 12,\n            \"throughput_kbs\": 788\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.8.1\",\n      \"version\": \"3.8.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:35Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.8.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 38.31,\n            \"max\": 49.98,\n            \"avg\": 43.22,\n            \"median\": 41.04,\n            \"stddev\": 4.17,\n            \"variance_pct\": 9.64,\n            \"samples\": 12,\n            \"throughput_kbs\": 2412\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.8.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.06,\n            \"max\": 3.99,\n            \"avg\": 2.98,\n            \"median\": 2.91,\n            \"stddev\": 0.66,\n            \"variance_pct\": 22.1,\n            \"samples\": 12,\n            \"throughput_kbs\": 1062\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.8.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.8,\n            \"max\": 4.64,\n            \"avg\": 3.22,\n            \"median\": 3.06,\n            \"stddev\": 0.91,\n            \"variance_pct\": 28.34,\n            \"samples\": 12,\n            \"throughput_kbs\": 688\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.9.0\",\n      \"version\": \"3.9.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:41Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 38.78,\n            \"max\": 54.91,\n            \"avg\": 44.19,\n            \"median\": 40.7,\n            \"stddev\": 5.9,\n            \"variance_pct\": 13.35,\n            \"samples\": 12,\n            \"throughput_kbs\": 2358\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.16,\n            \"max\": 4.04,\n            \"avg\": 3.01,\n            \"median\": 3.04,\n            \"stddev\": 0.62,\n            \"variance_pct\": 20.71,\n            \"samples\": 12,\n            \"throughput_kbs\": 1051\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.68,\n            \"max\": 4.06,\n            \"avg\": 2.87,\n            \"median\": 2.87,\n            \"stddev\": 0.76,\n            \"variance_pct\": 26.57,\n            \"samples\": 12,\n            \"throughput_kbs\": 774\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.06,\n            \"max\": 8.97,\n            \"avg\": 4.06,\n            \"median\": 3.91,\n            \"stddev\": 1.85,\n            \"variance_pct\": 45.62,\n            \"samples\": 12,\n            \"throughput_kbs\": 375\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.10.3\",\n      \"version\": \"3.10.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:52Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 118.01,\n            \"max\": 152.74,\n            \"avg\": 130.23,\n            \"median\": 126.14,\n            \"stddev\": 10.09,\n            \"variance_pct\": 7.75,\n            \"samples\": 12,\n            \"throughput_kbs\": 800\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 3.64,\n            \"max\": 9.65,\n            \"avg\": 5.79,\n            \"median\": 5.61,\n            \"stddev\": 1.75,\n            \"variance_pct\": 30.26,\n            \"samples\": 12,\n            \"throughput_kbs\": 546\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 3.84,\n            \"max\": 10.64,\n            \"avg\": 6.08,\n            \"median\": 5.57,\n            \"stddev\": 1.81,\n            \"variance_pct\": 29.73,\n            \"samples\": 12,\n            \"throughput_kbs\": 365\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 9.19,\n            \"max\": 16.24,\n            \"avg\": 11.6,\n            \"median\": 10.95,\n            \"stddev\": 2.13,\n            \"variance_pct\": 18.39,\n            \"samples\": 12,\n            \"throughput_kbs\": 131\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.11.3\",\n      \"version\": \"3.11.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:36:02Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 123.6,\n            \"max\": 184.63,\n            \"avg\": 141.98,\n            \"median\": 135.73,\n            \"stddev\": 17,\n            \"variance_pct\": 11.97,\n            \"samples\": 12,\n            \"throughput_kbs\": 734\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 4.07,\n            \"max\": 10.74,\n            \"avg\": 6.67,\n            \"median\": 6.18,\n            \"stddev\": 1.94,\n            \"variance_pct\": 29.07,\n            \"samples\": 12,\n            \"throughput_kbs\": 474\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 5.7,\n            \"max\": 10.64,\n            \"avg\": 7.81,\n            \"median\": 7.46,\n            \"stddev\": 1.39,\n            \"variance_pct\": 17.78,\n            \"samples\": 12,\n            \"throughput_kbs\": 284\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 6.23,\n            \"max\": 14.21,\n            \"avg\": 7.67,\n            \"median\": 6.97,\n            \"stddev\": 2.09,\n            \"variance_pct\": 27.21,\n            \"samples\": 12,\n            \"throughput_kbs\": 198\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.12.2\",\n      \"version\": \"3.12.2\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:36:16Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 165.65,\n            \"max\": 209.38,\n            \"avg\": 187.15,\n            \"median\": 185.42,\n            \"stddev\": 12.88,\n            \"variance_pct\": 6.88,\n            \"samples\": 12,\n            \"throughput_kbs\": 557\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 3.76,\n            \"max\": 9.79,\n            \"avg\": 5.58,\n            \"median\": 5.53,\n            \"stddev\": 1.63,\n            \"variance_pct\": 29.32,\n            \"samples\": 12,\n            \"throughput_kbs\": 567\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 4.22,\n            \"max\": 8.17,\n            \"avg\": 5.92,\n            \"median\": 5.82,\n            \"stddev\": 1.04,\n            \"variance_pct\": 17.62,\n            \"samples\": 12,\n            \"throughput_kbs\": 375\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 7.43,\n            \"max\": 21.7,\n            \"avg\": 10.87,\n            \"median\": 9.85,\n            \"stddev\": 3.5,\n            \"variance_pct\": 32.22,\n            \"samples\": 12,\n            \"throughput_kbs\": 140\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.0.0\",\n      \"version\": \"4.0.0\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:27Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 35.71,\n            \"max\": 68.55,\n            \"avg\": 44.82,\n            \"median\": 39.85,\n            \"stddev\": 10.75,\n            \"variance_pct\": 24,\n            \"samples\": 12,\n            \"throughput_kbs\": 2326\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 0,\n          \"errors\": [\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            }\n          ],\n          \"render\": null\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 0,\n          \"errors\": [\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            }\n          ],\n          \"render\": null\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.9,\n            \"max\": 11.57,\n            \"avg\": 4,\n            \"median\": 3.28,\n            \"stddev\": 2.63,\n            \"variance_pct\": 65.62,\n            \"samples\": 12,\n            \"throughput_kbs\": 380\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.1.3\",\n      \"version\": \"4.1.3\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:35Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 35.55,\n            \"max\": 68.29,\n            \"avg\": 43.74,\n            \"median\": 39.45,\n            \"stddev\": 10.63,\n            \"variance_pct\": 24.31,\n            \"samples\": 12,\n            \"throughput_kbs\": 2383\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.51,\n            \"max\": 4.32,\n            \"avg\": 2.59,\n            \"median\": 2.52,\n            \"stddev\": 0.88,\n            \"variance_pct\": 34,\n            \"samples\": 12,\n            \"throughput_kbs\": 1220\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.69,\n            \"max\": 4.27,\n            \"avg\": 3,\n            \"median\": 3.18,\n            \"stddev\": 0.8,\n            \"variance_pct\": 26.75,\n            \"samples\": 12,\n            \"throughput_kbs\": 738\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.86,\n            \"max\": 11.57,\n            \"avg\": 4,\n            \"median\": 3.49,\n            \"stddev\": 2.58,\n            \"variance_pct\": 64.45,\n            \"samples\": 12,\n            \"throughput_kbs\": 380\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.2.2\",\n      \"version\": \"4.2.2\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:43Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 33.06,\n            \"max\": 71.26,\n            \"avg\": 41.5,\n            \"median\": 35.42,\n            \"stddev\": 12.93,\n            \"variance_pct\": 31.15,\n            \"samples\": 12,\n            \"throughput_kbs\": 2511\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.68,\n            \"max\": 4.18,\n            \"avg\": 2.67,\n            \"median\": 2.69,\n            \"stddev\": 0.79,\n            \"variance_pct\": 29.71,\n            \"samples\": 12,\n            \"throughput_kbs\": 1184\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.97,\n            \"max\": 10.6,\n            \"avg\": 3.77,\n            \"median\": 3.76,\n            \"stddev\": 2.2,\n            \"variance_pct\": 58.39,\n            \"samples\": 12,\n            \"throughput_kbs\": 587\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.35,\n            \"max\": 9.8,\n            \"avg\": 4.85,\n            \"median\": 4.98,\n            \"stddev\": 2.16,\n            \"variance_pct\": 44.58,\n            \"samples\": 12,\n            \"throughput_kbs\": 314\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.3.0\",\n      \"version\": \"4.3.0\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:54Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 34.18,\n            \"max\": 73.61,\n            \"avg\": 43.07,\n            \"median\": 37.23,\n            \"stddev\": 12.22,\n            \"variance_pct\": 28.38,\n            \"samples\": 12,\n            \"throughput_kbs\": 2420\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.63,\n            \"max\": 3.81,\n            \"avg\": 2.52,\n            \"median\": 2.45,\n            \"stddev\": 0.75,\n            \"variance_pct\": 29.7,\n            \"samples\": 12,\n            \"throughput_kbs\": 1254\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.01,\n            \"max\": 9.44,\n            \"avg\": 3.51,\n            \"median\": 3.37,\n            \"stddev\": 1.9,\n            \"variance_pct\": 54.29,\n            \"samples\": 12,\n            \"throughput_kbs\": 632\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.22,\n            \"max\": 9.85,\n            \"avg\": 4.7,\n            \"median\": 4.26,\n            \"stddev\": 2.16,\n            \"variance_pct\": 46.07,\n            \"samples\": 12,\n            \"throughput_kbs\": 324\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.4.2\",\n      \"version\": \"4.4.2\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:37:06Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 34.87,\n            \"max\": 73.71,\n            \"avg\": 45.83,\n            \"median\": 40.47,\n            \"stddev\": 11.86,\n            \"variance_pct\": 25.87,\n            \"samples\": 12,\n            \"throughput_kbs\": 2274\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.55,\n            \"max\": 3.67,\n            \"avg\": 2.53,\n            \"median\": 2.53,\n            \"stddev\": 0.66,\n            \"variance_pct\": 26.12,\n            \"samples\": 12,\n            \"throughput_kbs\": 1249\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.51,\n            \"max\": 10.07,\n            \"avg\": 3.59,\n            \"median\": 3.48,\n            \"stddev\": 2.11,\n            \"variance_pct\": 58.91,\n            \"samples\": 12,\n            \"throughput_kbs\": 618\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.47,\n            \"max\": 10.4,\n            \"avg\": 4.92,\n            \"median\": 4.59,\n            \"stddev\": 2.24,\n            \"variance_pct\": 45.65,\n            \"samples\": 12,\n            \"throughput_kbs\": 310\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.5.1\",\n      \"version\": \"4.5.1\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:37:14Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 39.63,\n            \"max\": 72.55,\n            \"avg\": 47.4,\n            \"median\": 42.16,\n            \"stddev\": 11.09,\n            \"variance_pct\": 23.39,\n            \"samples\": 12,\n            \"throughput_kbs\": 2199\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.61,\n            \"max\": 3.47,\n            \"avg\": 2.57,\n            \"median\": 2.62,\n            \"stddev\": 0.67,\n            \"variance_pct\": 26.21,\n            \"samples\": 12,\n            \"throughput_kbs\": 1231\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.65,\n            \"max\": 9.51,\n            \"avg\": 3.79,\n            \"median\": 3.62,\n            \"stddev\": 1.96,\n            \"variance_pct\": 51.77,\n            \"samples\": 12,\n            \"throughput_kbs\": 585\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.18,\n            \"max\": 10.1,\n            \"avg\": 4.62,\n            \"median\": 4.73,\n            \"stddev\": 2.14,\n            \"variance_pct\": 46.29,\n            \"samples\": 12,\n            \"throughput_kbs\": 330\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/less/benchmark/results/runs/2026-03-09T21-34-11Z_macbook-pro_arm64.json",
    "content": "{\n  \"system\": {\n    \"system_id\": \"macbook-pro_arm64\",\n    \"hostname\": \"MacBook-Pro.local\",\n    \"platform\": \"Darwin\",\n    \"arch\": \"arm64\",\n    \"os_version\": \"25.3.0\",\n    \"cpus\": \"14\",\n    \"cpu_model\": \"Apple M4 Pro\",\n    \"total_memory_gb\": 48.0,\n    \"node_version\": \"v24.11.1\",\n    \"date\": \"2026-03-09T21:34:11Z\"\n  },\n  \"versions\": [\n    {\n      \"tag\": \"v2.0.0\",\n      \"version\": \"2.0.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:21Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 29.27,\n            \"max\": 87.45,\n            \"avg\": 46.87,\n            \"median\": 46.89,\n            \"stddev\": 16.56,\n            \"variance_pct\": 35.33,\n            \"samples\": 12,\n            \"throughput_kbs\": 2224\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.1.2\",\n      \"version\": \"2.1.2\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:26Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"error\": \"Extra data: line 2 column 1 (char 283)\"\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.2.0\",\n      \"version\": \"2.2.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:42Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.2.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 28.99,\n            \"max\": 62.52,\n            \"avg\": 38.51,\n            \"median\": 31.32,\n            \"stddev\": 12.38,\n            \"variance_pct\": 32.15,\n            \"samples\": 12,\n            \"throughput_kbs\": 2706\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.3.1\",\n      \"version\": \"2.3.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:47Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.3.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 30.8,\n            \"max\": 63.72,\n            \"avg\": 38.42,\n            \"median\": 33.57,\n            \"stddev\": 11.47,\n            \"variance_pct\": 29.85,\n            \"samples\": 12,\n            \"throughput_kbs\": 2713\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.4.0\",\n      \"version\": \"2.4.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:52Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.4.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 27.39,\n            \"max\": 57.2,\n            \"avg\": 35.24,\n            \"median\": 31.11,\n            \"stddev\": 9.93,\n            \"variance_pct\": 28.18,\n            \"samples\": 12,\n            \"throughput_kbs\": 2957\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.5.3\",\n      \"version\": \"2.5.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:34:56Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.5.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 29.83,\n            \"max\": 63.6,\n            \"avg\": 37.57,\n            \"median\": 30.87,\n            \"stddev\": 11.91,\n            \"variance_pct\": 31.69,\n            \"samples\": 12,\n            \"throughput_kbs\": 2774\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.6.1\",\n      \"version\": \"2.6.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:02Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.6.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 33.64,\n            \"max\": 69,\n            \"avg\": 42.08,\n            \"median\": 37.52,\n            \"stddev\": 11.96,\n            \"variance_pct\": 28.41,\n            \"samples\": 12,\n            \"throughput_kbs\": 2477\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v2.7.3\",\n      \"version\": \"2.7.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:08Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"2.7.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 33.99,\n            \"max\": 72.46,\n            \"avg\": 44.36,\n            \"median\": 36.95,\n            \"stddev\": 13,\n            \"variance_pct\": 29.29,\n            \"samples\": 12,\n            \"throughput_kbs\": 2349\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.0.4\",\n      \"version\": \"3.0.4\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:14Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.0.4\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 37.07,\n            \"max\": 75.95,\n            \"avg\": 43.98,\n            \"median\": 39.29,\n            \"stddev\": 10.66,\n            \"variance_pct\": 24.25,\n            \"samples\": 12,\n            \"throughput_kbs\": 2370\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.5.3\",\n      \"version\": \"3.5.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:18Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.5.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 35.09,\n            \"max\": 52.73,\n            \"avg\": 43.96,\n            \"median\": 42.4,\n            \"stddev\": 5.5,\n            \"variance_pct\": 12.5,\n            \"samples\": 12,\n            \"throughput_kbs\": 2371\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.6.0\",\n      \"version\": \"3.6.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:23Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.6.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 37.97,\n            \"max\": 49.87,\n            \"avg\": 42.39,\n            \"median\": 40.92,\n            \"stddev\": 3.8,\n            \"variance_pct\": 8.97,\n            \"samples\": 12,\n            \"throughput_kbs\": 2459\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.6.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.16,\n            \"max\": 4.09,\n            \"avg\": 2.94,\n            \"median\": 2.87,\n            \"stddev\": 0.63,\n            \"variance_pct\": 21.61,\n            \"samples\": 12,\n            \"throughput_kbs\": 1076\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.7.1\",\n      \"version\": \"3.7.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:28Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.7.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 37.82,\n            \"max\": 52.26,\n            \"avg\": 43.33,\n            \"median\": 40.85,\n            \"stddev\": 4.7,\n            \"variance_pct\": 10.84,\n            \"samples\": 12,\n            \"throughput_kbs\": 2405\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.7.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.02,\n            \"max\": 3.55,\n            \"avg\": 2.74,\n            \"median\": 2.89,\n            \"stddev\": 0.52,\n            \"variance_pct\": 19.1,\n            \"samples\": 12,\n            \"throughput_kbs\": 1154\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.7.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.63,\n            \"max\": 3.59,\n            \"avg\": 2.81,\n            \"median\": 2.9,\n            \"stddev\": 0.67,\n            \"variance_pct\": 23.77,\n            \"samples\": 12,\n            \"throughput_kbs\": 788\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.8.1\",\n      \"version\": \"3.8.1\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:35Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.8.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 38.31,\n            \"max\": 49.98,\n            \"avg\": 43.22,\n            \"median\": 41.04,\n            \"stddev\": 4.17,\n            \"variance_pct\": 9.64,\n            \"samples\": 12,\n            \"throughput_kbs\": 2412\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.8.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.06,\n            \"max\": 3.99,\n            \"avg\": 2.98,\n            \"median\": 2.91,\n            \"stddev\": 0.66,\n            \"variance_pct\": 22.1,\n            \"samples\": 12,\n            \"throughput_kbs\": 1062\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.8.1\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.8,\n            \"max\": 4.64,\n            \"avg\": 3.22,\n            \"median\": 3.06,\n            \"stddev\": 0.91,\n            \"variance_pct\": 28.34,\n            \"samples\": 12,\n            \"throughput_kbs\": 688\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.9.0\",\n      \"version\": \"3.9.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:41Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 38.78,\n            \"max\": 54.91,\n            \"avg\": 44.19,\n            \"median\": 40.7,\n            \"stddev\": 5.9,\n            \"variance_pct\": 13.35,\n            \"samples\": 12,\n            \"throughput_kbs\": 2358\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.16,\n            \"max\": 4.04,\n            \"avg\": 3.01,\n            \"median\": 3.04,\n            \"stddev\": 0.62,\n            \"variance_pct\": 20.71,\n            \"samples\": 12,\n            \"throughput_kbs\": 1051\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.68,\n            \"max\": 4.06,\n            \"avg\": 2.87,\n            \"median\": 2.87,\n            \"stddev\": 0.76,\n            \"variance_pct\": 26.57,\n            \"samples\": 12,\n            \"throughput_kbs\": 774\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.06,\n            \"max\": 8.97,\n            \"avg\": 4.06,\n            \"median\": 3.91,\n            \"stddev\": 1.85,\n            \"variance_pct\": 45.62,\n            \"samples\": 12,\n            \"throughput_kbs\": 375\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.10.3\",\n      \"version\": \"3.10.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:35:52Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 118.01,\n            \"max\": 152.74,\n            \"avg\": 130.23,\n            \"median\": 126.14,\n            \"stddev\": 10.09,\n            \"variance_pct\": 7.75,\n            \"samples\": 12,\n            \"throughput_kbs\": 800\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 3.64,\n            \"max\": 9.65,\n            \"avg\": 5.79,\n            \"median\": 5.61,\n            \"stddev\": 1.75,\n            \"variance_pct\": 30.26,\n            \"samples\": 12,\n            \"throughput_kbs\": 546\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 3.84,\n            \"max\": 10.64,\n            \"avg\": 6.08,\n            \"median\": 5.57,\n            \"stddev\": 1.81,\n            \"variance_pct\": 29.73,\n            \"samples\": 12,\n            \"throughput_kbs\": 365\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.10.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 9.19,\n            \"max\": 16.24,\n            \"avg\": 11.6,\n            \"median\": 10.95,\n            \"stddev\": 2.13,\n            \"variance_pct\": 18.39,\n            \"samples\": 12,\n            \"throughput_kbs\": 131\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.11.3\",\n      \"version\": \"3.11.3\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:36:02Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 123.6,\n            \"max\": 184.63,\n            \"avg\": 141.98,\n            \"median\": 135.73,\n            \"stddev\": 17,\n            \"variance_pct\": 11.97,\n            \"samples\": 12,\n            \"throughput_kbs\": 734\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 4.07,\n            \"max\": 10.74,\n            \"avg\": 6.67,\n            \"median\": 6.18,\n            \"stddev\": 1.94,\n            \"variance_pct\": 29.07,\n            \"samples\": 12,\n            \"throughput_kbs\": 474\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 5.7,\n            \"max\": 10.64,\n            \"avg\": 7.81,\n            \"median\": 7.46,\n            \"stddev\": 1.39,\n            \"variance_pct\": 17.78,\n            \"samples\": 12,\n            \"throughput_kbs\": 284\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.11.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 6.23,\n            \"max\": 14.21,\n            \"avg\": 7.67,\n            \"median\": 6.97,\n            \"stddev\": 2.09,\n            \"variance_pct\": 27.21,\n            \"samples\": 12,\n            \"throughput_kbs\": 198\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.12.2\",\n      \"version\": \"3.12.2\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T21:36:16Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 165.65,\n            \"max\": 209.38,\n            \"avg\": 187.15,\n            \"median\": 185.42,\n            \"stddev\": 12.88,\n            \"variance_pct\": 6.88,\n            \"samples\": 12,\n            \"throughput_kbs\": 557\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 3.76,\n            \"max\": 9.79,\n            \"avg\": 5.58,\n            \"median\": 5.53,\n            \"stddev\": 1.63,\n            \"variance_pct\": 29.32,\n            \"samples\": 12,\n            \"throughput_kbs\": 567\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 4.22,\n            \"max\": 8.17,\n            \"avg\": 5.92,\n            \"median\": 5.82,\n            \"stddev\": 1.04,\n            \"variance_pct\": 17.62,\n            \"samples\": 12,\n            \"throughput_kbs\": 375\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.12.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 7.43,\n            \"max\": 21.7,\n            \"avg\": 10.87,\n            \"median\": 9.85,\n            \"stddev\": 3.5,\n            \"variance_pct\": 32.22,\n            \"samples\": 12,\n            \"throughput_kbs\": 140\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.0.0\",\n      \"version\": \"4.0.0\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:27Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 35.71,\n            \"max\": 68.55,\n            \"avg\": 44.82,\n            \"median\": 39.85,\n            \"stddev\": 10.75,\n            \"variance_pct\": 24,\n            \"samples\": 12,\n            \"throughput_kbs\": 2326\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 0,\n          \"errors\": [\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            }\n          ],\n          \"render\": null\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 0,\n          \"errors\": [\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            },\n            {\n              \"run\": 0,\n              \"error\": \"Error evaluating function `if`: tslib_1.__spreadArray is not a function\"\n            }\n          ],\n          \"render\": null\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.0.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.9,\n            \"max\": 11.57,\n            \"avg\": 4,\n            \"median\": 3.28,\n            \"stddev\": 2.63,\n            \"variance_pct\": 65.62,\n            \"samples\": 12,\n            \"throughput_kbs\": 380\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.1.3\",\n      \"version\": \"4.1.3\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:35Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 35.55,\n            \"max\": 68.29,\n            \"avg\": 43.74,\n            \"median\": 39.45,\n            \"stddev\": 10.63,\n            \"variance_pct\": 24.31,\n            \"samples\": 12,\n            \"throughput_kbs\": 2383\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.51,\n            \"max\": 4.32,\n            \"avg\": 2.59,\n            \"median\": 2.52,\n            \"stddev\": 0.88,\n            \"variance_pct\": 34,\n            \"samples\": 12,\n            \"throughput_kbs\": 1220\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.69,\n            \"max\": 4.27,\n            \"avg\": 3,\n            \"median\": 3.18,\n            \"stddev\": 0.8,\n            \"variance_pct\": 26.75,\n            \"samples\": 12,\n            \"throughput_kbs\": 738\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.1.3\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.86,\n            \"max\": 11.57,\n            \"avg\": 4,\n            \"median\": 3.49,\n            \"stddev\": 2.58,\n            \"variance_pct\": 64.45,\n            \"samples\": 12,\n            \"throughput_kbs\": 380\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.2.2\",\n      \"version\": \"4.2.2\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:43Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 33.06,\n            \"max\": 71.26,\n            \"avg\": 41.5,\n            \"median\": 35.42,\n            \"stddev\": 12.93,\n            \"variance_pct\": 31.15,\n            \"samples\": 12,\n            \"throughput_kbs\": 2511\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.68,\n            \"max\": 4.18,\n            \"avg\": 2.67,\n            \"median\": 2.69,\n            \"stddev\": 0.79,\n            \"variance_pct\": 29.71,\n            \"samples\": 12,\n            \"throughput_kbs\": 1184\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.97,\n            \"max\": 10.6,\n            \"avg\": 3.77,\n            \"median\": 3.76,\n            \"stddev\": 2.2,\n            \"variance_pct\": 58.39,\n            \"samples\": 12,\n            \"throughput_kbs\": 587\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.2.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.35,\n            \"max\": 9.8,\n            \"avg\": 4.85,\n            \"median\": 4.98,\n            \"stddev\": 2.16,\n            \"variance_pct\": 44.58,\n            \"samples\": 12,\n            \"throughput_kbs\": 314\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.3.0\",\n      \"version\": \"4.3.0\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:36:54Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 34.18,\n            \"max\": 73.61,\n            \"avg\": 43.07,\n            \"median\": 37.23,\n            \"stddev\": 12.22,\n            \"variance_pct\": 28.38,\n            \"samples\": 12,\n            \"throughput_kbs\": 2420\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.63,\n            \"max\": 3.81,\n            \"avg\": 2.52,\n            \"median\": 2.45,\n            \"stddev\": 0.75,\n            \"variance_pct\": 29.7,\n            \"samples\": 12,\n            \"throughput_kbs\": 1254\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.01,\n            \"max\": 9.44,\n            \"avg\": 3.51,\n            \"median\": 3.37,\n            \"stddev\": 1.9,\n            \"variance_pct\": 54.29,\n            \"samples\": 12,\n            \"throughput_kbs\": 632\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.3.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.22,\n            \"max\": 9.85,\n            \"avg\": 4.7,\n            \"median\": 4.26,\n            \"stddev\": 2.16,\n            \"variance_pct\": 46.07,\n            \"samples\": 12,\n            \"throughput_kbs\": 324\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.4.2\",\n      \"version\": \"4.4.2\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:37:06Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 34.87,\n            \"max\": 73.71,\n            \"avg\": 45.83,\n            \"median\": 40.47,\n            \"stddev\": 11.86,\n            \"variance_pct\": 25.87,\n            \"samples\": 12,\n            \"throughput_kbs\": 2274\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.55,\n            \"max\": 3.67,\n            \"avg\": 2.53,\n            \"median\": 2.53,\n            \"stddev\": 0.66,\n            \"variance_pct\": 26.12,\n            \"samples\": 12,\n            \"throughput_kbs\": 1249\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.51,\n            \"max\": 10.07,\n            \"avg\": 3.59,\n            \"median\": 3.48,\n            \"stddev\": 2.11,\n            \"variance_pct\": 58.91,\n            \"samples\": 12,\n            \"throughput_kbs\": 618\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.4.2\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.47,\n            \"max\": 10.4,\n            \"avg\": 4.92,\n            \"median\": 4.59,\n            \"stddev\": 2.24,\n            \"variance_pct\": 45.65,\n            \"samples\": 12,\n            \"throughput_kbs\": 310\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.5.1\",\n      \"version\": \"4.5.1\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T21:37:14Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106724,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 39.63,\n            \"max\": 72.55,\n            \"avg\": 47.4,\n            \"median\": 42.16,\n            \"stddev\": 11.09,\n            \"variance_pct\": 23.39,\n            \"samples\": 12,\n            \"throughput_kbs\": 2199\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.61,\n            \"max\": 3.47,\n            \"avg\": 2.57,\n            \"median\": 2.62,\n            \"stddev\": 0.67,\n            \"variance_pct\": 26.21,\n            \"samples\": 12,\n            \"throughput_kbs\": 1231\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 1.65,\n            \"max\": 9.51,\n            \"avg\": 3.79,\n            \"median\": 3.62,\n            \"stddev\": 1.96,\n            \"variance_pct\": 51.77,\n            \"samples\": 12,\n            \"throughput_kbs\": 585\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"4.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1558,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 15,\n          \"warmupRuns\": 3,\n          \"completedRuns\": 15,\n          \"render\": {\n            \"min\": 2.18,\n            \"max\": 10.1,\n            \"avg\": 4.62,\n            \"median\": 4.73,\n            \"stddev\": 2.14,\n            \"variance_pct\": 46.29,\n            \"samples\": 12,\n            \"throughput_kbs\": 330\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/less/benchmark/results/runs/2026-03-09_macbook-pro_arm64.json",
    "content": "{\n  \"system\": {\n    \"hostname\": \"MacBook-Pro.local\",\n    \"platform\": \"Darwin\",\n    \"arch\": \"arm64\",\n    \"os_version\": \"25.3.0\",\n    \"cpus\": \"14\",\n    \"cpu_model\": \"Apple M4 Pro\",\n    \"total_memory_gb\": 48.0,\n    \"node_version\": \"v24.11.1\",\n    \"date\": \"2026-03-09T18:54:01Z\",\n    \"system_id\": \"macbook-pro_arm64\"\n  },\n  \"versions\": [\n    {\n      \"tag\": \"v3.5.0\",\n      \"version\": \"3.5.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T18:54:04Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.5.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106712,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 32.57,\n            \"max\": 50.01,\n            \"avg\": 38.55,\n            \"median\": 37.68,\n            \"stddev\": 3.96,\n            \"variance_pct\": 45.24,\n            \"samples\": 25,\n            \"throughput_kbs\": 2703\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.6.0\",\n      \"version\": \"3.6.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T18:54:10Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.6.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106712,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 32.58,\n            \"max\": 44.99,\n            \"avg\": 36.81,\n            \"median\": 36.45,\n            \"stddev\": 3.29,\n            \"variance_pct\": 33.71,\n            \"samples\": 25,\n            \"throughput_kbs\": 2831\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.6.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.41,\n            \"max\": 10.1,\n            \"avg\": 2.61,\n            \"median\": 1.97,\n            \"stddev\": 1.74,\n            \"variance_pct\": 333.37,\n            \"samples\": 25,\n            \"throughput_kbs\": 1213\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.7.0\",\n      \"version\": \"3.7.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T18:54:15Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.7.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106712,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 35.95,\n            \"max\": 46.06,\n            \"avg\": 39.24,\n            \"median\": 38.01,\n            \"stddev\": 2.69,\n            \"variance_pct\": 25.77,\n            \"samples\": 25,\n            \"throughput_kbs\": 2656\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.7.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.31,\n            \"max\": 9.52,\n            \"avg\": 2.63,\n            \"median\": 2.15,\n            \"stddev\": 1.69,\n            \"variance_pct\": 311.76,\n            \"samples\": 25,\n            \"throughput_kbs\": 1201\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.7.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.18,\n            \"max\": 8.96,\n            \"avg\": 2.67,\n            \"median\": 1.95,\n            \"stddev\": 1.72,\n            \"variance_pct\": 291.4,\n            \"samples\": 25,\n            \"throughput_kbs\": 831\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.8.0\",\n      \"version\": \"3.8.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T18:54:21Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.8.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106712,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 36.69,\n            \"max\": 45.5,\n            \"avg\": 39.95,\n            \"median\": 39.1,\n            \"stddev\": 2.52,\n            \"variance_pct\": 22.05,\n            \"samples\": 25,\n            \"throughput_kbs\": 2609\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.8.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.49,\n            \"max\": 8.69,\n            \"avg\": 2.64,\n            \"median\": 2.09,\n            \"stddev\": 1.53,\n            \"variance_pct\": 273.14,\n            \"samples\": 25,\n            \"throughput_kbs\": 1200\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.8.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.18,\n            \"max\": 7.68,\n            \"avg\": 2.58,\n            \"median\": 1.91,\n            \"stddev\": 1.45,\n            \"variance_pct\": 252.07,\n            \"samples\": 25,\n            \"throughput_kbs\": 860\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.9.0\",\n      \"version\": \"3.9.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T18:54:33Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106712,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 32.62,\n            \"max\": 47.69,\n            \"avg\": 40.2,\n            \"median\": 39.67,\n            \"stddev\": 3.89,\n            \"variance_pct\": 37.47,\n            \"samples\": 25,\n            \"throughput_kbs\": 2592\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.49,\n            \"max\": 8.91,\n            \"avg\": 2.56,\n            \"median\": 1.95,\n            \"stddev\": 1.55,\n            \"variance_pct\": 289.49,\n            \"samples\": 25,\n            \"throughput_kbs\": 1233\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.2,\n            \"max\": 9.29,\n            \"avg\": 2.63,\n            \"median\": 2.03,\n            \"stddev\": 1.68,\n            \"variance_pct\": 307.32,\n            \"samples\": 25,\n            \"throughput_kbs\": 842\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.9.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1554,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 1.33,\n            \"max\": 11.52,\n            \"avg\": 3.12,\n            \"median\": 2.18,\n            \"stddev\": 2.18,\n            \"variance_pct\": 326.59,\n            \"samples\": 25,\n            \"throughput_kbs\": 486\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.10.0\",\n      \"version\": \"3.10.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T18:54:44Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.10.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106712,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 103.26,\n            \"max\": 176.43,\n            \"avg\": 125.98,\n            \"median\": 125.46,\n            \"stddev\": 15.69,\n            \"variance_pct\": 58.08,\n            \"samples\": 25,\n            \"throughput_kbs\": 827\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.10.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 2.67,\n            \"max\": 8.79,\n            \"avg\": 4.63,\n            \"median\": 4.18,\n            \"stddev\": 1.6,\n            \"variance_pct\": 132.21,\n            \"samples\": 25,\n            \"throughput_kbs\": 683\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.10.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 3.31,\n            \"max\": 19.77,\n            \"avg\": 5.42,\n            \"median\": 4.64,\n            \"stddev\": 3.33,\n            \"variance_pct\": 303.98,\n            \"samples\": 25,\n            \"throughput_kbs\": 409\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.10.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1554,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 4.5,\n            \"max\": 21.31,\n            \"avg\": 7.16,\n            \"median\": 6.55,\n            \"stddev\": 3.01,\n            \"variance_pct\": 234.62,\n            \"samples\": 25,\n            \"throughput_kbs\": 212\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v3.11.0\",\n      \"version\": \"3.11.0\",\n      \"node_version\": \"v18.20.8\",\n      \"date\": \"2026-03-09T18:54:56Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"version\": \"3.11.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark.less\",\n          \"fileSize\": 106712,\n          \"fileSizeKB\": 104.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 104.12,\n            \"max\": 154.95,\n            \"avg\": 122.9,\n            \"median\": 119.99,\n            \"stddev\": 12.94,\n            \"variance_pct\": 41.36,\n            \"samples\": 25,\n            \"throughput_kbs\": 848\n          }\n        },\n        \"benchmark-v3.less\": {\n          \"version\": \"3.11.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v3.less\",\n          \"fileSize\": 3237,\n          \"fileSizeKB\": 3.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 2.84,\n            \"max\": 9.74,\n            \"avg\": 4.69,\n            \"median\": 4.33,\n            \"stddev\": 1.66,\n            \"variance_pct\": 146.96,\n            \"samples\": 25,\n            \"throughput_kbs\": 673\n          }\n        },\n        \"benchmark-v37.less\": {\n          \"version\": \"3.11.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v37.less\",\n          \"fileSize\": 2270,\n          \"fileSizeKB\": 2.2,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 3.29,\n            \"max\": 14.99,\n            \"avg\": 5.88,\n            \"median\": 5.08,\n            \"stddev\": 2.63,\n            \"variance_pct\": 198.81,\n            \"samples\": 25,\n            \"throughput_kbs\": 377\n          }\n        },\n        \"benchmark-v39.less\": {\n          \"version\": \"3.11.0\",\n          \"lessPath\": \".\",\n          \"file\": \"benchmark-v39.less\",\n          \"fileSize\": 1554,\n          \"fileSizeKB\": 1.5,\n          \"totalRuns\": 30,\n          \"warmupRuns\": 5,\n          \"completedRuns\": 30,\n          \"render\": {\n            \"min\": 9.79,\n            \"max\": 22.26,\n            \"avg\": 11.71,\n            \"median\": 11.12,\n            \"stddev\": 2.4,\n            \"variance_pct\": 106.47,\n            \"samples\": 25,\n            \"throughput_kbs\": 130\n          }\n        }\n      }\n    },\n    {\n      \"tag\": \"v4.2.0\",\n      \"version\": \"4.2.0\",\n      \"node_version\": \"v20.19.6\",\n      \"date\": \"2026-03-09T18:55:29Z\",\n      \"benchmarks\": {\n        \"benchmark.less\": {\n          \"error\": \"Could not find Less compiler\",\n          \"tried\": [\n            \"./packages/less\",\n            \".\",\n            \"./lib/less-node\",\n            \"less\"\n          ]\n        },\n        \"benchmark-v3.less\": {\n          \"error\": \"Could not find Less compiler\",\n          \"tried\": [\n            \"./packages/less\",\n            \".\",\n            \"./lib/less-node\",\n            \"less\"\n          ]\n        },\n        \"benchmark-v37.less\": {\n          \"error\": \"Could not find Less compiler\",\n          \"tried\": [\n            \"./packages/less\",\n            \".\",\n            \"./lib/less-node\",\n            \"less\"\n          ]\n        },\n        \"benchmark-v39.less\": {\n          \"error\": \"Could not find Less compiler\",\n          \"tried\": [\n            \"./packages/less\",\n            \".\",\n            \"./lib/less-node\",\n            \"less\"\n          ]\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/less/benchmark/run-historical.sh",
    "content": "#!/usr/bin/env bash\nset -euo pipefail\n\n# Historical Less Benchmark Runner\n# Benchmarks every major/minor Less release from v2.0.0 through v4.4.x\n# Uses git worktrees for isolation, fnm for Node version management.\n#\n# Usage: ./run-historical.sh [--versions \"v2.0.0 v3.0.0 ...\"] [--runs 30] [--warmup 5]\n#\n# Results are saved to benchmark/results/\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nREPO_ROOT=\"$(cd \"$SCRIPT_DIR/../../..\" && pwd)\"\nRESULTS_DIR=\"$SCRIPT_DIR/results\"\nRUNS_DIR=\"$RESULTS_DIR/runs\"\nLATEST_DIR=\"$RESULTS_DIR/latest\"\nWORKTREE_BASE=\"/tmp/less-bench-worktrees\"\nBENCHMARK_DIR=\"$SCRIPT_DIR\"\n\nRUNS=30\nWARMUP=5\nNODE_FOR_OLD=\"v18.20.8\"  # v2.x/v3.x\nNODE_FOR_NEW=\"v20.19.6\"  # v4.x\nNODE_DEFAULT=\"\"           # will be set to current\n\n# Versions chosen to capture significant performance changes.\n# Pruned from full v2.0–v4.5 benchmark data (2026-03-09, M4 Pro):\n#   Dropped v2.1 (broken), v2.5 (<1% from v2.4), v2.7 (<2% from v2.6),\n#   v3.6–v3.9 (all within 1ms of each other), v4.1 (<1% from v4.0).\n#   Use --versions to override with the full set if needed.\nALL_VERSIONS=(\n  v2.0.0 v2.2.0 v2.3.1 v2.4.0 v2.6.1\n  v3.0.4 v3.5.3 v3.10.3 v3.11.3 v3.12.2\n  v4.0.0 v4.2.2 v4.3.0 v4.4.2 v4.5.1\n)\n\nVERSIONS=(\"${ALL_VERSIONS[@]}\")\n\n# Parse arguments\nwhile [[ $# -gt 0 ]]; do\n  case $1 in\n    --versions) IFS=' ' read -ra VERSIONS <<< \"$2\"; shift 2 ;;\n    --runs) RUNS=\"$2\"; shift 2 ;;\n    --warmup) WARMUP=\"$2\"; shift 2 ;;\n    *) echo \"Unknown option: $1\"; exit 1 ;;\n  esac\ndone\n\n# Benchmark files and their minimum required versions (parallel arrays)\nBENCH_FILE_NAMES=(benchmark.less benchmark-v3.less benchmark-v37.less benchmark-v39.less)\nBENCH_FILE_MINVS=(2.0.0      3.6.0            3.7.0             3.9.0)\n\n# ----- Helpers -----\n\nlog() { echo \"$(date '+%H:%M:%S') | $*\"; }\nerr() { echo \"$(date '+%H:%M:%S') | ERROR: $*\" >&2; }\n\nversion_ge() {\n  # Returns 0 if $1 >= $2 (semantic version comparison)\n  printf '%s\\n%s' \"$2\" \"$1\" | sort -V -C\n}\n\nstrip_v() { echo \"${1#v}\"; }\n\npick_node_version() {\n  local ver=\"$1\"\n  local major=\"${ver%%.*}\"\n  if [[ \"$major\" -ge 4 ]]; then\n    echo \"$NODE_FOR_NEW\"\n  else\n    echo \"$NODE_FOR_OLD\"\n  fi\n}\n\nuse_node() {\n  local nv=\"$1\"\n  if command -v fnm &>/dev/null; then\n    fnm install \"$nv\" &>/dev/null || true\n    eval \"$(fnm env --shell bash)\"\n    fnm use \"$nv\" &>/dev/null\n  fi\n}\n\nrestore_node() {\n  if [[ -n \"$NODE_DEFAULT\" ]] && command -v fnm &>/dev/null; then\n    eval \"$(fnm env --shell bash)\"\n    fnm use \"$NODE_DEFAULT\" &>/dev/null\n  fi\n}\n\nis_monorepo() {\n  local tag=\"$1\"\n  git -C \"$REPO_ROOT\" show \"$tag:packages/less/package.json\" &>/dev/null 2>&1\n}\n\nget_system_info() {\n  python3 -c \"\nimport json, platform, subprocess, datetime, re\n\ndef run(cmd):\n    try:\n        return subprocess.check_output(cmd, shell=True, stderr=subprocess.DEVNULL).decode().strip()\n    except:\n        return 'unknown'\n\nhostname = platform.node()\narch = platform.machine()\n\n# Generate a stable, filesystem-safe system ID\nsystem_id = re.sub(r'[^a-zA-Z0-9_-]', '-', hostname.split('.')[0].lower()) + '_' + arch\n\ninfo = {\n    'system_id': system_id,\n    'hostname': hostname,\n    'platform': platform.system(),\n    'arch': arch,\n    'os_version': platform.release(),\n    'cpus': run('sysctl -n hw.ncpu') if platform.system() == 'Darwin' else run('nproc'),\n    'cpu_model': run('sysctl -n machdep.cpu.brand_string') if platform.system() == 'Darwin' else run(\\\"grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2\\\").strip(),\n    'total_memory_gb': round(int(run('sysctl -n hw.memsize') or '0') / 1073741824, 1) if platform.system() == 'Darwin' else 'unknown',\n    'node_version': run('node -v'),\n    'date': datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')\n}\nprint(json.dumps(info, indent=2))\n\"\n}\n\n# ----- Setup -----\n\nmkdir -p \"$RUNS_DIR\" \"$LATEST_DIR\" \"$WORKTREE_BASE\"\nNODE_DEFAULT=\"$(node -v)\"\n\n# Shared TypeScript compiler fallback (for versions where npm install can't get tsc)\nTSC_FALLBACK_DIR=\"$WORKTREE_BASE/.tsc-fallback\"\nTSC_FALLBACK=\"\"\nensure_tsc_fallback() {\n  if [[ -n \"$TSC_FALLBACK\" ]] && [[ -x \"$TSC_FALLBACK\" ]]; then\n    return 0\n  fi\n  log \"Installing shared TypeScript compiler fallback...\"\n  mkdir -p \"$TSC_FALLBACK_DIR\"\n  (cd \"$TSC_FALLBACK_DIR\" && npm install typescript@4.9.5 2>/dev/null) || true\n  TSC_FALLBACK=\"$TSC_FALLBACK_DIR/node_modules/.bin/tsc\"\n  if [[ -x \"$TSC_FALLBACK\" ]]; then\n    log \"Fallback tsc ready: $TSC_FALLBACK\"\n    return 0\n  fi\n  err \"Could not install fallback tsc\"\n  return 1\n}\n\n# Record system info and derive system ID + run filename\nlog \"Recording system info...\"\nSYSTEM_INFO_JSON=\"$(get_system_info)\"\necho \"$SYSTEM_INFO_JSON\"\n\nSYSTEM_ID=\"$(echo \"$SYSTEM_INFO_JSON\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['system_id'])\")\"\nRUN_STAMP=\"$(date -u +%Y-%m-%dT%H-%M-%SZ)\"\nRUN_FILE=\"$RUNS_DIR/${RUN_STAMP}_${SYSTEM_ID}.json\"\nLATEST_FILE=\"$LATEST_DIR/${SYSTEM_ID}.json\"\n\nlog \"System ID: $SYSTEM_ID\"\nlog \"Run file:  $RUN_FILE\"\n\n# Initialize the run file (system info + empty results array)\npython3 -c \"\nimport json, sys\nsystem_info = json.loads(sys.argv[1])\nrun_data = {'system': system_info, 'versions': []}\nprint(json.dumps(run_data, indent=2))\n\" \"$SYSTEM_INFO_JSON\" > \"$RUN_FILE\"\n\n# ----- Main Loop -----\n\ntotal=${#VERSIONS[@]}\nidx=0\n\nfor tag in \"${VERSIONS[@]}\"; do\n  idx=$((idx + 1))\n  ver=\"$(strip_v \"$tag\")\"\n  log \"===== [$idx/$total] Benchmarking $tag =====\"\n\n  WORKTREE=\"$WORKTREE_BASE/$tag\"\n\n  # Verify tag exists\n  if ! git -C \"$REPO_ROOT\" rev-parse \"$tag\" &>/dev/null; then\n    err \"Tag $tag not found, skipping\"\n    continue\n  fi\n\n  # Select Node version\n  node_ver=\"$(pick_node_version \"$ver\")\"\n  log \"Using Node $node_ver for $tag\"\n  use_node \"$node_ver\"\n  log \"Active Node: $(node -v)\"\n\n  # Create worktree\n  if [[ -d \"$WORKTREE\" ]]; then\n    log \"Cleaning existing worktree $WORKTREE\"\n    git -C \"$REPO_ROOT\" worktree remove --force \"$WORKTREE\" 2>/dev/null || rm -rf \"$WORKTREE\"\n  fi\n\n  log \"Creating worktree for $tag...\"\n  git -C \"$REPO_ROOT\" worktree add --detach \"$WORKTREE\" \"$tag\" 2>/dev/null\n\n  # Install dependencies\n  log \"Installing dependencies...\"\n  pushd \"$WORKTREE\" > /dev/null\n\n  LESS_DIR=\"\"\n  BENCH_TARGET=\"\"\n\n  if is_monorepo \"$tag\"; then\n    # Monorepo era (v4.x)\n    LESS_DIR=\"$WORKTREE/packages/less\"\n    BENCH_TARGET=\"$LESS_DIR/benchmark\"\n\n    # v4.3+ uses workspace: protocol requiring pnpm; earlier v4.x uses npm\n    if grep -q '\"workspace:' \"$LESS_DIR/package.json\" 2>/dev/null || \\\n       grep -q '\"workspace:' \"$WORKTREE/package.json\" 2>/dev/null; then\n      log \"Detected workspace: protocol, using pnpm...\"\n      if command -v pnpm &>/dev/null; then\n        (cd \"$WORKTREE\" && pnpm install --ignore-scripts 2>/dev/null) || true\n      else\n        err \"pnpm not available but needed for $tag workspace: deps\"\n        # Fallback: install just typescript in packages/less\n        (cd \"$LESS_DIR\" && npm install typescript --no-save 2>/dev/null) || true\n      fi\n    else\n      # npm-based install for older v4.x / v3.12+\n      npm install --ignore-scripts --legacy-peer-deps 2>/dev/null || true\n      pushd \"$LESS_DIR\" > /dev/null\n      npm install --ignore-scripts --legacy-peer-deps 2>/dev/null || {\n        # npm install often fails on monorepo versions due to unpublished workspace\n        # packages (e.g. @less/test-import-module). Install runtime deps separately.\n        log \"npm install failed, installing runtime deps separately...\"\n        runtime_deps=$(python3 -c \"\nimport json\nwith open('package.json') as f:\n    d = json.load(f)\ndeps = d.get('dependencies', {})\n# Print package@range pairs\nfor name, ver in deps.items():\n    if not name.startswith('@less/'):\n        print(name + '@' + ver.lstrip('^~'))\n\" 2>/dev/null)\n        if [[ -n \"$runtime_deps\" ]]; then\n          deps_temp=\"$WORKTREE_BASE/.deps-temp\"\n          mkdir -p \"$deps_temp\"\n          (cd \"$deps_temp\" && npm install $runtime_deps 2>/dev/null) || true\n          mkdir -p node_modules\n          # Copy all installed packages (including transitive deps) into node_modules\n          if [[ -d \"$deps_temp/node_modules\" ]]; then\n            cp -r \"$deps_temp\"/node_modules/* node_modules/ 2>/dev/null || true\n            # Also copy @scoped packages\n            for scope_dir in \"$deps_temp\"/node_modules/@*/; do\n              if [[ -d \"$scope_dir\" ]]; then\n                scope_name=\"$(basename \"$scope_dir\")\"\n                mkdir -p \"node_modules/$scope_name\"\n                cp -r \"$scope_dir\"*/ \"node_modules/$scope_name/\" 2>/dev/null || true\n              fi\n            done\n          fi\n        fi\n      }\n      popd > /dev/null\n    fi\n\n    # Build TypeScript\n    pushd \"$LESS_DIR\" > /dev/null\n    log \"Building TypeScript...\"\n    if [[ -f \"tsconfig.build.json\" ]] || [[ -f \"tsconfig.json\" ]]; then\n      # Find tsc: check local, root, system, then shared fallback\n      TSC=\"\"\n      for tsc_path in \\\n        \"./node_modules/.bin/tsc\" \\\n        \"$WORKTREE/node_modules/.bin/tsc\"; do\n        if [[ -x \"$tsc_path\" ]]; then\n          TSC=\"$tsc_path\"\n          break\n        fi\n      done\n\n      if [[ -z \"$TSC\" ]]; then\n        # Try installing locally first\n        npm install typescript --no-save 2>/dev/null || true\n        if [[ -x \"./node_modules/.bin/tsc\" ]]; then\n          TSC=\"./node_modules/.bin/tsc\"\n        else\n          # Use shared fallback tsc\n          ensure_tsc_fallback && TSC=\"$TSC_FALLBACK\"\n        fi\n      fi\n\n      if [[ -n \"$TSC\" ]] && [[ -x \"$TSC\" ]]; then\n        TSCONFIG=\"tsconfig.build.json\"\n        [[ -f \"$TSCONFIG\" ]] || TSCONFIG=\"tsconfig.json\"\n\n        $TSC -p \"$TSCONFIG\" 2>/dev/null || {\n          log \"Retrying tsc with --skipLibCheck...\"\n          $TSC --skipLibCheck -p \"$TSCONFIG\" 2>/dev/null || {\n            err \"Build failed completely for $tag, skipping\"\n            popd > /dev/null\n            popd > /dev/null\n            git -C \"$REPO_ROOT\" worktree remove --force \"$WORKTREE\" 2>/dev/null || true\n            continue\n          }\n        }\n      else\n        err \"No tsc available for $tag, skipping\"\n        popd > /dev/null\n        popd > /dev/null\n        git -C \"$REPO_ROOT\" worktree remove --force \"$WORKTREE\" 2>/dev/null || true\n        continue\n      fi\n    fi\n    popd > /dev/null\n  else\n    # Pre-monorepo (v2.x, v3.x) - lib/ is already in git\n    LESS_DIR=\"$WORKTREE\"\n    BENCH_TARGET=\"$WORKTREE/benchmark\"\n    npm install --ignore-scripts --legacy-peer-deps 2>/dev/null || true\n  fi\n  popd > /dev/null\n\n  # Copy benchmark files and runner into the worktree\n  mkdir -p \"$BENCH_TARGET\"\n  cp \"$BENCHMARK_DIR/benchmark-runner.js\" \"$BENCH_TARGET/\"\n  cp \"$BENCHMARK_DIR/benchmark.less\" \"$BENCH_TARGET/\"\n  cp \"$BENCHMARK_DIR/benchmark-import-target.less\" \"$BENCH_TARGET/\"\n  cp \"$BENCHMARK_DIR/benchmark-import-reference-target.less\" \"$BENCH_TARGET/\"\n  cp \"$BENCHMARK_DIR/benchmark-v3.less\" \"$BENCH_TARGET/\" 2>/dev/null || true\n  cp \"$BENCHMARK_DIR/benchmark-v37.less\" \"$BENCH_TARGET/\" 2>/dev/null || true\n  cp \"$BENCHMARK_DIR/benchmark-v39.less\" \"$BENCH_TARGET/\" 2>/dev/null || true\n\n  # Run benchmarks for applicable files\n  CURRENT_NODE=\"$(node -v)\"\n  CURRENT_DATE=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n\n  # Initialize tag JSON via python for safety\n  tag_json=$(python3 -c \"\nimport json\nprint(json.dumps({\n    'tag': '$tag',\n    'version': '$ver',\n    'node_version': '$CURRENT_NODE',\n    'date': '$CURRENT_DATE',\n    'benchmarks': {}\n}))\n\")\n\n  bench_count=${#BENCH_FILE_NAMES[@]}\n  for (( bi=0; bi<bench_count; bi++ )); do\n    bench_file=\"${BENCH_FILE_NAMES[$bi]}\"\n    min_ver=\"${BENCH_FILE_MINVS[$bi]}\"\n\n    if ! version_ge \"$ver\" \"$min_ver\"; then\n      log \"  Skipping $bench_file (requires >= $min_ver)\"\n      continue\n    fi\n\n    bench_path=\"$BENCH_TARGET/$bench_file\"\n    if [[ ! -f \"$bench_path\" ]]; then\n      log \"  Skipping $bench_file (file not found)\"\n      continue\n    fi\n\n    log \"  Running $bench_file ($RUNS runs, $WARMUP warmup)...\"\n\n    # Run from the Less package directory so require() finds the compiler\n    # Save result to temp file to avoid shell quoting issues\n    result_file=$(mktemp)\n    # Pass --math=always for consistent cross-version results\n    # (v4+ defaults to parens-division which changes evaluation behavior)\n    (cd \"$LESS_DIR\" && node \"$BENCH_TARGET/benchmark-runner.js\" \"$bench_path\" \"$RUNS\" \"$WARMUP\" --math=always > \"$result_file\" 2>&1) || true\n\n    # Use python to safely merge results\n    tag_json=$(python3 -c \"\nimport sys, json\n\ntag_data = json.loads(sys.stdin.read())\nbench_file = sys.argv[1]\nresult_file = sys.argv[2]\n\ntry:\n    with open(result_file) as f:\n        result_str = f.read().strip()\n    result_data = json.loads(result_str)\n    tag_data['benchmarks'][bench_file] = result_data\n    print(json.dumps(tag_data))\nexcept (json.JSONDecodeError, Exception) as e:\n    tag_data['benchmarks'][bench_file] = {'error': str(e)[:500]}\n    print(json.dumps(tag_data))\n\" \"$bench_file\" \"$result_file\" <<< \"$tag_json\")\n\n    if python3 -c \"import json; json.load(open('$result_file'))\" 2>/dev/null; then\n      log \"  Done $bench_file\"\n    else\n      err \"  $bench_file failed: $(head -5 \"$result_file\")\"\n    fi\n    rm -f \"$result_file\"\n  done\n\n  # Append version results to run file\n  python3 -c \"\nimport json, sys\n\ntag_data = json.loads(sys.stdin.read())\nrun_file = sys.argv[1]\nwith open(run_file) as f:\n    run_data = json.load(f)\nrun_data['versions'].append(tag_data)\nwith open(run_file, 'w') as f:\n    json.dump(run_data, f, indent=2)\n\" \"$RUN_FILE\" <<< \"$tag_json\"\n  log \"Results appended to $RUN_FILE\"\n\n  # Clean up worktree\n  log \"Cleaning up worktree...\"\n  git -C \"$REPO_ROOT\" worktree remove --force \"$WORKTREE\" 2>/dev/null || rm -rf \"$WORKTREE\"\n\n  log \"===== Done $tag =====\"\n  echo \"\"\ndone\n\n# Restore original Node version\nrestore_node\n\n# Copy to latest\ncp \"$RUN_FILE\" \"$LATEST_FILE\"\nlog \"Latest results: $LATEST_FILE\"\n\n# Generate summary\nlog \"Generating summary...\"\npython3 - \"$RUN_FILE\" << 'PYEOF'\nimport json, sys\n\nwith open(sys.argv[1]) as f:\n    run_data = json.load(f)\n\nsystem = run_data.get('system', {})\nprint(\"\\n\" + \"=\" * 80)\nprint(\"LESS HISTORICAL BENCHMARK SUMMARY\")\nprint(f\"System: {system.get('cpu_model', '?')} | {system.get('arch', '?')} | {system.get('total_memory_gb', '?')} GB\")\nprint(f\"Date:   {system.get('date', '?')}\")\nprint(\"=\" * 80)\nprint(f\"\\n{'Version':<12} {'Node':<12} {'File':<25} {'Avg (ms)':<12} {'Median':<12} {'Min':<10} {'Max':<10} {'+-pct':<8} {'KB/s':<8}\")\nprint(\"-\" * 110)\n\nfor entry in run_data.get('versions', []):\n    tag = entry.get('tag', '?')\n    node = entry.get('node_version', '?')\n    for bench_name, bench_data in entry.get('benchmarks', {}).items():\n        if 'error' in bench_data:\n            print(f\"{tag:<12} {node:<12} {bench_name:<25} {'ERROR':>10}\")\n            continue\n        render = bench_data.get('render')\n        if not render:\n            print(f\"{tag:<12} {node:<12} {bench_name:<25} {'NO DATA':>10}\")\n            continue\n        print(f\"{tag:<12} {node:<12} {bench_name:<25} {render['avg']:>10.1f} {render['median']:>10.1f} {render['min']:>8.1f} {render['max']:>8.1f} {render['variance_pct']:>6.1f}% {render.get('throughput_kbs', 0):>6}\")\n\nprint(\"\\n\" + \"=\" * 80)\nPYEOF\n\nlog \"All benchmarks complete! Results in $RESULTS_DIR/\"\nlog \"  - This run:    $RUN_FILE\"\nlog \"  - Latest:      $LATEST_FILE\"\nlog \"  - All runs:    $RUNS_DIR/\"\n"
  },
  {
    "path": "packages/less/bin/lessc",
    "content": "#!/usr/bin/env node\n\n/* eslint indent: [2, 2, {\"SwitchCase\": 1}] */\n\nimport path from 'path';\nimport os from 'os';\nimport { createRequire } from 'module';\nimport fs from '../lib/less-node/fs.js';\nimport * as utils from '../lib/less/utils.js';\nimport * as Constants from '../lib/less/constants.js';\nimport less from '../lib/less-node/index.js';\n\nconst require = createRequire(import.meta.url);\n\nvar errno;\n\ntry {\n  errno = require('errno');\n} catch (err) {\n  errno = null;\n}\n\nvar pluginManager = new less.PluginManager(less);\nvar fileManager = new less.FileManager();\nvar plugins = [];\nvar queuePlugins = [];\nvar args = process.argv.slice(1);\nvar silent = false;\nvar quiet = false;\nvar verbose = false;\nvar options = less.options;\noptions.plugins = plugins;\noptions.reUsePluginManager = true;\nvar sourceMapOptions = {};\nvar continueProcessing = true;\n\nvar checkArgFunc = function checkArgFunc(arg, option) {\n  if (!option) {\n    console.error(''.concat(arg, ' option requires a parameter'));\n    continueProcessing = false;\n    process.exitCode = 1;\n    return false;\n  }\n\n  return true;\n};\n\nvar checkBooleanArg = function checkBooleanArg(arg) {\n  var onOff = /^((on|t|true|y|yes)|(off|f|false|n|no))$/i.exec(arg);\n\n  if (!onOff) {\n    console.error(' unable to parse '.concat(arg, ' as a boolean. use one of on/t/true/y/yes/off/f/false/n/no'));\n    continueProcessing = false;\n    process.exitCode = 1;\n    return false;\n  }\n\n  return Boolean(onOff[2]);\n};\n\nvar parseVariableOption = function parseVariableOption(option, variables) {\n  var parts = option.split('=', 2);\n  variables[parts[0]] = parts[1];\n};\n\nvar sourceMapFileInline = false;\nvar pendingDeprecations = [];\n\nfunction printUsage() {\n  less.lesscHelper.printUsage();\n\n  pluginManager.Loader.printUsage(plugins);\n  continueProcessing = false;\n}\n\nfunction render() {\n  if (!continueProcessing) {\n    return;\n  }\n\n  var input = args[1];\n\n  if (input && input != '-') {\n    input = path.resolve(process.cwd(), input);\n  }\n\n  var output = args[2];\n  var outputbase = args[2];\n\n  if (output) {\n    output = path.resolve(process.cwd(), output);\n  }\n\n  if (options.disablePluginRule && queuePlugins.length > 0) {\n    console.error('--plugin and --disable-plugin-rule may not be used at the same time');\n    process.exitCode = 1;\n    return;\n  }\n\n  if (options.sourceMap) {\n    // Validate conflicting options\n    if (sourceMapOptions.sourceMapURL && sourceMapOptions.disableSourcemapAnnotation) {\n      console.error('You cannot provide flag --source-map-url with --source-map-no-annotation.');\n      console.error('Please remove one of those flags.');\n      process.exitcode = 1;\n      return;\n    }\n\n    // Handle explicit sourceMapFullFilename (from --source-map=filename)\n    // Normalization of other options (sourceMapBasepath, sourceMapRootpath, etc.)\n    // is handled automatically in parse-tree.js\n    if (sourceMapOptions.sourceMapFullFilename && !sourceMapFileInline) {\n      var mapFilename = path.resolve(process.cwd(), sourceMapOptions.sourceMapFullFilename);\n      var mapDir = path.dirname(mapFilename);\n\n      if (output) {\n        var outputDir = path.dirname(output);\n        // Set sourceMapOutputFilename relative to map directory\n        sourceMapOptions.sourceMapOutputFilename = path.join(\n          path.relative(mapDir, outputDir),\n          path.basename(output)\n        );\n        // Set sourceMapFilename relative to output directory (for sourceMappingURL comment)\n        sourceMapOptions.sourceMapFilename = path.join(\n          path.relative(outputDir, mapDir),\n          path.basename(sourceMapOptions.sourceMapFullFilename)\n        );\n      } else {\n        // No output filename, just use basename\n        sourceMapOptions.sourceMapOutputFilename = path.basename(output || 'output.css');\n        sourceMapOptions.sourceMapFilename = path.basename(sourceMapOptions.sourceMapFullFilename);\n      }\n    } else if (!sourceMapOptions.sourceMapFullFilename && output && !sourceMapFileInline) {\n      // No explicit sourcemap filename, derive from output\n      sourceMapOptions.sourceMapOutputFilename = path.basename(output);\n      sourceMapOptions.sourceMapFullFilename = ''.concat(output, '.map');\n    } else if (!output && !sourceMapFileInline) {\n      console.error('the sourcemap option only has an optional filename if the css filename is given');\n      console.error('consider adding --source-map-map-inline which embeds the sourcemap into the css');\n      process.exitCode = 1;\n      return;\n    }\n  }\n\n  if (!input) {\n    console.error('lessc: no input files');\n    console.error('');\n    printUsage();\n    process.exitCode = 1;\n    return;\n  }\n\n  var mkdirp;\n  var ensureDirectory = function ensureDirectory(filepath) {\n    var dir = path.dirname(filepath);\n    var cmd;\n    var existsSync = fs.existsSync || path.existsSync;\n\n    if (!existsSync(dir)) {\n      if (mkdirp === undefined) {\n        try {\n          mkdirp = require('make-dir');\n        } catch (e) {\n          mkdirp = null;\n        }\n      }\n\n      cmd = mkdirp && mkdirp.sync || fs.mkdirSync;\n      cmd(dir);\n    }\n  };\n\n  if (options.depends) {\n    if (!outputbase) {\n      console.error('option --depends requires an output path to be specified');\n      process.exitCode = 1;\n      return;\n    }\n\n    process.stdout.write(''.concat(outputbase, ': '));\n  }\n\n  if (!sourceMapFileInline) {\n    var writeSourceMap = function writeSourceMap() {\n      var output = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      var onDone = arguments.length > 1 ? arguments[1] : undefined;\n      var filename = sourceMapOptions.sourceMapFullFilename;\n      ensureDirectory(filename);\n\n      // To fix https://github.com/less/less.js/issues/3646\n      output = output.toString();\n\n      fs.writeFile(filename, output, 'utf8', function (err) {\n        if (err) {\n          var description = 'Error: ';\n\n          if (errno && errno.errno[err.errno]) {\n            description += errno.errno[err.errno].description;\n          } else {\n            description += ''.concat(err.code, ' ').concat(err.message);\n          }\n\n          console.error('lessc: failed to create file '.concat(filename));\n          console.error(description);\n          process.exitCode = 1;\n        } else {\n          less.logger.info('lessc: wrote '.concat(filename));\n        }\n\n        onDone();\n      });\n    };\n  }\n\n  var writeSourceMapIfNeeded = function writeSourceMapIfNeeded(output, onDone) {\n    if (options.sourceMap && !sourceMapFileInline) {\n      writeSourceMap(output, onDone);\n    } else {\n      onDone();\n    }\n  };\n\n  var writeOutput = function writeOutput(output, result, onSuccess) {\n    if (options.depends) {\n      onSuccess();\n    } else if (output) {\n      ensureDirectory(output);\n\n      fs.writeFile(output, result.css, {\n        encoding: 'utf8'\n      }, function (err) {\n        if (err) {\n          var description = 'Error: ';\n\n          if (errno && errno.errno[err.errno]) {\n            description += errno.errno[err.errno].description;\n          } else {\n            description += ''.concat(err.code, ' ').concat(err.message);\n          }\n\n          console.error('lessc: failed to create file '.concat(output));\n          console.error(description);\n          process.exitCode = 1;\n        } else {\n          less.logger.info('lessc: wrote '.concat(output));\n\n          onSuccess();\n        }\n      });\n    } else if (!options.depends) {\n      process.stdout.write(result.css);\n      onSuccess();\n    }\n  };\n\n  var logDependencies = function logDependencies(options, result) {\n    if (options.depends) {\n      var depends = '';\n\n      for (var i = 0; i < result.imports.length; i++) {\n        depends += ''.concat(result.imports[i], ' ');\n      }\n\n      console.log(depends);\n    }\n  };\n\n  var parseLessFile = function parseLessFile(e, data) {\n    if (e) {\n      console.error('lessc: '.concat(e.message));\n      process.exitCode = 1;\n      return;\n    }\n\n    data = data.replace(/^\\uFEFF/, '');\n    options.paths = [path.dirname(input)].concat(options.paths);\n    options.filename = input;\n\n    if (options.lint) {\n      options.sourceMap = false;\n    }\n\n    sourceMapOptions.sourceMapFileInline = sourceMapFileInline;\n\n    if (options.sourceMap) {\n      options.sourceMap = sourceMapOptions;\n    }\n\n    less.logger.addListener({\n      info: function info(msg) {\n        if (verbose) {\n          console.log(msg);\n        }\n      },\n      warn: function warn(msg) {\n        // do not show warning if the silent option is used\n        if (!silent && !quiet) {\n          console.warn(msg);\n        }\n      },\n      error: function error(msg) {\n        if (!silent) {\n          console.error(msg);\n        }\n      }\n    });\n\n    less.render(data, options).then(function (result) {\n      if (!options.lint) {\n        writeOutput(output, result, function () {\n          writeSourceMapIfNeeded(result.map, function () {\n            logDependencies(options, result);\n          });\n        });\n      }\n    }, function (err) {\n      if (!options.silent) {\n        console.error(err.toString({\n          stylize: options.color && less.lesscHelper.stylize\n        }));\n      }\n\n      process.exitCode = 1;\n    });\n  };\n\n  if (input != '-') {\n    fs.readFile(input, 'utf8', parseLessFile);\n  } else {\n    process.stdin.resume();\n    process.stdin.setEncoding('utf8');\n    var buffer = '';\n    process.stdin.on('data', function (data) {\n      buffer += data;\n    });\n    process.stdin.on('end', function () {\n      parseLessFile(false, buffer);\n    });\n  }\n}\n\nfunction processPluginQueue() {\n  var x = 0;\n\n  function pluginError(name) {\n    console.error('Unable to load plugin '.concat(name, ' please make sure that it is installed under or at the same level as less'));\n    process.exitCode = 1;\n  }\n\n  function pluginFinished(plugin) {\n    x++;\n    plugins.push(plugin);\n\n    if (x === queuePlugins.length) {\n      render();\n    }\n  }\n\n  queuePlugins.forEach(function (queue) {\n    var context = utils.clone(options);\n    pluginManager.Loader.loadPlugin(queue.name, process.cwd(), context, less.environment, fileManager).then(function (data) {\n      pluginFinished({\n        fileContent: data.contents,\n        filename: data.filename,\n        options: queue.options\n      });\n    }).catch(function () {\n      pluginError(queue.name);\n    });\n  });\n} // self executing function so we can return\n\n\n(function () {\n  args = args.filter(function (arg) {\n    var match;\n    match = arg.match(/^-I(.+)$/);\n\n    if (match) {\n      options.paths.push(match[1]);\n      return false;\n    }\n\n    match = arg.match(/^--?([a-z][0-9a-z-]*)(?:=(.*))?$/i);\n\n    if (match) {\n      arg = match[1];\n    } else {\n      return arg;\n    }\n\n    switch (arg) {\n      case 'v':\n      case 'version':\n        console.log('lessc '.concat(less.version.join('.'), ' (Less Compiler) [JavaScript]'));\n        continueProcessing = false;\n        break;\n\n      case 'verbose':\n        options.verbose = verbose = true;\n        break;\n\n      case 's':\n      case 'silent':\n        options.silent = silent = true;\n        break;\n\n      case 'quiet':\n        options.quiet = quiet = true;\n        break;\n\n      case 'quiet-deprecations':\n        options.quietDeprecations = true;\n        break;\n\n      case 'l':\n      case 'lint':\n        options.lint = true;\n        break;\n\n      case 'strict-imports':\n        options.strictImports = true;\n        break;\n\n      case 'h':\n      case 'help':\n        printUsage();\n        break;\n\n      case 'x':\n      case 'compress':\n        options.compress = true;\n        break;\n\n      case 'insecure':\n        options.insecure = true;\n        break;\n\n      case 'M':\n      case 'depends':\n        options.depends = true;\n        break;\n\n      case 'max-line-len':\n        if (checkArgFunc(arg, match[2])) {\n          options.maxLineLen = parseInt(match[2], 10);\n\n          if (options.maxLineLen <= 0) {\n            options.maxLineLen = -1;\n          }\n        }\n\n        break;\n\n      case 'no-color':\n        options.color = false;\n        break;\n\n      case 'js':\n        options.javascriptEnabled = true;\n        pendingDeprecations.push('Warning: Inline JavaScript (--js) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead. (js-eval)');\n        break;\n\n      case 'no-js':\n        // eslint-disable-next-line max-len\n        console.error('The \"--no-js\" argument is deprecated, as inline JavaScript is disabled by default. Use \"--js\" to enable inline JavaScript (not recommended).');\n        break;\n\n      case 'include-path':\n        if (checkArgFunc(arg, match[2])) {\n          // ; supported on windows.\n          // : supported on windows and linux, excluding a drive letter like C:\\ so C:\\file:D:\\file parses to 2\n          options.paths = match[2].split(os.type().match(/Windows/) ? /:(?!\\\\)|;/ : ':').map(function (p) {\n            if (p) {\n              return path.resolve(process.cwd(), p);\n            }\n          });\n        }\n\n        break;\n\n      case 'line-numbers':\n        if (checkArgFunc(arg, match[2])) {\n          options.dumpLineNumbers = match[2];\n          pendingDeprecations.push('Warning: The --line-numbers option is deprecated and will be removed in Less 5.x. Use source maps instead (--source-map). (dump-line-numbers)');\n        }\n\n        break;\n\n      case 'source-map':\n        options.sourceMap = true;\n\n        if (match[2]) {\n          sourceMapOptions.sourceMapFullFilename = match[2];\n        }\n\n        break;\n\n      case 'source-map-rootpath':\n        if (checkArgFunc(arg, match[2])) {\n          sourceMapOptions.sourceMapRootpath = match[2];\n        }\n\n        break;\n\n      case 'source-map-basepath':\n        if (checkArgFunc(arg, match[2])) {\n          sourceMapOptions.sourceMapBasepath = match[2];\n        }\n\n        break;\n\n      case 'source-map-inline':\n      case 'source-map-map-inline':\n        sourceMapFileInline = true;\n        options.sourceMap = true;\n        break;\n\n      case 'source-map-include-source':\n      case 'source-map-less-inline':\n        sourceMapOptions.outputSourceFiles = true;\n        break;\n\n      case 'source-map-url':\n        if (checkArgFunc(arg, match[2])) {\n          sourceMapOptions.sourceMapURL = match[2];\n        }\n\n        break;\n\n      case 'source-map-no-annotation':\n        sourceMapOptions.disableSourcemapAnnotation = true;\n        break;\n\n      case 'rp':\n      case 'rootpath':\n        if (checkArgFunc(arg, match[2])) {\n          options.rootpath = match[2].replace(/\\\\/g, '/');\n        }\n\n        break;\n\n      case 'ie-compat':\n        pendingDeprecations.push('Warning: The --ie-compat option is deprecated, as it has no effect on compilation.');\n        break;\n\n      case 'relative-urls':\n        pendingDeprecations.push('Warning: The --relative-urls option has been deprecated. Use --rewrite-urls=all.');\n        options.rewriteUrls = Constants.RewriteUrls.ALL;\n        break;\n\n      case 'ru':\n      case 'rewrite-urls':\n        var m = match[2];\n\n        if (m) {\n          if (m === 'local') {\n            options.rewriteUrls = Constants.RewriteUrls.LOCAL;\n          } else if (m === 'off') {\n            options.rewriteUrls = Constants.RewriteUrls.OFF;\n          } else if (m === 'all') {\n            options.rewriteUrls = Constants.RewriteUrls.ALL;\n          } else {\n            console.error('Unknown rewrite-urls argument '.concat(m));\n            continueProcessing = false;\n            process.exitCode = 1;\n          }\n        } else {\n          options.rewriteUrls = Constants.RewriteUrls.ALL;\n        }\n\n        break;\n\n      case 'sm':\n      case 'strict-math':\n        pendingDeprecations.push('Warning: The --strict-math option has been deprecated. Use --math=strict.');\n\n        if (checkArgFunc(arg, match[2])) {\n          if (checkBooleanArg(match[2])) {\n            options.math = Constants.Math.PARENS;\n          }\n        }\n\n        break;\n\n      case 'm':\n      case 'math': {\n        let m = match[2];\n        if (checkArgFunc(arg, m)) {\n          if (m === 'always') {\n            pendingDeprecations.push('Warning: --math=always is deprecated and will be removed in Less 5.x. Use --math=parens-division (default) or --math=parens. (math-always)');\n            options.math = Constants.Math.ALWAYS;\n          } else if (m === 'parens-division') {\n            options.math = Constants.Math.PARENS_DIVISION;\n          } else if (m === 'parens' || m === 'strict') {\n            options.math = Constants.Math.PARENS;\n          } else if (m === 'strict-legacy') {\n            pendingDeprecations.push('Warning: --math=strict-legacy has been removed. Defaulting to --math=strict.');\n            options.math = Constants.Math.PARENS;\n          }\n        }\n\n        break;\n      }\n      case 'su':\n      case 'strict-units':\n        if (checkArgFunc(arg, match[2])) {\n          options.strictUnits = checkBooleanArg(match[2]);\n        }\n\n        break;\n\n      case 'global-var':\n        if (checkArgFunc(arg, match[2])) {\n          if (!options.globalVars) {\n            options.globalVars = {};\n          }\n\n          parseVariableOption(match[2], options.globalVars);\n        }\n\n        break;\n\n      case 'modify-var':\n        if (checkArgFunc(arg, match[2])) {\n          if (!options.modifyVars) {\n            options.modifyVars = {};\n          }\n\n          parseVariableOption(match[2], options.modifyVars);\n        }\n\n        break;\n\n      case 'url-args':\n        if (checkArgFunc(arg, match[2])) {\n          options.urlArgs = match[2];\n        }\n\n        break;\n\n      case 'plugin':\n        var splitupArg = match[2].match(/^([^=]+)(=(.*))?/);\n        var name = splitupArg[1];\n        var pluginOptions = splitupArg[3];\n        queuePlugins.push({\n          name: name,\n          options: pluginOptions\n        });\n        break;\n\n      case 'disable-plugin-rule':\n        options.disablePluginRule = true;\n        break;\n\n      default:\n        queuePlugins.push({\n          name: arg,\n          options: match[2],\n          default: true\n        });\n        break;\n    }\n  });\n\n  // Flush queued deprecation warnings (respects --silent, --quiet, --quiet-deprecations)\n  if (!silent && !quiet && !options.quietDeprecations) {\n    pendingDeprecations.forEach(function (msg) {\n      console.warn(msg);\n    });\n  }\n\n  if (queuePlugins.length > 0) {\n    processPluginQueue();\n  } else {\n    render();\n  }\n})();\n"
  },
  {
    "path": "packages/less/bower.json",
    "content": "{\n  \"name\": \"less\",\n  \"main\": \"dist/less.js\",\n  \"ignore\": [\n    \"**/.*\",\n    \"benchmark\",\n    \"bin\",\n    \"lib\",\n    \"src\",\n    \"build\",\n    \"test\",\n    \"*.md\",\n    \"LICENSE\",\n    \"Gruntfile.js\",\n    \"*.json\",\n    \"*.yml\",\n    \".gitattributes\",\n    \".npmignore\",\n    \".eslintignore\",\n    \"tsconfig.json\"\n  ]\n}\n"
  },
  {
    "path": "packages/less/build/banner.js",
    "content": "import { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\nconst pkg = require('./../package.json');\n\nexport default\n`/**\n * Less - ${ pkg.description } v${ pkg.version }\n * http://lesscss.org\n *\n * Copyright (c) 2009-${new Date().getFullYear()}, ${ pkg.author.name } <${ pkg.author.email }>\n * Licensed under the ${ pkg.license } License.\n *\n * @license ${ pkg.license }\n */\n`;\n"
  },
  {
    "path": "packages/less/build/rollup.js",
    "content": "import { rollup } from 'rollup';\nimport commonjs from '@rollup/plugin-commonjs';\nimport json from '@rollup/plugin-json';\nimport { nodeResolve as resolve } from '@rollup/plugin-node-resolve';\nimport { terser } from 'rollup-plugin-terser';\nimport banner from './banner.js';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { createRequire } from 'module';\nimport minimist from 'minimist';\n\nconst require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst rootPath = path.join(__dirname, '..');\nconst pkg = require(path.join(rootPath, 'package.json'));\n\nconst args = minimist(process.argv.slice(2));\n\nlet outDir = args.dist ? './dist' : './tmp';\n\n/** Virtual 'module' for CJS bundle - provides createRequire that returns CJS require */\nfunction moduleShim() {\n    return {\n        name: 'module-shim',\n        resolveId(id) {\n            if (id === 'module') return '\\0module';\n            return null;\n        },\n        load(id) {\n            if (id === '\\0module') {\n                return `export function createRequire() { return require; }`;\n            }\n            return null;\n        }\n    };\n}\n\n/** Inline package.json version - avoid runtime require of ../../package.json from wrong path */\nfunction inlinePackageVersion() {\n    const version = JSON.stringify(pkg.version);\n    return {\n        name: 'inline-package-version',\n        transform(code, id) {\n            if (id.replace(/\\\\/g, '/').includes('less-node/index.js')) {\n                return {\n                    code: code.replace(\n                        /const\\s*\\{\\s*version\\s*\\}\\s*=\\s*require\\s*\\(\\s*['\"]\\.\\.\\/\\.\\.\\/package\\.json['\"]\\s*\\)/,\n                        `const version = ${version}`\n                    ),\n                    map: null\n                };\n            }\n            return null;\n        }\n    };\n}\n\nasync function buildLessNodeCjs() {\n    const outFile = path.join(rootPath, outDir, 'less-node.cjs');\n    console.log(`Writing ${outDir}/less-node.cjs...`);\n    const bundle = await rollup({\n        input: './lib/less-node/index.js',\n        plugins: [\n            moduleShim(),\n            inlinePackageVersion(),\n            resolve(),\n            commonjs(),\n            json()\n        ]\n    });\n    await bundle.write({\n        file: outFile,\n        format: 'cjs',\n        exports: 'default',\n        banner\n    });\n}\n\nasync function buildBrowser() {\n    let bundle = await rollup({\n        input: './lib/less-browser/bootstrap.js',\n        output: [\n            {\n                file: 'less.js',\n                format: 'umd'\n            },\n            {\n                file: 'less.min.js',\n                format: 'umd'\n            }\n        ],\n        plugins: [\n            resolve(),\n            commonjs(),\n            json(),\n            terser({\n                compress: true,\n                include: [/^.+\\.min\\.js$/],\n                output: {\n                    comments: function(node, comment) {\n                        if (comment.type == 'comment2') {\n                            // preserve banner\n                            return /@license/i.test(comment.value);\n                        }\n                    }\n                }\n            })\n        ]\n    });\n\n    if (!args.out || args.out.indexOf('less.js') > -1) {\n        const file = args.out || `${outDir}/less.js`;\n        console.log(`Writing ${file}...`);\n        await bundle.write({\n            file: path.join(rootPath, file),\n            format: 'umd',\n            name: 'less',\n            banner\n        });\n    }\n\n    if (!args.out || args.out.indexOf('less.min.js') > -1) {\n        const file = args.out || `${outDir}/less.min.js`;\n        console.log(`Writing ${file}...`);\n        await bundle.write({\n            file: path.join(rootPath, file),\n            format: 'umd',\n            name: 'less',\n            sourcemap: true,\n            banner\n        });\n    }\n}\n\nasync function build() {\n    await buildLessNodeCjs();\n    await buildBrowser();\n}\n\nbuild();\n"
  },
  {
    "path": "packages/less/index.cjs",
    "content": "// CJS entry — requires the pre-built CJS bundle\nmodule.exports = require('./dist/less-node.cjs');\n"
  },
  {
    "path": "packages/less/lib/less/constants.js",
    "content": "\nexport const Math = {\n    ALWAYS: 0,\n    PARENS_DIVISION: 1,\n    PARENS: 2\n    // removed - STRICT_LEGACY: 3\n};\n\nexport const RewriteUrls = {\n    OFF: 0,\n    LOCAL: 1,\n    ALL: 2\n};"
  },
  {
    "path": "packages/less/lib/less/contexts.js",
    "content": "const contexts = {};\nexport default contexts;\nimport * as Constants from './constants.js';\n\nconst copyFromOriginal = function copyFromOriginal(original, destination, propertiesToCopy) {\n    if (!original) { return; }\n\n    for (let i = 0; i < propertiesToCopy.length; i++) {\n        if (Object.prototype.hasOwnProperty.call(original, propertiesToCopy[i])) {\n            destination[propertiesToCopy[i]] = original[propertiesToCopy[i]];\n        }\n    }\n};\n\n/*\n parse is used whilst parsing\n */\nconst parseCopyProperties = [\n    // options\n    'paths',            // option - unmodified - paths to search for imports on\n    'rewriteUrls',      // option - whether to adjust URL's to be relative\n    'rootpath',         // option - rootpath to append to URL's\n    'strictImports',    // option -\n    'insecure',         // option - whether to allow imports from insecure ssl hosts\n    'dumpLineNumbers',  // option - @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes ('comments', 'mediaquery', 'all') will be removed in a future version.\n    'compress',         // option - whether to compress\n    'syncImport',       // option - whether to import synchronously\n    'mime',             // browser only - mime type for sheet import\n    'useFileCache',     // browser only - whether to use the per file session cache\n    // context\n    'processImports',   // option & context - whether to process imports. if false then imports will not be imported.\n    // Used by the import manager to stop multiple import visitors being created.\n    'pluginManager',    // Used as the plugin manager for the session\n    'quiet',            // option - whether to log warnings\n    'quietDeprecations', // option - whether to suppress deprecation warnings only\n];\n\ncontexts.Parse = function(options) {\n    copyFromOriginal(options, this, parseCopyProperties);\n\n    if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n};\n\nconst evalCopyProperties = [\n    'paths',             // additional include paths\n    'compress',          // whether to compress\n    'math',              // whether math has to be within parenthesis\n    'strictUnits',       // whether units need to evaluate correctly\n    'sourceMap',         // whether to output a source map\n    'importMultiple',    // whether we are currently importing multiple copies\n    'urlArgs',           // whether to add args into url tokens\n    'javascriptEnabled', // option - whether Inline JavaScript is enabled. if undefined, defaults to false\n    'pluginManager',     // Used as the plugin manager for the session\n    'importantScope',    // used to bubble up !important statements\n    'rewriteUrls'        // option - whether to adjust URL's to be relative\n];\n\ncontexts.Eval = function(options, frames) {\n    copyFromOriginal(options, this, evalCopyProperties);\n\n    if (typeof this.paths === 'string') { this.paths = [this.paths]; }\n\n    this.frames = frames || [];\n    this.importantScope = this.importantScope || [];\n};\n\ncontexts.Eval.prototype.enterCalc = function () {\n    if (!this.calcStack) {\n        this.calcStack = [];\n    }\n    this.calcStack.push(true);\n    this.inCalc = true;\n};\n\ncontexts.Eval.prototype.exitCalc = function () {\n    this.calcStack.pop();\n    if (!this.calcStack.length) {\n        this.inCalc = false;\n    }\n};\n\ncontexts.Eval.prototype.inParenthesis = function () {\n    if (!this.parensStack) {\n        this.parensStack = [];\n    }\n    this.parensStack.push(true);\n};\n\ncontexts.Eval.prototype.outOfParenthesis = function () {\n    this.parensStack.pop();\n};\n\ncontexts.Eval.prototype.inCalc = false;\ncontexts.Eval.prototype.mathOn = true;\ncontexts.Eval.prototype.isMathOn = function (op) {\n    if (!this.mathOn) {\n        return false;\n    }\n    if (op === '/' && this.math !== Constants.Math.ALWAYS && (!this.parensStack || !this.parensStack.length)) {\n        return false;\n    }\n    if (this.math > Constants.Math.PARENS_DIVISION) {\n        return this.parensStack && this.parensStack.length;\n    }\n    return true;\n};\n\ncontexts.Eval.prototype.pathRequiresRewrite = function (path) {\n    const isRelative = this.rewriteUrls === Constants.RewriteUrls.LOCAL ? isPathLocalRelative : isPathRelative;\n\n    return isRelative(path);\n};\n\ncontexts.Eval.prototype.rewritePath = function (path, rootpath) {\n    let newPath;\n\n    rootpath = rootpath || '';\n    newPath = this.normalizePath(rootpath + path);\n\n    // If a path was explicit relative and the rootpath was not an absolute path\n    // we must ensure that the new path is also explicit relative.\n    if (isPathLocalRelative(path) &&\n        isPathRelative(rootpath) &&\n        isPathLocalRelative(newPath) === false) {\n        newPath = `./${newPath}`;\n    }\n\n    return newPath;\n};\n\ncontexts.Eval.prototype.normalizePath = function (path) {\n    const segments = path.split('/').reverse();\n    let segment;\n\n    path = [];\n    while (segments.length !== 0) {\n        segment = segments.pop();\n        switch ( segment ) {\n            case '.':\n                break;\n            case '..':\n                if ((path.length === 0) || (path[path.length - 1] === '..')) {\n                    path.push( segment );\n                } else {\n                    path.pop();\n                }\n                break;\n            default:\n                path.push(segment);\n                break;\n        }\n    }\n\n    return path.join('/');\n};\n\nfunction isPathRelative(path) {\n    return !/^(?:[a-z-]+:|\\/|#)/i.test(path);\n}\n\nfunction isPathLocalRelative(path) {\n    return path.charAt(0) === '.';\n}\n\n// todo - do the same for the toCSS ?\n"
  },
  {
    "path": "packages/less/lib/less/data/colors.js",
    "content": "export default {\n    'aliceblue':'#f0f8ff',\n    'antiquewhite':'#faebd7',\n    'aqua':'#00ffff',\n    'aquamarine':'#7fffd4',\n    'azure':'#f0ffff',\n    'beige':'#f5f5dc',\n    'bisque':'#ffe4c4',\n    'black':'#000000',\n    'blanchedalmond':'#ffebcd',\n    'blue':'#0000ff',\n    'blueviolet':'#8a2be2',\n    'brown':'#a52a2a',\n    'burlywood':'#deb887',\n    'cadetblue':'#5f9ea0',\n    'chartreuse':'#7fff00',\n    'chocolate':'#d2691e',\n    'coral':'#ff7f50',\n    'cornflowerblue':'#6495ed',\n    'cornsilk':'#fff8dc',\n    'crimson':'#dc143c',\n    'cyan':'#00ffff',\n    'darkblue':'#00008b',\n    'darkcyan':'#008b8b',\n    'darkgoldenrod':'#b8860b',\n    'darkgray':'#a9a9a9',\n    'darkgrey':'#a9a9a9',\n    'darkgreen':'#006400',\n    'darkkhaki':'#bdb76b',\n    'darkmagenta':'#8b008b',\n    'darkolivegreen':'#556b2f',\n    'darkorange':'#ff8c00',\n    'darkorchid':'#9932cc',\n    'darkred':'#8b0000',\n    'darksalmon':'#e9967a',\n    'darkseagreen':'#8fbc8f',\n    'darkslateblue':'#483d8b',\n    'darkslategray':'#2f4f4f',\n    'darkslategrey':'#2f4f4f',\n    'darkturquoise':'#00ced1',\n    'darkviolet':'#9400d3',\n    'deeppink':'#ff1493',\n    'deepskyblue':'#00bfff',\n    'dimgray':'#696969',\n    'dimgrey':'#696969',\n    'dodgerblue':'#1e90ff',\n    'firebrick':'#b22222',\n    'floralwhite':'#fffaf0',\n    'forestgreen':'#228b22',\n    'fuchsia':'#ff00ff',\n    'gainsboro':'#dcdcdc',\n    'ghostwhite':'#f8f8ff',\n    'gold':'#ffd700',\n    'goldenrod':'#daa520',\n    'gray':'#808080',\n    'grey':'#808080',\n    'green':'#008000',\n    'greenyellow':'#adff2f',\n    'honeydew':'#f0fff0',\n    'hotpink':'#ff69b4',\n    'indianred':'#cd5c5c',\n    'indigo':'#4b0082',\n    'ivory':'#fffff0',\n    'khaki':'#f0e68c',\n    'lavender':'#e6e6fa',\n    'lavenderblush':'#fff0f5',\n    'lawngreen':'#7cfc00',\n    'lemonchiffon':'#fffacd',\n    'lightblue':'#add8e6',\n    'lightcoral':'#f08080',\n    'lightcyan':'#e0ffff',\n    'lightgoldenrodyellow':'#fafad2',\n    'lightgray':'#d3d3d3',\n    'lightgrey':'#d3d3d3',\n    'lightgreen':'#90ee90',\n    'lightpink':'#ffb6c1',\n    'lightsalmon':'#ffa07a',\n    'lightseagreen':'#20b2aa',\n    'lightskyblue':'#87cefa',\n    'lightslategray':'#778899',\n    'lightslategrey':'#778899',\n    'lightsteelblue':'#b0c4de',\n    'lightyellow':'#ffffe0',\n    'lime':'#00ff00',\n    'limegreen':'#32cd32',\n    'linen':'#faf0e6',\n    'magenta':'#ff00ff',\n    'maroon':'#800000',\n    'mediumaquamarine':'#66cdaa',\n    'mediumblue':'#0000cd',\n    'mediumorchid':'#ba55d3',\n    'mediumpurple':'#9370d8',\n    'mediumseagreen':'#3cb371',\n    'mediumslateblue':'#7b68ee',\n    'mediumspringgreen':'#00fa9a',\n    'mediumturquoise':'#48d1cc',\n    'mediumvioletred':'#c71585',\n    'midnightblue':'#191970',\n    'mintcream':'#f5fffa',\n    'mistyrose':'#ffe4e1',\n    'moccasin':'#ffe4b5',\n    'navajowhite':'#ffdead',\n    'navy':'#000080',\n    'oldlace':'#fdf5e6',\n    'olive':'#808000',\n    'olivedrab':'#6b8e23',\n    'orange':'#ffa500',\n    'orangered':'#ff4500',\n    'orchid':'#da70d6',\n    'palegoldenrod':'#eee8aa',\n    'palegreen':'#98fb98',\n    'paleturquoise':'#afeeee',\n    'palevioletred':'#d87093',\n    'papayawhip':'#ffefd5',\n    'peachpuff':'#ffdab9',\n    'peru':'#cd853f',\n    'pink':'#ffc0cb',\n    'plum':'#dda0dd',\n    'powderblue':'#b0e0e6',\n    'purple':'#800080',\n    'rebeccapurple':'#663399',\n    'red':'#ff0000',\n    'rosybrown':'#bc8f8f',\n    'royalblue':'#4169e1',\n    'saddlebrown':'#8b4513',\n    'salmon':'#fa8072',\n    'sandybrown':'#f4a460',\n    'seagreen':'#2e8b57',\n    'seashell':'#fff5ee',\n    'sienna':'#a0522d',\n    'silver':'#c0c0c0',\n    'skyblue':'#87ceeb',\n    'slateblue':'#6a5acd',\n    'slategray':'#708090',\n    'slategrey':'#708090',\n    'snow':'#fffafa',\n    'springgreen':'#00ff7f',\n    'steelblue':'#4682b4',\n    'tan':'#d2b48c',\n    'teal':'#008080',\n    'thistle':'#d8bfd8',\n    'tomato':'#ff6347',\n    'turquoise':'#40e0d0',\n    'violet':'#ee82ee',\n    'wheat':'#f5deb3',\n    'white':'#ffffff',\n    'whitesmoke':'#f5f5f5',\n    'yellow':'#ffff00',\n    'yellowgreen':'#9acd32'\n};"
  },
  {
    "path": "packages/less/lib/less/data/index.js",
    "content": "import colors from './colors.js';\nimport unitConversions from './unit-conversions.js';\n\nexport default { colors, unitConversions };\n"
  },
  {
    "path": "packages/less/lib/less/data/unit-conversions.js",
    "content": "export default {\n    length: {\n        'm': 1,\n        'cm': 0.01,\n        'mm': 0.001,\n        'in': 0.0254,\n        'px': 0.0254 / 96,\n        'pt': 0.0254 / 72,\n        'pc': 0.0254 / 72 * 12\n    },\n    duration: {\n        's': 1,\n        'ms': 0.001\n    },\n    angle: {\n        'rad': 1 / (2 * Math.PI),\n        'deg': 1 / 360,\n        'grad': 1 / 400,\n        'turn': 1\n    }\n};"
  },
  {
    "path": "packages/less/lib/less/default-options.js",
    "content": "// Export a new default each time\nexport default function() {\n    return {\n        /* Inline Javascript - @plugin still allowed */\n        javascriptEnabled: false,\n\n        /* Outputs a makefile import dependency list to stdout. */\n        depends: false,\n\n        /* (DEPRECATED) Compress using less built-in compression. \n         * This does an okay job but does not utilise all the tricks of \n         * dedicated css compression. */\n        compress: false,\n\n        /* Runs the less parser and just reports errors without any output. */\n        lint: false,\n\n        /* Sets available include paths.\n         * If the file in an @import rule does not exist at that exact location, \n         * less will look for it at the location(s) passed to this option. \n         * You might use this for instance to specify a path to a library which \n         * you want to be referenced simply and relatively in the less files. */\n        paths: [],\n\n        /* color output in the terminal */\n        color: true,\n\n        /**\n         * @deprecated This option has confusing behavior and may be removed in a future version.\n         * \n         * When true, prevents @import statements for .less files from being evaluated inside\n         * selector blocks (rulesets). The imports are silently ignored and not output.\n         * \n         * Behavior:\n         * - @import at root level: Always processed\n         * - @import inside @-rules (@media, @supports, etc.): Processed (these are not selector blocks)\n         * - @import inside selector blocks (.class, #id, etc.): NOT processed (silently ignored)\n         * \n         * When false (default): All @import statements are processed regardless of context.\n         * \n         * Note: Despite the name \"strict\", this option does NOT throw an error when imports\n         * are used in selector blocks - it silently ignores them. This is confusing\n         * behavior that may catch users off guard.\n         * \n         * Note: Only affects .less file imports. CSS imports (url(...) or .css files) are\n         * always output as CSS @import statements regardless of this setting.\n         * \n         * @see https://github.com/less/less.js/issues/656\n         */\n        strictImports: false,\n\n        /* Allow Imports from Insecure HTTPS Hosts */\n        insecure: false,\n\n        /* Allows you to add a path to every generated import and url in your css. \n         * This does not affect less import statements that are processed, just ones \n         * that are left in the output css. */\n        rootpath: '',\n\n        /* By default URLs are kept as-is, so if you import a file in a sub-directory \n         * that references an image, exactly the same URL will be output in the css. \n         * This option allows you to re-write URL's in imported files so that the \n         * URL is always relative to the base imported file */\n        rewriteUrls: false,\n\n        /* How to process math \n         *   0 always           - eagerly try to solve all operations\n         *   1 parens-division  - require parens for division \"/\"\n         *   2 parens | strict  - require parens for all operations\n         *   3 strict-legacy    - legacy strict behavior (super-strict)\n         */\n        math: 1,\n\n        /* Without this option, less attempts to guess at the output unit when it does maths. */\n        strictUnits: false,\n\n        /* Effectively the declaration is put at the top of your base Less file, \n         * meaning it can be used but it also can be overridden if this variable \n         * is defined in the file. */\n        globalVars: null,\n\n        /* As opposed to the global variable option, this puts the declaration at the\n         * end of your base file, meaning it will override anything defined in your Less file. */\n        modifyVars: null,\n\n        /* This option allows you to specify a argument to go on to every URL.  */\n        urlArgs: ''\n    }\n}"
  },
  {
    "path": "packages/less/lib/less/deprecation.js",
    "content": "/**\n * Deprecation registry for Less.js\n *\n * Each deprecation has a unique ID and description.\n * Repetition limiting caps warnings at 5 per deprecation type per parse.\n * Use --quiet-deprecations to suppress all deprecation warnings.\n */\n\nconst deprecations = {\n    'mixin-call-no-parens': {\n        description: 'Calling a mixin without parentheses is deprecated.'\n    },\n    'mixin-call-whitespace': {\n        description: 'Whitespace between a mixin name and parentheses for a mixin call is deprecated.'\n    },\n    'dot-slash-operator': {\n        description: 'The ./ operator is deprecated.'\n    },\n    'variable-in-unknown-value': {\n        description: '@[ident] in custom property values is treated as literal text.'\n    },\n    'property-in-unknown-value': {\n        description: '$[ident] in custom property values is treated as literal text.'\n    },\n    'js-eval': {\n        description: 'Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x.'\n    },\n    'at-plugin': {\n        description: 'The @plugin directive is deprecated and will be replaced in Less 5.x.'\n    },\n    'dump-line-numbers': {\n        description: 'The dumpLineNumbers option is deprecated and will be removed in Less 5.x.'\n    },\n    'math-always': {\n        description: '--math=always is deprecated and will be removed in Less 5.x.'\n    }\n};\n\nconst MAX_REPETITIONS = 5;\n\nclass DeprecationHandler {\n    constructor() {\n        /** @type {Record<string, number>} */\n        this._counts = {};\n    }\n\n    /** @param {string} deprecationId */\n    shouldWarn(deprecationId) {\n        if (!deprecationId) { return true; }\n        const count = (this._counts[deprecationId] || 0) + 1;\n        this._counts[deprecationId] = count;\n        return count <= MAX_REPETITIONS;\n    }\n\n    /** @param {{ warn: (msg: string) => void }} logger */\n    summarize(logger) {\n        for (const id of Object.keys(this._counts)) {\n            const omitted = this._counts[id] - MAX_REPETITIONS;\n            if (omitted > 0) {\n                logger.warn(`${omitted} repetitive \"${id}\" deprecation warning(s) omitted.`);\n            }\n        }\n    }\n}\n\nexport { deprecations, DeprecationHandler, MAX_REPETITIONS };\nexport default { deprecations, DeprecationHandler };\n"
  },
  {
    "path": "packages/less/lib/less/environment/abstract-file-manager.js",
    "content": "class AbstractFileManager {\n    getPath(filename) {\n        let j = filename.lastIndexOf('?');\n        if (j > 0) {\n            filename = filename.slice(0, j);\n        }\n        j = filename.lastIndexOf('/');\n        if (j < 0) {\n            j = filename.lastIndexOf('\\\\');\n        }\n        if (j < 0) {\n            return '';\n        }\n        return filename.slice(0, j + 1);\n    }\n\n    tryAppendExtension(path, ext) {\n        return /(\\.[a-z]*$)|([?;].*)$/.test(path) ? path : path + ext;\n    }\n\n    tryAppendLessExtension(path) {\n        return this.tryAppendExtension(path, '.less');\n    }\n\n    supportsSync() {\n        return false;\n    }\n\n    alwaysMakePathsAbsolute() {\n        return false;\n    }\n\n    isPathAbsolute(filename) {\n        return (/^(?:[a-z-]+:|\\/|\\\\|#)/i).test(filename);\n    }\n\n    // TODO: pull out / replace?\n    join(basePath, laterPath) {\n        if (!basePath) {\n            return laterPath;\n        }\n        return basePath + laterPath;\n    }\n\n    pathDiff(url, baseUrl) {\n        // diff between two paths to create a relative path\n\n        const urlParts = this.extractUrlParts(url);\n\n        const baseUrlParts = this.extractUrlParts(baseUrl);\n        let i;\n        let max;\n        let urlDirectories;\n        let baseUrlDirectories;\n        let diff = '';\n        if (urlParts.hostPart !== baseUrlParts.hostPart) {\n            return '';\n        }\n        max = Math.max(baseUrlParts.directories.length, urlParts.directories.length);\n        for (i = 0; i < max; i++) {\n            if (baseUrlParts.directories[i] !== urlParts.directories[i]) { break; }\n        }\n        baseUrlDirectories = baseUrlParts.directories.slice(i);\n        urlDirectories = urlParts.directories.slice(i);\n        for (i = 0; i < baseUrlDirectories.length - 1; i++) {\n            diff += '../';\n        }\n        for (i = 0; i < urlDirectories.length - 1; i++) {\n            diff += `${urlDirectories[i]}/`;\n        }\n        return diff;\n    }\n\n    /**\n     * Helper function, not part of API.\n     * This should be replaceable by newer Node / Browser APIs\n     * \n     * @param {string} url \n     * @param {string} baseUrl\n     */\n    extractUrlParts(url, baseUrl) {\n        // urlParts[1] = protocol://hostname/ OR /\n        // urlParts[2] = / if path relative to host base\n        // urlParts[3] = directories\n        // urlParts[4] = filename\n        // urlParts[5] = parameters\n\n        const urlPartsRegex = /^((?:[a-z-]+:)?\\/{2}(?:[^/?#]*\\/)|([/\\\\]))?((?:[^/\\\\?#]*[/\\\\])*)([^/\\\\?#]*)([#?].*)?$/i;\n\n        const urlParts = url.match(urlPartsRegex);\n        const returner = {};\n        let rawDirectories = [];\n        const directories = [];\n        let i;\n        let baseUrlParts;\n\n        if (!urlParts) {\n            throw new Error(`Could not parse sheet href - '${url}'`);\n        }\n\n        // Stylesheets in IE don't always return the full path\n        if (baseUrl && (!urlParts[1] || urlParts[2])) {\n            baseUrlParts = baseUrl.match(urlPartsRegex);\n            if (!baseUrlParts) {\n                throw new Error(`Could not parse page url - '${baseUrl}'`);\n            }\n            urlParts[1] = urlParts[1] || baseUrlParts[1] || '';\n            if (!urlParts[2]) {\n                urlParts[3] = baseUrlParts[3] + urlParts[3];\n            }\n        }\n\n        if (urlParts[3]) {\n            rawDirectories = urlParts[3].replace(/\\\\/g, '/').split('/');\n\n            // collapse '..' and skip '.'\n            for (i = 0; i < rawDirectories.length; i++) {\n\n                if (rawDirectories[i] === '..') {\n                    directories.pop();\n                }\n                else if (rawDirectories[i] !== '.') {\n                    directories.push(rawDirectories[i]);\n                }\n            \n            }\n        }\n\n        returner.hostPart = urlParts[1];\n        returner.directories = directories;\n        returner.rawPath = (urlParts[1] || '') + rawDirectories.join('/');\n        returner.path = (urlParts[1] || '') + directories.join('/');\n        returner.filename = urlParts[4];\n        returner.fileUrl = returner.path + (urlParts[4] || '');\n        returner.url = returner.fileUrl + (urlParts[5] || '');\n        return returner;\n    }\n}\n\nexport default AbstractFileManager;\n"
  },
  {
    "path": "packages/less/lib/less/environment/abstract-plugin-loader.js",
    "content": "import functionRegistry from '../functions/function-registry.js';\nimport LessError from '../less-error.js';\n\nclass AbstractPluginLoader {\n    constructor() {\n        // Implemented by Node.js plugin loader\n        this.require = function() {\n            return null;\n        }\n    }\n\n    evalPlugin(contents, context, imports, pluginOptions, fileInfo) {\n\n        let loader, registry, pluginObj, localModule, pluginManager, filename, result;\n\n        pluginManager = context.pluginManager;\n\n        if (fileInfo) {\n            if (typeof fileInfo === 'string') {\n                filename = fileInfo;\n            }\n            else {\n                filename = fileInfo.filename;\n            }\n        }\n        const shortname = (new this.less.FileManager()).extractUrlParts(filename).filename;\n\n        if (filename) {\n            pluginObj = pluginManager.get(filename);\n\n            if (pluginObj) {\n                result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n                if (result) {\n                    return result;\n                }\n                try {\n                    if (pluginObj.use) {\n                        pluginObj.use.call(this.context, pluginObj);\n                    }\n                }\n                catch (e) {\n                    e.message = e.message || 'Error during @plugin call';\n                    return new LessError(e, imports, filename);\n                }\n                return pluginObj;\n            }\n        }\n        localModule = {\n            exports: {},\n            pluginManager,\n            fileInfo\n        };\n        registry = functionRegistry.create();\n\n        const registerPlugin = function(obj) {\n            pluginObj = obj;\n        };\n\n        try {\n            loader = new Function('module', 'require', 'registerPlugin', 'functions', 'tree', 'less', 'fileInfo', contents);\n            loader(localModule, this.require(filename), registerPlugin, registry, this.less.tree, this.less, fileInfo);\n        }\n        catch (e) {\n            return new LessError(e, imports, filename);\n        }\n\n        if (!pluginObj) {\n            pluginObj = localModule.exports;\n        }\n        pluginObj = this.validatePlugin(pluginObj, filename, shortname);\n\n        if (pluginObj instanceof LessError) {\n            return pluginObj;\n        }\n\n        if (pluginObj) {\n            pluginObj.imports = imports;\n            pluginObj.filename = filename;\n\n            // For < 3.x (or unspecified minVersion) - setOptions() before install()\n            if (!pluginObj.minVersion || this.compareVersion('3.0.0', pluginObj.minVersion) < 0) {\n                result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n\n                if (result) {\n                    return result;\n                }\n            }\n\n            // Run on first load\n            pluginManager.addPlugin(pluginObj, fileInfo.filename, registry);\n            pluginObj.functions = registry.getLocalFunctions();\n\n            // Need to call setOptions again because the pluginObj might have functions\n            result = this.trySetOptions(pluginObj, filename, shortname, pluginOptions);\n            if (result) {\n                return result;\n            }\n\n            // Run every @plugin call\n            try {\n                if (pluginObj.use) {\n                    pluginObj.use.call(this.context, pluginObj);\n                }\n            }\n            catch (e) {\n                e.message = e.message || 'Error during @plugin call';\n                return new LessError(e, imports, filename);\n            }\n\n        }\n        else {\n            return new LessError({ message: 'Not a valid plugin' }, imports, filename);\n        }\n\n        return pluginObj;\n\n    }\n\n    trySetOptions(plugin, filename, name, options) {\n        if (options && !plugin.setOptions) {\n            return new LessError({\n                message: `Options have been provided but the plugin ${name} does not support any options.`\n            });\n        }\n        try {\n            plugin.setOptions && plugin.setOptions(options);\n        }\n        catch (e) {\n            return new LessError(e);\n        }\n    }\n\n    validatePlugin(plugin, filename, name) {\n        if (plugin) {\n            // support plugins being a function\n            // so that the plugin can be more usable programmatically\n            if (typeof plugin === 'function') {\n                plugin = new plugin();\n            }\n\n            if (plugin.minVersion) {\n                if (this.compareVersion(plugin.minVersion, this.less.version) < 0) {\n                    return new LessError({\n                        message: `Plugin ${name} requires version ${this.versionToString(plugin.minVersion)}`\n                    });\n                }\n            }\n            return plugin;\n        }\n        return null;\n    }\n\n    compareVersion(aVersion, bVersion) {\n        if (typeof aVersion === 'string') {\n            aVersion = aVersion.match(/^(\\d+)\\.?(\\d+)?\\.?(\\d+)?/);\n            aVersion.shift();\n        }\n        for (let i = 0; i < aVersion.length; i++) {\n            if (aVersion[i] !== bVersion[i]) {\n                return parseInt(aVersion[i]) > parseInt(bVersion[i]) ? -1 : 1;\n            }\n        }\n        return 0;\n    }\n\n    versionToString(version) {\n        let versionString = '';\n        for (let i = 0; i < version.length; i++) {\n            versionString += (versionString ? '.' : '') + version[i];\n        }\n        return versionString;\n    }\n\n    printUsage(plugins) {\n        for (let i = 0; i < plugins.length; i++) {\n            const plugin = plugins[i];\n            if (plugin.printUsage) {\n                plugin.printUsage();\n            }\n        }\n    }\n}\n\nexport default AbstractPluginLoader;\n\n"
  },
  {
    "path": "packages/less/lib/less/environment/environment-api.ts",
    "content": "export interface Environment {\n    /**\n     * Converts a string to a base 64 string\n     */\n    encodeBase64(str: string): string\n    /**\n     * Lookup the mime-type of a filename\n     */\n    mimeLookup(filename: string): string\n    /**\n     * Look up the charset of a mime type\n     * @param mime\n     */\n    charsetLookup(mime: string): string\n    /**\n     * Gets a source map generator\n     *\n     * @todo - Figure out precise type\n     */\n    getSourceMapGenerator(): any\n}\n"
  },
  {
    "path": "packages/less/lib/less/environment/environment.js",
    "content": "/**\n * @todo Document why this abstraction exists, and the relationship between\n *       environment, file managers, and plugin manager\n */\n\nimport logger from '../logger.js';\n\nclass Environment {\n    constructor(externalEnvironment, fileManagers) {\n        this.fileManagers = fileManagers || [];\n        externalEnvironment = externalEnvironment || {};\n\n        const optionalFunctions = ['encodeBase64', 'mimeLookup', 'charsetLookup', 'getSourceMapGenerator'];\n        const requiredFunctions = [];\n        const functions = requiredFunctions.concat(optionalFunctions);\n\n        for (let i = 0; i < functions.length; i++) {\n            const propName = functions[i];\n            const environmentFunc = externalEnvironment[propName];\n            if (environmentFunc) {\n                this[propName] = environmentFunc.bind(externalEnvironment);\n            } else if (i < requiredFunctions.length) {\n                this.warn(`missing required function in environment - ${propName}`);\n            }\n        }\n    }\n\n    getFileManager(filename, currentDirectory, options, environment, isSync) {\n\n        if (!filename) {\n            logger.warn('getFileManager called with no filename.. Please report this issue. continuing.');\n        }\n        if (currentDirectory === undefined) {\n            logger.warn('getFileManager called with null directory.. Please report this issue. continuing.');\n        }\n\n        let fileManagers = this.fileManagers;\n        if (options.pluginManager) {\n            fileManagers = [].concat(fileManagers).concat(options.pluginManager.getFileManagers());\n        }\n        for (let i = fileManagers.length - 1; i >= 0 ; i--) {\n            const fileManager = fileManagers[i];\n            if (fileManager[isSync ? 'supportsSync' : 'supports'](filename, currentDirectory, options, environment)) {\n                return fileManager;\n            }\n        }\n        return null;\n    }\n\n    addFileManager(fileManager) {\n        this.fileManagers.push(fileManager);\n    }\n\n    clearFileManagers() {\n        this.fileManagers = [];\n    }\n}\n\nexport default Environment;\n"
  },
  {
    "path": "packages/less/lib/less/environment/file-manager-api.ts",
    "content": "import type { Environment } from './environment-api'\n\nexport interface FileManager {\n    /**\n     * Given the full path to a file, return the path component\n     * Provided by AbstractFileManager\n     */\n    getPath(filename: string): string\n    /**\n     * Append a .less extension if appropriate. Only called if less thinks one could be added.\n     * Provided by AbstractFileManager\n     */\n    tryAppendLessExtension(filename: string): string\n    /**\n     * Whether the rootpath should be converted to be absolute.\n     * The browser ovverides this to return true because urls must be absolute.\n     * Provided by AbstractFileManager (returns false)\n     */\n    alwaysMakePathsAbsolute(): boolean\n    /**\n     * Returns whether a path is absolute\n     * Provided by AbstractFileManager\n     */\n    isPathAbsolute(path: string): boolean\n    /**\n     * joins together 2 paths\n     * Provided by AbstractFileManager\n     */\n    join(basePath: string, laterPath: string): string\n    /**\n     * Returns the difference between 2 paths\n     * E.g. url = a/ baseUrl = a/b/ returns ../\n     * url = a/b/ baseUrl = a/ returns b/\n     * Provided by AbstractFileManager\n     */\n    pathDiff(url: string, baseUrl: string): string\n    /**\n     * Returns whether this file manager supports this file for syncronous file retrieval\n     * If true is returned, loadFileSync will then be called with the file.\n     * Provided by AbstractFileManager (returns false)\n     * \n     * @todo - Narrow Options type\n     */\n    supportsSync(\n        filename: string,\n        currentDirectory: string,\n        options: Record<string, any>,\n        environment: Environment\n    ): boolean\n    /**\n     * If file manager supports async file retrieval for this file type\n     */\n    supports(\n        filename: string,\n        currentDirectory: string,\n        options: Record<string, any>,\n        environment: Environment\n    ): boolean\n    /**\n     * Loads a file asynchronously.\n     */\n    loadFile(\n        filename: string,\n        currentDirectory: string,\n        options: Record<string, any>,\n        environment: Environment\n    ): Promise<{ filename: string, contents: string }>\n    /**\n     * Loads a file synchronously. Expects an immediate return with an object\n     */\n    loadFileSync(\n        filename: string,\n        currentDirectory: string,\n        options: Record<string, any>,\n        environment: Environment\n    ): { error?: unknown, filename: string, contents: string }\n}\n"
  },
  {
    "path": "packages/less/lib/less/functions/boolean.js",
    "content": "import Anonymous from '../tree/anonymous.js';\nimport Keyword from '../tree/keyword.js';\n\nfunction boolean(condition) {\n    return condition ? Keyword.True : Keyword.False;\n}\n\n/**\n * Functions with evalArgs set to false are sent context\n * as the first argument.\n */\nfunction If(context, condition, trueValue, falseValue) {\n    return condition.eval(context) ? trueValue.eval(context)\n        : (falseValue ? falseValue.eval(context) : new Anonymous);\n}\nIf.evalArgs = false;\n\nfunction isdefined(context, variable) {\n    try {\n        variable.eval(context);\n        return Keyword.True;\n    } catch (e) {\n        return Keyword.False;\n    }\n}\n\nisdefined.evalArgs = false;\n\nexport default { isdefined, boolean, 'if': If };\n"
  },
  {
    "path": "packages/less/lib/less/functions/color-blending.js",
    "content": "import Color from '../tree/color.js';\n\n// Color Blending\n// ref: http://www.w3.org/TR/compositing-1\n\nfunction colorBlend(mode, color1, color2) {\n    const ab = color1.alpha;        // result\n\n    let // backdrop\n        cb;\n\n    const as = color2.alpha;\n\n    let // source\n        cs;\n\n    let ar;\n    let cr;\n    const r = [];\n\n    ar = as + ab * (1 - as);\n    for (let i = 0; i < 3; i++) {\n        cb = color1.rgb[i] / 255;\n        cs = color2.rgb[i] / 255;\n        cr = mode(cb, cs);\n        if (ar) {\n            cr = (as * cs + ab * (cb -\n                  as * (cb + cs - cr))) / ar;\n        }\n        r[i] = cr * 255;\n    }\n\n    return new Color(r, ar);\n}\n\nconst colorBlendModeFunctions = {\n    multiply: function(cb, cs) {\n        return cb * cs;\n    },\n    screen: function(cb, cs) {\n        return cb + cs - cb * cs;\n    },\n    overlay: function(cb, cs) {\n        cb *= 2;\n        return (cb <= 1) ?\n            colorBlendModeFunctions.multiply(cb, cs) :\n            colorBlendModeFunctions.screen(cb - 1, cs);\n    },\n    softlight: function(cb, cs) {\n        let d = 1;\n        let e = cb;\n        if (cs > 0.5) {\n            e = 1;\n            d = (cb > 0.25) ? Math.sqrt(cb)\n                : ((16 * cb - 12) * cb + 4) * cb;\n        }\n        return cb - (1 - 2 * cs) * e * (d - cb);\n    },\n    hardlight: function(cb, cs) {\n        return colorBlendModeFunctions.overlay(cs, cb);\n    },\n    difference: function(cb, cs) {\n        return Math.abs(cb - cs);\n    },\n    exclusion: function(cb, cs) {\n        return cb + cs - 2 * cb * cs;\n    },\n\n    // non-w3c functions:\n    average: function(cb, cs) {\n        return (cb + cs) / 2;\n    },\n    negation: function(cb, cs) {\n        return 1 - Math.abs(cb + cs - 1);\n    }\n};\n\nfor (const f in colorBlendModeFunctions) {\n    // eslint-disable-next-line no-prototype-builtins\n    if (colorBlendModeFunctions.hasOwnProperty(f)) {\n        colorBlend[f] = colorBlend.bind(null, colorBlendModeFunctions[f]);\n    }\n}\n\nexport default colorBlend;\n"
  },
  {
    "path": "packages/less/lib/less/functions/color.js",
    "content": "import Dimension from '../tree/dimension.js';\nimport Color from '../tree/color.js';\nimport Quoted from '../tree/quoted.js';\nimport Anonymous from '../tree/anonymous.js';\nimport Expression from '../tree/expression.js';\nimport Operation from '../tree/operation.js';\nlet colorFunctions;\n\nfunction clamp(val) {\n    return Math.min(1, Math.max(0, val));\n}\nfunction hsla(origColor, hsl) {\n    const color = colorFunctions.hsla(hsl.h, hsl.s, hsl.l, hsl.a);\n    if (color) {\n        if (origColor.value && \n            /^(rgb|hsl)/.test(origColor.value)) {\n            color.value = origColor.value;\n        } else {\n            color.value = 'rgb';\n        }\n        return color;\n    }\n}\nfunction toHSL(color) {\n    if (color.toHSL) {\n        return color.toHSL();\n    } else {\n        throw new Error('Argument cannot be evaluated to a color');\n    }\n}\n\nfunction toHSV(color) {\n    if (color.toHSV) {\n        return color.toHSV();\n    } else {\n        throw new Error('Argument cannot be evaluated to a color');\n    }\n}\n\nfunction number(n) {\n    if (n instanceof Dimension) {\n        return parseFloat(n.unit.is('%') ? n.value / 100 : n.value);\n    } else if (typeof n === 'number') {\n        return n;\n    } else {\n        throw {\n            type: 'Argument',\n            message: 'color functions take numbers as parameters'\n        };\n    }\n}\nfunction scaled(n, size) {\n    if (n instanceof Dimension && n.unit.is('%')) {\n        return parseFloat(n.value * size / 100);\n    } else {\n        return number(n);\n    }\n}\ncolorFunctions = {\n    rgb: function (r, g, b) {\n        let a = 1\n        /**\n         * Comma-less syntax\n         *   e.g. rgb(0 128 255 / 50%)\n         */\n        if (r instanceof Expression) {\n            const val = r.value\n            r = val[0]\n            g = val[1]\n            b = val[2]\n            /** \n             * @todo - should this be normalized in\n             *   function caller? Or parsed differently?\n             */\n            if (b instanceof Operation) {\n                const op = b\n                b = op.operands[0]\n                a = op.operands[1]\n            }\n        }\n        const color = colorFunctions.rgba(r, g, b, a);\n        if (color) {\n            color.value = 'rgb';\n            return color;\n        }\n    },\n    rgba: function (r, g, b, a) {\n        try {\n            if (r instanceof Color) {\n                if (g) {\n                    a = number(g);\n                } else {\n                    a = r.alpha;\n                }\n                return new Color(r.rgb, a, 'rgba');\n            }\n            const rgb = [r, g, b].map(c => scaled(c, 255));\n            a = number(a);\n            return new Color(rgb, a, 'rgba');\n        }\n        catch (e) {}\n    },\n    hsl: function (h, s, l) {\n        let a = 1\n        if (h instanceof Expression) {\n            const val = h.value\n            h = val[0]\n            s = val[1]\n            l = val[2]\n\n            if (l instanceof Operation) {\n                const op = l\n                l = op.operands[0]\n                a = op.operands[1]\n            }\n        }\n        const color = colorFunctions.hsla(h, s, l, a);\n        if (color) {\n            color.value = 'hsl';\n            return color;\n        }\n    },\n    hsla: function (h, s, l, a) {\n        let m1;\n        let m2;\n\n        function hue(h) {\n            h = h < 0 ? h + 1 : (h > 1 ? h - 1 : h);\n            if (h * 6 < 1) {\n                return m1 + (m2 - m1) * h * 6;\n            }\n            else if (h * 2 < 1) {\n                return m2;\n            }\n            else if (h * 3 < 2) {\n                return m1 + (m2 - m1) * (2 / 3 - h) * 6;\n            }\n            else {\n                return m1;\n            }\n        }\n\n        try {\n            if (h instanceof Color) {\n                if (s) {\n                    a = number(s);\n                } else {\n                    a = h.alpha;\n                }\n                return new Color(h.rgb, a, 'hsla');\n            }\n\n            h = (number(h) % 360) / 360;\n            s = clamp(number(s));l = clamp(number(l));a = clamp(number(a));\n\n            m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n            m1 = l * 2 - m2;\n\n            const rgb = [\n                hue(h + 1 / 3) * 255,\n                hue(h)       * 255,\n                hue(h - 1 / 3) * 255\n            ];\n            a = number(a);\n            return new Color(rgb, a, 'hsla');\n        }\n        catch (e) {}\n    },\n\n    hsv: function(h, s, v) {\n        return colorFunctions.hsva(h, s, v, 1.0);\n    },\n\n    hsva: function(h, s, v, a) {\n        h = ((number(h) % 360) / 360) * 360;\n        s = number(s);v = number(v);a = number(a);\n\n        let i;\n        let f;\n        i = Math.floor((h / 60) % 6);\n        f = (h / 60) - i;\n\n        const vs = [v,\n            v * (1 - s),\n            v * (1 - f * s),\n            v * (1 - (1 - f) * s)];\n        const perm = [[0, 3, 1],\n            [2, 0, 1],\n            [1, 0, 3],\n            [1, 2, 0],\n            [3, 1, 0],\n            [0, 1, 2]];\n\n        return colorFunctions.rgba(vs[perm[i][0]] * 255,\n            vs[perm[i][1]] * 255,\n            vs[perm[i][2]] * 255,\n            a);\n    },\n\n    hue: function (color) {\n        return new Dimension(toHSL(color).h);\n    },\n    saturation: function (color) {\n        return new Dimension(toHSL(color).s * 100, '%');\n    },\n    lightness: function (color) {\n        return new Dimension(toHSL(color).l * 100, '%');\n    },\n    hsvhue: function(color) {\n        return new Dimension(toHSV(color).h);\n    },\n    hsvsaturation: function (color) {\n        return new Dimension(toHSV(color).s * 100, '%');\n    },\n    hsvvalue: function (color) {\n        return new Dimension(toHSV(color).v * 100, '%');\n    },\n    red: function (color) {\n        return new Dimension(color.rgb[0]);\n    },\n    green: function (color) {\n        return new Dimension(color.rgb[1]);\n    },\n    blue: function (color) {\n        return new Dimension(color.rgb[2]);\n    },\n    alpha: function (color) {\n        return new Dimension(toHSL(color).a);\n    },\n    luma: function (color) {\n        return new Dimension(color.luma() * color.alpha * 100, '%');\n    },\n    luminance: function (color) {\n        const luminance =\n            (0.2126 * color.rgb[0] / 255) +\n                (0.7152 * color.rgb[1] / 255) +\n                (0.0722 * color.rgb[2] / 255);\n\n        return new Dimension(luminance * color.alpha * 100, '%');\n    },\n    saturate: function (color, amount, method) {\n        // filter: saturate(3.2);\n        // should be kept as is, so check for color\n        if (!color.rgb) {\n            return null;\n        }\n        const hsl = toHSL(color);\n\n        if (typeof method !== 'undefined' && method.value === 'relative') {\n            hsl.s +=  hsl.s * amount.value / 100;\n        }\n        else {\n            hsl.s += amount.value / 100;\n        }\n        hsl.s = clamp(hsl.s);\n        return hsla(color, hsl);\n    },\n    desaturate: function (color, amount, method) {\n        const hsl = toHSL(color);\n\n        if (typeof method !== 'undefined' && method.value === 'relative') {\n            hsl.s -=  hsl.s * amount.value / 100;\n        }\n        else {\n            hsl.s -= amount.value / 100;\n        }\n        hsl.s = clamp(hsl.s);\n        return hsla(color, hsl);\n    },\n    lighten: function (color, amount, method) {\n        const hsl = toHSL(color);\n\n        if (typeof method !== 'undefined' && method.value === 'relative') {\n            hsl.l +=  hsl.l * amount.value / 100;\n        }\n        else {\n            hsl.l += amount.value / 100;\n        }\n        hsl.l = clamp(hsl.l);\n        return hsla(color, hsl);\n    },\n    darken: function (color, amount, method) {\n        const hsl = toHSL(color);\n\n        if (typeof method !== 'undefined' && method.value === 'relative') {\n            hsl.l -=  hsl.l * amount.value / 100;\n        }\n        else {\n            hsl.l -= amount.value / 100;\n        }\n        hsl.l = clamp(hsl.l);\n        return hsla(color, hsl);\n    },\n    fadein: function (color, amount, method) {\n        const hsl = toHSL(color);\n\n        if (typeof method !== 'undefined' && method.value === 'relative') {\n            hsl.a +=  hsl.a * amount.value / 100;\n        }\n        else {\n            hsl.a += amount.value / 100;\n        }\n        hsl.a = clamp(hsl.a);\n        return hsla(color, hsl);\n    },\n    fadeout: function (color, amount, method) {\n        const hsl = toHSL(color);\n\n        if (typeof method !== 'undefined' && method.value === 'relative') {\n            hsl.a -=  hsl.a * amount.value / 100;\n        }\n        else {\n            hsl.a -= amount.value / 100;\n        }\n        hsl.a = clamp(hsl.a);\n        return hsla(color, hsl);\n    },\n    fade: function (color, amount) {\n        const hsl = toHSL(color);\n\n        hsl.a = amount.value / 100;\n        hsl.a = clamp(hsl.a);\n        return hsla(color, hsl);\n    },\n    spin: function (color, amount) {\n        const hsl = toHSL(color);\n        const hue = (hsl.h + amount.value) % 360;\n\n        hsl.h = hue < 0 ? 360 + hue : hue;\n\n        return hsla(color, hsl);\n    },\n    //\n    // Copyright (c) 2006-2009 Hampton Catlin, Natalie Weizenbaum, and Chris Eppstein\n    // http://sass-lang.com\n    //\n    mix: function (color1, color2, weight) {\n        if (!weight) {\n            weight = new Dimension(50);\n        }\n        const p = weight.value / 100.0;\n        const w = p * 2 - 1;\n        const a = toHSL(color1).a - toHSL(color2).a;\n\n        const w1 = (((w * a == -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n        const w2 = 1 - w1;\n\n        const rgb = [color1.rgb[0] * w1 + color2.rgb[0] * w2,\n            color1.rgb[1] * w1 + color2.rgb[1] * w2,\n            color1.rgb[2] * w1 + color2.rgb[2] * w2];\n\n        const alpha = color1.alpha * p + color2.alpha * (1 - p);\n\n        return new Color(rgb, alpha);\n    },\n    greyscale: function (color) {\n        return colorFunctions.desaturate(color, new Dimension(100));\n    },\n    contrast: function (color, dark, light, threshold) {\n        // filter: contrast(3.2);\n        // should be kept as is, so check for color\n        if (!color.rgb) {\n            return null;\n        }\n        if (typeof light === 'undefined') {\n            light = colorFunctions.rgba(255, 255, 255, 1.0);\n        }\n        if (typeof dark === 'undefined') {\n            dark = colorFunctions.rgba(0, 0, 0, 1.0);\n        }\n        // Figure out which is actually light and dark:\n        if (dark.luma() > light.luma()) {\n            const t = light;\n            light = dark;\n            dark = t;\n        }\n        if (typeof threshold === 'undefined') {\n            threshold = 0.43;\n        } else {\n            threshold = number(threshold);\n        }\n        if (color.luma() < threshold) {\n            return light;\n        } else {\n            return dark;\n        }\n    },\n    // Changes made in 2.7.0 - Reverted in 3.0.0\n    // contrast: function (color, color1, color2, threshold) {\n    //     // Return which of `color1` and `color2` has the greatest contrast with `color`\n    //     // according to the standard WCAG contrast ratio calculation.\n    //     // http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n    //     // The threshold param is no longer used, in line with SASS.\n    //     // filter: contrast(3.2);\n    //     // should be kept as is, so check for color\n    //     if (!color.rgb) {\n    //         return null;\n    //     }\n    //     if (typeof color1 === 'undefined') {\n    //         color1 = colorFunctions.rgba(0, 0, 0, 1.0);\n    //     }\n    //     if (typeof color2 === 'undefined') {\n    //         color2 = colorFunctions.rgba(255, 255, 255, 1.0);\n    //     }\n    //     var contrast1, contrast2;\n    //     var luma = color.luma();\n    //     var luma1 = color1.luma();\n    //     var luma2 = color2.luma();\n    //     // Calculate contrast ratios for each color\n    //     if (luma > luma1) {\n    //         contrast1 = (luma + 0.05) / (luma1 + 0.05);\n    //     } else {\n    //         contrast1 = (luma1 + 0.05) / (luma + 0.05);\n    //     }\n    //     if (luma > luma2) {\n    //         contrast2 = (luma + 0.05) / (luma2 + 0.05);\n    //     } else {\n    //         contrast2 = (luma2 + 0.05) / (luma + 0.05);\n    //     }\n    //     if (contrast1 > contrast2) {\n    //         return color1;\n    //     } else {\n    //         return color2;\n    //     }\n    // },\n    argb: function (color) {\n        return new Anonymous(color.toARGB());\n    },\n    color: function(c) {\n        if ((c instanceof Quoted) &&\n            (/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})$/i.test(c.value))) {\n            const val = c.value.slice(1);\n            return new Color(val, undefined, `#${val}`);\n        }\n        if ((c instanceof Color) || (c = Color.fromKeyword(c.value))) {\n            c.value = undefined;\n            return c;\n        }\n        throw {\n            type:    'Argument',\n            message: 'argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF'\n        };\n    },\n    tint: function(color, amount) {\n        return colorFunctions.mix(colorFunctions.rgb(255, 255, 255), color, amount);\n    },\n    shade: function(color, amount) {\n        return colorFunctions.mix(colorFunctions.rgb(0, 0, 0), color, amount);\n    }\n};\n\nexport default colorFunctions;\n"
  },
  {
    "path": "packages/less/lib/less/functions/data-uri.js",
    "content": "import Quoted from '../tree/quoted.js';\nimport URL from '../tree/url.js';\nimport * as utils from '../utils.js';\nimport logger from '../logger.js';\n\nexport default environment => {\n    \n    const fallback = (functionThis, node) => new URL(node, functionThis.index, functionThis.currentFileInfo).eval(functionThis.context);    \n\n    return { 'data-uri': function(mimetypeNode, filePathNode) {\n\n        if (!filePathNode) {\n            filePathNode = mimetypeNode;\n            mimetypeNode = null;\n        }\n\n        let mimetype = mimetypeNode && mimetypeNode.value;\n        let filePath = filePathNode.value;\n        const currentFileInfo = this.currentFileInfo;\n        const currentDirectory = currentFileInfo.rewriteUrls ?\n            currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n        const fragmentStart = filePath.indexOf('#');\n        let fragment = '';\n        if (fragmentStart !== -1) {\n            fragment = filePath.slice(fragmentStart);\n            filePath = filePath.slice(0, fragmentStart);\n        }\n        const context = utils.clone(this.context);\n        context.rawBuffer = true;\n\n        const fileManager = environment.getFileManager(filePath, currentDirectory, context, environment, true);\n\n        if (!fileManager) {\n            return fallback(this, filePathNode);\n        }\n\n        let useBase64 = false;\n\n        // detect the mimetype if not given\n        if (!mimetypeNode) {\n\n            mimetype = environment.mimeLookup(filePath);\n\n            if (mimetype === 'image/svg+xml') {\n                useBase64 = false;\n            } else {\n                // use base 64 unless it's an ASCII or UTF-8 format\n                const charset = environment.charsetLookup(mimetype);\n                useBase64 = ['US-ASCII', 'UTF-8'].indexOf(charset) < 0;\n            }\n            if (useBase64) { mimetype += ';base64'; }\n        }\n        else {\n            useBase64 = /;base64$/.test(mimetype);\n        }\n\n        const fileSync = fileManager.loadFileSync(filePath, currentDirectory, context, environment);\n        if (!fileSync.contents) {\n            logger.warn(`Skipped data-uri embedding of ${filePath} because file not found`);\n            return fallback(this, filePathNode || mimetypeNode);\n        }\n        let buf = fileSync.contents;\n        if (useBase64 && !environment.encodeBase64) {\n            return fallback(this, filePathNode);\n        }\n\n        buf = useBase64 ? environment.encodeBase64(buf) : encodeURIComponent(buf);\n\n        const uri = `data:${mimetype},${buf}${fragment}`;\n\n        return new URL(new Quoted(`\"${uri}\"`, uri, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n    }};\n};\n"
  },
  {
    "path": "packages/less/lib/less/functions/default.js",
    "content": "import Keyword from '../tree/keyword.js';\nimport * as utils from '../utils.js';\n\nconst defaultFunc = {\n    eval: function () {\n        const v = this.value_;\n        const e = this.error_;\n        if (e) {\n            throw e;\n        }\n        if (!utils.isNullOrUndefined(v)) {\n            return v ? Keyword.True : Keyword.False;\n        }\n    },\n    value: function (v) {\n        this.value_ = v;\n    },\n    error: function (e) {\n        this.error_ = e;\n    },\n    reset: function () {\n        this.value_ = this.error_ = null;\n    }\n};\n\nexport default defaultFunc;\n"
  },
  {
    "path": "packages/less/lib/less/functions/function-caller.js",
    "content": "import Expression from '../tree/expression.js';\n\nclass functionCaller {\n    constructor(name, context, index, currentFileInfo) {\n        this.name = name.toLowerCase();\n        this.index = index;\n        this.context = context;\n        this.currentFileInfo = currentFileInfo;\n\n        this.func = context.frames[0].functionRegistry.get(this.name);\n    }\n\n    isValid() {\n        return Boolean(this.func);\n    }\n\n    call(args) {\n        if (!(Array.isArray(args))) {\n            args = [args];\n        }\n        const evalArgs = this.func.evalArgs;\n        if (evalArgs !== false) {\n            args = args.map(a => a.eval(this.context));\n        }\n        const commentFilter = item => !(item.type === 'Comment');\n\n        // This code is terrible and should be replaced as per this issue...\n        // https://github.com/less/less.js/issues/2477\n        args = args\n            .filter(commentFilter)\n            .map(item => {\n                if (item.type === 'Expression') {\n                    const subNodes = item.value.filter(commentFilter);\n                    if (subNodes.length === 1) {\n                        // https://github.com/less/less.js/issues/3616\n                        if (item.parens && subNodes[0].op === '/') {\n                            return item;\n                        }\n                        return subNodes[0];\n                    } else {\n                        return new Expression(subNodes);\n                    }\n                }\n                return item;\n            });\n\n        if (evalArgs === false) {\n            return this.func(this.context, ...args);\n        }\n\n        return this.func(...args);\n    }\n}\n\nexport default functionCaller;\n"
  },
  {
    "path": "packages/less/lib/less/functions/function-registry.js",
    "content": "function makeRegistry( base ) {\n    return {\n        _data: {},\n        add: function(name, func) {\n            // precautionary case conversion, as later querying of\n            // the registry by function-caller uses lower case as well.\n            name = name.toLowerCase();\n\n            // eslint-disable-next-line no-prototype-builtins\n            if (this._data.hasOwnProperty(name)) {\n                // TODO warn\n            }\n            this._data[name] = func;\n        },\n        addMultiple: function(functions) {\n            Object.keys(functions).forEach(\n                name => {\n                    this.add(name, functions[name]);\n                });\n        },\n        get: function(name) {\n            return this._data[name] || ( base && base.get( name ));\n        },\n        getLocalFunctions: function() {\n            return this._data;\n        },\n        inherit: function() {\n            return makeRegistry( this );\n        },\n        create: function(base) {\n            return makeRegistry(base);\n        }\n    };\n}\n\nexport default makeRegistry( null );"
  },
  {
    "path": "packages/less/lib/less/functions/index.js",
    "content": "import functionRegistry from './function-registry.js';\nimport functionCaller from './function-caller.js';\n\nimport boolean from './boolean.js';\nimport defaultFunc from './default.js';\nimport color from './color.js';\nimport colorBlending from './color-blending.js';\nimport dataUri from './data-uri.js';\nimport list from './list.js';\nimport math from './math.js';\nimport number from './number.js';\nimport string from './string.js';\nimport svg from './svg.js';\nimport types from './types.js';\nimport style from './style.js';\n\nexport default environment => {\n    const functions = { functionRegistry, functionCaller };\n\n    // register functions\n    functionRegistry.addMultiple(boolean);\n    functionRegistry.add('default', defaultFunc.eval.bind(defaultFunc));\n    functionRegistry.addMultiple(color);\n    functionRegistry.addMultiple(colorBlending);\n    functionRegistry.addMultiple(dataUri(environment));\n    functionRegistry.addMultiple(list);\n    functionRegistry.addMultiple(math);\n    functionRegistry.addMultiple(number);\n    functionRegistry.addMultiple(string);\n    functionRegistry.addMultiple(svg(environment));\n    functionRegistry.addMultiple(types);\n    functionRegistry.addMultiple(style);\n\n    return functions;\n};\n"
  },
  {
    "path": "packages/less/lib/less/functions/list.js",
    "content": "import Comment from '../tree/comment.js';\nimport Node from '../tree/node.js';\nimport Dimension from '../tree/dimension.js';\nimport Declaration from '../tree/declaration.js';\nimport Expression from '../tree/expression.js';\nimport Ruleset from '../tree/ruleset.js';\nimport Selector from '../tree/selector.js';\nimport Element from '../tree/element.js';\nimport Quote from '../tree/quoted.js';\nimport Value from '../tree/value.js';\n\nconst getItemsFromNode = node => {\n    // handle non-array values as an array of length 1\n    // return 'undefined' if index is invalid\n    const items = Array.isArray(node.value) ?\n        node.value : Array(node);\n\n    return items;\n};\n\nexport default {\n    _SELF: function(n) {\n        return n;\n    },\n    '~': function(...expr) {\n        if (expr.length === 1) {\n            return expr[0];\n        }\n        return new Value(expr);\n    },\n    extract: function(values, index) {\n        // (1-based index)\n        index = index.value - 1;\n\n        return getItemsFromNode(values)[index];\n    },\n    length: function(values) {\n        return new Dimension(getItemsFromNode(values).length);\n    },\n    /**\n     * Creates a Less list of incremental values.\n     * Modeled after Lodash's range function, also exists natively in PHP\n     * \n     * @param {Dimension} [start=1]\n     * @param {Dimension} end  - e.g. 10 or 10px - unit is added to output\n     * @param {Dimension} [step=1] \n     */\n    range: function(start, end, step) {\n        let from;\n        let to;\n        let stepValue = 1;\n        const list = [];\n        if (end) {\n            to = end;\n            from = start.value;\n            if (step) {\n                stepValue = step.value;\n            }\n        }\n        else {\n            from = 1;\n            to = start;\n        }\n\n        for (let i = from; i <= to.value; i += stepValue) {\n            list.push(new Dimension(i, to.unit));\n        }\n\n        return new Expression(list);\n    },\n    each: function(list, rs) {\n        const rules = [];\n        let newRules;\n        let iterator;\n\n        const tryEval = val => {\n            if (val instanceof Node) {\n                return val.eval(this.context);\n            }\n            return val;\n        };\n\n        if (list.value && !(list instanceof Quote)) {\n            if (Array.isArray(list.value)) {\n                iterator = list.value.map(tryEval);\n            } else {\n                iterator = [tryEval(list.value)];\n            }\n        } else if (list.ruleset) {\n            iterator = tryEval(list.ruleset).rules;\n        } else if (list.rules) {\n            iterator = list.rules.map(tryEval);\n        } else if (Array.isArray(list)) {\n            iterator = list.map(tryEval);\n        } else {\n            iterator = [tryEval(list)];\n        }\n\n        let valueName = '@value';\n        let keyName = '@key';\n        let indexName = '@index';\n\n        if (rs.params) {\n            valueName = rs.params[0] && rs.params[0].name;\n            keyName = rs.params[1] && rs.params[1].name;\n            indexName = rs.params[2] && rs.params[2].name;\n            rs = rs.rules;\n        } else {\n            rs = rs.ruleset;\n        }\n\n        for (let i = 0; i < iterator.length; i++) {\n            let key;\n            let value;\n            const item = iterator[i];\n            if (item instanceof Declaration) {\n                key = typeof item.name === 'string' ? item.name : item.name[0].value;\n                value = item.value;\n            } else {\n                key = new Dimension(i + 1);\n                value = item;\n            }\n\n            if (item instanceof Comment) {\n                continue;\n            }\n\n            newRules = rs.rules.slice(0);\n            if (valueName) {\n                newRules.push(new Declaration(valueName,\n                    value,\n                    false, false, this.index, this.currentFileInfo));\n            }\n            if (indexName) {\n                newRules.push(new Declaration(indexName,\n                    new Dimension(i + 1),\n                    false, false, this.index, this.currentFileInfo));\n            }\n            if (keyName) {\n                newRules.push(new Declaration(keyName,\n                    key,\n                    false, false, this.index, this.currentFileInfo));\n            }\n\n            rules.push(new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n                newRules,\n                rs.strictImports,\n                rs.visibilityInfo()\n            ));\n        }\n\n        return new Ruleset([ new(Selector)([ new Element('', '&') ]) ],\n            rules,\n            rs.strictImports,\n            rs.visibilityInfo()\n        ).eval(this.context);\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less/functions/math-helper.js",
    "content": "import Dimension from '../tree/dimension.js';\n\nconst MathHelper = (fn, unit, n) => {\n    if (!(n instanceof Dimension)) {\n        throw { type: 'Argument', message: 'argument must be a number' };\n    }\n    if (unit === null) {\n        unit = n.unit;\n    } else {\n        n = n.unify();\n    }\n    return new Dimension(fn(parseFloat(n.value)), unit);\n};\n\nexport default MathHelper;"
  },
  {
    "path": "packages/less/lib/less/functions/math.js",
    "content": "import mathHelper from './math-helper.js';\n\nconst mathFunctions = {\n    // name,  unit\n    ceil:  null,\n    floor: null,\n    sqrt:  null,\n    abs:   null,\n    tan:   '',\n    sin:   '',\n    cos:   '',\n    atan:  'rad',\n    asin:  'rad',\n    acos:  'rad'\n};\n\nfor (const f in mathFunctions) {\n    // eslint-disable-next-line no-prototype-builtins\n    if (mathFunctions.hasOwnProperty(f)) {\n        mathFunctions[f] = mathHelper.bind(null, Math[f], mathFunctions[f]);\n    }\n}\n\nmathFunctions.round = (n, f) => {\n    const fraction = typeof f === 'undefined' ? 0 : f.value;\n    return mathHelper(num => num.toFixed(fraction), null, n);\n};\n\nexport default mathFunctions;\n"
  },
  {
    "path": "packages/less/lib/less/functions/number.js",
    "content": "import Dimension from '../tree/dimension.js';\nimport Anonymous from '../tree/anonymous.js';\nimport mathHelper from './math-helper.js';\n\nconst minMax = function (isMin, args) {\n    args = Array.prototype.slice.call(args);\n    switch (args.length) {\n        case 0: throw { type: 'Argument', message: 'one or more arguments required' };\n    }\n    let i; // key is the unit.toString() for unified Dimension values,\n    let j;\n    let current;\n    let currentUnified;\n    let referenceUnified;\n    let unit;\n    let unitStatic;\n    let unitClone;\n\n    const // elems only contains original argument values.\n        order  = [];\n\n    const values = {};\n    // value is the index into the order array.\n    for (i = 0; i < args.length; i++) {\n        current = args[i];\n        if (!(current instanceof Dimension)) {\n            if (Array.isArray(args[i].value)) {\n                Array.prototype.push.apply(args, Array.prototype.slice.call(args[i].value));\n                continue;\n            } else {\n                throw { type: 'Argument', message: 'incompatible types' };\n            }\n        }\n        currentUnified = current.unit.toString() === '' && unitClone !== undefined ? new Dimension(current.value, unitClone).unify() : current.unify();\n        unit = currentUnified.unit.toString() === '' && unitStatic !== undefined ? unitStatic : currentUnified.unit.toString();\n        unitStatic = unit !== '' && unitStatic === undefined || unit !== '' && order[0].unify().unit.toString() === '' ? unit : unitStatic;\n        unitClone = unit !== '' && unitClone === undefined ? current.unit.toString() : unitClone;\n        j = values[''] !== undefined && unit !== '' && unit === unitStatic ? values[''] : values[unit];\n        if (j === undefined) {\n            if (unitStatic !== undefined && unit !== unitStatic) {\n                throw { type: 'Argument', message: 'incompatible types' };\n            }\n            values[unit] = order.length;\n            order.push(current);\n            continue;\n        }\n        referenceUnified = order[j].unit.toString() === '' && unitClone !== undefined ? new Dimension(order[j].value, unitClone).unify() : order[j].unify();\n        if ( isMin && currentUnified.value < referenceUnified.value ||\n            !isMin && currentUnified.value > referenceUnified.value) {\n            order[j] = current;\n        }\n    }\n    if (order.length == 1) {\n        return order[0];\n    }\n    args = order.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n    return new Anonymous(`${isMin ? 'min' : 'max'}(${args})`);\n};\n\nexport default {\n    min: function(...args) {\n        try {\n            return minMax.call(this, true, args);\n        } catch (e) {}\n    },\n    max: function(...args) {\n        try {\n            return minMax.call(this, false, args);\n        } catch (e) {}\n    },\n    convert: function (val, unit) {\n        return val.convertTo(unit.value);\n    },\n    pi: function () {\n        return new Dimension(Math.PI);\n    },\n    mod: function(a, b) {\n        return new Dimension(a.value % b.value, a.unit);\n    },\n    pow: function(x, y) {\n        if (typeof x === 'number' && typeof y === 'number') {\n            x = new Dimension(x);\n            y = new Dimension(y);\n        } else if (!(x instanceof Dimension) || !(y instanceof Dimension)) {\n            throw { type: 'Argument', message: 'arguments must be numbers' };\n        }\n\n        return new Dimension(Math.pow(x.value, y.value), x.unit);\n    },\n    percentage: function (n) {\n        const result = mathHelper(num => num * 100, '%', n);\n\n        return result;\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less/functions/string.js",
    "content": "import Quoted from '../tree/quoted.js';\nimport Anonymous from '../tree/anonymous.js';\nimport JavaScript from '../tree/javascript.js';\n\nexport default {\n    e: function (str) {\n        return new Quoted('\"', str instanceof JavaScript ? str.evaluated : str.value, true);\n    },\n    escape: function (str) {\n        return new Anonymous(\n            encodeURI(str.value).replace(/=/g, '%3D').replace(/:/g, '%3A').replace(/#/g, '%23').replace(/;/g, '%3B')\n                .replace(/\\(/g, '%28').replace(/\\)/g, '%29'));\n    },\n    replace: function (string, pattern, replacement, flags) {\n        let result = string.value;\n        replacement = (replacement.type === 'Quoted') ?\n            replacement.value : replacement.toCSS();\n        result = result.replace(new RegExp(pattern.value, flags ? flags.value : ''), replacement);\n        return new Quoted(string.quote || '', result, string.escaped);\n    },\n    '%': function (string /* arg, arg, ... */) {\n        const args = Array.prototype.slice.call(arguments, 1);\n        let result = string.value;\n\n        for (let i = 0; i < args.length; i++) {\n            /* jshint loopfunc:true */\n            result = result.replace(/%[sda]/i, token => {\n                const value = ((args[i].type === 'Quoted') &&\n                    token.match(/s/i)) ? args[i].value : args[i].toCSS();\n                return token.match(/[A-Z]$/) ? encodeURIComponent(value) : value;\n            });\n        }\n        result = result.replace(/%%/g, '%');\n        return new Quoted(string.quote || '', result, string.escaped);\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less/functions/style.js",
    "content": "import Variable from '../tree/variable.js';\nimport Anonymous from '../tree/anonymous.js';\n\n/** @param {*[]} args */\nconst styleExpression = function (args) {\n    args = Array.prototype.slice.call(args);\n    if (args.length === 0) {\n        throw { type: 'Argument', message: 'one or more arguments required' };\n    }\n\n    const entityList = [new Variable(args[0].value, this.index, this.currentFileInfo).eval(this.context)];\n\n    const result = entityList.map(a => { return a.toCSS(this.context); }).join(this.context.compress ? ',' : ', ');\n\n    return new Anonymous(`style(${result})`);\n};\n\nexport default {\n    /** @param {...*} args */\n    style: function(...args) {\n        try {\n            return styleExpression.call(this, args);\n        } catch (e) {\n            // When style() is used as a CSS function (e.g. @container style(--responsive: true)),\n            // arguments won't be valid Less variables. Return undefined to let the\n            // parser fall through and treat it as plain CSS.\n        }\n    },\n};\n"
  },
  {
    "path": "packages/less/lib/less/functions/svg.js",
    "content": "import Dimension from '../tree/dimension.js';\nimport Color from '../tree/color.js';\nimport Expression from '../tree/expression.js';\nimport Quoted from '../tree/quoted.js';\nimport URL from '../tree/url.js';\n\nexport default () => {\n    return { 'svg-gradient': function(direction) {\n        let stops;\n        let gradientDirectionSvg;\n        let gradientType = 'linear';\n        let rectangleDimension = 'x=\"0\" y=\"0\" width=\"1\" height=\"1\"';\n        const renderEnv = {compress: false};\n        let returner;\n        const directionValue = direction.toCSS(renderEnv);\n        let i;\n        let color;\n        let position;\n        let positionValue;\n        let alpha;\n\n        function throwArgumentDescriptor() {\n            throw { type: 'Argument',\n                message: 'svg-gradient expects direction, start_color [start_position], [color position,]...,' +\n                            ' end_color [end_position] or direction, color list' };\n        }\n\n        if (arguments.length == 2) {\n            if (arguments[1].value.length < 2) {\n                throwArgumentDescriptor();\n            }\n            stops = arguments[1].value;\n        } else if (arguments.length < 3) {\n            throwArgumentDescriptor();\n        } else {\n            stops = Array.prototype.slice.call(arguments, 1);\n        }\n\n        switch (directionValue) {\n            case 'to bottom':\n                gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\"';\n                break;\n            case 'to right':\n                gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\"';\n                break;\n            case 'to bottom right':\n                gradientDirectionSvg = 'x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"';\n                break;\n            case 'to top right':\n                gradientDirectionSvg = 'x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"0%\"';\n                break;\n            case 'ellipse':\n            case 'ellipse at center':\n                gradientType = 'radial';\n                gradientDirectionSvg = 'cx=\"50%\" cy=\"50%\" r=\"75%\"';\n                rectangleDimension = 'x=\"-50\" y=\"-50\" width=\"101\" height=\"101\"';\n                break;\n            default:\n                throw { type: 'Argument', message: 'svg-gradient direction must be \\'to bottom\\', \\'to right\\',' +\n                    ' \\'to bottom right\\', \\'to top right\\' or \\'ellipse at center\\'' };\n        }\n        returner = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 1\"><${gradientType}Gradient id=\"g\" ${gradientDirectionSvg}>`;\n\n        for (i = 0; i < stops.length; i += 1) {\n            if (stops[i] instanceof Expression) {\n                color = stops[i].value[0];\n                position = stops[i].value[1];\n            } else {\n                color = stops[i];\n                position = undefined;\n            }\n\n            if (!(color instanceof Color) || (!((i === 0 || i + 1 === stops.length) && position === undefined) && !(position instanceof Dimension))) {\n                throwArgumentDescriptor();\n            }\n            positionValue = position ? position.toCSS(renderEnv) : i === 0 ? '0%' : '100%';\n            alpha = color.alpha;\n            returner += `<stop offset=\"${positionValue}\" stop-color=\"${color.toRGB()}\"${alpha < 1 ? ` stop-opacity=\"${alpha}\"` : ''}/>`;\n        }\n        returner += `</${gradientType}Gradient><rect ${rectangleDimension} fill=\"url(#g)\" /></svg>`;\n\n        returner = encodeURIComponent(returner);\n\n        returner = `data:image/svg+xml,${returner}`;\n        return new URL(new Quoted(`'${returner}'`, returner, false, this.index, this.currentFileInfo), this.index, this.currentFileInfo);\n    }};\n};\n"
  },
  {
    "path": "packages/less/lib/less/functions/types.js",
    "content": "import Keyword from '../tree/keyword.js';\nimport DetachedRuleset from '../tree/detached-ruleset.js';\nimport Dimension from '../tree/dimension.js';\nimport Color from '../tree/color.js';\nimport Quoted from '../tree/quoted.js';\nimport Anonymous from '../tree/anonymous.js';\nimport URL from '../tree/url.js';\nimport Operation from '../tree/operation.js';\n\nconst isa = (n, Type) => (n instanceof Type) ? Keyword.True : Keyword.False;\nconst isunit = (n, unit) => {\n    if (unit === undefined) {\n        throw { type: 'Argument', message: 'missing the required second argument to isunit.' };\n    }\n    unit = typeof unit.value === 'string' ? unit.value : unit;\n    if (typeof unit !== 'string') {\n        throw { type: 'Argument', message: 'Second argument to isunit should be a unit or a string.' };\n    }\n    return (n instanceof Dimension) && n.unit.is(unit) ? Keyword.True : Keyword.False;\n};\n\nexport default {\n    isruleset: function (n) {\n        return isa(n, DetachedRuleset);\n    },\n    iscolor: function (n) {\n        return isa(n, Color);\n    },\n    isnumber: function (n) {\n        return isa(n, Dimension);\n    },\n    isstring: function (n) {\n        return isa(n, Quoted);\n    },\n    iskeyword: function (n) {\n        return isa(n, Keyword);\n    },\n    isurl: function (n) {\n        return isa(n, URL);\n    },\n    ispixel: function (n) {\n        return isunit(n, 'px');\n    },\n    ispercentage: function (n) {\n        return isunit(n, '%');\n    },\n    isem: function (n) {\n        return isunit(n, 'em');\n    },\n    isunit,\n    unit: function (val, unit) {\n        if (!(val instanceof Dimension)) {\n            throw { type: 'Argument',\n                message: `the first argument to unit must be a number${val instanceof Operation ? '. Have you forgotten parenthesis?' : ''}` };\n        }\n        if (unit) {\n            if (unit instanceof Keyword) {\n                unit = unit.value;\n            } else {\n                unit = unit.toCSS();\n            }\n        } else {\n            unit = '';\n        }\n        return new Dimension(val.value, unit);\n    },\n    'get-unit': function (n) {\n        return new Anonymous(n.unit);\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less/import-manager.js",
    "content": "import contexts from './contexts.js';\nimport Parser from './parser/parser.js';\nimport LessError from './less-error.js';\nimport * as utils from './utils.js';\nimport logger from './logger.js';\n\nexport default function(environment) {\n    // FileInfo = {\n    //  'rewriteUrls' - option - whether to adjust URL's to be relative\n    //  'filename' - full resolved filename of current file\n    //  'rootpath' - path to append to normal URLs for this node\n    //  'currentDirectory' - path to the current file, absolute\n    //  'rootFilename' - filename of the base file\n    //  'entryPath' - absolute path to the entry file\n    //  'reference' - whether the file should not be output and only output parts that are referenced\n\n    class ImportManager {\n        constructor(less, context, rootFileInfo) {\n            this.less = less;\n            this.rootFilename = rootFileInfo.filename;\n            this.paths = context.paths || [];  // Search paths, when importing\n            this.contents = {};             // map - filename to contents of all the files\n            this.contentsIgnoredChars = {}; // map - filename to lines at the beginning of each file to ignore\n            this.mime = context.mime;\n            this.error = null;\n            this.context = context;\n            // Deprecated? Unused outside of here, could be useful.\n            this.queue = [];        // Files which haven't been imported yet\n            this.files = {};        // Holds the imported parse trees.\n        }\n\n        /**\n         * Add an import to be imported\n         * @param path - the raw path\n         * @param tryAppendExtension - whether to try appending a file extension (.less or .js if the path has no extension)\n         * @param currentFileInfo - the current file info (used for instance to work out relative paths)\n         * @param importOptions - import options\n         * @param callback - callback for when it is imported\n         */\n        push(path, tryAppendExtension, currentFileInfo, importOptions, callback) {\n            const importManager = this, pluginLoader = this.context.pluginManager.Loader;\n\n            this.queue.push(path);\n\n            const fileParsedFunc = function (e, root, fullPath) {\n                importManager.queue.splice(importManager.queue.indexOf(path), 1); // Remove the path from the queue\n\n                const importedEqualsRoot = fullPath === importManager.rootFilename;\n                if (importOptions.optional && e) {\n                    callback(null, {rules:[]}, false, null);\n                    logger.info(`The file ${fullPath} was skipped because it was not found and the import was marked optional.`);\n                }\n                else {\n                    // Inline imports aren't cached here.\n                    // If we start to cache them, please make sure they won't conflict with non-inline imports of the\n                    // same name as they used to do before this comment and the condition below have been added.\n                    if (!importManager.files[fullPath] && !importOptions.inline) {\n                        importManager.files[fullPath] = { root, options: importOptions };\n                    }\n                    if (e && !importManager.error) { importManager.error = e; }\n                    callback(e, root, importedEqualsRoot, fullPath);\n                }\n            };\n\n            const newFileInfo = {\n                rewriteUrls: this.context.rewriteUrls,\n                entryPath: currentFileInfo.entryPath,\n                rootpath: currentFileInfo.rootpath,\n                rootFilename: currentFileInfo.rootFilename\n            };\n\n            const fileManager = environment.getFileManager(path, currentFileInfo.currentDirectory, this.context, environment);\n\n            if (!fileManager) {\n                fileParsedFunc({ message: `Could not find a file-manager for ${path}` });\n                return;\n            }\n\n            const loadFileCallback = function(loadedFile) {\n                let plugin;\n                const resolvedFilename = loadedFile.filename;\n                const contents = loadedFile.contents.replace(/^\\uFEFF/, '');\n\n                // Pass on an updated rootpath if path of imported file is relative and file\n                // is in a (sub|sup) directory\n                //\n                // Examples:\n                // - If path of imported file is 'module/nav/nav.less' and rootpath is 'less/',\n                //   then rootpath should become 'less/module/nav/'\n                // - If path of imported file is '../mixins.less' and rootpath is 'less/',\n                //   then rootpath should become 'less/../'\n                newFileInfo.currentDirectory = fileManager.getPath(resolvedFilename);\n                if (newFileInfo.rewriteUrls) {\n                    newFileInfo.rootpath = fileManager.join(\n                        (importManager.context.rootpath || ''),\n                        fileManager.pathDiff(newFileInfo.currentDirectory, newFileInfo.entryPath));\n\n                    if (!fileManager.isPathAbsolute(newFileInfo.rootpath) && fileManager.alwaysMakePathsAbsolute()) {\n                        newFileInfo.rootpath = fileManager.join(newFileInfo.entryPath, newFileInfo.rootpath);\n                    }\n                }\n                newFileInfo.filename = resolvedFilename;\n\n                const newEnv = new contexts.Parse(importManager.context);\n\n                newEnv.processImports = false;\n                importManager.contents[resolvedFilename] = contents;\n\n                if (currentFileInfo.reference || importOptions.reference) {\n                    newFileInfo.reference = true;\n                }\n\n                if (importOptions.isPlugin) {\n                    plugin = pluginLoader.evalPlugin(contents, newEnv, importManager, importOptions.pluginArgs, newFileInfo);\n                    if (plugin instanceof LessError) {\n                        fileParsedFunc(plugin, null, resolvedFilename);\n                    }\n                    else {\n                        fileParsedFunc(null, plugin, resolvedFilename);\n                    }\n                } else if (importOptions.inline) {\n                    fileParsedFunc(null, contents, resolvedFilename);\n                } else {\n                    // import (multiple) parse trees apparently get altered and can't be cached.\n                    // TODO: investigate why this is\n                    if (importManager.files[resolvedFilename]\n                        && !importManager.files[resolvedFilename].options.multiple\n                        && !importOptions.multiple) {\n\n                        fileParsedFunc(null, importManager.files[resolvedFilename].root, resolvedFilename);\n                    }\n                    else {\n                        new Parser(newEnv, importManager, newFileInfo).parse(contents, function (e, root) {\n                            fileParsedFunc(e, root, resolvedFilename);\n                        });\n                    }\n                }\n            };\n            let loadedFile;\n            let promise;\n            const context = utils.clone(this.context);\n\n            if (tryAppendExtension) {\n                context.ext = importOptions.isPlugin ? '.js' : '.less';\n            }\n\n            if (importOptions.isPlugin) {\n                context.mime = 'application/javascript';\n\n                if (context.syncImport) {\n                    loadedFile = pluginLoader.loadPluginSync(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n                } else {\n                    promise = pluginLoader.loadPlugin(path, currentFileInfo.currentDirectory, context, environment, fileManager);\n                }\n            }\n            else {\n                if (context.syncImport) {\n                    loadedFile = fileManager.loadFileSync(path, currentFileInfo.currentDirectory, context, environment);\n                } else {\n                    promise = fileManager.loadFile(path, currentFileInfo.currentDirectory, context, environment,\n                        (err, loadedFile) => {\n                            if (err) {\n                                fileParsedFunc(err);\n                            } else {\n                                loadFileCallback(loadedFile);\n                            }\n                        });\n                }\n            }\n            if (loadedFile) {\n                if (!loadedFile.filename) {\n                    fileParsedFunc(loadedFile);\n                } else {\n                    loadFileCallback(loadedFile);\n                }\n            } else if (promise) {\n                promise.then(loadFileCallback, fileParsedFunc);\n            }\n        }\n    }\n\n    return ImportManager;\n}\n"
  },
  {
    "path": "packages/less/lib/less/index.js",
    "content": "import Environment from './environment/environment.js';\nimport data from './data/index.js';\nimport tree from './tree/index.js';\nimport AbstractFileManager from './environment/abstract-file-manager.js';\nimport AbstractPluginLoader from './environment/abstract-plugin-loader.js';\nimport visitors from './visitors/index.js';\nimport Parser from './parser/parser.js';\nimport functions from './functions/index.js';\nimport contexts from './contexts.js';\nimport LessError from './less-error.js';\nimport transformTree from './transform-tree.js';\nimport * as utils from './utils.js';\nimport PluginManager from './plugin-manager.js';\nimport logger from './logger.js';\nimport SourceMapOutput from './source-map-output.js';\nimport SourceMapBuilder from './source-map-builder.js';\nimport ParseTree from './parse-tree.js';\nimport ImportManager from './import-manager.js';\nimport Parse from './parse.js';\nimport Render from './render.js';\nimport parseVersion from 'parse-node-version';\n\nexport default function(environment, fileManagers, version = '0.0.0') {\n    let sourceMapOutput, sourceMapBuilder, parseTree, importManager;\n\n    environment = new Environment(environment, fileManagers);\n    sourceMapOutput = SourceMapOutput(environment);\n    sourceMapBuilder = SourceMapBuilder(sourceMapOutput, environment);\n    parseTree = ParseTree(sourceMapBuilder);\n    importManager = ImportManager(environment);\n\n    const render = Render(environment, parseTree, importManager);\n    const parse = Parse(environment, parseTree, importManager);\n\n    const v = parseVersion(`v${version}`);\n    const initial = {\n        version: [v.major, v.minor, v.patch],\n        data,\n        tree,\n        Environment,\n        AbstractFileManager,\n        AbstractPluginLoader,\n        environment,\n        visitors,\n        Parser,\n        functions: functions(environment),\n        contexts,\n        SourceMapOutput: sourceMapOutput,\n        SourceMapBuilder: sourceMapBuilder,\n        ParseTree: parseTree,\n        ImportManager: importManager,\n        render,\n        parse,\n        LessError,\n        transformTree,\n        utils,\n        PluginManager,\n        logger\n    };\n\n    // Create a public API\n\n    const ctor = function(t) {\n        return function(...args) {\n            return new t(...args);\n        };\n    };\n    let t;\n    const api = Object.create(initial);\n    for (const n in initial.tree) {\n        /* eslint guard-for-in: 0 */\n        t = initial.tree[n];\n        if (typeof t === 'function') {\n            api[n.toLowerCase()] = ctor(t);\n        }\n        else {\n            api[n] = Object.create(null);\n            for (const o in t) {\n                /* eslint guard-for-in: 0 */\n                api[n][o.toLowerCase()] = ctor(t[o]);\n            }\n        }\n    }\n\n    /**\n     * Some of the functions assume a `this` context of the API object,\n     * which causes it to fail when wrapped for ES6 imports.\n     * \n     * An assumed `this` should be removed in the future.\n     */\n    initial.parse = initial.parse.bind(api);\n    initial.render = initial.render.bind(api);\n\n    return api;\n}\n"
  },
  {
    "path": "packages/less/lib/less/less-error.js",
    "content": "import * as utils from './utils.js';\n\nconst anonymousFunc = /(<anonymous>|Function):(\\d+):(\\d+)/;\n\n/**\n * This is a centralized class of any error that could be thrown internally (mostly by the parser).\n * Besides standard .message it keeps some additional data like a path to the file where the error\n * occurred along with line and column numbers.\n *\n * @class\n * @extends Error\n * @type {module.LessError}\n *\n * @prop {string} type\n * @prop {string} filename\n * @prop {number} index\n * @prop {number} line\n * @prop {number} column\n * @prop {number} callLine\n * @prop {number} callExtract\n * @prop {string[]} extract\n *\n * @param {Object} e              - An error object to wrap around or just a descriptive object\n * @param {Object} fileContentMap - An object with file contents in 'contents' property (like importManager) @todo - move to fileManager?\n * @param {string} [currentFilename]\n */\nconst LessError = function(e, fileContentMap, currentFilename) {\n    Error.call(this);\n\n    const filename = e.filename || currentFilename;\n\n    this.message = e.message;\n    this.stack = e.stack;\n    \n    // Set type early so it's always available, even if fileContentMap is missing\n    this.type = e.type || 'Syntax';\n\n    if (fileContentMap && filename) {\n        const input = fileContentMap.contents[filename];\n        const loc = utils.getLocation(e.index, input);\n        var line = loc.line;\n        const col  = loc.column;\n        const callLine = e.call && utils.getLocation(e.call, input).line;\n        const lines = input ? input.split('\\n') : '';\n\n        this.filename = filename;\n        this.index = e.index;\n        this.line = typeof line === 'number' ? line + 1 : null;\n        this.column = col;\n\n        if (!this.line && this.stack) {\n            const found = this.stack.match(anonymousFunc);\n\n            /**\n             * We have to figure out how this environment stringifies anonymous functions\n             * so we can correctly map plugin errors.\n             *\n             * Note, in Node 8, the output of anonymous funcs varied based on parameters\n             * being present or not, so we inject dummy params.\n             */\n            const func = new Function('a', 'throw new Error()');\n            let lineAdjust = 0;\n            try {\n                func();\n            } catch (e) {\n                const match = e.stack.match(anonymousFunc);\n                lineAdjust = 1 - parseInt(match[2]);\n            }\n\n            if (found) {\n                if (found[2]) {\n                    this.line = parseInt(found[2]) + lineAdjust;\n                }\n                if (found[3]) {\n                    this.column = parseInt(found[3]);\n                }\n            }\n        }\n\n        this.callLine = callLine + 1;\n        this.callExtract = lines[callLine];\n\n        this.extract = [\n            lines[this.line - 2],\n            lines[this.line - 1],\n            lines[this.line]\n        ];\n    }\n\n};\n\nif (typeof Object.create === 'undefined') {\n    const F = function () {};\n    F.prototype = Error.prototype;\n    LessError.prototype = new F();\n} else {\n    LessError.prototype = Object.create(Error.prototype);\n}\n\nLessError.prototype.constructor = LessError;\n\n/**\n * An overridden version of the default Object.prototype.toString\n * which uses additional information to create a helpful message.\n *\n * @param {Object} options\n * @returns {string}\n */\nLessError.prototype.toString = function(options) {\n    options = options || {};\n    const isWarning = (this.type ?? '').toLowerCase().includes('warning');\n    const type = isWarning ? this.type : `${this.type}Error`;\n    const color = isWarning ? 'yellow' : 'red';\n\n    let message = '';\n    const extract = this.extract || [];\n    let error = [];\n    let stylize = function (str) { return str; };\n    if (options.stylize) {\n        const type = typeof options.stylize;\n        if (type !== 'function') {\n            throw Error(`options.stylize should be a function, got a ${type}!`);\n        }\n        stylize = options.stylize;\n    }\n\n    if (this.line !== null) {\n        if (!isWarning && typeof extract[0] === 'string') {\n            error.push(stylize(`${this.line - 1} ${extract[0]}`, 'grey'));\n        }\n\n        if (typeof extract[1] === 'string') {\n            let errorTxt = `${this.line} `;\n            if (extract[1]) {\n                errorTxt += extract[1].slice(0, this.column) +\n                    stylize(stylize(stylize(extract[1].slice(this.column, this.column + 1), 'bold') +\n                        extract[1].slice(this.column + 1), 'red'), 'inverse');\n            }\n            error.push(errorTxt);\n        }\n\n        if (!isWarning && typeof extract[2] === 'string') {\n            error.push(stylize(`${this.line + 1} ${extract[2]}`, 'grey'));\n        }\n        error = `${error.join('\\n') + stylize('', 'reset')}\\n`;\n    }\n\n    message += stylize(`${type}: ${this.message}`, color);\n    if (this.filename) {\n        message += stylize(' in ', color) + this.filename;\n    }\n    if (this.line) {\n        message += stylize(` on line ${this.line}, column ${this.column + 1}:`, 'grey');\n    }\n\n    message += `\\n${error}`;\n\n    if (this.callLine) {\n        message += `${stylize('from ', color) + (this.filename || '')}/n`;\n        message += `${stylize(this.callLine, 'grey')} ${this.callExtract}/n`;\n    }\n\n    return message;\n};\n\nexport default LessError;\n"
  },
  {
    "path": "packages/less/lib/less/logger.js",
    "content": "export default {\n    error: function(msg) {\n        this._fireEvent('error', msg);\n    },\n    warn: function(msg) {\n        this._fireEvent('warn', msg);\n    },\n    info: function(msg) {\n        this._fireEvent('info', msg);\n    },\n    debug: function(msg) {\n        this._fireEvent('debug', msg);\n    },\n    addListener: function(listener) {\n        this._listeners.push(listener);\n    },\n    removeListener: function(listener) {\n        for (let i = 0; i < this._listeners.length; i++) {\n            if (this._listeners[i] === listener) {\n                this._listeners.splice(i, 1);\n                return;\n            }\n        }\n    },\n    _fireEvent: function(type, msg) {\n        for (let i = 0; i < this._listeners.length; i++) {\n            const logFunction = this._listeners[i][type];\n            if (logFunction) {\n                logFunction(msg);\n            }\n        }\n    },\n    _listeners: []\n};\n"
  },
  {
    "path": "packages/less/lib/less/parse-tree.js",
    "content": "import LessError from './less-error.js';\nimport transformTree from './transform-tree.js';\nimport logger from './logger.js';\n\nexport default function(SourceMapBuilder) {\n    class ParseTree {\n        constructor(root, imports) {\n            this.root = root;\n            this.imports = imports;\n        }\n\n        toCSS(options) {\n            let evaldRoot;\n            const result = {};\n            let sourceMapBuilder;\n            try {\n                evaldRoot = transformTree(this.root, options);\n            } catch (e) {\n                throw new LessError(e, this.imports);\n            }\n\n            try {\n                const compress = Boolean(options.compress);\n                if (compress) {\n                    logger.warn('The compress option has been deprecated. ' + \n                        'We recommend you use a dedicated css minifier, for instance see less-plugin-clean-css.');\n                }\n\n                const toCSSOptions = {\n                    compress,\n                    // @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead. All modes will be removed in a future version.\n                    dumpLineNumbers: options.dumpLineNumbers,\n                    strictUnits: Boolean(options.strictUnits),\n                    numPrecision: 8};\n\n                if (options.sourceMap) {\n                    // Normalize sourceMap option: if it's just true, convert to object\n                    if (options.sourceMap === true) {\n                        options.sourceMap = {};\n                    }\n                    const sourceMapOpts = options.sourceMap;\n                    \n                    // Set sourceMapInputFilename if not set and filename is available\n                    if (!sourceMapOpts.sourceMapInputFilename && options.filename) {\n                        sourceMapOpts.sourceMapInputFilename = options.filename;\n                    }\n                    \n                    // Default sourceMapBasepath to the input file's directory if not set\n                    // This matches the behavior documented and implemented in bin/lessc\n                    if (sourceMapOpts.sourceMapBasepath === undefined && options.filename) {\n                        // Get directory from filename using string manipulation (works cross-platform)\n                        const lastSlash = Math.max(options.filename.lastIndexOf('/'), options.filename.lastIndexOf('\\\\'));\n                        if (lastSlash >= 0) {\n                            sourceMapOpts.sourceMapBasepath = options.filename.substring(0, lastSlash);\n                        } else {\n                            // No directory separator found, use current directory\n                            sourceMapOpts.sourceMapBasepath = '.';\n                        }\n                    }\n                    \n                    // Handle sourceMapFullFilename (CLI-specific: --source-map=filename)\n                    // This is converted to sourceMapFilename and sourceMapOutputFilename\n                    if (sourceMapOpts.sourceMapFullFilename && !sourceMapOpts.sourceMapFileInline) {\n                        // This case is handled by lessc before calling render\n                        // We just need to ensure sourceMapFilename is set if sourceMapFullFilename is provided\n                        if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {\n                            // Extract just the basename for the sourceMappingURL comment\n                            const mapBase = sourceMapOpts.sourceMapFullFilename.split(/[/\\\\]/).pop();\n                            sourceMapOpts.sourceMapFilename = mapBase;\n                        }\n                    } else if (!sourceMapOpts.sourceMapFilename && !sourceMapOpts.sourceMapURL) {\n                        // If sourceMapFilename is not set and sourceMapURL is not set,\n                        // derive it from the output filename (if available) or input filename\n                        if (sourceMapOpts.sourceMapOutputFilename) {\n                            // Use output filename + .map\n                            sourceMapOpts.sourceMapFilename = sourceMapOpts.sourceMapOutputFilename + '.map';\n                        } else if (options.filename) {\n                            // Fallback to input filename + .css.map (basename only)\n                            const inputBasename = options.filename.split(/[/\\\\]/).pop().replace(/\\.[^/.]+$/, '');\n                            sourceMapOpts.sourceMapFilename = inputBasename + '.css.map';\n                        }\n                    }\n                    \n                    // Default sourceMapOutputFilename if not set\n                    if (!sourceMapOpts.sourceMapOutputFilename) {\n                        if (options.filename) {\n                            const inputBasename = options.filename.split(/[/\\\\]/).pop().replace(/\\.[^/.]+$/, '');\n                            sourceMapOpts.sourceMapOutputFilename = inputBasename + '.css';\n                        } else {\n                            sourceMapOpts.sourceMapOutputFilename = 'output.css';\n                        }\n                    }\n                    \n                    sourceMapBuilder = new SourceMapBuilder(sourceMapOpts);\n                    result.css = sourceMapBuilder.toCSS(evaldRoot, toCSSOptions, this.imports);\n                } else {\n                    result.css = evaldRoot.toCSS(toCSSOptions);\n                }\n            } catch (e) {\n                throw new LessError(e, this.imports);\n            }\n\n            if (options.pluginManager) {\n                const postProcessors = options.pluginManager.getPostProcessors();\n                for (let i = 0; i < postProcessors.length; i++) {\n                    result.css = postProcessors[i].process(result.css, { sourceMap: sourceMapBuilder, options, imports: this.imports });\n                }\n            }\n            if (options.sourceMap) {\n                result.map = sourceMapBuilder.getExternalSourceMap();\n            }\n\n            result.imports = [];\n            for (const file in this.imports.files) {\n                if (Object.prototype.hasOwnProperty.call(this.imports.files, file) && file !== this.imports.rootFilename) {\n                    result.imports.push(file);\n                }\n            }\n            return result;\n        }\n    }\n\n    return ParseTree;\n}\n"
  },
  {
    "path": "packages/less/lib/less/parse.js",
    "content": "import contexts from './contexts.js';\nimport Parser from './parser/parser.js';\nimport PluginManager from './plugin-manager.js';\nimport LessError from './less-error.js';\nimport * as utils from './utils.js';\n\nexport default function(environment, ParseTree, ImportManager) {\n    const parse = function (input, options, callback) {\n\n        if (typeof options === 'function') {\n            callback = options;\n            options = utils.copyOptions(this.options, {});\n        }\n        else {\n            options = utils.copyOptions(this.options, options || {});\n        }\n\n        if (!callback) {\n            const self = this;\n            return new Promise(function (resolve, reject) {\n                parse.call(self, input, options, function(err, output) {\n                    if (err) {\n                        reject(err);\n                    } else {\n                        resolve(output);\n                    }\n                });\n            });\n        } else {\n            let context;\n            let rootFileInfo;\n            const pluginManager = new PluginManager(this, !options.reUsePluginManager);\n\n            options.pluginManager = pluginManager;\n\n            context = new contexts.Parse(options);\n\n            if (options.rootFileInfo) {\n                rootFileInfo = options.rootFileInfo;\n            } else {\n                const filename = options.filename || 'input';\n                const entryPath = filename.replace(/[^/\\\\]*$/, '');\n                rootFileInfo = {\n                    filename,\n                    rewriteUrls: context.rewriteUrls,\n                    rootpath: context.rootpath || '',\n                    currentDirectory: entryPath,\n                    entryPath,\n                    rootFilename: filename\n                };\n                // add in a missing trailing slash\n                if (rootFileInfo.rootpath && rootFileInfo.rootpath.slice(-1) !== '/') {\n                    rootFileInfo.rootpath += '/';\n                }\n            }\n\n            const imports = new ImportManager(this, context, rootFileInfo);\n            this.importManager = imports;\n\n            // TODO: allow the plugins to be just a list of paths or names\n            // Do an async plugin queue like lessc\n\n            if (options.plugins) {\n                options.plugins.forEach(function(plugin) {\n                    let evalResult, contents;\n                    if (plugin.fileContent) {\n                        contents = plugin.fileContent.replace(/^\\uFEFF/, '');\n                        evalResult = pluginManager.Loader.evalPlugin(contents, context, imports, plugin.options, plugin.filename);\n                        if (evalResult instanceof LessError) {\n                            return callback(evalResult);\n                        }\n                    }\n                    else {\n                        pluginManager.addPlugin(plugin);\n                    }\n                });\n            }\n\n            new Parser(context, imports, rootFileInfo)\n                .parse(input, function (e, root) {\n                    if (e) { return callback(e); }\n                    callback(null, root, imports, options);\n                }, options);\n        }\n    };\n    return parse;\n}\n"
  },
  {
    "path": "packages/less/lib/less/parser/parser-input.js",
    "content": "export default () => {\n    let // Less input string\n        input;\n\n    let // current chunk\n        j;\n\n    const // holds state for backtracking\n        saveStack = [];\n\n    let // furthest index the parser has gone to\n        furthest;\n\n    let // if this is furthest we got to, this is the probably cause\n        furthestPossibleErrorMessage;\n\n    let // chunkified input\n        chunks;\n\n    let // current chunk\n        current;\n\n    let // index of current chunk, in `input`\n        currentPos;\n\n    const parserInput = {};\n    const CHARCODE_SPACE = 32;\n    const CHARCODE_TAB = 9;\n    const CHARCODE_LF = 10;\n    const CHARCODE_CR = 13;\n    const CHARCODE_PLUS = 43;\n    const CHARCODE_COMMA = 44;\n    const CHARCODE_FORWARD_SLASH = 47;\n    const CHARCODE_9 = 57;\n\n    function skipWhitespace(length) {\n        const oldi = parserInput.i;\n        const oldj = j;\n        const curr = parserInput.i - currentPos;\n        const endIndex = parserInput.i + current.length - curr;\n        const mem = (parserInput.i += length);\n        const inp = input;\n        let c;\n        let nextChar;\n        let comment;\n\n        for (; parserInput.i < endIndex; parserInput.i++) {\n            c = inp.charCodeAt(parserInput.i);\n\n            if (parserInput.autoCommentAbsorb && c === CHARCODE_FORWARD_SLASH) {\n                nextChar = inp.charAt(parserInput.i + 1);\n                if (nextChar === '/') {\n                    comment = {index: parserInput.i, isLineComment: true};\n                    let nextNewLine = inp.indexOf('\\n', parserInput.i + 2);\n                    if (nextNewLine < 0) {\n                        nextNewLine = endIndex;\n                    }\n                    parserInput.i = nextNewLine;\n                    comment.text = inp.slice(comment.index, parserInput.i);\n                    parserInput.commentStore.push(comment);\n                    continue;\n                } else if (nextChar === '*') {\n                    const nextStarSlash = inp.indexOf('*/', parserInput.i + 2);\n                    if (nextStarSlash >= 0) {\n                        comment = {\n                            index: parserInput.i,\n                            text: inp.slice(parserInput.i, nextStarSlash + 2),\n                            isLineComment: false\n                        };\n                        parserInput.i += comment.text.length - 1;\n                        parserInput.commentStore.push(comment);\n                        continue;\n                    }\n                }\n                break;\n            }\n\n            if ((c !== CHARCODE_SPACE) && (c !== CHARCODE_LF) && (c !== CHARCODE_TAB) && (c !== CHARCODE_CR)) {\n                break;\n            }\n        }\n\n        current = current.slice(length + parserInput.i - mem + curr);\n        currentPos = parserInput.i;\n\n        if (!current.length) {\n            if (j < chunks.length - 1) {\n                current = chunks[++j];\n                skipWhitespace(0); // skip space at the beginning of a chunk\n                return true; // things changed\n            }\n            parserInput.finished = true;\n        }\n\n        return oldi !== parserInput.i || oldj !== j;\n    }\n\n    parserInput.save = () => {\n        currentPos = parserInput.i;\n        saveStack.push( { current, i: parserInput.i, j });\n    };\n    parserInput.restore = possibleErrorMessage => {\n\n        if (parserInput.i > furthest || (parserInput.i === furthest && possibleErrorMessage && !furthestPossibleErrorMessage)) {\n            furthest = parserInput.i;\n            furthestPossibleErrorMessage = possibleErrorMessage;\n        }\n        const state = saveStack.pop();\n        current = state.current;\n        currentPos = parserInput.i = state.i;\n        j = state.j;\n    };\n    parserInput.forget = () => {\n        saveStack.pop();\n    };\n    parserInput.isWhitespace = offset => {\n        const pos = parserInput.i + (offset || 0);\n        const code = input.charCodeAt(pos);\n        return (code === CHARCODE_SPACE || code === CHARCODE_CR || code === CHARCODE_TAB || code === CHARCODE_LF);\n    };\n\n    // Specialization of $(tok)\n    parserInput.$re = tok => {\n        if (parserInput.i > currentPos) {\n            current = current.slice(parserInput.i - currentPos);\n            currentPos = parserInput.i;\n        }\n\n        const m = tok.exec(current);\n        if (!m) {\n            return null;\n        }\n\n        skipWhitespace(m[0].length);\n        if (typeof m === 'string') {\n            return m;\n        }\n\n        return m.length === 1 ? m[0] : m;\n    };\n\n    parserInput.$char = tok => {\n        if (input.charAt(parserInput.i) !== tok) {\n            return null;\n        }\n        skipWhitespace(1);\n        return tok;\n    };\n\n    parserInput.$peekChar = tok => {\n        if (input.charAt(parserInput.i) !== tok) {\n            return null;\n        }\n        return tok;\n    };\n\n    parserInput.$str = tok => {\n        const tokLength = tok.length;\n\n        // https://jsperf.com/string-startswith/21\n        for (let i = 0; i < tokLength; i++) {\n            if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n                return null;\n            }\n        }\n\n        skipWhitespace(tokLength);\n        return tok;\n    };\n\n    parserInput.$quoted = loc => {\n        const pos = loc || parserInput.i;\n        const startChar = input.charAt(pos);\n\n        if (startChar !== '\\'' && startChar !== '\"') {\n            return;\n        }\n        const length = input.length;\n        const currentPosition = pos;\n\n        for (let i = 1; i + currentPosition < length; i++) {\n            const nextChar = input.charAt(i + currentPosition);\n            switch (nextChar) {\n                case '\\\\':\n                    i++;\n                    continue;\n                case '\\r':\n                case '\\n':\n                    break;\n                case startChar: {\n                    const str = input.slice(currentPosition, currentPosition + i + 1);\n                    if (!loc && loc !== 0) {\n                        skipWhitespace(i + 1);\n                        return str\n                    }\n                    return [startChar, str];\n                }\n                default:\n            }\n        }\n        return null;\n    };\n\n    /**\n     * Permissive parsing. Ignores everything except matching {} [] () and quotes\n     * until matching token (outside of blocks)\n     */\n    parserInput.$parseUntil = tok => {\n        let quote = '';\n        let returnVal = null;\n        let inComment = false;\n        let blockDepth = 0;\n        const blockStack = [];\n        const parseGroups = [];\n        const length = input.length;\n        const startPos = parserInput.i;\n        let lastPos = parserInput.i;\n        let i = parserInput.i;\n        let loop = true;\n        let testChar;\n\n        if (typeof tok === 'string') {\n            testChar = char => char === tok\n        } else {\n            testChar = char => tok.test(char)\n        }\n\n        do {\n            let nextChar = input.charAt(i);\n            if (blockDepth === 0 && testChar(nextChar)) {\n                returnVal = input.slice(lastPos, i);\n                if (returnVal) {\n                    parseGroups.push(returnVal);\n                }\n                else {\n                    parseGroups.push(' ');\n                }\n                returnVal = parseGroups;\n                skipWhitespace(i - startPos);\n                loop = false\n            } else {\n                if (inComment) {\n                    if (nextChar === '*' &&\n                        input.charAt(i + 1) === '/') {\n                        i++;\n                        blockDepth--;\n                        inComment = false;\n                    }\n                    i++;\n                    continue;\n                }\n                switch (nextChar) {\n                    case '\\\\':\n                        i++;\n                        nextChar = input.charAt(i);\n                        parseGroups.push(input.slice(lastPos, i + 1));\n                        lastPos = i + 1;\n                        break;\n                    case '/':\n                        if (input.charAt(i + 1) === '*') {\n                            i++;\n                            inComment = true;\n                            blockDepth++;\n                        }\n                        break;\n                    case '\\'':\n                    case '\"':\n                        quote = parserInput.$quoted(i);\n                        if (quote) {\n                            parseGroups.push(input.slice(lastPos, i), quote);\n                            i += quote[1].length - 1;\n                            lastPos = i + 1;\n                        }\n                        else {\n                            skipWhitespace(i - startPos);\n                            returnVal = nextChar;\n                            loop = false;\n                        }\n                        break;\n                    case '{':\n                        blockStack.push('}');\n                        blockDepth++;\n                        break;\n                    case '(':\n                        blockStack.push(')');\n                        blockDepth++;\n                        break;\n                    case '[':\n                        blockStack.push(']');\n                        blockDepth++;\n                        break;\n                    case '}':\n                    case ')':\n                    case ']': {\n                        const expected = blockStack.pop();\n                        if (nextChar === expected) {\n                            blockDepth--;\n                        } else {\n                            // move the parser to the error and return expected\n                            skipWhitespace(i - startPos);\n                            returnVal = expected;\n                            loop = false;\n                        }\n                    }\n                }\n                i++;\n                if (i > length) {\n                    loop = false;\n                }\n            }\n        } while (loop);\n\n        return returnVal ? returnVal : null;\n    }\n\n    parserInput.autoCommentAbsorb = true;\n    parserInput.commentStore = [];\n    parserInput.finished = false;\n\n    // Same as $(), but don't change the state of the parser,\n    // just return the match.\n    parserInput.peek = tok => {\n        if (typeof tok === 'string') {\n            // https://jsperf.com/string-startswith/21\n            for (let i = 0; i < tok.length; i++) {\n                if (input.charAt(parserInput.i + i) !== tok.charAt(i)) {\n                    return false;\n                }\n            }\n            return true;\n        } else {\n            return tok.test(current);\n        }\n    };\n\n    // Specialization of peek()\n    // TODO remove or change some currentChar calls to peekChar\n    parserInput.peekChar = tok => input.charAt(parserInput.i) === tok;\n\n    parserInput.currentChar = () => input.charAt(parserInput.i);\n\n    parserInput.prevChar = () => input.charAt(parserInput.i - 1);\n\n    parserInput.getInput = () => input;\n\n    parserInput.peekNotNumeric = () => {\n        const c = input.charCodeAt(parserInput.i);\n        // Is the first char of the dimension 0-9, '.', '+' or '-'\n        return (c > CHARCODE_9 || c < CHARCODE_PLUS) || c === CHARCODE_FORWARD_SLASH || c === CHARCODE_COMMA;\n    };\n\n    parserInput.start = (str) => {\n        input = str;\n        parserInput.i = j = currentPos = furthest = 0;\n\n        chunks = [str];\n        current = chunks[0];\n\n        skipWhitespace(0);\n    };\n\n    parserInput.end = () => {\n        let message;\n        const isFinished = parserInput.i >= input.length;\n\n        if (parserInput.i < furthest) {\n            message = furthestPossibleErrorMessage;\n            parserInput.i = furthest;\n        }\n        return {\n            isFinished,\n            furthest: parserInput.i,\n            furthestPossibleErrorMessage: message,\n            furthestReachedEnd: parserInput.i >= input.length - 1,\n            furthestChar: input[parserInput.i]\n        };\n    };\n\n    return parserInput;\n};\n"
  },
  {
    "path": "packages/less/lib/less/parser/parser.js",
    "content": "import LessError from '../less-error.js';\nimport tree from '../tree/index.js';\nimport visitors from '../visitors/index.js';\nimport getParserInput from './parser-input.js';\nimport * as utils from '../utils.js';\nimport functionRegistry from '../functions/function-registry.js';\nimport { ContainerSyntaxOptions, MediaSyntaxOptions } from '../tree/atrule-syntax.js';\nimport logger from '../logger.js';\nimport { DeprecationHandler } from '../deprecation.js';\nimport Selector from '../tree/selector.js';\nimport Anonymous from '../tree/anonymous.js';\n\n//\n// less.js - parser\n//\n//    A relatively straight-forward predictive parser.\n//    There is no tokenization/lexing stage, the input is parsed\n//    in one sweep.\n//\n//    To make the parser fast enough to run in the browser, several\n//    optimization had to be made:\n//\n//    - Matching and slicing on a huge input is often cause of slowdowns.\n//      The solution is to chunkify the input into smaller strings.\n//      The chunks are stored in the `chunks` var,\n//      `j` holds the current chunk index, and `currentPos` holds\n//      the index of the current chunk in relation to `input`.\n//      This gives us an almost 4x speed-up.\n//\n//    - In many cases, we don't need to match individual tokens;\n//      for example, if a value doesn't hold any variables, operations\n//      or dynamic references, the parser can effectively 'skip' it,\n//      treating it as a literal.\n//      An example would be '1px solid #000' - which evaluates to itself,\n//      we don't need to know what the individual components are.\n//      The drawback, of course is that you don't get the benefits of\n//      syntax-checking on the CSS. This gives us a 50% speed-up in the parser,\n//      and a smaller speed-up in the code-gen.\n//\n//\n//    Token matching is done with the `$` function, which either takes\n//    a terminal string or regexp, or a non-terminal function to call.\n//    It also takes care of moving all the indices forwards.\n//\n\nconst Parser = function Parser(context, imports, fileInfo, currentIndex) {\n    currentIndex = currentIndex || 0;\n    let parsers;\n    const parserInput = getParserInput();\n\n    function error(msg, type) {\n        throw new LessError(\n            {\n                index: parserInput.i,\n                filename: fileInfo.filename,\n                type: type || 'Syntax',\n                message: msg\n            },\n            imports\n        );\n    }\n\n    const deprecationHandler = new DeprecationHandler();\n\n    /**\n     * @param {string} msg\n     * @param {number} index\n     * @param {string} type\n     * @param {string} [deprecationId] - stable deprecation ID for repetition limiting\n     */\n    function warn(msg, index, type, deprecationId) {\n        if (context.quiet) { return; }\n        if (deprecationId && context.quietDeprecations) { return; }\n        if (deprecationId && !deprecationHandler.shouldWarn(deprecationId)) { return; }\n\n        logger.warn(\n            (new LessError(\n                {\n                    index: index ?? parserInput.i,\n                    filename: fileInfo.filename,\n                    type: type ? `${type.toUpperCase()} WARNING` : 'WARNING',\n                    message: msg\n                },\n                imports\n            )).toString()\n        );\n    }\n\n    function expect(arg, msg) {\n        // some older browsers return typeof 'function' for RegExp\n        const result = (arg instanceof Function) ? arg.call(parsers) : parserInput.$re(arg);\n        if (result) {\n            return result;\n        }\n\n        error(msg || (typeof arg === 'string'\n            ? `expected '${arg}' got '${parserInput.currentChar()}'`\n            : 'unexpected token'));\n    }\n\n    // Specialization of expect()\n    function expectChar(arg, msg) {\n        if (parserInput.$char(arg)) {\n            return arg;\n        }\n        error(msg || `expected '${arg}' got '${parserInput.currentChar()}'`);\n    }\n\n    function getDebugInfo(index) {\n        const filename = fileInfo.filename;\n\n        return {\n            lineNumber: utils.getLocation(index, parserInput.getInput()).line + 1,\n            fileName: filename\n        };\n    }\n\n    /**\n     *  Used after initial parsing to create nodes on the fly\n     *\n     *  @param {String} str          - string to parse\n     *  @param {Array}  parseList    - array of parsers to run input through e.g. [\"value\", \"important\"]\n     *  @param {Number} currentIndex - start number to begin indexing\n     *  @param {Object} fileInfo     - fileInfo to attach to created nodes\n     */\n    function parseNode(str, parseList, callback) {\n        let result;\n        const returnNodes = [];\n        const parser = parserInput;\n\n        try {\n            parser.start(str);\n            for (let x = 0, p; (p = parseList[x]); x++) {\n                result = parsers[p]();\n                returnNodes.push(result || null);\n            }\n\n            const endInfo = parser.end();\n            if (endInfo.isFinished) {\n                callback(null, returnNodes);\n            }\n            else {\n                callback(true, null);\n            }\n        } catch (e) {\n            throw new LessError({\n                index: e.index + currentIndex,\n                message: e.message\n            }, imports, fileInfo.filename);\n        }\n    }\n\n    //\n    // The Parser\n    //\n    return {\n        parserInput,\n        imports,\n        fileInfo,\n        parseNode,\n        //\n        // Parse an input string into an abstract syntax tree,\n        // @param str A string containing 'less' markup\n        // @param callback call `callback` when done.\n        // @param [additionalData] An optional map which can contains vars - a map (key, value) of variables to apply\n        //\n        parse: function (str, callback, additionalData) {\n            let root;\n            let err = null;\n            let globalVars;\n            let modifyVars;\n            let ignored;\n            let preText = '';\n\n            // Optionally disable @plugin parsing\n            if (additionalData && additionalData.disablePluginRule) {\n                parsers.plugin = function() {\n                    var dir = parserInput.$re(/^@plugin?\\s+/);\n                    if (dir) {\n                        error('@plugin statements are not allowed when disablePluginRule is set to true');\n                    }\n                }\n            }\n\n            globalVars = (additionalData && additionalData.globalVars) ? `${Parser.serializeVars(additionalData.globalVars)}\\n` : '';\n            modifyVars = (additionalData && additionalData.modifyVars) ? `\\n${Parser.serializeVars(additionalData.modifyVars)}` : '';\n\n            if (context.pluginManager) {\n                const preProcessors = context.pluginManager.getPreProcessors();\n                for (let i = 0; i < preProcessors.length; i++) {\n                    str = preProcessors[i].process(str, { context, imports, fileInfo });\n                }\n            }\n\n            if (globalVars || (additionalData && additionalData.banner)) {\n                preText = ((additionalData && additionalData.banner) ? additionalData.banner : '') + globalVars;\n                ignored = imports.contentsIgnoredChars;\n                ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n                ignored[fileInfo.filename] += preText.length;\n            }\n\n            str = str.replace(/\\r\\n?/g, '\\n');\n            // Remove potential UTF Byte Order Mark\n            str = preText + str.replace(/^\\uFEFF/, '') + modifyVars;\n            imports.contents[fileInfo.filename] = str;\n\n            // Start with the primary rule.\n            // The whole syntax tree is held under a Ruleset node,\n            // with the `root` property set to true, so no `{}` are\n            // output. The callback is called when the input is parsed.\n            try {\n                parserInput.start(str);\n\n                tree.Node.prototype.parse = this;\n                root = new tree.Ruleset(null, this.parsers.primary());\n                tree.Node.prototype.rootNode = root;\n                root.root = true;\n                root.firstRoot = true;\n                root.functionRegistry = functionRegistry.inherit();\n\n            } catch (e) {\n                return callback(new LessError(e, imports, fileInfo.filename));\n            }\n\n            // If `i` is smaller than the `input.length - 1`,\n            // it means the parser wasn't able to parse the whole\n            // string, so we've got a parsing error.\n            //\n            // We try to extract a \\n delimited string,\n            // showing the line where the parse error occurred.\n            // We split it up into two parts (the part which parsed,\n            // and the part which didn't), so we can color them differently.\n            const endInfo = parserInput.end();\n            if (!endInfo.isFinished) {\n\n                let message = endInfo.furthestPossibleErrorMessage;\n\n                if (!message) {\n                    message = 'Unrecognised input';\n                    if (endInfo.furthestChar === '}') {\n                        message += '. Possibly missing opening \\'{\\'';\n                    } else if (endInfo.furthestChar === ')') {\n                        message += '. Possibly missing opening \\'(\\'';\n                    } else if (endInfo.furthestReachedEnd) {\n                        message += '. Possibly missing something';\n                    }\n                }\n\n                err = new LessError({\n                    type: 'Parse',\n                    message,\n                    index: endInfo.furthest,\n                    filename: fileInfo.filename\n                }, imports);\n            }\n\n            const finish = e => {\n                e = err || e || imports.error;\n\n                if (e) {\n                    if (!(e instanceof LessError)) {\n                        e = new LessError(e, imports, fileInfo.filename);\n                    }\n\n                    return callback(e);\n                }\n                else {\n                    return callback(null, root);\n                }\n            };\n\n            if (context.processImports !== false) {\n                new visitors.ImportVisitor(imports, finish)\n                    .run(root);\n            } else {\n                return finish();\n            }\n        },\n\n        //\n        // Here in, the parsing rules/functions\n        //\n        // The basic structure of the syntax tree generated is as follows:\n        //\n        //   Ruleset ->  Declaration -> Value -> Expression -> Entity\n        //\n        // Here's some Less code:\n        //\n        //    .class {\n        //      color: #fff;\n        //      border: 1px solid #000;\n        //      width: @w + 4px;\n        //      > .child {...}\n        //    }\n        //\n        // And here's what the parse tree might look like:\n        //\n        //     Ruleset (Selector '.class', [\n        //         Declaration (\"color\",  Value ([Expression [Color #fff]]))\n        //         Declaration (\"border\", Value ([Expression [Dimension 1px][Keyword \"solid\"][Color #000]]))\n        //         Declaration (\"width\",  Value ([Expression [Operation \" + \" [Variable \"@w\"][Dimension 4px]]]))\n        //         Ruleset (Selector [Element '>', '.child'], [...])\n        //     ])\n        //\n        //  In general, most rules will try to parse a token with the `$re()` function, and if the return\n        //  value is truly, will return a new node, of the relevant type. Sometimes, we need to check\n        //  first, before parsing, that's when we use `peek()`.\n        //\n        parsers: parsers = {\n            //\n            // The `primary` rule is the *entry* and *exit* point of the parser.\n            // The rules here can appear at any level of the parse tree.\n            //\n            // The recursive nature of the grammar is an interplay between the `block`\n            // rule, which represents `{ ... }`, the `ruleset` rule, and this `primary` rule,\n            // as represented by this simplified grammar:\n            //\n            //     primary  →  (ruleset | declaration)+\n            //     ruleset  →  selector+ block\n            //     block    →  '{' primary '}'\n            //\n            // Only at one point is the primary rule not called from the\n            // block rule: at the root level.\n            //\n            primary: function () {\n                const mixin = this.mixin;\n                let root = [];\n                let node;\n\n                while (true) {\n                    while (true) {\n                        node = this.comment();\n                        if (!node) { break; }\n                        root.push(node);\n                    }\n                    // always process comments before deciding if finished\n                    if (parserInput.finished) {\n                        break;\n                    }\n                    if (parserInput.peek('}')) {\n                        break;\n                    }\n\n                    node = this.extendRule();\n                    if (node) {\n                        root = root.concat(node);\n                        continue;\n                    }\n\n                    node = mixin.definition() || this.declaration() || mixin.call(false, false) ||\n                        this.ruleset() || this.variableCall() || this.entities.call() || this.atrule();\n                    if (node) {\n                        root.push(node);\n                    } else {\n                        let foundSemiColon = false;\n                        while (parserInput.$char(';')) {\n                            foundSemiColon = true;\n                        }\n                        if (!foundSemiColon) {\n                            break;\n                        }\n                    }\n                }\n\n                return root;\n            },\n\n            // comments are collected by the main parsing mechanism and then assigned to nodes\n            // where the current structure allows it\n            comment: function () {\n                if (parserInput.commentStore.length) {\n                    const comment = parserInput.commentStore.shift();\n                    return new(tree.Comment)(comment.text, comment.isLineComment, comment.index + currentIndex, fileInfo);\n                }\n            },\n\n            //\n            // Entities are tokens which can be found inside an Expression\n            //\n            entities: {\n                mixinLookup: function() {\n                    return parsers.mixin.call(true, true);\n                },\n                //\n                // A string, which supports escaping \" and '\n                //\n                //     \"milky way\" 'he\\'s the one!'\n                //\n                quoted: function (forceEscaped) {\n                    let str;\n                    const index = parserInput.i;\n                    let isEscaped = false;\n\n                    parserInput.save();\n                    if (parserInput.$char('~')) {\n                        isEscaped = true;\n                    } else if (forceEscaped) {\n                        parserInput.restore();\n                        return;\n                    }\n\n                    str = parserInput.$quoted();\n                    if (!str) {\n                        parserInput.restore();\n                        return;\n                    }\n                    parserInput.forget();\n\n                    return new(tree.Quoted)(str.charAt(0), str.slice(1, -1), isEscaped, index + currentIndex, fileInfo);\n                },\n\n                //\n                // A catch-all word, such as:\n                //\n                //     black border-collapse\n                //\n                keyword: function () {\n                    const k = parserInput.$char('%') || parserInput.$re(/^\\[?(?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+\\]?/);\n                    if (k) {\n                        return tree.Color.fromKeyword(k) || new(tree.Keyword)(k);\n                    }\n                },\n\n                //\n                // A function call\n                //\n                //     rgb(255, 0, 255)\n                //\n                // The arguments are parsed with the `entities.arguments` parser.\n                //\n                call: function () {\n                    let name;\n                    let args;\n                    let func;\n                    const index = parserInput.i;\n\n                    // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n                    if (parserInput.peek(/^url\\(/i)) {\n                        return;\n                    }\n\n                    parserInput.save();\n\n                    name = parserInput.$re(/^([\\w-]+|%|~|progid:[\\w.]+)\\(/);\n                    if (!name) {\n                        parserInput.forget();\n                        return;\n                    }\n\n                    name = name[1];\n                    func = this.customFuncCall(name);\n                    if (func) {\n                        args = func.parse();\n                        if (args && func.stop) {\n                            parserInput.forget();\n                            return args;\n                        }\n                    }\n\n                    args = this.arguments(args);\n\n                    if (!parserInput.$char(')')) {\n                        parserInput.restore('Could not parse call arguments or missing \\')\\'');\n                        return;\n                    }\n\n                    parserInput.forget();\n\n                    return new(tree.Call)(name, args, index + currentIndex, fileInfo);\n                },\n\n                declarationCall: function () {\n                    let validCall;\n                    let args;\n                    const index = parserInput.i;\n\n                    parserInput.save();\n\n                    validCall = parserInput.$re(/^[\\w]+\\(/);\n                    if (!validCall) {\n                        parserInput.forget();\n                        return;\n                    }\n\n                    validCall = validCall.substring(0, validCall.length - 1);\n\n                    // CSS at-rule keywords should never be parsed as declaration calls\n                    if (/^(and|or|not|only|layer)$/i.test(validCall)) {\n                        parserInput.restore();\n                        return;\n                    }\n\n                    let rule = this.ruleProperty();\n                    let value;\n                  \n                    if (rule) {\n                        value = this.value();\n                    }\n                    \n                    if (rule && value) {\n                        args = [new (tree.Declaration)(rule, value, null, null, parserInput.i + currentIndex, fileInfo, true)];\n                    }\n\n                    if (!parserInput.$char(')')) {\n                        parserInput.restore('Could not parse call arguments or missing \\')\\'');\n                        return;\n                    }\n\n                    parserInput.forget();\n\n                    return new(tree.Call)(validCall, args, index + currentIndex, fileInfo);\n                },\n\n                //\n                // Parsing rules for functions with non-standard args, e.g.:\n                //\n                //     boolean(not(2 > 1))\n                //\n                //     This is a quick prototype, to be modified/improved when\n                //     more custom-parsed funcs come (e.g. `selector(...)`)\n                //\n\n                customFuncCall: function (name) {\n                    /* Ideally the table is to be moved out of here for faster perf.,\n                       but it's quite tricky since it relies on all these `parsers`\n                       and `expect` available only here */\n                    return {\n                        alpha:   f(parsers.ieAlpha, true),\n                        boolean: f(condition),\n                        'if':    f(condition)\n                    }[name.toLowerCase()];\n\n                    function f(parse, stop) {\n                        return {\n                            parse, // parsing function\n                            stop   // when true - stop after parse() and return its result,\n                            // otherwise continue for plain args\n                        };\n                    }\n\n                    function condition() {\n                        return [expect(parsers.condition, 'expected condition')];\n                    }\n                },\n\n                arguments: function (prevArgs) {\n                    let argsComma = prevArgs || [];\n                    const argsSemiColon = [];\n                    let isSemiColonSeparated;\n                    let value;\n\n                    parserInput.save();\n\n                    while (true) {\n                        if (prevArgs) {\n                            prevArgs = false;\n                        } else {\n                            value = parsers.detachedRuleset() || this.assignment() || parsers.expression();\n                            if (!value) {\n                                break;\n                            }\n\n                            if (value.value && value.value.length == 1) {\n                                value = value.value[0];\n                            }\n\n                            argsComma.push(value);\n                        }\n\n                        if (parserInput.$char(',')) {\n                            continue;\n                        }\n\n                        if (parserInput.$char(';') || isSemiColonSeparated) {\n                            isSemiColonSeparated = true;\n                            value = (argsComma.length < 1) ? argsComma[0]\n                                : new tree.Value(argsComma);\n                            argsSemiColon.push(value);\n                            argsComma = [];\n                        }\n                    }\n\n                    parserInput.forget();\n                    return isSemiColonSeparated ? argsSemiColon : argsComma;\n                },\n                literal: function () {\n                    return this.dimension() ||\n                           this.color() ||\n                           this.quoted() ||\n                           this.unicodeDescriptor();\n                },\n\n                // Assignments are argument entities for calls.\n                // They are present in ie filter properties as shown below.\n                //\n                //     filter: progid:DXImageTransform.Microsoft.Alpha( *opacity=50* )\n                //\n\n                assignment: function () {\n                    let key;\n                    let value;\n                    parserInput.save();\n                    key = parserInput.$re(/^\\w+(?=\\s?=)/i);\n                    if (!key) {\n                        parserInput.restore();\n                        return;\n                    }\n                    if (!parserInput.$char('=')) {\n                        parserInput.restore();\n                        return;\n                    }\n                    value = parsers.entity();\n                    if (value) {\n                        parserInput.forget();\n                        return new(tree.Assignment)(key, value);\n                    } else {\n                        parserInput.restore();\n                    }\n                },\n\n                //\n                // Parse url() tokens\n                //\n                // We use a specific rule for urls, because they don't really behave like\n                // standard function calls. The difference is that the argument doesn't have\n                // to be enclosed within a string, so it can't be parsed as an Expression.\n                //\n                url: function () {\n                    let value;\n                    const index = parserInput.i;\n\n                    parserInput.autoCommentAbsorb = false;\n\n                    if (!parserInput.$str('url(')) {\n                        parserInput.autoCommentAbsorb = true;\n                        return;\n                    }\n\n                    value = this.quoted() || this.variable() || this.property() ||\n                            parserInput.$re(/^(?:(?:\\\\[()'\"])|[^()'\"])+/) || '';\n\n                    parserInput.autoCommentAbsorb = true;\n\n                    expectChar(')');\n\n                    return new(tree.URL)((value.value !== undefined ||\n                        value instanceof tree.Variable ||\n                        value instanceof tree.Property) ?\n                        value : new(tree.Anonymous)(value, index), index + currentIndex, fileInfo);\n                },\n\n                //\n                // A Variable entity, such as `@fink`, in\n                //\n                //     width: @fink + 2px\n                //\n                // We use a different parser for variable definitions,\n                // see `parsers.variable`.\n                //\n                variable: function () {\n                    let ch;\n                    let name;\n                    const index = parserInput.i;\n\n                    parserInput.save();\n                    if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^@@?[\\w-]+/))) {\n                        ch = parserInput.currentChar();\n                        if ((ch === '(' && !parserInput.prevChar().match(/^\\s/))\n                            || (ch === '[' && !parserInput.prevChar().match(/^\\s/))) {\n                            // this may be a VariableCall lookup\n                            const result = parsers.variableCall(name);\n                            if (result) {\n                                parserInput.forget();\n                                return result;\n                            }\n                        }\n                        parserInput.forget();\n                        return new(tree.Variable)(name, index + currentIndex, fileInfo);\n                    }\n                    parserInput.restore();\n                },\n\n                // A variable entity using the protective {} e.g. @{var}\n                variableCurly: function () {\n                    let curly;\n                    const index = parserInput.i;\n\n                    if (parserInput.currentChar() === '@' && (curly = parserInput.$re(/^@\\{([\\w-]+)\\}/))) {\n                        return new(tree.Variable)(`@${curly[1]}`, index + currentIndex, fileInfo);\n                    }\n                },\n                //\n                // A Property accessor, such as `$color`, in\n                //\n                //     background-color: $color\n                //\n                property: function () {\n                    let name;\n                    const index = parserInput.i;\n\n                    if (parserInput.currentChar() === '$' && (name = parserInput.$re(/^\\$[\\w-]+/))) {\n                        return new(tree.Property)(name, index + currentIndex, fileInfo);\n                    }\n                },\n\n                //\n                // A Hexadecimal color\n                //\n                //     #4F3C2F\n                //\n                // `rgb` and `hsl` colors are parsed through the `entities.call` parser.\n                //\n                color: function () {\n                    let rgb;\n                    parserInput.save();\n\n                    if (parserInput.currentChar() === '#' && (rgb = parserInput.$re(/^#([A-Fa-f0-9]{8}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3,4})([\\w.#[])?/))) {\n                        if (!rgb[2]) {\n                            parserInput.forget();\n                            return new(tree.Color)(rgb[1], undefined, rgb[0]);\n                        }\n                    }\n                    parserInput.restore();\n                },\n\n                colorKeyword: function () {\n                    parserInput.save();\n                    const autoCommentAbsorb = parserInput.autoCommentAbsorb;\n                    parserInput.autoCommentAbsorb = false;\n                    const k = parserInput.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);\n                    parserInput.autoCommentAbsorb = autoCommentAbsorb;\n                    if (!k) {\n                        parserInput.forget();\n                        return;\n                    }\n                    parserInput.restore();\n                    const color = tree.Color.fromKeyword(k);\n                    if (color) {\n                        parserInput.$str(k);\n                        return color;\n                    }\n                },\n\n                //\n                // A Dimension, that is, a number and a unit\n                //\n                //     0.5em 95%\n                //\n                dimension: function () {\n                    if (parserInput.peekNotNumeric()) {\n                        return;\n                    }\n\n                    const value = parserInput.$re(/^([+-]?\\d*\\.?\\d+)(%|[a-z_]+)?/i);\n                    if (value) {\n                        return new(tree.Dimension)(value[1], value[2]);\n                    }\n                },\n\n                //\n                // A unicode descriptor, as is used in unicode-range\n                //\n                // U+0??  or U+00A1-00A9\n                //\n                unicodeDescriptor: function () {\n                    let ud;\n\n                    ud = parserInput.$re(/^U\\+[0-9a-fA-F?]+(-[0-9a-fA-F?]+)?/);\n                    if (ud) {\n                        return new(tree.UnicodeDescriptor)(ud[0]);\n                    }\n                },\n\n                //\n                // JavaScript code to be evaluated\n                //\n                //     `window.location.href`\n                //\n                javascript: function () {\n                    let js;\n                    const index = parserInput.i;\n\n                    parserInput.save();\n\n                    const escape = parserInput.$char('~');\n                    const jsQuote = parserInput.$char('`');\n\n                    if (!jsQuote) {\n                        parserInput.restore();\n                        return;\n                    }\n\n                    js = parserInput.$re(/^[^`]*`/);\n                    if (js) {\n                        warn('Inline JavaScript evaluation (backtick expressions) is deprecated and will be removed in Less 5.x. Use Less functions or custom plugins instead.', index, 'DEPRECATED', 'js-eval');\n                        parserInput.forget();\n                        return new(tree.JavaScript)(js.slice(0, -1), Boolean(escape), index + currentIndex, fileInfo);\n                    }\n                    parserInput.restore('invalid javascript definition');\n                }\n            },\n\n            //\n            // The variable part of a variable definition. Used in the `rule` parser\n            //\n            //     @fink:\n            //\n            variable: function () {\n                let name;\n\n                if (parserInput.currentChar() === '@' && (name = parserInput.$re(/^(@[\\w-]+)\\s*:/))) { return name[1]; }\n            },\n\n            //\n            // Call a variable value to retrieve a detached ruleset\n            // or a value from a detached ruleset's rules.\n            //\n            //     @fink();\n            //     @fink;\n            //     color: @fink[@color];\n            //\n            variableCall: function (parsedName) {\n                let lookups;\n                const i = parserInput.i;\n                const inValue = !!parsedName;\n                let name = parsedName;\n\n                parserInput.save();\n\n                if (name || (parserInput.currentChar() === '@'\n                    && (name = parserInput.$re(/^(@[\\w-]+)(\\(\\s*\\))?/)))) {\n\n                    lookups = this.mixin.ruleLookups();\n\n                    if (!lookups && ((inValue && parserInput.$str('()') !== '()') || (name[2] !== '()'))) {\n                        parserInput.restore('Missing \\'[...]\\' lookup in variable call');\n                        return;\n                    }\n\n                    if (!inValue) {\n                        name = name[1];\n                    }\n\n                    const call = new tree.VariableCall(name, i, fileInfo);\n                    if (!inValue && parsers.end()) {\n                        parserInput.forget();\n                        return call;\n                    }\n                    else {\n                        parserInput.forget();\n                        return new tree.NamespaceValue(call, lookups, i, fileInfo);\n                    }\n                }\n\n                parserInput.restore();\n            },\n\n            //\n            // extend syntax - used to extend selectors\n            //\n            extend: function(isRule) {\n                let elements;\n                let e;\n                const index = parserInput.i;\n                let option;\n                let extendList;\n                let extend;\n\n                if (!parserInput.$str(isRule ? '&:extend(' : ':extend(')) {\n                    return;\n                }\n\n                do {\n                    option = null;\n                    elements = null;\n                    let first = true;\n                    while (!(option = parserInput.$re(/^(!?all)(?=\\s*(\\)|,))/))) {\n                        e = this.element();\n\n                        if (!e) {\n                            break;\n                        }\n                        /**\n                         * @note - This will not catch selectors in pseudos like :is() and :where() because\n                         * they don't currently parse their contents as selectors.\n                         */\n                        if (!first && e.combinator.value) {\n                            warn('Targeting complex selectors can have unexpected behavior, and this behavior may change in the future.', index)\n                        }\n\n                        first = false;\n                        if (elements) {\n                            elements.push(e);\n                        } else {\n                            elements = [ e ];\n                        }\n                    }\n\n                    option = option && option[1];\n                    if (!elements) {\n                        error('Missing target selector for :extend().');\n                    }\n                    extend = new(tree.Extend)(new(tree.Selector)(elements), option, index + currentIndex, fileInfo);\n                    if (extendList) {\n                        extendList.push(extend);\n                    } else {\n                        extendList = [ extend ];\n                    }\n                } while (parserInput.$char(','));\n\n                expect(/^\\)/);\n\n                if (isRule) {\n                    expect(/^;/);\n                }\n\n                return extendList;\n            },\n\n            //\n            // extendRule - used in a rule to extend all the parent selectors\n            //\n            extendRule: function() {\n                return this.extend(true);\n            },\n\n            //\n            // Mixins\n            //\n            mixin: {\n                //\n                // A Mixin call, with an optional argument list\n                //\n                //     #mixins > .square(#fff);\n                //     #mixins.square(#fff);\n                //     .rounded(4px, black);\n                //     .button;\n                //\n                // We can lookup / return a value using the lookup syntax:\n                //\n                //     color: #mixin.square(#fff)[@color];\n                //\n                // The `while` loop is there because mixins can be\n                // namespaced, but we only support the child and descendant\n                // selector for now.\n                //\n                call: function (inValue, getLookup) {\n                    const s = parserInput.currentChar();\n                    let important = false;\n                    let lookups;\n                    const index = parserInput.i;\n                    let elements;\n                    let args;\n                    let hasParens;\n                    let parensIndex;\n                    let parensWS = false;\n\n                    if (s !== '.' && s !== '#') { return; }\n\n                    parserInput.save(); // stop us absorbing part of an invalid selector\n\n                    elements = this.elements();\n\n                    if (elements) {\n                        parensIndex = parserInput.i;\n                        parensWS = parserInput.isWhitespace(-1);\n                        if (parserInput.$char('(')) { \n                            args = this.args(true).args;\n                            expectChar(')');\n                            hasParens = true;\n                            if (parensWS) {\n                                warn('Whitespace between a mixin name and parentheses for a mixin call is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-whitespace');\n                            }\n                        }\n\n                        if (getLookup !== false) {\n                            lookups = this.ruleLookups();\n                        }\n                        if (getLookup === true && !lookups) {\n                            parserInput.restore();\n                            return;\n                        }\n\n                        if (inValue && !lookups && !hasParens) {\n                            // This isn't a valid in-value mixin call\n                            parserInput.restore();\n                            return;\n                        }\n\n                        if (!inValue && parsers.important()) {\n                            important = true;\n                        }\n\n                        if (inValue || parsers.end()) {\n                            parserInput.forget();\n                            const mixin = new(tree.mixin.Call)(elements, args, index + currentIndex, fileInfo, !lookups && important);\n                            if (lookups) {\n                                return new tree.NamespaceValue(mixin, lookups);\n                            }\n                            else {\n                                if (!hasParens) {\n                                    warn('Calling a mixin without parentheses is deprecated', parensIndex, 'DEPRECATED', 'mixin-call-no-parens');\n                                }\n                                return mixin;\n                            }\n                        }\n                    }\n\n                    parserInput.restore();\n                },\n                /**\n                 * Matching elements for mixins\n                 * (Start with . or # and can have > )\n                 */\n                elements: function() {\n                    let elements;\n                    let e;\n                    let c;\n                    let elem;\n                    let elemIndex;\n                    const re = /^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/;\n                    while (true) {\n                        elemIndex = parserInput.i;\n                        e = parserInput.$re(re);\n\n                        if (!e) {\n                            break;\n                        }\n                        elem = new(tree.Element)(c, e, false, elemIndex + currentIndex, fileInfo);\n                        if (elements) {\n                            elements.push(elem);\n                        } else {\n                            elements = [ elem ];\n                        }\n                        c = parserInput.$char('>');\n                    }\n                    return elements;\n                },\n                args: function (isCall) {\n                    const entities = parsers.entities;\n                    const returner = { args:null, variadic: false };\n                    let expressions = [];\n                    const argsSemiColon = [];\n                    const argsComma = [];\n                    let isSemiColonSeparated;\n                    let expressionContainsNamed;\n                    let name;\n                    let nameLoop;\n                    let value;\n                    let arg;\n                    let expand;\n                    let hasSep = true;\n\n                    parserInput.save();\n\n                    while (true) {\n                        if (isCall) {\n                            arg = parsers.detachedRuleset() || parsers.expression();\n                        } else {\n                            parserInput.commentStore.length = 0;\n                            if (parserInput.$str('...')) {\n                                returner.variadic = true;\n                                if (parserInput.$char(';') && !isSemiColonSeparated) {\n                                    isSemiColonSeparated = true;\n                                }\n                                (isSemiColonSeparated ? argsSemiColon : argsComma)\n                                    .push({ variadic: true });\n                                break;\n                            }\n                            arg = entities.variable() || entities.property() || entities.literal() || entities.keyword() || this.call(true);\n                        }\n\n                        if (!arg || !hasSep) {\n                            break;\n                        }\n\n                        nameLoop = null;\n                        if (arg.throwAwayComments) {\n                            arg.throwAwayComments();\n                        }\n                        value = arg;\n                        let val = null;\n\n                        if (isCall) {\n                            // Variable\n                            if (arg.value && arg.value.length == 1) {\n                                val = arg.value[0];\n                            }\n                        } else {\n                            val = arg;\n                        }\n\n                        if (val && (val instanceof tree.Variable || val instanceof tree.Property)) {\n                            if (parserInput.$char(':')) {\n                                if (expressions.length > 0) {\n                                    if (isSemiColonSeparated) {\n                                        error('Cannot mix ; and , as delimiter types');\n                                    }\n                                    expressionContainsNamed = true;\n                                }\n\n                                value = parsers.detachedRuleset() || parsers.expression();\n\n                                if (!value) {\n                                    if (isCall) {\n                                        error('could not understand value for named argument');\n                                    } else {\n                                        parserInput.restore();\n                                        returner.args = [];\n                                        return returner;\n                                    }\n                                }\n                                nameLoop = (name = val.name);\n                            } else if (parserInput.$str('...')) {\n                                if (!isCall) {\n                                    returner.variadic = true;\n                                    if (parserInput.$char(';') && !isSemiColonSeparated) {\n                                        isSemiColonSeparated = true;\n                                    }\n                                    (isSemiColonSeparated ? argsSemiColon : argsComma)\n                                        .push({ name: arg.name, variadic: true });\n                                    break;\n                                } else {\n                                    expand = true;\n                                }\n                            } else if (!isCall) {\n                                name = nameLoop = val.name;\n                                value = null;\n                            }\n                        }\n\n                        if (value) {\n                            expressions.push(value);\n                        }\n\n                        argsComma.push({ name:nameLoop, value, expand });\n\n                        if (parserInput.$char(',')) {\n                            hasSep = true;\n                            continue;\n                        }\n                        hasSep = parserInput.$char(';') === ';';\n\n                        if (hasSep || isSemiColonSeparated) {\n\n                            if (expressionContainsNamed) {\n                                error('Cannot mix ; and , as delimiter types');\n                            }\n\n                            isSemiColonSeparated = true;\n\n                            if (expressions.length > 1) {\n                                value = new(tree.Value)(expressions);\n                            }\n                            argsSemiColon.push({ name, value, expand });\n\n                            name = null;\n                            expressions = [];\n                            expressionContainsNamed = false;\n                        }\n                    }\n\n                    parserInput.forget();\n                    returner.args = isSemiColonSeparated ? argsSemiColon : argsComma;\n                    return returner;\n                },\n                //\n                // A Mixin definition, with a list of parameters\n                //\n                //     .rounded (@radius: 2px, @color) {\n                //        ...\n                //     }\n                //\n                // Until we have a finer grained state-machine, we have to\n                // do a look-ahead, to make sure we don't have a mixin call.\n                // See the `rule` function for more information.\n                //\n                // We start by matching `.rounded (`, and then proceed on to\n                // the argument list, which has optional default values.\n                // We store the parameters in `params`, with a `value` key,\n                // if there is a value, such as in the case of `@radius`.\n                //\n                // Once we've got our params list, and a closing `)`, we parse\n                // the `{...}` block.\n                //\n                definition: function () {\n                    let name;\n                    let params = [];\n                    let match;\n                    let ruleset;\n                    let cond;\n                    let variadic = false;\n                    if ((parserInput.currentChar() !== '.' && parserInput.currentChar() !== '#') ||\n                        parserInput.peek(/^[^{]*\\}/)) {\n                        return;\n                    }\n\n                    parserInput.save();\n\n                    match = parserInput.$re(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/);\n                    if (match) {\n                        name = match[1];\n\n                        const argInfo = this.args(false);\n                        params = argInfo.args;\n                        variadic = argInfo.variadic;\n\n                        // .mixincall(\"@{a}\");\n                        // looks a bit like a mixin definition..\n                        // also\n                        // .mixincall(@a: {rule: set;});\n                        // so we have to be nice and restore\n                        if (!parserInput.$char(')')) {\n                            parserInput.restore('Missing closing \\')\\'');\n                            return;\n                        }\n\n                        parserInput.commentStore.length = 0;\n\n                        if (parserInput.$str('when')) { // Guard\n                            cond = expect(parsers.conditions, 'expected condition');\n                        }\n\n                        ruleset = parsers.block();\n\n                        if (ruleset) {\n                            parserInput.forget();\n                            return new(tree.mixin.Definition)(name, params, ruleset, cond, variadic);\n                        } else {\n                            parserInput.restore();\n                        }\n                    } else {\n                        parserInput.restore();\n                    }\n                },\n\n                ruleLookups: function() {\n                    let rule;\n                    const lookups = [];\n\n                    if (parserInput.currentChar() !== '[') {\n                        return;\n                    }\n\n                    while (true) {\n                        parserInput.save();\n                        rule = this.lookupValue();\n                        if (!rule && rule !== '') {\n                            parserInput.restore();\n                            break;\n                        }\n                        lookups.push(rule);\n                        parserInput.forget();\n                    }\n                    if (lookups.length > 0) {\n                        return lookups;\n                    }\n                },\n\n                lookupValue: function() {\n                    parserInput.save();\n\n                    if (!parserInput.$char('[')) {\n                        parserInput.restore();\n                        return;\n                    }\n\n                    const name = parserInput.$re(/^(?:[@$]{0,2})[_a-zA-Z0-9-]*/);\n\n                    if (!parserInput.$char(']')) {\n                        parserInput.restore();\n                        return;\n                    }\n\n                    if (name || name === '') {\n                        parserInput.forget();\n                        return name;\n                    }\n\n                    parserInput.restore();\n                }\n            },\n            //\n            // Entities are the smallest recognized token,\n            // and can be found inside a rule's value.\n            //\n            entity: function () {\n                const entities = this.entities;\n\n                return this.comment() || entities.literal() || entities.variable() || entities.url() ||\n                    entities.property() || entities.call() || entities.keyword() || this.mixin.call(true) ||\n                    entities.javascript();\n            },\n\n            //\n            // A Declaration terminator. Note that we use `peek()` to check for '}',\n            // because the `block` rule will be expecting it, but we still need to make sure\n            // it's there, if ';' was omitted.\n            //\n            end: function () {\n                return parserInput.$char(';') || parserInput.peek('}');\n            },\n\n            //\n            // IE's alpha function\n            //\n            //     alpha(opacity=88)\n            //\n            ieAlpha: function () {\n                let value;\n\n                // http://jsperf.com/case-insensitive-regex-vs-strtolower-then-regex/18\n                if (!parserInput.$re(/^opacity=/i)) { return; }\n                value = parserInput.$re(/^\\d+/);\n                if (!value) {\n                    value = expect(parsers.entities.variable, 'Could not parse alpha');\n                    value = `@{${value.name.slice(1)}}`;\n                }\n                expectChar(')');\n                return new tree.Quoted('', `alpha(opacity=${value})`);\n            },\n\n            /** \n             * A Selector Element\n             *\n             *   div\n             *   + h1\n             *   #socks\n             *   input[type=\"text\"]\n             *\n             * Elements are the building blocks for Selectors,\n             * they are made out of a `Combinator` (see combinator rule),\n             * and an element name, such as a tag a class, or `*`.\n             */\n            element: function () {\n                let e;\n                let c;\n                let v;\n                const index = parserInput.i;\n\n                c = this.combinator();\n\n                /** This selector parser is quite simplistic and will pass a number of invalid selectors. */\n                e = parserInput.$re(/^(?:\\d+\\.\\d+|\\d+)%/) ||\n                    // eslint-disable-next-line no-control-regex\n                    parserInput.$re(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/) ||\n                    parserInput.$char('*') || parserInput.$char('&') || this.attribute() ||\n                    parserInput.$re(/^\\([^&()@]+\\)/) ||  parserInput.$re(/^[.#:](?=@)/) ||\n                    this.entities.variableCurly();\n\n                if (!e) {\n                    parserInput.save();\n                    if (parserInput.$char('(')) {\n                        if ((v = this.selector(false))) {\n                            let selectors = [];\n                            while (parserInput.$char(',')) {\n                                selectors.push(v);\n                                selectors.push(new Anonymous(','));\n                                v = this.selector(false);\n                            }\n                            selectors.push(v);\n                                                        \n                            if (parserInput.$char(')')) {\n                                if (selectors.length > 1) {\n                                    e = new (tree.Paren)(new Selector(selectors));\n                                } else {\n                                    e = new(tree.Paren)(v);\n                                }\n                                parserInput.forget();\n                            } else {\n                                parserInput.restore('Missing closing \\')\\'');\n                            }\n                        } else {\n                            parserInput.restore('Missing closing \\')\\'');\n                        }\n                    } else {\n                        parserInput.forget();\n                    }\n                }\n\n                if (e) { return new(tree.Element)(c, e, e instanceof tree.Variable, index + currentIndex, fileInfo); }\n            },\n\n            //\n            // Combinators combine elements together, in a Selector.\n            //\n            // Because our parser isn't white-space sensitive, special care\n            // has to be taken, when parsing the descendant combinator, ` `,\n            // as it's an empty space. We have to check the previous character\n            // in the input, to see if it's a ` ` character. More info on how\n            // we deal with this in *combinator.js*.\n            //\n            combinator: function () {\n                let c = parserInput.currentChar();\n\n                if (c === '/') {\n                    parserInput.save();\n                    const slashedCombinator = parserInput.$re(/^\\/[a-z]+\\//i);\n                    if (slashedCombinator) {\n                        parserInput.forget();\n                        return new(tree.Combinator)(slashedCombinator);\n                    }\n                    parserInput.restore();\n                }\n\n                if (c === '>' || c === '+' || c === '~' || c === '|' || c === '^') {\n                    parserInput.i++;\n                    if (c === '^' && parserInput.currentChar() === '^') {\n                        c = '^^';\n                        parserInput.i++;\n                    }\n                    while (parserInput.isWhitespace()) { parserInput.i++; }\n                    return new(tree.Combinator)(c);\n                } else if (parserInput.isWhitespace(-1)) {\n                    return new(tree.Combinator)(' ');\n                } else {\n                    return new(tree.Combinator)(null);\n                }\n            },\n            //\n            // A CSS Selector\n            // with less extensions e.g. the ability to extend and guard\n            //\n            //     .class > div + h1\n            //     li a:hover\n            //\n            // Selectors are made out of one or more Elements, see above.\n            //\n            selector: function (isLess) {\n                const index = parserInput.i;\n                let elements;\n                let extendList;\n                let c;\n                let e;\n                let allExtends;\n                let when;\n                let condition;\n                isLess = isLess !== false;\n                while ((isLess && (extendList = this.extend())) || (isLess && (when = parserInput.$str('when'))) || (e = this.element())) {\n                    if (when) {\n                        condition = expect(this.conditions, 'expected condition');\n                    } else if (condition) {\n                        error('CSS guard can only be used at the end of selector');\n                    } else if (extendList) {\n                        if (allExtends) {\n                            allExtends = allExtends.concat(extendList);\n                        } else {\n                            allExtends = extendList;\n                        }\n                    } else {\n                        if (allExtends) { error('Extend can only be used at the end of selector'); }\n                        c = parserInput.currentChar();\n                        if (Array.isArray(e)){\n                            e.forEach(ele => elements.push(ele));\n                        } if (elements) {\n                            elements.push(e);\n                        } else {\n                            elements = [ e ];\n                        }\n                        e = null;\n                    }\n                    if (c === '{' || c === '}' || c === ';' || c === ',' || c === ')') {\n                        break;\n                    }\n                }\n\n                if (elements) { return new(tree.Selector)(elements, allExtends, condition, index + currentIndex, fileInfo); }\n                if (allExtends) { error('Extend must be used to extend a selector, it cannot be used on its own'); }\n            },\n            selectors: function () {\n                let s;\n                let selectors;\n                while (true) {\n                    s = this.selector();\n                    if (!s) {\n                        break;\n                    }\n                    if (selectors) {\n                        selectors.push(s);\n                    } else {\n                        selectors = [ s ];\n                    }\n                    parserInput.commentStore.length = 0;\n                    if (s.condition && selectors.length > 1) {\n                        error('Guards are only currently allowed on a single selector.');\n                    }\n                    if (!parserInput.$char(',')) { break; }\n                    if (s.condition) {\n                        error('Guards are only currently allowed on a single selector.');\n                    }\n                    parserInput.commentStore.length = 0;\n                }\n                return selectors;\n            },\n            attribute: function () {\n                if (!parserInput.$char('[')) { return; }\n\n                const entities = this.entities;\n                let key;\n                let val;\n                let op;\n                //\n                // case-insensitive flag\n                // e.g. [attr operator value i]\n                //\n                let cif;\n\n                if (!(key = entities.variableCurly())) {\n                    key = expect(/^(?:[_A-Za-z0-9-*]*\\|)?(?:[_A-Za-z0-9-]|\\\\.)+/);\n                }\n\n                op = parserInput.$re(/^[|~*$^]?=/);\n                if (op) {\n                    val = entities.quoted() || parserInput.$re(/^[0-9]+%/) || parserInput.$re(/^[\\w-]+/) || entities.variableCurly();\n                    if (val) {\n                        cif = parserInput.$re(/^[iIsS]/);\n                    }\n                }\n\n                expectChar(']');\n\n                return new(tree.Attribute)(key, op, val, cif);\n            },\n\n            //\n            // The `block` rule is used by `ruleset` and `mixin.definition`.\n            // It's a wrapper around the `primary` rule, with added `{}`.\n            //\n            block: function () {\n                let content;\n                if (parserInput.$char('{') && (content = this.primary()) && parserInput.$char('}')) {\n                    return content;\n                }\n            },\n\n            blockRuleset: function() {\n                let block = this.block();\n                if (block) {\n                    return new tree.Ruleset(null, block);\n                }\n            },\n\n            detachedRuleset: function() {\n                let argInfo;\n                let params;\n                let variadic;\n\n                parserInput.save();\n                if (parserInput.$re(/^[.#]\\(/)) {\n                    /**\n                     * DR args currently only implemented for each() function, and not\n                     * yet settable as `@dr: #(@arg) {}`\n                     * This should be done when DRs are merged with mixins.\n                     * See: https://github.com/less/less-meta/issues/16\n                     */\n                    argInfo = this.mixin.args(false);\n                    params = argInfo.args;\n                    variadic = argInfo.variadic;\n                    if (!parserInput.$char(')')) {\n                        parserInput.restore();\n                        return;\n                    }\n                }\n                const blockRuleset = this.blockRuleset();\n                if (blockRuleset) {\n                    parserInput.forget();\n                    if (params) {\n                        return new tree.mixin.Definition(null, params, blockRuleset, null, variadic);\n                    }\n                    return new tree.DetachedRuleset(blockRuleset);\n                }\n                parserInput.restore();\n            },\n\n            //\n            // div, .class, body > p {...}\n            //\n            ruleset: function () {\n                let selectors;\n                let rules;\n                let debugInfo;\n\n                parserInput.save();\n\n                if (context.dumpLineNumbers) {\n                    debugInfo = getDebugInfo(parserInput.i);\n                }\n\n                selectors = this.selectors();\n\n                if (selectors && (rules = this.block())) {\n                    parserInput.forget();\n                    const ruleset = new(tree.Ruleset)(selectors, rules, context.strictImports);\n                    if (context.dumpLineNumbers) {\n                        ruleset.debugInfo = debugInfo;\n                    }\n                    return ruleset;\n                } else {\n                    parserInput.restore();\n                }\n            },\n            declaration: function () {\n                let name;\n                let value;\n                const index = parserInput.i;\n                let hasDR;\n                const c = parserInput.currentChar();\n                let important;\n                let merge;\n                let isVariable;\n\n                if (c === '.' || c === '#' || c === '&' || c === ':') { return; }\n\n                parserInput.save();\n\n                name = this.variable() || this.ruleProperty();\n                if (name) {\n                    isVariable = typeof name === 'string';\n\n                    if (isVariable) {\n                        value = this.detachedRuleset();\n                        if (value) {\n                            hasDR = true;\n                        }\n                    }\n\n                    parserInput.commentStore.length = 0;\n                    if (!value) {\n                        // a name returned by this.ruleProperty() is always an array of the form:\n                        // [string-1, ..., string-n, \"\"] or [string-1, ..., string-n, \"+\"]\n                        // where each item is a tree.Keyword or tree.Variable\n                        merge = !isVariable && name.length > 1 && name.pop().value;\n\n                        // Custom property values get permissive parsing\n                        if (name[0].value && name[0].value.slice(0, 2) === '--') {\n                            if (parserInput.$char(';')) {\n                                value = new Anonymous('');\n                            } else {\n                                value = this.permissiveValue(/[;}]/, true);\n                            }\n                        }\n                        // Try to store values as anonymous\n                        // If we need the value later we'll re-parse it in ruleset.parseValue\n                        else {\n                            value = this.anonymousValue();\n                        }\n                        if (value) {\n                            parserInput.forget();\n                            // anonymous values absorb the end ';' which is required for them to work\n                            return new(tree.Declaration)(name, value, false, merge, index + currentIndex, fileInfo);\n                        }\n\n                        if (!value) {\n                            value = this.value();\n                        }\n\n                        if (value) {\n                            important = this.important();\n                        } else if (isVariable) {\n                            /**\n                             * As a last resort, try permissiveValue\n                             *\n                             * @todo - This has created some knock-on problems of not\n                             * flagging incorrect syntax or detecting user intent.\n                             */\n                            value = this.permissiveValue();\n                        }\n                    }\n\n                    if (value && (this.end() || hasDR)) {\n                        parserInput.forget();\n                        return new(tree.Declaration)(name, value, important, merge, index + currentIndex, fileInfo);\n                    }\n                    else {\n                        parserInput.restore();\n                    }\n                } else {\n                    parserInput.restore();\n                }\n            },\n            anonymousValue: function () {\n                const index = parserInput.i;\n                const match = parserInput.$re(/^([^.#@$+/'\"*`(;{}-]*);/);\n                if (match) {\n                    return new(tree.Anonymous)(match[1], index + currentIndex);\n                }\n            },\n            /**\n             * Used for custom properties, at-rules, and variables (as fallback)\n             * Parses almost anything inside of {} [] () \"\" blocks\n             * until it reaches outer-most tokens.\n             *\n             * First, it will try to parse comments and entities to reach\n             * the end. This is mostly like the Expression parser except no\n             * math is allowed.\n             * \n             * @param {RexExp} untilTokens - Characters to stop parsing at\n             */\n            permissiveValue: function (untilTokens) {\n                let i;\n                let e;\n                let done;\n                let value;\n                const tok = untilTokens || ';';\n                const index = parserInput.i;\n                const result = [];\n\n                function testCurrentChar() {\n                    const char = parserInput.currentChar();\n                    if (typeof tok === 'string') {\n                        return char === tok;\n                    } else {\n                        return tok.test(char);\n                    }\n                }\n                if (testCurrentChar()) {\n                    return;\n                }\n                value = [];\n                do {\n                    e = this.comment();\n                    if (e) {\n                        value.push(e);\n                        continue;\n                    }\n                    e = this.entity();\n                    if (e) {\n                        value.push(e);\n                    }\n                    if (parserInput.peek(',')) {\n                        value.push(new (tree.Anonymous)(',', parserInput.i));\n                        parserInput.$char(',');\n                    }\n                } while (e);\n\n                done = testCurrentChar();\n\n                if (value.length > 0) {\n                    value = new(tree.Expression)(value);\n                    if (done) {\n                        return value;\n                    }\n                    else {\n                        result.push(value);\n                    }\n                    // Preserve space before $parseUntil as it will not\n                    if (parserInput.prevChar() === ' ') {\n                        result.push(new tree.Anonymous(' ', index));\n                    }\n                }\n                parserInput.save();\n\n                value = parserInput.$parseUntil(tok);\n\n                if (value) {\n                    if (typeof value === 'string') {\n                        error(`Expected '${value}'`, 'Parse');\n                    }\n                    if (value.length === 1 && value[0] === ' ') {\n                        parserInput.forget();\n                        return new tree.Anonymous('', index);\n                    }\n                    /** @type {string} */\n                    let item;\n                    for (i = 0; i < value.length; i++) {\n                        item = value[i];\n                        if (Array.isArray(item)) {\n                            // Treat actual quotes as normal quoted values\n                            result.push(new tree.Quoted(item[0], item[1], true, index, fileInfo));\n                        }\n                        else {\n                            if (i === value.length - 1) {\n                                item = item.trim();\n                            }\n                            // Treat like quoted values, but replace vars like unquoted expressions\n                            const quote = new tree.Quoted('\\'', item, true, index, fileInfo);\n                            const variableRegex = /@([\\w-]+)/g;\n                            const propRegex = /\\$([\\w-]+)/g;\n                            if (variableRegex.test(item)) {\n                                warn('@[ident] in unknown values will not be evaluated as variables in the future. Use @{[ident]}', index, 'DEPRECATED', 'variable-in-unknown-value');\n                            }\n                            if (propRegex.test(item)) {\n                                warn('$[ident] in unknown values will not be evaluated as property references in the future. Use ${[ident]}', index, 'DEPRECATED', 'property-in-unknown-value');\n                            }\n                            quote.variableRegex = /@([\\w-]+)|@{([\\w-]+)}/g;\n                            quote.propRegex = /\\$([\\w-]+)|\\${([\\w-]+)}/g;\n                            result.push(quote);\n                        }\n                    }\n                    parserInput.forget();\n                    return new tree.Expression(result, true);\n                }\n                parserInput.restore();\n            },\n\n            //\n            // An @import atrule\n            //\n            //     @import \"lib\";\n            //\n            // Depending on our environment, importing is done differently:\n            // In the browser, it's an XHR request, in Node, it would be a\n            // file-system operation. The function used for importing is\n            // stored in `import`, which we pass to the Import constructor.\n            //\n            'import': function () {\n                let path;\n                let features;\n                const index = parserInput.i;\n\n                const dir = parserInput.$re(/^@import\\s+/);\n\n                if (dir) {\n                    const options = (dir ? this.importOptions() : null) || {};\n\n                    if ((path = this.entities.quoted() || this.entities.url())) {\n                        features = this.mediaFeatures({});\n\n                        if (!parserInput.$char(';')) {\n                            parserInput.i = index;\n                            error('missing semi-colon or unrecognised media features on import');\n                        }\n                        features = features && new(tree.Value)(features);\n                        return new(tree.Import)(path, features, options, index + currentIndex, fileInfo);\n                    }\n                    else {\n                        parserInput.i = index;\n                        error('malformed import statement');\n                    }\n                }\n            },\n\n            importOptions: function() {\n                let o;\n                const options = {};\n                let optionName;\n                let value;\n\n                // list of options, surrounded by parens\n                if (!parserInput.$char('(')) { return null; }\n                do {\n                    o = this.importOption();\n                    if (o) {\n                        optionName = o;\n                        value = true;\n                        switch (optionName) {\n                            case 'css':\n                                optionName = 'less';\n                                value = false;\n                                break;\n                            case 'once':\n                                optionName = 'multiple';\n                                value = false;\n                                break;\n                        }\n                        options[optionName] = value;\n                        if (!parserInput.$char(',')) { break; }\n                    }\n                } while (o);\n                expectChar(')');\n                return options;\n            },\n\n            importOption: function() {\n                const opt = parserInput.$re(/^(less|css|multiple|once|inline|reference|optional)/);\n                if (opt) {\n                    return opt[1];\n                }\n            },\n\n            mediaFeature: function (syntaxOptions) {\n                const entities = this.entities;\n                const nodes = [];\n                let e;\n                let p;\n                let rangeP;\n                let spacing = false;\n                parserInput.save();\n                do {\n                    parserInput.save();\n                    if (parserInput.$re(/^[0-9a-z-]*\\s+\\(/)) {\n                        spacing = true;\n                    }\n                    parserInput.restore();\n\n                    e = entities.declarationCall.bind(this)() || entities.keyword() || entities.variable() || entities.mixinLookup()\n                    if (e) {\n                        nodes.push(e);\n                        if (e.type === 'Variable' ||\n                            (e.type === 'Keyword' && /^(and|or|not|only)$/i.test(e.value))) {\n                            spacing = true;\n                        }\n                    } else if (parserInput.$char('(')) {\n                        let closed = false;\n                        p = this.property();\n                        parserInput.save();\n                        if (!p && syntaxOptions.queryInParens && parserInput.$re(/^[0-9a-z-]*\\s*([<>]=|<=|>=|[<>]|=)/)) {\n                            parserInput.restore();\n                            p = this.condition();\n\n                            parserInput.save();\n                            rangeP = this.atomicCondition(null, p.rvalue);\n                            if (!rangeP) {\n                                parserInput.restore();\n                            }\n                        } else {\n                            parserInput.restore();\n                            parserInput.save();\n                            e = this.value();\n                            if (e && parserInput.$char(')')) {\n                                closed = true;\n                                parserInput.forget();\n                            } else {\n                                parserInput.restore();\n                                e = this.mediaFeature(syntaxOptions);\n                            }\n                        }\n                        if (!closed && parserInput.$char(')')) {\n                            closed = true;\n                        }\n                        if (closed) {\n                            if (p && !e) {\n                                nodes.push(new (tree.Paren)(new (tree.QueryInParens)(p.op, p.lvalue, p.rvalue, rangeP ? rangeP.op : null, rangeP ? rangeP.rvalue : null, p._index)));\n                                e = p;\n                            } else if (p && e) {\n                                nodes.push(new (tree.Paren)(new (tree.Declaration)(p, e, null, null, parserInput.i + currentIndex, fileInfo, true)));\n                                if (!spacing) {\n                                    nodes[nodes.length - 1].noSpacing = true;\n                                }\n                                spacing = false;\n                            } else if (e) {\n                                nodes.push(new(tree.Paren)(e));\n                                spacing = false;\n                            } else {\n                                error('badly formed media feature definition');\n                            }\n                        } else {\n                            error('Missing closing \\')\\'', 'Parse');\n                        }\n                    }\n                } while (e);\n\n                parserInput.forget();\n                if (nodes.length > 0) {\n                    return new(tree.Expression)(nodes);\n                }\n            },\n\n            mediaFeatures: function (syntaxOptions) {\n                const entities = this.entities;\n                const features = [];\n                let e;\n                do {\n                    e = this.mediaFeature(syntaxOptions);\n                    if (e) {\n                        features.push(e);\n                        if (!parserInput.$char(',')) { break; }\n                        else if (!features[features.length - 1].noSpacing) {\n                            features[features.length - 1].noSpacing = false;\n                        }\n                    } else {\n                        e = entities.variable() || entities.mixinLookup();\n                        if (e) {\n                            features.push(e);\n                            if (!parserInput.$char(',')) { break; }\n                            else if (!features[features.length - 1].noSpacing) {\n                                features[features.length - 1].noSpacing = false;\n                            }\n                        }\n                    }\n                } while (e);\n\n                return features.length > 0 ? features : null;\n            },\n\n            prepareAndGetNestableAtRule: function (treeType, index, debugInfo, syntaxOptions) {\n                const features = this.mediaFeatures(syntaxOptions);\n\n                const rules = this.block();\n\n                if (!rules) {\n                    error('media definitions require block statements after any features');\n                }\n\n                parserInput.forget();\n\n                const atRule = new (treeType)(rules, features, index + currentIndex, fileInfo);\n                if (context.dumpLineNumbers) {\n                    atRule.debugInfo = debugInfo;\n                }\n\n                return atRule;\n            },\n\n            nestableAtRule: function () {\n                let debugInfo;\n                const index = parserInput.i;\n\n                if (context.dumpLineNumbers) {\n                    debugInfo = getDebugInfo(index);\n                }\n                parserInput.save();\n\n                if (parserInput.$peekChar('@')) {\n                    if (parserInput.$str('@media')) {\n                        return this.prepareAndGetNestableAtRule(tree.Media, index, debugInfo, MediaSyntaxOptions);\n                    }\n\n                    if (parserInput.$str('@container')) {\n                        return this.prepareAndGetNestableAtRule(tree.Container, index, debugInfo, ContainerSyntaxOptions);\n                    }\n                }\n\n                parserInput.restore();\n            },\n\n            //\n\n            // A @plugin directive, used to import plugins dynamically.\n            //\n            //     @plugin (args) \"lib\";\n            //\n            plugin: function () {\n                let path;\n                let args;\n                let options;\n                const index = parserInput.i;\n                const dir   = parserInput.$re(/^@plugin\\s+/);\n\n                if (dir) {\n                    warn('The @plugin directive is deprecated and will be replaced in Less 5.x. Use --plugin CLI option or the programmatic plugin API instead.', index, 'DEPRECATED', 'at-plugin');\n                    args = this.pluginArgs();\n\n                    if (args) {\n                        options = {\n                            pluginArgs: args,\n                            isPlugin: true\n                        };\n                    }\n                    else {\n                        options = { isPlugin: true };\n                    }\n\n                    if ((path = this.entities.quoted() || this.entities.url())) {\n\n                        if (!parserInput.$char(';')) {\n                            parserInput.i = index;\n                            error('missing semi-colon on @plugin');\n                        }\n                        return new(tree.Import)(path, null, options, index + currentIndex, fileInfo);\n                    }\n                    else {\n                        parserInput.i = index;\n                        error('malformed @plugin statement');\n                    }\n                }\n            },\n\n            pluginArgs: function() {\n                // list of options, surrounded by parens\n                parserInput.save();\n                if (!parserInput.$char('(')) {\n                    parserInput.restore();\n                    return null;\n                }\n                const args = parserInput.$re(/^\\s*([^);]+)\\)\\s*/);\n                if (args[1]) {\n                    parserInput.forget();\n                    return args[1].trim();\n                }\n                else {\n                    parserInput.restore();\n                    return null;\n                }\n            },\n            atruleUnknown: function (value, name, hasBlock) {\n                value = this.permissiveValue(/^[{;]/);\n                hasBlock = (parserInput.currentChar() === '{');\n                if (!value) {\n                    if (!hasBlock && parserInput.currentChar() !== ';') {\n                        error(''.concat(name, ' rule is missing block or ending semi-colon'));\n                    }\n                }\n                else if (!value.value) {\n                    value = null;\n                }\n                return [value, hasBlock];\n            },\n            atruleBlock: function (rules, value, isRooted, isKeywordList) {\n                rules = this.blockRuleset();\n                parserInput.save();\n                if (!rules && !isRooted) {\n                    value = this.entity();\n                    rules = this.blockRuleset();\n                }\n                if (!rules && !isRooted) {\n                    parserInput.restore();\n                    var e = [];\n                    value = this.entity();\n                    while (parserInput.$char(',')) {\n                        e.push(value);\n                        value = this.entity();\n                    }\n                    if (value && e.length > 0) {\n                        e.push(value);\n                        value = e;\n                        isKeywordList = true;\n                    }\n                    else {\n                        rules = this.blockRuleset();\n                    }\n                }\n                else {\n                    parserInput.forget();\n                }\n                    \n                return [rules, value, isKeywordList];\n            },\n            //\n            // A CSS AtRule\n            //\n            //     @charset \"utf-8\";\n            //\n            atrule: function () {\n                const index = parserInput.i;\n                let name;\n                let value;\n                let rules;\n                let nonVendorSpecificName;\n                let hasIdentifier;\n                let hasExpression;\n                let hasUnknown;\n                let hasBlock = true;\n                let isRooted = true;\n                let isKeywordList = false;\n\n                if (parserInput.currentChar() !== '@') { return; }\n\n                value = this['import']() || this.plugin() || this.nestableAtRule();\n                if (value) {\n                    return value;\n                }\n\n                parserInput.save();\n\n                name = parserInput.$re(/^@[a-z-]+/);\n\n                if (!name) { return; }\n\n                nonVendorSpecificName = name;\n                if (name.charAt(1) == '-' && name.indexOf('-', 2) > 0) {\n                    nonVendorSpecificName = `@${name.slice(name.indexOf('-', 2) + 1)}`;\n                }\n\n                switch (nonVendorSpecificName) {\n                    case '@charset':\n                        hasIdentifier = true;\n                        hasBlock = false;\n                        break;\n                    case '@namespace':\n                        hasExpression = true;\n                        hasBlock = false;\n                        break;\n                    case '@keyframes':\n                    case '@counter-style':\n                        hasIdentifier = true;\n                        break;\n                    case '@document':\n                    case '@supports':\n                        hasUnknown = true;\n                        isRooted = false;\n                        break;\n                    case '@starting-style':\n                        isRooted = false;\n                        break;\n                    case '@layer':\n                        isRooted = false;\n                        break;\n                    default:\n                        hasUnknown = true;\n                        break;\n                }\n\n                parserInput.commentStore.length = 0;\n\n                if (hasIdentifier) {\n                    value = this.entity();\n                    if (!value) {\n                        error(`expected ${name} identifier`);\n                    }\n                } else if (hasExpression) {\n                    value = this.expression();\n                    if (!value) {\n                        error(`expected ${name} expression`);\n                    }\n                } else if (hasUnknown) {\n                    const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n                    value = unknownPackage[0];\n                    hasBlock = unknownPackage[1];\n                }\n                    \n                if (hasBlock) {\n                    let blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n                    rules = blockPackage[0];\n                    value = blockPackage[1];\n                    isKeywordList = blockPackage[2];\n\n                    if (!rules && !hasUnknown) {\n                        parserInput.restore();\n                        name = parserInput.$re(/^@[a-z-]+/);\n                        const unknownPackage = this.atruleUnknown(value, name, hasBlock);\n                        value = unknownPackage[0];\n                        hasBlock = unknownPackage[1];\n                        if (hasBlock) {\n                            blockPackage = this.atruleBlock(rules, value, isRooted, isKeywordList);\n                            rules = blockPackage[0];\n                            value = blockPackage[1];\n                            isKeywordList = blockPackage[2];\n                        }\n                    }\n                }\n\n                if (rules || isKeywordList || (!hasBlock && value && parserInput.$char(';'))) {\n                    parserInput.forget();\n                    return new(tree.AtRule)(name, value, rules, index + currentIndex, fileInfo,\n                        context.dumpLineNumbers ? getDebugInfo(index) : null,\n                        isRooted\n                    );\n                }\n\n                parserInput.restore('at-rule options not recognised');\n            },\n\n            //\n            // A Value is a comma-delimited list of Expressions\n            //\n            //     font-family: Baskerville, Georgia, serif;\n            //\n            // In a Rule, a Value represents everything after the `:`,\n            // and before the `;`.\n            //\n            value: function () {\n                let e;\n                const expressions = [];\n                const index = parserInput.i;\n\n                do {\n                    e = this.expression();\n                    if (e) {\n                        expressions.push(e);\n                        if (!parserInput.$char(',')) { break; }\n                    }\n                } while (e);\n\n                if (expressions.length > 0) {\n                    return new(tree.Value)(expressions, index + currentIndex);\n                }\n            },\n            important: function () {\n                if (parserInput.currentChar() === '!') {\n                    return parserInput.$re(/^! *important/);\n                }\n            },\n            sub: function () {\n                let a;\n                let e;\n\n                parserInput.save();\n                if (parserInput.$char('(')) {\n                    a = this.addition();\n                    if (a && parserInput.$char(')')) {\n                        parserInput.forget();\n                        e = new(tree.Expression)([a]);\n                        e.parens = true;\n                        return e;\n                    }\n                    parserInput.restore('Expected \\')\\'');\n                    return;\n                }\n                parserInput.restore();\n            },\n            colorOperand: function () {\n                parserInput.save();\n\n                // hsl or rgb or lch operand\n                const match = parserInput.$re(/^[lchrgbs]\\s+/);\n                if (match) {\n                    parserInput.forget();\n                    return new tree.Keyword(match[0]);\n                }\n\n                parserInput.restore();\n            },\n            multiplication: function () {\n                let m;\n                let a;\n                let op;\n                let operation;\n                let isSpaced;\n                m = this.operand();\n                if (m) {\n                    isSpaced = parserInput.isWhitespace(-1);\n                    while (true) {\n                        if (parserInput.peek(/^\\/[*/]/)) {\n                            break;\n                        }\n\n                        parserInput.save();\n\n                        op = parserInput.$char('/') || parserInput.$char('*');\n                        if (!op) {\n                            let index = parserInput.i;\n                            op = parserInput.$str('./');\n                            if (op) {\n                                warn('./ operator is deprecated', index, 'DEPRECATED', 'dot-slash-operator');\n                            }\n                        }\n\n                        if (!op) { parserInput.forget(); break; }\n\n                        a = this.operand();\n\n                        if (!a) { parserInput.restore(); break; }\n                        parserInput.forget();\n\n                        m.parensInOp = true;\n                        a.parensInOp = true;\n                        operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n                        isSpaced = parserInput.isWhitespace(-1);\n                    }\n                    return operation || m;\n                }\n            },\n            addition: function () {\n                let m;\n                let a;\n                let op;\n                let operation;\n                let isSpaced;\n                m = this.multiplication();\n                if (m) {\n                    isSpaced = parserInput.isWhitespace(-1);\n                    while (true) {\n                        op = parserInput.$re(/^[-+]\\s+/) || (!isSpaced && (parserInput.$char('+') || parserInput.$char('-')));\n                        if (!op) {\n                            break;\n                        }\n                        a = this.multiplication();\n                        if (!a) {\n                            break;\n                        }\n\n                        m.parensInOp = true;\n                        a.parensInOp = true;\n                        operation = new(tree.Operation)(op, [operation || m, a], isSpaced);\n                        isSpaced = parserInput.isWhitespace(-1);\n                    }\n                    return operation || m;\n                }\n            },\n            conditions: function () {\n                let a;\n                let b;\n                const index = parserInput.i;\n                let condition;\n\n                a = this.condition(true);\n                if (a) {\n                    while (true) {\n                        if (!parserInput.peek(/^,\\s*(not\\s*)?\\(/) || !parserInput.$char(',')) {\n                            break;\n                        }\n                        b = this.condition(true);\n                        if (!b) {\n                            break;\n                        }\n                        condition = new(tree.Condition)('or', condition || a, b, index + currentIndex);\n                    }\n                    return condition || a;\n                }\n            },\n            condition: function (needsParens) {\n                let result;\n                let logical;\n                let next;\n                function or() {\n                    return parserInput.$str('or');\n                }\n\n                result = this.conditionAnd(needsParens);\n                if (!result) {\n                    return ;\n                }\n                logical = or();\n                if (logical) {\n                    next = this.condition(needsParens);\n                    if (next) {\n                        result = new(tree.Condition)(logical, result, next);\n                    } else {\n                        return ;\n                    }\n                }\n                return result;\n            },\n            conditionAnd: function (needsParens) {\n                let result;\n                let logical;\n                let next;\n                const self = this;\n                function insideCondition() {\n                    const cond = self.negatedCondition(needsParens) || self.parenthesisCondition(needsParens);\n                    if (!cond && !needsParens) {\n                        return self.atomicCondition(needsParens);\n                    }\n                    return cond;\n                }\n                function and() {\n                    return parserInput.$str('and');\n                }\n\n                result = insideCondition();\n                if (!result) {\n                    return ;\n                }\n                logical = and();\n                if (logical) {\n                    next = this.conditionAnd(needsParens);\n                    if (next) {\n                        result = new(tree.Condition)(logical, result, next);\n                    } else {\n                        return ;\n                    }\n                }\n                return result;\n            },\n            negatedCondition: function (needsParens) {\n                if (parserInput.$str('not')) {\n                    const result = this.parenthesisCondition(needsParens);\n                    if (result) {\n                        result.negate = !result.negate;\n                        return result;\n                    }\n\n                    // Allow simple bare values (keyword/variable) without parens,\n                    // e.g., `not false` or `not @var`.\n                    // Complex conditions (comparisons, function calls) require parentheses.\n                    const entities = this.entities;\n                    const index = parserInput.i;\n                    const a = entities.keyword() || entities.variable() || entities.quoted() || entities.mixinLookup();\n                    if (a) {\n                        return new(tree.Condition)('=', a, new(tree.Keyword)('true'), index + currentIndex, true);\n                    }\n                }\n            },\n            parenthesisCondition: function (needsParens) {\n                function tryConditionFollowedByParenthesis(me) {\n                    let body;\n                    parserInput.save();\n                    body = me.condition(needsParens);\n                    if (!body) {\n                        parserInput.restore();\n                        return ;\n                    }\n                    if (!parserInput.$char(')')) {\n                        parserInput.restore();\n                        return ;\n                    }\n                    parserInput.forget();\n                    return body;\n                }\n\n                let body;\n                parserInput.save();\n                if (!parserInput.$str('(')) {\n                    parserInput.restore();\n                    return ;\n                }\n                body = tryConditionFollowedByParenthesis(this);\n                if (body) {\n                    parserInput.forget();\n                    return body;\n                }\n\n                body = this.atomicCondition(needsParens);\n                if (!body) {\n                    parserInput.restore();\n                    return ;\n                }\n                if (!parserInput.$char(')')) {\n                    parserInput.restore(`expected ')' got '${parserInput.currentChar()}'`);\n                    return ;\n                }\n                parserInput.forget();\n                return body;\n            },\n            atomicCondition: function (needsParens, preparsedCond) {\n                const entities = this.entities;\n                const index = parserInput.i;\n                let a;\n                let b;\n                let c;\n                let op;\n\n                const cond = (function() {\n                    return this.addition() || entities.keyword() || entities.quoted() || entities.mixinLookup();\n                }).bind(this)\n\n                if (preparsedCond) {\n                    a = preparsedCond;\n                } else {\n                    a = cond();\n                }\n\n                if (a) {\n                    if (parserInput.$char('>')) {\n                        if (parserInput.$char('=')) {\n                            op = '>=';\n                        } else {\n                            op = '>';\n                        }\n                    } else\n                    if (parserInput.$char('<')) {\n                        if (parserInput.$char('=')) {\n                            op = '<=';\n                        } else {\n                            op = '<';\n                        }\n                    } else\n                    if (parserInput.$char('=')) {\n                        if (parserInput.$char('>')) {\n                            op = '=>';\n                        } else if (parserInput.$char('<')) {\n                            op = '=<';\n                        } else {\n                            op = '=';\n                        }\n                    }\n                    if (op) {\n                        b = cond();\n                        if (b) {\n                            c = new(tree.Condition)(op, a, b, index + currentIndex, false);\n                        } else {\n                            error('expected expression');\n                        }\n                    } else if (!preparsedCond) {\n                        c = new(tree.Condition)('=', a, new(tree.Keyword)('true'), index + currentIndex, false);\n                    }\n                    return c;\n                }\n            },\n\n            //\n            // An operand is anything that can be part of an operation,\n            // such as a Color, or a Variable\n            //\n            operand: function () {\n                const entities = this.entities;\n                let negate;\n\n                if (parserInput.peek(/^-[@$(]/)) {\n                    negate = parserInput.$char('-');\n                }\n\n                let o = this.sub() || entities.dimension() ||\n                        entities.color() || entities.variable() ||\n                        entities.property() || entities.call() ||\n                        entities.quoted(true) || entities.colorKeyword() ||\n                        this.colorOperand() || entities.mixinLookup();\n\n                if (negate) {\n                    o.parensInOp = true;\n                    o = new(tree.Negative)(o);\n                }\n\n                return o;\n            },\n\n            //\n            // Expressions either represent mathematical operations,\n            // or white-space delimited Entities.\n            //\n            //     1px solid black\n            //     @var * 2\n            //\n            expression: function () {\n                const entities = [];\n                let e;\n                let delim;\n                const index = parserInput.i;\n\n                do {\n                    e = this.comment();\n                    if (e && !e.isLineComment) {\n                        entities.push(e);\n                        continue;\n                    }\n                    e = this.addition() || this.entity();\n\n                    if (e instanceof tree.Comment) {\n                        e = null;\n                    }\n\n                    if (e) {\n                        entities.push(e);\n                        // operations do not allow keyword \"/\" dimension (e.g. small/20px) so we support that here\n                        if (!parserInput.peek(/^\\/[/*]/)) {\n                            delim = parserInput.$char('/');\n                            if (delim) {\n                                entities.push(new(tree.Anonymous)(delim, index + currentIndex));\n                            }\n                        }\n                    }\n                } while (e);\n                if (entities.length > 0) {\n                    return new(tree.Expression)(entities);\n                }\n            },\n            property: function () {\n                const name = parserInput.$re(/^(\\*?-?[_a-zA-Z0-9-]+)\\s*:/);\n                if (name) {\n                    return name[1];\n                }\n            },\n            ruleProperty: function () {\n                let name = [];\n                const index = [];\n                let s;\n                let k;\n\n                parserInput.save();\n\n                const simpleProperty = parserInput.$re(/^([_a-zA-Z0-9-]+)\\s*:/);\n                if (simpleProperty) {\n                    name = [new(tree.Keyword)(simpleProperty[1])];\n                    parserInput.forget();\n                    return name;\n                }\n\n                function match(re) {\n                    const i = parserInput.i;\n                    const chunk = parserInput.$re(re);\n                    if (chunk) {\n                        index.push(i);\n                        return name.push(chunk[1]);\n                    }\n                }\n\n                match(/^(\\*?)/);\n                while (true) {\n                    if (!match(/^((?:[\\w-]+)|(?:[@$]\\{[\\w-]+\\}))/)) {\n                        break;\n                    }\n                }\n\n                if ((name.length > 1) && match(/^((?:\\+_|\\+)?)\\s*:/)) {\n                    parserInput.forget();\n\n                    // at last, we have the complete match now. move forward,\n                    // convert name particles to tree objects and return:\n                    if (name[0] === '') {\n                        name.shift();\n                        index.shift();\n                    }\n                    for (k = 0; k < name.length; k++) {\n                        s = name[k];\n                        name[k] = (s.charAt(0) !== '@' && s.charAt(0) !== '$') ?\n                            new(tree.Keyword)(s) :\n                            (s.charAt(0) === '@' ?\n                                new(tree.Variable)(`@${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo) :\n                                new(tree.Property)(`$${s.slice(2, -1)}`, index[k] + currentIndex, fileInfo));\n                    }\n                    return name;\n                }\n                parserInput.restore();\n            }\n        }\n    };\n};\nParser.serializeVars = vars => {\n    let s = '';\n\n    for (const name in vars) {\n        if (Object.hasOwnProperty.call(vars, name)) {\n            const value = vars[name];\n            s += `${((name[0] === '@') ? '' : '@') + name}: ${value}${(String(value).slice(-1) === ';') ? '' : ';'}`;\n        }\n    }\n\n    return s;\n};\n\nexport default Parser;\n"
  },
  {
    "path": "packages/less/lib/less/plugin-manager.js",
    "content": "/**\n * Plugin Manager\n */\nclass PluginManager {\n    constructor(less) {\n        this.less = less;\n        this.visitors = [];\n        this.preProcessors = [];\n        this.postProcessors = [];\n        this.installedPlugins = [];\n        this.fileManagers = [];\n        this.iterator = -1;\n        this.pluginCache = {};\n        this.Loader = new less.PluginLoader(less);\n    }\n\n    /**\n     * Adds all the plugins in the array\n     * @param {Array} plugins\n     */\n    addPlugins(plugins) {\n        if (plugins) {\n            for (let i = 0; i < plugins.length; i++) {\n                this.addPlugin(plugins[i]);\n            }\n        }\n    }\n\n    /**\n     *\n     * @param plugin\n     * @param {String} filename\n     */\n    addPlugin(plugin, filename, functionRegistry) {\n        this.installedPlugins.push(plugin);\n        if (filename) {\n            this.pluginCache[filename] = plugin;\n        }\n        if (plugin.install) {\n            plugin.install(this.less, this, functionRegistry || this.less.functions.functionRegistry);\n        }\n    }\n\n    /**\n     *\n     * @param filename\n     */\n    get(filename) {\n        return this.pluginCache[filename];\n    }\n\n    /**\n     * Adds a visitor. The visitor object has options on itself to determine\n     * when it should run.\n     * @param visitor\n     */\n    addVisitor(visitor) {\n        this.visitors.push(visitor);\n    }\n\n    /**\n     * Adds a pre processor object\n     * @param {object} preProcessor\n     * @param {number} priority - guidelines 1 = before import, 1000 = import, 2000 = after import\n     */\n    addPreProcessor(preProcessor, priority) {\n        let indexToInsertAt;\n        for (indexToInsertAt = 0; indexToInsertAt < this.preProcessors.length; indexToInsertAt++) {\n            if (this.preProcessors[indexToInsertAt].priority >= priority) {\n                break;\n            }\n        }\n        this.preProcessors.splice(indexToInsertAt, 0, {preProcessor, priority});\n    }\n\n    /**\n     * Adds a post processor object\n     * @param {object} postProcessor\n     * @param {number} priority - guidelines 1 = before compression, 1000 = compression, 2000 = after compression\n     */\n    addPostProcessor(postProcessor, priority) {\n        let indexToInsertAt;\n        for (indexToInsertAt = 0; indexToInsertAt < this.postProcessors.length; indexToInsertAt++) {\n            if (this.postProcessors[indexToInsertAt].priority >= priority) {\n                break;\n            }\n        }\n        this.postProcessors.splice(indexToInsertAt, 0, {postProcessor, priority});\n    }\n\n    /**\n     *\n     * @param manager\n     */\n    addFileManager(manager) {\n        this.fileManagers.push(manager);\n    }\n\n    /**\n     *\n     * @returns {Array}\n     * @private\n     */\n    getPreProcessors() {\n        const preProcessors = [];\n        for (let i = 0; i < this.preProcessors.length; i++) {\n            preProcessors.push(this.preProcessors[i].preProcessor);\n        }\n        return preProcessors;\n    }\n\n    /**\n     *\n     * @returns {Array}\n     * @private\n     */\n    getPostProcessors() {\n        const postProcessors = [];\n        for (let i = 0; i < this.postProcessors.length; i++) {\n            postProcessors.push(this.postProcessors[i].postProcessor);\n        }\n        return postProcessors;\n    }\n\n    /**\n     *\n     * @returns {Array}\n     * @private\n     */\n    getVisitors() {\n        return this.visitors;\n    }\n\n    visitor() {\n        const self = this;\n        return {\n            first: function() {\n                self.iterator = -1;\n                return self.visitors[self.iterator];\n            },\n            get: function() {\n                self.iterator += 1;\n                return self.visitors[self.iterator];\n            }\n        };\n    }\n\n    /**\n     *\n     * @returns {Array}\n     * @private\n     */\n    getFileManagers() {\n        return this.fileManagers;\n    }\n}\n\nlet pm;\n\nconst PluginManagerFactory = function(less, newFactory) {\n    if (newFactory || !pm) {\n        pm = new PluginManager(less);\n    }\n    return pm;\n};\n\n//\nexport default PluginManagerFactory;\n"
  },
  {
    "path": "packages/less/lib/less/render.js",
    "content": "import * as utils from './utils.js';\n\nexport default function(environment, ParseTree) {\n    const render = function (input, options, callback) {\n        if (typeof options === 'function') {\n            callback = options;\n            options = utils.copyOptions(this.options, {});\n        }\n        else {\n            options = utils.copyOptions(this.options, options || {});\n        }\n\n        if (!callback) {\n            const self = this;\n            return new Promise(function (resolve, reject) {\n                render.call(self, input, options, function(err, output) {\n                    if (err) {\n                        reject(err);\n                    } else {\n                        resolve(output);\n                    }\n                });\n            });\n        } else {\n            this.parse(input, options, function(err, root, imports, options) {\n                if (err) { return callback(err); }\n\n                let result;\n                try {\n                    const parseTree = new ParseTree(root, imports);\n                    result = parseTree.toCSS(options);\n                }\n                catch (err) { return callback(err); }\n\n                callback(null, result);\n            });\n        }\n    };\n\n    return render;\n}\n"
  },
  {
    "path": "packages/less/lib/less/source-map-builder.js",
    "content": "export default function (SourceMapOutput, environment) {\n    class SourceMapBuilder {\n        constructor(options) {\n            this.options = options;\n        }\n\n        toCSS(rootNode, options, imports) {\n            const sourceMapOutput = new SourceMapOutput(\n                {\n                    contentsIgnoredCharsMap: imports.contentsIgnoredChars,\n                    rootNode,\n                    contentsMap: imports.contents,\n                    sourceMapFilename: this.options.sourceMapFilename,\n                    sourceMapURL: this.options.sourceMapURL,\n                    outputFilename: this.options.sourceMapOutputFilename,\n                    sourceMapBasepath: this.options.sourceMapBasepath,\n                    sourceMapRootpath: this.options.sourceMapRootpath,\n                    outputSourceFiles: this.options.outputSourceFiles,\n                    sourceMapGenerator: this.options.sourceMapGenerator,\n                    sourceMapFileInline: this.options.sourceMapFileInline,    \n                    disableSourcemapAnnotation: this.options.disableSourcemapAnnotation\n                });\n\n            const css = sourceMapOutput.toCSS(options);\n            this.sourceMap = sourceMapOutput.sourceMap;\n            this.sourceMapURL = sourceMapOutput.sourceMapURL;\n            if (this.options.sourceMapInputFilename) {\n                this.sourceMapInputFilename = sourceMapOutput.normalizeFilename(this.options.sourceMapInputFilename);\n            }\n            if (this.options.sourceMapBasepath !== undefined && this.sourceMapURL !== undefined) {\n                this.sourceMapURL = sourceMapOutput.removeBasepath(this.sourceMapURL);\n            }\n            return css + this.getCSSAppendage();\n        }\n\n        getCSSAppendage() {\n\n            let sourceMapURL = this.sourceMapURL;\n            if (this.options.sourceMapFileInline) {\n                if (this.sourceMap === undefined) {\n                    return '';\n                }\n                sourceMapURL = `data:application/json;base64,${environment.encodeBase64(this.sourceMap)}`;\n            }\n\n            if (this.options.disableSourcemapAnnotation) {\n                return '';\n            }\n\n            if (sourceMapURL) {\n                return `/*# sourceMappingURL=${sourceMapURL} */`;\n            }\n            return '';\n        }\n\n        getExternalSourceMap() {\n            return this.sourceMap;\n        }\n\n        setExternalSourceMap(sourceMap) {\n            this.sourceMap = sourceMap;\n        }\n\n        isInline() {\n            return this.options.sourceMapFileInline;\n        }\n\n        getSourceMapURL() {\n            return this.sourceMapURL;\n        }\n\n        getOutputFilename() {\n            return this.options.sourceMapOutputFilename;\n        }\n\n        getInputFilename() {\n            return this.sourceMapInputFilename;\n        }\n    }\n\n    return SourceMapBuilder;\n}\n"
  },
  {
    "path": "packages/less/lib/less/source-map-output.js",
    "content": "export default function (environment) {\n    class SourceMapOutput {\n        constructor(options) {\n            this._css = [];\n            this._rootNode = options.rootNode;\n            this._contentsMap = options.contentsMap;\n            this._contentsIgnoredCharsMap = options.contentsIgnoredCharsMap;\n            if (options.sourceMapFilename) {\n                this._sourceMapFilename = options.sourceMapFilename.replace(/\\\\/g, '/');\n            }\n            this._outputFilename = options.outputFilename ? options.outputFilename.replace(/\\\\/g, '/') : options.outputFilename;\n            this.sourceMapURL = options.sourceMapURL;\n            if (options.sourceMapBasepath) {\n                this._sourceMapBasepath = options.sourceMapBasepath.replace(/\\\\/g, '/');\n            }\n            if (options.sourceMapRootpath) {\n                this._sourceMapRootpath = options.sourceMapRootpath.replace(/\\\\/g, '/');\n                if (this._sourceMapRootpath.charAt(this._sourceMapRootpath.length - 1) !== '/') {\n                    this._sourceMapRootpath += '/';\n                }\n            } else {\n                this._sourceMapRootpath = '';\n            }\n            this._outputSourceFiles = options.outputSourceFiles;\n            this._sourceMapGeneratorConstructor = environment.getSourceMapGenerator();\n\n            this._lineNumber = 0;\n            this._column = 0;\n        }\n\n        removeBasepath(path) {\n            if (this._sourceMapBasepath && path.indexOf(this._sourceMapBasepath) === 0) {\n                path = path.substring(this._sourceMapBasepath.length);\n                if (path.charAt(0) === '\\\\' || path.charAt(0) === '/') {\n                    path = path.substring(1);\n                }\n            }\n\n            return path;\n        }\n\n        normalizeFilename(filename) {\n            filename = filename.replace(/\\\\/g, '/');\n            filename = this.removeBasepath(filename);\n            return (this._sourceMapRootpath || '') + filename;\n        }\n\n        add(chunk, fileInfo, index, mapLines) {\n\n            // ignore adding empty strings\n            if (!chunk) {\n                return;\n            }\n\n            let lines, sourceLines, columns, sourceColumns, i;\n\n            if (fileInfo && fileInfo.filename) {\n                let inputSource = this._contentsMap[fileInfo.filename];\n\n                // remove vars/banner added to the top of the file\n                if (this._contentsIgnoredCharsMap[fileInfo.filename]) {\n                    // adjust the index\n                    index -= this._contentsIgnoredCharsMap[fileInfo.filename];\n                    if (index < 0) { index = 0; }\n                    // adjust the source\n                    inputSource = inputSource.slice(this._contentsIgnoredCharsMap[fileInfo.filename]);\n                }\n\n                /** \n                 * ignore empty content, or failsafe\n                 * if contents map is incorrect\n                 */\n                if (inputSource === undefined) {\n                    this._css.push(chunk);\n                    return;\n                }\n\n                inputSource = inputSource.substring(0, index);\n                sourceLines = inputSource.split('\\n');\n                sourceColumns = sourceLines[sourceLines.length - 1];\n            }\n\n            lines = chunk.split('\\n');\n            columns = lines[lines.length - 1];\n\n            if (fileInfo && fileInfo.filename) {\n                if (!mapLines) {\n                    this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + 1, column: this._column},\n                        original: { line: sourceLines.length, column: sourceColumns.length},\n                        source: this.normalizeFilename(fileInfo.filename)});\n                } else {\n                    for (i = 0; i < lines.length; i++) {\n                        this._sourceMapGenerator.addMapping({ generated: { line: this._lineNumber + i + 1, column: i === 0 ? this._column : 0},\n                            original: { line: sourceLines.length + i, column: i === 0 ? sourceColumns.length : 0},\n                            source: this.normalizeFilename(fileInfo.filename)});\n                    }\n                }\n            }\n\n            if (lines.length === 1) {\n                this._column += columns.length;\n            } else {\n                this._lineNumber += lines.length - 1;\n                this._column = columns.length;\n            }\n\n            this._css.push(chunk);\n        }\n\n        isEmpty() {\n            return this._css.length === 0;\n        }\n\n        toCSS(context) {\n            this._sourceMapGenerator = new this._sourceMapGeneratorConstructor({ file: this._outputFilename, sourceRoot: null });\n\n            if (this._outputSourceFiles) {\n                for (const filename in this._contentsMap) {\n                    // eslint-disable-next-line no-prototype-builtins\n                    if (this._contentsMap.hasOwnProperty(filename)) {\n                        let source = this._contentsMap[filename];\n                        if (this._contentsIgnoredCharsMap[filename]) {\n                            source = source.slice(this._contentsIgnoredCharsMap[filename]);\n                        }\n                        this._sourceMapGenerator.setSourceContent(this.normalizeFilename(filename), source);\n                    }\n                }\n            }\n\n            this._rootNode.genCSS(context, this);\n\n            if (this._css.length > 0) {\n                let sourceMapURL;\n                const sourceMapContent = JSON.stringify(this._sourceMapGenerator.toJSON());\n\n                if (this.sourceMapURL) {\n                    sourceMapURL = this.sourceMapURL;\n                } else if (this._sourceMapFilename) {\n                    sourceMapURL = this._sourceMapFilename;\n                }\n                this.sourceMapURL = sourceMapURL;\n\n                this.sourceMap = sourceMapContent;\n            }\n\n            return this._css.join('');\n        }\n    }\n\n    return SourceMapOutput;\n}\n"
  },
  {
    "path": "packages/less/lib/less/transform-tree.js",
    "content": "import contexts from './contexts.js';\nimport visitor from './visitors/index.js';\nimport tree from './tree/index.js';\n\n/**\n * @param {import('./tree/node.js').default} root\n * @param {{ variables?: Record<string, *>, compress?: boolean, pluginManager?: *, frames?: *[] }} options\n * @returns {import('./tree/node.js').default}\n */\nexport default function(root, options) {\n    options = options || {};\n    let evaldRoot;\n    let variables = options.variables;\n    const evalEnv = new contexts.Eval(options);\n\n    //\n    // Allows setting variables with a hash, so:\n    //\n    //   `{ color: new tree.Color('#f01') }` will become:\n    //\n    //   new tree.Declaration('@color',\n    //     new tree.Value([\n    //       new tree.Expression([\n    //         new tree.Color('#f01')\n    //       ])\n    //     ])\n    //   )\n    //\n    if (typeof variables === 'object' && !Array.isArray(variables)) {\n        variables = Object.keys(variables).map(function (k) {\n            let value = variables[k];\n\n            if (!(value instanceof tree.Value)) {\n                if (!(value instanceof tree.Expression)) {\n                    value = new tree.Expression([value]);\n                }\n                value = new tree.Value([value]);\n            }\n            return new tree.Declaration(`@${k}`, value, false, null, 0);\n        });\n        evalEnv.frames = [new tree.Ruleset(null, variables)];\n    }\n\n    const visitors = [\n        new visitor.JoinSelectorVisitor(),\n        new visitor.MarkVisibleSelectorsVisitor(true),\n        new visitor.ExtendVisitor(),\n        new visitor.ToCSSVisitor({compress: Boolean(options.compress)})\n    ];\n\n    const preEvalVisitors = [];\n    let v;\n    let visitorIterator;\n\n    /**\n     * first() / get() allows visitors to be added while visiting\n     * \n     * @todo Add scoping for visitors just like functions for @plugin; right now they're global\n     */\n    if (options.pluginManager) {\n        visitorIterator = options.pluginManager.visitor();\n        for (let i = 0; i < 2; i++) {\n            visitorIterator.first();\n            while ((v = visitorIterator.get())) {\n                if (v.isPreEvalVisitor) {\n                    if (i === 0 || preEvalVisitors.indexOf(v) === -1) {\n                        preEvalVisitors.push(v);\n                        v.run(root);\n                    }\n                }\n                else {\n                    if (i === 0 || visitors.indexOf(v) === -1) {\n                        if (v.isPreVisitor) {\n                            visitors.unshift(v);\n                        }\n                        else {\n                            visitors.push(v);\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    evaldRoot = root.eval(evalEnv);\n\n    for (let i = 0; i < visitors.length; i++) {\n        visitors[i].run(evaldRoot);\n    }\n\n    // Run any remaining visitors added after eval pass\n    if (options.pluginManager) {\n        visitorIterator.first();\n        while ((v = visitorIterator.get())) {\n            if (visitors.indexOf(v) === -1 && preEvalVisitors.indexOf(v) === -1) {\n                v.run(evaldRoot);\n            }\n        }\n    }\n\n    return evaldRoot;\n}\n"
  },
  {
    "path": "packages/less/lib/less/tree/anonymous.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, FileInfo, VisibilityInfo } from './node.js' */\nimport Node from './node.js';\n\nclass Anonymous extends Node {\n    get type() { return 'Anonymous'; }\n\n    /**\n     * @param {string | null} value\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     * @param {boolean} [mapLines]\n     * @param {boolean} [rulesetLike]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(value, index, currentFileInfo, mapLines, rulesetLike, visibilityInfo) {\n        super();\n        this.value = value;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        this.mapLines = mapLines;\n        this.rulesetLike = (typeof rulesetLike === 'undefined') ? false : rulesetLike;\n        this.allowRoot = true;\n        this.copyVisibilityInfo(visibilityInfo);\n    }\n\n    /** @returns {Anonymous} */\n    eval() {\n        return new Anonymous(/** @type {string | null} */ (this.value), this._index, this._fileInfo, this.mapLines, this.rulesetLike, this.visibilityInfo());\n    }\n\n    /**\n     * @param {Node} other\n     * @returns {number | undefined}\n     */\n    compare(other) {\n        return other.toCSS && this.toCSS(/** @type {EvalContext} */ ({})) === other.toCSS(/** @type {EvalContext} */ ({})) ? 0 : undefined;\n    }\n\n    /** @returns {boolean} */\n    isRulesetLike() {\n        return this.rulesetLike;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        this.nodeVisible = Boolean(this.value);\n        if (this.nodeVisible) {\n            output.add(/** @type {string} */ (this.value), this._fileInfo, this._index, this.mapLines);\n        }\n    }\n}\n\nexport default Anonymous;\n"
  },
  {
    "path": "packages/less/lib/less/tree/assignment.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor } from './node.js' */\nimport Node from './node.js';\n\nclass Assignment extends Node {\n    get type() { return 'Assignment'; }\n\n    /**\n     * @param {string} key\n     * @param {Node} val\n     */\n    constructor(key, val) {\n        super();\n        this.key = key;\n        this.value = val;\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.value = visitor.visit(/** @type {Node} */ (this.value));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Assignment}\n     */\n    eval(context) {\n        if (/** @type {Node} */ (this.value).eval) {\n            return new Assignment(this.key, /** @type {Node} */ (this.value).eval(context));\n        }\n        return this;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add(`${this.key}=`);\n        if (/** @type {Node} */ (this.value).genCSS) {\n            /** @type {Node} */ (this.value).genCSS(context, output);\n        } else {\n            output.add(/** @type {string} */ (/** @type {unknown} */ (this.value)));\n        }\n    }\n}\n\nexport default Assignment;\n"
  },
  {
    "path": "packages/less/lib/less/tree/atrule-syntax.js",
    "content": "// @ts-check\nexport const MediaSyntaxOptions = {\n    queryInParens: true\n};\n\nexport const ContainerSyntaxOptions = {\n    queryInParens: true\n};\n"
  },
  {
    "path": "packages/less/lib/less/tree/atrule.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo, VisibilityInfo } from './node.js' */\n/** @import { FunctionRegistry } from './nested-at-rule.js' */\nimport Node from './node.js';\nimport Selector from './selector.js';\nimport Ruleset from './ruleset.js';\nimport Anonymous from './anonymous.js';\nimport NestableAtRulePrototype from './nested-at-rule.js';\nimport mergeRules from './merge-rules.js';\n\n/**\n * @typedef {Node & {\n *   rules?: Node[],\n *   selectors?: Selector[],\n *   root?: boolean,\n *   allowImports?: boolean,\n *   functionRegistry?: FunctionRegistry,\n *   merge?: boolean,\n *   debugInfo?: { lineNumber: number, fileName: string },\n *   elements?: import('./element.js').default[]\n * }} RulesetLikeNode\n */\n\nclass AtRule extends Node {\n    get type() { return 'AtRule'; }\n\n    /**\n     * @param {string} [name]\n     * @param {Node | string} [value]\n     * @param {Node[] | Ruleset} [rules]\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     * @param {{ lineNumber: number, fileName: string }} [debugInfo]\n     * @param {boolean} [isRooted]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(\n        name,\n        value,\n        rules,\n        index,\n        currentFileInfo,\n        debugInfo,\n        isRooted,\n        visibilityInfo\n    ) {\n        super();\n        let i;\n        var selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n\n        /** @type {string | undefined} */\n        this.name  = name;\n        this.value = (value instanceof Node) ? value : (value ? new Anonymous(value) : value);\n        /** @type {boolean | undefined} */\n        this.simpleBlock = undefined;\n        /** @type {RulesetLikeNode[] | undefined} */\n        this.declarations = undefined;\n        /** @type {RulesetLikeNode[] | undefined} */\n        this.rules = undefined;\n        if (rules) {\n            if (Array.isArray(rules)) {\n                const allDeclarations = this.declarationsBlock(rules);\n\n                let allRulesetDeclarations = true;\n                rules.forEach(rule => {\n                    if (rule.type === 'Ruleset' && /** @type {RulesetLikeNode} */ (rule).rules) allRulesetDeclarations = allRulesetDeclarations && this.declarationsBlock(/** @type {Node[]} */ (/** @type {RulesetLikeNode} */ (rule).rules), true);\n                });\n\n                if (allDeclarations && !isRooted) {\n                    this.simpleBlock = true;\n                    this.declarations = rules;\n                } else if (allRulesetDeclarations && rules.length === 1 && !isRooted && !value) {\n                    this.simpleBlock = true;\n                    this.declarations = /** @type {RulesetLikeNode} */ (rules[0]).rules ? /** @type {RulesetLikeNode} */ (rules[0]).rules : rules;\n                } else {\n                    this.rules = rules;\n                }\n            } else {\n                const allDeclarations = this.declarationsBlock(/** @type {Node[]} */ (rules.rules));\n\n                if (allDeclarations && !isRooted && !value) {\n                    this.simpleBlock = true;\n                    this.declarations = rules.rules;\n                } else {\n                    this.rules = [rules];\n                    /** @type {RulesetLikeNode} */ (this.rules[0]).selectors = (new Selector([], null, null, index, currentFileInfo)).createEmptySelectors();\n                }\n            }\n            if (!this.simpleBlock) {\n                for (i = 0; i < this.rules.length; i++) {\n                    /** @type {RulesetLikeNode} */ (this.rules[i]).allowImports = true;\n                }\n            }\n            if (this.declarations) {\n                this.setParent(this.declarations, /** @type {Node} */ (/** @type {unknown} */ (this)));\n            }\n            if (this.rules) {\n                this.setParent(this.rules, /** @type {Node} */ (/** @type {unknown} */ (this)));\n            }\n        }\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {{ lineNumber: number, fileName: string } | undefined} */\n        this.debugInfo = debugInfo;\n        /** @type {boolean} */\n        this.isRooted = isRooted || false;\n        this.copyVisibilityInfo(visibilityInfo);\n        this.allowRoot = true;\n    }\n\n    /**\n     * @param {Node[]} rules\n     * @param {boolean} [mergeable]\n     * @returns {boolean}\n     */\n    declarationsBlock(rules, mergeable = false) {\n        if (!mergeable) {\n            return rules.filter(function (/** @type {Node & { merge?: boolean }} */ node) { return (node.type === 'Declaration' || node.type === 'Comment') && !node.merge}).length === rules.length;\n        } else {\n            return rules.filter(function (/** @type {Node} */ node) { return (node.type === 'Declaration' || node.type === 'Comment'); }).length === rules.length;\n        }\n    }\n\n    /**\n     * @param {Node[]} rules\n     * @returns {boolean}\n     */\n    keywordList(rules) {\n        if (!Array.isArray(rules)) {\n            return false;\n        } else {\n            return rules.filter(function (/** @type {Node} */ node) { return (node.type === 'Keyword' || node.type === 'Comment'); }).length === rules.length;\n        }\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        const value = this.value, rules = this.rules, declarations = this.declarations;\n\n        if (rules) {\n            this.rules = visitor.visitArray(rules);\n        } else if (declarations) {\n            this.declarations = visitor.visitArray(declarations);\n        }\n        if (value) {\n            this.value = visitor.visit(/** @type {Node} */ (value));\n        }\n    }\n\n    /** @override @returns {boolean} */\n    isRulesetLike() {\n        return /** @type {boolean} */ (/** @type {unknown} */ (this.rules || !this.isCharset()));\n    }\n\n    isCharset() {\n        return '@charset' === this.name;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        const value = this.value, rules = this.rules || this.declarations;\n        output.add(/** @type {string} */ (this.name), this.fileInfo(), this.getIndex());\n        if (value) {\n            output.add(' ');\n            /** @type {Node} */ (value).genCSS(context, output);\n        }\n        if (this.simpleBlock) {\n            this.outputRuleset(context, output, /** @type {Node[]} */ (this.declarations));\n        } else if (rules) {\n            this.outputRuleset(context, output, rules);\n        } else {\n            output.add(';');\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        let mediaPathBackup, mediaBlocksBackup, value = this.value, rules = this.rules || this.declarations;\n\n        // media stored inside other atrule should not bubble over it\n        // backpup media bubbling information\n        mediaPathBackup = context.mediaPath;\n        mediaBlocksBackup = context.mediaBlocks;\n        // deleted media bubbling information\n        context.mediaPath = [];\n        context.mediaBlocks = [];\n\n        if (value) {\n            value = /** @type {Node} */ (value).eval(context);\n        }\n\n        if (rules) {\n            rules = this.evalRoot(context, rules);\n        }\n        if (Array.isArray(rules) && /** @type {RulesetLikeNode} */ (rules[0]).rules && Array.isArray(/** @type {RulesetLikeNode} */ (rules[0]).rules) && /** @type {Node[]} */ (/** @type {RulesetLikeNode} */ (rules[0]).rules).length) {\n            const allMergeableDeclarations = this.declarationsBlock(/** @type {Node[]} */ (/** @type {RulesetLikeNode} */ (rules[0]).rules), true);\n            if (allMergeableDeclarations && !this.isRooted && !value) {\n                mergeRules(/** @type {Node[]} */ (/** @type {RulesetLikeNode} */ (rules[0]).rules));\n                rules = /** @type {RulesetLikeNode[]} */ (/** @type {RulesetLikeNode} */ (rules[0]).rules);\n                rules.forEach(/** @param {RulesetLikeNode} rule */ rule => { rule.merge = false; });\n            }\n        }\n        if (this.simpleBlock && rules) {\n            /** @type {RulesetLikeNode} */ (rules[0]).functionRegistry = /** @type {RulesetLikeNode} */ (context.frames[0]).functionRegistry.inherit();\n            rules = rules.map(function (/** @type {Node} */ rule) { return rule.eval(context); });\n        }\n\n        // restore media bubbling information\n        context.mediaPath = mediaPathBackup;\n        context.mediaBlocks = mediaBlocksBackup;\n        return /** @type {Node} */ (/** @type {unknown} */ (new AtRule(this.name, value, rules, this.getIndex(), this.fileInfo(), this.debugInfo, this.isRooted, this.visibilityInfo())));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {Node[]} rules\n     * @returns {Node[]}\n     */\n    evalRoot(context, rules) {\n        let ampersandCount = 0;\n        let noAmpersandCount = 0;\n        let noAmpersands = true;\n\n        if (!this.simpleBlock) {\n            rules = [rules[0].eval(context)];\n        }\n\n        /** @type {Selector[]} */\n        let precedingSelectors = [];\n        if (context.frames.length > 0) {\n            for (let index = 0; index < context.frames.length; index++) {\n                const frame = /** @type {RulesetLikeNode} */ (context.frames[index]);\n                if (\n                    frame.type === 'Ruleset' &&\n                    frame.rules &&\n                    frame.rules.length > 0\n                ) {\n                    if (frame && !frame.root && frame.selectors && frame.selectors.length > 0) {\n                        precedingSelectors = precedingSelectors.concat(frame.selectors);\n                    }\n                }\n                if (precedingSelectors.length > 0) {\n                    const allAmpersandElements = precedingSelectors.every(\n                        sel => sel.elements && sel.elements.length > 0 && sel.elements.every(\n                            /** @param {import('./element.js').default} el */\n                            el => el.value === '&'\n                        )\n                    );\n                    if (allAmpersandElements) {\n                        noAmpersands = false;\n                        noAmpersandCount++;\n                    } else {\n                        ampersandCount++;\n                    }\n                }\n            }\n        }\n\n        const mixedAmpersands = ampersandCount > 0 && noAmpersandCount > 0 && !noAmpersands;\n        if (\n            (this.isRooted && ampersandCount > 0 && noAmpersandCount === 0 && noAmpersands)\n            || !mixedAmpersands\n        ) {\n            /** @type {RulesetLikeNode} */ (rules[0]).root = true;\n        }\n        return rules;\n    }\n\n    /** @param {string} name */\n    variable(name) {\n        if (this.rules) {\n            // assuming that there is only one rule at this point - that is how parser constructs the rule\n            return Ruleset.prototype.variable.call(this.rules[0], name);\n        }\n    }\n\n    find() {\n        if (this.rules) {\n            // assuming that there is only one rule at this point - that is how parser constructs the rule\n            return Ruleset.prototype.find.apply(this.rules[0], arguments);\n        }\n    }\n\n    rulesets() {\n        if (this.rules) {\n            // assuming that there is only one rule at this point - that is how parser constructs the rule\n            return Ruleset.prototype.rulesets.apply(this.rules[0]);\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     * @param {Node[]} rules\n     */\n    outputRuleset(context, output, rules) {\n        const ruleCnt = rules.length;\n        let i;\n        context.tabLevel = (context.tabLevel | 0) + 1;\n\n        // Compressed\n        if (context.compress) {\n            output.add('{');\n            for (i = 0; i < ruleCnt; i++) {\n                rules[i].genCSS(context, output);\n            }\n            output.add('}');\n            context.tabLevel--;\n            return;\n        }\n\n        // Non-compressed\n        const tabSetStr = `\\n${Array(context.tabLevel).join('  ')}`, tabRuleStr = `${tabSetStr}  `;\n        if (!ruleCnt) {\n            output.add(` {${tabSetStr}}`);\n        } else {\n            output.add(` {${tabRuleStr}`);\n            rules[0].genCSS(context, output);\n            for (i = 1; i < ruleCnt; i++) {\n                output.add(tabRuleStr);\n                rules[i].genCSS(context, output);\n            }\n            output.add(`${tabSetStr}}`);\n        }\n\n        context.tabLevel--;\n    }\n}\n\n// Apply shared methods from NestableAtRulePrototype that AtRule doesn't override\nconst { evalFunction, evalTop, evalNested, permute, bubbleSelectors } = NestableAtRulePrototype;\nObject.assign(AtRule.prototype, { evalFunction, evalTop, evalNested, permute, bubbleSelectors });\n\nexport default AtRule;\n"
  },
  {
    "path": "packages/less/lib/less/tree/attribute.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput } from './node.js' */\nimport Node from './node.js';\n\nclass Attribute extends Node {\n    get type() { return 'Attribute'; }\n\n    /**\n     * @param {string | Node} key\n     * @param {string} op\n     * @param {string | Node} value\n     * @param {string} cif\n     */\n    constructor(key, op, value, cif) {\n        super();\n        this.key = key;\n        this.op = op;\n        this.value = value;\n        this.cif = cif;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Attribute}\n     */\n    eval(context) {\n        return new Attribute(\n            /** @type {Node} */ (this.key).eval ? /** @type {Node} */ (this.key).eval(context) : /** @type {string} */ (this.key),\n            this.op,\n            (this.value && /** @type {Node} */ (this.value).eval) ? /** @type {Node} */ (this.value).eval(context) : this.value,\n            this.cif\n        );\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add(this.toCSS(context));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {string}\n     */\n    toCSS(context) {\n        let value = /** @type {Node} */ (this.key).toCSS ? /** @type {Node} */ (this.key).toCSS(context) : /** @type {string} */ (this.key);\n\n        if (this.op) {\n            value += this.op;\n            value += (/** @type {Node} */ (this.value).toCSS ? /** @type {Node} */ (this.value).toCSS(context) : /** @type {string} */ (this.value));\n        }\n\n        if (this.cif) {\n            value = value + ' ' + this.cif;\n        }\n\n        return `[${value}]`;\n    }\n}\n\nexport default Attribute;\n"
  },
  {
    "path": "packages/less/lib/less/tree/call.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo } from './node.js' */\nimport Node from './node.js';\nimport Anonymous from './anonymous.js';\nimport FunctionCaller from '../functions/function-caller.js';\n\n//\n// A function call node.\n//\nclass Call extends Node {\n    get type() { return 'Call'; }\n\n    /**\n     * @param {string} name\n     * @param {Node[]} args\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     */\n    constructor(name, args, index, currentFileInfo) {\n        super();\n        this.name = name;\n        this.args = args;\n        this.calc = name === 'calc';\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        if (this.args) {\n            this.args = visitor.visitArray(this.args);\n        }\n    }\n\n    //\n    // When evaluating a function call,\n    // we either find the function in the functionRegistry,\n    // in which case we call it, passing the  evaluated arguments,\n    // if this returns null or we cannot find the function, we\n    // simply print it out as it appeared originally [2].\n    //\n    // The reason why we evaluate the arguments, is in the case where\n    // we try to pass a variable to a function, like: `saturate(@color)`.\n    // The function should receive the value, not the variable.\n    //\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        /**\n         * Turn off math for calc(), and switch back on for evaluating nested functions\n         */\n        const currentMathContext = context.mathOn;\n        context.mathOn = !this.calc;\n        if (this.calc || context.inCalc) {\n            context.enterCalc();\n        }\n\n        const exitCalc = () => {\n            if (this.calc || context.inCalc) {\n                context.exitCalc();\n            }\n            context.mathOn = currentMathContext;\n        };\n\n        /** @type {Node | string | boolean | null | undefined} */\n        let result;\n        const funcCaller = new FunctionCaller(this.name, context, this.getIndex(), this.fileInfo());\n\n        if (funcCaller.isValid()) {\n            try {\n                result = funcCaller.call(this.args);\n                exitCalc();\n            } catch (e) {\n                // eslint-disable-next-line no-prototype-builtins\n                if (/** @type {Record<string, unknown>} */ (e).hasOwnProperty('line') && /** @type {Record<string, unknown>} */ (e).hasOwnProperty('column')) {\n                    throw e;\n                }\n                throw {\n                    type: /** @type {Record<string, string>} */ (e).type || 'Runtime',\n                    message: `Error evaluating function \\`${this.name}\\`${/** @type {Error} */ (e).message ? `: ${/** @type {Error} */ (e).message}` : ''}`,\n                    index: this.getIndex(),\n                    filename: this.fileInfo().filename,\n                    line: /** @type {Record<string, number>} */ (e).lineNumber,\n                    column: /** @type {Record<string, number>} */ (e).columnNumber\n                };\n            }\n        }\n\n        if (result !== null && result !== undefined) {\n            // Results that that are not nodes are cast as Anonymous nodes\n            // Falsy values or booleans are returned as empty nodes\n            if (!(result instanceof Node)) {\n                if (!result || result === true) {\n                    result = new Anonymous(null);\n                }\n                else {\n                    result = new Anonymous(result.toString());\n                }\n\n            }\n            result._index = this._index;\n            result._fileInfo = this._fileInfo;\n            return result;\n        }\n\n        const args = this.args.map(a => a.eval(context));\n        exitCalc();\n\n        return new Call(this.name, args, this.getIndex(), this.fileInfo());\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add(`${this.name}(`, this.fileInfo(), this.getIndex());\n\n        for (let i = 0; i < this.args.length; i++) {\n            this.args[i].genCSS(context, output);\n            if (i + 1 < this.args.length) {\n                output.add(', ');\n            }\n        }\n\n        output.add(')');\n    }\n}\n\nexport default Call;\n"
  },
  {
    "path": "packages/less/lib/less/tree/color.js",
    "content": "// @ts-check\nimport Node from './node.js';\nimport colors from '../data/colors.js';\n\n/** @import { EvalContext, CSSOutput } from './node.js' */\n\n//\n// RGB Colors - #ff0014, #eee\n//\nclass Color extends Node {\n    get type() { return 'Color'; }\n\n    /**\n     * @param {number[] | string} rgb\n     * @param {number} [a]\n     * @param {string} [originalForm]\n     */\n    constructor(rgb, a, originalForm) {\n        super();\n        const self = this;\n        //\n        // The end goal here, is to parse the arguments\n        // into an integer triplet, such as `128, 255, 0`\n        //\n        // This facilitates operations and conversions.\n        //\n        if (Array.isArray(rgb)) {\n            /** @type {number[]} */\n            this.rgb = rgb;\n        } else if (rgb.length >= 6) {\n            /** @type {number[]} */\n            this.rgb = [];\n            /** @type {RegExpMatchArray} */ (rgb.match(/.{2}/g)).map(function (c, i) {\n                if (i < 3) {\n                    self.rgb.push(parseInt(c, 16));\n                } else {\n                    self.alpha = (parseInt(c, 16)) / 255;\n                }\n            });\n        } else {\n            /** @type {number[]} */\n            this.rgb = [];\n            rgb.split('').map(function (c, i) {\n                if (i < 3) {\n                    self.rgb.push(parseInt(c + c, 16));\n                } else {\n                    self.alpha = (parseInt(c + c, 16)) / 255;\n                }\n            });\n        }\n        /** @type {number} */\n        if (typeof this.alpha === 'undefined') {\n            this.alpha = (typeof a === 'number') ? a : 1;\n        }\n        if (typeof originalForm !== 'undefined') {\n            this.value = originalForm;\n        }\n    }\n\n    luma() {\n        let r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255;\n\n        r = (r <= 0.03928) ? r / 12.92 : Math.pow(((r + 0.055) / 1.055), 2.4);\n        g = (g <= 0.03928) ? g / 12.92 : Math.pow(((g + 0.055) / 1.055), 2.4);\n        b = (b <= 0.03928) ? b / 12.92 : Math.pow(((b + 0.055) / 1.055), 2.4);\n\n        return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add(this.toCSS(context));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {boolean} [doNotCompress]\n     * @returns {string}\n     */\n    toCSS(context, doNotCompress) {\n        const compress = context && context.compress && !doNotCompress;\n        let color;\n        let alpha;\n        /** @type {string | undefined} */\n        let colorFunction;\n        /** @type {(string | number)[]} */\n        let args = [];\n\n        // `value` is set if this color was originally\n        // converted from a named color string so we need\n        // to respect this and try to output named color too.\n        alpha = this.fround(context, this.alpha);\n\n        if (this.value) {\n            if (/** @type {string} */ (this.value).indexOf('rgb') === 0) {\n                if (alpha < 1) {\n                    colorFunction = 'rgba';\n                }\n            } else if (/** @type {string} */ (this.value).indexOf('hsl') === 0) {\n                if (alpha < 1) {\n                    colorFunction = 'hsla';\n                } else {\n                    colorFunction = 'hsl';\n                }\n            } else {\n                return /** @type {string} */ (this.value);\n            }\n        } else {\n            if (alpha < 1) {\n                colorFunction = 'rgba';\n            }\n        }\n\n        switch (colorFunction) {\n            case 'rgba':\n                args = this.rgb.map(function (c) {\n                    return clamp(Math.round(c), 255);\n                }).concat(clamp(alpha, 1));\n                break;\n            case 'hsla':\n                args.push(clamp(alpha, 1));\n            // eslint-disable-next-line no-fallthrough\n            case 'hsl':\n                color = this.toHSL();\n                args = [\n                    this.fround(context, color.h),\n                    `${this.fround(context, color.s * 100)}%`,\n                    `${this.fround(context, color.l * 100)}%`\n                ].concat(args);\n        }\n\n        if (colorFunction) {\n            // Values are capped between `0` and `255`, rounded and zero-padded.\n            return `${colorFunction}(${args.join(`,${compress ? '' : ' '}`)})`;\n        }\n\n        color = this.toRGB();\n\n        if (compress) {\n            const splitcolor = color.split('');\n\n            // Convert color to short format\n            if (splitcolor[1] === splitcolor[2] && splitcolor[3] === splitcolor[4] && splitcolor[5] === splitcolor[6]) {\n                color = `#${splitcolor[1]}${splitcolor[3]}${splitcolor[5]}`;\n            }\n        }\n\n        return color;\n    }\n\n    //\n    // Operations have to be done per-channel, if not,\n    // channels will spill onto each other. Once we have\n    // our result, in the form of an integer triplet,\n    // we create a new Color node to hold the result.\n    //\n    /**\n     * @param {EvalContext} context\n     * @param {string} op\n     * @param {Color} other\n     */\n    operate(context, op, other) {\n        const rgb = new Array(3);\n        const alpha = this.alpha * (1 - other.alpha) + other.alpha;\n        for (let c = 0; c < 3; c++) {\n            rgb[c] = this._operate(context, op, this.rgb[c], other.rgb[c]);\n        }\n        return new Color(rgb, alpha);\n    }\n\n    toRGB() {\n        return toHex(this.rgb);\n    }\n\n    toHSL() {\n        const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n        const max = Math.max(r, g, b), min = Math.min(r, g, b);\n        /** @type {number} */\n        let h;\n        let s;\n        const l = (max + min) / 2;\n        const d = max - min;\n\n        if (max === min) {\n            h = s = 0;\n        } else {\n            s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n            switch (max) {\n                case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n                case g: h = (b - r) / d + 2;               break;\n                case b: h = (r - g) / d + 4;               break;\n            }\n            /** @type {number} */ (h) /= 6;\n        }\n        return { h: /** @type {number} */ (h) * 360, s, l, a };\n    }\n\n    // Adapted from http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript\n    toHSV() {\n        const r = this.rgb[0] / 255, g = this.rgb[1] / 255, b = this.rgb[2] / 255, a = this.alpha;\n\n        const max = Math.max(r, g, b), min = Math.min(r, g, b);\n        /** @type {number} */\n        let h;\n        let s;\n        const v = max;\n\n        const d = max - min;\n        if (max === 0) {\n            s = 0;\n        } else {\n            s = d / max;\n        }\n\n        if (max === min) {\n            h = 0;\n        } else {\n            switch (max) {\n                case r: h = (g - b) / d + (g < b ? 6 : 0); break;\n                case g: h = (b - r) / d + 2; break;\n                case b: h = (r - g) / d + 4; break;\n            }\n            /** @type {number} */ (h) /= 6;\n        }\n        return { h: /** @type {number} */ (h) * 360, s, v, a };\n    }\n\n    toARGB() {\n        return toHex([this.alpha * 255].concat(this.rgb));\n    }\n\n    /**\n     * @param {Node & { rgb?: number[], alpha?: number }} x\n     * @returns {0 | undefined}\n     */\n    compare(x) {\n        return (x.rgb &&\n            x.rgb[0] === this.rgb[0] &&\n            x.rgb[1] === this.rgb[1] &&\n            x.rgb[2] === this.rgb[2] &&\n            x.alpha  === this.alpha) ? 0 : undefined;\n    }\n\n    /** @param {string} keyword */\n    static fromKeyword(keyword) {\n        /** @type {Color | undefined} */\n        let c;\n        const key = keyword.toLowerCase();\n        // eslint-disable-next-line no-prototype-builtins\n        if (colors.hasOwnProperty(key)) {\n            c = new Color(/** @type {string} */ (colors[/** @type {keyof typeof colors} */ (key)]).slice(1));\n        }\n        else if (key === 'transparent') {\n            c = new Color([0, 0, 0], 0);\n        }\n\n        if (c) {\n            c.value = keyword;\n            return c;\n        }\n    }\n}\n\n/**\n * @param {number} v\n * @param {number} max\n */\nfunction clamp(v, max) {\n    return Math.min(Math.max(v, 0), max);\n}\n\n/** @param {number[]} v */\nfunction toHex(v) {\n    return `#${v.map(function (c) {\n        c = clamp(Math.round(c), 255);\n        return (c < 16 ? '0' : '') + c.toString(16);\n    }).join('')}`;\n}\n\nexport default Color;\n"
  },
  {
    "path": "packages/less/lib/less/tree/combinator.js",
    "content": "// @ts-check\nimport Node from './node.js';\n\n/** @import { EvalContext, CSSOutput } from './node.js' */\n\n/** @type {Record<string, boolean>} */\nconst _noSpaceCombinators = {\n    '': true,\n    ' ': true,\n    '|': true\n};\n\nclass Combinator extends Node {\n    get type() { return 'Combinator'; }\n\n    /** @param {string} value */\n    constructor(value) {\n        super();\n        if (value === ' ') {\n            this.value = ' ';\n            this.emptyOrWhitespace = true;\n        } else {\n            this.value = value ? value.trim() : '';\n            this.emptyOrWhitespace = this.value === '';\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        const spaceOrEmpty = (context.compress || _noSpaceCombinators[/** @type {string} */ (this.value)]) ? '' : ' ';\n        output.add(spaceOrEmpty + this.value + spaceOrEmpty);\n    }\n}\n\nexport default Combinator;\n"
  },
  {
    "path": "packages/less/lib/less/tree/comment.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, FileInfo } from './node.js' */\n/** @import { DebugInfoContext } from './debug-info.js' */\nimport Node from './node.js';\nimport getDebugInfo from './debug-info.js';\n\nclass Comment extends Node {\n    get type() { return 'Comment'; }\n\n    /**\n     * @param {string} value\n     * @param {boolean} isLineComment\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     */\n    constructor(value, isLineComment, index, currentFileInfo) {\n        super();\n        this.value = value;\n        this.isLineComment = isLineComment;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        this.allowRoot = true;\n        /** @type {{ lineNumber: number, fileName: string } | undefined} */\n        this.debugInfo = undefined;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        if (this.debugInfo) {\n            output.add(getDebugInfo(context, /** @type {DebugInfoContext} */ (this)), this.fileInfo(), this.getIndex());\n        }\n        output.add(/** @type {string} */ (this.value));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {boolean}\n     */\n    isSilent(context) {\n        const isCompressed = context.compress && /** @type {string} */ (this.value)[2] !== '!';\n        return this.isLineComment || isCompressed;\n    }\n}\n\nexport default Comment;\n"
  },
  {
    "path": "packages/less/lib/less/tree/condition.js",
    "content": "// @ts-check\n/** @import { EvalContext, TreeVisitor } from './node.js' */\nimport Node from './node.js';\n\nclass Condition extends Node {\n    get type() { return 'Condition'; }\n\n    /**\n     * @param {string} op\n     * @param {Node} l\n     * @param {Node} r\n     * @param {number} i\n     * @param {boolean} negate\n     */\n    constructor(op, l, r, i, negate) {\n        super();\n        this.op = op.trim();\n        this.lvalue = l;\n        this.rvalue = r;\n        this._index = i;\n        this.negate = negate;\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.lvalue = visitor.visit(this.lvalue);\n        this.rvalue = visitor.visit(this.rvalue);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {boolean}\n     * @suppress {checkTypes}\n     */\n    // @ts-ignore - Condition.eval returns boolean, not Node (used as guard condition)\n    eval(context) {\n        const a = this.lvalue.eval(context);\n        const b = this.rvalue.eval(context);\n        /** @type {boolean} */\n        let result;\n\n        switch (this.op) {\n            case 'and': result = Boolean(a && b); break;\n            case 'or':  result = Boolean(a || b); break;\n            default:\n                switch (Node.compare(a, b)) {\n                    case -1:\n                        result = this.op === '<' || this.op === '=<' || this.op === '<=';\n                        break;\n                    case 0:\n                        result = this.op === '=' || this.op === '>=' || this.op === '=<' || this.op === '<=';\n                        break;\n                    case 1:\n                        result = this.op === '>' || this.op === '>=';\n                        break;\n                    default:\n                        result = false;\n                }\n        }\n\n        return this.negate ? !result : result;\n    }\n}\n\nexport default Condition;\n"
  },
  {
    "path": "packages/less/lib/less/tree/container.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, FileInfo, VisibilityInfo } from './node.js' */\n/** @import { FunctionRegistry, NestableAtRuleThis } from './nested-at-rule.js' */\nimport Node from './node.js';\nimport Ruleset from './ruleset.js';\nimport Value from './value.js';\nimport Selector from './selector.js';\nimport AtRule from './atrule.js';\nimport NestableAtRulePrototype from './nested-at-rule.js';\n\n/**\n * @typedef {Ruleset & {\n *   allowImports?: boolean,\n *   debugInfo?: { lineNumber: number, fileName: string },\n *   functionRegistry?: FunctionRegistry\n * }} RulesetWithExtras\n */\n\nclass Container extends AtRule {\n    get type() { return 'Container'; }\n\n    /**\n     * @param {Node[] | null} value\n     * @param {Node[]} features\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     * @param {VisibilityInfo} visibilityInfo\n     */\n    constructor(value, features, index, currentFileInfo, visibilityInfo) {\n        super();\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n\n        const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n        /** @type {Value} */\n        this.features = new Value(features);\n        /** @type {RulesetWithExtras[]} */\n        this.rules = [new Ruleset(selectors, value)];\n        this.rules[0].allowImports = true;\n        this.copyVisibilityInfo(visibilityInfo);\n        this.allowRoot = true;\n        this.setParent(selectors, /** @type {Node} */ (/** @type {unknown} */ (this)));\n        this.setParent(this.features, /** @type {Node} */ (/** @type {unknown} */ (this)));\n        this.setParent(this.rules, /** @type {Node} */ (/** @type {unknown} */ (this)));\n\n        /** @type {boolean | undefined} */\n        this._evaluated = undefined;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add('@container ', this._fileInfo, this._index);\n        this.features.genCSS(context, output);\n        this.outputRuleset(context, output, this.rules);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        if (this._evaluated) {\n            return /** @type {Node} */ (/** @type {unknown} */ (this));\n        }\n        if (!context.mediaBlocks) {\n            context.mediaBlocks = [];\n            context.mediaPath = [];\n        }\n\n        const media = new Container(null, [], this._index, this._fileInfo, this.visibilityInfo());\n        media._evaluated = true;\n        if (this.debugInfo) {\n            this.rules[0].debugInfo = this.debugInfo;\n            media.debugInfo = this.debugInfo;\n        }\n\n        media.features = /** @type {Value} */ (this.features.eval(context));\n\n        context.mediaPath.push(/** @type {Node} */ (/** @type {unknown} */ (media)));\n        context.mediaBlocks.push(/** @type {Node} */ (/** @type {unknown} */ (media)));\n\n        const fr = /** @type {RulesetWithExtras} */ (context.frames[0]).functionRegistry;\n        if (fr) {\n            this.rules[0].functionRegistry = fr.inherit();\n        }\n        context.frames.unshift(this.rules[0]);\n        media.rules = [/** @type {RulesetWithExtras} */ (this.rules[0].eval(context))];\n        context.frames.shift();\n\n        context.mediaPath.pop();\n\n        return context.mediaPath.length === 0 ? /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (media)).evalTop(context) :\n            /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (media)).evalNested(context);\n    }\n}\n\n// Apply NestableAtRulePrototype methods (accept, isRulesetLike override AtRule's versions)\nObject.assign(Container.prototype, NestableAtRulePrototype);\n\nexport default Container;\n"
  },
  {
    "path": "packages/less/lib/less/tree/debug-info.js",
    "content": "// @ts-check\n\n/**\n * @typedef {object} DebugInfoData\n * @property {number} lineNumber\n * @property {string} fileName\n */\n\n/**\n * @typedef {object} DebugInfoContext\n * @property {DebugInfoData} debugInfo\n */\n\n/**\n * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.\n * This will be removed in a future version.\n *\n * @param {DebugInfoContext} ctx - Context object with debugInfo\n * @returns {string} Debug info as CSS comment\n */\nfunction asComment(ctx) {\n    return `/* line ${ctx.debugInfo.lineNumber}, ${ctx.debugInfo.fileName} */\\n`;\n}\n\n/**\n * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.\n * This function generates Sass-compatible debug info using @media -sass-debug-info syntax.\n * This format had short-lived usage and is no longer recommended.\n * This will be removed in a future version.\n *\n * @param {DebugInfoContext} ctx - Context object with debugInfo\n * @returns {string} Sass-compatible debug info as @media query\n */\nfunction asMediaQuery(ctx) {\n    let filenameWithProtocol = ctx.debugInfo.fileName;\n    if (!/^[a-z]+:\\/\\//i.test(filenameWithProtocol)) {\n        filenameWithProtocol = `file://${filenameWithProtocol}`;\n    }\n    return `@media -sass-debug-info{filename{font-family:${filenameWithProtocol.replace(/([.:/\\\\])/g, function (a) {\n        if (a == '\\\\') {\n            a = '/';\n        }\n        return `\\\\${a}`;\n    })}}line{font-family:\\\\00003${ctx.debugInfo.lineNumber}}}\\n`;\n}\n\n/**\n * Generates debug information (line numbers) for CSS output.\n *\n * @param {{ dumpLineNumbers?: string, compress?: boolean }} context - Context object with dumpLineNumbers option\n * @param {DebugInfoContext} ctx - Context object with debugInfo\n * @param {string} [lineSeparator] - Separator between comment and media query (for 'all' mode)\n * @returns {string} Debug info string\n *\n * @deprecated The dumpLineNumbers option is deprecated. Use sourcemaps instead.\n * All modes ('comments', 'mediaquery', 'all') are deprecated and will be removed in a future version.\n * The 'mediaquery' and 'all' modes generate Sass-compatible @media -sass-debug-info output\n * which had short-lived usage and is no longer recommended.\n */\nfunction debugInfo(context, ctx, lineSeparator) {\n    let result = '';\n    if (context.dumpLineNumbers && !context.compress) {\n        switch (context.dumpLineNumbers) {\n            case 'comments':\n                result = asComment(ctx);\n                break;\n            case 'mediaquery':\n                result = asMediaQuery(ctx);\n                break;\n            case 'all':\n                result = asComment(ctx) + (lineSeparator || '') + asMediaQuery(ctx);\n                break;\n        }\n    }\n    return result;\n}\n\nexport default debugInfo;\n"
  },
  {
    "path": "packages/less/lib/less/tree/declaration.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, FileInfo } from './node.js' */\nimport Node from './node.js';\nimport Value from './value.js';\nimport Keyword from './keyword.js';\nimport Anonymous from './anonymous.js';\nimport * as Constants from '../constants.js';\nconst MATH = Constants.Math;\n\n/**\n * @param {EvalContext} context\n * @param {Node[]} name\n * @returns {string}\n */\nfunction evalName(context, name) {\n    let value = '';\n    let i;\n    const n = name.length;\n    /** @type {CSSOutput} */\n    const output = {add: function (s) {value += s;}, isEmpty: function() { return value === ''; }};\n    for (i = 0; i < n; i++) {\n        name[i].eval(context).genCSS(context, output);\n    }\n    return value;\n}\n\nclass Declaration extends Node {\n    get type() { return 'Declaration'; }\n\n    /**\n     * @param {string | Node[]} name\n     * @param {Node | string | null} value\n     * @param {string} [important]\n     * @param {string} [merge]\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     * @param {boolean} [inline]\n     * @param {boolean} [variable]\n     */\n    constructor(name, value, important, merge, index, currentFileInfo, inline, variable) {\n        super();\n        this.name = name;\n        this.value = (value instanceof Node) ? value : new Value([value ? new Anonymous(value) : null]);\n        this.important = important ? ` ${important.trim()}` : '';\n        /** @type {string | undefined} */\n        this.merge = merge;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {boolean} */\n        this.inline = inline || false;\n        /** @type {boolean} */\n        this.variable = (variable !== undefined) ? variable\n            : (typeof name === 'string' && name.charAt(0) === '@');\n        /** @type {boolean} */\n        this.allowRoot = true;\n        this.setParent(this.value, this);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add(/** @type {string} */ (this.name) + (context.compress ? ':' : ': '), this.fileInfo(), this.getIndex());\n        try {\n            /** @type {Node} */ (this.value).genCSS(context, output);\n        }\n        catch (e) {\n            const err = /** @type {{ index?: number, filename?: string }} */ (e);\n            err.index = this._index;\n            err.filename = this._fileInfo && this._fileInfo.filename;\n            throw e;\n        }\n        output.add(this.important + ((this.inline || (context.lastRule && context.compress)) ? '' : ';'), this._fileInfo, this._index);\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        let mathBypass = false, prevMath, name = this.name, evaldValue, variable = this.variable;\n        if (typeof name !== 'string') {\n            // expand 'primitive' name directly to get\n            // things faster (~10% for benchmark.less):\n            name = (/** @type {Node[]} */ (name).length === 1) && (/** @type {Node[]} */ (name)[0] instanceof Keyword) ?\n                /** @type {string} */ (/** @type {Node[]} */ (name)[0].value) : evalName(context, /** @type {Node[]} */ (name));\n            variable = false; // never treat expanded interpolation as new variable name\n        }\n\n        // @todo remove when parens-division is default\n        if (name === 'font' && context.math === MATH.ALWAYS) {\n            mathBypass = true;\n            prevMath = context.math;\n            context.math = MATH.PARENS_DIVISION;\n        }\n        try {\n            context.importantScope.push({});\n            evaldValue = /** @type {Node} */ (this.value).eval(context);\n\n            if (!this.variable && evaldValue.type === 'DetachedRuleset') {\n                throw { message: 'Rulesets cannot be evaluated on a property.',\n                    index: this.getIndex(), filename: this.fileInfo().filename };\n            }\n            let important = this.important;\n            const importantResult = context.importantScope.pop();\n            if (!important && importantResult && importantResult.important) {\n                important = importantResult.important;\n            }\n\n            return new Declaration(/** @type {string} */ (name),\n                evaldValue,\n                important,\n                this.merge,\n                this.getIndex(), this.fileInfo(), this.inline,\n                variable);\n        }\n        catch (e) {\n            const err = /** @type {{ index?: number, filename?: string }} */ (e);\n            if (typeof err.index !== 'number') {\n                err.index = this.getIndex();\n                err.filename = this.fileInfo().filename;\n            }\n            throw e;\n        }\n        finally {\n            if (mathBypass) {\n                context.math = prevMath;\n            }\n        }\n    }\n\n    makeImportant() {\n        return new Declaration(this.name,\n            /** @type {Node} */ (this.value),\n            '!important',\n            this.merge,\n            this.getIndex(), this.fileInfo(), this.inline);\n    }\n}\n\nexport default Declaration;\n"
  },
  {
    "path": "packages/less/lib/less/tree/detached-ruleset.js",
    "content": "// @ts-check\n/** @import { EvalContext, TreeVisitor } from './node.js' */\nimport Node from './node.js';\nimport contexts from '../contexts.js';\nimport * as utils from '../utils.js';\n\nclass DetachedRuleset extends Node {\n    get type() { return 'DetachedRuleset'; }\n\n    /**\n     * @param {Node} ruleset\n     * @param {Node[]} [frames]\n     */\n    constructor(ruleset, frames) {\n        super();\n        this.ruleset = ruleset;\n        this.frames = frames;\n        this.evalFirst = true;\n        this.setParent(this.ruleset, this);\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.ruleset = visitor.visit(this.ruleset);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {DetachedRuleset}\n     */\n    eval(context) {\n        const frames = this.frames || utils.copyArray(context.frames);\n        return new DetachedRuleset(this.ruleset, frames);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    callEval(context) {\n        return this.ruleset.eval(this.frames ? new contexts.Eval(context, this.frames.concat(context.frames)) : context);\n    }\n}\n\nexport default DetachedRuleset;\n"
  },
  {
    "path": "packages/less/lib/less/tree/dimension.js",
    "content": "// @ts-check\n/* eslint-disable no-prototype-builtins */\nimport Node from './node.js';\nimport unitConversions from '../data/unit-conversions.js';\nimport Unit from './unit.js';\nimport Color from './color.js';\n\n/** @import { EvalContext, CSSOutput } from './node.js' */\n\n//\n// A number with a unit\n//\nclass Dimension extends Node {\n    get type() { return 'Dimension'; }\n\n    /**\n     * @param {number | string} value\n     * @param {Unit | string} [unit]\n     */\n    constructor(value, unit) {\n        super();\n        /** @type {number} */\n        this.value = parseFloat(/** @type {string} */ (value));\n        if (isNaN(this.value)) {\n            throw new Error('Dimension is not a number.');\n        }\n        /** @type {Unit} */\n        this.unit = (unit && unit instanceof Unit) ? unit :\n            new Unit(unit ? [/** @type {string} */ (unit)] : undefined);\n        this.setParent(this.unit, this);\n    }\n\n    /**\n     * @param {import('./node.js').TreeVisitor} visitor\n     */\n    accept(visitor) {\n        this.unit = /** @type {Unit} */ (visitor.visit(this.unit));\n    }\n\n    // remove when Nodes have JSDoc types\n    // eslint-disable-next-line no-unused-vars\n    /** @param {EvalContext} context */\n    eval(context) {\n        return this;\n    }\n\n    toColor() {\n        const v = /** @type {number} */ (this.value);\n        return new Color([v, v, v]);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        if ((context && context.strictUnits) && !this.unit.isSingular()) {\n            throw new Error(`Multiple units in dimension. Correct the units or use the unit function. Bad unit: ${this.unit.toString()}`);\n        }\n\n        const value = this.fround(context, /** @type {number} */ (this.value));\n        let strValue = String(value);\n\n        if (value !== 0 && value < 0.000001 && value > -0.000001) {\n            // would be output 1e-6 etc.\n            strValue = value.toFixed(20).replace(/0+$/, '');\n        }\n\n        if (context && context.compress) {\n            // Zero values doesn't need a unit\n            if (value === 0 && this.unit.isLength()) {\n                output.add(strValue);\n                return;\n            }\n\n            // Float values doesn't need a leading zero\n            if (value > 0 && value < 1) {\n                strValue = (strValue).slice(1);\n            }\n        }\n\n        output.add(strValue);\n        this.unit.genCSS(context, output);\n    }\n\n    // In an operation between two Dimensions,\n    // we default to the first Dimension's unit,\n    // so `1px + 2` will yield `3px`.\n    /**\n     * @param {EvalContext} context\n     * @param {string} op\n     * @param {Dimension} other\n     */\n    operate(context, op, other) {\n        /* jshint noempty:false */\n        let value = this._operate(context, op, /** @type {number} */ (this.value), /** @type {number} */ (other.value));\n        let unit = this.unit.clone();\n\n        if (op === '+' || op === '-') {\n            if (unit.numerator.length === 0 && unit.denominator.length === 0) {\n                unit = other.unit.clone();\n                if (this.unit.backupUnit) {\n                    unit.backupUnit = this.unit.backupUnit;\n                }\n            } else if (other.unit.numerator.length === 0 && unit.denominator.length === 0) {\n                // do nothing\n            } else {\n                other = other.convertTo(this.unit.usedUnits());\n\n                if (context.strictUnits && other.unit.toString() !== unit.toString()) {\n                    throw new Error('Incompatible units. Change the units or use the unit function. '\n                        + `Bad units: '${unit.toString()}' and '${other.unit.toString()}'.`);\n                }\n\n                value = this._operate(context, op, /** @type {number} */ (this.value), /** @type {number} */ (other.value));\n            }\n        } else if (op === '*') {\n            unit.numerator = unit.numerator.concat(other.unit.numerator).sort();\n            unit.denominator = unit.denominator.concat(other.unit.denominator).sort();\n            unit.cancel();\n        } else if (op === '/') {\n            unit.numerator = unit.numerator.concat(other.unit.denominator).sort();\n            unit.denominator = unit.denominator.concat(other.unit.numerator).sort();\n            unit.cancel();\n        }\n        return new Dimension(/** @type {number} */ (value), unit);\n    }\n\n    /**\n     * @param {Node} other\n     * @returns {number | undefined}\n     */\n    compare(other) {\n        let a, b;\n\n        if (!(other instanceof Dimension)) {\n            return undefined;\n        }\n\n        if (this.unit.isEmpty() || other.unit.isEmpty()) {\n            a = this;\n            b = other;\n        } else {\n            a = this.unify();\n            b = other.unify();\n            if (a.unit.compare(b.unit) !== 0) {\n                return undefined;\n            }\n        }\n\n        return Node.numericCompare(/** @type {number} */ (a.value), /** @type {number} */ (b.value));\n    }\n\n    unify() {\n        return this.convertTo({ length: 'px', duration: 's', angle: 'rad' });\n    }\n\n    /**\n     * @param {string | { [groupName: string]: string }} conversions\n     * @returns {Dimension}\n     */\n    convertTo(conversions) {\n        let value = /** @type {number} */ (this.value);\n        const unit = this.unit.clone();\n        let i;\n        /** @type {string} */\n        let groupName;\n        /** @type {{ [unitName: string]: number }} */\n        let group;\n        /** @type {string} */\n        let targetUnit;\n        /** @type {{ [groupName: string]: string }} */\n        let derivedConversions = {};\n        /** @type {(atomicUnit: string, denominator: boolean) => string} */\n        let applyUnit;\n\n        if (typeof conversions === 'string') {\n            for (i in unitConversions) {\n                if (unitConversions[/** @type {keyof typeof unitConversions} */ (i)].hasOwnProperty(conversions)) {\n                    derivedConversions = {};\n                    derivedConversions[i] = conversions;\n                }\n            }\n            conversions = derivedConversions;\n        }\n        applyUnit = function (atomicUnit, denominator) {\n            if (group.hasOwnProperty(atomicUnit)) {\n                if (denominator) {\n                    value = value / (group[atomicUnit] / group[targetUnit]);\n                } else {\n                    value = value * (group[atomicUnit] / group[targetUnit]);\n                }\n\n                return targetUnit;\n            }\n\n            return atomicUnit;\n        };\n\n        for (groupName in conversions) {\n            if (conversions.hasOwnProperty(groupName)) {\n                targetUnit = conversions[groupName];\n                group = /** @type {{ [unitName: string]: number }} */ (unitConversions[/** @type {keyof typeof unitConversions} */ (groupName)]);\n\n                unit.map(applyUnit);\n            }\n        }\n\n        unit.cancel();\n\n        return new Dimension(value, unit);\n    }\n}\n\nexport default Dimension;\n"
  },
  {
    "path": "packages/less/lib/less/tree/element.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo, VisibilityInfo } from './node.js' */\nimport Node from './node.js';\nimport Paren from './paren.js';\nimport Combinator from './combinator.js';\n\nclass Element extends Node {\n    get type() { return 'Element'; }\n\n    /**\n     * @param {Combinator | string} combinator\n     * @param {string | Node} value\n     * @param {boolean} [isVariable]\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(combinator, value, isVariable, index, currentFileInfo, visibilityInfo) {\n        super();\n        this.combinator = combinator instanceof Combinator ?\n            combinator : new Combinator(combinator);\n\n        if (typeof value === 'string') {\n            this.value = value.trim();\n        } else if (value) {\n            this.value = value;\n        } else {\n            this.value = '';\n        }\n        /** @type {boolean | undefined} */\n        this.isVariable = isVariable;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        this.copyVisibilityInfo(visibilityInfo);\n        this.setParent(this.combinator, this);\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        const value = this.value;\n        this.combinator = /** @type {Combinator} */ (visitor.visit(this.combinator));\n        if (typeof value === 'object') {\n            this.value = visitor.visit(/** @type {Node} */ (value));\n        }\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        return new Element(this.combinator,\n            /** @type {Node} */ (this.value).eval ? /** @type {Node} */ (this.value).eval(context) : /** @type {string} */ (this.value),\n            this.isVariable,\n            this.getIndex(),\n            this.fileInfo(), this.visibilityInfo());\n    }\n\n    clone() {\n        return new Element(this.combinator,\n            /** @type {string | Node} */ (this.value),\n            this.isVariable,\n            this.getIndex(),\n            this.fileInfo(), this.visibilityInfo());\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add(this.toCSS(context), this.fileInfo(), this.getIndex());\n    }\n\n    /** @param {EvalContext} [context] */\n    toCSS(context) {\n        /** @type {EvalContext & { firstSelector?: boolean }} */\n        const ctx = context || {};\n        let value = this.value;\n        const firstSelector = ctx.firstSelector;\n        if (value instanceof Paren) {\n            // selector in parens should not be affected by outer selector\n            // flags (breaks only interpolated selectors - see #1973)\n            ctx.firstSelector = true;\n        }\n        value = /** @type {Node} */ (value).toCSS ? /** @type {Node} */ (value).toCSS(ctx) : /** @type {string} */ (value);\n        ctx.firstSelector = firstSelector;\n        if (value === '' && this.combinator.value.charAt(0) === '&') {\n            return '';\n        } else {\n            return this.combinator.toCSS(ctx) + value;\n        }\n    }\n}\n\nexport default Element;\n"
  },
  {
    "path": "packages/less/lib/less/tree/expression.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor } from './node.js' */\nimport Node from './node.js';\nimport Paren from './paren.js';\nimport Comment from './comment.js';\nimport Dimension from './dimension.js';\nimport Anonymous from './anonymous.js';\n\nclass Expression extends Node {\n    get type() { return 'Expression'; }\n\n    /**\n     * @param {Node[]} value\n     * @param {boolean} [noSpacing]\n     */\n    constructor(value, noSpacing) {\n        super();\n        this.value = value;\n        /** @type {boolean | undefined} */\n        this.noSpacing = noSpacing;\n        /** @type {boolean | undefined} */\n        this.parens = undefined;\n        /** @type {boolean | undefined} */\n        this.parensInOp = undefined;\n        if (!value) {\n            throw new Error('Expression requires an array parameter');\n        }\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.value = visitor.visitArray(/** @type {Node[]} */ (this.value));\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        const noSpacing = this.noSpacing;\n        /** @type {Node | Expression} */\n        let returnValue;\n        const mathOn = context.isMathOn();\n        const inParenthesis = this.parens;\n\n        let doubleParen = false;\n        if (inParenthesis) {\n            context.inParenthesis();\n        }\n        const value = /** @type {Node[]} */ (this.value);\n        if (value.length > 1) {\n            returnValue = new Expression(value.map(function (e) {\n                if (!e.eval) {\n                    return e;\n                }\n                return e.eval(context);\n            }), this.noSpacing);\n        } else if (value.length === 1) {\n            const first = /** @type {Expression} */ (value[0]);\n            if (first.parens && !first.parensInOp && !context.inCalc) {\n                doubleParen = true;\n            }\n            returnValue = value[0].eval(context);\n        } else {\n            returnValue = this;\n        }\n        if (inParenthesis) {\n            context.outOfParenthesis();\n        }\n        if (this.parens && this.parensInOp && !mathOn && !doubleParen\n            && (!(returnValue instanceof Dimension))) {\n            returnValue = new Paren(returnValue);\n        }\n        /** @type {Expression} */ (returnValue).noSpacing =\n            /** @type {Expression} */ (returnValue).noSpacing || noSpacing;\n        return returnValue;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        const value = /** @type {Node[]} */ (this.value);\n        for (let i = 0; i < value.length; i++) {\n            value[i].genCSS(context, output);\n            if (!this.noSpacing && i + 1 < value.length) {\n                if (!(value[i + 1] instanceof Anonymous) ||\n                    value[i + 1] instanceof Anonymous && /** @type {string} */ (value[i + 1].value) !== ',') {\n                    output.add(' ');\n                }\n            }\n        }\n    }\n\n    throwAwayComments() {\n        this.value = /** @type {Node[]} */ (this.value).filter(function(v) {\n            return !(v instanceof Comment);\n        });\n    }\n}\n\nexport default Expression;\n"
  },
  {
    "path": "packages/less/lib/less/tree/extend.js",
    "content": "// @ts-check\n/** @import { EvalContext, TreeVisitor, FileInfo, VisibilityInfo } from './node.js' */\nimport Node from './node.js';\nimport Selector from './selector.js';\n\nclass Extend extends Node {\n    get type() { return 'Extend'; }\n\n    /**\n     * @param {Selector} selector\n     * @param {string} option\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(selector, option, index, currentFileInfo, visibilityInfo) {\n        super();\n        this.selector = selector;\n        this.option = option;\n        this.object_id = Extend.next_id++;\n        /** @type {number[]} */\n        this.parent_ids = [this.object_id];\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        this.copyVisibilityInfo(visibilityInfo);\n        /** @type {boolean} */\n        this.allowRoot = true;\n        /** @type {boolean} */\n        this.allowBefore = false;\n        /** @type {boolean} */\n        this.allowAfter = false;\n\n        switch (option) {\n            case '!all':\n            case 'all':\n                this.allowBefore = true;\n                this.allowAfter = true;\n                break;\n            default:\n                this.allowBefore = false;\n                this.allowAfter = false;\n                break;\n        }\n        this.setParent(this.selector, this);\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.selector = /** @type {Selector} */ (visitor.visit(this.selector));\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        return new Extend(/** @type {Selector} */ (this.selector.eval(context)), this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n    }\n\n    // remove when Nodes have JSDoc types\n    // eslint-disable-next-line no-unused-vars\n    /** @param {EvalContext} [context] */\n    clone(context) {\n        return new Extend(this.selector, this.option, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n    }\n\n    // it concatenates (joins) all selectors in selector array\n    /** @param {Selector[]} selectors */\n    findSelfSelectors(selectors) {\n        /** @type {import('./element.js').default[]} */\n        let selfElements = [];\n        let i, selectorElements;\n\n        for (i = 0; i < selectors.length; i++) {\n            selectorElements = selectors[i].elements;\n            // duplicate the logic in genCSS function inside the selector node.\n            // future TODO - move both logics into the selector joiner visitor\n            if (i > 0 && selectorElements.length && selectorElements[0].combinator.value === '') {\n                selectorElements[0].combinator.value = ' ';\n            }\n            selfElements = selfElements.concat(selectors[i].elements);\n        }\n\n        /** @type {Selector[]} */\n        this.selfSelectors = [new Selector(selfElements)];\n        this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo());\n    }\n}\n\nExtend.next_id = 0;\nexport default Extend;\n"
  },
  {
    "path": "packages/less/lib/less/tree/import.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo, VisibilityInfo } from './node.js' */\nimport Node from './node.js';\nimport Media from './media.js';\nimport URL from './url.js';\nimport Quoted from './quoted.js';\nimport Ruleset from './ruleset.js';\nimport Anonymous from './anonymous.js';\nimport Expression from './expression.js';\nimport * as utils from '../utils.js';\nimport LessError from '../less-error.js';\n\n/**\n * @typedef {object} ImportOptions\n * @property {boolean} [less]\n * @property {boolean} [inline]\n * @property {boolean} [isPlugin]\n * @property {boolean} [reference]\n */\n\n//\n// CSS @import node\n//\n// The general strategy here is that we don't want to wait\n// for the parsing to be completed, before we start importing\n// the file. That's because in the context of a browser,\n// most of the time will be spent waiting for the server to respond.\n//\n// On creation, we push the import path to our import queue, though\n// `import,push`, we also pass it a callback, which it'll call once\n// the file has been fetched, and parsed.\n//\nclass Import extends Node {\n    get type() { return 'Import'; }\n\n    /**\n     * @param {Node} path\n     * @param {Node | null} features\n     * @param {ImportOptions} options\n     * @param {number} index\n     * @param {FileInfo} [currentFileInfo]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(path, features, options, index, currentFileInfo, visibilityInfo) {\n        super();\n        /** @type {ImportOptions} */\n        this.options = options;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        this.path = path;\n        /** @type {Node | null} */\n        this.features = features;\n        /** @type {boolean} */\n        this.allowRoot = true;\n\n        /** @type {boolean | undefined} */\n        this.css = undefined;\n        /** @type {boolean | undefined} */\n        this.layerCss = undefined;\n        /** @type {(Ruleset & { imports?: object, filename?: string, functions?: object, functionRegistry?: { addMultiple: (fns: object) => void } }) | undefined} */\n        this.root = undefined;\n        /** @type {string | undefined} */\n        this.importedFilename = undefined;\n        /** @type {boolean | (() => boolean) | undefined} */\n        this.skip = undefined;\n        /** @type {{ message: string, index: number, filename: string } | undefined} */\n        this.error = undefined;\n\n        if (this.options.less !== undefined || this.options.inline) {\n            this.css = !this.options.less || this.options.inline;\n        } else {\n            const pathValue = this.getPath();\n            if (pathValue && /[#.&?]css([?;].*)?$/.test(pathValue)) {\n                this.css = true;\n            }\n        }\n        this.copyVisibilityInfo(visibilityInfo);\n        if (this.features) {\n            this.setParent(this.features, /** @type {Node} */ (this));\n        }\n        this.setParent(this.path, /** @type {Node} */ (this));\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        if (this.features) {\n            this.features = visitor.visit(this.features);\n        }\n        this.path = visitor.visit(this.path);\n        if (!this.options.isPlugin && !this.options.inline && this.root) {\n            this.root = /** @type {Ruleset} */ (visitor.visit(this.root));\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        if (this.css && this.path._fileInfo.reference === undefined) {\n            output.add('@import ', this._fileInfo, this._index);\n            this.path.genCSS(context, output);\n            if (this.features) {\n                output.add(' ');\n                this.features.genCSS(context, output);\n            }\n            output.add(';');\n        }\n    }\n\n    /** @returns {string | undefined} */\n    getPath() {\n        return (this.path instanceof URL) ?\n            /** @type {string} */ (/** @type {Node} */ (this.path.value).value) :\n            /** @type {string | undefined} */ (this.path.value);\n    }\n\n    /** @returns {boolean | RegExpMatchArray | null} */\n    isVariableImport() {\n        let path = this.path;\n        if (path instanceof URL) {\n            path = /** @type {Node} */ (path.value);\n        }\n        if (path instanceof Quoted) {\n            return path.containsVariables();\n        }\n\n        return true;\n    }\n\n    /** @param {EvalContext} context */\n    evalForImport(context) {\n        let path = this.path;\n\n        if (path instanceof URL) {\n            path = /** @type {Node} */ (path.value);\n        }\n\n        return new Import(path.eval(context), this.features, this.options, this._index || 0, this._fileInfo, this.visibilityInfo());\n    }\n\n    /** @param {EvalContext} context */\n    evalPath(context) {\n        const path = this.path.eval(context);\n        const fileInfo = this._fileInfo;\n\n        if (!(path instanceof URL)) {\n            // Add the rootpath if the URL requires a rewrite\n            const pathValue = /** @type {string} */ (path.value);\n            if (fileInfo &&\n                pathValue &&\n                context.pathRequiresRewrite(pathValue)) {\n                path.value = context.rewritePath(pathValue, fileInfo.rootpath);\n            } else {\n                path.value = context.normalizePath(/** @type {string} */ (path.value));\n            }\n        }\n\n        return path;\n    }\n\n    /** @param {EvalContext} context */\n    // @ts-ignore - Import.eval returns Node | Node[] | Import (wider than Node.eval's Node return)\n    eval(context) {\n        const result = this.doEval(context);\n        if (this.options.reference || this.blocksVisibility()) {\n            if (Array.isArray(result)) {\n                result.forEach(function (node) {\n                    node.addVisibilityBlock();\n                });\n            } else {\n                /** @type {Node} */ (result).addVisibilityBlock();\n            }\n        }\n        return result;\n    }\n\n    /** @param {EvalContext} context */\n    doEval(context) {\n        /** @type {Ruleset | undefined} */\n        let ruleset;\n        const features = this.features && this.features.eval(context);\n\n        if (this.options.isPlugin) {\n            if (this.root && this.root.eval) {\n                try {\n                    this.root.eval(context);\n                }\n                catch (e) {\n                    const err = /** @type {{ message: string }} */ (e);\n                    err.message = 'Plugin error during evaluation';\n                    throw new LessError(\n                        /** @type {{ message: string, index?: number, filename?: string }} */ (e),\n                        /** @type {{ imports: object }} */ (/** @type {unknown} */ (this.root)).imports,\n                        /** @type {{ filename: string }} */ (/** @type {unknown} */ (this.root)).filename\n                    );\n                }\n            }\n            const frame0 = /** @type {Ruleset & { functionRegistry?: { addMultiple: (fns: object) => void } }} */ (context.frames[0]);\n            const registry = frame0 && frame0.functionRegistry;\n            if (registry && this.root && this.root.functions) {\n                registry.addMultiple(this.root.functions);\n            }\n\n            return [];\n        }\n\n        if (this.skip) {\n            if (typeof this.skip === 'function') {\n                this.skip = this.skip();\n            }\n            if (this.skip) {\n                return [];\n            }\n        }\n        if (this.features) {\n            let featureValue = /** @type {Node[]} */ (this.features.value);\n            if (Array.isArray(featureValue) && featureValue.length >= 1) {\n                const expr = featureValue[0];\n                if (expr.type === 'Expression' && Array.isArray(expr.value) && /** @type {Node[]} */ (expr.value).length >= 2) {\n                    featureValue = /** @type {Node[]} */ (expr.value);\n                    const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n                        && featureValue[1].type === 'Paren';\n                    if (isLayer) {\n                        this.css = false;\n                    }\n                }\n            }\n        }\n        if (this.options.inline) {\n            const contents = new Anonymous(\n                /** @type {string} */ (/** @type {unknown} */ (this.root)),\n                0,\n                {\n                    filename: this.importedFilename,\n                    reference: this.path._fileInfo && this.path._fileInfo.reference\n                },\n                true,\n                true\n            );\n\n            return this.features ? new Media([contents], /** @type {Node[]} */ (this.features.value)) : [contents];\n        } else if (this.css || this.layerCss) {\n            const newImport = new Import(this.evalPath(context), features, this.options, this._index || 0);\n            if (this.layerCss) {\n                newImport.css = this.layerCss;\n                newImport.path._fileInfo = this._fileInfo;\n            }\n            if (!newImport.css && this.error) {\n                throw this.error;\n            }\n            return newImport;\n        } else if (this.root) {\n            if (this.features) {\n                let featureValue = /** @type {Node[]} */ (this.features.value);\n                if (Array.isArray(featureValue) && featureValue.length === 1) {\n                    const expr = featureValue[0];\n                    if (expr.type === 'Expression' && Array.isArray(expr.value) && /** @type {Node[]} */ (expr.value).length >= 2) {\n                        featureValue = /** @type {Node[]} */ (expr.value);\n                        const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n                            && featureValue[1].type === 'Paren';\n                        if (isLayer) {\n                            this.layerCss = true;\n                            featureValue[0] = new Expression(/** @type {Node[]} */ (featureValue.slice(0, 2)));\n                            featureValue.splice(1, 1);\n                            /** @type {Expression} */ (featureValue[0]).noSpacing = true;\n                            return this;\n                        }\n                    }\n                }\n            }\n            ruleset = new Ruleset(null, utils.copyArray(this.root.rules));\n            ruleset.evalImports(context);\n\n            return this.features ? new Media(ruleset.rules, /** @type {Node[]} */ (this.features.value)) : ruleset.rules;\n        } else {\n            if (this.features) {\n                let featureValue = /** @type {Node[]} */ (this.features.value);\n                if (Array.isArray(featureValue) && featureValue.length >= 1) {\n                    featureValue = /** @type {Node[]} */ (featureValue[0].value);\n                    if (Array.isArray(featureValue) && featureValue.length >= 2) {\n                        const isLayer = featureValue[0].type === 'Keyword' && featureValue[0].value === 'layer'\n                            && featureValue[1].type === 'Paren';\n                        if (isLayer) {\n                            this.css = true;\n                            featureValue[0] = new Expression(/** @type {Node[]} */ (featureValue.slice(0, 2)));\n                            featureValue.splice(1, 1);\n                            /** @type {Expression} */ (featureValue[0]).noSpacing = true;\n                            return this;\n                        }\n                    }\n                }\n            }\n            return [];\n        }\n    }\n}\n\nexport default Import;\n"
  },
  {
    "path": "packages/less/lib/less/tree/index.js",
    "content": "// @ts-check\nimport Node from './node.js';\nimport Color from './color.js';\nimport AtRule from './atrule.js';\nimport DetachedRuleset from './detached-ruleset.js';\nimport Operation from './operation.js';\nimport Dimension from './dimension.js';\nimport Unit from './unit.js';\nimport Keyword from './keyword.js';\nimport Variable from './variable.js';\nimport Property from './property.js';\nimport Ruleset from './ruleset.js';\nimport Element from './element.js';\nimport Attribute from './attribute.js';\nimport Combinator from './combinator.js';\nimport Selector from './selector.js';\nimport Quoted from './quoted.js';\nimport Expression from './expression.js';\nimport Declaration from './declaration.js';\nimport Call from './call.js';\nimport URL from './url.js';\nimport Import from './import.js';\nimport Comment from './comment.js';\nimport Anonymous from './anonymous.js';\nimport Value from './value.js';\nimport JavaScript from './javascript.js';\nimport Assignment from './assignment.js';\nimport Condition from './condition.js';\nimport QueryInParens from './query-in-parens.js';\nimport Paren from './paren.js';\nimport Media from './media.js';\nimport Container from './container.js';\nimport UnicodeDescriptor from './unicode-descriptor.js';\nimport Negative from './negative.js';\nimport Extend from './extend.js';\nimport VariableCall from './variable-call.js';\nimport NamespaceValue from './namespace-value.js';\n\n// mixins\nimport MixinCall from './mixin-call.js';\nimport MixinDefinition from './mixin-definition.js';\n\nexport default {\n    Node, Color, AtRule, DetachedRuleset, Operation,\n    Dimension, Unit, Keyword, Variable, Property,\n    Ruleset, Element, Attribute, Combinator, Selector,\n    Quoted, Expression, Declaration, Call, URL, Import,\n    Comment, Anonymous, Value, JavaScript, Assignment,\n    Condition, Paren, Media, Container, QueryInParens,\n    UnicodeDescriptor, Negative, Extend, VariableCall,\n    NamespaceValue,\n    mixin: {\n        Call: MixinCall,\n        Definition: MixinDefinition\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less/tree/javascript.js",
    "content": "// @ts-check\n/** @import { EvalContext, FileInfo } from './node.js' */\nimport JsEvalNode from './js-eval-node.js';\nimport Dimension from './dimension.js';\nimport Quoted from './quoted.js';\nimport Anonymous from './anonymous.js';\n\nclass JavaScript extends JsEvalNode {\n    get type() { return 'JavaScript'; }\n\n    /**\n     * @param {string} string\n     * @param {boolean} escaped\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     */\n    constructor(string, escaped, index, currentFileInfo) {\n        super();\n        this.escaped = escaped;\n        this.expression = string;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Dimension | Quoted | Anonymous}\n     */\n    eval(context) {\n        const result = this.evaluateJavaScript(this.expression, context);\n        const type = typeof result;\n\n        if (type === 'number' && !isNaN(/** @type {number} */ (result))) {\n            return new Dimension(/** @type {number} */ (result));\n        } else if (type === 'string') {\n            return new Quoted(`\"${result}\"`, /** @type {string} */ (result), this.escaped, this._index);\n        } else if (Array.isArray(result)) {\n            return new Anonymous(/** @type {string[]} */ (result).join(', '));\n        } else {\n            return new Anonymous(/** @type {string} */ (result));\n        }\n    }\n}\n\nexport default JavaScript;\n"
  },
  {
    "path": "packages/less/lib/less/tree/js-eval-node.js",
    "content": "// @ts-check\n/** @import { EvalContext } from './node.js' */\nimport Node from './node.js';\nimport Variable from './variable.js';\n\nclass JsEvalNode extends Node {\n    /**\n     * @param {string} expression\n     * @param {EvalContext} context\n     * @returns {string | number | boolean}\n     */\n    evaluateJavaScript(expression, context) {\n        let result;\n        const that = this;\n        /** @type {Record<string, { value: Node, toJS: () => string }>} */\n        const evalContext = {};\n\n        if (!context.javascriptEnabled) {\n            throw { message: 'Inline JavaScript is not enabled. Is it set in your options?',\n                filename: this.fileInfo().filename,\n                index: this.getIndex() };\n        }\n\n        expression = expression.replace(/@\\{([\\w-]+)\\}/g, function (_, name) {\n            return that.jsify(new Variable(`@${name}`, that.getIndex(), that.fileInfo()).eval(context));\n        });\n\n        /** @type {Function} */\n        let expressionFunc;\n        try {\n            expressionFunc = new Function(`return (${expression})`);\n        } catch (e) {\n            throw { message: `JavaScript evaluation error: ${/** @type {Error} */ (e).message} from \\`${expression}\\`` ,\n                filename: this.fileInfo().filename,\n                index: this.getIndex() };\n        }\n\n        const variables = /** @type {Node & { variables: () => Record<string, { value: Node }> }} */ (context.frames[0]).variables();\n        for (const k in variables) {\n            // eslint-disable-next-line no-prototype-builtins\n            if (variables.hasOwnProperty(k)) {\n                evalContext[k.slice(1)] = {\n                    value: variables[k].value,\n                    toJS: function () {\n                        return this.value.eval(context).toCSS(context);\n                    }\n                };\n            }\n        }\n\n        try {\n            result = expressionFunc.call(evalContext);\n        } catch (e) {\n            throw { message: `JavaScript evaluation error: '${/** @type {Error} */ (e).name}: ${/** @type {Error} */ (e).message.replace(/[\"]/g, '\\'')}'` ,\n                filename: this.fileInfo().filename,\n                index: this.getIndex() };\n        }\n        return result;\n    }\n\n    /**\n     * @param {Node} obj\n     * @returns {string}\n     */\n    jsify(obj) {\n        if (Array.isArray(obj.value) && (obj.value.length > 1)) {\n            return `[${obj.value.map(function (v) { return v.toCSS(/** @type {EvalContext} */ (undefined)); }).join(', ')}]`;\n        } else {\n            return obj.toCSS(/** @type {EvalContext} */ (undefined));\n        }\n    }\n}\n\nexport default JsEvalNode;\n"
  },
  {
    "path": "packages/less/lib/less/tree/keyword.js",
    "content": "// @ts-check\nimport Node from './node.js';\n\n/** @import { EvalContext, CSSOutput } from './node.js' */\n\nclass Keyword extends Node {\n    get type() { return 'Keyword'; }\n\n    /** @param {string} value */\n    constructor(value) {\n        super();\n        this.value = value;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        if (this.value === '%') { throw { type: 'Syntax', message: 'Invalid % without number' }; }\n        output.add(/** @type {string} */ (this.value));\n    }\n}\n\nKeyword.True = new Keyword('true');\nKeyword.False = new Keyword('false');\n\nexport default Keyword;\n"
  },
  {
    "path": "packages/less/lib/less/tree/media.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, FileInfo, VisibilityInfo } from './node.js' */\n/** @import { NestableAtRuleThis } from './nested-at-rule.js' */\n/** @import { RulesetLikeNode } from './atrule.js' */\nimport Node from './node.js';\nimport Ruleset from './ruleset.js';\nimport Value from './value.js';\nimport Selector from './selector.js';\nimport AtRule from './atrule.js';\nimport NestableAtRulePrototype from './nested-at-rule.js';\n\nclass Media extends AtRule {\n    get type() { return 'Media'; }\n\n    /**\n     * @param {Node[] | null} value\n     * @param {Node[]} features\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(value, features, index, currentFileInfo, visibilityInfo) {\n        super();\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n\n        const selectors = (new Selector([], null, null, this._index, this._fileInfo)).createEmptySelectors();\n\n        /** @type {Value} */\n        this.features = new Value(features);\n        /** @type {RulesetLikeNode[]} */\n        this.rules = [new Ruleset(selectors, value)];\n        /** @type {RulesetLikeNode} */ (this.rules[0]).allowImports = true;\n        this.copyVisibilityInfo(visibilityInfo);\n        this.allowRoot = true;\n        this.setParent(selectors, /** @type {Node} */ (/** @type {unknown} */ (this)));\n        this.setParent(this.features, /** @type {Node} */ (/** @type {unknown} */ (this)));\n        this.setParent(this.rules, /** @type {Node} */ (/** @type {unknown} */ (this)));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add('@media ', this._fileInfo, this._index);\n        this.features.genCSS(context, output);\n        this.outputRuleset(context, output, this.rules);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        if (!context.mediaBlocks) {\n            context.mediaBlocks = [];\n            context.mediaPath = [];\n        }\n\n        const media = new Media(null, [], this._index, this._fileInfo, this.visibilityInfo());\n        if (this.debugInfo) {\n            /** @type {RulesetLikeNode} */ (this.rules[0]).debugInfo = this.debugInfo;\n            media.debugInfo = this.debugInfo;\n        }\n\n        media.features = /** @type {Value} */ (this.features.eval(context));\n\n        context.mediaPath.push(/** @type {Node} */ (/** @type {unknown} */ (media)));\n        context.mediaBlocks.push(/** @type {Node} */ (/** @type {unknown} */ (media)));\n\n        const fr = /** @type {RulesetLikeNode} */ (context.frames[0]).functionRegistry;\n        if (fr) {\n            /** @type {RulesetLikeNode} */ (this.rules[0]).functionRegistry = fr.inherit();\n        }\n        context.frames.unshift(this.rules[0]);\n        media.rules = [/** @type {RulesetLikeNode} */ (this.rules[0].eval(context))];\n        context.frames.shift();\n\n        context.mediaPath.pop();\n\n        return context.mediaPath.length === 0 ? /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (media)).evalTop(context) :\n            /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (media)).evalNested(context);\n    }\n}\n\n// Apply NestableAtRulePrototype methods (accept, isRulesetLike override AtRule's versions)\nObject.assign(Media.prototype, NestableAtRulePrototype);\n\nexport default Media;\n"
  },
  {
    "path": "packages/less/lib/less/tree/merge-rules.js",
    "content": "// @ts-check\nimport Expression from './expression.js';\nimport Value from './value.js';\nimport Node from './node.js';\n\n/**\n * Merges declarations with merge flags (+ or ,) into combined values.\n * Used by both the ToCSSVisitor and AtRule eval.\n * @param {Node[]} rules\n */\nexport default function mergeRules(rules) {\n    if (!rules) {\n        return;\n    }\n\n    /** @type {Record<string, Array<Node & { merge: string, name: string, value: Node, important: string }>>} */\n    const groups    = {};\n    /** @type {Array<Array<Node & { merge: string, name: string, value: Node, important: string }>>} */\n    const groupsArr = [];\n\n    for (let i = 0; i < rules.length; i++) {\n        const rule = /** @type {Node & { merge: string, name: string }} */ (rules[i]);\n        if (rule.merge) {\n            const key = rule.name;\n            groups[key] ? rules.splice(i--, 1) :\n                groupsArr.push(groups[key] = []);\n            groups[key].push(/** @type {Node & { merge: string, name: string, value: Node, important: string }} */ (rule));\n        }\n    }\n\n    groupsArr.forEach(group => {\n        if (group.length > 0) {\n            const result = group[0];\n            /** @type {Node[]} */\n            let space  = [];\n            const comma  = [new Expression(space)];\n            group.forEach(rule => {\n                if ((rule.merge === '+') && (space.length > 0)) {\n                    comma.push(new Expression(space = []));\n                }\n                space.push(rule.value);\n                result.important = result.important || rule.important;\n            });\n            result.value = new Value(comma);\n        }\n    });\n}\n"
  },
  {
    "path": "packages/less/lib/less/tree/mixin-call.js",
    "content": "// @ts-check\n/** @import { EvalContext, TreeVisitor, FileInfo } from './node.js' */\n/** @import { FunctionRegistry } from './nested-at-rule.js' */\nimport Node from './node.js';\nimport Selector from './selector.js';\nimport MixinDefinition from './mixin-definition.js';\nimport defaultFunc from '../functions/default.js';\n\n/**\n * @typedef {{ name?: string, value: Node, expand?: boolean }} MixinArg\n */\n\n/**\n * @typedef {Node & {\n *   rules?: Node[],\n *   selectors?: Selector[],\n *   originalRuleset?: Node,\n *   matchArgs: (args: MixinArg[] | null, context: EvalContext) => boolean,\n *   matchCondition?: (args: MixinArg[] | null, context: EvalContext) => boolean,\n *   find: (selector: Selector, self?: Node | null, filter?: (rule: Node) => boolean) => Array<{ rule: Node & { rules?: Node[], originalRuleset?: Node, matchArgs: Function, matchCondition?: Function, evalCall?: Function }, path: Node[] }>,\n *   functionRegistry?: FunctionRegistry\n * }} MixinSearchFrame\n */\n\nclass MixinCall extends Node {\n    get type() { return 'MixinCall'; }\n\n    /**\n     * @param {import('./element.js').default[]} elements\n     * @param {MixinArg[]} [args]\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     * @param {string} [important]\n     */\n    constructor(elements, args, index, currentFileInfo, important) {\n        super();\n        /** @type {Selector} */\n        this.selector = new Selector(elements);\n        /** @type {MixinArg[]} */\n        this.arguments = args || [];\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {string | undefined} */\n        this.important = important;\n        this.allowRoot = true;\n        this.setParent(this.selector, /** @type {Node} */ (/** @type {unknown} */ (this)));\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        if (this.selector) {\n            this.selector = /** @type {Selector} */ (visitor.visit(this.selector));\n        }\n        if (this.arguments.length) {\n            this.arguments = /** @type {MixinArg[]} */ (/** @type {unknown} */ (visitor.visitArray(/** @type {Node[]} */ (/** @type {unknown} */ (this.arguments)))));\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        /** @type {{ rule: Node & { rules?: Node[], originalRuleset?: Node, matchArgs: Function, matchCondition?: Function, evalCall?: Function }, path: Node[] }[] | undefined} */\n        let mixins;\n        /** @type {Node & { rules?: Node[], originalRuleset?: Node, matchArgs: Function, matchCondition?: Function, evalCall?: Function }} */\n        let mixin;\n        /** @type {Node[]} */\n        let mixinPath;\n        /** @type {MixinArg[]} */\n        const args = [];\n        /** @type {MixinArg} */\n        let arg;\n        /** @type {Node} */\n        let argValue;\n        /** @type {Node[]} */\n        const rules = [];\n        let match = false;\n        /** @type {number} */\n        let i;\n        /** @type {number} */\n        let m;\n        /** @type {number} */\n        let f;\n        /** @type {boolean} */\n        let isRecursive;\n        /** @type {boolean | undefined} */\n        let isOneFound;\n        /** @type {{ mixin: Node & { rules?: Node[], originalRuleset?: Node, matchArgs: Function, matchCondition?: Function, evalCall?: Function }, group: number }[]} */\n        const candidates = [];\n        /** @type {{ mixin: Node & { rules?: Node[], originalRuleset?: Node, matchArgs: Function, matchCondition?: Function, evalCall?: Function }, group: number } | number} */\n        let candidate;\n        /** @type {boolean[]} */\n        const conditionResult = [];\n        /** @type {number | undefined} */\n        let defaultResult;\n        const defFalseEitherCase = -1;\n        const defNone = 0;\n        const defTrue = 1;\n        const defFalse = 2;\n        /** @type {number[]} */\n        let count;\n        /** @type {Node | undefined} */\n        let originalRuleset;\n        /** @type {((rule: MixinSearchFrame) => boolean) | undefined} */\n        let noArgumentsFilter;\n\n        this.selector = /** @type {Selector} */ (this.selector.eval(context));\n\n        /**\n         * @param {Node & { matchCondition?: Function }} mixin\n         * @param {Node[]} mixinPath\n         */\n        function calcDefGroup(mixin, mixinPath) {\n            /** @type {number} */\n            let f;\n            /** @type {number} */\n            let p;\n            /** @type {Node & { matchCondition?: Function }} */\n            let namespace;\n\n            for (f = 0; f < 2; f++) {\n                conditionResult[f] = true;\n                defaultFunc.value(f);\n                for (p = 0; p < mixinPath.length && conditionResult[f]; p++) {\n                    namespace = mixinPath[p];\n                    if (namespace.matchCondition) {\n                        conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, context);\n                    }\n                }\n                if (mixin.matchCondition) {\n                    conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, context);\n                }\n            }\n            if (conditionResult[0] || conditionResult[1]) {\n                if (conditionResult[0] != conditionResult[1]) {\n                    return conditionResult[1] ?\n                        defTrue : defFalse;\n                }\n\n                return defNone;\n            }\n            return defFalseEitherCase;\n        }\n\n        for (i = 0; i < this.arguments.length; i++) {\n            arg = this.arguments[i];\n            argValue = arg.value.eval(context);\n            if (arg.expand && Array.isArray(argValue.value)) {\n                const expandedValues = /** @type {Node[]} */ (argValue.value);\n                for (m = 0; m < expandedValues.length; m++) {\n                    args.push({value: expandedValues[m]});\n                }\n            } else {\n                args.push({name: arg.name, value: argValue});\n            }\n        }\n\n        noArgumentsFilter = function(/** @type {MixinSearchFrame} */ rule) {return rule.matchArgs(null, context);};\n\n        for (i = 0; i < context.frames.length; i++) {\n            if ((mixins = /** @type {MixinSearchFrame} */ (context.frames[i]).find(this.selector, null, /** @type {(rule: Node) => boolean} */ (/** @type {unknown} */ (noArgumentsFilter)))).length > 0) {\n                isOneFound = true;\n\n                // To make `default()` function independent of definition order we have two \"subpasses\" here.\n                // At first we evaluate each guard *twice* (with `default() == true` and `default() == false`),\n                // and build candidate list with corresponding flags. Then, when we know all possible matches,\n                // we make a final decision.\n\n                for (m = 0; m < mixins.length; m++) {\n                    mixin = mixins[m].rule;\n                    mixinPath = mixins[m].path;\n                    isRecursive = false;\n                    for (f = 0; f < context.frames.length; f++) {\n                        if ((!(mixin instanceof MixinDefinition)) && mixin === (/** @type {Node & { originalRuleset?: Node }} */ (context.frames[f]).originalRuleset || context.frames[f])) {\n                            isRecursive = true;\n                            break;\n                        }\n                    }\n                    if (isRecursive) {\n                        continue;\n                    }\n\n                    if (mixin.matchArgs(args, context)) {\n                        candidate = {mixin, group: calcDefGroup(mixin, mixinPath)};\n\n                        if (/** @type {{ mixin: Node, group: number }} */ (candidate).group !== defFalseEitherCase) {\n                            candidates.push(/** @type {{ mixin: Node & { rules?: Node[], originalRuleset?: Node, matchArgs: Function, matchCondition?: Function, evalCall?: Function }, group: number }} */ (candidate));\n                        }\n\n                        match = true;\n                    }\n                }\n\n                defaultFunc.reset();\n\n                count = [0, 0, 0];\n                for (m = 0; m < candidates.length; m++) {\n                    count[candidates[m].group]++;\n                }\n\n                if (count[defNone] > 0) {\n                    defaultResult = defFalse;\n                } else {\n                    defaultResult = defTrue;\n                    if ((count[defTrue] + count[defFalse]) > 1) {\n                        throw { type: 'Runtime',\n                            message: `Ambiguous use of \\`default()\\` found when matching for \\`${this.format(args)}\\``,\n                            index: this.getIndex(), filename: this.fileInfo().filename };\n                    }\n                }\n\n                for (m = 0; m < candidates.length; m++) {\n                    candidate = candidates[m].group;\n                    if ((candidate === defNone) || (candidate === defaultResult)) {\n                        try {\n                            mixin = candidates[m].mixin;\n                            if (!(mixin instanceof MixinDefinition)) {\n                                originalRuleset = /** @type {Node & { originalRuleset?: Node }} */ (mixin).originalRuleset || mixin;\n                                mixin = new MixinDefinition('', [], mixin.rules, null, false, null, originalRuleset.visibilityInfo());\n                                /** @type {Node & { originalRuleset?: Node }} */ (mixin).originalRuleset = originalRuleset;\n                            }\n                            const newRules = /** @type {MixinDefinition} */ (mixin).evalCall(context, args, this.important).rules;\n                            this._setVisibilityToReplacement(newRules);\n                            Array.prototype.push.apply(rules, newRules);\n                        } catch (e) {\n                            throw { .../** @type {object} */ (e), index: this.getIndex(), filename: this.fileInfo().filename };\n                        }\n                    }\n                }\n\n                if (match) {\n                    return /** @type {Node} */ (/** @type {unknown} */ (rules));\n                }\n            }\n        }\n        if (isOneFound) {\n            throw { type:    'Runtime',\n                message: `No matching definition was found for \\`${this.format(args)}\\``,\n                index:   this.getIndex(), filename: this.fileInfo().filename };\n        } else {\n            throw { type:    'Name',\n                message: `${this.selector.toCSS(/** @type {EvalContext} */ ({})).trim()} is undefined`,\n                index:   this.getIndex(), filename: this.fileInfo().filename };\n        }\n    }\n\n    /** @param {Node[]} replacement */\n    _setVisibilityToReplacement(replacement) {\n        /** @type {number} */\n        let i;\n        /** @type {Node} */\n        let rule;\n        if (this.blocksVisibility()) {\n            for (i = 0; i < replacement.length; i++) {\n                rule = replacement[i];\n                rule.addVisibilityBlock();\n            }\n        }\n    }\n\n    /** @param {MixinArg[]} args */\n    format(args) {\n        return `${this.selector.toCSS(/** @type {EvalContext} */ ({})).trim()}(${args ? args.map(function (/** @type {MixinArg} */ a) {\n            let argValue = '';\n            if (a.name) {\n                argValue += `${a.name}:`;\n            }\n            if (a.value.toCSS) {\n                argValue += a.value.toCSS(/** @type {EvalContext} */ ({}));\n            } else {\n                argValue += '???';\n            }\n            return argValue;\n        }).join(', ') : ''})`;\n    }\n}\n\nexport default MixinCall;\n"
  },
  {
    "path": "packages/less/lib/less/tree/mixin-definition.js",
    "content": "// @ts-check\n/** @import { EvalContext, TreeVisitor, VisibilityInfo } from './node.js' */\n/** @import { FunctionRegistry } from './nested-at-rule.js' */\n/** @import { MixinArg } from './mixin-call.js' */\nimport Node from './node.js';\nimport Selector from './selector.js';\nimport Element from './element.js';\nimport Ruleset from './ruleset.js';\nimport Declaration from './declaration.js';\nimport DetachedRuleset from './detached-ruleset.js';\nimport Expression from './expression.js';\nimport contexts from '../contexts.js';\nimport * as utils from '../utils.js';\n\n/**\n * @typedef {object} MixinParam\n * @property {string} [name]\n * @property {Node} [value]\n * @property {boolean} [variadic]\n */\n\n/**\n * @typedef {Ruleset & {\n *   functionRegistry?: FunctionRegistry,\n *   originalRuleset?: Node\n * }} RulesetWithRegistry\n */\n\nclass Definition extends Ruleset {\n    get type() { return 'MixinDefinition'; }\n\n    /**\n     * @param {string | undefined} name\n     * @param {MixinParam[]} params\n     * @param {Node[]} rules\n     * @param {Node | null} [condition]\n     * @param {boolean} [variadic]\n     * @param {Node[] | null} [frames]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(name, params, rules, condition, variadic, frames, visibilityInfo) {\n        super(null, null);\n        /** @type {string} */\n        this.name = name || 'anonymous mixin';\n        this.selectors = [new Selector([new Element(null, name, false, this._index, this._fileInfo)])];\n        /** @type {MixinParam[]} */\n        this.params = params;\n        /** @type {Node | null | undefined} */\n        this.condition = condition;\n        /** @type {boolean | undefined} */\n        this.variadic = variadic;\n        /** @type {number} */\n        this.arity = params.length;\n        this.rules = rules;\n        this._lookups = {};\n        /** @type {string[]} */\n        const optionalParameters = [];\n        /** @type {number} */\n        this.required = params.reduce(function (/** @type {number} */ count, /** @type {MixinParam} */ p) {\n            if (!p.name || (p.name && !p.value)) {\n                return count + 1;\n            }\n            else {\n                optionalParameters.push(p.name);\n                return count;\n            }\n        }, 0);\n        /** @type {string[]} */\n        this.optionalParameters = optionalParameters;\n        /** @type {Node[] | null | undefined} */\n        this.frames = frames;\n        this.copyVisibilityInfo(visibilityInfo);\n        this.allowRoot = true;\n        /** @type {boolean} */\n        this.evalFirst = true;\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        if (this.params && this.params.length) {\n            this.params = /** @type {MixinParam[]} */ (/** @type {unknown} */ (visitor.visitArray(/** @type {Node[]} */ (/** @type {unknown} */ (this.params)))));\n        }\n        this.rules = visitor.visitArray(this.rules);\n        if (this.condition) {\n            this.condition = visitor.visit(this.condition);\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {EvalContext} mixinEnv\n     * @param {MixinArg[] | null} args\n     * @param {Node[]} evaldArguments\n     * @returns {Ruleset}\n     */\n    evalParams(context, mixinEnv, args, evaldArguments) {\n        /* jshint boss:true */\n        const frame = new Ruleset(null, null);\n\n        /** @type {Node[] | undefined} */\n        let varargs;\n        /** @type {MixinArg | undefined} */\n        let arg;\n        const params = /** @type {MixinParam[]} */ (utils.copyArray(this.params));\n        /** @type {number} */\n        let i;\n        /** @type {number} */\n        let j;\n        /** @type {Node | undefined} */\n        let val;\n        /** @type {string | undefined} */\n        let name;\n        /** @type {boolean} */\n        let isNamedFound;\n        /** @type {number} */\n        let argIndex;\n        let argsLength = 0;\n\n        if (mixinEnv.frames && mixinEnv.frames[0] && /** @type {RulesetWithRegistry} */ (mixinEnv.frames[0]).functionRegistry) {\n            /** @type {RulesetWithRegistry} */ (frame).functionRegistry = /** @type {FunctionRegistry} */ (/** @type {RulesetWithRegistry} */ (mixinEnv.frames[0]).functionRegistry).inherit();\n        }\n        mixinEnv = new contexts.Eval(mixinEnv, /** @type {Node[]} */ ([frame]).concat(/** @type {Node[]} */ (mixinEnv.frames)));\n\n        if (args) {\n            args = /** @type {MixinArg[]} */ (utils.copyArray(args));\n            argsLength = args.length;\n\n            for (i = 0; i < argsLength; i++) {\n                arg = args[i];\n                if (name = (arg && arg.name)) {\n                    isNamedFound = false;\n                    for (j = 0; j < params.length; j++) {\n                        if (!evaldArguments[j] && name === params[j].name) {\n                            evaldArguments[j] = arg.value.eval(context);\n                            frame.prependRule(new Declaration(name, arg.value.eval(context)));\n                            isNamedFound = true;\n                            break;\n                        }\n                    }\n                    if (isNamedFound) {\n                        args.splice(i, 1);\n                        i--;\n                        continue;\n                    } else {\n                        throw { type: 'Runtime', message: `Named argument for ${this.name} ${args[i].name} not found` };\n                    }\n                }\n            }\n        }\n        argIndex = 0;\n        for (i = 0; i < params.length; i++) {\n            if (evaldArguments[i]) { continue; }\n\n            arg = args && args[argIndex];\n\n            if (name = params[i].name) {\n                if (params[i].variadic) {\n                    varargs = [];\n                    for (j = argIndex; j < argsLength; j++) {\n                        varargs.push(/** @type {MixinArg[]} */ (args)[j].value.eval(context));\n                    }\n                    frame.prependRule(new Declaration(name, new Expression(varargs).eval(context)));\n                } else {\n                    val = arg && arg.value;\n                    if (val) {\n                        // This was a mixin call, pass in a detached ruleset of it's eval'd rules\n                        if (Array.isArray(val)) {\n                            val = /** @type {Node} */ (/** @type {unknown} */ (new DetachedRuleset(new Ruleset(null, /** @type {Node[]} */ (val)))));\n                        }\n                        else {\n                            val = val.eval(context);\n                        }\n                    } else if (params[i].value) {\n                        val = /** @type {Node} */ (params[i].value).eval(mixinEnv);\n                        frame.resetCache();\n                    } else {\n                        throw { type: 'Runtime', message: `wrong number of arguments for ${this.name} (${argsLength} for ${this.arity})` };\n                    }\n\n                    frame.prependRule(new Declaration(name, val));\n                    evaldArguments[i] = val;\n                }\n            }\n\n            if (params[i].variadic && args) {\n                for (j = argIndex; j < argsLength; j++) {\n                    evaldArguments[j] = args[j].value.eval(context);\n                }\n            }\n            argIndex++;\n        }\n\n        return frame;\n    }\n\n    /** @returns {Ruleset} */\n    makeImportant() {\n        const rules = !this.rules ? this.rules : this.rules.map(function (/** @type {Node & { makeImportant?: (important?: boolean) => Node }} */ r) {\n            if (r.makeImportant) {\n                return r.makeImportant(true);\n            } else {\n                return r;\n            }\n        });\n        const result = new Definition(this.name, this.params, rules, this.condition, this.variadic, this.frames);\n        return /** @type {Ruleset} */ (/** @type {unknown} */ (result));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Definition}\n     */\n    eval(context) {\n        return new Definition(this.name, this.params, this.rules, this.condition, this.variadic, this.frames || utils.copyArray(context.frames));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {MixinArg[]} args\n     * @param {string | undefined} important\n     * @returns {Ruleset}\n     */\n    evalCall(context, args, important) {\n        /** @type {Node[]} */\n        const _arguments = [];\n        const mixinFrames = this.frames ? /** @type {Node[]} */ (this.frames).concat(/** @type {Node[]} */ (context.frames)) : /** @type {Node[]} */ (context.frames);\n        const frame = this.evalParams(context, new contexts.Eval(context, mixinFrames), args, _arguments);\n        /** @type {Node[]} */\n        let rules;\n        /** @type {Ruleset} */\n        let ruleset;\n\n        frame.prependRule(new Declaration('@arguments', new Expression(_arguments).eval(context)));\n\n        rules = utils.copyArray(this.rules);\n\n        ruleset = new Ruleset(null, rules);\n        /** @type {RulesetWithRegistry} */ (ruleset).originalRuleset = this;\n        ruleset = /** @type {Ruleset} */ (ruleset.eval(new contexts.Eval(context, /** @type {Node[]} */ ([this, frame]).concat(mixinFrames))));\n        if (important) {\n            ruleset = /** @type {Ruleset} */ (ruleset.makeImportant());\n        }\n        return ruleset;\n    }\n\n    /**\n     * @param {MixinArg[] | null} args\n     * @param {EvalContext} context\n     * @returns {boolean}\n     */\n    matchCondition(args, context) {\n        if (this.condition && !this.condition.eval(\n            new contexts.Eval(context,\n                /** @type {Node[]} */ ([this.evalParams(context, /* the parameter variables */\n                    new contexts.Eval(context, this.frames ? /** @type {Node[]} */ (this.frames).concat(/** @type {Node[]} */ (context.frames)) : context.frames), args, [])])\n                    .concat(/** @type {Node[]} */ (this.frames || [])) // the parent namespace/mixin frames\n                    .concat(/** @type {Node[]} */ (context.frames))))) { // the current environment frames\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * @param {MixinArg[] | null} args\n     * @param {EvalContext} [context]\n     * @returns {boolean}\n     */\n    matchArgs(args, context) {\n        const allArgsCnt = (args && args.length) || 0;\n        let len;\n        const optionalParameters = this.optionalParameters;\n        const requiredArgsCnt = !args ? 0 : args.reduce(function (/** @type {number} */ count, /** @type {MixinArg} */ p) {\n            if (optionalParameters.indexOf(p.name) < 0) {\n                return count + 1;\n            } else {\n                return count;\n            }\n        }, 0);\n\n        if (!this.variadic) {\n            if (requiredArgsCnt < this.required) {\n                return false;\n            }\n            if (allArgsCnt > this.params.length) {\n                return false;\n            }\n        } else {\n            if (requiredArgsCnt < (this.required - 1)) {\n                return false;\n            }\n        }\n\n        // check patterns\n        len = Math.min(requiredArgsCnt, this.arity);\n\n        for (let i = 0; i < len; i++) {\n            if (!this.params[i].name && !this.params[i].variadic) {\n                if (/** @type {MixinArg[]} */ (args)[i].value.eval(context).toCSS(/** @type {EvalContext} */ ({})) != /** @type {Node} */ (this.params[i].value).eval(context).toCSS(/** @type {EvalContext} */ ({}))) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n}\n\nexport default Definition;\n"
  },
  {
    "path": "packages/less/lib/less/tree/namespace-value.js",
    "content": "// @ts-check\n/** @import { EvalContext, FileInfo } from './node.js' */\nimport Node from './node.js';\nimport Variable from './variable.js';\nimport Ruleset from './ruleset.js';\nimport Selector from './selector.js';\n\nclass NamespaceValue extends Node {\n    get type() { return 'NamespaceValue'; }\n\n    /**\n     * @param {Node} ruleCall\n     * @param {string[]} lookups\n     * @param {number} index\n     * @param {FileInfo} fileInfo\n     */\n    constructor(ruleCall, lookups, index, fileInfo) {\n        super();\n        this.value = ruleCall;\n        this.lookups = lookups;\n        this._index = index;\n        this._fileInfo = fileInfo;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        let i, name;\n        /** @type {Ruleset | Node | Node[]} */\n        let rules = this.value.eval(context);\n\n        for (i = 0; i < this.lookups.length; i++) {\n            name = this.lookups[i];\n\n            if (Array.isArray(rules)) {\n                rules = new Ruleset([new Selector()], rules);\n            }\n\n            const rs = /** @type {Ruleset} */ (rules);\n\n            if (name === '') {\n                rules = rs.lastDeclaration();\n            }\n            else if (name.charAt(0) === '@') {\n                if (name.charAt(1) === '@') {\n                    name = `@${new Variable(name.slice(1)).eval(context).value}`;\n                }\n                if (rs.variables) {\n                    rules = rs.variable(name);\n                }\n\n                if (!rules) {\n                    throw { type: 'Name',\n                        message: `variable ${name} not found`,\n                        filename: this.fileInfo().filename,\n                        index: this.getIndex() };\n                }\n            }\n            else {\n                if (name.substring(0, 2) === '$@') {\n                    name = `$${new Variable(name.slice(1)).eval(context).value}`;\n                }\n                else {\n                    name = name.charAt(0) === '$' ? name : `$${name}`;\n                }\n                if (rs.properties) {\n                    rules = rs.property(name);\n                }\n\n                if (!rules) {\n                    throw { type: 'Name',\n                        message: `property \"${name.slice(1)}\" not found`,\n                        filename: this.fileInfo().filename,\n                        index: this.getIndex() };\n                }\n                const rulesArr = /** @type {Node[]} */ (rules);\n                rules = rulesArr[rulesArr.length - 1];\n            }\n\n            const current = /** @type {Node} */ (rules);\n            if (current.value) {\n                rules = /** @type {Node} */ (current.eval(context).value);\n            }\n            const currentNode = /** @type {Node & { ruleset?: Node }} */ (rules);\n            if (currentNode.ruleset) {\n                rules = currentNode.ruleset.eval(context);\n            }\n        }\n        return /** @type {Node} */ (rules);\n    }\n}\n\nexport default NamespaceValue;\n"
  },
  {
    "path": "packages/less/lib/less/tree/negative.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput } from './node.js' */\nimport Node from './node.js';\nimport Operation from './operation.js';\nimport Dimension from './dimension.js';\n\nclass Negative extends Node {\n    get type() { return 'Negative'; }\n\n    /** @param {Node} node */\n    constructor(node) {\n        super();\n        this.value = node;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add('-');\n        /** @type {Node} */ (this.value).genCSS(context, output);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        if (context.isMathOn('*')) {\n            return (new Operation('*', [new Dimension(-1), /** @type {Node} */ (this.value)], false)).eval(context);\n        }\n        return new Negative(/** @type {Node} */ (this.value).eval(context));\n    }\n}\n\nexport default Negative;\n"
  },
  {
    "path": "packages/less/lib/less/tree/nested-at-rule.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo, VisibilityInfo } from './node.js' */\nimport Ruleset from './ruleset.js';\nimport Value from './value.js';\nimport Selector from './selector.js';\nimport Anonymous from './anonymous.js';\nimport Expression from './expression.js';\nimport * as utils from '../utils.js';\nimport Node from './node.js';\n\n/**\n * @typedef {object} FunctionRegistry\n * @property {(name: string, func: Function) => void} add\n * @property {(functions: Object) => void} addMultiple\n * @property {(name: string) => Function} get\n * @property {() => Object} getLocalFunctions\n * @property {() => FunctionRegistry} inherit\n * @property {(base: FunctionRegistry) => FunctionRegistry} create\n */\n\n/**\n * @typedef {Node & {\n *   features: Value,\n *   rules: Ruleset[],\n *   type: string,\n *   functionRegistry?: FunctionRegistry,\n *   multiMedia?: boolean,\n *   debugInfo?: { lineNumber: number, fileName: string },\n *   allowRoot?: boolean,\n *   _evaluated?: boolean,\n *   evalFunction: () => void,\n *   evalTop: (context: EvalContext) => Node | Ruleset,\n *   evalNested: (context: EvalContext) => Node | Ruleset,\n *   permute: (arr: Node[][]) => Node[][],\n *   bubbleSelectors: (selectors: Selector[] | undefined) => void,\n *   outputRuleset: (context: EvalContext, output: CSSOutput, rules: Node[]) => void\n * }} NestableAtRuleThis\n */\n\nconst NestableAtRulePrototype = {\n\n    isRulesetLike() {\n        return true;\n    },\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        /** @type {NestableAtRuleThis} */\n        const self = /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (this));\n        if (self.features) {\n            self.features = /** @type {Value} */ (visitor.visit(self.features));\n        }\n        if (self.rules) {\n            self.rules = /** @type {Ruleset[]} */ (visitor.visitArray(self.rules));\n        }\n    },\n\n    evalFunction: function () {\n        /** @type {NestableAtRuleThis} */\n        const self = /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (this));\n        if (!self.features || !Array.isArray(self.features.value) || self.features.value.length < 1) {\n            return;\n        }\n\n        const exprValues = /** @type {Node[]} */ (self.features.value);\n        /** @type {Node | undefined} */\n        let expr;\n        /** @type {Node | undefined} */\n        let paren;\n\n        for (let index = 0; index < exprValues.length; ++index) {\n            expr = exprValues[index];\n\n            if ((expr.type === 'Keyword' || expr.type === 'Variable')\n                && index + 1 < exprValues.length\n                && (/** @type {Node & { noSpacing?: boolean }} */ (expr).noSpacing || /** @type {Node & { noSpacing?: boolean }} */ (expr).noSpacing == null)) {\n                paren =  exprValues[index + 1];\n\n                if (paren.type ===  'Paren' && /** @type {Node & { noSpacing?: boolean }} */ (paren).noSpacing) {\n                    exprValues[index]= new Expression([expr, paren]);\n                    exprValues.splice(index + 1, 1);\n                    /** @type {Node & { noSpacing?: boolean }} */ (exprValues[index]).noSpacing = true;\n                }\n            }\n        }\n    },\n\n    /** @param {EvalContext} context */\n    evalTop(context) {\n        /** @type {NestableAtRuleThis} */\n        const self = /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (this));\n        self.evalFunction();\n\n        /** @type {Node | Ruleset} */\n        let result = self;\n\n        // Render all dependent Media blocks.\n        if (context.mediaBlocks.length > 1) {\n            const selectors = (new Selector([], null, null, self.getIndex(), self.fileInfo())).createEmptySelectors();\n            result = new Ruleset(selectors, context.mediaBlocks);\n            /** @type {Ruleset & { multiMedia?: boolean }} */ (result).multiMedia = true;\n            result.copyVisibilityInfo(self.visibilityInfo());\n            self.setParent(result, self);\n        }\n\n        delete context.mediaBlocks;\n        delete context.mediaPath;\n\n        return result;\n    },\n\n    /** @param {EvalContext} context */\n    evalNested(context) {\n        /** @type {NestableAtRuleThis} */\n        const self = /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (this));\n        self.evalFunction();\n\n        let i;\n        /** @type {Node | Node[]} */\n        let value;\n        const path = context.mediaPath.concat([self]);\n\n        // Extract the media-query conditions separated with `,` (OR).\n        for (i = 0; i < path.length; i++) {\n            if (path[i].type !== self.type) {\n                const blockIndex = context.mediaBlocks.indexOf(self);\n                if (blockIndex > -1) {\n                    context.mediaBlocks.splice(blockIndex, 1);\n                }\n                return self;\n            }\n\n            value = /** @type {NestableAtRuleThis} */ (path[i]).features instanceof Value ?\n                /** @type {Node[]} */ (/** @type {NestableAtRuleThis} */ (path[i]).features.value) : /** @type {NestableAtRuleThis} */ (path[i]).features;\n            path[i] = /** @type {Node} */ (/** @type {unknown} */ (Array.isArray(value) ? value : [value]));\n        }\n\n        // Trace all permutations to generate the resulting media-query.\n        //\n        // (a, b and c) with nested (d, e) ->\n        //    a and d\n        //    a and e\n        //    b and c and d\n        //    b and c and e\n        self.features = new Value(self.permute(/** @type {Node[][]} */ (/** @type {unknown} */ (path))).map(\n            /** @param {Node | Node[]} path */\n            path => {\n            path = /** @type {Node[]} */ (path).map(\n                /** @param {Node & { toCSS?: Function }} fragment */\n                fragment => fragment.toCSS ? fragment : new Anonymous(/** @type {string} */ (/** @type {unknown} */ (fragment))));\n\n            for (i = /** @type {Node[]} */ (path).length - 1; i > 0; i--) {\n                /** @type {Node[]} */ (path).splice(i, 0, new Anonymous('and'));\n            }\n\n            return new Expression(/** @type {Node[]} */ (path));\n        }));\n        self.setParent(self.features, self);\n\n        // Fake a tree-node that doesn't output anything.\n        return new Ruleset([], []);\n    },\n\n    /**\n     * @param {Node[][]} arr\n     * @returns {Node[][]}\n     */\n    permute(arr) {\n        if (arr.length === 0) {\n            return [];\n        } else if (arr.length === 1) {\n            return /** @type {Node[][]} */ (/** @type {unknown} */ (arr[0]));\n        } else {\n            /** @type {Node[][]} */\n            const result = [];\n            const rest = this.permute(arr.slice(1));\n            for (let i = 0; i < rest.length; i++) {\n                for (let j = 0; j < arr[0].length; j++) {\n                    result.push([arr[0][j]].concat(rest[i]));\n                }\n            }\n            return result;\n        }\n    },\n\n    /** @param {Selector[] | undefined} selectors */\n    bubbleSelectors(selectors) {\n        /** @type {NestableAtRuleThis} */\n        const self = /** @type {NestableAtRuleThis} */ (/** @type {unknown} */ (this));\n        if (!selectors) {\n            return;\n        }\n        self.rules = [new Ruleset(utils.copyArray(selectors), [self.rules[0]])];\n        self.setParent(self.rules, self);\n    }\n};\n\nexport default NestableAtRulePrototype;\n"
  },
  {
    "path": "packages/less/lib/less/tree/node.js",
    "content": "// @ts-check\n/**\n * @typedef {object} FileInfo\n * @property {string} [filename]\n * @property {string} [rootpath]\n * @property {string} [currentDirectory]\n * @property {string} [rootFilename]\n * @property {string} [entryPath]\n * @property {boolean} [reference]\n */\n\n/**\n * @typedef {object} VisibilityInfo\n * @property {number} [visibilityBlocks]\n * @property {boolean} [nodeVisible]\n */\n\n/**\n * @typedef {object} CSSOutput\n * @property {(chunk: string, fileInfo?: FileInfo, index?: number, mapLines?: boolean) => void} add\n * @property {() => boolean} isEmpty\n */\n\n/**\n * @typedef {object} EvalContext\n * @property {number} [numPrecision]\n * @property {(op?: string) => boolean} [isMathOn]\n * @property {number} [math]\n * @property {Node[]} [frames]\n * @property {Array<{important?: string}>} [importantScope]\n * @property {string[]} [paths]\n * @property {boolean} [compress]\n * @property {boolean} [strictUnits]\n * @property {boolean} [sourceMap]\n * @property {boolean} [importMultiple]\n * @property {string} [urlArgs]\n * @property {boolean} [javascriptEnabled]\n * @property {object} [pluginManager]\n * @property {number} [rewriteUrls]\n * @property {boolean} [inCalc]\n * @property {boolean} [mathOn]\n * @property {boolean[]} [calcStack]\n * @property {boolean[]} [parensStack]\n * @property {Node[]} [mediaBlocks]\n * @property {Node[]} [mediaPath]\n * @property {() => void} [inParenthesis]\n * @property {() => void} [outOfParenthesis]\n * @property {() => void} [enterCalc]\n * @property {() => void} [exitCalc]\n * @property {(path: string) => boolean} [pathRequiresRewrite]\n * @property {(path: string, rootpath?: string) => string} [rewritePath]\n * @property {(path: string) => string} [normalizePath]\n * @property {number} [tabLevel]\n * @property {boolean} [lastRule]\n */\n\n/**\n * @typedef {object} TreeVisitor\n * @property {(node: Node) => Node} visit\n * @property {(nodes: Node[], nonReplacing?: boolean) => Node[]} visitArray\n */\n\n/**\n * The reason why Node is a class and other nodes simply do not extend\n * from Node (since we're transpiling) is due to this issue:\n *\n * @see https://github.com/less/less.js/issues/3434\n */\nclass Node {\n    get type() { return ''; }\n\n    constructor() {\n        /** @type {Node | null} */\n        this.parent = null;\n        /** @type {number | undefined} */\n        this.visibilityBlocks = undefined;\n        /** @type {boolean | undefined} */\n        this.nodeVisible = undefined;\n        /** @type {Node | null} */\n        this.rootNode = null;\n        /** @type {Node | null} */\n        this.parsed = null;\n\n        /** @type {Node | Node[] | string | number | undefined} */\n        this.value = undefined;\n        /** @type {number | undefined} */\n        this._index = undefined;\n        /** @type {FileInfo | undefined} */\n        this._fileInfo = undefined;\n    }\n\n    get currentFileInfo() {\n        return this.fileInfo();\n    }\n\n    get index() {\n        return this.getIndex();\n    }\n\n    /**\n     * @param {Node | Node[]} nodes\n     * @param {Node} parent\n     */\n    setParent(nodes, parent) {\n        /** @param {Node} node */\n        function set(node) {\n            if (node && node instanceof Node) {\n                node.parent = parent;\n            }\n        }\n        if (Array.isArray(nodes)) {\n            nodes.forEach(set);\n        }\n        else {\n            set(nodes);\n        }\n    }\n\n    /** @returns {number} */\n    getIndex() {\n        return this._index || (this.parent && this.parent.getIndex()) || 0;\n    }\n\n    /** @returns {FileInfo} */\n    fileInfo() {\n        return this._fileInfo || (this.parent && this.parent.fileInfo()) || {};\n    }\n\n    /** @returns {boolean} */\n    isRulesetLike() { return false; }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {string}\n     */\n    toCSS(context) {\n        /** @type {string[]} */\n        const strs = [];\n        this.genCSS(context, {\n            add: function(chunk, fileInfo, index) {\n                strs.push(chunk);\n            },\n            isEmpty: function () {\n                return strs.length === 0;\n            }\n        });\n        return strs.join('');\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add(/** @type {string} */ (this.value));\n    }\n\n    /**\n     * @param {TreeVisitor} visitor\n     */\n    accept(visitor) {\n        this.value = visitor.visit(/** @type {Node} */ (this.value));\n    }\n\n    /**\n     * @param {EvalContext} [context]\n     * @returns {Node}\n     */\n    eval(context) { return this; }\n\n    /**\n     * @param {EvalContext} context\n     * @param {string} op\n     * @param {number} a\n     * @param {number} b\n     * @returns {number | undefined}\n     */\n    _operate(context, op, a, b) {\n        switch (op) {\n            case '+': return a + b;\n            case '-': return a - b;\n            case '*': return a * b;\n            case '/': return a / b;\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {number} value\n     * @returns {number}\n     */\n    fround(context, value) {\n        const precision = context && context.numPrecision;\n        // add \"epsilon\" to ensure numbers like 1.000000005 (represented as 1.000000004999...) are properly rounded:\n        return (precision) ? Number((value + 2e-16).toFixed(precision)) : value;\n    }\n\n    /**\n     * @param {Node & { compare?: (other: Node) => number | undefined }} a\n     * @param {Node & { compare?: (other: Node) => number | undefined }} b\n     * @returns {number | undefined}\n     */\n    static compare(a, b) {\n        /* returns:\n         -1: a < b\n         0: a = b\n         1: a > b\n         and *any* other value for a != b (e.g. undefined, NaN, -2 etc.) */\n\n        if ((a.compare) &&\n            // for \"symmetric results\" force toCSS-based comparison\n            // of Quoted or Anonymous if either value is one of those\n            !(b.type === 'Quoted' || b.type === 'Anonymous')) {\n            return a.compare(b);\n        } else if (b.compare) {\n            return -b.compare(a);\n        } else if (a.type !== b.type) {\n            return undefined;\n        }\n\n        let aVal = a.value;\n        let bVal = b.value;\n        if (!Array.isArray(aVal)) {\n            return aVal === bVal ? 0 : undefined;\n        }\n        if (!Array.isArray(bVal)) {\n            return undefined;\n        }\n        if (aVal.length !== bVal.length) {\n            return undefined;\n        }\n        for (let i = 0; i < aVal.length; i++) {\n            if (Node.compare(aVal[i], bVal[i]) !== 0) {\n                return undefined;\n            }\n        }\n        return 0;\n    }\n\n    /**\n     * @param {number | string} a\n     * @param {number | string} b\n     * @returns {number | undefined}\n     */\n    static numericCompare(a, b) {\n        return a  <  b ? -1\n            : a === b ?  0\n                : a  >  b ?  1 : undefined;\n    }\n\n    /** @returns {boolean} */\n    blocksVisibility() {\n        if (this.visibilityBlocks === undefined) {\n            this.visibilityBlocks = 0;\n        }\n        return this.visibilityBlocks !== 0;\n    }\n\n    addVisibilityBlock() {\n        if (this.visibilityBlocks === undefined) {\n            this.visibilityBlocks = 0;\n        }\n        this.visibilityBlocks = this.visibilityBlocks + 1;\n    }\n\n    removeVisibilityBlock() {\n        if (this.visibilityBlocks === undefined) {\n            this.visibilityBlocks = 0;\n        }\n        this.visibilityBlocks = this.visibilityBlocks - 1;\n    }\n\n    ensureVisibility() {\n        this.nodeVisible = true;\n    }\n\n    ensureInvisibility() {\n        this.nodeVisible = false;\n    }\n\n    /** @returns {boolean | undefined} */\n    isVisible() {\n        return this.nodeVisible;\n    }\n\n    /** @returns {VisibilityInfo} */\n    visibilityInfo() {\n        return {\n            visibilityBlocks: this.visibilityBlocks,\n            nodeVisible: this.nodeVisible\n        };\n    }\n\n    /** @param {VisibilityInfo} info */\n    copyVisibilityInfo(info) {\n        if (!info) {\n            return;\n        }\n        this.visibilityBlocks = info.visibilityBlocks;\n        this.nodeVisible = info.nodeVisible;\n    }\n}\n\n/**\n * Set by the parser at runtime on Node.prototype.\n * @type {{ context: EvalContext, importManager: object, imports: object } | undefined}\n */\nNode.prototype.parse = undefined;\n\nexport default Node;\n"
  },
  {
    "path": "packages/less/lib/less/tree/operation.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor } from './node.js' */\nimport Node from './node.js';\nimport Color from './color.js';\nimport Dimension from './dimension.js';\nimport * as Constants from '../constants.js';\nconst MATH = Constants.Math;\n\nclass Operation extends Node {\n    get type() { return 'Operation'; }\n\n    /**\n     * @param {string} op\n     * @param {Node[]} operands\n     * @param {boolean} isSpaced\n     */\n    constructor(op, operands, isSpaced) {\n        super();\n        this.op = op.trim();\n        this.operands = operands;\n        this.isSpaced = isSpaced;\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.operands = visitor.visitArray(this.operands);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        let a = this.operands[0].eval(context), b = this.operands[1].eval(context), op;\n\n        if (context.isMathOn(this.op)) {\n            op = this.op === './' ? '/' : this.op;\n            if (a instanceof Dimension && b instanceof Color) {\n                a = /** @type {Dimension} */ (a).toColor();\n            }\n            if (b instanceof Dimension && a instanceof Color) {\n                b = /** @type {Dimension} */ (b).toColor();\n            }\n            if (!/** @type {Dimension | Color} */ (a).operate || !/** @type {Dimension | Color} */ (b).operate) {\n                if (\n                    (a instanceof Operation || b instanceof Operation)\n                    && /** @type {Operation} */ (a).op === '/' && context.math === MATH.PARENS_DIVISION\n                ) {\n                    return new Operation(this.op, [a, b], this.isSpaced);\n                }\n                throw { type: 'Operation',\n                    message: 'Operation on an invalid type' };\n            }\n\n            if (a instanceof Dimension) {\n                return a.operate(context, op, /** @type {Dimension} */ (b));\n            }\n            return /** @type {Color} */ (a).operate(context, op, /** @type {Color} */ (b));\n        } else {\n            return new Operation(this.op, [a, b], this.isSpaced);\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        this.operands[0].genCSS(context, output);\n        if (this.isSpaced) {\n            output.add(' ');\n        }\n        output.add(this.op);\n        if (this.isSpaced) {\n            output.add(' ');\n        }\n        this.operands[1].genCSS(context, output);\n    }\n}\n\nexport default Operation;\n"
  },
  {
    "path": "packages/less/lib/less/tree/paren.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput } from './node.js' */\nimport Node from './node.js';\n\nclass Paren extends Node {\n    get type() { return 'Paren'; }\n\n    /** @param {Node} node */\n    constructor(node) {\n        super();\n        this.value = node;\n        /** @type {boolean | undefined} */\n        this.noSpacing = undefined;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add('(');\n        /** @type {Node} */ (this.value).genCSS(context, output);\n        output.add(')');\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Paren}\n     */\n    eval(context) {\n        const paren = new Paren(/** @type {Node} */ (this.value).eval(context));\n\n        if (this.noSpacing) {\n            paren.noSpacing = true;\n        }\n\n        return paren;\n    }\n}\n\nexport default Paren;\n"
  },
  {
    "path": "packages/less/lib/less/tree/property.js",
    "content": "// @ts-check\n/** @import { EvalContext, FileInfo } from './node.js' */\nimport Node from './node.js';\nimport Declaration from './declaration.js';\nimport Ruleset from './ruleset.js';\n\nclass Property extends Node {\n    get type() { return 'Property'; }\n\n    /**\n     * @param {string} name\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     */\n    constructor(name, index, currentFileInfo) {\n        super();\n        this.name = name;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {boolean | undefined} */\n        this.evaluating = undefined;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        let property;\n        const name = this.name;\n        // TODO: shorten this reference\n        const mergeRules = /** @type {{ less: { visitors: { ToCSSVisitor: { prototype: { _mergeRules: (rules: Declaration[]) => void } } } } }} */ (context.pluginManager).less.visitors.ToCSSVisitor.prototype._mergeRules;\n\n        if (this.evaluating) {\n            throw { type: 'Name',\n                message: `Recursive property reference for ${name}`,\n                filename: this.fileInfo().filename,\n                index: this.getIndex() };\n        }\n\n        this.evaluating = true;\n\n        property = this.find(context.frames, function (/** @type {Node} */ frame) {\n            let v;\n            const vArr = /** @type {Ruleset} */ (frame).property(name);\n            if (vArr) {\n                for (let i = 0; i < vArr.length; i++) {\n                    v = vArr[i];\n\n                    vArr[i] = new Declaration(v.name,\n                        v.value,\n                        v.important,\n                        v.merge,\n                        v.index,\n                        v.currentFileInfo,\n                        v.inline,\n                        v.variable\n                    );\n                }\n                mergeRules(vArr);\n\n                v = vArr[vArr.length - 1];\n                if (v.important) {\n                    const importantScope = context.importantScope[context.importantScope.length - 1];\n                    importantScope.important = v.important;\n                }\n                v = v.value.eval(context);\n                return v;\n            }\n        });\n        if (property) {\n            this.evaluating = false;\n            return property;\n        } else {\n            throw { type: 'Name',\n                message: `Property '${name}' is undefined`,\n                filename: this.currentFileInfo.filename,\n                index: this.index };\n        }\n    }\n\n    /**\n     * @param {Node[]} obj\n     * @param {(frame: Node) => Node | undefined} fun\n     * @returns {Node | null}\n     */\n    find(obj, fun) {\n        for (let i = 0, r; i < obj.length; i++) {\n            r = fun.call(obj, obj[i]);\n            if (r) { return r; }\n        }\n        return null;\n    }\n}\n\nexport default Property;\n"
  },
  {
    "path": "packages/less/lib/less/tree/query-in-parens.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor } from './node.js' */\nimport Node from './node.js';\n\nclass QueryInParens extends Node {\n    get type() { return 'QueryInParens'; }\n\n    /**\n     * @param {string} op\n     * @param {Node} l\n     * @param {Node} m\n     * @param {string | null} op2\n     * @param {Node | null} r\n     * @param {number} i\n     */\n    constructor(op, l, m, op2, r, i) {\n        super();\n        this.op = op.trim();\n        this.lvalue = l;\n        this.mvalue = m;\n        this.op2 = op2 ? op2.trim() : null;\n        /** @type {Node | null} */\n        this.rvalue = r;\n        this._index = i;\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.lvalue = visitor.visit(this.lvalue);\n        this.mvalue = visitor.visit(this.mvalue);\n        if (this.rvalue) {\n            this.rvalue = visitor.visit(this.rvalue);\n        }\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        const node = new QueryInParens(\n            this.op,\n            this.lvalue.eval(context),\n            this.mvalue.eval(context),\n            this.op2,\n            this.rvalue ? this.rvalue.eval(context) : null,\n            this._index || 0\n        );\n        return node;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        this.lvalue.genCSS(context, output);\n        output.add(' ' + this.op + ' ');\n        this.mvalue.genCSS(context, output);\n        if (this.rvalue) {\n            output.add(' ' + this.op2 + ' ');\n            this.rvalue.genCSS(context, output);\n        }\n    }\n}\n\nexport default QueryInParens;\n"
  },
  {
    "path": "packages/less/lib/less/tree/quoted.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, FileInfo } from './node.js' */\nimport Node from './node.js';\nimport Variable from './variable.js';\nimport Property from './property.js';\n\nclass Quoted extends Node {\n    get type() { return 'Quoted'; }\n\n    /**\n     * @param {string} str\n     * @param {string} [content]\n     * @param {boolean} [escaped]\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     */\n    constructor(str, content, escaped, index, currentFileInfo) {\n        super();\n        /** @type {boolean} */\n        this.escaped = (escaped === undefined) ? true : escaped;\n        /** @type {string} */\n        this.value = content || '';\n        /** @type {string} */\n        this.quote = str.charAt(0);\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {RegExp} */\n        this.variableRegex = /@\\{([\\w-]+)\\}/g;\n        /** @type {RegExp} */\n        this.propRegex = /\\$\\{([\\w-]+)\\}/g;\n        /** @type {boolean | undefined} */\n        this.allowRoot = escaped;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        if (!this.escaped) {\n            output.add(this.quote, this.fileInfo(), this.getIndex());\n        }\n        output.add(/** @type {string} */ (this.value));\n        if (!this.escaped) {\n            output.add(this.quote);\n        }\n    }\n\n    /** @returns {RegExpMatchArray | null} */\n    containsVariables() {\n        return /** @type {string} */ (this.value).match(this.variableRegex);\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        const that = this;\n        let value = /** @type {string} */ (this.value);\n        /**\n         * @param {string} _\n         * @param {string} name1\n         * @param {string} name2\n         * @returns {string}\n         */\n        const variableReplacement = function (_, name1, name2) {\n            const v = new Variable(`@${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context);\n            return (v instanceof Quoted) ? /** @type {string} */ (v.value) : v.toCSS(context);\n        };\n        /**\n         * @param {string} _\n         * @param {string} name1\n         * @param {string} name2\n         * @returns {string}\n         */\n        const propertyReplacement = function (_, name1, name2) {\n            const v = new Property(`$${name1 ?? name2}`, that.getIndex(), that.fileInfo()).eval(context);\n            return (v instanceof Quoted) ? /** @type {string} */ (v.value) : v.toCSS(context);\n        };\n        /**\n         * @param {string} value\n         * @param {RegExp} regexp\n         * @param {(substring: string, ...args: string[]) => string} replacementFnc\n         * @returns {string}\n         */\n        function iterativeReplace(value, regexp, replacementFnc) {\n            let evaluatedValue = value;\n            do {\n                value = evaluatedValue.toString();\n                evaluatedValue = value.replace(regexp, replacementFnc);\n            } while (value !== evaluatedValue);\n            return evaluatedValue;\n        }\n        value = iterativeReplace(value, this.variableRegex, variableReplacement);\n        value = iterativeReplace(value, this.propRegex, propertyReplacement);\n        return new Quoted(this.quote + value + this.quote, value, this.escaped, this.getIndex(), this.fileInfo());\n    }\n\n    /**\n     * @param {Node} other\n     * @returns {number | undefined}\n     */\n    compare(other) {\n        // when comparing quoted strings allow the quote to differ\n        if (other.type === 'Quoted' && !this.escaped && !/** @type {Quoted} */ (other).escaped) {\n            return Node.numericCompare(\n                /** @type {string} */ (this.value),\n                /** @type {string} */ (other.value)\n            );\n        } else {\n            return other.toCSS && this.toCSS(/** @type {EvalContext} */ ({})) === other.toCSS(/** @type {EvalContext} */ ({})) ? 0 : undefined;\n        }\n    }\n}\n\nexport default Quoted;\n"
  },
  {
    "path": "packages/less/lib/less/tree/ruleset.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo, VisibilityInfo } from './node.js' */\n/** @import { FunctionRegistry } from './nested-at-rule.js' */\nimport Node from './node.js';\nimport Declaration from './declaration.js';\nimport Keyword from './keyword.js';\nimport Comment from './comment.js';\nimport Paren from './paren.js';\nimport Selector from './selector.js';\nimport Element from './element.js';\nimport Anonymous from './anonymous.js';\nimport contexts from '../contexts.js';\nimport globalFunctionRegistry from '../functions/function-registry.js';\nimport defaultFunc from '../functions/default.js';\nimport getDebugInfo from './debug-info.js';\nimport * as utils from '../utils.js';\nimport Parser from '../parser/parser.js';\n\n/**\n * @typedef {Node & {\n *   rules?: Node[],\n *   selectors?: Selector[],\n *   root?: boolean,\n *   firstRoot?: boolean,\n *   allowImports?: boolean,\n *   functionRegistry?: FunctionRegistry,\n *   originalRuleset?: Node,\n *   debugInfo?: { lineNumber: number, fileName: string },\n *   evalFirst?: boolean,\n *   isRuleset?: boolean,\n *   isCharset?: () => boolean,\n *   merge?: boolean | string,\n *   multiMedia?: boolean,\n *   parse?: { context: EvalContext, importManager: object },\n *   bubbleSelectors?: (selectors: Selector[]) => void\n * }} RuleNode\n */\n\nclass Ruleset extends Node {\n    get type() { return 'Ruleset'; }\n\n    /**\n     * @param {Selector[] | null} selectors\n     * @param {Node[] | null} rules\n     * @param {boolean} [strictImports]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(selectors, rules, strictImports, visibilityInfo) {\n        super();\n        /** @type {Selector[] | null} */\n        this.selectors = selectors;\n        /** @type {Node[] | null} */\n        this.rules = rules;\n        /** @type {Object<string, { rule: Node, path: Node[] }[]>} */\n        this._lookups = {};\n        /** @type {Object<string, Declaration> | null} */\n        this._variables = null;\n        /** @type {Object<string, Declaration[]> | null} */\n        this._properties = null;\n        /** @type {boolean | undefined} */\n        this.strictImports = strictImports;\n        this.copyVisibilityInfo(visibilityInfo);\n        this.allowRoot = true;\n        /** @type {boolean} */\n        this.isRuleset = true;\n\n        /** @type {boolean | undefined} */\n        this.root = undefined;\n        /** @type {boolean | undefined} */\n        this.firstRoot = undefined;\n        /** @type {boolean | undefined} */\n        this.allowImports = undefined;\n        /** @type {FunctionRegistry | undefined} */\n        this.functionRegistry = undefined;\n        /** @type {Node | undefined} */\n        this.originalRuleset = undefined;\n        /** @type {{ lineNumber: number, fileName: string } | undefined} */\n        this.debugInfo = undefined;\n        /** @type {Selector[][] | undefined} */\n        this.paths = undefined;\n        /** @type {Ruleset[] | null | undefined} */\n        this._rulesets = undefined;\n        /** @type {boolean | undefined} */\n        this.evalFirst = undefined;\n        this.setParent(this.selectors, this);\n        this.setParent(this.rules, this);\n    }\n\n    isRulesetLike() { return true; }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        if (this.paths) {\n            this.paths = /** @type {Selector[][]} */ (/** @type {unknown} */ (visitor.visitArray(/** @type {Node[]} */ (/** @type {unknown} */ (this.paths)), true)));\n        } else if (this.selectors) {\n            this.selectors = /** @type {Selector[]} */ (visitor.visitArray(this.selectors));\n        }\n        if (this.rules && this.rules.length) {\n            this.rules = visitor.visitArray(this.rules);\n        }\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        /** @type {Selector[] | undefined} */\n        let selectors;\n        /** @type {number} */\n        let selCnt;\n        /** @type {Selector} */\n        let selector;\n        /** @type {number} */\n        let i;\n        /** @type {boolean | undefined} */\n        let hasVariable;\n        let hasOnePassingSelector = false;\n\n        if (this.selectors && (selCnt = this.selectors.length)) {\n            selectors = new Array(selCnt);\n            defaultFunc.error({\n                type: 'Syntax',\n                message: 'it is currently only allowed in parametric mixin guards,'\n            });\n\n            for (i = 0; i < selCnt; i++) {\n                selector = /** @type {Selector} */ (this.selectors[i].eval(context));\n                for (let j = 0; j < selector.elements.length; j++) {\n                    if (selector.elements[j].isVariable) {\n                        hasVariable = true;\n                        break;\n                    }\n                }\n                selectors[i] = selector;\n                if (selector.evaldCondition) {\n                    hasOnePassingSelector = true;\n                }\n            }\n\n            if (hasVariable) {\n                const toParseSelectors = new Array(selCnt);\n                for (i = 0; i < selCnt; i++) {\n                    selector = selectors[i];\n                    toParseSelectors[i] = selector.toCSS(context);\n                }\n                const startingIndex = selectors[0].getIndex();\n                const selectorFileInfo = selectors[0].fileInfo();\n                new (/** @type {new (...args: [EvalContext, object, FileInfo, number]) => { parseNode: Function }} */ (/** @type {unknown} */ (Parser)))(context, /** @type {{ context: EvalContext, importManager: object }} */ (this.parse).importManager, selectorFileInfo, startingIndex).parseNode(\n                    toParseSelectors.join(','),\n                    ['selectors'],\n                    function(/** @type {Error | null} */ err, /** @type {Node[]} */ result) {\n                        if (result) {\n                            selectors = /** @type {Selector[]} */ (utils.flattenArray(result));\n                        }\n                    });\n            }\n\n            defaultFunc.reset();\n        } else {\n            hasOnePassingSelector = true;\n        }\n\n        let rules = this.rules ? utils.copyArray(this.rules) : null;\n        const ruleset = new Ruleset(selectors, rules, this.strictImports, this.visibilityInfo());\n        /** @type {Node} */\n        let rule;\n        /** @type {Node} */\n        let subRule;\n\n        ruleset.originalRuleset = this;\n        ruleset.root = this.root;\n        ruleset.firstRoot = this.firstRoot;\n        ruleset.allowImports = this.allowImports;\n\n        if (this.debugInfo) {\n            ruleset.debugInfo = this.debugInfo;\n        }\n\n        if (!hasOnePassingSelector) {\n            /** @type {Node[]} */ (rules).length = 0;\n        }\n\n        // push the current ruleset to the frames stack\n        const ctxFrames = context.frames;\n\n        // inherit a function registry from the frames stack when possible;\n        // otherwise from the global registry\n        /** @type {FunctionRegistry | undefined} */\n        let foundRegistry;\n        for (let fi = 0, fn = ctxFrames.length; fi !== fn; ++fi) {\n            foundRegistry = /** @type {RuleNode} */ (ctxFrames[fi]).functionRegistry;\n            if (foundRegistry) { break; }\n        }\n        ruleset.functionRegistry = (foundRegistry || globalFunctionRegistry).inherit();\n        ctxFrames.unshift(ruleset);\n\n        // currrent selectors\n        /** @type {Selector[][] | undefined} */\n        let ctxSelectors = /** @type {EvalContext & { selectors?: Selector[][] }} */ (context).selectors;\n        if (!ctxSelectors) {\n            /** @type {EvalContext & { selectors?: Selector[][] }} */ (context).selectors = ctxSelectors = [];\n        }\n        ctxSelectors.unshift(this.selectors);\n\n        // Evaluate imports\n        if (ruleset.root || ruleset.allowImports || !ruleset.strictImports) {\n            ruleset.evalImports(context);\n        }\n\n        // Store the frames around mixin definitions,\n        // so they can be evaluated like closures when the time comes.\n        const rsRules = /** @type {Node[]} */ (ruleset.rules);\n        for (i = 0; (rule = rsRules[i]); i++) {\n            if (/** @type {RuleNode} */ (rule).evalFirst) {\n                rsRules[i] = rule.eval(context);\n            }\n        }\n\n        const mediaBlockCount = (context.mediaBlocks && context.mediaBlocks.length) || 0;\n\n        // Evaluate mixin calls.\n        for (i = 0; (rule = rsRules[i]); i++) {\n            if (rule.type === 'MixinCall') {\n                /* jshint loopfunc:true */\n                rules = /** @type {Node[]} */ (/** @type {unknown} */ (rule.eval(context))).filter(function(/** @type {Node & { variable?: boolean }} */ r) {\n                    if ((r instanceof Declaration) && r.variable) {\n                        // do not pollute the scope if the variable is\n                        // already there. consider returning false here\n                        // but we need a way to \"return\" variable from mixins\n                        return !(ruleset.variable(/** @type {string} */ (r.name)));\n                    }\n                    return true;\n                });\n                rsRules.splice.apply(rsRules, /** @type {[number, number, ...Node[]]} */ ([i, 1].concat(rules)));\n                i += rules.length - 1;\n                ruleset.resetCache();\n            } else if (rule.type ===  'VariableCall') {\n                /* jshint loopfunc:true */\n                rules = /** @type {Node[]} */ (/** @type {RuleNode} */ (rule.eval(context)).rules).filter(function(/** @type {Node & { variable?: boolean }} */ r) {\n                    if ((r instanceof Declaration) && r.variable) {\n                        // do not pollute the scope at all\n                        return false;\n                    }\n                    return true;\n                });\n                rsRules.splice.apply(rsRules, /** @type {[number, number, ...Node[]]} */ ([i, 1].concat(rules)));\n                i += rules.length - 1;\n                ruleset.resetCache();\n            }\n        }\n\n        // Evaluate everything else\n        for (i = 0; (rule = rsRules[i]); i++) {\n            if (!/** @type {RuleNode} */ (rule).evalFirst) {\n                rsRules[i] = rule = rule.eval ? rule.eval(context) : rule;\n            }\n        }\n\n        // Evaluate everything else\n        for (i = 0; (rule = rsRules[i]); i++) {\n            // for rulesets, check if it is a css guard and can be removed\n            if (rule instanceof Ruleset && rule.selectors && rule.selectors.length === 1) {\n                // check if it can be folded in (e.g. & where)\n                if (rule.selectors[0] && rule.selectors[0].isJustParentSelector()) {\n                    rsRules.splice(i--, 1);\n\n                    for (let j = 0; (subRule = rule.rules[j]); j++) {\n                        if (subRule instanceof Node) {\n                            subRule.copyVisibilityInfo(rule.visibilityInfo());\n                            if (!(subRule instanceof Declaration) || !subRule.variable) {\n                                rsRules.splice(++i, 0, subRule);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        // Pop the stack\n        ctxFrames.shift();\n        ctxSelectors.shift();\n\n        if (context.mediaBlocks) {\n            for (i = mediaBlockCount; i < context.mediaBlocks.length; i++) {\n                /** @type {RuleNode} */ (context.mediaBlocks[i]).bubbleSelectors(selectors);\n            }\n        }\n\n        return ruleset;\n    }\n\n    /** @param {EvalContext} context */\n    evalImports(context) {\n        const rules = this.rules;\n        /** @type {number} */\n        let i;\n        /** @type {Node | Node[]} */\n        let importRules;\n        if (!rules) { return; }\n\n        for (i = 0; i < rules.length; i++) {\n            if (rules[i].type === 'Import') {\n                importRules = rules[i].eval(context);\n                if (importRules && (/** @type {Node[]} */ (/** @type {unknown} */ (importRules)).length || /** @type {Node[]} */ (/** @type {unknown} */ (importRules)).length === 0)) {\n                    const importArr = /** @type {Node[]} */ (/** @type {unknown} */ (importRules));\n                    rules.splice(i, 1, ...importArr);\n                    i += importArr.length - 1;\n                } else {\n                    rules.splice(i, 1, importRules);\n                }\n                this.resetCache();\n            }\n        }\n    }\n\n    makeImportant() {\n        const result = new Ruleset(this.selectors, /** @type {Node[]} */ (this.rules).map(function (/** @type {Node & { makeImportant?: () => Node }} */ r) {\n            if (r.makeImportant) {\n                return r.makeImportant();\n            } else {\n                return r;\n            }\n        }), this.strictImports, this.visibilityInfo());\n\n        return result;\n    }\n\n    /** @param {Node[] | object[] | null} [args] */\n    matchArgs(args) {\n        return !args || args.length === 0;\n    }\n\n    /**\n     * @param {Node[] | object[] | null} args\n     * @param {EvalContext} context\n     */\n    matchCondition(args, context) {\n        const lastSelector = /** @type {Selector[]} */ (this.selectors)[/** @type {Selector[]} */ (this.selectors).length - 1];\n        if (!lastSelector.evaldCondition) {\n            return false;\n        }\n        if (lastSelector.condition &&\n            !lastSelector.condition.eval(\n                new contexts.Eval(context,\n                    context.frames))) {\n            return false;\n        }\n        return true;\n    }\n\n    resetCache() {\n        this._rulesets = null;\n        this._variables = null;\n        this._properties = null;\n        this._lookups = {};\n    }\n\n    variables() {\n        if (!this._variables) {\n            this._variables = !this.rules ? {} : this.rules.reduce(function (/** @type {Object<string, Declaration>} */ hash, /** @type {Node} */ r) {\n                if (r instanceof Declaration && r.variable === true) {\n                    hash[/** @type {string} */ (r.name)] = r;\n                }\n                // when evaluating variables in an import statement, imports have not been eval'd\n                // so we need to go inside import statements.\n                // guard against root being a string (in the case of inlined less)\n                if (r.type === 'Import' && /** @type {RuleNode} */ (r).root && /** @type {RuleNode & { root: Ruleset }} */ (r).root.variables) {\n                    const vars = /** @type {RuleNode & { root: Ruleset }} */ (r).root.variables();\n                    for (const name in vars) {\n                        if (Object.prototype.hasOwnProperty.call(vars, name)) {\n                            hash[name] = /** @type {Declaration} */ (/** @type {RuleNode & { root: Ruleset }} */ (r).root.variable(name));\n                        }\n                    }\n                }\n                return hash;\n            }, {});\n        }\n        return this._variables;\n    }\n\n    properties() {\n        if (!this._properties) {\n            this._properties = !this.rules ? {} : this.rules.reduce(function (/** @type {Object<string, Declaration[]>} */ hash, /** @type {Node} */ r) {\n                if (r instanceof Declaration && r.variable !== true) {\n                    const name = (/** @type {Node[]} */ (r.name).length === 1) && (/** @type {Node[]} */ (r.name)[0] instanceof Keyword) ?\n                        /** @type {string} */ (/** @type {Node[]} */ (r.name)[0].value) : /** @type {string} */ (r.name);\n                    // Properties don't overwrite as they can merge\n                    if (!hash[`$${name}`]) {\n                        hash[`$${name}`] = [ r ];\n                    }\n                    else {\n                        hash[`$${name}`].push(r);\n                    }\n                }\n                return hash;\n            }, {});\n        }\n        return this._properties;\n    }\n\n    /** @param {string} name */\n    variable(name) {\n        const decl = this.variables()[name];\n        if (decl) {\n            return this.parseValue(decl);\n        }\n    }\n\n    /** @param {string} name */\n    property(name) {\n        const decl = this.properties()[name];\n        if (decl) {\n            return this.parseValue(decl);\n        }\n    }\n\n    lastDeclaration() {\n        for (let i = /** @type {Node[]} */ (this.rules).length; i > 0; i--) {\n            const decl = /** @type {Node[]} */ (this.rules)[i - 1];\n            if (decl instanceof Declaration) {\n                return this.parseValue(decl);\n            }\n        }\n    }\n\n    /** @param {Declaration | Declaration[]} toParse */\n    parseValue(toParse) {\n        const self = this;\n        /** @param {Declaration} decl */\n        function transformDeclaration(decl) {\n            if (decl.value instanceof Anonymous && !/** @type {Declaration & { parsed?: boolean }} */ (decl).parsed) {\n                if (typeof decl.value.value === 'string') {\n                    new (/** @type {new (...args: [EvalContext, object, FileInfo, number]) => { parseNode: Function }} */ (/** @type {unknown} */ (Parser)))(/** @type {{ context: EvalContext, importManager: object }} */ (/** @type {Ruleset} */ (this).parse).context, /** @type {{ context: EvalContext, importManager: object }} */ (/** @type {Ruleset} */ (this).parse).importManager, decl.fileInfo(), decl.value.getIndex()).parseNode(\n                        decl.value.value,\n                        ['value', 'important'],\n                        function(/** @type {Error | null} */ err, /** @type {Node[]} */ result) {\n                            if (err) {\n                                decl.parsed = /** @type {Node} */ (/** @type {unknown} */ (true));\n                            }\n                            if (result) {\n                                decl.value = result[0];\n                                /** @type {Declaration & { important?: string }} */ (decl).important = /** @type {string} */ (/** @type {unknown} */ (result[1])) || '';\n                                decl.parsed = /** @type {Node} */ (/** @type {unknown} */ (true));\n                            }\n                        });\n                } else {\n                    decl.parsed = /** @type {Node} */ (/** @type {unknown} */ (true));\n                }\n\n                return decl;\n            }\n            else {\n                return decl;\n            }\n        }\n        if (!Array.isArray(toParse)) {\n            return transformDeclaration.call(self, toParse);\n        }\n        else {\n            /** @type {Declaration[]} */\n            const nodes = [];\n            for (let ti = 0; ti < toParse.length; ti++) {\n                nodes.push(transformDeclaration.call(self, toParse[ti]));\n            }\n            return nodes;\n        }\n    }\n\n    rulesets() {\n        if (!this.rules) { return []; }\n\n        /** @type {Node[]} */\n        const filtRules = [];\n        const rules = this.rules;\n        /** @type {number} */\n        let i;\n        /** @type {Node} */\n        let rule;\n\n        for (i = 0; (rule = rules[i]); i++) {\n            if (/** @type {RuleNode} */ (rule).isRuleset) {\n                filtRules.push(rule);\n            }\n        }\n\n        return filtRules;\n    }\n\n    /** @param {Node} rule */\n    prependRule(rule) {\n        const rules = this.rules;\n        if (rules) {\n            rules.unshift(rule);\n        } else {\n            this.rules = [ rule ];\n        }\n        this.setParent(rule, this);\n    }\n\n    /**\n     * @param {Selector} selector\n     * @param {Ruleset | null} [self]\n     * @param {((rule: Node) => boolean)} [filter]\n     * @returns {{ rule: Node, path: Node[] }[]}\n     */\n    find(selector, self, filter) {\n        self = self || this;\n        /** @type {{ rule: Node, path: Node[] }[]} */\n        const rules = [];\n        /** @type {number | undefined} */\n        let match;\n        /** @type {{ rule: Node, path: Node[] }[]} */\n        let foundMixins;\n        const key = selector.toCSS(/** @type {EvalContext} */ ({}));\n\n        if (key in this._lookups) { return /** @type {{ rule: Node, path: Node[] }[]} */ (this._lookups[key]); }\n\n        this.rulesets().forEach(function (rule) {\n            if (rule !== self) {\n                for (let j = 0; j < /** @type {RuleNode} */ (rule).selectors.length; j++) {\n                    match = selector.match(/** @type {RuleNode} */ (rule).selectors[j]);\n                    if (match) {\n                        if (selector.elements.length > match) {\n                            if (!filter || filter(rule)) {\n                                foundMixins = /** @type {Ruleset} */ (/** @type {unknown} */ (rule)).find(new Selector(selector.elements.slice(match)), self, filter);\n                                for (let i = 0; i < foundMixins.length; ++i) {\n                                    foundMixins[i].path.push(rule);\n                                }\n                                Array.prototype.push.apply(rules, foundMixins);\n                            }\n                        } else {\n                            rules.push({ rule, path: []});\n                        }\n                        break;\n                    }\n                }\n            }\n        });\n        this._lookups[key] = rules;\n        return rules;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        /** @type {number} */\n        let i;\n        /** @type {number} */\n        let j;\n        /** @type {Node[]} */\n        const charsetRuleNodes = [];\n        /** @type {Node[]} */\n        let ruleNodes = [];\n\n        let // Line number debugging\n            debugInfo;\n\n        /** @type {Node} */\n        let rule;\n        /** @type {Selector[]} */\n        let path;\n\n        context.tabLevel = (context.tabLevel || 0);\n\n        if (!this.root) {\n            context.tabLevel++;\n        }\n\n        const tabRuleStr = context.compress ? '' : Array(context.tabLevel + 1).join('  ');\n        const tabSetStr = context.compress ? '' : Array(context.tabLevel).join('  ');\n        /** @type {string} */\n        let sep;\n\n        let charsetNodeIndex = 0;\n        let importNodeIndex = 0;\n        for (i = 0; (rule = /** @type {Node[]} */ (this.rules)[i]); i++) {\n            if (rule instanceof Comment) {\n                if (importNodeIndex === i) {\n                    importNodeIndex++;\n                }\n                ruleNodes.push(rule);\n            } else if (/** @type {RuleNode} */ (rule).isCharset && /** @type {RuleNode} */ (rule).isCharset()) {\n                ruleNodes.splice(charsetNodeIndex, 0, rule);\n                charsetNodeIndex++;\n                importNodeIndex++;\n            } else if (rule.type === 'Import') {\n                ruleNodes.splice(importNodeIndex, 0, rule);\n                importNodeIndex++;\n            } else {\n                ruleNodes.push(rule);\n            }\n        }\n        ruleNodes = charsetRuleNodes.concat(ruleNodes);\n\n        // If this is the root node, we don't render\n        // a selector, or {}.\n        if (!this.root) {\n            debugInfo = getDebugInfo(context, /** @type {{ debugInfo: { lineNumber: number, fileName: string } }} */ (/** @type {unknown} */ (this)), tabSetStr);\n\n            if (debugInfo) {\n                output.add(debugInfo);\n                output.add(tabSetStr);\n            }\n\n            const paths = /** @type {Selector[][]} */ (this.paths);\n            const pathCnt = paths.length;\n            /** @type {number} */\n            let pathSubCnt;\n\n            sep = context.compress ? ',' : (`,\\n${tabSetStr}`);\n\n            for (i = 0; i < pathCnt; i++) {\n                path = paths[i];\n                if (!(pathSubCnt = path.length)) { continue; }\n                if (i > 0) { output.add(sep); }\n\n                /** @type {EvalContext & { firstSelector?: boolean }} */ (context).firstSelector = true;\n                path[0].genCSS(context, output);\n\n                /** @type {EvalContext & { firstSelector?: boolean }} */ (context).firstSelector = false;\n                for (j = 1; j < pathSubCnt; j++) {\n                    path[j].genCSS(context, output);\n                }\n            }\n\n            output.add((context.compress ? '{' : ' {\\n') + tabRuleStr);\n        }\n\n        // Compile rules and rulesets\n        for (i = 0; (rule = ruleNodes[i]); i++) {\n\n            if (i + 1 === ruleNodes.length) {\n                context.lastRule = true;\n            }\n\n            const currentLastRule = context.lastRule;\n            if (rule.isRulesetLike()) {\n                context.lastRule = false;\n            }\n\n            if (rule.genCSS) {\n                rule.genCSS(context, output);\n            } else if (rule.value) {\n                output.add(/** @type {string} */ (rule.value).toString());\n            }\n\n            context.lastRule = currentLastRule;\n\n            if (!context.lastRule && rule.isVisible()) {\n                output.add(context.compress ? '' : (`\\n${tabRuleStr}`));\n            } else {\n                context.lastRule = false;\n            }\n        }\n\n        if (!this.root) {\n            output.add((context.compress ? '}' : `\\n${tabSetStr}}`));\n            context.tabLevel--;\n        }\n\n        if (!output.isEmpty() && !context.compress && this.firstRoot) {\n            output.add('\\n');\n        }\n    }\n\n    /**\n     * @param {Selector[][]} paths\n     * @param {Selector[][]} context\n     * @param {Selector[]} selectors\n     */\n    joinSelectors(paths, context, selectors) {\n        for (let s = 0; s < selectors.length; s++) {\n            this.joinSelector(paths, context, selectors[s]);\n        }\n    }\n\n    /**\n     * @param {Selector[][]} paths\n     * @param {Selector[][]} context\n     * @param {Selector} selector\n     */\n    joinSelector(paths, context, selector) {\n\n        /**\n         * @param {Selector[]} elementsToPak\n         * @param {Element} originalElement\n         * @returns {Paren}\n         */\n        function createParenthesis(elementsToPak, originalElement) {\n            /** @type {Paren} */\n            let replacementParen;\n            /** @type {number} */\n            let j;\n            if (elementsToPak.length === 0) {\n                replacementParen = new Paren(elementsToPak[0]);\n            } else {\n                const insideParent = new Array(elementsToPak.length);\n                for (j = 0; j < elementsToPak.length; j++) {\n                    insideParent[j] = new Element(\n                        null,\n                        elementsToPak[j],\n                        originalElement.isVariable,\n                        originalElement._index,\n                        originalElement._fileInfo\n                    );\n                }\n                replacementParen = new Paren(new Selector(insideParent));\n            }\n            return replacementParen;\n        }\n\n        /**\n         * @param {Paren | Selector} containedElement\n         * @param {Element} originalElement\n         * @returns {Selector}\n         */\n        function createSelector(containedElement, originalElement) {\n            /** @type {Element} */\n            let element;\n            /** @type {Selector} */\n            let selector;\n            element = new Element(null, containedElement, originalElement.isVariable, originalElement._index, originalElement._fileInfo);\n            selector = new Selector([element]);\n            return selector;\n        }\n\n        /**\n         * @param {Selector[]} beginningPath\n         * @param {Selector[]} addPath\n         * @param {Element} replacedElement\n         * @param {Selector} originalSelector\n         * @returns {Selector[]}\n         */\n        function addReplacementIntoPath(beginningPath, addPath, replacedElement, originalSelector) {\n            /** @type {Selector[]} */\n            let newSelectorPath;\n            /** @type {Selector} */\n            let lastSelector;\n            /** @type {Selector} */\n            let newJoinedSelector;\n            // our new selector path\n            newSelectorPath = [];\n\n            // construct the joined selector - if & is the first thing this will be empty,\n            // if not newJoinedSelector will be the last set of elements in the selector\n            if (beginningPath.length > 0) {\n                newSelectorPath = utils.copyArray(beginningPath);\n                lastSelector = newSelectorPath.pop();\n                newJoinedSelector = originalSelector.createDerived(utils.copyArray(lastSelector.elements));\n            }\n            else {\n                newJoinedSelector = originalSelector.createDerived([]);\n            }\n\n            if (addPath.length > 0) {\n                // /deep/ is a CSS4 selector - (removed, so should deprecate)\n                // that is valid without anything in front of it\n                // so if the & does not have a combinator that is \"\" or \" \" then\n                // and there is a combinator on the parent, then grab that.\n                // this also allows + a { & .b { .a & { ... though not sure why you would want to do that\n                let combinator = replacedElement.combinator;\n\n                const parentEl = addPath[0].elements[0];\n                if (combinator.emptyOrWhitespace && !parentEl.combinator.emptyOrWhitespace) {\n                    combinator = parentEl.combinator;\n                }\n                // join the elements so far with the first part of the parent\n                newJoinedSelector.elements.push(new Element(\n                    combinator,\n                    parentEl.value,\n                    replacedElement.isVariable,\n                    replacedElement._index,\n                    replacedElement._fileInfo\n                ));\n                newJoinedSelector.elements = newJoinedSelector.elements.concat(addPath[0].elements.slice(1));\n            }\n\n            // now add the joined selector - but only if it is not empty\n            if (newJoinedSelector.elements.length !== 0) {\n                newSelectorPath.push(newJoinedSelector);\n            }\n\n            // put together the parent selectors after the join (e.g. the rest of the parent)\n            if (addPath.length > 1) {\n                let restOfPath = addPath.slice(1);\n                restOfPath = restOfPath.map(function (/** @type {Selector} */ selector) {\n                    return selector.createDerived(selector.elements, []);\n                });\n                newSelectorPath = newSelectorPath.concat(restOfPath);\n            }\n            return newSelectorPath;\n        }\n\n        /**\n         * @param {Selector[][]} beginningPath\n         * @param {Selector[]} addPaths\n         * @param {Element} replacedElement\n         * @param {Selector} originalSelector\n         * @param {Selector[][]} result\n         * @returns {Selector[][]}\n         */\n        function addAllReplacementsIntoPath( beginningPath, addPaths, replacedElement, originalSelector, result) {\n            /** @type {number} */\n            let j;\n            for (j = 0; j < beginningPath.length; j++) {\n                const newSelectorPath = addReplacementIntoPath(beginningPath[j], addPaths, replacedElement, originalSelector);\n                result.push(newSelectorPath);\n            }\n            return result;\n        }\n\n        /**\n         * @param {Element[]} elements\n         * @param {Selector[][]} selectors\n         */\n        function mergeElementsOnToSelectors(elements, selectors) {\n            /** @type {number} */\n            let i;\n            /** @type {Selector[]} */\n            let sel;\n\n            if (elements.length === 0) {\n                return ;\n            }\n            if (selectors.length === 0) {\n                selectors.push([ new Selector(elements) ]);\n                return;\n            }\n\n            for (i = 0; (sel = selectors[i]); i++) {\n                // if the previous thing in sel is a parent this needs to join on to it\n                if (sel.length > 0) {\n                    sel[sel.length - 1] = sel[sel.length - 1].createDerived(sel[sel.length - 1].elements.concat(elements));\n                }\n                else {\n                    sel.push(new Selector(elements));\n                }\n            }\n        }\n\n        /**\n         * @param {Selector[][]} paths\n         * @param {Selector[][]} context\n         * @param {Selector} inSelector\n         * @returns {boolean}\n         */\n        function replaceParentSelector(paths, context, inSelector) {\n            // The paths are [[Selector]]\n            // The first list is a list of comma separated selectors\n            // The inner list is a list of inheritance separated selectors\n            // e.g.\n            // .a, .b {\n            //   .c {\n            //   }\n            // }\n            // == [[.a] [.c]] [[.b] [.c]]\n            //\n            /** @type {number} */\n            let i;\n            /** @type {number} */\n            let j;\n            /** @type {number} */\n            let k;\n            /** @type {Element[]} */\n            let currentElements;\n            /** @type {Selector[][]} */\n            let newSelectors;\n            /** @type {Selector[][]} */\n            let selectorsMultiplied;\n            /** @type {Selector[]} */\n            let sel;\n            /** @type {Element} */\n            let el;\n            let hadParentSelector = false;\n            /** @type {number} */\n            let length;\n            /** @type {Selector} */\n            let lastSelector;\n\n            /**\n             * @param {Element} element\n             * @returns {Selector | null}\n             */\n            function findNestedSelector(element) {\n                /** @type {Node} */\n                let maybeSelector;\n                if (!(element.value instanceof Paren)) {\n                    return null;\n                }\n\n                maybeSelector = /** @type {Node} */ (element.value.value);\n                if (!(maybeSelector instanceof Selector)) {\n                    return null;\n                }\n\n                return maybeSelector;\n            }\n\n            // the elements from the current selector so far\n            currentElements = [];\n            // the current list of new selectors to add to the path.\n            // We will build it up. We initiate it with one empty selector as we \"multiply\" the new selectors\n            // by the parents\n            newSelectors = [\n                []\n            ];\n\n            for (i = 0; (el = inSelector.elements[i]); i++) {\n                // non parent reference elements just get added\n                if (el.value !== '&') {\n                    const nestedSelector = findNestedSelector(el);\n                    if (nestedSelector !== null) {\n                        // merge the current list of non parent selector elements\n                        // on to the current list of selectors to add\n                        mergeElementsOnToSelectors(currentElements, newSelectors);\n\n                        /** @type {Selector[][]} */\n                        const nestedPaths = [];\n                        /** @type {boolean | undefined} */\n                        let replaced;\n                        /** @type {Selector[][]} */\n                        const replacedNewSelectors = [];\n\n                        // Check if this is a comma-separated selector list inside the paren\n                        // e.g. :not(&.a, &.b) produces Selector([Selector, Anonymous(','), Selector])\n                        const hasSubSelectors = nestedSelector.elements.some(e => e instanceof Selector);\n\n                        if (hasSubSelectors) {\n                            // Process each sub-selector individually\n                            /** @type {(Element | Selector)[]} */\n                            const resolvedElements = [];\n                            for (const subEl of nestedSelector.elements) {\n                                if (subEl instanceof Selector) {\n                                    /** @type {Selector[][]} */\n                                    const subPaths = [];\n                                    const subReplaced = replaceParentSelector(subPaths, context, subEl);\n                                    replaced = replaced || subReplaced;\n                                    if (subPaths.length > 0 && subPaths[0].length > 0) {\n                                        resolvedElements.push(subPaths[0][0]);\n                                    } else {\n                                        resolvedElements.push(subEl);\n                                    }\n                                } else {\n                                    resolvedElements.push(subEl);\n                                }\n                            }\n                            hadParentSelector = hadParentSelector || /** @type {boolean} */ (replaced);\n                            const resolvedNestedSelector = new Selector(resolvedElements);\n                            const replacementSelector = createSelector(createParenthesis([resolvedNestedSelector], el), el);\n                            addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n                        } else {\n                            replaced = replaceParentSelector(nestedPaths, context, nestedSelector);\n                            hadParentSelector = hadParentSelector || replaced;\n                            // the nestedPaths array should have only one member - replaceParentSelector does not multiply selectors\n                            for (k = 0; k < nestedPaths.length; k++) {\n                                const replacementSelector = createSelector(createParenthesis(nestedPaths[k], el), el);\n                                addAllReplacementsIntoPath(newSelectors, [replacementSelector], el, inSelector, replacedNewSelectors);\n                            }\n                        }\n                        newSelectors = replacedNewSelectors;\n                        currentElements = [];\n                    } else {\n                        currentElements.push(el);\n                    }\n\n                } else {\n                    hadParentSelector = true;\n                    // the new list of selectors to add\n                    selectorsMultiplied = [];\n\n                    // merge the current list of non parent selector elements\n                    // on to the current list of selectors to add\n                    mergeElementsOnToSelectors(currentElements, newSelectors);\n\n                    // loop through our current selectors\n                    for (j = 0; j < newSelectors.length; j++) {\n                        sel = newSelectors[j];\n                        // if we don't have any parent paths, the & might be in a mixin so that it can be used\n                        // whether there are parents or not\n                        if (context.length === 0) {\n                            // the combinator used on el should now be applied to the next element instead so that\n                            // it is not lost\n                            if (sel.length > 0) {\n                                sel[0].elements.push(new Element(el.combinator, '', el.isVariable, el._index, el._fileInfo));\n                            }\n                            selectorsMultiplied.push(sel);\n                        }\n                        else {\n                            // and the parent selectors\n                            for (k = 0; k < context.length; k++) {\n                                // We need to put the current selectors\n                                // then join the last selector's elements on to the parents selectors\n                                const newSelectorPath = addReplacementIntoPath(sel, context[k], el, inSelector);\n                                // add that to our new set of selectors\n                                selectorsMultiplied.push(newSelectorPath);\n                            }\n                        }\n                    }\n\n                    // our new selectors has been multiplied, so reset the state\n                    newSelectors = selectorsMultiplied;\n                    currentElements = [];\n                }\n            }\n\n            // if we have any elements left over (e.g. .a& .b == .b)\n            // add them on to all the current selectors\n            mergeElementsOnToSelectors(currentElements, newSelectors);\n\n            for (i = 0; i < newSelectors.length; i++) {\n                length = newSelectors[i].length;\n                if (length > 0) {\n                    paths.push(newSelectors[i]);\n                    lastSelector = newSelectors[i][length - 1];\n                    newSelectors[i][length - 1] = lastSelector.createDerived(lastSelector.elements, inSelector.extendList);\n                }\n            }\n\n            return hadParentSelector;\n        }\n\n        /**\n         * @param {VisibilityInfo} visibilityInfo\n         * @param {Selector} deriveFrom\n         */\n        function deriveSelector(visibilityInfo, deriveFrom) {\n            const newSelector = deriveFrom.createDerived(deriveFrom.elements, deriveFrom.extendList, deriveFrom.evaldCondition);\n            newSelector.copyVisibilityInfo(visibilityInfo);\n            return newSelector;\n        }\n\n        // joinSelector code follows\n        /** @type {number} */\n        let i;\n        /** @type {Selector[][]} */\n        let newPaths;\n        /** @type {boolean} */\n        let hadParentSelector;\n\n        newPaths = [];\n        hadParentSelector = replaceParentSelector(newPaths, context, selector);\n\n        if (!hadParentSelector) {\n            if (context.length > 0) {\n                newPaths = [];\n                for (i = 0; i < context.length; i++) {\n\n                    const concatenated = context[i].map(deriveSelector.bind(this, selector.visibilityInfo()));\n\n                    concatenated.push(selector);\n                    newPaths.push(concatenated);\n                }\n            }\n            else {\n                newPaths = [[selector]];\n            }\n        }\n\n        for (i = 0; i < newPaths.length; i++) {\n            paths.push(newPaths[i]);\n        }\n\n    }\n}\n\nexport default Ruleset;\n"
  },
  {
    "path": "packages/less/lib/less/tree/selector.js",
    "content": "// @ts-check\nimport Node from './node.js';\nimport Element from './element.js';\nimport LessError from '../less-error.js';\nimport * as utils from '../utils.js';\nimport Parser from '../parser/parser.js';\n\n/** @import { EvalContext, CSSOutput, FileInfo, VisibilityInfo, TreeVisitor } from './node.js' */\n\nclass Selector extends Node {\n    get type() { return 'Selector'; }\n\n    /**\n     * @param {(Element | Selector)[] | string} [elements]\n     * @param {Node[] | null} [extendList]\n     * @param {Node | null} [condition]\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     * @param {VisibilityInfo} [visibilityInfo]\n     */\n    constructor(elements, extendList, condition, index, currentFileInfo, visibilityInfo) {\n        super();\n        /** @type {Node[] | null | undefined} */\n        this.extendList = extendList;\n        /** @type {Node | null | undefined} */\n        this.condition = condition;\n        /** @type {boolean | Node} */\n        this.evaldCondition = !condition;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {Element[]} */\n        this.elements = this.getElements(elements);\n        /** @type {string[] | undefined} */\n        this.mixinElements_ = undefined;\n        /** @type {boolean | undefined} */\n        this.mediaEmpty = undefined;\n        this.copyVisibilityInfo(visibilityInfo);\n        this.setParent(this.elements, this);\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        if (this.elements) {\n            this.elements = /** @type {Element[]} */ (visitor.visitArray(this.elements));\n        }\n        if (this.extendList) {\n            this.extendList = visitor.visitArray(this.extendList);\n        }\n        if (this.condition) {\n            this.condition = visitor.visit(this.condition);\n        }\n    }\n\n    /**\n     * @param {Element[]} elements\n     * @param {Node[] | null} [extendList]\n     * @param {boolean | Node} [evaldCondition]\n     */\n    createDerived(elements, extendList, evaldCondition) {\n        elements = this.getElements(elements);\n        const newSelector = new Selector(elements, extendList || this.extendList,\n            null, this.getIndex(), this.fileInfo(), this.visibilityInfo());\n        newSelector.evaldCondition = (!utils.isNullOrUndefined(evaldCondition)) ? evaldCondition : this.evaldCondition;\n        newSelector.mediaEmpty = this.mediaEmpty;\n        return newSelector;\n    }\n\n    /**\n     * @param {(Element | Selector)[] | string | null | undefined} els\n     * @returns {Element[]}\n     */\n    getElements(els) {\n        if (!els) {\n            return [new Element('', '&', false, this._index, this._fileInfo)];\n        }\n        if (typeof els === 'string') {\n            const fileInfo = this._fileInfo;\n            const parse = this.parse;\n            new (/** @type {new (...args: unknown[]) => { parseNode: Function }} */ (/** @type {unknown} */ (Parser)))(parse.context, parse.importManager, fileInfo, this._index).parseNode(\n                els,\n                ['selector'],\n                function(/** @type {{ index: number, message: string } | null} */ err, /** @type {Selector[]} */ result) {\n                    if (err) {\n                        throw new LessError({\n                            index: err.index,\n                            message: err.message\n                        }, parse.imports, /** @type {string} */ (/** @type {FileInfo} */ (fileInfo).filename));\n                    }\n                    els = result[0].elements;\n                });\n        }\n        return /** @type {Element[]} */ (els);\n    }\n\n    createEmptySelectors() {\n        const el = new Element('', '&', false, this._index, this._fileInfo), sels = [new Selector([el], null, null, this._index, this._fileInfo)];\n        sels[0].mediaEmpty = true;\n        return sels;\n    }\n\n    /**\n     * @param {Selector} other\n     * @returns {number}\n     */\n    match(other) {\n        const elements = this.elements;\n        const len = elements.length;\n        let olen;\n        let i;\n\n        /** @type {string[]} */\n        const mixinEls = other.mixinElements();\n        olen = mixinEls.length;\n        if (olen === 0 || len < olen) {\n            return 0;\n        } else {\n            for (i = 0; i < olen; i++) {\n                if (elements[i].value !== mixinEls[i]) {\n                    return 0;\n                }\n            }\n        }\n\n        return olen; // return number of matched elements\n    }\n\n    /** @returns {string[]} */\n    mixinElements() {\n        if (this.mixinElements_) {\n            return this.mixinElements_;\n        }\n\n        /** @type {string[] | null} */\n        let elements = this.elements.map( function(v) {\n            return /** @type {string} */ (v.combinator.value) + (/** @type {{ value: string }} */ (v.value).value || v.value);\n        }).join('').match(/[,&#*.\\w-]([\\w-]|(\\\\.))*/g);\n\n        if (elements) {\n            if (elements[0] === '&') {\n                elements.shift();\n            }\n        } else {\n            elements = [];\n        }\n\n        return (this.mixinElements_ = elements);\n    }\n\n    isJustParentSelector() {\n        return !this.mediaEmpty &&\n            this.elements.length === 1 &&\n            this.elements[0].value === '&' &&\n            (this.elements[0].combinator.value === ' ' || this.elements[0].combinator.value === '');\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        const evaldCondition = this.condition && this.condition.eval(context);\n        let elements = this.elements;\n        /** @type {Node[] | null | undefined} */\n        let extendList = this.extendList;\n\n        if (elements) {\n            const evaldElements = new Array(elements.length);\n            for (let i = 0; i < elements.length; i++) {\n                evaldElements[i] = elements[i].eval(context);\n            }\n            elements = evaldElements;\n        }\n        if (extendList) {\n            const evaldExtends = new Array(extendList.length);\n            for (let i = 0; i < extendList.length; i++) {\n                evaldExtends[i] = extendList[i].eval(context);\n            }\n            extendList = evaldExtends;\n        }\n\n        return this.createDerived(elements, extendList, evaldCondition);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        let i, element;\n        if ((!context || !/** @type {EvalContext & { firstSelector?: boolean }} */ (context).firstSelector) && this.elements[0].combinator.value === '') {\n            output.add(' ', this.fileInfo(), this.getIndex());\n        }\n        for (i = 0; i < this.elements.length; i++) {\n            element = this.elements[i];\n            element.genCSS(context, output);\n        }\n    }\n\n    getIsOutput() {\n        return this.evaldCondition;\n    }\n}\n\nexport default Selector;\n"
  },
  {
    "path": "packages/less/lib/less/tree/unicode-descriptor.js",
    "content": "// @ts-check\nimport Node from './node.js';\n\nclass UnicodeDescriptor extends Node {\n    get type() { return 'UnicodeDescriptor'; }\n\n    /** @param {string} value */\n    constructor(value) {\n        super();\n        this.value = value;\n    }\n}\n\nexport default UnicodeDescriptor;\n"
  },
  {
    "path": "packages/less/lib/less/tree/unit.js",
    "content": "// @ts-check\nimport Node from './node.js';\nimport unitConversions from '../data/unit-conversions.js';\nimport * as utils from '../utils.js';\n\n/** @import { EvalContext, CSSOutput } from './node.js' */\n\nclass Unit extends Node {\n    get type() { return 'Unit'; }\n\n    /**\n     * @param {string[]} [numerator]\n     * @param {string[]} [denominator]\n     * @param {string} [backupUnit]\n     */\n    constructor(numerator, denominator, backupUnit) {\n        super();\n        /** @type {string[]} */\n        this.numerator = numerator ? utils.copyArray(numerator).sort() : [];\n        /** @type {string[]} */\n        this.denominator = denominator ? utils.copyArray(denominator).sort() : [];\n        if (backupUnit) {\n            /** @type {string | undefined} */\n            this.backupUnit = backupUnit;\n        } else if (numerator && numerator.length) {\n            this.backupUnit = numerator[0];\n        }\n    }\n\n    clone() {\n        return new Unit(utils.copyArray(this.numerator), utils.copyArray(this.denominator), this.backupUnit);\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        // Dimension checks the unit is singular and throws an error if in strict math mode.\n        const strictUnits = context && context.strictUnits;\n        if (this.numerator.length === 1) {\n            output.add(this.numerator[0]); // the ideal situation\n        } else if (!strictUnits && this.backupUnit) {\n            output.add(this.backupUnit);\n        } else if (!strictUnits && this.denominator.length) {\n            output.add(this.denominator[0]);\n        }\n    }\n\n    toString() {\n        let i, returnStr = this.numerator.join('*');\n        for (i = 0; i < this.denominator.length; i++) {\n            returnStr += `/${this.denominator[i]}`;\n        }\n        return returnStr;\n    }\n\n    /**\n     * @param {Unit} other\n     * @returns {0 | undefined}\n     */\n    compare(other) {\n        return this.is(other.toString()) ? 0 : undefined;\n    }\n\n    /** @param {string} unitString */\n    is(unitString) {\n        return this.toString().toUpperCase() === unitString.toUpperCase();\n    }\n\n    isLength() {\n        return RegExp('^(px|em|ex|ch|rem|in|cm|mm|pc|pt|ex|vw|vh|vmin|vmax)$', 'gi').test(this.toCSS(/** @type {import('./node.js').EvalContext} */ ({})));\n    }\n\n    isEmpty() {\n        return this.numerator.length === 0 && this.denominator.length === 0;\n    }\n\n    isSingular() {\n        return this.numerator.length <= 1 && this.denominator.length === 0;\n    }\n\n    /** @param {(atomicUnit: string, denominator: boolean) => string} callback */\n    map(callback) {\n        let i;\n\n        for (i = 0; i < this.numerator.length; i++) {\n            this.numerator[i] = callback(this.numerator[i], false);\n        }\n\n        for (i = 0; i < this.denominator.length; i++) {\n            this.denominator[i] = callback(this.denominator[i], true);\n        }\n    }\n\n    /** @returns {{ [groupName: string]: string }} */\n    usedUnits() {\n        /** @type {{ [unitName: string]: number }} */\n        let group;\n        /** @type {{ [groupName: string]: string }} */\n        const result = {};\n        /** @type {(atomicUnit: string) => string} */\n        let mapUnit;\n        /** @type {string} */\n        let groupName;\n\n        mapUnit = function (atomicUnit) {\n            // eslint-disable-next-line no-prototype-builtins\n            if (group.hasOwnProperty(atomicUnit) && !result[groupName]) {\n                result[groupName] = atomicUnit;\n            }\n\n            return atomicUnit;\n        };\n\n        for (groupName in unitConversions) {\n            // eslint-disable-next-line no-prototype-builtins\n            if (unitConversions.hasOwnProperty(groupName)) {\n                group = /** @type {{ [unitName: string]: number }} */ (unitConversions[/** @type {keyof typeof unitConversions} */ (groupName)]);\n\n                this.map(mapUnit);\n            }\n        }\n\n        return result;\n    }\n\n    cancel() {\n        /** @type {{ [unit: string]: number }} */\n        const counter = {};\n        /** @type {string} */\n        let atomicUnit;\n        let i;\n\n        for (i = 0; i < this.numerator.length; i++) {\n            atomicUnit = this.numerator[i];\n            counter[atomicUnit] = (counter[atomicUnit] || 0) + 1;\n        }\n\n        for (i = 0; i < this.denominator.length; i++) {\n            atomicUnit = this.denominator[i];\n            counter[atomicUnit] = (counter[atomicUnit] || 0) - 1;\n        }\n\n        this.numerator = [];\n        this.denominator = [];\n\n        for (atomicUnit in counter) {\n            // eslint-disable-next-line no-prototype-builtins\n            if (counter.hasOwnProperty(atomicUnit)) {\n                const count = counter[atomicUnit];\n\n                if (count > 0) {\n                    for (i = 0; i < count; i++) {\n                        this.numerator.push(atomicUnit);\n                    }\n                } else if (count < 0) {\n                    for (i = 0; i < -count; i++) {\n                        this.denominator.push(atomicUnit);\n                    }\n                }\n            }\n        }\n\n        this.numerator.sort();\n        this.denominator.sort();\n    }\n}\n\nexport default Unit;\n"
  },
  {
    "path": "packages/less/lib/less/tree/url.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor, FileInfo } from './node.js' */\nimport Node from './node.js';\n\n/**\n * @param {string} path\n * @returns {string}\n */\nfunction escapePath(path) {\n    return path.replace(/[()'\"\\s]/g, function(match) { return `\\\\${match}`; });\n}\n\nclass URL extends Node {\n    get type() { return 'Url'; }\n\n    /**\n     * @param {Node} val\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     * @param {boolean} [isEvald]\n     */\n    constructor(val, index, currentFileInfo, isEvald) {\n        super();\n        this.value = val;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {boolean | undefined} */\n        this.isEvald = isEvald;\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        this.value = visitor.visit(/** @type {Node} */ (this.value));\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        output.add('url(');\n        /** @type {Node} */ (this.value).genCSS(context, output);\n        output.add(')');\n    }\n\n    /** @param {EvalContext} context */\n    eval(context) {\n        const val = /** @type {Node} */ (this.value).eval(context);\n        let rootpath;\n\n        if (!this.isEvald) {\n            // Add the rootpath if the URL requires a rewrite\n            rootpath = this.fileInfo() && this.fileInfo().rootpath;\n            if (typeof rootpath === 'string' &&\n                typeof val.value === 'string' &&\n                context.pathRequiresRewrite(/** @type {string} */ (val.value))) {\n                if (!/** @type {import('./quoted.js').default} */ (val).quote) {\n                    rootpath = escapePath(rootpath);\n                }\n                val.value = context.rewritePath(/** @type {string} */ (val.value), rootpath);\n            } else {\n                val.value = context.normalizePath(/** @type {string} */ (val.value));\n            }\n\n            // Add url args if enabled\n            if (context.urlArgs) {\n                if (!/** @type {string} */ (val.value).match(/^\\s*data:/)) {\n                    const delimiter = /** @type {string} */ (val.value).indexOf('?') === -1 ? '?' : '&';\n                    const urlArgs = delimiter + context.urlArgs;\n                    if (/** @type {string} */ (val.value).indexOf('#') !== -1) {\n                        val.value = /** @type {string} */ (val.value).replace('#', `${urlArgs}#`);\n                    } else {\n                        val.value += urlArgs;\n                    }\n                }\n            }\n        }\n\n        return new URL(val, this.getIndex(), this.fileInfo(), true);\n    }\n}\n\nexport default URL;\n"
  },
  {
    "path": "packages/less/lib/less/tree/value.js",
    "content": "// @ts-check\n/** @import { EvalContext, CSSOutput, TreeVisitor } from './node.js' */\nimport Node from './node.js';\n\nclass Value extends Node {\n    get type() { return 'Value'; }\n\n    /** @param {Node[] | Node} value */\n    constructor(value) {\n        super();\n        if (!value) {\n            throw new Error('Value requires an array argument');\n        }\n        if (!Array.isArray(value)) {\n            this.value = [ value ];\n        }\n        else {\n            this.value = value;\n        }\n    }\n\n    /** @param {TreeVisitor} visitor */\n    accept(visitor) {\n        if (this.value) {\n            this.value = visitor.visitArray(/** @type {Node[]} */ (this.value));\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        const value = /** @type {Node[]} */ (this.value);\n        if (value.length === 1) {\n            return value[0].eval(context);\n        } else {\n            return new Value(value.map(function (v) {\n                return v.eval(context);\n            }));\n        }\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @param {CSSOutput} output\n     */\n    genCSS(context, output) {\n        const value = /** @type {Node[]} */ (this.value);\n        let i;\n        for (i = 0; i < value.length; i++) {\n            value[i].genCSS(context, output);\n            if (i + 1 < value.length) {\n                output.add((context && context.compress) ? ',' : ', ');\n            }\n        }\n    }\n}\n\nexport default Value;\n"
  },
  {
    "path": "packages/less/lib/less/tree/variable-call.js",
    "content": "// @ts-check\n/** @import { EvalContext, FileInfo } from './node.js' */\nimport Node from './node.js';\nimport Variable from './variable.js';\nimport Ruleset from './ruleset.js';\nimport DetachedRuleset from './detached-ruleset.js';\nimport LessError from '../less-error.js';\n\nclass VariableCall extends Node {\n    get type() { return 'VariableCall'; }\n\n    /**\n     * @param {string} variable\n     * @param {number} index\n     * @param {FileInfo} currentFileInfo\n     */\n    constructor(variable, index, currentFileInfo) {\n        super();\n        this.variable = variable;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        this.allowRoot = true;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        let rules;\n        /** @type {DetachedRuleset | Node} */\n        let detachedRuleset = new Variable(this.variable, this.getIndex(), this.fileInfo()).eval(context);\n        const error = new LessError({message: `Could not evaluate variable call ${this.variable}`});\n\n        if (!(/** @type {DetachedRuleset} */ (detachedRuleset)).ruleset) {\n            const dr = /** @type {Node & { rules?: Node[] }} */ (detachedRuleset);\n            if (dr.rules) {\n                rules = detachedRuleset;\n            }\n            else if (Array.isArray(detachedRuleset)) {\n                rules = new Ruleset(null, detachedRuleset);\n            }\n            else if (Array.isArray(detachedRuleset.value)) {\n                rules = new Ruleset(null, detachedRuleset.value);\n            }\n            else {\n                throw error;\n            }\n            detachedRuleset = new DetachedRuleset(rules);\n        }\n\n        const dr = /** @type {DetachedRuleset} */ (detachedRuleset);\n        if (dr.ruleset) {\n            return dr.callEval(context);\n        }\n        throw error;\n    }\n}\n\nexport default VariableCall;\n"
  },
  {
    "path": "packages/less/lib/less/tree/variable.js",
    "content": "// @ts-check\n/** @import { EvalContext, FileInfo } from './node.js' */\nimport Node from './node.js';\nimport Call from './call.js';\nimport Ruleset from './ruleset.js';\n\nclass Variable extends Node {\n    get type() { return 'Variable'; }\n\n    /**\n     * @param {string} name\n     * @param {number} [index]\n     * @param {FileInfo} [currentFileInfo]\n     */\n    constructor(name, index, currentFileInfo) {\n        super();\n        this.name = name;\n        this._index = index;\n        this._fileInfo = currentFileInfo;\n        /** @type {boolean | undefined} */\n        this.evaluating = undefined;\n    }\n\n    /**\n     * @param {EvalContext} context\n     * @returns {Node}\n     */\n    eval(context) {\n        let variable, name = this.name;\n\n        if (name.indexOf('@@') === 0) {\n            name = `@${new Variable(name.slice(1), this.getIndex(), this.fileInfo()).eval(context).value}`;\n        }\n\n        if (this.evaluating) {\n            throw { type: 'Name',\n                message: `Recursive variable definition for ${name}`,\n                filename: this.fileInfo().filename,\n                index: this.getIndex() };\n        }\n\n        this.evaluating = true;\n\n        variable = this.find(context.frames, function (frame) {\n            const v = /** @type {Ruleset} */ (frame).variable(name);\n            if (v) {\n                if (v.important) {\n                    const importantScope = context.importantScope[context.importantScope.length - 1];\n                    importantScope.important = v.important;\n                }\n                // If in calc, wrap vars in a function call to cascade evaluate args first\n                if (context.inCalc) {\n                    return (new Call('_SELF', [v.value], 0, undefined)).eval(context);\n                }\n                else {\n                    return v.value.eval(context);\n                }\n            }\n        });\n        if (variable) {\n            this.evaluating = false;\n            return variable;\n        } else {\n            throw { type: 'Name',\n                message: `variable ${name} is undefined`,\n                filename: this.fileInfo().filename,\n                index: this.getIndex() };\n        }\n    }\n\n    /**\n     * @param {Node[]} obj\n     * @param {(frame: Node) => Node | undefined} fun\n     * @returns {Node | null}\n     */\n    find(obj, fun) {\n        for (let i = 0, r; i < obj.length; i++) {\n            r = fun.call(obj, obj[i]);\n            if (r) { return r; }\n        }\n        return null;\n    }\n}\n\nexport default Variable;\n"
  },
  {
    "path": "packages/less/lib/less/utils.js",
    "content": "/* jshint proto: true */\nimport * as Constants from './constants.js';\nimport { copy } from 'copy-anything';\n\nexport function getLocation(index, inputStream) {\n    let n = index + 1;\n    let line = null;\n    let column = -1;\n\n    while (--n >= 0 && inputStream.charAt(n) !== '\\n') {\n        column++;\n    }\n\n    if (typeof index === 'number') {\n        line = (inputStream.slice(0, index).match(/\\n/g) || '').length;\n    }\n\n    return {\n        line,\n        column\n    };\n}\n\nexport function copyArray(arr) {\n    let i;\n    const length = arr.length;\n    const copy = new Array(length);\n\n    for (i = 0; i < length; i++) {\n        copy[i] = arr[i];\n    }\n    return copy;\n}\n\nexport function clone(obj) {\n    const cloned = {};\n    for (const prop in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n            cloned[prop] = obj[prop];\n        }\n    }\n    return cloned;\n}\n\nexport function defaults(obj1, obj2) {\n    let newObj = obj2 || {};\n    if (!obj2._defaults) {\n        newObj = {};\n        const defaults = copy(obj1);\n        newObj._defaults = defaults;\n        const cloned = obj2 ? copy(obj2) : {};\n        Object.assign(newObj, defaults, cloned);\n    }\n    return newObj;\n}\n\nexport function copyOptions(obj1, obj2) {\n    if (obj2 && obj2._defaults) {\n        return obj2;\n    }\n    const opts = defaults(obj1, obj2);\n    if (opts.strictMath) {\n        opts.math = Constants.Math.PARENS;\n    }\n    // Back compat with changed relativeUrls option\n    if (opts.relativeUrls) {\n        opts.rewriteUrls = Constants.RewriteUrls.ALL;\n    }\n    if (typeof opts.math === 'string') {\n        switch (opts.math.toLowerCase()) {\n            case 'always':\n                opts.math = Constants.Math.ALWAYS;\n                break;\n            case 'parens-division':\n                opts.math = Constants.Math.PARENS_DIVISION;\n                break;\n            case 'strict':\n            case 'parens':\n                opts.math = Constants.Math.PARENS;\n                break;\n            default:\n                opts.math = Constants.Math.PARENS;\n        }\n    }\n    if (typeof opts.rewriteUrls === 'string') {\n        switch (opts.rewriteUrls.toLowerCase()) {\n            case 'off':\n                opts.rewriteUrls = Constants.RewriteUrls.OFF;\n                break;\n            case 'local':\n                opts.rewriteUrls = Constants.RewriteUrls.LOCAL;\n                break;\n            case 'all':\n                opts.rewriteUrls = Constants.RewriteUrls.ALL;\n                break;\n        }\n    }\n    return opts;\n}\n\nexport function merge(obj1, obj2) {\n    for (const prop in obj2) {\n        if (Object.prototype.hasOwnProperty.call(obj2, prop)) {\n            obj1[prop] = obj2[prop];\n        }\n    }\n    return obj1;\n}\n\nexport function flattenArray(arr, result = []) {\n    for (let i = 0, length = arr.length; i < length; i++) {\n        const value = arr[i];\n        if (Array.isArray(value)) {\n            flattenArray(value, result);\n        } else {\n            if (value !== undefined) {\n                result.push(value);\n            }\n        }\n    }\n    return result;\n}\n\nexport function isNullOrUndefined(val) {\n    return val === null || val === undefined\n}"
  },
  {
    "path": "packages/less/lib/less/visitors/extend-visitor.js",
    "content": "/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree/index.js';\nimport Visitor from './visitor.js';\nimport logger from '../logger.js';\nimport * as utils from '../utils.js';\n\n/* jshint loopfunc:true */\n\nclass ExtendFinderVisitor {\n    constructor() {\n        this._visitor = new Visitor(this);\n        this.contexts = [];\n        this.allExtendsStack = [[]];\n    }\n\n    run(root) {\n        root = this._visitor.visit(root);\n        root.allExtends = this.allExtendsStack[0];\n        return root;\n    }\n\n    visitDeclaration(declNode, visitArgs) {\n        visitArgs.visitDeeper = false;\n    }\n\n    visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n        visitArgs.visitDeeper = false;\n    }\n\n    visitRuleset(rulesetNode, visitArgs) {\n        if (rulesetNode.root) {\n            return;\n        }\n\n        let i;\n        let j;\n        let extend;\n        const allSelectorsExtendList = [];\n        let extendList;\n\n        // get &:extend(.a); rules which apply to all selectors in this ruleset\n        const rules = rulesetNode.rules, ruleCnt = rules ? rules.length : 0;\n        for (i = 0; i < ruleCnt; i++) {\n            if (rulesetNode.rules[i] instanceof tree.Extend) {\n                allSelectorsExtendList.push(rules[i]);\n                rulesetNode.extendOnEveryPath = true;\n            }\n        }\n\n        // now find every selector and apply the extends that apply to all extends\n        // and the ones which apply to an individual extend\n        const paths = rulesetNode.paths;\n        for (i = 0; i < paths.length; i++) {\n            const selectorPath = paths[i], selector = selectorPath[selectorPath.length - 1], selExtendList = selector.extendList;\n\n            extendList = selExtendList ? utils.copyArray(selExtendList).concat(allSelectorsExtendList)\n                : allSelectorsExtendList;\n\n            if (extendList) {\n                extendList = extendList.map(function(allSelectorsExtend) {\n                    return allSelectorsExtend.clone();\n                });\n            }\n\n            for (j = 0; j < extendList.length; j++) {\n                this.foundExtends = true;\n                extend = extendList[j];\n                extend.findSelfSelectors(selectorPath);\n                extend.ruleset = rulesetNode;\n                if (j === 0) { extend.firstExtendOnThisSelectorPath = true; }\n                this.allExtendsStack[this.allExtendsStack.length - 1].push(extend);\n            }\n        }\n\n        this.contexts.push(rulesetNode.selectors);\n    }\n\n    visitRulesetOut(rulesetNode) {\n        if (!rulesetNode.root) {\n            this.contexts.length = this.contexts.length - 1;\n        }\n    }\n\n    visitMedia(mediaNode, visitArgs) {\n        mediaNode.allExtends = [];\n        this.allExtendsStack.push(mediaNode.allExtends);\n    }\n\n    visitMediaOut(mediaNode) {\n        this.allExtendsStack.length = this.allExtendsStack.length - 1;\n    }\n\n    visitAtRule(atRuleNode, visitArgs) {\n        atRuleNode.allExtends = [];\n        this.allExtendsStack.push(atRuleNode.allExtends);\n    }\n\n    visitAtRuleOut(atRuleNode) {\n        this.allExtendsStack.length = this.allExtendsStack.length - 1;\n    }\n}\n\nclass ProcessExtendsVisitor {\n    constructor() {\n        this._visitor = new Visitor(this);\n    }\n\n    run(root) {\n        const extendFinder = new ExtendFinderVisitor();\n        this.extendIndices = {};\n        extendFinder.run(root);\n        if (!extendFinder.foundExtends) { return root; }\n        root.allExtends = root.allExtends.concat(this.doExtendChaining(root.allExtends, root.allExtends));\n        this.allExtendsStack = [root.allExtends];\n        const newRoot = this._visitor.visit(root);\n        this.checkExtendsForNonMatched(root.allExtends);\n        return newRoot;\n    }\n\n    checkExtendsForNonMatched(extendList) {\n        const indices = this.extendIndices;\n        extendList.filter(function(extend) {\n            return !extend.hasFoundMatches && extend.parent_ids.length == 1;\n        }).forEach(function(extend) {\n            let selector = '_unknown_';\n            try {\n                selector = extend.selector.toCSS({});\n            }\n            catch (_) {}\n\n            if (!indices[`${extend.index} ${selector}`]) {\n                indices[`${extend.index} ${selector}`] = true;\n                /**\n                 * @todo Shouldn't this be an error? To alert the developer\n                 * that they may have made an error in the selector they are\n                 * targeting?\n                 */\n                logger.warn(`WARNING: extend '${selector}' has no matches`);\n            }\n        });\n    }\n\n    doExtendChaining(extendsList, extendsListTarget, iterationCount) {\n        //\n        // chaining is different from normal extension.. if we extend an extend then we are not just copying, altering\n        // and pasting the selector we would do normally, but we are also adding an extend with the same target selector\n        // this means this new extend can then go and alter other extends\n        //\n        // this method deals with all the chaining work - without it, extend is flat and doesn't work on other extend selectors\n        // this is also the most expensive.. and a match on one selector can cause an extension of a selector we had already\n        // processed if we look at each selector at a time, as is done in visitRuleset\n\n        let extendIndex;\n\n        let targetExtendIndex;\n        let matches;\n        const extendsToAdd = [];\n        let newSelector;\n        const extendVisitor = this;\n        let selectorPath;\n        let extend;\n        let targetExtend;\n        let newExtend;\n\n        iterationCount = iterationCount || 0;\n\n        // loop through comparing every extend with every target extend.\n        // a target extend is the one on the ruleset we are looking at copy/edit/pasting in place\n        // e.g.  .a:extend(.b) {}  and .b:extend(.c) {} then the first extend extends the second one\n        // and the second is the target.\n        // the separation into two lists allows us to process a subset of chains with a bigger set, as is the\n        // case when processing media queries\n        for (extendIndex = 0; extendIndex < extendsList.length; extendIndex++) {\n            for (targetExtendIndex = 0; targetExtendIndex < extendsListTarget.length; targetExtendIndex++) {\n\n                extend = extendsList[extendIndex];\n                targetExtend = extendsListTarget[targetExtendIndex];\n\n                // look for circular references\n                if ( extend.parent_ids.indexOf( targetExtend.object_id ) >= 0 ) { continue; }\n\n                // find a match in the target extends self selector (the bit before :extend)\n                selectorPath = [targetExtend.selfSelectors[0]];\n                matches = extendVisitor.findMatch(extend, selectorPath);\n\n                if (matches.length) {\n                    extend.hasFoundMatches = true;\n\n                    // we found a match, so for each self selector..\n                    extend.selfSelectors.forEach(function(selfSelector) {\n                        const info = targetExtend.visibilityInfo();\n\n                        // process the extend as usual\n                        newSelector = extendVisitor.extendSelector(matches, selectorPath, selfSelector, extend.isVisible());\n\n                        // but now we create a new extend from it\n                        newExtend = new(tree.Extend)(targetExtend.selector, targetExtend.option, 0, targetExtend.fileInfo(), info);\n                        newExtend.selfSelectors = newSelector;\n\n                        // add the extend onto the list of extends for that selector\n                        newSelector[newSelector.length - 1].extendList = [newExtend];\n\n                        // record that we need to add it.\n                        extendsToAdd.push(newExtend);\n                        newExtend.ruleset = targetExtend.ruleset;\n\n                        // remember its parents for circular references\n                        newExtend.parent_ids = newExtend.parent_ids.concat(targetExtend.parent_ids, extend.parent_ids);\n\n                        // only process the selector once.. if we have :extend(.a,.b) then multiple\n                        // extends will look at the same selector path, so when extending\n                        // we know that any others will be duplicates in terms of what is added to the css\n                        if (targetExtend.firstExtendOnThisSelectorPath) {\n                            newExtend.firstExtendOnThisSelectorPath = true;\n                            targetExtend.ruleset.paths.push(newSelector);\n                        }\n                    });\n                }\n            }\n        }\n\n        if (extendsToAdd.length) {\n            // try to detect circular references to stop a stack overflow.\n            // may no longer be needed.\n            this.extendChainCount++;\n            if (iterationCount > 100) {\n                let selectorOne = '{unable to calculate}';\n                let selectorTwo = '{unable to calculate}';\n                try {\n                    selectorOne = extendsToAdd[0].selfSelectors[0].toCSS();\n                    selectorTwo = extendsToAdd[0].selector.toCSS();\n                }\n                catch (e) {}\n                throw { message: `extend circular reference detected. One of the circular extends is currently:${selectorOne}:extend(${selectorTwo})`};\n            }\n\n            // now process the new extends on the existing rules so that we can handle a extending b extending c extending\n            // d extending e...\n            return extendsToAdd.concat(extendVisitor.doExtendChaining(extendsToAdd, extendsListTarget, iterationCount + 1));\n        } else {\n            return extendsToAdd;\n        }\n    }\n\n    visitDeclaration(ruleNode, visitArgs) {\n        visitArgs.visitDeeper = false;\n    }\n\n    visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n        visitArgs.visitDeeper = false;\n    }\n\n    visitSelector(selectorNode, visitArgs) {\n        visitArgs.visitDeeper = false;\n    }\n\n    visitRuleset(rulesetNode, visitArgs) {\n        if (rulesetNode.root) {\n            return;\n        }\n        let matches;\n        const allExtends = this.allExtendsStack[this.allExtendsStack.length - 1];\n        const selectorsToAdd = [];\n        const paths = rulesetNode.paths;\n        const pathCount = paths.length;\n\n        // look at each selector path in the ruleset, find any extend matches and then copy, find and replace\n\n        for (let extendIndex = 0; extendIndex < allExtends.length; extendIndex++) {\n            const extend = allExtends[extendIndex];\n            for (let pathIndex = 0; pathIndex < pathCount; pathIndex++) {\n                const selectorPath = paths[pathIndex];\n\n                // extending extends happens initially, before the main pass\n                if (rulesetNode.extendOnEveryPath) { continue; }\n                const extendList = selectorPath[selectorPath.length - 1].extendList;\n                if (extendList && extendList.length) { continue; }\n\n                matches = this.findMatch(extend, selectorPath);\n\n                if (matches.length) {\n                    extend.hasFoundMatches = true;\n\n                    const selfSelectors = extend.selfSelectors;\n                    const isVisible = extend.isVisible();\n                    for (let si = 0; si < selfSelectors.length; si++) {\n                        selectorsToAdd.push(this.extendSelector(matches, selectorPath, selfSelectors[si], isVisible));\n                    }\n                }\n            }\n        }\n        rulesetNode.paths = paths.concat(selectorsToAdd);\n    }\n\n    findMatch(extend, haystackSelectorPath) {\n        //\n        // look through the haystack selector path to try and find the needle - extend.selector\n        // returns an array of selector matches that can then be replaced\n        //\n        let haystackSelectorIndex;\n\n        let hackstackSelector;\n        let hackstackElementIndex;\n        let haystackElement;\n        let targetCombinator;\n        let i;\n        const needleElements = extend.selector.elements;\n        const potentialMatches = [];\n        let potentialMatch;\n        const matches = [];\n\n        // loop through the haystack elements\n        for (haystackSelectorIndex = 0; haystackSelectorIndex < haystackSelectorPath.length; haystackSelectorIndex++) {\n            hackstackSelector = haystackSelectorPath[haystackSelectorIndex];\n\n            for (hackstackElementIndex = 0; hackstackElementIndex < hackstackSelector.elements.length; hackstackElementIndex++) {\n\n                haystackElement = hackstackSelector.elements[hackstackElementIndex];\n\n                // if we allow elements before our match we can add a potential match every time. otherwise only at the first element.\n                if (extend.allowBefore || (haystackSelectorIndex === 0 && hackstackElementIndex === 0)) {\n                    potentialMatches.push({pathIndex: haystackSelectorIndex, index: hackstackElementIndex, matched: 0,\n                        initialCombinator: haystackElement.combinator});\n                }\n\n                for (i = 0; i < potentialMatches.length; i++) {\n                    potentialMatch = potentialMatches[i];\n\n                    // selectors add \" \" onto the first element. When we use & it joins the selectors together, but if we don't\n                    // then each selector in haystackSelectorPath has a space before it added in the toCSS phase. so we need to\n                    // work out what the resulting combinator will be\n                    targetCombinator = haystackElement.combinator.value;\n                    if (targetCombinator === '' && hackstackElementIndex === 0) {\n                        targetCombinator = ' ';\n                    }\n\n                    // if we don't match, null our match to indicate failure\n                    if (!this.isElementValuesEqual(needleElements[potentialMatch.matched].value, haystackElement.value) ||\n                        (potentialMatch.matched > 0 && needleElements[potentialMatch.matched].combinator.value !== targetCombinator)) {\n                        potentialMatch = null;\n                    } else {\n                        potentialMatch.matched++;\n                    }\n\n                    // if we are still valid and have finished, test whether we have elements after and whether these are allowed\n                    if (potentialMatch) {\n                        potentialMatch.finished = potentialMatch.matched === needleElements.length;\n                        if (potentialMatch.finished &&\n                            (!extend.allowAfter &&\n                                (hackstackElementIndex + 1 < hackstackSelector.elements.length || haystackSelectorIndex + 1 < haystackSelectorPath.length))) {\n                            potentialMatch = null;\n                        }\n                    }\n                    // if null we remove, if not, we are still valid, so either push as a valid match or continue\n                    if (potentialMatch) {\n                        if (potentialMatch.finished) {\n                            potentialMatch.length = needleElements.length;\n                            potentialMatch.endPathIndex = haystackSelectorIndex;\n                            potentialMatch.endPathElementIndex = hackstackElementIndex + 1; // index after end of match\n                            potentialMatches.length = 0; // we don't allow matches to overlap, so start matching again\n                            matches.push(potentialMatch);\n                        }\n                    } else {\n                        potentialMatches.splice(i, 1);\n                        i--;\n                    }\n                }\n            }\n        }\n        return matches;\n    }\n\n    isElementValuesEqual(elementValue1, elementValue2) {\n        if (typeof elementValue1 === 'string' || typeof elementValue2 === 'string') {\n            return elementValue1 === elementValue2;\n        }\n        if (elementValue1 instanceof tree.Attribute) {\n            if (elementValue1.op !== elementValue2.op || elementValue1.key !== elementValue2.key) {\n                return false;\n            }\n            if (!elementValue1.value || !elementValue2.value) {\n                if (elementValue1.value || elementValue2.value) {\n                    return false;\n                }\n                return true;\n            }\n            elementValue1 = elementValue1.value.value || elementValue1.value;\n            elementValue2 = elementValue2.value.value || elementValue2.value;\n            return elementValue1 === elementValue2;\n        }\n        elementValue1 = elementValue1.value;\n        elementValue2 = elementValue2.value;\n        if (elementValue1 instanceof tree.Selector) {\n            if (!(elementValue2 instanceof tree.Selector) || elementValue1.elements.length !== elementValue2.elements.length) {\n                return false;\n            }\n            for (let i = 0; i  < elementValue1.elements.length; i++) {\n                if (elementValue1.elements[i].combinator.value !== elementValue2.elements[i].combinator.value) {\n                    if (i !== 0 || (elementValue1.elements[i].combinator.value || ' ') !== (elementValue2.elements[i].combinator.value || ' ')) {\n                        return false;\n                    }\n                }\n                if (!this.isElementValuesEqual(elementValue1.elements[i].value, elementValue2.elements[i].value)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        return false;\n    }\n\n    extendSelector(matches, selectorPath, replacementSelector, isVisible) {\n\n        // for a set of matches, replace each match with the replacement selector\n\n        let currentSelectorPathIndex = 0, currentSelectorPathElementIndex = 0, path = [], matchIndex, selector, firstElement, match, newElements;\n\n        for (matchIndex = 0; matchIndex < matches.length; matchIndex++) {\n            match = matches[matchIndex];\n            selector = selectorPath[match.pathIndex];\n            firstElement = new tree.Element(\n                match.initialCombinator,\n                replacementSelector.elements[0].value,\n                replacementSelector.elements[0].isVariable,\n                replacementSelector.elements[0].getIndex(),\n                replacementSelector.elements[0].fileInfo()\n            );\n\n            if (match.pathIndex > currentSelectorPathIndex && currentSelectorPathElementIndex > 0) {\n                path[path.length - 1].elements = path[path.length - 1]\n                    .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n                currentSelectorPathElementIndex = 0;\n                currentSelectorPathIndex++;\n            }\n\n            newElements = selector.elements\n                .slice(currentSelectorPathElementIndex, match.index)\n                .concat([firstElement])\n                .concat(replacementSelector.elements.slice(1));\n\n            if (currentSelectorPathIndex === match.pathIndex && matchIndex > 0) {\n                path[path.length - 1].elements =\n                    path[path.length - 1].elements.concat(newElements);\n            } else {\n                path = path.concat(selectorPath.slice(currentSelectorPathIndex, match.pathIndex));\n\n                path.push(new tree.Selector(\n                    newElements\n                ));\n            }\n            currentSelectorPathIndex = match.endPathIndex;\n            currentSelectorPathElementIndex = match.endPathElementIndex;\n            if (currentSelectorPathElementIndex >= selectorPath[currentSelectorPathIndex].elements.length) {\n                currentSelectorPathElementIndex = 0;\n                currentSelectorPathIndex++;\n            }\n        }\n\n        if (currentSelectorPathIndex < selectorPath.length && currentSelectorPathElementIndex > 0) {\n            path[path.length - 1].elements = path[path.length - 1]\n                .elements.concat(selectorPath[currentSelectorPathIndex].elements.slice(currentSelectorPathElementIndex));\n            currentSelectorPathIndex++;\n        }\n\n        path = path.concat(selectorPath.slice(currentSelectorPathIndex, selectorPath.length));\n        path = path.map(function (currentValue) {\n            // we can re-use elements here, because the visibility property matters only for selectors\n            const derived = currentValue.createDerived(currentValue.elements);\n            if (isVisible) {\n                derived.ensureVisibility();\n            } else {\n                derived.ensureInvisibility();\n            }\n            return derived;\n        });\n        return path;\n    }\n\n    visitMedia(mediaNode, visitArgs) {\n        let newAllExtends = mediaNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n        newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, mediaNode.allExtends));\n        this.allExtendsStack.push(newAllExtends);\n    }\n\n    visitMediaOut(mediaNode) {\n        const lastIndex = this.allExtendsStack.length - 1;\n        this.allExtendsStack.length = lastIndex;\n    }\n\n    visitAtRule(atRuleNode, visitArgs) {\n        let newAllExtends = atRuleNode.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length - 1]);\n        newAllExtends = newAllExtends.concat(this.doExtendChaining(newAllExtends, atRuleNode.allExtends));\n        this.allExtendsStack.push(newAllExtends);\n    }\n\n    visitAtRuleOut(atRuleNode) {\n        const lastIndex = this.allExtendsStack.length - 1;\n        this.allExtendsStack.length = lastIndex;\n    }\n}\n\nexport default ProcessExtendsVisitor;\n"
  },
  {
    "path": "packages/less/lib/less/visitors/import-sequencer.js",
    "content": "class ImportSequencer {\n    constructor(onSequencerEmpty) {\n        this.imports = [];\n        this.variableImports = [];\n        this._onSequencerEmpty = onSequencerEmpty;\n        this._currentDepth = 0;\n    }\n\n    addImport(callback) {\n        const importSequencer = this,\n            importItem = {\n                callback,\n                args: null,\n                isReady: false\n            };\n        this.imports.push(importItem);\n        return function() {\n            importItem.args = Array.prototype.slice.call(arguments, 0);\n            importItem.isReady = true;\n            importSequencer.tryRun();\n        };\n    }\n\n    addVariableImport(callback) {\n        this.variableImports.push(callback);\n    }\n\n    tryRun() {\n        this._currentDepth++;\n        try {\n            while (true) {\n                while (this.imports.length > 0) {\n                    const importItem = this.imports[0];\n                    if (!importItem.isReady) {\n                        return;\n                    }\n                    this.imports = this.imports.slice(1);\n                    importItem.callback.apply(null, importItem.args);\n                }\n                if (this.variableImports.length === 0) {\n                    break;\n                }\n                const variableImport = this.variableImports[0];\n                this.variableImports = this.variableImports.slice(1);\n                variableImport();\n            }\n        } finally {\n            this._currentDepth--;\n        }\n        if (this._currentDepth === 0 && this._onSequencerEmpty) {\n            this._onSequencerEmpty();\n        }\n    }\n}\n\nexport default ImportSequencer;\n"
  },
  {
    "path": "packages/less/lib/less/visitors/import-visitor.js",
    "content": "/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport contexts from '../contexts.js';\nimport Visitor from './visitor.js';\nimport ImportSequencer from './import-sequencer.js';\nimport * as utils from '../utils.js';\n\nconst ImportVisitor = function(importer, finish) {\n\n    this._visitor = new Visitor(this);\n    this._importer = importer;\n    this._finish = finish;\n    this.context = new contexts.Eval();\n    this.importCount = 0;\n    this.onceFileDetectionMap = {};\n    this.recursionDetector = {};\n    this._sequencer = new ImportSequencer(this._onSequencerEmpty.bind(this));\n};\n\nImportVisitor.prototype = {\n    isReplacing: false,\n    run: function (root) {\n        try {\n            // process the contents\n            this._visitor.visit(root);\n        }\n        catch (e) {\n            this.error = e;\n        }\n\n        this.isFinished = true;\n        this._sequencer.tryRun();\n    },\n    _onSequencerEmpty: function() {\n        if (!this.isFinished) {\n            return;\n        }\n        this._finish(this.error);\n    },\n    visitImport: function (importNode, visitArgs) {\n        const inlineCSS = importNode.options.inline;\n\n        if (!importNode.css || inlineCSS) {\n\n            const context = new contexts.Eval(this.context, utils.copyArray(this.context.frames));\n            const importParent = context.frames[0];\n\n            this.importCount++;\n            if (importNode.isVariableImport()) {\n                this._sequencer.addVariableImport(this.processImportNode.bind(this, importNode, context, importParent));\n            } else {\n                this.processImportNode(importNode, context, importParent);\n            }\n        }\n        visitArgs.visitDeeper = false;\n    },\n    processImportNode: function(importNode, context, importParent) {\n        let evaldImportNode;\n        const inlineCSS = importNode.options.inline;\n\n        try {\n            evaldImportNode = importNode.evalForImport(context);\n        } catch (e) {\n            if (!e.filename) { e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename; }\n            // attempt to eval properly and treat as css\n            importNode.css = true;\n            // if that fails, this error will be thrown\n            importNode.error = e;\n        }\n\n        if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {\n\n            if (evaldImportNode.options.multiple) {\n                context.importMultiple = true;\n            }\n\n            // try appending if we haven't determined if it is css or not\n            const tryAppendLessExtension = evaldImportNode.css === undefined;\n\n            for (let i = 0; i < importParent.rules.length; i++) {\n                if (importParent.rules[i] === importNode) {\n                    importParent.rules[i] = evaldImportNode;\n                    break;\n                }\n            }\n\n            const onImported = this.onImported.bind(this, evaldImportNode, context), sequencedOnImported = this._sequencer.addImport(onImported);\n\n            this._importer.push(evaldImportNode.getPath(), tryAppendLessExtension, evaldImportNode.fileInfo(),\n                evaldImportNode.options, sequencedOnImported);\n        } else {\n            this.importCount--;\n            if (this.isFinished) {\n                this._sequencer.tryRun();\n            }\n        }\n    },\n    onImported: function (importNode, context, e, root, importedAtRoot, fullPath) {\n        if (e) {\n            if (!e.filename) {\n                e.index = importNode.getIndex(); e.filename = importNode.fileInfo().filename;\n            }\n            this.error = e;\n        }\n\n        const importVisitor = this,\n            inlineCSS = importNode.options.inline,\n            isPlugin = importNode.options.isPlugin,\n            isOptional = importNode.options.optional,\n            duplicateImport = importedAtRoot || fullPath in importVisitor.recursionDetector;\n\n        if (!context.importMultiple) {\n            if (duplicateImport) {\n                importNode.skip = true;\n            } else {\n                importNode.skip = function() {\n                    if (fullPath in importVisitor.onceFileDetectionMap) {\n                        return true;\n                    }\n                    importVisitor.onceFileDetectionMap[fullPath] = true;\n                    return false;\n                };\n            }\n        }\n\n        if (!fullPath && isOptional) {\n            importNode.skip = true;\n        }\n\n        if (root) {\n            importNode.root = root;\n            importNode.importedFilename = fullPath;\n\n            if (!inlineCSS && !isPlugin && (context.importMultiple || !duplicateImport)) {\n                importVisitor.recursionDetector[fullPath] = true;\n\n                const oldContext = this.context;\n                this.context = context;\n                try {\n                    this._visitor.visit(root);\n                } catch (e) {\n                    this.error = e;\n                }\n                this.context = oldContext;\n            }\n        }\n\n        importVisitor.importCount--;\n\n        if (importVisitor.isFinished) {\n            importVisitor._sequencer.tryRun();\n        }\n    },\n    visitDeclaration: function (declNode, visitArgs) {\n        if (declNode.value.type === 'DetachedRuleset') {\n            this.context.frames.unshift(declNode);\n        } else {\n            visitArgs.visitDeeper = false;\n        }\n    },\n    visitDeclarationOut: function(declNode) {\n        if (declNode.value.type === 'DetachedRuleset') {\n            this.context.frames.shift();\n        }\n    },\n    visitAtRule: function (atRuleNode, visitArgs) {\n        if (atRuleNode.value) {\n            this.context.frames.unshift(atRuleNode);\n        } else if (atRuleNode.declarations && atRuleNode.declarations.length) {\n            if (atRuleNode.isRooted) {\n                this.context.frames.unshift(atRuleNode);\n            } else {\n                this.context.frames.unshift(atRuleNode.declarations[0]);\n            }\n        } else if (atRuleNode.rules && atRuleNode.rules.length) {\n            this.context.frames.unshift(atRuleNode);\n        }\n    },\n    visitAtRuleOut: function (atRuleNode) {\n        this.context.frames.shift();\n    },\n    visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {\n        this.context.frames.unshift(mixinDefinitionNode);\n    },\n    visitMixinDefinitionOut: function (mixinDefinitionNode) {\n        this.context.frames.shift();\n    },\n    visitRuleset: function (rulesetNode, visitArgs) {\n        this.context.frames.unshift(rulesetNode);\n    },\n    visitRulesetOut: function (rulesetNode) {\n        this.context.frames.shift();\n    },\n    visitMedia: function (mediaNode, visitArgs) {\n        this.context.frames.unshift(mediaNode.rules[0]);\n    },\n    visitMediaOut: function (mediaNode) {\n        this.context.frames.shift();\n    }\n};\nexport default ImportVisitor;\n"
  },
  {
    "path": "packages/less/lib/less/visitors/index.js",
    "content": "import Visitor from './visitor.js';\nimport ImportVisitor from './import-visitor.js';\nimport MarkVisibleSelectorsVisitor from './set-tree-visibility-visitor.js';\nimport ExtendVisitor from './extend-visitor.js';\nimport JoinSelectorVisitor from './join-selector-visitor.js';\nimport ToCSSVisitor from './to-css-visitor.js';\n\nexport default {\n    Visitor,\n    ImportVisitor,\n    MarkVisibleSelectorsVisitor,\n    ExtendVisitor,\n    JoinSelectorVisitor,\n    ToCSSVisitor\n};\n"
  },
  {
    "path": "packages/less/lib/less/visitors/join-selector-visitor.js",
    "content": "/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport Visitor from './visitor.js';\n\nclass JoinSelectorVisitor {\n    constructor() {\n        this.contexts = [[]];\n        this._visitor = new Visitor(this);\n    }\n\n    run(root) {\n        return this._visitor.visit(root);\n    }\n\n    visitDeclaration(declNode, visitArgs) {\n        visitArgs.visitDeeper = false;\n    }\n\n    visitMixinDefinition(mixinDefinitionNode, visitArgs) {\n        visitArgs.visitDeeper = false;\n    }\n\n    visitRuleset(rulesetNode, visitArgs) {\n        const context = this.contexts[this.contexts.length - 1];\n        const paths = [];\n        let selectors;\n\n        this.contexts.push(paths);\n\n        if (!rulesetNode.root) {\n            selectors = rulesetNode.selectors;\n            if (selectors) {\n                selectors = selectors.filter(function(selector) { return selector.getIsOutput(); });\n                rulesetNode.selectors = selectors.length ? selectors : (selectors = null);\n                if (selectors) { rulesetNode.joinSelectors(paths, context, selectors); }\n            }\n            if (!selectors) { rulesetNode.rules = null; }\n            rulesetNode.paths = paths;\n        }\n    }\n\n    visitRulesetOut(rulesetNode) {\n        this.contexts.length = this.contexts.length - 1;\n    }\n\n    visitMedia(mediaNode, visitArgs) {\n        const context = this.contexts[this.contexts.length - 1];\n        mediaNode.rules[0].root = (context.length === 0 || context[0].multiMedia);\n    }\n\n    visitAtRule(atRuleNode, visitArgs) {\n        const context = this.contexts[this.contexts.length - 1];\n\n        if (atRuleNode.declarations && atRuleNode.declarations.length) {\n            atRuleNode.declarations[0].root = (context.length === 0 || context[0].multiMedia);\n        }\n        else if (atRuleNode.rules && atRuleNode.rules.length) {\n            atRuleNode.rules[0].root = (atRuleNode.isRooted || context.length === 0 || null);\n        }\n    }\n}\n\nexport default JoinSelectorVisitor;\n"
  },
  {
    "path": "packages/less/lib/less/visitors/set-tree-visibility-visitor.js",
    "content": "import Node from '../tree/node.js';\n\nclass SetTreeVisibilityVisitor {\n    /** @param {boolean} visible */\n    constructor(visible) {\n        this.visible = visible;\n    }\n\n    /** @param {Node} root */\n    run(root) {\n        this.visit(root);\n    }\n\n    /**\n     * @param {Node[]} nodes\n     * @returns {Node[]}\n     */\n    visitArray(nodes) {\n        if (!nodes) {\n            return nodes;\n        }\n\n        const cnt = nodes.length;\n        let i;\n        for (i = 0; i < cnt; i++) {\n            this.visit(nodes[i]);\n        }\n        return nodes;\n    }\n\n    /**\n     * @param {*} node\n     * @returns {*}\n     */\n    visit(node) {\n        if (!node) {\n            return node;\n        }\n        if (node.constructor === Array) {\n            return this.visitArray(node);\n        }\n\n        if (!node.blocksVisibility || node.blocksVisibility()) {\n            return node;\n        }\n        if (this.visible) {\n            node.ensureVisibility();\n        } else {\n            node.ensureInvisibility();\n        }\n\n        node.accept(this);\n        return node;\n    }\n}\n\nexport default SetTreeVisibilityVisitor;\n"
  },
  {
    "path": "packages/less/lib/less/visitors/to-css-visitor.js",
    "content": "/* eslint-disable no-unused-vars */\n/**\n * @todo - Remove unused when JSDoc types are added for visitor methods\n */\nimport tree from '../tree/index.js';\nimport Visitor from './visitor.js';\nimport mergeRules from '../tree/merge-rules.js';\n\nclass CSSVisitorUtils {\n    constructor(context) {\n        this._visitor = new Visitor(this);\n        this._context = context;\n    }\n\n    containsSilentNonBlockedChild(bodyRules) {\n        let rule;\n        if (!bodyRules) {\n            return false;\n        }\n        for (let r = 0; r < bodyRules.length; r++) {\n            rule = bodyRules[r];\n            if (rule.isSilent && rule.isSilent(this._context) && !rule.blocksVisibility()) {\n                // the atrule contains something that was referenced (likely by extend)\n                // therefore it needs to be shown in output too\n                return true;\n            }\n        }\n        return false;\n    }\n\n    keepOnlyVisibleChilds(owner) {\n        if (owner && owner.rules) {\n            owner.rules = owner.rules.filter(thing => thing.isVisible());\n        }\n    }\n\n    isEmpty(owner) {\n        return (owner && owner.rules) \n            ? (owner.rules.length === 0) : true;\n    }\n\n    hasVisibleSelector(rulesetNode) {\n        return (rulesetNode && rulesetNode.paths)\n            ? (rulesetNode.paths.length > 0) : false;\n    }\n\n    resolveVisibility(node) {\n        if (!node.blocksVisibility()) {\n            if (this.isEmpty(node)) {\n                return ;\n            }\n\n            return node;\n        }\n\n        const compiledRulesBody = node.rules[0];\n        this.keepOnlyVisibleChilds(compiledRulesBody);\n\n        if (this.isEmpty(compiledRulesBody)) {\n            return ;\n        }\n\n        node.ensureVisibility();\n        node.removeVisibilityBlock();\n\n        return node;\n    }\n\n    isVisibleRuleset(rulesetNode) {\n        if (rulesetNode.firstRoot) {\n            return true;\n        }\n\n        if (this.isEmpty(rulesetNode)) {\n            return false;\n        }\n\n        if (!rulesetNode.root && !this.hasVisibleSelector(rulesetNode)) {\n            return false;\n        }\n\n        return true;\n    }\n}\n\nconst ToCSSVisitor = function(context) {\n    this._visitor = new Visitor(this);\n    this._context = context;\n    this.utils = new CSSVisitorUtils(context);\n};\n\nToCSSVisitor.prototype = {\n    isReplacing: true,\n    run: function (root) {\n        return this._visitor.visit(root);\n    },\n\n    visitDeclaration: function (declNode, visitArgs) {\n        if (declNode.blocksVisibility() || declNode.variable) {\n            return;\n        }\n        return declNode;\n    },\n\n    visitMixinDefinition: function (mixinNode, visitArgs) {\n        // mixin definitions do not get eval'd - this means they keep state\n        // so we have to clear that state here so it isn't used if toCSS is called twice\n        mixinNode.frames = [];\n    },\n\n    visitExtend: function (extendNode, visitArgs) {\n    },\n\n    visitComment: function (commentNode, visitArgs) {\n        if (commentNode.blocksVisibility() || commentNode.isSilent(this._context)) {\n            return;\n        }\n        return commentNode;\n    },\n\n    visitMedia: function(mediaNode, visitArgs) {\n        const originalRules = mediaNode.rules[0].rules;\n        mediaNode.accept(this._visitor);\n        visitArgs.visitDeeper = false;\n\n        return this.utils.resolveVisibility(mediaNode, originalRules);\n    },\n\n    visitImport: function (importNode, visitArgs) {\n        if (importNode.blocksVisibility()) {\n            return ;\n        }\n        return importNode;\n    },\n\n    visitAtRule: function(atRuleNode, visitArgs) {\n        if (atRuleNode.rules && atRuleNode.rules.length) {\n            return this.visitAtRuleWithBody(atRuleNode, visitArgs);\n        } else {\n            return this.visitAtRuleWithoutBody(atRuleNode, visitArgs);\n        }\n    },\n\n    visitAnonymous: function(anonymousNode, visitArgs) {\n        if (!anonymousNode.blocksVisibility()) {\n            anonymousNode.accept(this._visitor);\n            return anonymousNode;\n        }\n    },\n\n    visitAtRuleWithBody: function(atRuleNode, visitArgs) {\n        // if there is only one nested ruleset and that one has no path, then it is\n        // just fake ruleset\n        function hasFakeRuleset(atRuleNode) {\n            const bodyRules = atRuleNode.rules;\n            return bodyRules.length === 1 && (!bodyRules[0].paths || bodyRules[0].paths.length === 0);\n        }\n        function getBodyRules(atRuleNode) {\n            const nodeRules = atRuleNode.rules;\n            if (hasFakeRuleset(atRuleNode)) {\n                return nodeRules[0].rules;\n            }\n\n            return nodeRules;\n        }\n        // it is still true that it is only one ruleset in array\n        // this is last such moment\n        // process childs\n        const originalRules = getBodyRules(atRuleNode);\n        atRuleNode.accept(this._visitor);\n        visitArgs.visitDeeper = false;\n\n        if (!this.utils.isEmpty(atRuleNode)) {\n            this._mergeRules(atRuleNode.rules[0].rules);\n        }\n\n        return this.utils.resolveVisibility(atRuleNode, originalRules);\n    },\n\n    visitAtRuleWithoutBody: function(atRuleNode, visitArgs) {\n        if (atRuleNode.blocksVisibility()) {\n            return;\n        }\n\n        if (atRuleNode.name === '@charset') {\n            // Only output the debug info together with subsequent @charset definitions\n            // a comment (or @media statement) before the actual @charset atrule would\n            // be considered illegal css as it has to be on the first line\n            if (this.charset) {\n                if (atRuleNode.debugInfo) {\n                    const comment = new tree.Comment(`/* ${atRuleNode.toCSS(this._context).replace(/\\n/g, '')} */\\n`);\n                    comment.debugInfo = atRuleNode.debugInfo;\n                    return this._visitor.visit(comment);\n                }\n                return;\n            }\n            this.charset = true;\n        }\n\n        return atRuleNode;\n    },\n\n    checkValidNodes: function(rules, isRoot) {\n        if (!rules) {\n            return;\n        }\n\n        for (let i = 0; i < rules.length; i++) {\n            const ruleNode = rules[i];\n            if (isRoot && ruleNode instanceof tree.Declaration && !ruleNode.variable) {\n                throw { message: 'Properties must be inside selector blocks. They cannot be in the root',\n                    index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n            }\n            if (ruleNode instanceof tree.Call) {\n                throw { message: `Function '${ruleNode.name}' did not return a root node`,\n                    index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n            }\n            if (ruleNode.type && !ruleNode.allowRoot) {\n                throw { message: `${ruleNode.type} node returned by a function is not valid here`,\n                    index: ruleNode.getIndex(), filename: ruleNode.fileInfo() && ruleNode.fileInfo().filename};\n            }\n        }\n    },\n\n    visitRuleset: function (rulesetNode, visitArgs) {\n        // at this point rulesets are nested into each other\n        let rule;\n\n        const rulesets = [];\n\n        this.checkValidNodes(rulesetNode.rules, rulesetNode.firstRoot);\n\n        if (!rulesetNode.root) {\n            // remove invisible paths\n            this._compileRulesetPaths(rulesetNode);\n\n            // remove rulesets from this ruleset body and compile them separately\n            const nodeRules = rulesetNode.rules;\n\n            let nodeRuleCnt = nodeRules ? nodeRules.length : 0;\n            for (let i = 0; i < nodeRuleCnt; ) {\n                rule = nodeRules[i];\n                if (rule && rule.rules) {\n                    // visit because we are moving them out from being a child\n                    rulesets.push(this._visitor.visit(rule));\n                    nodeRules.splice(i, 1);\n                    nodeRuleCnt--;\n                    continue;\n                }\n                i++;\n            }\n            // accept the visitor to remove rules and refactor itself\n            // then we can decide nogw whether we want it or not\n            // compile body\n            if (nodeRuleCnt > 0) {\n                rulesetNode.accept(this._visitor);\n            } else {\n                rulesetNode.rules = null;\n            }\n            visitArgs.visitDeeper = false;\n        } else { // if (! rulesetNode.root) {\n            rulesetNode.accept(this._visitor);\n            visitArgs.visitDeeper = false;\n        }\n\n        if (rulesetNode.rules) {\n            this._mergeRules(rulesetNode.rules);\n            this._removeDuplicateRules(rulesetNode.rules);\n        }\n\n        // now decide whether we keep the ruleset\n        if (this.utils.isVisibleRuleset(rulesetNode)) {\n            rulesetNode.ensureVisibility();\n            rulesets.splice(0, 0, rulesetNode);\n        }\n\n        if (rulesets.length === 1) {\n            return rulesets[0];\n        }\n        return rulesets;\n    },\n\n    _compileRulesetPaths: function(rulesetNode) {\n        if (rulesetNode.paths) {\n            rulesetNode.paths = rulesetNode.paths\n                .filter(p => {\n                    let i;\n                    if (p[0].elements[0].combinator.value === ' ') {\n                        p[0].elements[0].combinator = new(tree.Combinator)('');\n                    }\n                    for (i = 0; i < p.length; i++) {\n                        if (p[i].isVisible() && p[i].getIsOutput()) {\n                            return true;\n                        }\n                    }\n                    return false;\n                });\n        }\n    },\n\n    _removeDuplicateRules: function(rules) {\n        if (!rules) { return; }\n\n        // remove duplicates\n        const ruleCache = {};\n\n        for (let i = rules.length - 1; i >= 0 ; i--) {\n            let rule = rules[i];\n            if (rule instanceof tree.Declaration) {\n                if (!Object.prototype.hasOwnProperty.call(ruleCache, rule.name)) {\n                    ruleCache[rule.name] = rule;\n                } else {\n                    let ruleList = ruleCache[rule.name];\n                    if (!Array.isArray(ruleList)) {\n                        const prevRuleCSS = ruleList.toCSS(this._context);\n                        ruleList = ruleCache[rule.name] = [prevRuleCSS];\n                    }\n                    const ruleCSS = rule.toCSS(this._context);\n                    if (ruleList.indexOf(ruleCSS) !== -1) {\n                        rules.splice(i, 1);\n                    } else {\n                        ruleList.push(ruleCSS);\n                    }\n                }\n            }\n        }\n    },\n\n    _mergeRules: mergeRules\n};\n\nexport default ToCSSVisitor;\n"
  },
  {
    "path": "packages/less/lib/less/visitors/visitor.js",
    "content": "import tree from '../tree/index.js';\n\nconst _visitArgs = { visitDeeper: true };\nlet _hasIndexed = false;\n\nfunction _noop(node) {\n    return node;\n}\n\nfunction indexNodeTypes(parent, ticker) {\n    // add .typeIndex to tree node types for lookup table\n    let key, child;\n    for (key in parent) { \n        /* eslint guard-for-in: 0 */\n        child = parent[key];\n        switch (typeof child) {\n            case 'function':\n                // ignore bound functions directly on tree which do not have a prototype\n                // or aren't nodes\n                if (child.prototype && child.prototype.type) {\n                    child.prototype.typeIndex = ticker++;\n                }\n                break;\n            case 'object':\n                ticker = indexNodeTypes(child, ticker);\n                break;\n        \n        }\n    }\n    return ticker;\n}\n\nclass Visitor {\n    constructor(implementation) {\n        this._implementation = implementation;\n        this._visitInCache = {};\n        this._visitOutCache = {};\n\n        if (!_hasIndexed) {\n            indexNodeTypes(tree, 1);\n            _hasIndexed = true;\n        }\n    }\n\n    visit(node) {\n        if (!node) {\n            return node;\n        }\n\n        const nodeTypeIndex = node.typeIndex;\n        if (!nodeTypeIndex) {\n            // MixinCall args aren't a node type?\n            if (node.value && node.value.typeIndex) {\n                this.visit(node.value);\n            }\n            return node;\n        }\n\n        const impl = this._implementation;\n        let func = this._visitInCache[nodeTypeIndex];\n        let funcOut = this._visitOutCache[nodeTypeIndex];\n        const visitArgs = _visitArgs;\n        let fnName;\n\n        visitArgs.visitDeeper = true;\n\n        if (!func) {\n            fnName = `visit${node.type}`;\n            func = impl[fnName] || _noop;\n            funcOut = impl[`${fnName}Out`] || _noop;\n            this._visitInCache[nodeTypeIndex] = func;\n            this._visitOutCache[nodeTypeIndex] = funcOut;\n        }\n\n        if (func !== _noop) {\n            const newNode = func.call(impl, node, visitArgs);\n            if (node && impl.isReplacing) {\n                node = newNode;\n            }\n        }\n\n        if (visitArgs.visitDeeper && node) {\n            if (node.length) {\n                for (let i = 0, cnt = node.length; i < cnt; i++) {\n                    if (node[i].accept) {\n                        node[i].accept(this);\n                    }\n                }\n            } else if (node.accept) {\n                node.accept(this);\n            }\n        }\n\n        if (funcOut != _noop) {\n            funcOut.call(impl, node);\n        }\n\n        return node;\n    }\n\n    visitArray(nodes, nonReplacing) {\n        if (!nodes) {\n            return nodes;\n        }\n\n        const cnt = nodes.length;\n        let i;\n\n        // Non-replacing\n        if (nonReplacing || !this._implementation.isReplacing) {\n            for (i = 0; i < cnt; i++) {\n                this.visit(nodes[i]);\n            }\n            return nodes;\n        }\n\n        // Replacing\n        const out = [];\n        for (i = 0; i < cnt; i++) {\n            const evald = this.visit(nodes[i]);\n            if (evald === undefined) { continue; }\n            if (!evald.splice) {\n                out.push(evald);\n            } else if (evald.length) {\n                this.flatten(evald, out);\n            }\n        }\n        return out;\n    }\n\n    flatten(arr, out) {\n        if (!out) {\n            out = [];\n        }\n\n        let cnt, i, item, nestedCnt, j, nestedItem;\n\n        for (i = 0, cnt = arr.length; i < cnt; i++) {\n            item = arr[i];\n            if (item === undefined) {\n                continue;\n            }\n            if (!item.splice) {\n                out.push(item);\n                continue;\n            }\n\n            for (j = 0, nestedCnt = item.length; j < nestedCnt; j++) {\n                nestedItem = item[j];\n                if (nestedItem === undefined) {\n                    continue;\n                }\n                if (!nestedItem.splice) {\n                    out.push(nestedItem);\n                } else if (nestedItem.length) {\n                    this.flatten(nestedItem, out);\n                }\n            }\n        }\n\n        return out;\n    }\n}\n\nexport default Visitor;\n"
  },
  {
    "path": "packages/less/lib/less-browser/add-default-options.js",
    "content": "import {addDataAttr} from './utils.js';\nimport browser from './browser.js';\n\n/**\n * @param {Window} window\n * @param {Record<string, *>} options\n */\nexport default (window, options) => {\n\n    // use options from the current script tag data attribues\n    addDataAttr(options, browser.currentScript(window));\n\n    if (options.isFileProtocol === undefined) {\n        options.isFileProtocol = /^(file|(chrome|safari)(-extension)?|resource|qrc|app):/.test(window.location.protocol);\n    }\n\n    // Load styles asynchronously (default: false)\n    //\n    // This is set to `false` by default, so that the body\n    // doesn't start loading before the stylesheets are parsed.\n    // Setting this to `true` can result in flickering.\n    //\n    options.async = options.async || false;\n    options.fileAsync = options.fileAsync || false;\n\n    // Interval between watch polls\n    options.poll = options.poll || (options.isFileProtocol ? 1000 : 1500);\n\n    options.env = options.env || (window.location.hostname == '127.0.0.1' ||\n        window.location.hostname == '0.0.0.0'   ||\n        window.location.hostname == 'localhost' ||\n        (window.location.port &&\n            window.location.port.length > 0)      ||\n        options.isFileProtocol                   ? 'development'\n        : 'production');\n\n    const dumpLineNumbers = /!dumpLineNumbers:(comments|mediaquery|all)/.exec(window.location.hash);\n    if (dumpLineNumbers) {\n        options.dumpLineNumbers = dumpLineNumbers[1];\n    }\n\n    if (options.useFileCache === undefined) {\n        options.useFileCache = true;\n    }\n\n    if (options.onReady === undefined) {\n        options.onReady = true;\n    }\n\n    if (options.relativeUrls) {\n        options.rewriteUrls = 'all';\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less-browser/bootstrap.js",
    "content": "/**\n * Kicks off less and compiles any stylesheets\n * used in the browser distributed version of less\n * to kick-start less using the browser api\n */\nimport defaultOptions from '../less/default-options.js';\nimport addDefaultOptions from './add-default-options.js';\nimport root from './index.js';\n\nconst options = defaultOptions();\n\nif (window.less) {\n    for (const key in window.less) {\n        if (Object.prototype.hasOwnProperty.call(window.less, key)) {\n            options[key] = window.less[key];\n        }\n    }\n}\naddDefaultOptions(window, options);\n\noptions.plugins = options.plugins || [];\n\nif (window.LESS_PLUGINS) {\n    options.plugins = options.plugins.concat(window.LESS_PLUGINS);\n}\n\nconst less = root(window, options);\nexport default less;\n\nwindow.less = less;\n\nlet css;\nlet head;\nlet style;\n\n// Always restore page visibility\nfunction resolveOrReject(data) {\n    if (data.filename) {\n        console.warn(data);\n    }\n    if (!options.async) {\n        head.removeChild(style);\n    }\n}\n\nif (options.onReady) {\n    if (/!watch/.test(window.location.hash)) {\n        less.watch();\n    }\n    // Simulate synchronous stylesheet loading by hiding page rendering\n    if (!options.async) {\n        css = 'body { display: none !important }';\n        head = document.head || document.getElementsByTagName('head')[0];\n        style = document.createElement('style');\n\n        style.type = 'text/css';\n        if (style.styleSheet) {\n            style.styleSheet.cssText = css;\n        } else {\n            style.appendChild(document.createTextNode(css));\n        }\n\n        head.appendChild(style);\n    }\n    less.registerStylesheetsImmediately();\n    less.pageLoadFinished = less.refresh(less.env === 'development').then(resolveOrReject, resolveOrReject);\n}\n"
  },
  {
    "path": "packages/less/lib/less-browser/browser.js",
    "content": "import * as utils from './utils.js';\n\nexport default {\n    createCSS: function (document, styles, sheet) {\n        // Strip the query-string\n        const href = sheet.href || '';\n\n        // If there is no title set, use the filename, minus the extension\n        const id = `less:${sheet.title || utils.extractId(href)}`;\n\n        // If this has already been inserted into the DOM, we may need to replace it\n        const oldStyleNode = document.getElementById(id);\n        let keepOldStyleNode = false;\n\n        // Create a new stylesheet node for insertion or (if necessary) replacement\n        const styleNode = document.createElement('style');\n        styleNode.setAttribute('type', 'text/css');\n        if (sheet.media) {\n            styleNode.setAttribute('media', sheet.media);\n        }\n        styleNode.id = id;\n\n        if (!styleNode.styleSheet) {\n            styleNode.appendChild(document.createTextNode(styles));\n\n            // If new contents match contents of oldStyleNode, don't replace oldStyleNode\n            keepOldStyleNode = (oldStyleNode !== null && oldStyleNode.childNodes.length > 0 && styleNode.childNodes.length > 0 &&\n                oldStyleNode.firstChild.nodeValue === styleNode.firstChild.nodeValue);\n        }\n\n        const head = document.getElementsByTagName('head')[0];\n\n        // If there is no oldStyleNode, just append; otherwise, only append if we need\n        // to replace oldStyleNode with an updated stylesheet\n        if (oldStyleNode === null || keepOldStyleNode === false) {\n            const nextEl = sheet && sheet.nextSibling || null;\n            if (nextEl) {\n                nextEl.parentNode.insertBefore(styleNode, nextEl);\n            } else {\n                head.appendChild(styleNode);\n            }\n        }\n        if (oldStyleNode && keepOldStyleNode === false) {\n            oldStyleNode.parentNode.removeChild(oldStyleNode);\n        }\n\n        // For IE.\n        // This needs to happen *after* the style element is added to the DOM, otherwise IE 7 and 8 may crash.\n        // See http://social.msdn.microsoft.com/Forums/en-US/7e081b65-878a-4c22-8e68-c10d39c2ed32/internet-explorer-crashes-appending-style-element-to-head\n        if (styleNode.styleSheet) {\n            try {\n                styleNode.styleSheet.cssText = styles;\n            } catch (e) {\n                throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n            }\n        }\n    },\n    currentScript: function(window) {\n        const document = window.document;\n        return document.currentScript || (() => {\n            const scripts = document.getElementsByTagName('script');\n            return scripts[scripts.length - 1];\n        })();\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less-browser/cache.js",
    "content": "// Cache system is a bit outdated and could do with work\n\nexport default (window, options, logger) => {\n    let cache = null;\n    if (options.env !== 'development') {\n        try {\n            cache = (typeof window.localStorage === 'undefined') ? null : window.localStorage;\n        } catch (_) {}\n    }\n    return {\n        setCSS: function(path, lastModified, modifyVars, styles) {\n            if (cache) {\n                logger.info(`saving ${path} to cache.`);\n                try {\n                    cache.setItem(path, styles);\n                    cache.setItem(`${path}:timestamp`, lastModified);\n                    if (modifyVars) {\n                        cache.setItem(`${path}:vars`, JSON.stringify(modifyVars));\n                    }\n                } catch (e) {\n                    // TODO - could do with adding more robust error handling\n                    logger.error(`failed to save \"${path}\" to local storage for caching.`);\n                }\n            }\n        },\n        getCSS: function(path, webInfo, modifyVars) {\n            const css       = cache && cache.getItem(path);\n            const timestamp = cache && cache.getItem(`${path}:timestamp`);\n            let vars      = cache && cache.getItem(`${path}:vars`);\n\n            modifyVars = modifyVars || {};\n            vars = vars || '{}'; // if not set, treat as the JSON representation of an empty object\n\n            if (timestamp && webInfo.lastModified &&\n                (new Date(webInfo.lastModified).valueOf() ===\n                    new Date(timestamp).valueOf()) &&\n                JSON.stringify(modifyVars) === vars) {\n                // Use local copy\n                return css;\n            }\n        }\n    };\n};\n"
  },
  {
    "path": "packages/less/lib/less-browser/error-reporting.js",
    "content": "import * as utils from './utils.js';\nimport browser from './browser.js';\n\nexport default (window, less, options) => {\n\n    function errorHTML(e, rootHref) {\n        const id = `less-error-message:${utils.extractId(rootHref || '')}`;\n        const template = '<li><label>{line}</label><pre class=\"{class}\">{content}</pre></li>';\n        const elem = window.document.createElement('div');\n        let timer;\n        let content;\n        const errors = [];\n        const filename = e.filename || rootHref;\n        const filenameNoPath = filename.match(/([^/]+(\\?.*)?)$/)[1];\n\n        elem.id        = id;\n        elem.className = 'less-error-message';\n\n        content = `<h3>${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'}` + \n            `</h3><p>in <a href=\"${filename}\">${filenameNoPath}</a> `;\n\n        const errorline = (e, i, classname) => {\n            if (e.extract[i] !== undefined) {\n                errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n                    .replace(/\\{class\\}/, classname)\n                    .replace(/\\{content\\}/, e.extract[i]));\n            }\n        };\n\n        if (e.line) {\n            errorline(e, 0, '');\n            errorline(e, 1, 'line');\n            errorline(e, 2, '');\n            content += `on line ${e.line}, column ${e.column + 1}:</p><ul>${errors.join('')}</ul>`;\n        }\n        if (e.stack && (e.extract || options.logLevel >= 4)) {\n            content += `<br/>Stack Trace</br />${e.stack.split('\\n').slice(1).join('<br/>')}`;\n        }\n        elem.innerHTML = content;\n\n        // CSS for error messages\n        browser.createCSS(window.document, [\n            '.less-error-message ul, .less-error-message li {',\n            'list-style-type: none;',\n            'margin-right: 15px;',\n            'padding: 4px 0;',\n            'margin: 0;',\n            '}',\n            '.less-error-message label {',\n            'font-size: 12px;',\n            'margin-right: 15px;',\n            'padding: 4px 0;',\n            'color: #cc7777;',\n            '}',\n            '.less-error-message pre {',\n            'color: #dd6666;',\n            'padding: 4px 0;',\n            'margin: 0;',\n            'display: inline-block;',\n            '}',\n            '.less-error-message pre.line {',\n            'color: #ff0000;',\n            '}',\n            '.less-error-message h3 {',\n            'font-size: 20px;',\n            'font-weight: bold;',\n            'padding: 15px 0 5px 0;',\n            'margin: 0;',\n            '}',\n            '.less-error-message a {',\n            'color: #10a',\n            '}',\n            '.less-error-message .error {',\n            'color: red;',\n            'font-weight: bold;',\n            'padding-bottom: 2px;',\n            'border-bottom: 1px dashed red;',\n            '}'\n        ].join('\\n'), { title: 'error-message' });\n\n        elem.style.cssText = [\n            'font-family: Arial, sans-serif',\n            'border: 1px solid #e00',\n            'background-color: #eee',\n            'border-radius: 5px',\n            '-webkit-border-radius: 5px',\n            '-moz-border-radius: 5px',\n            'color: #e00',\n            'padding: 15px',\n            'margin-bottom: 15px'\n        ].join(';');\n\n        if (options.env === 'development') {\n            timer = setInterval(() => {\n                const document = window.document;\n                const body = document.body;\n                if (body) {\n                    if (document.getElementById(id)) {\n                        body.replaceChild(elem, document.getElementById(id));\n                    } else {\n                        body.insertBefore(elem, body.firstChild);\n                    }\n                    clearInterval(timer);\n                }\n            }, 10);\n        }\n    }\n\n    function removeErrorHTML(path) {\n        const node = window.document.getElementById(`less-error-message:${utils.extractId(path)}`);\n        if (node) {\n            node.parentNode.removeChild(node);\n        }\n    }\n\n    function removeErrorConsole() {\n        // no action\n    }\n\n    function removeError(path) {\n        if (!options.errorReporting || options.errorReporting === 'html') {\n            removeErrorHTML(path);\n        } else if (options.errorReporting === 'console') {\n            removeErrorConsole(path);\n        } else if (typeof options.errorReporting === 'function') {\n            options.errorReporting('remove', path);\n        }\n    }\n\n    function errorConsole(e, rootHref) {\n        const template = '{line} {content}';\n        const filename = e.filename || rootHref;\n        const errors = [];\n        let content = `${e.type || 'Syntax'}Error: ${e.message || 'There is an error in your .less file'} in ${filename}`;\n\n        const errorline = (e, i, classname) => {\n            if (e.extract[i] !== undefined) {\n                errors.push(template.replace(/\\{line\\}/, (parseInt(e.line, 10) || 0) + (i - 1))\n                    .replace(/\\{class\\}/, classname)\n                    .replace(/\\{content\\}/, e.extract[i]));\n            }\n        };\n\n        if (e.line) {\n            errorline(e, 0, '');\n            errorline(e, 1, 'line');\n            errorline(e, 2, '');\n            content += ` on line ${e.line}, column ${e.column + 1}:\\n${errors.join('\\n')}`;\n        }\n        if (e.stack && (e.extract || options.logLevel >= 4)) {\n            content += `\\nStack Trace\\n${e.stack}`;\n        }\n        less.logger.error(content);\n    }\n\n    function error(e, rootHref) {\n        if (!options.errorReporting || options.errorReporting === 'html') {\n            errorHTML(e, rootHref);\n        } else if (options.errorReporting === 'console') {\n            errorConsole(e, rootHref);\n        } else if (typeof options.errorReporting === 'function') {\n            options.errorReporting('add', e, rootHref);\n        }\n    }\n\n    return {\n        add: error,\n        remove: removeError\n    };\n};\n"
  },
  {
    "path": "packages/less/lib/less-browser/file-manager.js",
    "content": "import AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nlet options;\nlet logger;\nlet fileCache = {};\n\n// TODOS - move log somewhere. pathDiff and doing something similar in node. use pathDiff in the other browser file for the initial load\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n    alwaysMakePathsAbsolute() {\n        return true;\n    },\n\n    join(basePath, laterPath) {\n        if (!basePath) {\n            return laterPath;\n        }\n        return this.extractUrlParts(laterPath, basePath).path;\n    },\n\n    doXHR(url, type, callback, errback) {\n        const xhr = new XMLHttpRequest();\n        const async = options.isFileProtocol ? options.fileAsync : true;\n\n        if (typeof xhr.overrideMimeType === 'function') {\n            xhr.overrideMimeType('text/css');\n        }\n        logger.debug(`XHR: Getting '${url}'`);\n        xhr.open('GET', url, async);\n        xhr.setRequestHeader('Accept', type || 'text/x-less, text/css; q=0.9, */*; q=0.5');\n        xhr.send(null);\n\n        function handleResponse(xhr, callback, errback) {\n            if (xhr.status >= 200 && xhr.status < 300) {\n                callback(xhr.responseText,\n                    xhr.getResponseHeader('Last-Modified'));\n            } else if (typeof errback === 'function') {\n                errback(xhr.status, url);\n            }\n        }\n\n        if (options.isFileProtocol && !options.fileAsync) {\n            if (xhr.status === 0 || (xhr.status >= 200 && xhr.status < 300)) {\n                callback(xhr.responseText);\n            } else {\n                errback(xhr.status, url);\n            }\n        } else if (async) {\n            xhr.onreadystatechange = () => {\n                if (xhr.readyState == 4) {\n                    handleResponse(xhr, callback, errback);\n                }\n            };\n        } else {\n            handleResponse(xhr, callback, errback);\n        }\n    },\n\n    supports() {\n        return true;\n    },\n\n    clearFileCache() {\n        fileCache = {};\n    },\n\n    loadFile(filename, currentDirectory, options) {\n        // TODO: Add prefix support like less-node?\n        // What about multiple paths?\n\n        if (currentDirectory && !this.isPathAbsolute(filename)) {\n            filename = currentDirectory + filename;\n        }\n\n        filename = options.ext ? this.tryAppendExtension(filename, options.ext) : filename;\n\n        options = options || {};\n\n        // sheet may be set to the stylesheet for the initial load or a collection of properties including\n        // some context variables for imports\n        const hrefParts = this.extractUrlParts(filename, window.location.href);\n        const href      = hrefParts.url;\n        const self      = this;\n        \n        return new Promise((resolve, reject) => {\n            if (options.useFileCache && fileCache[href]) {\n                try {\n                    const lessText = fileCache[href];\n                    return resolve({ contents: lessText, filename: href, webInfo: { lastModified: new Date() }});\n                } catch (e) {\n                    return reject({ filename: href, message: `Error loading file ${href} error was ${e.message}` });\n                }\n            }\n\n            self.doXHR(href, options.mime, function doXHRCallback(data, lastModified) {\n                // per file cache\n                fileCache[href] = data;\n\n                // Use remote copy (re-parse)\n                resolve({ contents: data, filename: href, webInfo: { lastModified }});\n            }, function doXHRError(status, url) {\n                reject({ type: 'File', message: `'${url}' wasn't found (${status})`, href });\n            });\n        });\n    }\n});\n\nexport default (opts, log) => {\n    options = opts;\n    logger = log;\n    return FileManager;\n}\n"
  },
  {
    "path": "packages/less/lib/less-browser/image-size.js",
    "content": "\nimport functionRegistry from './../less/functions/function-registry.js';\n\nexport default () => {\n    function imageSize() {\n        throw {\n            type: 'Runtime',\n            message: 'Image size functions are not supported in browser version of less'\n        };\n    }\n\n    const imageFunctions = {\n        'image-size': function(filePathNode) {\n            imageSize(this, filePathNode);\n            return -1;\n        },\n        'image-width': function(filePathNode) {\n            imageSize(this, filePathNode);\n            return -1;\n        },\n        'image-height': function(filePathNode) {\n            imageSize(this, filePathNode);\n            return -1;\n        }\n    };\n\n    functionRegistry.addMultiple(imageFunctions);\n};\n"
  },
  {
    "path": "packages/less/lib/less-browser/index.js",
    "content": "//\n// index.js\n// Should expose the additional browser functions on to the less object\n//\nimport {addDataAttr} from './utils.js';\nimport lessRoot from '../less/index.js';\nimport browser from './browser.js';\nimport FM from './file-manager.js';\nimport PluginLoader from './plugin-loader.js';\nimport LogListener from './log-listener.js';\nimport ErrorReporting from './error-reporting.js';\nimport Cache from './cache.js';\nimport ImageSize from './image-size.js';\nimport pkg from '../../package.json';\n\n/**\n * @param {Window} window\n * @param {Object} options\n */\nexport default (window, options) => {\n    const document = window.document;\n    const less = lessRoot(undefined, undefined, pkg.version);\n\n    less.options = options;\n    const environment = less.environment;\n    const FileManager = FM(options, less.logger);\n    const fileManager = new FileManager();\n    environment.addFileManager(fileManager);\n    less.FileManager = FileManager;\n    less.PluginLoader = PluginLoader;\n\n    LogListener(less, options);\n    const errors = ErrorReporting(window, less, options);\n    const cache = less.cache = options.cache || Cache(window, options, less.logger);\n    ImageSize(less.environment);\n\n    // Setup user functions - Deprecate?\n    if (options.functions) {\n        less.functions.functionRegistry.addMultiple(options.functions);\n    }\n\n    const typePattern = /^text\\/(x-)?less$/;\n\n    function clone(obj) {\n        const cloned = {};\n        for (const prop in obj) {\n            if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n                cloned[prop] = obj[prop];\n            }\n        }\n        return cloned;\n    }\n\n    function loadStyles(modifyVars) {\n        const styles = document.getElementsByTagName('style');\n\n        for (let style of styles) {\n            if (style.type.match(typePattern)) {\n                const instanceOptions = {\n                    ...clone(options),\n                    modifyVars,\n                    filename: document.location.href.replace(/#.*$/, '')\n                }\n\n                const lessText = style.innerHTML || '';\n\n                /* jshint loopfunc:true */\n                less.render(lessText, instanceOptions, (err, result) => {\n                    if (err) {\n                        errors.add(err, 'inline');\n                    } else {\n                        style.type = 'text/css';\n                        if (style.styleSheet) {\n                            style.styleSheet.cssText = result.css;\n                        } else {\n                            style.innerHTML = result.css;\n                        }\n                    }\n                });\n            }\n        }\n    }\n\n    function loadStyleSheet(sheet, callback, reload, remaining, modifyVars) {\n\n        const instanceOptions = clone(options);\n        addDataAttr(instanceOptions, sheet);\n        instanceOptions.mime = sheet.type;\n\n        if (modifyVars) {\n            instanceOptions.modifyVars = modifyVars;\n        }\n\n        function loadInitialFileCallback(loadedFile) {\n            const data = loadedFile.contents;\n            const path = loadedFile.filename;\n            const webInfo = loadedFile.webInfo;\n\n            const newFileInfo = {\n                currentDirectory: fileManager.getPath(path),\n                filename: path,\n                rootFilename: path,\n                rewriteUrls: instanceOptions.rewriteUrls\n            };\n\n            newFileInfo.entryPath = newFileInfo.currentDirectory;\n            newFileInfo.rootpath = instanceOptions.rootpath || newFileInfo.currentDirectory;\n\n            if (webInfo) {\n                webInfo.remaining = remaining;\n\n                const css = cache.getCSS(path, webInfo, instanceOptions.modifyVars);\n                if (!reload && css) {\n                    webInfo.local = true;\n                    callback(null, css, data, sheet, webInfo, path);\n                    return;\n                }\n\n            }\n\n            // TODO add tests around how this behaves when reloading\n            errors.remove(path);\n\n            instanceOptions.rootFileInfo = newFileInfo;\n            less.render(data, instanceOptions, (e, result) => {\n                if (e) {\n                    e.href = path;\n                    callback(e);\n                } else {\n                    cache.setCSS(sheet.href, webInfo.lastModified, instanceOptions.modifyVars, result.css);\n                    callback(null, result.css, data, sheet, webInfo, path);\n                }\n            });\n        }\n\n        fileManager.loadFile(sheet.href, null, instanceOptions, environment)\n            .then(loadedFile => {\n                loadInitialFileCallback(loadedFile);\n            }).catch(err => {\n                console.log(err);\n                callback(err);\n            });\n\n    }\n\n    function loadStyleSheets(callback, reload, modifyVars) {\n        for (let i = 0; i < less.sheets.length; i++) {\n            loadStyleSheet(less.sheets[i], callback, reload, less.sheets.length - (i + 1), modifyVars);\n        }\n    }\n\n    function initRunningMode() {\n        if (less.env === 'development') {\n            less.watchTimer = setInterval(() => {\n                if (less.watchMode) {\n                    fileManager.clearFileCache();\n                    /**\n                     * @todo remove when this is typed with JSDoc\n                     */\n                    // eslint-disable-next-line no-unused-vars\n                    loadStyleSheets((e, css, _, sheet, webInfo) => {\n                        if (e) {\n                            errors.add(e, e.href || sheet.href);\n                        } else if (css) {\n                            browser.createCSS(window.document, css, sheet);\n                        }\n                    });\n                }\n            }, options.poll);\n        }\n    }\n\n    //\n    // Watch mode\n    //\n    less.watch = function () {\n        if (!less.watchMode ) {\n            less.env = 'development';\n            initRunningMode();\n        }\n        this.watchMode = true;\n        return true;\n    };\n\n    less.unwatch = function () {clearInterval(less.watchTimer); this.watchMode = false; return false; };\n\n    //\n    // Synchronously get all <link> tags with the 'rel' attribute set to\n    // \"stylesheet/less\".\n    //\n    less.registerStylesheetsImmediately = () => {\n        const links = document.getElementsByTagName('link');\n        less.sheets = [];\n\n        for (let i = 0; i < links.length; i++) {\n            if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n                (links[i].type.match(typePattern)))) {\n                less.sheets.push(links[i]);\n            }\n        }\n    };\n\n    //\n    // Asynchronously get all <link> tags with the 'rel' attribute set to\n    // \"stylesheet/less\", returning a Promise.\n    //\n    less.registerStylesheets = () => new Promise((resolve) => {\n        less.registerStylesheetsImmediately();\n        resolve();\n    });\n\n    //\n    // With this function, it's possible to alter variables and re-render\n    // CSS without reloading less-files\n    //\n    less.modifyVars = record => less.refresh(true, record, false);\n\n    less.refresh = (reload, modifyVars, clearFileCache) => {\n        if ((reload || clearFileCache) && clearFileCache !== false) {\n            fileManager.clearFileCache();\n        }\n        return new Promise((resolve, reject) => {\n            let startTime;\n            let endTime;\n            let totalMilliseconds;\n            let remainingSheets;\n            startTime = endTime = new Date();\n\n            // Set counter for remaining unprocessed sheets\n            remainingSheets = less.sheets.length;\n\n            if (remainingSheets === 0) {\n\n                endTime = new Date();\n                totalMilliseconds = endTime - startTime;\n                less.logger.info('Less has finished and no sheets were loaded.');\n                resolve({\n                    startTime,\n                    endTime,\n                    totalMilliseconds,\n                    sheets: less.sheets.length\n                });\n\n            } else {\n                // Relies on less.sheets array, callback seems to be guaranteed to be called for every element of the array\n                loadStyleSheets((e, css, _, sheet, webInfo) => {\n                    if (e) {\n                        errors.add(e, e.href || sheet.href);\n                        reject(e);\n                        return;\n                    }\n                    if (webInfo.local) {\n                        less.logger.info(`Loading ${sheet.href} from cache.`);\n                    } else {\n                        less.logger.info(`Rendered ${sheet.href} successfully.`);\n                    }\n                    browser.createCSS(window.document, css, sheet);\n                    less.logger.info(`CSS for ${sheet.href} generated in ${new Date() - endTime}ms`);\n\n                    // Count completed sheet\n                    remainingSheets--;\n\n                    // Check if the last remaining sheet was processed and then call the promise\n                    if (remainingSheets === 0) {\n                        totalMilliseconds = new Date() - startTime;\n                        less.logger.info(`Less has finished. CSS generated in ${totalMilliseconds}ms`);\n                        resolve({\n                            startTime,\n                            endTime,\n                            totalMilliseconds,\n                            sheets: less.sheets.length\n                        });\n                    }\n                    endTime = new Date();\n                }, reload, modifyVars);\n            }\n\n            loadStyles(modifyVars);\n        });\n    };\n\n    less.refreshStyles = loadStyles;\n    return less;\n};\n"
  },
  {
    "path": "packages/less/lib/less-browser/log-listener.js",
    "content": "export default (less, options) => {\n    const logLevel_debug = 4;\n    const logLevel_info = 3;\n    const logLevel_warn = 2;\n    const logLevel_error = 1;\n\n    // The amount of logging in the javascript console.\n    // 3 - Debug, information and errors\n    // 2 - Information and errors\n    // 1 - Errors\n    // 0 - None\n    // Defaults to 2\n    options.logLevel = typeof options.logLevel !== 'undefined' ? options.logLevel : (options.env === 'development' ?  logLevel_info : logLevel_error);\n\n    if (!options.loggers) {\n        options.loggers = [{\n            debug: function(msg) {\n                if (options.logLevel >= logLevel_debug) {\n                    console.log(msg);\n                }\n            },\n            info: function(msg) {\n                if (options.logLevel >= logLevel_info) {\n                    console.log(msg);\n                }\n            },\n            warn: function(msg) {\n                if (options.logLevel >= logLevel_warn) {\n                    console.warn(msg);\n                }\n            },\n            error: function(msg) {\n                if (options.logLevel >= logLevel_error) {\n                    console.error(msg);\n                }\n            }\n        }];\n    }\n    for (let i = 0; i < options.loggers.length; i++) {\n        less.logger.addListener(options.loggers[i]);\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less-browser/plugin-loader.js",
    "content": "/**\n * @todo Add tests for browser `@plugin`\n */\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\n/**\n * Browser Plugin Loader\n */\nconst PluginLoader = function(less) {\n    this.less = less;\n    // Should we shim this.require for browser? Probably not?\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n    loadPlugin(filename, basePath, context, environment, fileManager) {\n        return new Promise((fulfill, reject) => {\n            fileManager.loadFile(filename, basePath, context, environment)\n                .then(fulfill).catch(reject);\n        });\n    }\n});\n\nexport default PluginLoader;\n\n"
  },
  {
    "path": "packages/less/lib/less-browser/utils.js",
    "content": "\n/** @param {string} href */\nexport function extractId(href) {\n    return href.replace(/^[a-z-]+:\\/+?[^/]+/, '')  // Remove protocol & domain\n        .replace(/[?&]livereload=\\w+/, '')        // Remove LiveReload cachebuster\n        .replace(/^\\//, '')                         // Remove root /\n        .replace(/\\.[a-zA-Z]+$/, '')                // Remove simple extension\n        .replace(/[^.\\w-]+/g, '-')                 // Replace illegal characters\n        .replace(/\\./g, ':');                       // Replace dots with colons(for valid id)\n}\n\n/**\n * @param {Record<string, *>} options\n * @param {HTMLElement | null} tag\n */\nexport function addDataAttr(options, tag) {\n    if (!tag) {return;} // in case of tag is null or undefined\n    for (const opt in tag.dataset) {\n        if (Object.prototype.hasOwnProperty.call(tag.dataset, opt)) {\n            if (opt === 'env' || opt === 'dumpLineNumbers' || opt === 'rootpath' || opt === 'errorReporting') {\n                options[opt] = tag.dataset[opt];\n            } else {\n                try {\n                    options[opt] = JSON.parse(tag.dataset[opt]);\n                }\n                catch (_) {}\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/less/lib/less-node/environment.js",
    "content": "import { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\nclass SourceMapGeneratorFallback {\n    addMapping(){}\n    setSourceContent(){}\n    toJSON(){\n        return null;\n    }\n};\n\nexport default {\n    encodeBase64: function encodeBase64(str) {\n        // Avoid Buffer constructor on newer versions of Node.js.\n        const buffer = (Buffer.from ? Buffer.from(str) : (new Buffer(str)));\n        return buffer.toString('base64');\n    },\n    mimeLookup: function (filename) {\n        try {\n            const mimeModule = require('mime');\n            return mimeModule ? mimeModule.lookup(filename) : \"application/octet-stream\";\n        } catch (e) {\n            return \"application/octet-stream\";\n        }\n    },\n    charsetLookup: function (mime) {\n        try {\n            const mimeModule = require('mime');\n            return mimeModule ? mimeModule.charsets.lookup(mime) : undefined;\n        } catch (e) {\n            return undefined;\n        }\n    },\n    getSourceMapGenerator: function getSourceMapGenerator() {\n        try {\n            const sourceMapModule = require('source-map');\n            return sourceMapModule ? sourceMapModule.SourceMapGenerator : SourceMapGeneratorFallback;\n        } catch (e) {\n            return SourceMapGeneratorFallback;\n        }\n    }\n};\n"
  },
  {
    "path": "packages/less/lib/less-node/file-manager.js",
    "content": "import path from 'path';\nimport { createRequire } from 'module';\nimport fs from './fs.js';\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\n\nconst require = createRequire(import.meta.url);\n\nconst FileManager = function() {}\nFileManager.prototype = Object.assign(new AbstractFileManager(), {\n    supports() {\n        return true;\n    },\n\n    supportsSync() {\n        return true;\n    },\n\n    loadFile(filename, currentDirectory, options, environment, callback) {\n        let fullFilename;\n        const isAbsoluteFilename = this.isPathAbsolute(filename);\n        const filenamesTried = [];\n        const self = this;\n        const prefix = filename.slice(0, 1);\n        const explicit = prefix === '.' || prefix === '/';\n        let result = null;\n        let isNodeModule = false;\n        const npmPrefix = 'npm://';\n\n        options = options || {};\n\n        const paths = isAbsoluteFilename ? [''] : [currentDirectory];\n\n        if (options.paths) { paths.push.apply(paths, options.paths); }\n\n        if (!isAbsoluteFilename && paths.indexOf('.') === -1) { paths.push('.'); }\n\n        const prefixes = options.prefixes || [''];\n        const fileParts = this.extractUrlParts(filename);\n\n        if (options.syncImport) {\n            getFileData(returnData, returnData);\n            if (callback) {\n                callback(result.error, result);\n            }\n            else {\n                return result;\n            }\n        }\n        else {\n            // promise is guaranteed to be asyncronous\n            // which helps as it allows the file handle\n            // to be closed before it continues with the next file\n            return new Promise(getFileData);\n        }\n\n        function returnData(data) {\n            if (!data.filename) {\n                result = { error: data };\n            }\n            else {\n                result = data;\n            }\n        }\n\n        function getFileData(fulfill, reject) {\n            (function tryPathIndex(i) {\n                function tryWithExtension() {\n                    const extFilename = options.ext ? self.tryAppendExtension(fullFilename, options.ext) : fullFilename;\n\n                    if (extFilename !== fullFilename && !explicit && paths[i] === '.') {\n                        try {\n                            fullFilename = require.resolve(extFilename);\n                            isNodeModule = true;\n                        }\n                        catch (e) {\n                            filenamesTried.push(npmPrefix + extFilename);\n                            fullFilename = extFilename;\n                        }\n                    }\n                    else {\n                        fullFilename = extFilename;\n                    }\n                }\n                if (i < paths.length) {\n                    (function tryPrefix(j) {\n                        if (j < prefixes.length) {\n                            isNodeModule = false;\n                            fullFilename = fileParts.rawPath + prefixes[j] + fileParts.filename;\n\n                            if (paths[i]) {\n                                if (paths[i].startsWith('#')) {\n                                    // Handling paths starting with '#'\n                                    fullFilename = paths[i].substr(1) + fullFilename;\n                                }else{\n                                    fullFilename = path.join(paths[i], fullFilename);\n                                }\n                            }\n\n                            if (!explicit && paths[i] === '.') {\n                                try {\n                                    fullFilename = require.resolve(fullFilename);\n                                    isNodeModule = true;\n                                }\n                                catch (e) {\n                                    filenamesTried.push(npmPrefix + fullFilename);\n                                    tryWithExtension();\n                                }\n                            }\n                            else {\n                                tryWithExtension();\n                            }                            \n\n                            const readFileArgs = [fullFilename];\n                            if (!options.rawBuffer) {\n                                readFileArgs.push('utf-8');\n                            }\n                            if (options.syncImport) {\n                                try {\n                                    const data = fs.readFileSync.apply(this, readFileArgs);\n                                    fulfill({ contents: data, filename: fullFilename});\n                                }\n                                catch (e) {\n                                    filenamesTried.push(isNodeModule ? npmPrefix + fullFilename : fullFilename);\n                                    return tryPrefix(j + 1);\n                                }\n                            }\n                            else {\n                                readFileArgs.push(function(e, data) {\n                                    if (e) {\n                                        filenamesTried.push(isNodeModule ? npmPrefix + fullFilename : fullFilename);\n                                        return tryPrefix(j + 1);\n                                    }   \n                                    fulfill({ contents: data, filename: fullFilename});\n                                });\n                                fs.readFile.apply(this, readFileArgs);\n                            }\n\n                        }\n                        else {\n                            tryPathIndex(i + 1);\n                        }\n                    })(0);\n                } else {\n                    reject({ type: 'File', message: `'${filename}' wasn't found. Tried - ${filenamesTried.join(',')}` });\n                }\n            }(0));\n        }\n    },\n\n    loadFileSync(filename, currentDirectory, options, environment) {\n        options.syncImport = true;\n        return this.loadFile(filename, currentDirectory, options, environment);\n    }\n});\n\nexport default FileManager;\n"
  },
  {
    "path": "packages/less/lib/less-node/fs.js",
    "content": "/** @typedef {import('fs')} FS */\nimport nodeFs from 'fs';\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\n/** @type {FS} */\nlet fs;\ntry {\n    fs = require('graceful-fs');\n} catch (e) {\n    fs = nodeFs;\n}\nexport default fs;\n"
  },
  {
    "path": "packages/less/lib/less-node/image-size.js",
    "content": "import { createRequire } from 'module';\nimport Dimension from '../less/tree/dimension.js';\nimport Expression from '../less/tree/expression.js';\nimport functionRegistry from './../less/functions/function-registry.js';\n\nconst require = createRequire(import.meta.url);\n\nexport default environment => {\n\n    function imageSize(functionContext, filePathNode) {\n        let filePath = filePathNode.value;\n        const currentFileInfo = functionContext.currentFileInfo;\n        const currentDirectory = currentFileInfo.rewriteUrls ?\n            currentFileInfo.currentDirectory : currentFileInfo.entryPath;\n\n        const fragmentStart = filePath.indexOf('#');\n        if (fragmentStart !== -1) {\n            filePath = filePath.slice(0, fragmentStart);\n        }\n\n        const fileManager = environment.getFileManager(filePath, currentDirectory, functionContext.context, environment, true);\n\n        if (!fileManager) {\n            throw {\n                type: 'File',\n                message: `Can not set up FileManager for ${filePathNode}`\n            };\n        }\n\n        const fileSync = fileManager.loadFileSync(filePath, currentDirectory, functionContext.context, environment);\n\n        if (fileSync.error) {\n            throw fileSync.error;\n        }\n\n        const sizeOf = require('image-size');\n        return sizeOf ? sizeOf(fileSync.filename) : {width: 0, height: 0};\n    }\n\n    const imageFunctions = {\n        'image-size': function(filePathNode) {\n            const size = imageSize(this, filePathNode);\n            return new Expression([\n                new Dimension(size.width, 'px'),\n                new Dimension(size.height, 'px')\n            ]);\n        },\n        'image-width': function(filePathNode) {\n            const size = imageSize(this, filePathNode);\n            return new Dimension(size.width, 'px');\n        },\n        'image-height': function(filePathNode) {\n            const size = imageSize(this, filePathNode);\n            return new Dimension(size.height, 'px');\n        }\n    };\n\n    functionRegistry.addMultiple(imageFunctions);\n};\n"
  },
  {
    "path": "packages/less/lib/less-node/index.js",
    "content": "import { createRequire } from 'module';\nimport environment from './environment.js';\nimport FileManager from './file-manager.js';\nimport UrlFileManager from './url-file-manager.js';\nimport createFromEnvironment from '../less/index.js';\nimport lesscHelper from './lessc-helper.js';\nimport PluginLoader from './plugin-loader.js';\nimport fs from './fs.js';\nimport defaultOptions from '../less/default-options.js';\nimport imageSize from './image-size.js';\n\nconst require = createRequire(import.meta.url);\nconst { version } = require('../../package.json');\n\nconst less = createFromEnvironment(environment, [new FileManager(), new UrlFileManager()], version);\n\n// allow people to create less with their own environment\nless.createFromEnvironment = createFromEnvironment;\nless.lesscHelper = lesscHelper;\nless.PluginLoader = PluginLoader;\nless.fs = fs;\nless.FileManager = FileManager;\nless.UrlFileManager = UrlFileManager;\n\n// Set up options\nless.options = defaultOptions();\n\n// provide image-size functionality\nimageSize(less.environment);\n\nexport default less;\n"
  },
  {
    "path": "packages/less/lib/less-node/lessc-helper.js",
    "content": "// lessc_helper.js\n//\n//      helper functions for lessc\nconst lessc_helper = {\n\n    // Stylize a string\n    stylize : function(str, style) {\n        const styles = {\n            'reset'     : [0,   0],\n            'bold'      : [1,  22],\n            'inverse'   : [7,  27],\n            'underline' : [4,  24],\n            'yellow'    : [33, 39],\n            'green'     : [32, 39],\n            'red'       : [31, 39],\n            'grey'      : [90, 39]\n        };\n        return `\\x1b[${styles[style][0]}m${str}\\x1b[${styles[style][1]}m`;\n    },\n\n    // Print command line options\n    printUsage: function() {\n        console.log('usage: lessc [option option=parameter ...] <source> [destination]');\n        console.log('');\n        console.log('If source is set to `-\\' (dash or hyphen-minus), input is read from stdin.');\n        console.log('');\n        console.log('options:');\n        console.log('  -h, --help                   Prints help (this message) and exit.');\n        console.log('  --include-path=PATHS         Sets include paths. Separated by `:\\'. `;\\' also supported on windows.');\n        console.log('  -M, --depends                Outputs a makefile import dependency list to stdout.');\n        console.log('  --no-color                   Disables colorized output.');\n        console.log('  --ie-compat                  Enables IE8 compatibility checks.');\n        console.log('  --js                         Enables inline JavaScript in less files');\n        console.log('  -l, --lint                   Syntax check only (lint).');\n        console.log('  -s, --silent                 Suppresses output of error messages.');\n        console.log('  --quiet                      Suppresses output of warnings.');\n        console.log('  --strict-imports             (DEPRECATED) Ignores .less imports inside selector blocks. Has confusing behavior.');\n        console.log('  --insecure                   Allows imports from insecure https hosts.');\n        console.log('  -v, --version                Prints version number and exit.');\n        console.log('  --verbose                    Be verbose.');\n        console.log('  --source-map[=FILENAME]      Outputs a v3 sourcemap to the filename (or output filename.map).');\n        console.log('  --source-map-rootpath=X      Adds this path onto the sourcemap filename and less file paths.');\n        console.log('  --source-map-basepath=X      Sets sourcemap base path, defaults to current working directory.');\n        console.log('  --source-map-include-source  Puts the less files into the map instead of referencing them.');\n        console.log('  --source-map-inline          Puts the map (and any less files) as a base64 data uri into the output css file.');\n        console.log('  --source-map-url=URL         Sets a custom URL to map file, for sourceMappingURL comment');\n        console.log('                               in generated CSS file.');\n        console.log('  --source-map-no-annotation   Excludes the sourceMappingURL comment from the output css file.');\n        console.log('  -rp, --rootpath=URL          Sets rootpath for url rewriting in relative imports and urls');\n        console.log('                               Works with or without the relative-urls option.');\n        console.log('  -ru=, --rewrite-urls=        Rewrites URLs to make them relative to the base less file.');\n        console.log('    all|local|off              \\'all\\' rewrites all URLs, \\'local\\' just those starting with a \\'.\\'');\n        console.log('');\n        console.log('  -m=, --math=');\n        console.log('     always                    Less will eagerly perform math operations always.');\n        console.log('     parens-division           Math performed except for division (/) operator');\n        console.log('     parens | strict           Math only performed inside parentheses');\n        console.log('     strict-legacy             Parens required in very strict terms (legacy --strict-math)');\n        console.log('');\n        console.log('  -su=on|off                   Allows mixed units, e.g. 1px+1em or 1px*1px which have units');\n        console.log('  --strict-units=on|off        that cannot be represented.');\n        console.log('  --global-var=\\'VAR=VALUE\\'     Defines a variable that can be referenced by the file.');\n        console.log('  --modify-var=\\'VAR=VALUE\\'     Modifies a variable already declared in the file.');\n        console.log('  --url-args=\\'QUERYSTRING\\'     Adds params into url tokens (e.g. 42, cb=42 or \\'a=1&b=2\\')');\n        console.log('  --plugin=PLUGIN=OPTIONS      Loads a plugin. You can also omit the --plugin= if the plugin begins');\n        console.log('                               less-plugin. E.g. the clean css plugin is called less-plugin-clean-css');\n        console.log('                               once installed (npm install less-plugin-clean-css), use either with');\n        console.log('                               --plugin=less-plugin-clean-css or just --clean-css');\n        console.log('                               specify options afterwards e.g. --plugin=less-plugin-clean-css=\"advanced\"');\n        console.log('                               or --clean-css=\"advanced\"');\n        console.log('  --disable-plugin-rule        Disallow @plugin statements');\n        console.log('');\n        console.log('  --quiet-deprecations         Suppress deprecation warnings only (keeps other warnings).');\n        console.log('');\n        console.log('-------------------------- Deprecated ----------------');\n        console.log('  -sm=on|off               Legacy parens-only math. Use --math');\n        console.log('  --strict-math=on|off     ');\n        console.log('');\n        console.log('  --line-numbers=TYPE      (DEPRECATED) Outputs filename and line numbers.');\n        console.log('                           TYPE can be either \\'comments\\', \\'mediaquery\\', or \\'all\\'.');\n        console.log('                           The entire dumpLineNumbers option is deprecated.');\n        console.log('                           Use sourcemaps (--source-map) instead.');\n        console.log('                           All modes will be removed in a future version.');\n        console.log('                           Note: \\'mediaquery\\' and \\'all\\' modes generate @media -sass-debug-info');\n        console.log('                           which had short-lived usage and is no longer recommended.');\n        console.log('  -x, --compress           Compresses output by removing some whitespaces.');\n        console.log('                           We recommend you use a dedicated minifer like less-plugin-clean-css');\n        console.log('');\n        console.log('Report bugs to: http://github.com/less/less.js/issues');\n        console.log('Home page: <http://lesscss.org/>');\n    }\n};\n\nexport const { stylize, printUsage } = lessc_helper;\nexport default lessc_helper;\n"
  },
  {
    "path": "packages/less/lib/less-node/plugin-loader.js",
    "content": "import path from 'path';\nimport { createRequire } from 'module';\nimport AbstractPluginLoader from '../less/environment/abstract-plugin-loader.js';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Node Plugin Loader\n */\nconst PluginLoader = function(less) {\n    this.less = less;\n    this.require = prefix => {\n        prefix = path.dirname(prefix);\n        return id => {\n            const str = id.slice(0, 2);\n            if (str === '..' || str === './') {\n                return require(path.join(prefix, id));\n            }\n            else {\n                return require(id);\n            }\n        };\n    };\n};\n\nPluginLoader.prototype = Object.assign(new AbstractPluginLoader(), {\n    loadPlugin(filename, basePath, context, environment, fileManager) {\n        const prefix = filename.slice(0, 1);\n        const explicit = prefix === '.' || prefix === '/' || filename.slice(-3).toLowerCase() === '.js';\n        if (!explicit) {\n            context.prefixes = ['less-plugin-', ''];\n        }\n\n        if (context.syncImport) {\n            return fileManager.loadFileSync(filename, basePath, context, environment);\n        }\n\n        return new Promise((fulfill, reject) => {\n            fileManager.loadFile(filename, basePath, context, environment).then(\n                data => {\n                    try {\n                        fulfill(data);\n                    }\n                    catch (e) {\n                        console.log(e);\n                        reject(e);\n                    }\n                }\n            ).catch(err => {\n                reject(err);\n            });\n        });\n    },\n\n    loadPluginSync(filename, basePath, context, environment, fileManager) {\n        context.syncImport = true;\n        return this.loadPlugin(filename, basePath, context, environment, fileManager);\n    }\n});\n\nexport default PluginLoader;\n\n"
  },
  {
    "path": "packages/less/lib/less-node/url-file-manager.js",
    "content": "/* eslint-disable no-unused-vars */\n/**\n * @todo - remove top eslint rule when FileManagers have JSDoc type\n * and are TS-type-checked\n */\nimport { createRequire } from 'module';\n\nconst require = createRequire(import.meta.url);\n\nconst isUrlRe = /^(?:https?:)?\\/\\//i;\nimport url from 'url';\nlet request;\nimport AbstractFileManager from '../less/environment/abstract-file-manager.js';\nimport logger from '../less/logger.js';\n\nconst UrlFileManager = function() {}\nUrlFileManager.prototype = Object.assign(new AbstractFileManager(), {\n    supports(filename, currentDirectory, options, environment) {\n        return isUrlRe.test( filename ) || isUrlRe.test(currentDirectory);\n    },\n\n    loadFile(filename, currentDirectory, options, environment) {\n        return new Promise((fulfill, reject) => {\n            if (request === undefined) {\n                try { request = require('needle'); }\n                catch (e) { request = null; }\n            }\n            if (!request) {\n                reject({ type: 'File', message: 'optional dependency \\'needle\\' required to import over http(s)\\n' });\n                return;\n            }\n\n            let urlStr = isUrlRe.test( filename ) ? filename : url.resolve(currentDirectory, filename);\n\n            /** native-request currently has a bug */\n            const hackUrlStr = urlStr.indexOf('?') === -1 ? urlStr + '?' : urlStr\n\n            request.get(hackUrlStr, { follow_max: 5 }, (err, resp, body) => {\n                if (err || resp && resp.statusCode >= 400) {\n                    const message = resp && resp.statusCode === 404\n                        ? `resource '${urlStr}' was not found\\n`\n                        : `resource '${urlStr}' gave this Error:\\n  ${err || resp.statusMessage || resp.statusCode}\\n`;\n                    reject({ type: 'File', message });\n                    return;\n                }\n                if (resp.statusCode >= 300) {\n                    reject({ type: 'File', message: `resource '${urlStr}' caused too many redirects` });\n                    return;\n                }\n                body = body.toString('utf8');\n                if (!body) {\n                    logger.warn(`Warning: Empty body (HTTP ${resp.statusCode}) returned by \"${urlStr}\"`);\n                }\n                fulfill({ contents: body || '', filename: urlStr });\n            });\n        });\n    }\n});\n\nexport default UrlFileManager;\n"
  },
  {
    "path": "packages/less/package.json",
    "content": "{\n\t\"name\": \"less\",\n\t\"version\": \"4.6.3\",\n\t\"description\": \"Leaner CSS\",\n\t\"homepage\": \"http://lesscss.org\",\n\t\"author\": {\n\t\t\"name\": \"Alexis Sellier\",\n\t\t\"email\": \"self@cloudhead.net\"\n\t},\n\t\"contributors\": [\n\t\t\"The Core Less Team\"\n\t],\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/less/less.js/issues\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/less/less.js.git\"\n\t},\n\t\"master\": {\n\t\t\"url\": \"https://github.com/less/less.js/blob/master/\",\n\t\t\"raw\": \"https://raw.githubusercontent.com/less/less.js/master/\"\n\t},\n\t\"license\": \"Apache-2.0\",\n\t\"type\": \"module\",\n\t\"bin\": {\n\t\t\"lessc\": \"./bin/lessc\"\n\t},\n\t\"main\": \"./dist/less-node.cjs\",\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"browser\": \"./dist/less.js\",\n\t\t\t\"import\": \"./lib/less-node/index.js\",\n\t\t\t\"require\": \"./dist/less-node.cjs\",\n\t\t\t\"default\": \"./lib/less-node/index.js\"\n\t\t},\n\t\t\"./lib/*\": \"./lib/*\",\n\t\t\"./dist/less-node.cjs\": \"./dist/less-node.cjs\",\n\t\t\"./dist/less.js\": \"./dist/less.js\",\n\t\t\"./dist/less.min.js\": \"./dist/less.min.js\"\n\t},\n\t\"directories\": {\n\t\t\"test\": \"./test\"\n\t},\n\t\"files\": [\n\t\t\"bin\",\n\t\t\"lib\",\n\t\t\"!lib/**/*.map\",\n\t\t\"dist\",\n\t\t\"index.cjs\",\n\t\t\"README.md\"\n\t],\n\t\"browser\": \"./dist/less.js\",\n\t\"engines\": {\n\t\t\"node\": \">=18\"\n\t},\n\t\"scripts\": {\n\t\t\"quicktest\": \"grunt quicktest\",\n\t\t\"test\": \"grunt test\",\n\t\t\"test:node\": \"grunt test:node\",\n\t\t\"test:coverage\": \"c8 -r lcov -r json-summary -r text-summary -r html --include=\\\"lib/**/*.js\\\" --include=\\\"bin/**/*.js\\\" --exclude=\\\"dist/**\\\" --exclude=\\\"**/*.test.js\\\" --exclude=\\\"**/*.spec.js\\\" --exclude=\\\"test/**\\\" --exclude=\\\"tmp/**\\\" --exclude=\\\"**/abstract-file-manager.js\\\" --exclude=\\\"**/abstract-plugin-loader.js\\\" grunt shell:test && node scripts/coverage-report.js && node scripts/coverage-lines.js\",\n\t\t\"grunt\": \"grunt\",\n\t\t\"lint\": \"eslint '**/*.{ts,js}'\",\n\t\t\"lint:fix\": \"eslint '**/*.{ts,js}' --fix\",\n\t\t\"typecheck\": \"tsc --noEmit\",\n\t\t\"build\": \"node build/rollup.js --dist\",\n\t\t\"prepublishOnly\": \"npm run typecheck && grunt dist && grunt test:node\"\n\t},\n\t\"optionalDependencies\": {\n\t\t\"errno\": \"^0.1.1\",\n\t\t\"graceful-fs\": \"^4.1.2\",\n\t\t\"image-size\": \"~0.5.0\",\n\t\t\"make-dir\": \"^5.1.0\",\n\t\t\"mime\": \"^1.4.1\",\n\t\t\"needle\": \"^3.1.0\",\n\t\t\"source-map\": \"~0.6.0\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@less/test-data\": \"workspace:*\",\n\t\t\"@less/test-import-module\": \"workspace:*\",\n\t\t\"@rollup/plugin-commonjs\": \"^17.0.0\",\n\t\t\"@rollup/plugin-json\": \"^4.1.0\",\n\t\t\"@rollup/plugin-node-resolve\": \"^11.0.0\",\n\t\t\"@types/node\": \"^18\",\n\t\t\"@typescript-eslint/eslint-plugin\": \"^4.28.0\",\n\t\t\"@typescript-eslint/parser\": \"^4.28.0\",\n\t\t\"benny\": \"^3.6.12\",\n\t\t\"bootstrap-less-port\": \"0.3.0\",\n\t\t\"c8\": \"^10.1.3\",\n\t\t\"chai\": \"^4.2.0\",\n\t\t\"chalk\": \"^4.1.2\",\n\t\t\"cosmiconfig\": \"~9.0.0\",\n\t\t\"cross-env\": \"^7.0.3\",\n\t\t\"eslint\": \"^7.29.0\",\n\t\t\"fs-extra\": \"^8.1.0\",\n\t\t\"git-rev\": \"^0.2.1\",\n\t\t\"glob\": \"~11.0.3\",\n\t\t\"globby\": \"^10.0.1\",\n\t\t\"grunt\": \"^1.5.0\",\n\t\t\"grunt-cli\": \"^1.3.2\",\n\t\t\"grunt-contrib-clean\": \"^1.0.0\",\n\t\t\"grunt-contrib-connect\": \"^1.0.2\",\n\t\t\"grunt-eslint\": \"^23.0.0\",\n\t\t\"grunt-saucelabs\": \"^9.0.1\",\n\t\t\"grunt-shell\": \"^1.3.0\",\n\t\t\"html-template-tag\": \"^3.2.0\",\n\t\t\"jest-diff\": \"~30.1.2\",\n\t\t\"jit-grunt\": \"^0.10.0\",\n\t\t\"less-plugin-autoprefix\": \"^1.5.1\",\n\t\t\"less-plugin-clean-css\": \"^1.6.0\",\n\t\t\"minimist\": \"^1.2.0\",\n\t\t\"mocha\": \"^6.2.1\",\n\t\t\"mocha-teamcity-reporter\": \"^3.0.0\",\n\t\t\"npm-run-all\": \"^4.1.5\",\n\t\t\"performance-now\": \"^0.2.0\",\n\t\t\"phin\": \"^2.2.3\",\n\t\t\"playwright\": \"1.50.1\",\n\t\t\"promise\": \"^7.1.1\",\n\t\t\"read-glob\": \"^3.0.0\",\n\t\t\"resolve\": \"^1.17.0\",\n\t\t\"rollup\": \"^2.52.2\",\n\t\t\"rollup-plugin-terser\": \"^5.1.1\",\n\t\t\"semver\": \"^6.3.0\",\n\t\t\"shx\": \"^0.3.2\",\n\t\t\"time-grunt\": \"^1.3.0\",\n\t\t\"typescript\": \"^5.7.0\",\n\t\t\"uikit\": \"2.27.4\",\n\t\t\"url\": \"^0.11.4\",\n\t\t\"path-browserify\": \"^1.0.1\",\n\t\t\"webpack\": \"^5.64.6\",\n\t\t\"webpack-cli\": \"^5.1.4\"\n\t},\n\t\"keywords\": [\n\t\t\"compile less\",\n\t\t\"css nesting\",\n\t\t\"css variable\",\n\t\t\"css\",\n\t\t\"gradients css\",\n\t\t\"gradients css3\",\n\t\t\"less compiler\",\n\t\t\"less css\",\n\t\t\"less mixins\",\n\t\t\"less\",\n\t\t\"less.js\",\n\t\t\"lesscss\",\n\t\t\"mixins\",\n\t\t\"nested css\",\n\t\t\"parser\",\n\t\t\"preprocessor\",\n\t\t\"bootstrap css\",\n\t\t\"bootstrap less\",\n\t\t\"style\",\n\t\t\"styles\",\n\t\t\"stylesheet\",\n\t\t\"variables in css\",\n\t\t\"css less\"\n\t],\n\t\"rawcurrent\": \"https://raw.github.com/less/less.js/v\",\n\t\"sourcearchive\": \"https://github.com/less/less.js/archive/v\",\n\t\"dependencies\": {\n\t\t\"copy-anything\": \"^3.0.5\",\n\t\t\"parse-node-version\": \"^1.0.1\"\n\t},\n\t\"gitHead\": \"1df9072ee9ebdadc791bf35dfb1dbc3ef9f1948f\"\n}\n"
  },
  {
    "path": "packages/less/scripts/coverage-lines.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Generates a line-by-line coverage report showing uncovered lines\n * Reads from LCOV format and displays in terminal\n * Also outputs JSON file with uncovered lines for programmatic access\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst lcovPath = path.join(__dirname, '..', 'coverage', 'lcov.info');\nconst jsonOutputPath = path.join(__dirname, '..', 'coverage', 'uncovered-lines.json');\n\nif (!fs.existsSync(lcovPath)) {\n    console.error('LCOV coverage file not found. Run pnpm test:coverage first.');\n    process.exit(1);\n}\n\nconst lcovContent = fs.readFileSync(lcovPath, 'utf8');\n\n// Parse LCOV format\nconst files = [];\nlet currentFile = null;\n\nconst lines = lcovContent.split('\\n');\nfor (let i = 0; i < lines.length; i++) {\n    const line = lines[i];\n\n    // SF: source file\n    if (line.startsWith('SF:')) {\n        if (currentFile) {\n            files.push(currentFile);\n        }\n        const filePath = line.substring(3);\n        // Only include lib/ files (not less-browser) and bin/\n        // Exclude abstract base classes (they're meant to be overridden)\n        const normalized = filePath.replace(/\\\\/g, '/');\n        const abstractClasses = ['abstract-file-manager', 'abstract-plugin-loader'];\n        const isAbstract = abstractClasses.some(abstract => normalized.includes(abstract));\n\n        if (!isAbstract &&\n            ((normalized.includes('lib/less/') && !normalized.includes('lib/less-browser/')) ||\n             normalized.includes('lib/less-node/') ||\n             normalized.includes('bin/'))) {\n            // Extract relative path - match lib/less/... or lib/less-node/... or bin/...\n            // Path format: lib/less/tree/debug-info.js or lib/less-node/file-manager.js\n            // Match from lib/ or bin/ to end of path\n            const match = normalized.match(/(lib\\/[^/]+\\/.+|bin\\/.+)$/);\n            const relativePath = match ? match[1] : (normalized.includes('/lib/') || normalized.includes('/bin/') ? normalized.split('/').slice(-3).join('/') : path.basename(filePath));\n            currentFile = {\n                path: relativePath,\n                fullPath: filePath,\n                uncoveredLines: [],\n                uncoveredLineCode: {}, // line number -> source code\n                totalLines: 0,\n                coveredLines: 0\n            };\n        } else {\n            currentFile = null;\n        }\n    }\n\n    // DA: line data (line number, execution count)\n    if (currentFile && line.startsWith('DA:')) {\n        const match = line.match(/^DA:(\\d+),(\\d+)$/);\n        if (match) {\n            const lineNum = parseInt(match[1], 10);\n            const count = parseInt(match[2], 10);\n            currentFile.totalLines++;\n            if (count > 0) {\n                currentFile.coveredLines++;\n            } else {\n                currentFile.uncoveredLines.push(lineNum);\n            }\n        }\n    }\n}\n\nif (currentFile) {\n    files.push(currentFile);\n}\n\n// Read source code for uncovered lines\nfiles.forEach(file => {\n    if (file.uncoveredLines.length > 0 && fs.existsSync(file.fullPath)) {\n        try {\n            const sourceCode = fs.readFileSync(file.fullPath, 'utf8');\n            const sourceLines = sourceCode.split('\\n');\n            file.uncoveredLines.forEach(lineNum => {\n                // LCOV uses 1-based line numbers\n                if (lineNum > 0 && lineNum <= sourceLines.length) {\n                    file.uncoveredLineCode[lineNum] = sourceLines[lineNum - 1].trim();\n                }\n            });\n        } catch (err) {\n            // If we can't read the source, that's ok\n            // We'll just skip the source code\n        }\n    }\n});\n\n// Filter to only files with uncovered lines and sort by coverage\nconst filesWithGaps = files\n    .filter(f => f.uncoveredLines.length > 0)\n    .sort((a, b) => {\n        const aPct = a.totalLines > 0 ? a.coveredLines / a.totalLines : 1;\n        const bPct = b.totalLines > 0 ? b.coveredLines / b.totalLines : 1;\n        return aPct - bPct;\n    });\n\nif (filesWithGaps.length === 0) {\n    if (files.length === 0) {\n        console.log('\\n⚠️  No source files found in coverage data. This may indicate an issue with the coverage report.\\n');\n    } else {\n        console.log('\\n✅ All analyzed files have 100% line coverage!\\n');\n        console.log(`(Analyzed ${files.length} files from lib/less/, lib/less-node/, and bin/)\\n`);\n    }\n    process.exit(0);\n}\n\nconsole.log('\\n' + '='.repeat(100));\nconsole.log('Uncovered Lines Report');\nconsole.log('='.repeat(100) + '\\n');\n\nfilesWithGaps.forEach(file => {\n    const coveragePct = file.totalLines > 0\n        ? ((file.coveredLines / file.totalLines) * 100).toFixed(1)\n        : '0.0';\n\n    console.log(`\\n${file.path} (${coveragePct}% coverage)`);\n    console.log('-'.repeat(100));\n\n    // Group consecutive lines into ranges\n    const ranges = [];\n    let start = file.uncoveredLines[0];\n    let end = file.uncoveredLines[0];\n\n    for (let i = 1; i < file.uncoveredLines.length; i++) {\n        if (file.uncoveredLines[i] === end + 1) {\n            end = file.uncoveredLines[i];\n        } else {\n            ranges.push(start === end ? `${start}` : `${start}..${end}`);\n            start = file.uncoveredLines[i];\n            end = file.uncoveredLines[i];\n        }\n    }\n    ranges.push(start === end ? `${start}` : `${start}..${end}`);\n\n    // Display ranges (max 5 per line for readability)\n    const linesPerRow = 5;\n    for (let i = 0; i < ranges.length; i += linesPerRow) {\n        const row = ranges.slice(i, i + linesPerRow);\n        console.log(`  Lines: ${row.join(', ')}`);\n    }\n\n    console.log(`  Total uncovered: ${file.uncoveredLines.length} of ${file.totalLines} lines`);\n});\n\nconsole.log('\\n' + '='.repeat(100) + '\\n');\n\n// Write JSON output for programmatic access\nconst jsonOutput = {\n    generated: new Date().toISOString(),\n    files: filesWithGaps.map(file => ({\n        path: file.path,\n        fullPath: file.fullPath,\n        sourcePath: (() => {\n            // Try to map lib/ path to src/ path\n            const normalized = file.fullPath.replace(/\\\\/g, '/');\n            if (normalized.includes('/lib/')) {\n                return normalized.replace('/lib/', '/src/').replace(/\\.js$/, '.ts');\n            }\n            return file.fullPath;\n        })(),\n        coveragePercent: file.totalLines > 0\n            ? parseFloat(((file.coveredLines / file.totalLines) * 100).toFixed(1))\n            : 0,\n        totalLines: file.totalLines,\n        coveredLines: file.coveredLines,\n        uncoveredLines: file.uncoveredLines,\n        uncoveredLineCode: file.uncoveredLineCode || {},\n        uncoveredRanges: (() => {\n            const ranges = [];\n            if (file.uncoveredLines.length === 0) return ranges;\n\n            let start = file.uncoveredLines[0];\n            let end = file.uncoveredLines[0];\n\n            for (let i = 1; i < file.uncoveredLines.length; i++) {\n                if (file.uncoveredLines[i] === end + 1) {\n                    end = file.uncoveredLines[i];\n                } else {\n                    ranges.push({ start, end });\n                    start = file.uncoveredLines[i];\n                    end = file.uncoveredLines[i];\n                }\n            }\n            ranges.push({ start, end });\n            return ranges;\n        })()\n    }))\n};\n\nfs.writeFileSync(jsonOutputPath, JSON.stringify(jsonOutput, null, 2), 'utf8');\nconsole.log('\\n📄 Uncovered lines data written to: coverage/uncovered-lines.json\\n');\n"
  },
  {
    "path": "packages/less/scripts/coverage-report.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Generates a per-file coverage report table for lib/ directories\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst coverageSummaryPath = path.join(__dirname, '..', 'coverage', 'coverage-summary.json');\n\nif (!fs.existsSync(coverageSummaryPath)) {\n    console.error('Coverage summary not found. Run pnpm test:coverage first.');\n    process.exit(1);\n}\n\nconst coverage = JSON.parse(fs.readFileSync(coverageSummaryPath, 'utf8'));\n\n// Filter to only lib/ files (less, less-node) and bin/ files\n// Note: lib/less-browser/ is excluded because browser tests aren't included in coverage\n// Abstract base classes are excluded as they're meant to be overridden by implementations\nconst abstractClasses = [\n    'abstract-file-manager',\n    'abstract-plugin-loader'\n];\n\nconst srcFiles = Object.entries(coverage)\n    .filter(([filePath]) => {\n        const normalized = filePath.replace(/\\\\/g, '/');\n        // Exclude abstract classes\n        if (abstractClasses.some(abstract => normalized.includes(abstract))) {\n            return false;\n        }\n        return (normalized.includes('/lib/less/') && !normalized.includes('/lib/less-browser/')) ||\n               normalized.includes('/lib/less-node/') ||\n               normalized.includes('/bin/');\n    })\n    .map(([filePath, data]) => {\n        // Extract relative path from absolute path\n        const normalized = filePath.replace(/\\\\/g, '/');\n        // Match lib/ paths or bin/ paths\n        const match = normalized.match(/((?:lib\\/[^/]+\\/[^/]+\\/|bin\\/).+)$/);\n        const relativePath = match ? match[1] : path.basename(filePath);\n\n        return {\n            path: relativePath,\n            statements: data.statements,\n            branches: data.branches,\n            functions: data.functions,\n            lines: data.lines\n        };\n    })\n    .sort((a, b) => {\n        // Sort by directory first, then by coverage percentage\n        const pathCompare = a.path.localeCompare(b.path);\n        if (pathCompare !== 0) return pathCompare;\n        return a.statements.pct - b.statements.pct;\n    });\n\nif (srcFiles.length === 0) {\n    console.log('No lib/ files found in coverage report.');\n    process.exit(0);\n}\n\n// Group by directory\nconst grouped = {\n    'lib/less/': [],\n    'lib/less-node/': [],\n    'bin/': []\n};\n\nsrcFiles.forEach(file => {\n    if (file.path.startsWith('lib/less/')) {\n        grouped['lib/less/'].push(file);\n    } else if (file.path.startsWith('lib/less-node/')) {\n        grouped['lib/less-node/'].push(file);\n    } else if (file.path.startsWith('bin/')) {\n        grouped['bin/'].push(file);\n    }\n});\n\n// Print table\nconsole.log('\\n' + '='.repeat(100));\nconsole.log('Per-File Coverage Report (lib/less/, lib/less-node/, and bin/)');\nconsole.log('='.repeat(100));\nconsole.log('For line-by-line coverage details, open coverage/index.html in your browser.');\nconsole.log('='.repeat(100) + '\\n');\n\nObject.entries(grouped).forEach(([dir, files]) => {\n    if (files.length === 0) return;\n\n    console.log(`\\n${dir.toUpperCase()}`);\n    console.log('-'.repeat(100));\n    console.log(\n        'File'.padEnd(50) +\n        'Statements'.padStart(12) +\n        'Branches'.padStart(12) +\n        'Functions'.padStart(12) +\n        'Lines'.padStart(12)\n    );\n    console.log('-'.repeat(100));\n\n    files.forEach(file => {\n        const filename = file.path.replace(dir, '');\n        const truncated = filename.length > 48 ? '...' + filename.slice(-45) : filename;\n\n        console.log(\n            truncated.padEnd(50) +\n            `${file.statements.pct.toFixed(1)}%`.padStart(12) +\n            `${file.branches.pct.toFixed(1)}%`.padStart(12) +\n            `${file.functions.pct.toFixed(1)}%`.padStart(12) +\n            `${file.lines.pct.toFixed(1)}%`.padStart(12)\n        );\n    });\n\n    // Summary for this directory\n    const totals = files.reduce((acc, file) => {\n        acc.statements.total += file.statements.total;\n        acc.statements.covered += file.statements.covered;\n        acc.branches.total += file.branches.total;\n        acc.branches.covered += file.branches.covered;\n        acc.functions.total += file.functions.total;\n        acc.functions.covered += file.functions.covered;\n        acc.lines.total += file.lines.total;\n        acc.lines.covered += file.lines.covered;\n        return acc;\n    }, {\n        statements: { total: 0, covered: 0 },\n        branches: { total: 0, covered: 0 },\n        functions: { total: 0, covered: 0 },\n        lines: { total: 0, covered: 0 }\n    });\n\n    const stmtPct = totals.statements.total > 0\n        ? (totals.statements.covered / totals.statements.total * 100).toFixed(1)\n        : '0.0';\n    const branchPct = totals.branches.total > 0\n        ? (totals.branches.covered / totals.branches.total * 100).toFixed(1)\n        : '0.0';\n    const funcPct = totals.functions.total > 0\n        ? (totals.functions.covered / totals.functions.total * 100).toFixed(1)\n        : '0.0';\n    const linePct = totals.lines.total > 0\n        ? (totals.lines.covered / totals.lines.total * 100).toFixed(1)\n        : '0.0';\n\n    console.log('-'.repeat(100));\n    console.log(\n        'TOTAL'.padEnd(50) +\n        `${stmtPct}%`.padStart(12) +\n        `${branchPct}%`.padStart(12) +\n        `${funcPct}%`.padStart(12) +\n        `${linePct}%`.padStart(12)\n    );\n});\n\nconsole.log('\\n' + '='.repeat(100) + '\\n');\n"
  },
  {
    "path": "packages/less/scripts/postinstall.js",
    "content": "#!/usr/bin/env node\n\nimport fs from 'fs';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nfunction isDevelopmentEnvironment() {\n    if (process.env.npm_config_user_config || process.env.npm_config_global) {\n        return false;\n    }\n    if (process.env.CI || process.env.GITHUB_ACTIONS || process.env.TRAVIS) {\n        return false;\n    }\n    const parentPackageJson = path.join(__dirname, '../../../package.json');\n    if (!fs.existsSync(parentPackageJson)) {\n        return false;\n    }\n    const currentPackageJson = path.join(__dirname, '../package.json');\n    if (!fs.existsSync(currentPackageJson)) {\n        return false;\n    }\n    return true;\n}\n\nfunction installPlaywrightBrowsers() {\n    try {\n        console.log('Installing Playwright browsers for development...');\n        execSync('pnpm exec playwright install', {\n            stdio: 'inherit',\n            cwd: path.join(__dirname, '..')\n        });\n        console.log('Playwright browsers installed successfully');\n    } catch (error) {\n        console.warn('Failed to install Playwright browsers:', error.message);\n        console.warn('You can install them manually with: pnpm exec playwright install');\n    }\n}\n\nif (isDevelopmentEnvironment()) {\n    installPlaywrightBrowsers();\n}\n"
  },
  {
    "path": "packages/less/test/.eslintrc.json",
    "content": "{\n  \"env\": {\n    \"node\": true,\n    \"browser\": true\n  },\n  \"parserOptions\": { \n    \"ecmaVersion\": 6\n  }\n}\n"
  },
  {
    "path": "packages/less/test/README.md",
    "content": "Tests are generally organized in the `less/` folder by what options are set in index.js.\n\nThe main tests are located under `less/_main/`"
  },
  {
    "path": "packages/less/test/browser/common.js",
    "content": "var logMessages = [];\nwindow.less = window.less || {};\n\nvar logLevel_debug = 4,\n    logLevel_info = 3,\n    logLevel_warn = 2,\n    logLevel_error = 1;\n\n// The amount of logging in the javascript console.\n// 3 - Debug, information and errors\n// 2 - Information and errors\n// 1 - Errors\n// 0 - None\n// Defaults to 2\n\nless.loggers = [\n    {\n        debug: function(msg) {\n            if (less.options.logLevel >= logLevel_debug) {\n                logMessages.push(msg);\n            }\n        },\n        info: function(msg) {\n            if (less.options.logLevel >= logLevel_info) {\n                logMessages.push(msg);\n            }\n        },\n        warn: function(msg) {\n            if (less.options.logLevel >= logLevel_warn) {\n                logMessages.push(msg);\n            }\n        },\n        error: function(msg) {\n            if (less.options.logLevel >= logLevel_error) {\n                logMessages.push(msg);\n            }\n        }\n    }\n];\n\ntestLessEqualsInDocument = function () {\n    testLessInDocument(testSheet);\n};\n\ntestLessErrorsInDocument = function (isConsole) {\n    testLessInDocument(isConsole ? testErrorSheetConsole : testErrorSheet);\n};\n\ntestLessInDocument = function (testFunc) {\n    var links = document.getElementsByTagName('link'),\n        typePattern = /^text\\/(x-)?less$/;\n\n    for (var i = 0; i < links.length; i++) {\n        if (links[i].rel === 'stylesheet/less' || (links[i].rel.match(/stylesheet/) &&\n            (links[i].type.match(typePattern)))) {\n            testFunc(links[i]);\n        }\n    }\n};\n\nieFormat = function(text) {\n    var styleNode = document.createElement('style');\n    styleNode.setAttribute('type', 'text/css');\n    var headNode = document.getElementsByTagName('head')[0];\n    headNode.appendChild(styleNode);\n    try {\n        if (styleNode.styleSheet) {\n            styleNode.styleSheet.cssText = text;\n        } else {\n            styleNode.innerText = text;\n        }\n    } catch (e) {\n        throw new Error('Couldn\\'t reassign styleSheet.cssText.');\n    }\n    var transformedText = styleNode.styleSheet ? styleNode.styleSheet.cssText : styleNode.innerText;\n    headNode.removeChild(styleNode);\n    return transformedText;\n};\n\ntestSheet = function (sheet) {\n    it(sheet.id + ' should match the expected output', function (done) {\n        var lessOutputId = sheet.id.replace('original-', ''),\n            expectedOutputId = 'expected-' + lessOutputId,\n            lessOutputObj,\n            lessOutput,\n            expectedOutputHref = document.getElementById(expectedOutputId).href,\n            expectedOutput = loadFile(expectedOutputHref);\n\n        // Browser spec generates less on the fly, so we need to loose control\n        less.pageLoadFinished\n            .then(function () {\n                lessOutputObj = document.getElementById(lessOutputId);\n                lessOutput = lessOutputObj.styleSheet ? lessOutputObj.styleSheet.cssText :\n                    (lessOutputObj.innerText || lessOutputObj.innerHTML);\n\n                expectedOutput\n                    .then(function (text) {\n                        if (window.navigator.userAgent.indexOf('MSIE') >= 0 ||\n                            window.navigator.userAgent.indexOf('Trident/') >= 0) {\n                            text = ieFormat(text);\n                        }\n                        \n                        // Normalize URLs: convert absolute URLs back to relative for comparison\n                        // The browser resolves relative URLs when reading from DOM, but we want to compare against the original relative URLs\n                        lessOutput = lessOutput.replace(/url\\(\"http:\\/\\/localhost:8081\\/packages\\/less\\/node_modules\\/@less\\/test-data\\/tests-unit\\/([^\"]+)\"\\)/g, 'url(\"$1\")');\n                        // Also normalize directory-prefixed relative URLs (e.g., \"at-rules/myfont.woff2\" -> \"myfont.woff2\")\n                        // This happens because the browser resolves URLs relative to the HTML document location\n                        lessOutput = lessOutput.replace(/url\\(\"([a-z-]+\\/)([^\"]+)\"\\)/g, 'url(\"$2\")');\n                        // Also normalize @import statements that get resolved to absolute URLs\n                        lessOutput = lessOutput.replace(/@import \"http:\\/\\/localhost:8081\\/packages\\/less\\/node_modules\\/@less\\/test-data\\/tests-unit\\/([^\"]+)\"(.*);/g, '@import \"$1\"$2;');\n                        // Also normalize @import with directory prefix (e.g., \"at-rules-keyword-comments/test.css\" -> \"test.css\")\n                        lessOutput = lessOutput.replace(/@import \"([a-z-]+\\/)([^\"]+)\"(.*);/g, '@import \"$2\"$3;');\n                        \n                        expect(lessOutput).to.equal(text);\n                        done();\n                    })\n                    .catch(function(err) {\n                        done(err);\n                    });\n            })\n            .catch(function(err) {\n                done(err);\n            });\n    });\n};\n\n// TODO: do it cleaner - the same way as in css\n\nfunction extractId(href) {\n    return href.replace(/^[a-z-]+:\\/+?[^\\/]+/i, '') // Remove protocol & domain\n        .replace(/^\\//, '') // Remove root /\n        .replace(/\\.[a-zA-Z]+$/, '') // Remove simple extension\n        .replace(/[^\\.\\w-]+/g, '-') // Replace illegal characters\n        .replace(/\\./g, ':'); // Replace dots with colons(for valid id)\n}\n\nwaitFor = function (waitFunc) {\n    return new Promise(function (resolve) {\n        var timeoutId = setInterval(function () {\n            if (waitFunc()) {\n                clearInterval(timeoutId);\n                resolve();\n            }\n        }, 5);\n    });\n};\n\ntestErrorSheet = function (sheet) {\n    it(sheet.id + ' should match an error', function (done) {\n        var lessHref = sheet.href,\n            id = 'less-error-message:' + extractId(lessHref),\n            errorHref = lessHref.replace(/.less$/, '.txt'),\n            errorFile = loadFile(errorHref),\n            actualErrorElement,\n            actualErrorMsg;\n\n        // Less.js sets 10ms timer in order to add error message on top of page.\n        waitFor(function () {\n            actualErrorElement = document.getElementById(id);\n            return actualErrorElement !== null;\n        }).then(function () {\n            var innerText = (actualErrorElement.innerHTML\n                .replace(/<h3>|<\\/?p>|<a href=\"[^\"]*\">|<\\/a>|<ul>|<\\/?pre( class=\"?[^\">]*\"?)?>|<\\/li>|<\\/?label>/ig, '')\n                .replace(/<\\/h3>/ig, ' ')\n                .replace(/<li>|<\\/ul>|<br>/ig, '\\n'))\n                .replace(/&amp;/ig, '&')\n            // for IE8\n                .replace(/\\r\\n/g, '\\n')\n                .replace(/\\. \\nin/, '. in');\n            actualErrorMsg = innerText\n                .replace(/\\n\\d+/g, function (lineNo) {\n                    return lineNo + ' ';\n                })\n                .replace(/\\n\\s*in /g, ' in ')\n                .replace(/\\n{2,}/g, '\\n')\n                .replace(/\\nStack Trace\\n[\\s\\S]*/i, '')\n                .replace(/\\n$/, '')\n                .trim();\n            actualErrorMsg = actualErrorMsg\n                .replace(/ in [\\w\\-]+\\.less( on line \\d+, column \\d+)?:?$/, '')  // Remove filename and optional line/column from end of error message\n                .replace(/\\{path\\}/g, '')\n                .replace(/\\{pathrel\\}/g, '')\n                .replace(/\\{pathhref\\}/g, 'http://localhost:8081/packages/less/node_modules/@less/test-data/tests-error/eval/')\n                .replace(/\\{404status\\}/g, ' (404)')\n                .replace(/\\{node\\}[\\s\\S]*\\{\\/node\\}/g, '')\n                .replace(/\\n$/, '')\n                .trim();\n            errorFile\n                .then(function (errorTxt) {\n                    errorTxt = errorTxt\n                        .replace(/\\{path\\}/g, '')\n                        .replace(/\\{pathrel\\}/g, '')\n                        .replace(/\\{pathhref\\}/g, 'http://localhost:8081/packages/less/node_modules/@less/test-data/tests-error/eval/')\n                        .replace(/\\{404status\\}/g, ' (404)')\n                        .replace(/\\{node\\}[\\s\\S]*\\{\\/node\\}/g, '')\n                        .replace(/\\n$/, '')\n                        .trim();\n                    expect(actualErrorMsg).to.equal(errorTxt);\n                    if (errorTxt == actualErrorMsg) {\n                        actualErrorElement.style.display = 'none';\n                    }\n                    done();\n                })\n                .catch(function (err) {\n                    done(err);\n                });\n        });\n    });\n};\n\ntestErrorSheetConsole = function (sheet) {\n    it(sheet.id + ' should match an error', function (done) {\n        var lessHref = sheet.href,\n            id = sheet.id.replace(/^original-less:/, 'less-error-message:'),\n            errorHref = lessHref.replace(/.less$/, '.txt'),\n            errorFile = loadFile(errorHref),\n            actualErrorElement = document.getElementById(id),\n            actualErrorMsg = logMessages[logMessages.length - 1]\n                .replace(/\\nStack Trace\\n[\\s\\S]*/, '');\n\n        describe('the error', function () {\n            expect(actualErrorElement).to.be.null;\n        });\n\n        errorFile\n            .then(function (errorTxt) {\n                errorTxt\n                    .replace(/\\{path\\}/g, '')\n                    .replace(/\\{pathrel\\}/g, '')\n                    .replace(/\\{pathhref\\}/g, 'http://localhost:8081/browser/less/')\n                    .replace(/\\{404status\\}/g, ' (404)')\n                    .replace(/\\{node\\}.*\\{\\/node\\}/g, '')\n                    .trim();\n                expect(actualErrorMsg).to.equal(errorTxt);\n                done();\n            });\n    });\n};\n\nloadFile = function (href) {\n    return new Promise(function (resolve, reject) {\n        var request = new XMLHttpRequest();\n        request.open('GET', href, true);\n        request.onreadystatechange = function () {\n            if (request.readyState == 4) {\n                resolve(request.responseText.replace(/\\r/g, ''));\n            }\n        };\n        request.send(null);\n    });\n};\n"
  },
  {
    "path": "packages/less/test/browser/css/global-vars/simple.css",
    "content": ".test {\n  color: red;\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/modify-vars/simple.css",
    "content": ".testisimported {\n  color: gainsboro;\n}\n.test {\n  color1: green;\n  color2: purple;\n  scalar: 20;\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/plugin/plugin.css",
    "content": ".test {\n  val: http://localhost:8081/packages/less/tmp/browser/test-runner-browser.html;\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/postProcessor/postProcessor.css",
    "content": "hr {height:50px;}\n.test {\n  color: white;\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/relative-urls/urls.css",
    "content": "@import \"http://localhost:8081/packages/less/test/browser/less/imports/modify-this.css\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/modify-again.css\";\n.modify {\n  my-url: url(\"http://localhost:8081/packages/less/test/browser/less/imports/a.png\");\n}\n.modify {\n  my-url: url(\"http://localhost:8081/packages/less/test/browser/less/imports/b.png\");\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(http://localhost:8081/packages/less/test/browser/less/relative-urls/fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(http://localhost:8081/packages/less/test/browser/less/relative-urls/images/image.jpg);\n  background: url(\"#inline-svg\");\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(http://localhost:8081/packages/less/test/browser/less/relative-urls/bg.jpg) no-repeat, url(http://localhost:8081/packages/less/test/browser/less/relative-urls/bg.png) repeat-x top left, url(http://localhost:8081/packages/less/test/browser/less/relative-urls/bg);\n}\n.values {\n  url: url('http://localhost:8081/packages/less/test/browser/less/relative-urls/Trebuchet');\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/rewrite-urls/urls.css",
    "content": "@import \"http://localhost:8081/packages/less/test/browser/less/imports/modify-this.css\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/modify-again.css\";\n.modify {\n  my-url: url(\"http://localhost:8081/packages/less/test/browser/less/imports/a.png\");\n}\n.modify {\n  my-url: url(\"http://localhost:8081/packages/less/test/browser/less/imports/b.png\");\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(http://localhost:8081/packages/less/test/browser/less/rewrite-urls/fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(http://localhost:8081/packages/less/test/browser/less/rewrite-urls/images/image.jpg);\n  background: url(\"#inline-svg\");\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(http://localhost:8081/packages/less/test/browser/less/rewrite-urls/bg.jpg) no-repeat, url(http://localhost:8081/packages/less/test/browser/less/rewrite-urls/bg.png) repeat-x top left, url(http://localhost:8081/packages/less/test/browser/less/rewrite-urls/bg);\n}\n.values {\n  url: url('http://localhost:8081/packages/less/test/browser/less/rewrite-urls/Trebuchet');\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/rootpath/urls.css",
    "content": "@import \"https://localhost/modify-this.css\";\n@import \"https://localhost/modify-again.css\";\n.modify {\n  my-url: url(\"https://localhost/a.png\");\n}\n.modify {\n  my-url: url(\"https://localhost/b.png\");\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(https://localhost/fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(https://localhost/images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(https://localhost/bg.jpg) no-repeat, url(https://localhost/bg.png) repeat-x top left, url(https://localhost/bg);\n}\n.values {\n  url: url('https://localhost/Trebuchet');\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/rootpath-relative/urls.css",
    "content": "@import \"https://www.github.com/cloudhead/imports/modify-this.css\";\n@import \"https://www.github.com/cloudhead/imports/modify-again.css\";\n.modify {\n  my-url: url(\"https://www.github.com/cloudhead/imports/a.png\");\n}\n.modify {\n  my-url: url(\"https://www.github.com/cloudhead/imports/b.png\");\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(https://www.github.com/cloudhead/less.js/fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(https://www.github.com/cloudhead/less.js/images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(https://www.github.com/cloudhead/less.js/bg.jpg) no-repeat, url(https://www.github.com/cloudhead/less.js/bg.png) repeat-x top left, url(https://www.github.com/cloudhead/less.js/bg);\n}\n.values {\n  url: url('https://www.github.com/cloudhead/less.js/Trebuchet');\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/rootpath-rewrite-urls/urls.css",
    "content": "@import \"https://www.github.com/cloudhead/imports/modify-this.css\";\n@import \"https://www.github.com/cloudhead/imports/modify-again.css\";\n.modify {\n  my-url: url(\"https://www.github.com/cloudhead/imports/a.png\");\n}\n.modify {\n  my-url: url(\"https://www.github.com/cloudhead/imports/b.png\");\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(https://www.github.com/cloudhead/less.js/fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(https://www.github.com/cloudhead/less.js/images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(https://www.github.com/cloudhead/less.js/bg.jpg) no-repeat, url(https://www.github.com/cloudhead/less.js/bg.png) repeat-x top left, url(https://www.github.com/cloudhead/less.js/bg);\n}\n.values {\n  url: url('https://www.github.com/cloudhead/less.js/Trebuchet');\n}\n"
  },
  {
    "path": "packages/less/test/browser/css/urls.css",
    "content": "@import \"http://localhost:8081/packages/less/test/browser/less/modify-this.css\";\n@import \"http://localhost:8081/packages/less/test/browser/less/modify-again.css\";\n.modify {\n  my-url: url(\"http://localhost:8081/packages/less/test/browser/less/a.png\");\n}\n.modify {\n  my-url: url(\"http://localhost:8081/packages/less/test/browser/less/b.png\");\n}\n.gray-gradient {\n  background: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220%22%2F%3E%3Cstop%20offset%3D%2260%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.05%22%2F%3E%3Cstop%20offset%3D%2270%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.1%22%2F%3E%3Cstop%20offset%3D%2273%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.15%22%2F%3E%3Cstop%20offset%3D%2275%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.2%22%2F%3E%3Cstop%20offset%3D%2280%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.25%22%2F%3E%3Cstop%20offset%3D%2285%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.3%22%2F%3E%3Cstop%20offset%3D%2288%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.35%22%2F%3E%3Cstop%20offset%3D%2290%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.4%22%2F%3E%3Cstop%20offset%3D%2295%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.45%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.5%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(http://localhost:8081/packages/less/test/browser/less/fonts.svg#MyGeometricModern) format(\"svg\");\n  not-a-comment: url(//z);\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(http://localhost:8081/packages/less/test/browser/less/images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(http://localhost:8081/packages/less/test/browser/less/bg.jpg) no-repeat, url(http://localhost:8081/packages/less/test/browser/less/bg.png) repeat-x top left, url(http://localhost:8081/packages/less/test/browser/less/bg);\n}\n.values {\n  url: url('http://localhost:8081/packages/less/test/browser/less/Trebuchet');\n}\n#data-uri {\n  uri: url('http://localhost:8081/packages/less/test/data/image.jpg');\n}\n#data-uri-guess {\n  uri: url('http://localhost:8081/packages/less/test/data/image.jpg');\n}\n#data-uri-ascii {\n  uri-1: url('http://localhost:8081/packages/less/test/data/page.html');\n  uri-2: url('http://localhost:8081/packages/less/test/data/page.html');\n}\n#svg-functions {\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23000000%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23000000%22%2F%3E%3Cstop%20offset%3D%223%25%22%20stop-color%3D%22%23ffa500%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%221%25%22%20stop-color%3D%22%23c4c4c4%22%2F%3E%3Cstop%20offset%3D%223%25%22%20stop-color%3D%22%23ffa500%22%2F%3E%3Cstop%20offset%3D%225%25%22%20stop-color%3D%22%23008000%22%2F%3E%3Cstop%20offset%3D%2295%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n}\n"
  },
  {
    "path": "packages/less/test/browser/generator/benchmark.config.cjs",
    "content": "\nmodule.exports = {\n    current: {\n    // src is used to build list of less files to compile\n        src: [\n            'benchmark/benchmark.less'\n        ],\n        options: {\n            helpers: 'benchmark/browseroptions.js',\n            specs: 'benchmark/browserspec.js',\n            outfile: 'tmp/browser/test-runner-benchmark-current.html'\n        }\n    },\n    v3_10_3: {\n        // src is used to build list of less files to compile\n        src: [\n            'benchmark/benchmark.less'\n        ],\n        options: {\n            helpers: 'benchmark/browseroptions.js',\n            specs: 'benchmark/browserspec.js',\n            outfile: 'tmp/browser/test-runner-benchmark-v3_10_3.html',\n            less: 'https://cdnjs.cloudflare.com/ajax/libs/less.js/3.10.3/less.min.js'\n        }\n    },\n    v3_9_0: {\n        // src is used to build list of less files to compile\n        src: [\n            'benchmark/benchmark.less'\n        ],\n        options: {\n            helpers: 'benchmark/browseroptions.js',\n            specs: 'benchmark/browserspec.js',\n            outfile: 'tmp/browser/test-runner-benchmark-v3_9_0.html',\n            less: 'https://cdnjs.cloudflare.com/ajax/libs/less.js/3.9.0/less.min.js'\n        }\n    },\n    v2_7_3: {\n        // src is used to build list of less files to compile\n        src: [\n            'benchmark/benchmark.less'\n        ],\n        options: {\n            helpers: 'benchmark/browseroptions.js',\n            specs: 'benchmark/browserspec.js',\n            outfile: 'tmp/browser/test-runner-benchmark-v2_7_3.html',\n            less: 'https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.3/less.min.js'\n        }\n    }\n}"
  },
  {
    "path": "packages/less/test/browser/generator/generate.cjs",
    "content": "const template = require('./template.cjs')\nlet config\nconst fs = require('fs-extra')\nconst path = require('path')\nconst globby = require('globby')\nconst { runner } = require('../../mocha-playwright/runner')\n\n\nif (process.argv[2]) {\n    config = require(`./${process.argv[2]}.config`)\n} else {\n    config = require('./runner.config.cjs')\n}\n\n/**\n * Generate templates and run tests\n */\nconst tests = []\nconst cwd = process.cwd()\nconst tmpDir = path.join(cwd, 'tmp', 'browser')\nfs.ensureDirSync(tmpDir)\nfs.copySync(path.join(cwd, 'test', 'browser', 'common.js'), path.join(tmpDir, 'common.js'))\n\nlet numTests = 0\nlet passedTests = 0\nlet failedTests = 0\n\n/** Will run the runners in a series */\nfunction runSerial(tasks) {\n    var result = Promise.resolve()\n    start = Date.now()\n    tasks.forEach(task => {\n        result = result.then(result => {\n            if (result && result.result && result.result.stats) {\n                const stats = result.result.stats\n                numTests += stats.tests\n                passedTests += stats.passes\n                failedTests += stats.failures\n            }\n            return task()\n        }, err => {\n            console.log(err)\n            failedTests += 1\n        })\n    })\n    return result\n}\n\nObject.entries(config).forEach(entry => {\n    const test = entry[1]\n    const paths = globby.sync(test.src)\n    const templateString = template(paths, test.options.helpers, test.options.specs)\n    fs.writeFileSync(path.join(cwd, test.options.outfile), templateString)\n    tests.push(() => {\n        const file = 'http://localhost:8081/packages/less/' + test.options.outfile\n        console.log(file)\n        return runner({\n            file,\n            timeout: 3500,\n            args: ['disable-web-security', 'no-sandbox', 'disable-setuid-sandbox'],\n        })\n    })\n})\n\nmodule.exports = () => runSerial(tests).then(() => {\n    if (failedTests > 0) {\n        process.stderr.write(failedTests + ' Failed, ' + passedTests + ' passed\\n');\n    } else {\n        process.stdout.write('All Passed ' + passedTests + ' run\\n');\n    }\n    if (failedTests) {\n        process.on('exit', function() { process.reallyExit(1); });\n    }\n    process.exit()\n}, err => {\n    process.stderr.write(err.message);\n    process.exit()\n})\n"
  },
  {
    "path": "packages/less/test/browser/generator/generate.js",
    "content": "import { createRequire } from 'module';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport globby from 'globby';\nimport { runner } from '../../mocha-playwright/runner.js';\n\nconst require = createRequire(import.meta.url);\n\nlet config;\nlet template;\n\nif (process.argv[2]) {\n    config = require(`./${process.argv[2]}.config.cjs`);\n} else {\n    config = require('./runner.config.cjs');\n}\ntemplate = require('./template.cjs');\n\n/**\n * Generate templates and run tests\n */\nconst tests = [];\nconst cwd = process.cwd();\nconst tmpDir = path.join(cwd, 'tmp', 'browser');\nfs.ensureDirSync(tmpDir);\nfs.copySync(path.join(cwd, 'test', 'browser', 'common.js'), path.join(tmpDir, 'common.js'));\n\nlet numTests = 0;\nlet passedTests = 0;\nlet failedTests = 0;\n\n/** Will run the runners in a series */\nfunction runSerial(tasks) {\n    var result = Promise.resolve();\n    var start = Date.now();\n    tasks.forEach(task => {\n        result = result.then(result => {\n            if (result && result.result && result.result.stats) {\n                const stats = result.result.stats;\n                numTests += stats.tests;\n                passedTests += stats.passes;\n                failedTests += stats.failures;\n            }\n            return task();\n        }, err => {\n            console.log(err);\n            failedTests += 1;\n        });\n    });\n    return result;\n}\n\nObject.entries(config).forEach(entry => {\n    const test = entry[1];\n    const paths = globby.sync(test.src);\n    const templateString = template(paths, test.options.helpers, test.options.specs);\n    fs.writeFileSync(path.join(cwd, test.options.outfile), templateString);\n    tests.push(() => {\n        const file = 'http://localhost:8081/packages/less/' + test.options.outfile;\n        console.log(file);\n        return runner({\n            file,\n            timeout: 3500,\n            args: ['disable-web-security', 'no-sandbox', 'disable-setuid-sandbox'],\n        });\n    });\n});\n\nexport default () => runSerial(tests).then(() => {\n    if (failedTests > 0) {\n        process.stderr.write(failedTests + ' Failed, ' + passedTests + ' passed\\n');\n    } else {\n        process.stdout.write('All Passed ' + passedTests + ' run\\n');\n    }\n    if (failedTests) {\n        process.on('exit', function() { process.reallyExit(1); });\n    }\n    process.exit();\n}, err => {\n    process.stderr.write(err.message);\n    process.exit();\n});\n"
  },
  {
    "path": "packages/less/test/browser/generator/runner.cjs",
    "content": "const runner = require('./generate.cjs')\nrunner()"
  },
  {
    "path": "packages/less/test/browser/generator/runner.config.cjs",
    "content": "var path = require('path');\nvar resolve = require('resolve')\nvar { forceCovertToBrowserPath } = require('./utils.cjs');\n\n/** Root of repo */\nvar testFolder = forceCovertToBrowserPath(path.dirname(resolve.sync('@less/test-data')));\nvar testsUnitFolder = forceCovertToBrowserPath(path.join(testFolder, 'tests-unit'));\nvar testsConfigFolder = forceCovertToBrowserPath(path.join(testFolder, 'tests-config'));\nvar localTests = forceCovertToBrowserPath(path.resolve(__dirname, '..'));\n\nmodule.exports = {\n    main: {\n    // src is used to build list of less files to compile\n        src: [\n            `${testsUnitFolder}/*/*.less`,\n            `!${testsUnitFolder}/plugin-preeval/plugin-preeval.less`, // uses ES6 syntax\n            // Don't test NPM import, obviously\n            `!${testsUnitFolder}/plugin-module/plugin-module.less`,\n            `!${testsUnitFolder}/import/import-module.less`,\n            `!${testsUnitFolder}/javascript/javascript.less`,\n            `!${testsUnitFolder}/urls/urls.less`,\n            `!${testsUnitFolder}/empty/empty.less`,\n            `!${testsUnitFolder}/color-functions/operations.less`, // conflicts with operations/operations.less\n            // Exclude debug line numbers tests - these are Node.js only (dumpLineNumbers is deprecated)\n            `!${testsConfigFolder}/debug/**/*.less`\n        ],\n        options: {\n            helpers: 'test/browser/runner-main-options.js',\n            specs: 'test/browser/runner-main-spec.js',\n            outfile: 'tmp/browser/test-runner-main.html'\n        }\n    },\n    strictUnits: {\n        src: [`${testsConfigFolder}/units/strict/*.less`],\n        options: {\n            helpers: 'test/browser/runner-strict-units-options.js',\n            specs: 'test/browser/runner-strict-units-spec.js',\n            outfile: 'tmp/browser/test-runner-strict-units.html'\n        }\n    },\n    errors: {\n        src: [\n            `${testFolder}/tests-error/eval/*.less`,\n            `${testFolder}/tests-error/parse/*.less`,\n            `${localTests}/less/errors/*.less`\n        ],\n        options: {\n            timeout: 20000,\n            helpers: 'test/browser/runner-errors-options.js',\n            specs: 'test/browser/runner-errors-spec.js',\n            outfile: 'tmp/browser/test-runner-errors.html'\n        }\n    },\n    noJsErrors: {\n        src: [`${testsConfigFolder}/no-js-errors/*.less`],\n        options: {\n            helpers: 'test/browser/runner-no-js-errors-options.js',\n            specs: 'test/browser/runner-no-js-errors-spec.js',\n            outfile: 'tmp/browser/test-runner-no-js-errors.html'\n        }\n    },\n    browser: {\n        src: [\n            `${localTests}/less/*.less`,\n            `${localTests}/less/plugin/*.less`\n        ],\n        options: {\n            helpers: 'test/browser/runner-browser-options.js',\n            specs: 'test/browser/runner-browser-spec.js',\n            outfile: 'tmp/browser/test-runner-browser.html'\n        }\n    },\n    relativeUrls: {\n        src: [`${localTests}/less/relative-urls/*.less`],\n        options: {\n            helpers: 'test/browser/runner-relative-urls-options.js',\n            specs: 'test/browser/runner-relative-urls-spec.js',\n            outfile: 'tmp/browser/test-runner-relative-urls.html'\n        }\n    },\n    rewriteUrls: {\n        src: [`${localTests}/less/rewrite-urls/*.less`],\n        options: {\n            helpers: 'test/browser/runner-rewrite-urls-options.js',\n            specs: 'test/browser/runner-rewrite-urls-spec.js',\n            outfile: 'tmp/browser/test-runner-rewrite-urls.html'\n        }\n    },\n    rootpath: {\n        src: [`${localTests}/less/rootpath/*.less`],\n        options: {\n            helpers: 'test/browser/runner-rootpath-options.js',\n            specs: 'test/browser/runner-rootpath-spec.js',\n            outfile: 'tmp/browser/test-runner-rootpath.html'\n        }\n    },\n    rootpathRelative: {\n        src: [`${localTests}/less/rootpath-relative/*.less`],\n        options: {\n            helpers: 'test/browser/runner-rootpath-relative-options.js',\n            specs: 'test/browser/runner-rootpath-relative-spec.js',\n            outfile: 'tmp/browser/test-runner-rootpath-relative.html'\n        }\n    },\n    rootpathRewriteUrls: {\n        src: [`${localTests}/less/rootpath-rewrite-urls/*.less`],\n        options: {\n            helpers:\n            'test/browser/runner-rootpath-rewrite-urls-options.js',\n            specs: 'test/browser/runner-rootpath-rewrite-urls-spec.js',\n            outfile:\n            'tmp/browser/test-runner-rootpath-rewrite-urls.html'\n        }\n    },\n    production: {\n        src: [`${localTests}/less/production/*.less`],\n        options: {\n            helpers: 'test/browser/runner-production-options.js',\n            specs: 'test/browser/runner-production-spec.js',\n            outfile: 'tmp/browser/test-runner-production.html'\n        }\n    },\n    modifyVars: {\n        src: [`${localTests}/less/modify-vars/*.less`],\n        options: {\n            helpers: 'test/browser/runner-modify-vars-options.js',\n            specs: 'test/browser/runner-modify-vars-spec.js',\n            outfile: 'tmp/browser/test-runner-modify-vars.html'\n        }\n    },\n    globalVars: {\n        src: [`${localTests}/less/global-vars/*.less`],\n        options: {\n            helpers: 'test/browser/runner-global-vars-options.js',\n            specs: 'test/browser/runner-global-vars-spec.js',\n            outfile: 'tmp/browser/test-runner-global-vars.html'\n        }\n    },\n    postProcessorPlugin: {\n        src: [`${testsConfigFolder}/postProcessorPlugin/*.less`],\n        options: {\n            helpers: [\n                'test/plugins/postprocess/index.cjs',\n                'test/browser/runner-postProcessorPlugin-options.js'\n            ],\n            specs: 'test/browser/runner-postProcessorPlugin.js',\n            outfile:\n            'tmp/browser/test-runner-post-processor-plugin.html'\n        }\n    },\n    preProcessorPlugin: {\n        src: [`${testsConfigFolder}/preProcessorPlugin/*.less`],\n        options: {\n            helpers: [\n                'test/plugins/preprocess/index.cjs',\n                'test/browser/runner-preProcessorPlugin-options.js'\n            ],\n            specs: 'test/browser/runner-preProcessorPlugin.js',\n            outfile: 'tmp/browser/test-runner-pre-processor-plugin.html'\n        }\n    },\n    visitorPlugin: {\n        src: [`${testsConfigFolder}/visitorPlugin/*.less`],\n        options: {\n            helpers: [\n                'test/plugins/visitor/index.cjs',\n                'test/browser/runner-VisitorPlugin-options.js'\n            ],\n            specs: 'test/browser/runner-VisitorPlugin.js',\n            outfile: 'tmp/browser/test-runner-visitor-plugin.html'\n        }\n    },\n    filemanagerPlugin: {\n        src: [`${testsConfigFolder}/filemanagerPlugin/*.less`],\n        options: {\n            helpers: [\n                'test/plugins/filemanager/index.cjs',\n                'test/browser/runner-filemanagerPlugin-options.js'\n            ],\n            specs: 'test/browser/runner-filemanagerPlugin.js',\n            outfile: 'tmp/browser/test-runner-filemanager-plugin.html'\n        }\n    }\n}\n"
  },
  {
    "path": "packages/less/test/browser/generator/runner.js",
    "content": "import generate from './generate.js';\ngenerate();\n"
  },
  {
    "path": "packages/less/test/browser/generator/template.cjs",
    "content": "const html = require('html-template-tag')\nconst path = require('path')\nconst { forceCovertToBrowserPath } = require('./utils.cjs')\n\nconst webRoot = path.resolve(__dirname, '../../../../../');\nconst mochaDir = forceCovertToBrowserPath(path.relative(webRoot, path.dirname(require.resolve('mocha'))))\nconst chaiDir = forceCovertToBrowserPath(path.relative(webRoot, path.dirname(require.resolve('chai'))))\nconst mochaTeamCityDir = forceCovertToBrowserPath(path.relative(webRoot, path.dirname(require.resolve('mocha-teamcity-reporter'))))\n\n/**\n * Generates HTML templates from list of test sheets\n */\nmodule.exports = (stylesheets, helpers, spec, less) => {\n    if (!Array.isArray(helpers)) {\n        helpers = [helpers]\n    }\n    return html`\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    \n    <title>Less.js Spec Runner</title>\n\n    <!-- for each test, generate CSS/LESS link tags -->\n    $${stylesheets.map(function(fullLessName) {\n        var pathParts = fullLessName.split('/');\n        var fullCssName = fullLessName.replace(/less$/, 'css');\n        \n        // Check if the CSS file exists in the same directory as the LESS file\n        var fs = require('fs');\n        var cssExists = fs.existsSync(fullCssName);\n        \n        // If not, try the css/ directory for local browser tests\n        if (!cssExists && fullLessName.includes('/test/browser/less/')) {\n            var cssInCssDir = fullLessName.replace('/test/browser/less/', '/test/browser/css/').replace(/less$/, 'css');\n            if (fs.existsSync(cssInCssDir)) {\n                fullCssName = cssInCssDir;\n            }\n        }\n        \n        var lessName = pathParts[pathParts.length - 1];\n        var name = lessName.split('.')[0];\n        return `\n    <!-- the tags to be generated -->\n    <link id=\"original-less:test-less-${name}\" title=\"test-less-${name}\" rel=\"stylesheet/less\" type=\"text/css\" href=\"/${path.relative(webRoot, fullLessName)}\">\n    <link id=\"expected-less:test-less-${name}\" rel=\"stylesheet\" type=\"text/css\" href=\"/${path.relative(webRoot, fullCssName)}\">\n    ` }).join('')}\n\n    $${helpers.map(helper => `\n        <script src=\"../../${helper}\"></script>\n    `).join('')}\n\n    <link rel=\"stylesheet\" href=\"/${mochaDir}/mocha.css\">\n</head>\n\n<body>\n    <!-- content -->\n    <div id=\"mocha\"></div>\n    <script src=\"/${mochaDir}/mocha.js\"></script>\n    <script src=\"/${mochaTeamCityDir}/teamcityBrowser.js\"></script>\n    <script src=\"/${chaiDir}/chai.js\"></script>\n    <script>\n        expect = chai.expect\n        mocha.setup({\n            ui: 'bdd',\n            timeout: 2500\n        });\n    </script>\n    <script src=\"common.js\"></script>\n    <script src=\"../../${spec}\"></script>\n    <script src=\"${less || 'less.min.js'}\"></script>\n    <script>\n        /** Saucelabs config */\n        onload = function() {\n            var runner = mocha.run();\n\n            var failedTests = [];\n            runner.on('end', function() {\n                window.mochaResults = runner.stats;\n                window.mochaResults.reports = failedTests;\n            });\n\n            runner.on('fail', logFailure);\n\n            function logFailure(test, err){\n                var flattenTitles = function(test){\n                    var titles = [];\n                    while (test.parent.title) {\n                        titles.push(test.parent.title);\n                        test = test.parent;\n                    }\n                    return titles.reverse();\n                };\n\n                failedTests.push({name: test.title, result: false, message: err.message, stack: err.stack, titles: flattenTitles(test) });\n            };\n        };\n        \n    </script>\n</body>\n</html>\n`\n}"
  },
  {
    "path": "packages/less/test/browser/generator/utils.cjs",
    "content": "/**\n * utils for covert browser paths,\n * fix https://github.com/less/less.js/pull/4213 \n * \n * @param {string} path \n * @returns {string}\n */\nfunction forceCovertToBrowserPath (path) {\n    return (path || '').replace(/\\\\/g, '/');\n}\n\nmodule.exports = {\n    forceCovertToBrowserPath\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/console-errors/test-error.less",
    "content": ".a {\n  prop: (3 / #fff);\n}"
  },
  {
    "path": "packages/less/test/browser/less/console-errors/test-error.txt",
    "content": "less: OperationError: Can't subtract or divide a color from a number in {pathhref}console-errors/test-error.less on line null, column 0:\n1   prop: (3 / #fff);\n"
  },
  {
    "path": "packages/less/test/browser/less/errors/image-height-error.less",
    "content": ".test-height{\n  height: image-height(\"../data/image.jpg\")\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/errors/image-height-error.txt",
    "content": "RuntimeError: Error evaluating function `image-height`: Image size functions are not supported in browser version of less in image-height-error.less on line 2, column 11:\n1 .test-height{\n2   height: image-height(\"../data/image.jpg\")\n3 }"
  },
  {
    "path": "packages/less/test/browser/less/errors/image-size-error.less",
    "content": ".test-size{\n  size: image-size(\"../data/image.jpg\")\n}"
  },
  {
    "path": "packages/less/test/browser/less/errors/image-size-error.txt",
    "content": "RuntimeError: Error evaluating function `image-size`: Image size functions are not supported in browser version of less in image-size-error.less on line 2, column 9:\n1 .test-size{\n2   size: image-size(\"../data/image.jpg\")\n3 }"
  },
  {
    "path": "packages/less/test/browser/less/errors/image-width-error.less",
    "content": ".test-width{\n  width: image-width(\"../data/image.jpg\")\n}"
  },
  {
    "path": "packages/less/test/browser/less/errors/image-width-error.txt",
    "content": "RuntimeError: Error evaluating function `image-width`: Image size functions are not supported in browser version of less in image-width-error.less on line 2, column 10:\n1 .test-width{\n2   width: image-width(\"../data/image.jpg\")\n3 }"
  },
  {
    "path": "packages/less/test/browser/less/global-vars/simple.less",
    "content": ".test {\n  color: @global-var;\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/imports/urls.less",
    "content": "@import \"modify-this.css\";\n.modify {\n  my-url: url(\"a.png\");\n}"
  },
  {
    "path": "packages/less/test/browser/less/imports/urls2.less",
    "content": "@import \"modify-again.css\";\n.modify {\n  my-url: url(\"b.png\");\n}"
  },
  {
    "path": "packages/less/test/browser/less/modify-vars/imports/simple2.less",
    "content": "@var2: blue;\n.testisimported {\n  color: gainsboro;\n}"
  },
  {
    "path": "packages/less/test/browser/less/modify-vars/simple.less",
    "content": "@import \"imports/simple2\";\n@var1: red;\n@scale: 10;\n.test {\n  color1: @var1;\n  color2: @var2;\n  scalar: @scale\n}"
  },
  {
    "path": "packages/less/test/browser/less/nested-gradient-with-svg-gradient/mixin-consumer.less",
    "content": "@import \"svg-gradient-mixin.less\";\n\n.gray-gradient {\n  .gradient-mixin(#999);\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/nested-gradient-with-svg-gradient/svg-gradient-mixin.less",
    "content": ".gradient-mixin(@color) {\n  background: svg-gradient(to bottom,\n    fade(@color, 0%) 0%,\n    fade(@color, 5%) 60%,\n    fade(@color, 10%) 70%,\n    fade(@color, 15%) 73%,\n    fade(@color, 20%) 75%,\n    fade(@color, 25%) 80%,\n    fade(@color, 30%) 85%,\n    fade(@color, 35%) 88%,\n    fade(@color, 40%) 90%,\n    fade(@color, 45%) 95%,\n    fade(@color, 50%) 100%\n  );\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/plugin/plugin.js",
    "content": "\nfunctions.add('func', function() {\n    return less.anonymous(location.href);\n});\n"
  },
  {
    "path": "packages/less/test/browser/less/plugin/plugin.less",
    "content": "@plugin \"plugin\";\n.test {\n  val: func();\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/postProcessor/postProcessor.less",
    "content": "@color: white;\n.test {\n    color: @color;\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/relative-urls/urls.less",
    "content": "@import \".././imports/urls.less\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/urls2.less\";\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(images/image.jpg);\n  background: url(\"#inline-svg\");\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/rewrite-urls/urls.less",
    "content": "@import \".././imports/urls.less\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/urls2.less\";\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(images/image.jpg);\n  background: url(\"#inline-svg\");\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/rootpath/urls.less",
    "content": "@import \"../imports/urls.less\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/urls2.less\";\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/rootpath-relative/urls.less",
    "content": "@import \"../imports/urls.less\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/urls2.less\";\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/rootpath-rewrite-urls/urls.less",
    "content": "@import \"../imports/urls.less\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/urls2.less\";\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n"
  },
  {
    "path": "packages/less/test/browser/less/urls.less",
    "content": "@import \"imports/urls.less\";\n@import \"http://localhost:8081/packages/less/test/browser/less/imports/urls2.less\";\n@import \"http://localhost:8081/packages/less/test/browser/less/nested-gradient-with-svg-gradient/mixin-consumer.less\";\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n  not-a-comment: url(//z);\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n#data-uri {\n  uri: data-uri('image/jpeg;base64', '../../data/image.jpg');\n}\n\n#data-uri-guess {\n  uri: data-uri('../../data/image.jpg');\n}\n\n#data-uri-ascii {\n  uri-1: data-uri('text/html', '../../data/page.html');\n  uri-2: data-uri('../../data/page.html');\n}\n\n#svg-functions {\n  @colorlist1: black, white;\n  background-image: svg-gradient(to bottom, @colorlist1);\n  background-image: svg-gradient(to bottom, black white);\n  background-image: svg-gradient(to bottom, black, orange 3%, white);\n  @colorlist2: black, orange 3%, white;\n  background-image: svg-gradient(to bottom, @colorlist2);\n  @green_5: green 5%;\n  @orange_percentage: 3%;\n  @orange_color: orange;\n  @colorlist3: (mix(black, white) + #444) 1%, @orange_color @orange_percentage, ((@green_5)), white 95%;\n  background-image: svg-gradient(to bottom,@colorlist3);\n  background-image: svg-gradient(to bottom, (mix(black, white) + #444) 1%, @orange_color @orange_percentage, ((@green_5)), white 95%);\n}\n"
  },
  {
    "path": "packages/less/test/browser/runner-VisitorPlugin-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console',\n    plugins: [VisitorPlugin]};\n"
  },
  {
    "path": "packages/less/test/browser/runner-VisitorPlugin.js",
    "content": "describe('less.js Visitor Plugin', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-browser-options.js",
    "content": "var less = {\n    logLevel: 4, \n    errorReporting: 'console', \n    javascriptEnabled: true,\n    math: 'always'\n};\n\n// test inline less in style tags by grabbing an assortment of less files and doing `@import`s\nvar testFiles = ['charsets/charsets', 'color-functions/basic', 'comments/comments', 'css-3/css-3', 'strings/strings', 'media/media', 'mixins/mixins'],\n    testSheets = [];\n\n// setup style tags with less and link tags pointing to expected css output\n\n/**\n * @todo - generate the node_modules path for this file and in templates\n */\nvar lessFolder = '../../node_modules/@less/test-data/tests-unit'\nvar cssFolder = '../../node_modules/@less/test-data/tests-unit'\n\nfor (var i = 0; i < testFiles.length; i++) {\n    var file = testFiles[i],\n        lessPath  = lessFolder + '/' + file + '.less',\n        cssPath   = cssFolder + '/' + file + '.css',\n        lessStyle = document.createElement('style'),\n        cssLink   = document.createElement('link'),\n        lessText  = '@import \"' + lessPath + '\";';\n\n    lessStyle.type = 'text/less';\n    lessStyle.id = file;\n    lessStyle.href = file;\n\n    if (lessStyle.styleSheet === undefined) {\n        lessStyle.appendChild(document.createTextNode(lessText));\n    }\n\n    cssLink.rel = 'stylesheet';\n    cssLink.type = 'text/css';\n    cssLink.href = cssPath;\n    cssLink.id = 'expected-' + file;\n\n    var head = document.getElementsByTagName('head')[0];\n\n    head.appendChild(lessStyle);\n\n    if (lessStyle.styleSheet) {\n        lessStyle.styleSheet.cssText = lessText;\n    }\n\n    head.appendChild(cssLink);\n    testSheets[i] = lessStyle;\n}\n"
  },
  {
    "path": "packages/less/test/browser/runner-browser-spec.js",
    "content": "describe('less.js browser behaviour', function() {\n    testLessEqualsInDocument();\n\n    it('has some log messages', function() {\n        expect(logMessages.length).to.be.above(0);\n    });\n\n    for (var i = 0; i < testFiles.length; i++) {\n        var sheet = testSheets[i];\n        testSheet(sheet);\n    }\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-console-errors.js",
    "content": "less.errorReporting = 'console';\n\ndescribe('less.js error reporting console test', function() {\n    testLessErrorsInDocument(true);\n});"
  },
  {
    "path": "packages/less/test/browser/runner-errors-options.js",
    "content": "var less = {\n    strictUnits: true,\n    math: 'strict-legacy',\n    logLevel: 4,\n    javascriptEnabled: true\n};\n"
  },
  {
    "path": "packages/less/test/browser/runner-errors-spec.js",
    "content": "describe('less.js error tests', function() {\n    testLessErrorsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-filemanagerPlugin-options.js",
    "content": "var less = {\n    logLevel: 4,\n    errorReporting: 'console',\n    plugins: [AddFilePlugin]\n};\n"
  },
  {
    "path": "packages/less/test/browser/runner-filemanagerPlugin.js",
    "content": "describe('less.js filemanager Plugin', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-global-vars-options.js",
    "content": "var less = {\n    logLevel: 4,\n    errorReporting: 'console',\n    globalVars: {\n        '@global-var': 'red'\n    }\n};\n"
  },
  {
    "path": "packages/less/test/browser/runner-global-vars-spec.js",
    "content": "describe('less.js global vars', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-main-options.js",
    "content": "var less = {\n    logLevel: 4,\n    errorReporting: 'console'\n};\nless.functions = {\n    add: function(a, b) {\n        return new(less.tree.Dimension)(a.value + b.value);\n    },\n    increment: function(a) {\n        return new(less.tree.Dimension)(a.value + 1);\n    },\n    _color: function(str) {\n        if (str.value === 'evil red') {\n            return new(less.tree.Color)('600');\n        }\n    }\n};"
  },
  {
    "path": "packages/less/test/browser/runner-main-spec.js",
    "content": "console.warn('start spec');\ndescribe('less.js main tests', function() {\n    testLessEqualsInDocument();\n    it('the global environment', function() {\n        expect(window.require).to.be.undefined;\n    });\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-modify-vars-options.js",
    "content": "/* exported less */\nvar less = {\n    logLevel: 4,\n    errorReporting: 'console'\n};"
  },
  {
    "path": "packages/less/test/browser/runner-modify-vars-spec.js",
    "content": "var alreadyRun = false;\n\ndescribe('less.js modify vars', function () {\n    beforeEach(function (done) {\n        // simulating \"setUp\" or \"beforeAll\" method\n        if (alreadyRun) {\n            done();\n            return;\n        }\n\n        alreadyRun = true;\n\n        less.pageLoadFinished\n            .then(function () {\n                less.modifyVars({\n                    var1: 'green',\n                    var2: 'purple',\n                    scale: 20\n                }).then(function () {\n                    done();\n                });\n            });\n    });\n\n    testLessEqualsInDocument();\n    it('Should log only 2 XHR requests', function (done) {\n        var xhrLogMessages = logMessages.filter(function (item) {\n            return (/XHR: Getting '/).test(item);\n        });\n        expect(xhrLogMessages.length).to.equal(2);\n        done();\n    });\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-no-js-errors-options.js",
    "content": "var less = {logLevel: 4};\n\nless.strictUnits = true;\nless.javascriptEnabled = false;\n"
  },
  {
    "path": "packages/less/test/browser/runner-no-js-errors-spec.js",
    "content": "describe('less.js javascript disabled error tests', function() {\n    testLessErrorsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-postProcessorPlugin-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console',\n    plugins: [postProcessorPlugin]};\n"
  },
  {
    "path": "packages/less/test/browser/runner-postProcessorPlugin.js",
    "content": "describe('less.js postProcessor Plugin', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-preProcessorPlugin-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console',\n    plugins: [preProcessorPlugin]};\n"
  },
  {
    "path": "packages/less/test/browser/runner-preProcessorPlugin.js",
    "content": "describe('less.js preProcessor Plugin', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-production-options.js",
    "content": "var less = {logLevel: 1,\n    errorReporting: 'console'};\nless.env = 'production';\n"
  },
  {
    "path": "packages/less/test/browser/runner-production-spec.js",
    "content": "describe('less.js production behaviour', function() {\n    it('doesn\\'t log any messages', function() {\n        expect(logMessages.length).to.equal(0);\n    });\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-relative-urls-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console'};\nless.relativeUrls = true;\n"
  },
  {
    "path": "packages/less/test/browser/runner-relative-urls-spec.js",
    "content": "describe('less.js browser test - relative url\\'s', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-rewrite-urls-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console'};\nless.rewriteUrls = 'all';\n"
  },
  {
    "path": "packages/less/test/browser/runner-rewrite-urls-spec.js",
    "content": "describe('less.js browser test - rewrite urls', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-rootpath-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console'};\nless.rootpath = 'https://localhost/';\n"
  },
  {
    "path": "packages/less/test/browser/runner-rootpath-relative-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console'};\nless.rootpath = 'https://www.github.com/cloudhead/less.js/';\nless.relativeUrls = true;\n"
  },
  {
    "path": "packages/less/test/browser/runner-rootpath-relative-spec.js",
    "content": "describe('less.js browser test - rootpath and relative urls', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-rootpath-rewrite-urls-options.js",
    "content": "var less = {logLevel: 4,\n    errorReporting: 'console'};\nless.rootpath = 'https://www.github.com/cloudhead/less.js/';\nless.rewriteUrls = 'all';\n"
  },
  {
    "path": "packages/less/test/browser/runner-rootpath-rewrite-urls-spec.js",
    "content": "describe('less.js browser test - rootpath and rewrite urls', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-rootpath-spec.js",
    "content": "describe('less.js browser test - rootpath url\\'s', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/browser/runner-strict-units-options.js",
    "content": "var less = {\n    logLevel: 4,\n    errorReporting: 'console',\n    strictMath: true,\n    strictUnits: true };\n"
  },
  {
    "path": "packages/less/test/browser/runner-strict-units-spec.js",
    "content": "describe('less.js strict units tests', function() {\n    testLessEqualsInDocument();\n});\n"
  },
  {
    "path": "packages/less/test/exports/import-patterns.cjs",
    "content": "/**\n * Verifies package exports support the import patterns users report.\n * Actual import tests: test-es6.js, test-cjs.cjs, webpack-browser.cjs\n * See: https://github.com/less/less.js/issues/4423\n */\n'use strict';\n\nconst path = require('path');\nconst fs = require('fs');\n\nconsole.log('Verifying exports for user import patterns...\\n');\n\nconst pkgPath = path.join(__dirname, '../../package.json');\nconst pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\nconst exp = pkg.exports;\n\nif (!exp?.['.']?.browser) {\n  console.error('FAIL: exports.browser required (webpack: import less from \"less\")');\n  process.exit(1);\n}\nif (!fs.existsSync(path.join(__dirname, '../../dist/less.js'))) {\n  console.error('FAIL: dist/less.js not found (run \"npm run build\" first)');\n  process.exit(1);\n}\n\nconsole.log('✓ exports support: import less from \"less\" (Node/ESM)');\nconsole.log('✓ exports support: require(\"less\") (Node/CJS)');\nconsole.log('✓ exports support: import less from \"less\" (webpack browser → dist/less.js UMD)');\n"
  },
  {
    "path": "packages/less/test/exports/webpack-browser-entry.js",
    "content": "/**\n * Entry used by webpack to test browser bundling.\n * Replicates: import less from 'less' in a webpack build targeting browser.\n * See: https://github.com/less/less.js/issues/4423\n */\nimport less from 'less';\n\n// Minimal sanity check - browser bundle exposes less on window when loaded via script,\n// but when bundled we get the module directly\nconst result = await less.render('.test { color: red; }');\nif (!result.css.includes('color: red')) {\n    throw new Error('less.render failed');\n}\n"
  },
  {
    "path": "packages/less/test/exports/webpack-browser.cjs",
    "content": "/**\n * Tests that webpack can bundle less for browser target without\n * \"Can't resolve 'module'\" error.\n * See: https://github.com/less/less.js/issues/4423\n */\n'use strict';\n\nconst path = require('path');\nconst fs = require('fs');\n\nasync function run() {\n  let webpack;\n  try {\n    webpack = require('webpack');\n  } catch (e) {\n    console.log('Skipping webpack browser test: webpack not installed');\n    console.log('  (Add webpack and webpack-cli as devDependencies to run this test)');\n    return;\n  }\n\n  const config = {\n    mode: 'development',\n    target: 'web',\n    entry: path.join(__dirname, 'webpack-browser-entry.js'),\n    output: {\n      path: path.join(__dirname, '..', '..', 'tmp'),\n      filename: 'webpack-browser-test-bundle.js'\n    },\n    resolve: {\n      conditionNames: ['browser', 'import', 'require', 'default']\n    },\n    module: {\n      rules: [\n        {\n          // dist/less.js is UMD - ensure webpack treats it correctly\n          test: /[\\\\/]dist[\\\\/]less\\.js$/,\n          type: 'javascript/auto'\n        }\n      ]\n    }\n  };\n\n  return new Promise((resolve, reject) => {\n    webpack(config, (err, stats) => {\n      if (err) {\n        reject(err);\n        return;\n      }\n      const info = stats.toJson();\n      if (stats.hasErrors()) {\n        const msg = info.errors.map(e => (e.message || String(e))).join('\\n');\n        reject(new Error('Webpack build failed:\\n' + msg));\n        return;\n      }\n      const outPath = path.join(config.output.path, config.output.filename);\n      if (!fs.existsSync(outPath)) {\n        reject(new Error('Bundle was not created'));\n        return;\n      }\n      console.log(\"✓ Testing: import less from 'less' in webpack build (browser target) — #4423\");\n      resolve();\n    });\n  });\n}\n\nrun().catch((err) => {\n  console.error('Webpack browser test FAILED:', err.message);\n  process.exit(1);\n});\n"
  },
  {
    "path": "packages/less/test/index.js",
    "content": "import { createRequire } from 'module';\nimport Module from 'module';\nimport path from 'path';\nimport fs from 'fs';\nimport { fileURLToPath } from 'url';\nimport less from '../lib/less-node/index.js';\nimport { stylize } from '../lib/less-node/lessc-helper.js';\nimport createLessTester from './less-test.js';\n\nconst require = createRequire(import.meta.url);\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// Mock needle for HTTP requests\nconst originalRequire = Module.prototype.require;\nModule.prototype.require = function(id) {\n    if (id === 'needle') {\n        return {\n            get: function(url, options, callback) {\n                // Handle CDN requests\n                if (url.includes('cdn.jsdelivr.net')) {\n                    if (url.includes('selectors.less')) {\n                        setTimeout(() => {\n                            callback(null, { statusCode: 200 }, fs.readFileSync(path.join(__dirname, '../../test-data/tests-unit/selectors/selectors.less'), 'utf8'));\n                        }, 10);\n                        return;\n                    }\n                    if (url.includes('media.less')) {\n                        setTimeout(() => {\n                            callback(null, { statusCode: 200 }, fs.readFileSync(path.join(__dirname, '../../test-data/tests-unit/media/media.less'), 'utf8'));\n                        }, 10);\n                        return;\n                    }\n                    if (url.includes('empty.less')) {\n                        setTimeout(() => {\n                            callback(null, { statusCode: 200 }, fs.readFileSync(path.join(__dirname, '../../test-data/tests-unit/empty/empty.less'), 'utf8'));\n                        }, 10);\n                        return;\n                    }\n                }\n\n                // Handle redirect test\n                if (url.includes('example.com/redirect.less')) {\n                    setTimeout(() => {\n                        callback(null, { statusCode: 200 }, 'h1 { color: blue; }');\n                    }, 10);\n                    return;\n                }\n\n                if (url.includes('example.com/target.less')) {\n                    setTimeout(() => {\n                        callback(null, { statusCode: 200 }, 'h1 { color: blue; }');\n                    }, 10);\n                    return;\n                }\n\n                // Default error for unmocked URLs\n                setTimeout(() => {\n                    callback(new Error('Unmocked URL: ' + url), null, null);\n                }, 10);\n            }\n        };\n    }\n    return originalRequire.apply(this, arguments);\n};\n\n// Parse command line arguments for test filtering\nvar args = process.argv.slice(2);\nvar testFilter = args.length > 0 ? args[0] : null;\n\n// Create the test runner with the filter\nvar lessTester = createLessTester(testFilter);\n\n// Test HTTP redirect functionality\nfunction testHttpRedirects() {\n    console.log('Testing HTTP redirect functionality...');\n\n    const redirectTest = `\n@import \"https://example.com/redirect.less\";\n\nh1 { color: red; }\n`;\n\n    return less.render(redirectTest, {\n        filename: 'test-redirect.less'\n    }).then(result => {\n        console.log('HTTP redirect test SUCCESS:');\n        console.log(result.css);\n\n        if (result.css.includes('color: blue') && result.css.includes('color: red')) {\n            console.log('HTTP redirect test PASSED - both imported and local content found');\n            return true;\n        } else {\n            console.log('HTTP redirect test FAILED - missing expected content');\n            return false;\n        }\n    }).catch(err => {\n        console.log('HTTP redirect test ERROR:');\n        console.log(err.message);\n        return false;\n    });\n}\n\n// Test import-remote functionality\nfunction testImportRemote() {\n    console.log('Testing import-remote functionality...');\n\n    const testFile = path.join(__dirname, '../../test-data/tests-unit/import/import-remote.less');\n    const expectedFile = path.join(__dirname, '../../test-data/tests-unit/import/import-remote.css');\n\n    const content = fs.readFileSync(testFile, 'utf8');\n    const expected = fs.readFileSync(expectedFile, 'utf8');\n\n    return less.render(content, {\n        filename: testFile\n    }).then(result => {\n        console.log('Import-remote test SUCCESS:');\n        console.log('Expected:', expected.trim());\n        console.log('Actual:', result.css.trim());\n\n        if (result.css.trim() === expected.trim()) {\n            console.log('Import-remote test PASSED - CDN imports and variable resolution working');\n            return true;\n        } else {\n            console.log('Import-remote test FAILED - output mismatch');\n            return false;\n        }\n    }).catch(err => {\n        console.log('Import-remote test ERROR:');\n        console.log(err.message);\n        return false;\n    });\n}\n\nconsole.log('\\n' + stylize('Less', 'underline') + '\\n');\n\nif (testFilter) {\n    console.log('Running tests matching: ' + testFilter + '\\n');\n}\n\nvar globPatterns = [\n    'tests-config/*/*.less',\n    'tests-unit/*/*.less',\n    'tests-config/debug/*/linenumbers-*.less',\n    '!tests-config/sourcemaps/**/*.less',\n    '!tests-config/sourcemaps-empty/*',\n    '!tests-config/sourcemaps-disable-annotation/*',\n    '!tests-config/sourcemaps-variable-selector/*',\n    '!tests-config/globalVars/*',\n    '!tests-config/modifyVars/*',\n    '!tests-config/js-type-errors/*',\n    '!tests-config/no-js-errors/*',\n    '!tests-unit/import/import-remote.less',\n];\n\nvar testMap = [\n    { patterns: globPatterns },\n    { patterns: ['tests-error/eval/*.less'], verifyFunction: lessTester.testErrors },\n    { patterns: ['tests-error/parse/*.less'], verifyFunction: lessTester.testErrors },\n    { patterns: ['tests-config/js-type-errors/*.less'], verifyFunction: lessTester.testTypeErrors },\n    { patterns: ['tests-config/no-js-errors/*.less'], verifyFunction: lessTester.testErrors },\n    {\n        patterns: [\n            'tests-config/sourcemaps/**/*.less',\n            'tests-config/sourcemaps-url/**/*.less',\n            'tests-config/sourcemaps-rootpath/**/*.less',\n            'tests-config/sourcemaps-basepath/**/*.less',\n            'tests-config/sourcemaps-include-source/**/*.less'\n        ],\n        verifyFunction: lessTester.testSourcemap,\n        getFilename: function(filename, type, baseFolder) {\n            if (type === 'vars') {\n                return path.join(baseFolder, filename) + '.json';\n            }\n            var jsonFilename = path.basename(filename);\n            return path.join('test/sourcemaps', jsonFilename) + '.json';\n        }\n    },\n    { patterns: ['tests-config/sourcemaps-empty/*.less'], verifyFunction: lessTester.testEmptySourcemap },\n    { patterns: ['tests-config/sourcemaps-disable-annotation/*.less'], verifyFunction: lessTester.testSourcemapWithoutUrlAnnotation },\n    { patterns: ['tests-config/sourcemaps-variable-selector/*.less'], verifyFunction: lessTester.testSourcemapWithVariableInSelector },\n    {\n        patterns: ['tests-config/globalVars/*.less'],\n        lessOptions: {\n            globalVars: function(file) {\n                const basename = path.basename(file, '.less');\n                const jsonPath = path.join(path.dirname(file), basename + '.json');\n                try {\n                    return JSON.parse(fs.readFileSync(jsonPath, 'utf8'));\n                } catch (e) {\n                    return {};\n                }\n            }\n        }\n    },\n    {\n        patterns: ['tests-config/modifyVars/*.less'],\n        lessOptions: {\n            modifyVars: function(file) {\n                const basename = path.basename(file, '.less');\n                const jsonPath = path.join(path.dirname(file), basename + '.json');\n                try {\n                    return JSON.parse(fs.readFileSync(jsonPath, 'utf8'));\n                } catch (e) {\n                    return {};\n                }\n            }\n        }\n    }\n];\n\ntestMap.forEach(function(testConfig) {\n    if (testConfig.patterns) {\n        lessTester.runTestSet(\n            testConfig.lessOptions || {},\n            testConfig.patterns,\n            testConfig.verifyFunction || null,\n            testConfig.nameModifier || null,\n            testConfig.doReplacements || null,\n            testConfig.getFilename || null\n        );\n    } else {\n        lessTester.runTestSet.apply(lessTester, [\n            testConfig.options || {},\n            testConfig.foldername,\n            testConfig.verifyFunction || null,\n            testConfig.nameModifier || null,\n            testConfig.doReplacements || null,\n            testConfig.getFilename || null\n        ]);\n    }\n});\n\nlessTester.testSyncronous({syncImport: true}, 'tests-unit/import/import');\nlessTester.testSyncronous({syncImport: true}, 'tests-config/math-strict/css');\n\nlessTester.testNoOptions();\nlessTester.testDisablePluginRule();\nlessTester.testJSImport();\nlessTester.finished();\n\nconsole.log('\\nTesting HTTP redirect functionality...');\ntestHttpRedirects();\nconsole.log('HTTP redirect test completed');\n\nconsole.log('\\nTesting import-remote functionality...');\ntestImportRemote();\nconsole.log('Import-remote test completed');\n"
  },
  {
    "path": "packages/less/test/less-test.js",
    "content": "/* jshint latedef: nofunc */\nimport { createRequire } from 'module';\nimport path from 'path';\nimport fs from 'fs';\nimport semver from 'semver';\nimport logger from '../lib/less/logger.js';\nimport { cosmiconfigSync } from 'cosmiconfig';\nimport { globSync } from 'glob';\nimport { copy as clone } from 'copy-anything';\nimport less from '../lib/less-node/index.js';\nimport { stylize } from '../lib/less-node/lessc-helper.js';\n\nconst require = createRequire(import.meta.url);\n\nvar isVerbose = process.env.npm_config_loglevel !== 'concise';\nlogger.addListener({\n    info(msg) {\n        if (isVerbose) {\n            process.stdout.write(msg + '\\n');\n        }\n    },\n    warn(msg) {\n        process.stdout.write(msg + '\\n');\n    },\n    error(msg) {\n        process.stdout.write(msg + '\\n');\n    }\n});\n\n\nexport default function(testFilter) {\n    var globals = Object.keys(global);\n\n    var oneTestOnly = testFilter || process.argv[2],\n        isFinished = false;\n\n    var testFolder = path.dirname(require.resolve('@less/test-data'));\n    var lessFolder = testFolder;\n\n    var queueList = [],\n        queueRunning = false;\n    function queue(func) {\n        if (queueRunning) {\n            queueList.push(func);\n        } else {\n            queueRunning = true;\n            func();\n        }\n    }\n    function release() {\n        if (queueList.length) {\n            var func = queueList.shift();\n            setTimeout(func, 0);\n        } else {\n            queueRunning = false;\n        }\n    }\n\n    var totalTests = 0,\n        failedTests = 0,\n        passedTests = 0,\n        finishTimer = setInterval(endTest, 500);\n\n    less.functions.functionRegistry.addMultiple({\n        add: function (a, b) {\n            return new(less.tree.Dimension)(a.value + b.value);\n        },\n        increment: function (a) {\n            return new(less.tree.Dimension)(a.value + 1);\n        },\n        _color: function (str) {\n            if (str.value === 'evil red') { return new(less.tree.Color)('600'); }\n        }\n    });\n\n    function validateSourcemapMappings(sourcemap, lessFile, compiledCSS) {\n        var SourceMapConsumer = require('source-map').SourceMapConsumer;\n        var sourceMapObj = typeof sourcemap === 'string' ? JSON.parse(sourcemap) : sourcemap;\n        var consumer = new SourceMapConsumer(sourceMapObj);\n\n        var lessSource = fs.readFileSync(lessFile, 'utf8');\n        var lessLines = lessSource.split('\\n');\n\n        var cssSource = compiledCSS.replace(/\\/\\*# sourceMappingURL=.*\\*\\/\\s*$/, '').trim();\n        var cssLines = cssSource.split('\\n');\n\n        var errors = [];\n        var validatedMappings = 0;\n\n        for (var cssLine = 1; cssLine <= cssLines.length; cssLine++) {\n            var cssLineContent = cssLines[cssLine - 1];\n            if (!cssLineContent.trim()) {\n                continue;\n            }\n\n            var mapping = consumer.originalPositionFor({\n                line: cssLine,\n                column: 0\n            });\n\n            if (mapping.source) {\n                validatedMappings++;\n\n                if (!sourceMapObj.sources || sourceMapObj.sources.indexOf(mapping.source) === -1) {\n                    errors.push('Line ' + cssLine + ': mapped to source \"' + mapping.source + '\" which is not in sources array');\n                }\n\n                if (mapping.line && mapping.line > 0) {\n                    var sourceIndex = sourceMapObj.sources.indexOf(mapping.source);\n                    if (sourceIndex >= 0 && sourceMapObj.sourcesContent && sourceMapObj.sourcesContent[sourceIndex] !== undefined && sourceMapObj.sourcesContent[sourceIndex] !== null) {\n                        var sourceContent = sourceMapObj.sourcesContent[sourceIndex];\n                        if (typeof sourceContent !== 'string') {\n                            sourceContent = String(sourceContent);\n                        }\n                        var sourceLines = sourceContent.split(/\\r?\\n/);\n                        if (mapping.line > sourceLines.length) {\n                            errors.push('Line ' + cssLine + ': mapped to line ' + mapping.line + ' in \"' + mapping.source + '\" but source only has ' + sourceLines.length + ' lines');\n                        }\n                    }\n                }\n            }\n        }\n\n        if (sourceMapObj.sources) {\n            sourceMapObj.sources.forEach(function(source, index) {\n                if (sourceMapObj.sourcesContent && sourceMapObj.sourcesContent[index]) {\n                    if (!sourceMapObj.sourcesContent[index].trim()) {\n                        errors.push('Source \"' + source + '\" has empty content');\n                    }\n                }\n            });\n        }\n\n        if (consumer.destroy && typeof consumer.destroy === 'function') {\n            consumer.destroy();\n        }\n\n        return {\n            valid: errors.length === 0,\n            errors: errors,\n            mappingsValidated: validatedMappings\n        };\n    }\n\n    function testSourcemap(name, err, compiledLess, doReplacements, sourcemap, baseFolder, imports, getFilename) {\n        if (err) {\n            fail('ERROR: ' + (err && err.message));\n            return;\n        }\n        var sourceMappingPrefix = '/*# sourceMappingURL=',\n            sourceMappingSuffix = ' */';\n        var indexOfSourceMappingPrefix = compiledLess.indexOf(sourceMappingPrefix);\n        if (indexOfSourceMappingPrefix === -1) {\n            fail('ERROR: sourceMappingURL was not found in ' + baseFolder + '/' + name + '.css.');\n            return;\n        }\n\n        var startOfSourceMappingValue = indexOfSourceMappingPrefix + sourceMappingPrefix.length,\n            indexOfSuffix = compiledLess.indexOf(sourceMappingSuffix, startOfSourceMappingValue),\n            actualSourceMapURL = compiledLess.substring(startOfSourceMappingValue, indexOfSuffix === -1 ? compiledLess.length : indexOfSuffix).trim();\n\n        if (!actualSourceMapURL) {\n            fail('ERROR: sourceMappingURL is empty in ' + baseFolder + '/' + name + '.css.');\n            return;\n        }\n\n        var jsonPath;\n        if (getFilename && typeof getFilename === 'function') {\n            jsonPath = getFilename(name, 'sourcemap', baseFolder);\n        } else {\n            var jsonFilename = path.basename(name);\n            jsonPath = path.join('test/sourcemaps', jsonFilename) + '.json';\n        }\n        fs.readFile(jsonPath, 'utf8', function (e, expectedSourcemap) {\n            process.stdout.write('- ' + path.join(baseFolder, name) + ': ');\n            if (e) {\n                fail('ERROR: Could not read expected sourcemap file: ' + jsonPath + ' - ' + e.message);\n                return;\n            }\n\n            var replacementPath = path.join(path.dirname(path.join(baseFolder, name) + '.less'), '/');\n            replacementPath = replacementPath.replace(/\\\\/g, '/');\n            expectedSourcemap = expectedSourcemap.replace(/\\{path\\}/g, replacementPath);\n            expectedSourcemap = doReplacements(expectedSourcemap, baseFolder, path.join(baseFolder, name) + '.less');\n\n            function normalizeSourcemapPaths(sm) {\n                try {\n                    var parsed = typeof sm === 'string' ? JSON.parse(sm) : sm;\n                    if (parsed.file) {\n                        parsed.file = parsed.file.replace(/\\\\/g, '/');\n                    }\n                    if (parsed.sources && Array.isArray(parsed.sources)) {\n                        parsed.sources = parsed.sources.map(function(src) {\n                            return src.replace(/\\\\/g, '/');\n                        });\n                    }\n                    return JSON.stringify(parsed, null, 0);\n                } catch (parseErr) {\n                    return sm;\n                }\n            }\n\n            var normalizedSourcemap = normalizeSourcemapPaths(sourcemap);\n            var normalizedExpected = normalizeSourcemapPaths(expectedSourcemap);\n\n            if (normalizedSourcemap === normalizedExpected) {\n                var nameParts = name.split('/');\n                var lessFileName = nameParts[nameParts.length - 1];\n                var lessFileDir = nameParts.length > 1 ? nameParts.slice(0, -1).join('/') : '';\n                var lessFile = path.join(lessFolder, lessFileDir, lessFileName) + '.less';\n\n                if (fs.existsSync(lessFile)) {\n                    try {\n                        var sourceMapObjForValidation = typeof sourcemap === 'string' ? JSON.parse(sourcemap) : sourcemap;\n                        var validation = validateSourcemapMappings(sourceMapObjForValidation, lessFile, compiledLess);\n                        if (!validation.valid) {\n                            fail('ERROR: Sourcemap validation failed:\\n' + validation.errors.join('\\n'));\n                            return;\n                        }\n                        if (isVerbose && validation.mappingsValidated > 0) {\n                            process.stdout.write(' (validated ' + validation.mappingsValidated + ' mappings)');\n                        }\n                    } catch (validationErr) {\n                        if (isVerbose) {\n                            process.stdout.write(' (validation error: ' + validationErr.message + ')');\n                        }\n                    }\n                }\n\n                ok('OK');\n            } else if (err) {\n                fail('ERROR: ' + (err && err.message));\n                if (isVerbose) {\n                    process.stdout.write('\\n');\n                    process.stdout.write(err.stack + '\\n');\n                }\n            } else {\n                difference('FAIL', normalizedExpected, normalizedSourcemap);\n            }\n        });\n    }\n\n    function testSourcemapWithoutUrlAnnotation(name, err, compiledLess, doReplacements, sourcemap, baseFolder) {\n        if (err) {\n            fail('ERROR: ' + (err && err.message));\n            return;\n        }\n        var sourceMapRegExp = /\\/\\*# sourceMappingURL=.+\\.css\\.map \\*\\/$/;\n        if (sourceMapRegExp.test(compiledLess)) {\n            fail('ERROR: sourceMappingURL found in ' + baseFolder + '/' + name + '.css.');\n            return;\n        }\n\n        fs.readFile(path.join('test/', name) + '.json', 'utf8', function (e, expectedSourcemap) {\n            process.stdout.write('- ' + path.join(baseFolder, name) + ': ');\n            if (sourcemap === expectedSourcemap) {\n                ok('OK');\n            } else if (err) {\n                fail('ERROR: ' + (err && err.message));\n                if (isVerbose) {\n                    process.stdout.write('\\n');\n                    process.stdout.write(err.stack + '\\n');\n                }\n            } else {\n                difference('FAIL', expectedSourcemap, sourcemap);\n            }\n        });\n    }\n\n    function testEmptySourcemap(name, err, compiledLess, doReplacements, sourcemap, baseFolder) {\n        process.stdout.write('- ' + path.join(baseFolder, name) + ': ');\n        if (err) {\n            fail('ERROR: ' + (err && err.message));\n        } else {\n            var expectedSourcemap = undefined;\n            if ( compiledLess !== '' ) {\n                difference('\\nCompiledLess must be empty', '', compiledLess);\n            } else if (sourcemap !== expectedSourcemap) {\n                fail('Sourcemap must be undefined');\n            } else {\n                ok('OK');\n            }\n        }\n    }\n\n    function testSourcemapWithVariableInSelector(name, err, compiledLess, doReplacements, sourcemap, baseFolder) {\n        if (err) {\n            fail('ERROR: ' + (err && err.message));\n            return;\n        }\n\n        fs.readFile(path.join('test/', name) + '.json', 'utf8', function (e, expectedSourcemap) {\n            process.stdout.write('- ' + path.join(baseFolder, name) + ': ');\n            if (sourcemap === expectedSourcemap) {\n                ok('OK');\n            } else if (err) {\n                fail('ERROR: ' + (err && err.message));\n                if (isVerbose) {\n                    process.stdout.write('\\n');\n                    process.stdout.write(err.stack + '\\n');\n                }\n            } else {\n                difference('FAIL', expectedSourcemap, sourcemap);\n            }\n        });\n    }\n\n    function testImports(name, err, compiledLess, doReplacements, sourcemap, baseFolder, imports) {\n        if (err) {\n            fail('ERROR: ' + (err && err.message));\n            return;\n        }\n\n        function stringify(str) {\n            return JSON.stringify(imports, null, '  ')\n        }\n\n        const importsString = stringify(imports.sort())\n\n        fs.readFile(path.join(lessFolder, name) + '.json', 'utf8', function (e, expectedImports) {\n            if (e) {\n                fail('ERROR: ' + (e && e.message));\n                return;\n            }\n            process.stdout.write('- ' + path.join(baseFolder, name) + ': ');\n            expectedImports = stringify(JSON.parse(expectedImports).sort());\n            expectedImports = globalReplacements(expectedImports, baseFolder);\n\n            if (expectedImports === importsString) {\n                ok('OK');\n            } else if (err) {\n                fail('ERROR: ' + (err && err.message));\n                if (isVerbose) {\n                    process.stdout.write('\\n');\n                    process.stdout.write(err.stack + '\\n');\n                }\n            } else {\n                difference('FAIL', expectedImports, importsString);\n            }\n        });\n    }\n\n    function testErrors(name, err, compiledLess, doReplacements, sourcemap, baseFolder) {\n        fs.readFile(path.join(baseFolder, name) + '.txt', 'utf8', function (e, expectedErr) {\n            process.stdout.write('- ' + path.join(baseFolder, name) + ': ');\n            expectedErr = doReplacements(expectedErr, baseFolder, err && err.filename);\n            if (!err) {\n                if (compiledLess) {\n                    fail('No Error', 'red');\n                } else {\n                    fail('No Error, No Output');\n                }\n            } else {\n                var errMessage = err.toString();\n                if (errMessage === expectedErr) {\n                    ok('OK');\n                } else {\n                    difference('FAIL', expectedErr, errMessage);\n                }\n            }\n        });\n    }\n\n    function testTypeErrors(name, err, compiledLess, doReplacements, sourcemap, baseFolder) {\n        const fileSuffix = semver.gte(process.version, 'v16.9.0') ? '-2.txt' : '.txt';\n        fs.readFile(path.join(baseFolder, name) + fileSuffix, 'utf8', function (e, expectedErr) {\n            process.stdout.write('- ' + path.join(baseFolder, name) + ': ');\n            expectedErr = doReplacements(expectedErr, baseFolder, err && err.filename);\n            if (!err) {\n                if (compiledLess) {\n                    fail('No Error', 'red');\n                } else {\n                    fail('No Error, No Output');\n                }\n            } else {\n                var errMessage = err.toString();\n                if (errMessage === expectedErr) {\n                    ok('OK');\n                } else {\n                    difference('FAIL', expectedErr, errMessage);\n                }\n            }\n        });\n    }\n\n    // https://github.com/less/less.js/issues/3112\n    function testJSImport() {\n        process.stdout.write('- Testing root function registry');\n        less.functions.functionRegistry.add('ext', function() {\n            return new less.tree.Anonymous('file');\n        });\n        var expected = '@charset \"utf-8\";\\n';\n        toCSS({}, path.join(lessFolder, 'tests-config', 'root-registry', 'root.less'), function(error, output) {\n            if (error) {\n                return fail('ERROR: ' + error);\n            }\n            if (output.css === expected) {\n                return ok('OK');\n            }\n            difference('FAIL', expected, output.css);\n        });\n    }\n\n    function globalReplacements(input, directory, filename) {\n        var p = filename ? path.join(path.dirname(filename), '/') : directory;\n\n        var isDebugSubdirectory = false;\n        var debugParentPath = null;\n\n        if (directory) {\n            var normalizedDir = directory.replace(/\\\\/g, '/');\n            if (normalizedDir.includes('/debug/') && (normalizedDir.includes('/comments/') || normalizedDir.includes('/mediaquery/') || normalizedDir.includes('/all/'))) {\n                isDebugSubdirectory = true;\n                var debugMatch = normalizedDir.match(/(.+\\/debug)\\//);\n                if (debugMatch) {\n                    debugParentPath = debugMatch[1];\n                }\n            }\n        }\n\n        if (isDebugSubdirectory && debugParentPath) {\n            p = debugParentPath.replace(/\\//g, path.sep) + path.sep;\n        }\n\n        var pathimport;\n        if (isDebugSubdirectory && debugParentPath) {\n            pathimport = path.join(debugParentPath.replace(/\\//g, path.sep), 'import') + path.sep;\n        } else {\n            pathimport = path.join(directory + 'import/');\n        }\n\n        var pathesc = p.replace(/[.:/\\\\]/g, function(a) { return '\\\\' + (a == '\\\\' ? '\\/' : a); }),\n            pathimportesc = pathimport.replace(/[.:/\\\\]/g, function(a) { return '\\\\' + (a == '\\\\' ? '\\/' : a); });\n\n        return input.replace(/\\{path\\}/g, p)\n            .replace(/\\{node\\}/g, '')\n            .replace(/\\{\\/node\\}/g, '')\n            .replace(/\\{pathhref\\}/g, '')\n            .replace(/\\{404status\\}/g, '')\n            .replace(/\\{nodepath\\}/g, path.join(process.cwd(), 'node_modules', '/'))\n            .replace(/\\{pathrel\\}/g, path.join(path.relative(lessFolder, p), '/'))\n            .replace(/\\{pathesc\\}/g, pathesc)\n            .replace(/\\{pathimport\\}/g, pathimport)\n            .replace(/\\{pathimportesc\\}/g, pathimportesc)\n            .replace(/\\r\\n/g, '\\n');\n    }\n\n    function checkGlobalLeaks() {\n        return Object.keys(global).filter(function(v) {\n            return globals.indexOf(v) < 0;\n        });\n    }\n\n    function testSyncronous(options, filenameNoExtension) {\n        if (oneTestOnly && ('Test Sync ' + filenameNoExtension) !== oneTestOnly) {\n            return;\n        }\n        totalTests++;\n        queue(function() {\n            var isSync = true;\n            toCSS(options, path.join(lessFolder, filenameNoExtension + '.less'), function (err, result) {\n                process.stdout.write('- Test Sync ' + filenameNoExtension + ': ');\n\n                if (isSync) {\n                    ok('OK');\n                } else {\n                    fail('Not Sync');\n                }\n                release();\n            });\n            isSync = false;\n        });\n    }\n\n    function runTestSet(options, foldername, verifyFunction, nameModifier, doReplacements, getFilename) {\n        if (Array.isArray(options)) {\n            foldername = options;\n            options = {};\n        } else if (typeof options === 'string') {\n            foldername = options;\n            options = {};\n        } else {\n            options = options ? clone(options) : {};\n        }\n        runTestSetInternal(lessFolder, options, foldername, verifyFunction, nameModifier, doReplacements, getFilename);\n    }\n\n    function runTestSetNormalOnly(options, foldername, verifyFunction, nameModifier, doReplacements, getFilename) {\n        runTestSetInternal(lessFolder, options, foldername, verifyFunction, nameModifier, doReplacements, getFilename);\n    }\n\n    function runTestSetInternal(baseFolder, opts, foldername, verifyFunction, nameModifier, doReplacements, getFilename) {\n        foldername = foldername || '';\n\n        var originalOptions = opts || {};\n\n        if (!doReplacements) {\n            doReplacements = globalReplacements;\n        }\n\n        // Handle glob patterns with exclusions\n        if (Array.isArray(foldername)) {\n            var patterns = foldername;\n            var includePatterns = [];\n            var excludePatterns = [];\n\n            patterns.forEach(function(pattern) {\n                if (pattern.startsWith('!')) {\n                    excludePatterns.push(pattern.substring(1));\n                } else {\n                    includePatterns.push(pattern);\n                }\n            });\n\n            var allFiles = [];\n            includePatterns.forEach(function(pattern) {\n                var files = globSync(pattern, {\n                    cwd: baseFolder,\n                    absolute: true,\n                    ignore: excludePatterns\n                });\n\n                allFiles = allFiles.concat(files);\n            });\n\n            allFiles.forEach(function(filePath) {\n                if (/\\.less$/.test(filePath)) {\n                    var file = path.basename(filePath);\n                    var relativePath = path.relative(baseFolder, path.dirname(filePath)) + '/';\n\n                    var cssPath = path.join(path.dirname(filePath), path.basename(file, '.less') + '.css');\n                    if (fs.existsSync(cssPath)) {\n                        processFileWithInfo({\n                            file: file,\n                            fullPath: filePath,\n                            relativePath: relativePath\n                        });\n                    }\n                }\n            });\n\n            return;\n        }\n\n        function processFileWithInfo(fileInfo) {\n            var file = fileInfo.file;\n            var fullPath = fileInfo.fullPath;\n            var relativePath = fileInfo.relativePath;\n\n            var configResult = cosmiconfigSync('styles').search(path.dirname(fullPath));\n\n            var options = JSON.parse(JSON.stringify(originalOptions || {}));\n\n            if (configResult && configResult.config && configResult.config.language && configResult.config.language.less) {\n                var lessConfig = JSON.parse(JSON.stringify(configResult.config.language.less));\n                Object.keys(lessConfig).forEach(function(key) {\n                    options[key] = lessConfig[key];\n                });\n            }\n\n            if (originalOptions && originalOptions.lessOptions) {\n                Object.keys(originalOptions.lessOptions).forEach(function(key) {\n                    var value = originalOptions.lessOptions[key];\n                    if (typeof value === 'function') {\n                        var result = value(fullPath);\n                        options[key] = result;\n                    } else {\n                        options[key] = value;\n                    }\n                });\n            }\n\n            var name = getBasename(file, relativePath);\n\n            if (oneTestOnly && typeof oneTestOnly === 'string' && !name.includes(oneTestOnly)) {\n                return;\n            }\n\n            totalTests++;\n\n            if (options.sourceMap && typeof options.sourceMap === 'object') {\n                if (!options.sourceMap.sourceMapFileInline) {\n                    if (!options.sourceMap.sourceMapOutputFilename) {\n                        options.sourceMap.sourceMapOutputFilename = name + '.css';\n                    }\n                    if (!options.sourceMap.sourceMapRootpath) {\n                        options.sourceMap.sourceMapRootpath = 'testweb/';\n                    }\n                }\n            }\n\n            options.getVars = function(file) {\n                try {\n                    return JSON.parse(fs.readFileSync(getFilename(getBasename(file, relativePath), 'vars', baseFolder), 'utf8'));\n                }\n                catch (e) {\n                    return {};\n                }\n            };\n\n            var doubleCallCheck = false;\n            queue(function() {\n                toCSS(options, fullPath, function (err, result) {\n\n                    if (doubleCallCheck) {\n                        totalTests++;\n                        fail('less is calling back twice');\n                        process.stdout.write(doubleCallCheck + '\\n');\n                        process.stdout.write((new Error()).stack + '\\n');\n                        return;\n                    }\n                    doubleCallCheck = (new Error()).stack;\n\n                    if (verifyFunction) {\n                        var verificationResult = verifyFunction(\n                            name, err, result && result.css, doReplacements, result && result.map, baseFolder, result && result.imports, getFilename\n                        );\n                        release();\n                        return verificationResult;\n                    }\n\n                    if (err) {\n                        fail('ERROR: ' + (err && err.message));\n                        if (isVerbose) {\n                            process.stdout.write('\\n');\n                            if (err.stack) {\n                                process.stdout.write(err.stack + '\\n');\n                            } else {\n                                console.log(err);\n                            }\n                        }\n                        release();\n                        return;\n                    }\n                    var css_name = name;\n                    if (nameModifier) { css_name = nameModifier(name); }\n\n                    var cssPath;\n                    if (relativePath.startsWith('tests-unit/') || relativePath.startsWith('tests-config/')) {\n                        cssPath = path.join(path.dirname(fullPath), path.basename(file, '.less') + '.css');\n                    } else {\n                        cssPath = path.join(testFolder, css_name) + '.css';\n                    }\n\n                    var replacementPath;\n                    if (relativePath.startsWith('tests-unit/') || relativePath.startsWith('tests-config/')) {\n                        replacementPath = path.dirname(fullPath);\n                        if (!replacementPath.endsWith(path.sep)) {\n                            replacementPath += path.sep;\n                        }\n                    } else {\n                        replacementPath = path.join(baseFolder, relativePath);\n                    }\n\n                    var testName = fullPath.replace(/\\.less$/, '');\n                    process.stdout.write('- ' + testName + ': ');\n\n                    var css = fs.readFileSync(cssPath, 'utf8');\n                    css = css && doReplacements(css, replacementPath);\n                    if (result.css === css) { ok('OK'); }\n                    else {\n                        difference('FAIL', css, result.css);\n                    }\n\n                    release();\n                });\n            });\n        }\n\n        function getBasename(file, relativePath) {\n            var basePath = relativePath || foldername;\n            if (basePath.charAt(basePath.length - 1) !== '/') {\n                basePath = basePath + '/';\n            }\n            return basePath + path.basename(file, '.less');\n        }\n\n        var dirPath = path.join(baseFolder, foldername);\n        var items = fs.readdirSync(dirPath);\n\n        items.forEach(function(item) {\n            if (/\\.less$/.test(item)) {\n                processFileWithInfo({\n                    file: item,\n                    fullPath: path.join(dirPath, item),\n                    relativePath: foldername\n                });\n            }\n        });\n    }\n\n    function diff(left, right) {\n        var chalk = require('chalk');\n        chalk.level = 3;\n\n        var diffResult = require('jest-diff').diffStringsUnified(left || '', right || '', {\n            expand: false,\n            includeChangeCounts: true,\n            contextLines: 1,\n            aColor: chalk.red,\n            bColor: chalk.green,\n            changeColor: chalk.inverse,\n            commonColor: chalk.dim\n        });\n\n        process.stdout.write(diffResult + '\\n');\n    }\n\n    function fail(msg) {\n        process.stdout.write(stylize(msg, 'red') + '\\n');\n        failedTests++;\n        endTest();\n    }\n\n    function difference(msg, left, right) {\n        process.stdout.write(stylize(msg, 'yellow') + '\\n');\n        failedTests++;\n\n        process.stdout.write(stylize('Diff:', 'yellow') + '\\n');\n\n        diff(left || '', right || '');\n        endTest();\n    }\n\n    function ok(msg) {\n        process.stdout.write(stylize(msg, 'green') + '\\n');\n        passedTests++;\n        endTest();\n    }\n\n    function finished() {\n        isFinished = true;\n        endTest();\n    }\n\n    function endTest() {\n        if (isFinished && ((failedTests + passedTests) >= totalTests)) {\n            clearInterval(finishTimer);\n            var leaked = checkGlobalLeaks();\n            process.stdout.write('\\n');\n            if (failedTests > 0) {\n                process.stdout.write(failedTests + stylize(' Failed', 'red') + ', ' + passedTests + ' passed\\n');\n            } else {\n                process.stdout.write(stylize('All Passed ', 'green') + passedTests + ' run\\n');\n            }\n            if (leaked.length > 0) {\n                process.stdout.write('\\n');\n                process.stdout.write(stylize('Global leak detected: ', 'red') + leaked.join(', ') + '\\n');\n            }\n\n            if (leaked.length || failedTests) {\n                process.on('exit', function() { process.reallyExit(1); });\n            }\n        }\n    }\n\n    function contains(fullArray, obj) {\n        for (var i = 0; i < fullArray.length; i++) {\n            if (fullArray[i] === obj) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    function toCSS(options, filePath, callback) {\n        var originalOptions = options || {};\n        options = JSON.parse(JSON.stringify(originalOptions));\n\n        if (originalOptions.getVars) {\n            options.getVars = originalOptions.getVars;\n        }\n        var str = fs.readFileSync(filePath, 'utf8'), addPath = path.dirname(filePath);\n\n        if (typeof options.paths !== 'string') {\n            options.paths = options.paths || [];\n        } else {\n            options.paths = [options.paths];\n        }\n\n        if (!contains(options.paths, addPath)) {\n            options.paths.push(addPath);\n        }\n\n        options.paths = options.paths.map(searchPath => {\n            if (path.isAbsolute(searchPath)) {\n                return searchPath;\n            }\n            return path.resolve(path.dirname(filePath), searchPath);\n        })\n\n        options.filename = path.resolve(process.cwd(), filePath);\n        options.optimization = options.optimization || 0;\n\n        if (options.plugin) {\n            var Plugin = require(path.resolve(process.cwd(), options.plugin));\n            options.plugins = [Plugin];\n        }\n        less.render(str, options, callback);\n    }\n\n    function testNoOptions() {\n        if (oneTestOnly && 'Integration' !== oneTestOnly) {\n            return;\n        }\n        totalTests++;\n        try {\n            process.stdout.write('- Integration - creating parser without options: ');\n            less.render('');\n        } catch (e) {\n            fail(stylize('FAIL\\n', 'red'));\n            return;\n        }\n        ok(stylize('OK\\n', 'green'));\n    }\n\n    function testDisablePluginRule() {\n        less.render(\n            '@plugin \"../../plugin/some_plugin\";',\n            {disablePluginRule: true},\n            function(err) {\n                const EXPECTED = '@plugin statements are not allowed when disablePluginRule is set to true';\n                if (!err || String(err).indexOf(EXPECTED) < 0) {\n                    fail('ERROR: Expected \"' + EXPECTED + '\" error');\n                    return;\n                }\n                ok(stylize('OK\\n', 'green'));\n            }\n        );\n    }\n\n    return {\n        runTestSet: runTestSet,\n        runTestSetNormalOnly: runTestSetNormalOnly,\n        testSyncronous: testSyncronous,\n        testErrors: testErrors,\n        testTypeErrors: testTypeErrors,\n        testSourcemap: testSourcemap,\n        testSourcemapWithoutUrlAnnotation: testSourcemapWithoutUrlAnnotation,\n        testSourcemapWithVariableInSelector: testSourcemapWithVariableInSelector,\n        testImports: testImports,\n        testEmptySourcemap: testEmptySourcemap,\n        testNoOptions: testNoOptions,\n        testDisablePluginRule: testDisablePluginRule,\n        testJSImport: testJSImport,\n        finished: finished\n    };\n}\n"
  },
  {
    "path": "packages/less/test/mocha-playwright/runner.js",
    "content": "import path from 'path';\nimport util from 'util';\nimport { chromium } from 'playwright';\nconst TIMEOUT_MILLISECONDS = 60000;\n\nfunction initMocha(reporter) {\n\n    console.log = (console => {\n        const log = console.log.bind(console);\n        return (...args) => args.length ? log(...args) : log('');\n    })(console);\n\n    function shimMochaInstance(m) {\n\n        const originalReporter = m.reporter.bind(m);\n        let reporterIsChanged = false;\n\n        m.reporter = (...args) => {\n            reporterIsChanged = true;\n            originalReporter(...args);\n        };\n\n        const run = m.run.bind(m);\n\n        m.run = () => {\n            const all = [], pending = [], failures = [], passes = [];\n\n            function error(err) {\n                if (!err) return {};\n\n                let res = {};\n                Object.getOwnPropertyNames(err).forEach(key => res[key] = err[key]);\n                return res;\n            }\n\n            function clean(test) {\n                return {\n                    title: test.title,\n                    fullTitle: test.fullTitle(),\n                    duration: test.duration,\n                    err: error(test.err)\n                };\n            }\n\n            function result(stats) {\n                return {\n                    result: {\n                        stats: {\n                            tests: all.length,\n                            passes: passes.length,\n                            pending: pending.length,\n                            failures: failures.length,\n                            start: stats.start.toISOString(),\n                            end: stats.end.toISOString(),\n                            duration: stats.duration\n                        },\n                        tests: all.map(clean),\n                        pending: pending.map(clean),\n                        failures: failures.map(clean),\n                        passes: passes.map(clean)\n                    },\n                    coverage: window.__coverage__\n                };\n            }\n\n            function setResult() {\n                !window.__mochaResult__ && (window.__mochaResult__ = result(this.stats));\n            }\n\n            !reporterIsChanged && m.setup({ \n                reporter: Mocha.reporters[reporter] || Mocha.reporters.spec \n            });\n\n            const runner = run(() => setTimeout(() => setResult.call(runner), 0))\n                .on('pass', test => { passes.push(test); all.push(test); })\n                .on('fail', test => { failures.push(test); all.push(test); })\n                .on('pending', test => { pending.push(test); all.push(test); })\n                .on('end', setResult);\n\n            return runner;\n        };\n    }\n\n    function shimMochaProcess(M) {\n        // Mocha needs a process.stdout.write in order to change the cursor position.\n        !M.process && (M.process = {});\n        !M.process.stdout && (M.process.stdout = {});\n\n        M.process.stdout.write = data => console.log('stdout:', data);\n        M.reporters.Base.useColors = true;\n        M.reporters.none = function None(runner) {\n            M.reporters.Base.call(this, runner);\n        };\n    }\n\n    Object.defineProperty(window, 'mocha', {\n        get: function() { return undefined },\n        set: function(m) {\n            shimMochaInstance(m);\n            delete window.mocha;\n            window.mocha = m\n        },\n        configurable: true\n    })\n\n    Object.defineProperty(window, 'Mocha', {\n        get: function() { return undefined },\n        set: function(m) {\n            shimMochaProcess(m);\n            delete window.Mocha;\n            window.Mocha = m;\n        },\n        configurable: true\n    });\n}\n\nfunction configureViewport(width, height, page) {\n    if (!width && !height) return page;\n\n    let viewport = page.viewport();\n    width && (viewport.width = width);\n    height && (viewport.height = height);\n\n    return page.setViewport(viewport).then(() => page);\n}\n\nfunction handleConsole(msg) {\n    const args = msg.args() || [];\n\n    Promise.all(args.map(a => a.jsonValue().catch(error => {\n        console.warn('Failed to retrieve JSON value from argument:', error);\n        return '';\n    })))\n        .then(args => {\n            // process stdout stub\n            let isStdout = args[0] === 'stdout:';\n            isStdout && (args = args.slice(1));\n\n            let msg = util.format(...args);\n            !isStdout && msg && (msg += '\\n');\n            process.stdout.write(msg);\n        });\n}\n\nfunction prepareUrl(filePath) {\n    if (/^[a-zA-Z]+:\\/\\//.test(filePath)) {\n        // path is URL\n        return filePath;\n    }\n\n    // local path\n    let resolvedPath = path.resolve(filePath);\n    return `file://${resolvedPath}`;\n}\n\nexport function runner({ file, reporter, timeout, width, height, args, executablePath, visible, polling }) {\n    return new Promise(resolve => {\n\n        // validate options\n        if (!file) {\n            throw new Error('Test page path is required.');\n        }\n\n        args = [].concat(args || []).map(arg => '--' + arg);\n        !timeout && (timeout = TIMEOUT_MILLISECONDS);\n        /^\\d+$/.test(polling) && (polling = parseInt(polling));\n\n        const url = prepareUrl(file);\n\n        const options = {\n            ignoreHTTPSErrors: true,\n            headless: !visible,\n            executablePath,\n            args\n        };\n\n        const result = chromium.launch(options)\n            .then(browser => browser.newContext()\n                .then(context => context.newPage()\n                    .then(page => {\n                        if (width || height) {\n                            return page.setViewportSize({ width: width || 800, height: height || 600 }).then(() => page);\n                        }\n                        return page;\n                    })\n                    .then(page => {\n                        page.on('console', handleConsole);\n                        page.on('dialog', dialog => dialog.dismiss());\n                        page.on('pageerror', err => console.error(err));\n\n                        return page.addInitScript(initMocha, reporter)\n                            .then(() => page.goto(url))\n                            .then(() => page.waitForFunction(() => window.__mochaResult__, { timeout, polling }))\n                            .then(() => page.evaluate(() => window.__mochaResult__))\n                            .then(result => {\n                                if (!result) {\n                                    throw new Error('Mocha results not found after waiting. The tests may not have run correctly.');\n                                }\n                                // Close browser before resolving result\n                                return browser.close().then(() => result);\n                            });\n                    })\n                )\n            );\n\n        resolve(result);\n    });\n}\n"
  },
  {
    "path": "packages/less/test/modify-vars.js",
    "content": "import less from '../lib/less-node/index.js';\nimport fs from 'fs';\n\nvar input = fs.readFileSync('./test/less/modifyVars/extended.less', 'utf8');\nvar expectedCss = fs.readFileSync('./test/css/modifyVars/extended.css', 'utf8');\nvar options = {\n    modifyVars: JSON.parse(fs.readFileSync('./test/less/modifyVars/extended.json', 'utf8'))\n};\n\nless.render(input, options, function (err, result) {\n    if (err) {\n        console.log(err);\n    }\n    if (result.css === expectedCss) {\n        console.log('PASS');\n    } else {\n        console.log('FAIL');\n    }\n});\n"
  },
  {
    "path": "packages/less/test/plugins/filemanager/index.cjs",
    "content": "(function(exports) {\n    var plugin = function(less) {\n        var FileManager = less.FileManager, TestFileManager = new FileManager();\n        function TestFileManager() { }\n        TestFileManager.loadFile = function (filename, currentDirectory, options, environment, callback) {\n            if (filename.match(/.*\\.test$/)) {\n                return less.environment.fileManagers[0].loadFile('colors.test', currentDirectory, options, environment, callback);\n            }\n            return less.environment.fileManagers[0].loadFile(filename, currentDirectory, options, environment, callback);\n        };\n\n        return TestFileManager;\n    };\n\n    exports.install = function(less, pluginManager) {\n        less.environment.addFileManager(new plugin(less));\n    };\n\n})(typeof exports === 'undefined' ? this['AddFilePlugin'] = {} : exports);\n"
  },
  {
    "path": "packages/less/test/plugins/postprocess/index.cjs",
    "content": "(function(exports) {\n    var postProcessor = function() {};\n\n    postProcessor.prototype = {\n        process: function (css) {\n            return 'hr {height:50px;}\\n' + css;\n        }\n    };\n\n    exports.install = function(less, pluginManager) {\n        pluginManager.addPostProcessor( new postProcessor());\n    };\n\n})(typeof exports === 'undefined' ? this['postProcessorPlugin'] = {} : exports);\n"
  },
  {
    "path": "packages/less/test/plugins/preprocess/index.cjs",
    "content": "(function(exports) {\n    var preProcessor = function() {};\n\n    preProcessor.prototype = {\n        process : function (src, extra) {\n            var injected = '@color: red;\\n';\n            var ignored = extra.imports.contentsIgnoredChars;\n            var fileInfo = extra.fileInfo;\n            ignored[fileInfo.filename] = ignored[fileInfo.filename] || 0;\n            ignored[fileInfo.filename] += injected.length;\n            return injected + src;\n        }\n    };\n\n    exports.install = function(less, pluginManager) {\n        pluginManager.addPreProcessor( new preProcessor() );\n    };\n\n})(typeof exports === 'undefined' ? this['preProcessorPlugin'] = {} : exports);\n"
  },
  {
    "path": "packages/less/test/plugins/visitor/index.cjs",
    "content": "(function(exports) {\n    var RemoveProperty = function(less) {\n        this._visitor = new less.visitors.Visitor(this);\n    };\n\n    RemoveProperty.prototype = {\n        isReplacing: true,\n        run: function (root) {\n            return this._visitor.visit(root);\n        },\n        visitDeclaration: function (ruleNode, visitArgs) {\n            if (ruleNode.name != '-some-aribitrary-property') {\n                return ruleNode;\n            } else {\n                return [];\n            }\n        }\n    };\n\n    exports.install = function(less, pluginManager) {\n        pluginManager.addVisitor( new RemoveProperty(less));\n    };\n\n})(typeof exports === 'undefined' ? this['VisitorPlugin'] = {} : exports);\n"
  },
  {
    "path": "packages/less/test/sourcemaps/basic.json",
    "content": "{\"version\":3,\"sources\":[\"testweb/sourcemaps/basic.less\",\"testweb/sourcemaps/imported.css\"],\"names\":[],\"mappings\":\"AAMA;EACE,YAAA;EAJA,UAAA;EAWA,iBAAA;EALA,WAAA;EACA,iBAAA;;AAJF,EASE;AATF,EASM;EACF,gBAAA;;AACA,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFA;AAEF,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFA;EAGA,UAAA;;AALN;AAAI;AAUJ;EATE,iBAAA;;AADF,EAEE;AAFE,EAEF;AAFF,EAEM;AAFF,EAEE;AAQN,OARE;AAQF,OARM;EACF,gBAAA;;AACA,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFA;AAEF,EAFF,GAEI,KAFA;AAEF,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFJ;AAEE,EAFF,GAEI,KAFA;AAEF,EAFF,GAEI,KAFA;AAEF,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFA;AAEF,EAFE,GAEA,KAFA;AAEF,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFJ;AAEE,EAFE,GAEA,KAFA;AAEF,EAFE,GAEA,KAFA;AAQN,OARE,GAQF,UARE;AAQF,OARE,GAEI,KAFJ;AAQF,OARE,GAQF,UARM;AAQN,OARE,GAEI,KAFA;AAEF,EAFF,GAQF,UARE;AAEE,EAFF,GAQF,UARM;AAQN,OARM,GAQN,UARE;AAQF,OARM,GAEA,KAFJ;AAQF,OARM,GAQN,UARM;AAQN,OARM,GAEA,KAFA;AAEF,EAFE,GAQN,UARE;AAEE,EAFE,GAQN,UARM;EAGA,UAAA;;AAKN;EACE,WAAA;;ACxBF;AACA;AACA;AACA;AACA;AACA;AACA\",\"file\":\"sourcemaps/basic.css\"}"
  },
  {
    "path": "packages/less/test/sourcemaps/comprehensive.json",
    "content": "{\"version\":3,\"sources\":[\"comprehensive.less\"],\"names\":[],\"mappings\":\"AAoBA;EACE,aAAA;EACA,mBAAA;;AAFF,UAIE;EACE,YAAA;EACA,eAAA;;AANJ,UAIE,QAIE;EACE,iBAAA;EACA,mBAAA;;AAVN,UAcE;EACE,mBAAA;EACA,aAAA;;AAhBJ,UAcE,SAIE;EACE,SAAA;EACA,gBAAA;;AAMN;EACE,OAAO,qBAAP;EACA,QAAQ,iBAAR;EACA,YAAA;;AAIF;EACE,cAAA;EACA,mBAAA;EACA,yCAAA;;AAIF;EAlDE,mBAAA;EACA,2BAAA;EACA,wBAAA;EAIA,yCAAA;EA+CA,aAAA;EACA,iBAAA;;AAIF,QAA0B;EACxB;IACE,aAAA;;EADF,UAGE;IACE,eAAA;;;AAKN;EACE;IACE,aAAA;IACA,uBAAuB,cAAvB;IACA,SAAA;;;AAKJ;AAMA;EALE,kBAAA;EACA,YAAA;EACA,eAAA;;AAGF;EAEE,mBAAA;EACA,YAAA;;AAIF,WACE;EACE,gBAAA;;AAFJ,WACE,GAGE;EACE,qBAAA;;AALN,WACE,GAGE,GAGE;EACE,qBAAA;;AAEA,WATN,GAGE,GAGE,EAGG;EACC,cAAA;;AAGF,WAbN,GAGE,GAGE,EAOG;EACC,cAAA;;AAYT;EACC,cAAA;;AAIF,OACE,QACE,QACE;EACE,cAAA\",\"file\":\"comprehensive.css\"}"
  },
  {
    "path": "packages/less/test/sourcemaps/custom-props.json",
    "content": "{\"version\":3,\"sources\":[\"testweb/sourcemaps/custom-props.less\"],\"names\":[],\"mappings\":\"AAEA;EACC,uBAHO,UAGP;EACA,OAAO,eAAP;EACA,sBALO,UAKP\",\"file\":\"sourcemaps/custom-props.css\"}"
  },
  {
    "path": "packages/less/test/sourcemaps/index.html",
    "content": "<html>\n   <link type=\"text/css\" rel=\"stylesheet\" media=\"all\" href=\"import.css\">\n   <link type=\"text/css\" rel=\"stylesheet\" media=\"all\" href=\"basic.css\">\n<head>\n</head>\n<body>\n<div id=\"import-test\">id import-test</div>\n<div id=\"import\">id import-test</div>\n<div class=\"imported inline\">class imported inline</div>\n<div id=\"mixin\">class mixin</div>\n<div class=\"a\">class a</div>\n<div class=\"b\">class b</div>\n<div class=\"b\">class b<div class=\"c\">class c</div></div>\n<div class=\"a\">class a<div class=\"d\">class d</div></div>\n<div class=\"extend\">class extend<div class=\"c\">class c</div></div>\n</body>\n</html>"
  },
  {
    "path": "packages/less/test/sourcemaps/sourcemaps-basepath.json",
    "content": "{\"version\":3,\"sources\":[\"testweb/sourcemaps-basepath.less\"],\"names\":[],\"mappings\":\"AAEA;EACE,eAAA;EACA,gBAAA;;AAGF;EACE,iBAAA\",\"file\":\"tests-config/sourcemaps-basepath/sourcemaps-basepath.css\"}"
  },
  {
    "path": "packages/less/test/sourcemaps/sourcemaps-include-source.json",
    "content": "{\"version\":3,\"sources\":[\"testweb/sourcemaps-include-source.less\"],\"names\":[],\"mappings\":\"AAGA;EACE,mBAAA;EACA,YAAA;EACA,kBAAA;;AAGF;EACE,mBAAA\",\"file\":\"tests-config/sourcemaps-include-source/sourcemaps-include-source.css\",\"sourcesContent\":[\"@primary: #007bff;\\n@secondary: #6c757d;\\n\\n.button {\\n  background: @primary;\\n  color: white;\\n  padding: 10px 20px;\\n}\\n\\n.secondary {\\n  background: @secondary;\\n}\\n\\n\"]}"
  },
  {
    "path": "packages/less/test/sourcemaps/sourcemaps-rootpath.json",
    "content": "{\"version\":3,\"sources\":[\"https://example.com/less/sourcemaps-rootpath.less\"],\"names\":[],\"mappings\":\"AAEA;EACE,aAAA;EACA,YAAA;;AAGF;EACE,WAAA\",\"file\":\"tests-config/sourcemaps-rootpath/sourcemaps-rootpath.css\"}"
  },
  {
    "path": "packages/less/test/sourcemaps/sourcemaps-url.json",
    "content": "{\"version\":3,\"sources\":[\"testweb/sourcemaps-url.less\"],\"names\":[],\"mappings\":\"AAEA;EACE,UAAA;EACA,gBAAA;;AAGF;EACE,YAAA\",\"file\":\"tests-config/sourcemaps-url/sourcemaps-url.css\"}"
  },
  {
    "path": "packages/less/test/sourcemaps-disable-annotation/basic.json",
    "content": "{\"version\":3,\"sources\":[\"testweb/sourcemaps-disable-annotation/basic.less\"],\"names\":[],\"mappings\":\"AAAA;;EAEE,YAAA\",\"file\":\"sourcemaps-disable-annotation/basic.css\"}"
  },
  {
    "path": "packages/less/test/sourcemaps-variable-selector/basic.json",
    "content": "{\"version\":3,\"sources\":[\"testweb/sourcemaps-variable-selector/basic.less\"],\"names\":[],\"mappings\":\"AAEC;EACG,eAAA\",\"file\":\"sourcemaps-variable-selector/basic.css\"}"
  },
  {
    "path": "packages/less/test/test-cjs-suite.cjs",
    "content": "/**\n * CJS build test — runs a subset of tests using dist/less-node.cjs.\n * Run in addition to the main ESM test suite to verify the CJS build.\n */\n'use strict';\n\nconst path = require('path');\nconst fs = require('fs');\n\nconsole.log('Testing CJS build (dist/less-node.cjs)...\\n');\n\nconst less = require('../dist/less-node.cjs');\nconst testFolder = path.dirname(require.resolve('@less/test-data'));\n\nfunction runTest(name, lessFile, expectedCss) {\n  const fullPath = path.join(testFolder, lessFile);\n  const content = fs.readFileSync(fullPath, 'utf8');\n  return less.render(content, { filename: fullPath })\n    .then(function (result) {\n      const actual = result.css.trim();\n      const expected = (expectedCss || '').trim();\n      if (expected && actual !== expected) {\n        console.error('FAIL', name, '- output mismatch');\n        process.exit(1);\n      }\n      console.log('  ✓', name);\n    })\n    .catch(function (err) {\n      console.error('FAIL', name, err.message);\n      process.exit(1);\n    });\n}\n\nPromise.all([\n  runTest('variables', 'tests-unit/variables/variables.less'),\n  runTest('mixins', 'tests-unit/mixins/mixins.less'),\n  runTest('operations', 'tests-unit/operations/operations.less'),\n  runTest('import', 'tests-unit/import/import.less')\n])\n  .then(function () {\n    console.log('\\nCJS build tests passed.');\n  })\n  .catch(function (err) {\n    console.error(err);\n    process.exit(1);\n  });\n"
  },
  {
    "path": "packages/less/test/test-cjs.cjs",
    "content": "// Replicates: \"const less = require('less')\" — how users report importing (Node, Webpack CJS)\nconsole.log(\"Testing: require('less')...\");\n\nconst less = require('less');\n\n// Verify it's not a thenable (shouldn't be awaited accidentally)\nif (typeof less.then === 'function') {\n    console.error('CJS test FAILED: exports should not be thenable');\n    process.exit(1);\n}\n\n// Test 1: Promise-based render\nless.render('.class { width: (1 + 1) }')\n    .then(function(output) {\n        if (!output.css.includes('width: 2')) {\n            console.error('CJS render test FAILED:', output.css);\n            process.exit(1);\n        }\n        console.log('CJS render test PASSED');\n\n        // Test 2: Callback-based render\n        less.render('.cb { color: red }', function(err, output) {\n            if (err) {\n                console.error('CJS callback test FAILED:', err);\n                process.exit(1);\n            }\n            if (!output.css.includes('color: red')) {\n                console.error('CJS callback test FAILED:', output.css);\n                process.exit(1);\n            }\n            console.log('CJS callback test PASSED');\n\n            // Test 3: Property access (version) — available after load\n            const version = less.version;\n            if (!Array.isArray(version) || version.length !== 3) {\n                console.error('CJS version test FAILED:', version);\n                process.exit(1);\n            }\n            console.log('CJS version test PASSED:', version.join('.'));\n        });\n    })\n    .catch(function(err) {\n        console.error('CJS test FAILED:', err);\n        process.exit(1);\n    });\n"
  },
  {
    "path": "packages/less/test/test-es6.js",
    "content": "// https://github.com/less/less.js/issues/3533\n// Replicates: \"import less from 'less'\" — ESM import\nconsole.log(\"Testing: import less from 'less'...\");\n\nimport less from 'less';\n\n// Test 1: Promise-based API (await)\nconst output = await less.render('.class { width: (1 + 1) }');\nif (output.css.includes('width: 2')) {\n    console.log('Promise/await test PASSED');\n} else {\n    console.error('Promise/await test FAILED:', output.css);\n    process.exit(1);\n}\n\n// Test 2: Callback-based API\nless.render(`\nbody {\n    a: 1;\n    b: 2;\n    c: 30;\n    d: 4;\n}`, {sourceMap: {}},  function(error, output) {\n    if (error) {\n        console.error('Callback test FAILED:', error);\n        process.exit(1);\n    }\n    console.log('Callback test PASSED');\n})\n"
  },
  {
    "path": "packages/less/test.less",
    "content": ".test { color: red; }\n"
  },
  {
    "path": "packages/less/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"ES2022\",\n    \"moduleResolution\": \"node\",\n    \"allowJs\": true,\n    \"checkJs\": false,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"noImplicitAny\": true,\n    \"strict\": false,\n    \"skipLibCheck\": true,\n    \"rootDir\": \".\"\n  },\n  \"include\": [\"lib/**/*\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "packages/test-data/data/page.html",
    "content": "<html><h1>This page is 100% Awesome.</h1></html>\n"
  },
  {
    "path": "packages/test-data/index.js",
    "content": "// only needed for require.resolve"
  },
  {
    "path": "packages/test-data/package.json",
    "content": "{\n\t\"name\": \"@less/test-data\",\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t},\n\t\"version\": \"4.6.3\",\n\t\"description\": \"Less files and CSS results\",\n\t\"author\": \"Alexis Sellier <self@cloudhead.net>\",\n\t\"contributors\": [\n\t\t\"The Core Less Team\"\n\t],\n\t\"license\": \"Apache-2.0\",\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/less/less.js.git\",\n\t\t\"directory\": \"packages/test-data\"\n\t},\n\t\"gitHead\": \"1df9072ee9ebdadc791bf35dfb1dbc3ef9f1948f\"\n}\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-collection.js",
    "content": "var collection = [];\n\nfunctions.add('store', function(val) {\n    collection.push(val);  // imma store this for later\n    return false;\n});\nfunctions.add('list', function() {\n    return less.value(collection);\n});"
  },
  {
    "path": "packages/test-data/plugin/plugin-global.js",
    "content": "\nfunctions.addMultiple({\n    'test-shadow' : function() {\n        return new tree.Anonymous( 'global' );\n    },\n    'test-global' : function() {\n        return new tree.Anonymous( 'global' );\n    }\n});\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-local.js",
    "content": "functions.addMultiple({\n    'test-shadow' : function() {\n        return new tree.Anonymous( 'local' );\n    },\n    'test-local' : function() {\n        return new tree.Anonymous( 'local' );\n    }\n});\n\nregisterPlugin({\n    setOptions: function(opts) {\n        // do nothing\n    }\n});\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-preeval.js",
    "content": "module.exports = {\n    install({ tree: { Quoted }, visitors }, manager) {\n        class Visitor {\n            constructor() {\n                this.native = new visitors.Visitor(this);\n\n                this.isPreEvalVisitor = true;\n                this.isReplacing = true;\n            }\n\n            run(root) {\n                return this.native.visit(root);\n            }\n\n            visitVariable(node) {\n                if (node.name === '@replace') {\n                    return new Quoted(`'`, 'bar', true);\n                }\n                return node;\n            }\n        }\n\n        manager.addVisitor(new Visitor());\n        // console.log(manager);\n    },\n    minVersion: [2,0,0]\n};\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-scope1.js",
    "content": "functions.add('foo', function() {\n    return 'foo';\n});"
  },
  {
    "path": "packages/test-data/plugin/plugin-scope2.js",
    "content": "functions.add('foo', function() {\n    return 'bar';\n});"
  },
  {
    "path": "packages/test-data/plugin/plugin-set-options-v2.js",
    "content": "var optionsStack = [\n    'option1',\n    undefined,\n    'option2',\n    undefined,\n    'option3'\n];\n\nvar optionsWereSet = false;\nvar options, error;\n\nregisterPlugin({\n    install: function(less, pluginManager, functions) {\n        if (!optionsWereSet) {\n            error = 'setOptions() not called before install';\n        }\n    },\n    use: function() {\n        var pos = optionsStack.indexOf(options);\n\n        if (pos === -1) {\n            error = 'setOptions() not setting option \"' + opt + '\" correctly';\n        }\n        if (error) {\n            throw new Error(error);\n        }\n    },\n    setOptions: function(opts) {\n        optionsWereSet = true;\n        options = opts;\n    },\n    minVersion: [2,0,0]\n});\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-set-options-v3.js",
    "content": "var optionsStack = [\n    'option1',\n    undefined,\n    'option2',\n    undefined,\n    'option3'\n];\n\nvar options, error;\n\nregisterPlugin({\n    install: function(less, pluginManager, functions) {\n        if (options) {\n            error = 'setOptions() called before install';\n        }\n    },\n    use: function() {\n        var pos = optionsStack.indexOf(options);\n\n        if (pos === -1) {\n            error = 'setOptions() not setting option \"' + opt + '\" correctly';\n        }\n        if (error) {\n            throw new Error(error);\n        }\n    },\n    setOptions: function(opts) {\n        options = opts;\n    },\n    minVersion: [3,0,0]\n});\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-set-options.js",
    "content": "var optionsStack = [\n    'option1',\n    undefined,\n    'option2',\n    undefined,\n    'option3'\n];\n\nvar optionsWereSet = false;\nvar options, error;\n\nregisterPlugin({\n    install: function(less, pluginManager, functions) {\n        if (!optionsWereSet) {\n            error = 'setOptions() not called before install';\n        }\n    },\n    use: function() {\n        var pos = optionsStack.indexOf(options);\n\n        if (pos === -1) {\n            error = 'setOptions() not setting option \"' + opt + '\" correctly';\n        }\n        if (error) {\n            throw new Error(error);\n        }\n    },\n    setOptions: function(opts) {\n        optionsWereSet = true;\n        options = opts;\n    }\n});\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-simple.js",
    "content": "functions.add('pi-anon', function() {\n    return Math.PI;\n});\n\nfunctions.add('pi', function() {\n    return less.dimension(Math.PI);\n});"
  },
  {
    "path": "packages/test-data/plugin/plugin-transitive.js",
    "content": "functions.addMultiple({\n    'test-transitive' : function() {\n        var anon = new tree.Anonymous( 'transitive' );\n        return anon;\n    }\n});\n"
  },
  {
    "path": "packages/test-data/plugin/plugin-transitive.less",
    "content": "@plugin \"plugin-transitive\";\n\n.other {\n  trans : test-transitive();\n}"
  },
  {
    "path": "packages/test-data/plugin/plugin-tree-nodes.js",
    "content": "functions.addMultiple({\n\n    'test-comment': function() {\n        return less.combinator(' ');\n    },\n    'test-atrule': function(arg1, arg2) {\n        return less.atrule(arg1.value, arg2.value);\n    },\n    'test-extend': function() {\n        // TODO\n    },\n    'test-import': function() {\n        // TODO\n    },\n    'test-media': function() {\n        // TODO\n    },\n    'test-mixin-call': function() {\n        // TODO\n    },\n    'test-mixin-definition': function() {\n        // TODO\n    },\n    'test-ruleset-call': function() {\n        return less.combinator(' ');\n    },\n    // Functions must return something, even if it's false/true\n    'test-undefined': function() { \n        return;\n    },\n    'test-collapse': function() { \n        return true;\n    },\n    // These cause root errors\n    'test-assignment': function() {\n        return less.assignment('bird', 'robin');\n    },\n    'test-attribute': function() {\n        return less.attribute('foo', '=', 'bar');\n    },\n    'test-call': function() {\n        return less.call('foo');\n    },\n    'test-color': function() {\n        return less.color([50, 50, 50]);\n    },\n    'test-condition': function() {\n        return less.condition('<', less.value([0]), less.value([1]));\n    },\n    'test-detached-ruleset' : function() {\n        var decl = less.declaration('prop', 'value');\n        return less.detachedruleset(less.ruleset('', [ decl ]));\n    },\n    'test-dimension': function() {\n        return less.dimension(1, 'px');\n    },\n    'test-element': function() {\n        return less.element('+', 'a');\n    },\n    'test-expression': function() {\n        return less.expression([1, 2, 3]);\n    },\n    'test-keyword': function() {\n        return less.keyword('foo');\n    },\n    'test-operation': function() {\n        return less.operation('+', [1, 2]);\n    },\n    'test-quoted': function() {\n        return less.quoted('\"', 'foo');\n    },\n    'test-selector': function() {\n        var sel = less.selector('.a.b');\n        return sel;\n    },\n    'test-url': function() {\n        return less.url('http://google.com');\n    },\n    'test-value': function() {\n        return less.value([1]);\n    }\n});"
  },
  {
    "path": "packages/test-data/tests-config/3rd-party/bootstrap4.css",
    "content": "/*!\n * Bootstrap v4.1.1 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #6c757d;\n  --gray-dark: #343a40;\n  --primary: #007bff;\n  --secondary: #6c757d;\n  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n  -ms-overflow-style: scrollbar;\n  -webkit-tap-highlight-color: transparent;\n}\n@-ms-viewport {\n  width: device-width;\n}\narticle,\naside,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection {\n  display: block;\n}\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n}\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\ndt {\n  font-weight: 700;\n}\ndd {\n  margin-bottom: 0.5rem;\n  margin-left: 0;\n}\nblockquote {\n  margin: 0 0 1rem;\n}\ndfn {\n  font-style: italic;\n}\nb,\nstrong {\n  font-weight: bolder;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsub {\n  bottom: -0.25em;\n}\nsup {\n  top: -0.5em;\n}\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n  -webkit-text-decoration-skip: objects;\n}\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\na:not([href]):not([tabindex]):hover,\na:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  -ms-overflow-style: scrollbar;\n}\nfigure {\n  margin: 0 0 1rem;\n}\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\ntable {\n  border-collapse: collapse;\n}\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\nth {\n  text-align: inherit;\n}\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\nbutton {\n  border-radius: 0;\n}\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\nbutton,\ninput {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\nprogress {\n  vertical-align: baseline;\n}\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\noutput {\n  display: inline-block;\n}\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\ntemplate {\n  display: none;\n}\n[hidden] {\n  display: none !important;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  margin-bottom: 0.5rem;\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.2;\n  color: inherit;\n}\nh1,\n.h1 {\n  font-size: 2.5rem;\n}\nh2,\n.h2 {\n  font-size: 2rem;\n}\nh3,\n.h3 {\n  font-size: 1.75rem;\n}\nh4,\n.h4 {\n  font-size: 1.5rem;\n}\nh5,\n.h5 {\n  font-size: 1.25rem;\n}\nh6,\n.h6 {\n  font-size: 1rem;\n}\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline-item {\n  display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #6c757d;\n}\n.blockquote-footer::before {\n  content: \"\\2014 \\00A0\";\n}\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n.figure {\n  display: inline-block;\n}\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n.figure-caption {\n  font-size: 90%;\n  color: #6c757d;\n}\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\na > code {\n  color: inherit;\n}\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n.row {\n  display: flex;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n.grid-column,\n.col-1,\n.col-2,\n.col-3,\n.col-4,\n.col-5,\n.col-6,\n.col-7,\n.col-8,\n.col-9,\n.col-10,\n.col-11,\n.col-12,\n.col,\n.col-auto,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-sm,\n.col-sm-auto,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-md,\n.col-md-auto,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12,\n.col-lg,\n.col-lg-auto,\n.col-xl-1,\n.col-xl-2,\n.col-xl-3,\n.col-xl-4,\n.col-xl-5,\n.col-xl-6,\n.col-xl-7,\n.col-xl-8,\n.col-xl-9,\n.col-xl-10,\n.col-xl-11,\n.col-xl-12,\n.col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n.col {\n  flex-basis: 0;\n  flex-grow: 1;\n  max-width: 100%;\n}\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n  max-width: none;\n}\n.col-1 {\n  flex: 0 0 8.33333333%;\n  max-width: 8.33333333%;\n}\n.col-2 {\n  flex: 0 0 16.66666667%;\n  max-width: 16.66666667%;\n}\n.col-3 {\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n.col-4 {\n  flex: 0 0 33.33333333%;\n  max-width: 33.33333333%;\n}\n.col-5 {\n  flex: 0 0 41.66666667%;\n  max-width: 41.66666667%;\n}\n.col-6 {\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n.col-7 {\n  flex: 0 0 58.33333333%;\n  max-width: 58.33333333%;\n}\n.col-8 {\n  flex: 0 0 66.66666667%;\n  max-width: 66.66666667%;\n}\n.col-9 {\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n.col-10 {\n  flex: 0 0 83.33333333%;\n  max-width: 83.33333333%;\n}\n.col-11 {\n  flex: 0 0 91.66666667%;\n  max-width: 91.66666667%;\n}\n.col-12 {\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n.order-first {\n  order: -1;\n}\n.order-last {\n  order: 13;\n}\n.order-0 {\n  order: 0;\n}\n.order-1 {\n  order: 1;\n}\n.order-2 {\n  order: 2;\n}\n.order-3 {\n  order: 3;\n}\n.order-4 {\n  order: 4;\n}\n.order-5 {\n  order: 5;\n}\n.order-6 {\n  order: 6;\n}\n.order-7 {\n  order: 7;\n}\n.order-8 {\n  order: 8;\n}\n.order-9 {\n  order: 9;\n}\n.order-10 {\n  order: 10;\n}\n.order-11 {\n  order: 11;\n}\n.order-12 {\n  order: 12;\n}\n.offset-1 {\n  margin-left: 8.33333333%;\n}\n.offset-2 {\n  margin-left: 16.66666667%;\n}\n.offset-3 {\n  margin-left: 25%;\n}\n.offset-4 {\n  margin-left: 33.33333333%;\n}\n.offset-5 {\n  margin-left: 41.66666667%;\n}\n.offset-6 {\n  margin-left: 50%;\n}\n.offset-7 {\n  margin-left: 58.33333333%;\n}\n.offset-8 {\n  margin-left: 66.66666667%;\n}\n.offset-9 {\n  margin-left: 75%;\n}\n.offset-10 {\n  margin-left: 83.33333333%;\n}\n.offset-11 {\n  margin-left: 91.66666667%;\n}\n@media (min-width: 576px) {\n  .col-sm {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-sm-1 {\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .col-sm-2 {\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .col-sm-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .col-sm-5 {\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .col-sm-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .col-sm-8 {\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .col-sm-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .col-sm-11 {\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .col-sm-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    order: -1;\n  }\n  .order-sm-last {\n    order: 13;\n  }\n  .order-sm-0 {\n    order: 0;\n  }\n  .order-sm-1 {\n    order: 1;\n  }\n  .order-sm-2 {\n    order: 2;\n  }\n  .order-sm-3 {\n    order: 3;\n  }\n  .order-sm-4 {\n    order: 4;\n  }\n  .order-sm-5 {\n    order: 5;\n  }\n  .order-sm-6 {\n    order: 6;\n  }\n  .order-sm-7 {\n    order: 7;\n  }\n  .order-sm-8 {\n    order: 8;\n  }\n  .order-sm-9 {\n    order: 9;\n  }\n  .order-sm-10 {\n    order: 10;\n  }\n  .order-sm-11 {\n    order: 11;\n  }\n  .order-sm-12 {\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.66666667%;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-md-1 {\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .col-md-2 {\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .col-md-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .col-md-5 {\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .col-md-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .col-md-8 {\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .col-md-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .col-md-11 {\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .col-md-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    order: -1;\n  }\n  .order-md-last {\n    order: 13;\n  }\n  .order-md-0 {\n    order: 0;\n  }\n  .order-md-1 {\n    order: 1;\n  }\n  .order-md-2 {\n    order: 2;\n  }\n  .order-md-3 {\n    order: 3;\n  }\n  .order-md-4 {\n    order: 4;\n  }\n  .order-md-5 {\n    order: 5;\n  }\n  .order-md-6 {\n    order: 6;\n  }\n  .order-md-7 {\n    order: 7;\n  }\n  .order-md-8 {\n    order: 8;\n  }\n  .order-md-9 {\n    order: 9;\n  }\n  .order-md-10 {\n    order: 10;\n  }\n  .order-md-11 {\n    order: 11;\n  }\n  .order-md-12 {\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.66666667%;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-lg-1 {\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .col-lg-2 {\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .col-lg-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .col-lg-5 {\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .col-lg-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .col-lg-8 {\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .col-lg-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .col-lg-11 {\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .col-lg-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    order: -1;\n  }\n  .order-lg-last {\n    order: 13;\n  }\n  .order-lg-0 {\n    order: 0;\n  }\n  .order-lg-1 {\n    order: 1;\n  }\n  .order-lg-2 {\n    order: 2;\n  }\n  .order-lg-3 {\n    order: 3;\n  }\n  .order-lg-4 {\n    order: 4;\n  }\n  .order-lg-5 {\n    order: 5;\n  }\n  .order-lg-6 {\n    order: 6;\n  }\n  .order-lg-7 {\n    order: 7;\n  }\n  .order-lg-8 {\n    order: 8;\n  }\n  .order-lg-9 {\n    order: 9;\n  }\n  .order-lg-10 {\n    order: 10;\n  }\n  .order-lg-11 {\n    order: 11;\n  }\n  .order-lg-12 {\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.66666667%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex-basis: 0;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n    max-width: none;\n  }\n  .col-xl-1 {\n    flex: 0 0 8.33333333%;\n    max-width: 8.33333333%;\n  }\n  .col-xl-2 {\n    flex: 0 0 16.66666667%;\n    max-width: 16.66666667%;\n  }\n  .col-xl-3 {\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    flex: 0 0 33.33333333%;\n    max-width: 33.33333333%;\n  }\n  .col-xl-5 {\n    flex: 0 0 41.66666667%;\n    max-width: 41.66666667%;\n  }\n  .col-xl-6 {\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    flex: 0 0 58.33333333%;\n    max-width: 58.33333333%;\n  }\n  .col-xl-8 {\n    flex: 0 0 66.66666667%;\n    max-width: 66.66666667%;\n  }\n  .col-xl-9 {\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    flex: 0 0 83.33333333%;\n    max-width: 83.33333333%;\n  }\n  .col-xl-11 {\n    flex: 0 0 91.66666667%;\n    max-width: 91.66666667%;\n  }\n  .col-xl-12 {\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    order: -1;\n  }\n  .order-xl-last {\n    order: 13;\n  }\n  .order-xl-0 {\n    order: 0;\n  }\n  .order-xl-1 {\n    order: 1;\n  }\n  .order-xl-2 {\n    order: 2;\n  }\n  .order-xl-3 {\n    order: 3;\n  }\n  .order-xl-4 {\n    order: 4;\n  }\n  .order-xl-5 {\n    order: 5;\n  }\n  .order-xl-6 {\n    order: 6;\n  }\n  .order-xl-7 {\n    order: 7;\n  }\n  .order-xl-8 {\n    order: 8;\n  }\n  .order-xl-9 {\n    order: 9;\n  }\n  .order-xl-10 {\n    order: 10;\n  }\n  .order-xl-11 {\n    order: 11;\n  }\n  .order-xl-12 {\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.33333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.66666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.33333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.66666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.33333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.66666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.33333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.66666667%;\n  }\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 1rem;\n  background-color: transparent;\n}\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n.table-hover tbody tr:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #d6d8db;\n}\n.table-hover .table-secondary:hover {\n  background-color: #c8cbcf;\n}\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #c8cbcf;\n}\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n.table-hover .table-light:hover {\n  background-color: #ececf5;\n}\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf5;\n}\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n.table .thead-dark th {\n  color: #fff;\n  background-color: #212529;\n  border-color: #32383e;\n}\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n.table-dark {\n  color: #fff;\n  background-color: #212529;\n}\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #32383e;\n}\n.table-dark.table-bordered {\n  border: 0;\n}\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n.table-dark.table-hover tbody tr:hover {\n  background-color: rgba(255, 255, 255, 0.075);\n}\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n  -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n.table-responsive > .table-bordered {\n  border: 0;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media screen and (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n.form-control:disabled,\n.form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\nselect.form-control:not([size]):not([multiple]) {\n  height: calc(2.25rem + 2px);\n}\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n.form-control-plaintext.form-control-sm,\n.form-control-plaintext.form-control-lg,\n.input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-sm > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-sm > .input-group-append > .form-control-plaintext.btn,\n.input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-append > .form-control-plaintext.input-group-text,\n.input-group-lg > .input-group-prepend > .form-control-plaintext.btn,\n.input-group-lg > .input-group-append > .form-control-plaintext.btn {\n  padding-right: 0;\n  padding-left: 0;\n}\n.form-control-sm,\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\nselect.form-control-sm:not([size]):not([multiple]),\n.input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-sm > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-sm > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(1.8125rem + 2px);\n}\n.form-control-lg,\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\nselect.form-control-lg:not([size]):not([multiple]),\n.input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.input-group-text:not([size]):not([multiple]),\n.input-group-lg > .input-group-prepend > select.btn:not([size]):not([multiple]),\n.input-group-lg > .input-group-append > select.btn:not([size]):not([multiple]) {\n  height: calc(2.875rem + 2px);\n}\n.form-group {\n  margin-bottom: 1rem;\n}\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n.form-row {\n  display: flex;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n.form-check-input:disabled ~ .form-check-label {\n  color: #6c757d;\n}\n.form-check-label {\n  margin-bottom: 0;\n}\n.form-check-inline {\n  display: inline-flex;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  line-height: 1;\n  color: #fff;\n  background-color: rgba(40, 167, 69, 0.8);\n  border-radius: 0.2rem;\n}\n.was-validated .form-control:valid,\n.was-validated .custom-select:valid,\n.form-control.is-valid,\n.custom-select.is-valid {\n  border-color: #28a745;\n}\n.was-validated .form-control:valid:focus,\n.was-validated .custom-select:valid:focus,\n.form-control.is-valid:focus,\n.custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip,\n.was-validated .custom-select:valid ~ .valid-tooltip,\n.form-control.is-valid ~ .valid-tooltip,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip,\n.form-control-file.is-valid ~ .valid-tooltip {\n  display: block;\n}\n.was-validated .form-check-input:valid ~ .form-check-label,\n.form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n.was-validated .custom-control-input:valid ~ .custom-control-label,\n.custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n.was-validated .custom-control-input:valid ~ .custom-control-label::before,\n.custom-control-input.is-valid ~ .custom-control-label::before {\n  background-color: #71dd8a;\n}\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,\n.custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  background-color: #34ce57;\n}\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,\n.custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n.was-validated .custom-file-input:valid ~ .custom-file-label,\n.custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n.was-validated .custom-file-input:valid ~ .custom-file-label::before,\n.custom-file-input.is-valid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label,\n.custom-file-input.is-valid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  line-height: 1;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.8);\n  border-radius: 0.2rem;\n}\n.was-validated .form-control:invalid,\n.was-validated .custom-select:invalid,\n.form-control.is-invalid,\n.custom-select.is-invalid {\n  border-color: #dc3545;\n}\n.was-validated .form-control:invalid:focus,\n.was-validated .custom-select:invalid:focus,\n.form-control.is-invalid:focus,\n.custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip,\n.was-validated .custom-select:invalid ~ .invalid-tooltip,\n.form-control.is-invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n.was-validated .form-check-input:invalid ~ .form-check-label,\n.form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n.was-validated .custom-control-input:invalid ~ .custom-control-label,\n.custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before,\n.custom-control-input.is-invalid ~ .custom-control-label::before {\n  background-color: #efa2a9;\n}\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,\n.custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  background-color: #e4606d;\n}\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,\n.custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .custom-file-input:invalid ~ .custom-file-label,\n.custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n.was-validated .custom-file-input:invalid ~ .custom-file-label::before,\n.custom-file-input.is-invalid ~ .custom-file-label::before {\n  border-color: inherit;\n}\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,\n.custom-file-input.is-invalid:focus ~ .custom-file-label {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n.form-inline {\n  display: flex;\n  flex-flow: row wrap;\n  align-items: center;\n}\n.form-inline .form-check {\n  width: 100%;\n}\n@media (min-width: 576px) {\n  .form-inline label {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: flex;\n    flex: 0 0 auto;\n    flex-flow: row wrap;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    align-items: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  user-select: none;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media screen and (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n.btn:hover,\n.btn:focus {\n  text-decoration: none;\n}\n.btn:focus,\n.btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.btn.disabled,\n.btn:disabled {\n  opacity: 0.65;\n}\n.btn:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n.btn:not(:disabled):not(.disabled):active,\n.btn:not(:disabled):not(.disabled).active {\n  background-image: none;\n}\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n.btn-primary.disabled,\n.btn-primary:disabled {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n.btn-primary:not(:disabled):not(.disabled):active,\n.btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n.btn-primary:not(:disabled):not(.disabled):active:focus,\n.btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5a6268;\n  border-color: #545b62;\n}\n.btn-secondary:focus,\n.btn-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n.btn-secondary.disabled,\n.btn-secondary:disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-secondary:not(:disabled):not(.disabled):active,\n.btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #545b62;\n  border-color: #4e555b;\n}\n.btn-secondary:not(:disabled):not(.disabled):active:focus,\n.btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n.btn-success {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n.btn-success:focus,\n.btn-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n.btn-success.disabled,\n.btn-success:disabled {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n.btn-success:not(:disabled):not(.disabled):active,\n.btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n.btn-success:not(:disabled):not(.disabled):active:focus,\n.btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n.btn-info:focus,\n.btn-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n.btn-info.disabled,\n.btn-info:disabled {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n.btn-info:not(:disabled):not(.disabled):active,\n.btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n.btn-info:not(:disabled):not(.disabled):active:focus,\n.btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n.btn-warning {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-warning:hover {\n  color: #212529;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n.btn-warning.disabled,\n.btn-warning:disabled {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-warning:not(:disabled):not(.disabled):active,\n.btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n.btn-warning:not(:disabled):not(.disabled):active:focus,\n.btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n.btn-danger.disabled,\n.btn-danger:disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-danger:not(:disabled):not(.disabled):active,\n.btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n.btn-danger:not(:disabled):not(.disabled):active:focus,\n.btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n.btn-light:focus,\n.btn-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n.btn-light.disabled,\n.btn-light:disabled {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-light:not(:disabled):not(.disabled):active,\n.btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n.btn-light:not(:disabled):not(.disabled):active:focus,\n.btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n.btn-dark:focus,\n.btn-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n.btn-dark.disabled,\n.btn-dark:disabled {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n.btn-dark:not(:disabled):not(.disabled):active,\n.btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n.btn-dark:not(:disabled):not(.disabled):active:focus,\n.btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n.btn-outline-primary {\n  color: #007bff;\n  background-color: transparent;\n  background-image: none;\n  border-color: #007bff;\n}\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n.btn-outline-primary:focus,\n.btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n.btn-outline-primary.disabled,\n.btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n.btn-outline-primary:not(:disabled):not(.disabled):active,\n.btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus,\n.btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n.btn-outline-secondary {\n  color: #6c757d;\n  background-color: transparent;\n  background-image: none;\n  border-color: #6c757d;\n}\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-outline-secondary:focus,\n.btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-secondary.disabled,\n.btn-outline-secondary:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n.btn-outline-secondary:not(:disabled):not(.disabled):active,\n.btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,\n.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-success {\n  color: #28a745;\n  background-color: transparent;\n  background-image: none;\n  border-color: #28a745;\n}\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n.btn-outline-success:focus,\n.btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n.btn-outline-success.disabled,\n.btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n.btn-outline-success:not(:disabled):not(.disabled):active,\n.btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n.btn-outline-success:not(:disabled):not(.disabled):active:focus,\n.btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n.btn-outline-info {\n  color: #17a2b8;\n  background-color: transparent;\n  background-image: none;\n  border-color: #17a2b8;\n}\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n.btn-outline-info:focus,\n.btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n.btn-outline-info.disabled,\n.btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n.btn-outline-info:not(:disabled):not(.disabled):active,\n.btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n.btn-outline-info:not(:disabled):not(.disabled):active:focus,\n.btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n.btn-outline-warning {\n  color: #ffc107;\n  background-color: transparent;\n  background-image: none;\n  border-color: #ffc107;\n}\n.btn-outline-warning:hover {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-outline-warning:focus,\n.btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-warning.disabled,\n.btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n.btn-outline-warning:not(:disabled):not(.disabled):active,\n.btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus,\n.btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-danger {\n  color: #dc3545;\n  background-color: transparent;\n  background-image: none;\n  border-color: #dc3545;\n}\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-outline-danger:focus,\n.btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-danger.disabled,\n.btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n.btn-outline-danger:not(:disabled):not(.disabled):active,\n.btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus,\n.btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-light {\n  color: #f8f9fa;\n  background-color: transparent;\n  background-image: none;\n  border-color: #f8f9fa;\n}\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-outline-light:focus,\n.btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-light.disabled,\n.btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n.btn-outline-light:not(:disabled):not(.disabled):active,\n.btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-outline-light:not(:disabled):not(.disabled):active:focus,\n.btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-dark {\n  color: #343a40;\n  background-color: transparent;\n  background-image: none;\n  border-color: #343a40;\n}\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n.btn-outline-dark:focus,\n.btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n.btn-outline-dark.disabled,\n.btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n.btn-outline-dark:not(:disabled):not(.disabled):active,\n.btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus,\n.btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  background-color: transparent;\n}\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: underline;\n  background-color: transparent;\n  border-color: transparent;\n}\n.btn-link:focus,\n.btn-link.focus {\n  text-decoration: underline;\n  border-color: transparent;\n  box-shadow: none;\n}\n.btn-link:disabled,\n.btn-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  transition: opacity 0.15s linear;\n}\n@media screen and (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n.fade:not(.show) {\n  opacity: 0;\n}\n.collapse:not(.show) {\n  display: none;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n@media screen and (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n.dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n.dropdown-menu[x-placement^=\"top\"],\n.dropdown-menu[x-placement^=\"right\"],\n.dropdown-menu[x-placement^=\"bottom\"],\n.dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n.dropdown-item:hover,\n.dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n.dropdown-item.active,\n.dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n.dropdown-item.disabled,\n.dropdown-item:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n.dropdown-menu.show {\n  display: block;\n}\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1.5rem;\n  color: #212529;\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  flex: 0 1 auto;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n.btn-group .btn + .btn,\n.btn-group-vertical .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group-vertical .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n  width: auto;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n.btn-sm + .dropdown-toggle-split,\n.btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n.btn-lg + .dropdown-toggle-split,\n.btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n  width: 100%;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  width: 100%;\n}\n.input-group > .form-control,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file:focus {\n  z-index: 3;\n}\n.input-group > .form-control + .form-control,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-file + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-file + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group > .custom-file {\n  display: flex;\n  align-items: center;\n}\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group-prepend,\n.input-group-append {\n  display: flex;\n}\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n.input-group-prepend .btn + .btn,\n.input-group-append .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-append .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n.input-group-prepend {\n  margin-right: -1px;\n}\n.input-group-append {\n  margin-left: -1px;\n}\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n.custom-control-inline {\n  display: inline-flex;\n  margin-right: 1rem;\n}\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #007bff;\n}\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-control-input:active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #b3d7ff;\n}\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #6c757d;\n}\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n.custom-control-label {\n  position: relative;\n  margin-bottom: 0;\n}\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  user-select: none;\n  background-color: #dee2e6;\n}\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background-repeat: no-repeat;\n  background-position: center center;\n  background-size: 50% 50%;\n}\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n.custom-radio .custom-control-input:checked ~ .custom-control-label::before {\n  background-color: #007bff;\n}\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n  background-size: 8px 10px;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  appearance: none;\n}\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(128, 189, 255, 0.5);\n}\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n.custom-select[multiple],\n.custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n.custom-select:disabled {\n  color: #6c757d;\n  background-color: #e9ecef;\n}\n.custom-select::-ms-expand {\n  opacity: 0;\n}\n.custom-select-sm {\n  height: calc(1.8125rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 75%;\n}\n.custom-select-lg {\n  height: calc(2.875rem + 2px);\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  font-size: 125%;\n}\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin-bottom: 0;\n}\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(2.25rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-file-input:focus ~ .custom-file-label::after {\n  border-color: #80bdff;\n}\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(2.25rem + 2px);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: 2.25rem;\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: 1px solid #ced4da;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n.custom-range {\n  width: 100%;\n  padding-left: 0;\n  background-color: transparent;\n  appearance: none;\n}\n.custom-range:focus {\n  outline: none;\n}\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  appearance: none;\n}\n.custom-range::-webkit-slider-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #b3d7ff;\n}\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  appearance: none;\n}\n.custom-range::-moz-range-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-range::-moz-range-thumb:active {\n  background-color: #b3d7ff;\n}\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  appearance: none;\n}\n.custom-range::-ms-thumb:focus {\n  outline: none;\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.custom-range::-ms-thumb:active {\n  background-color: #b3d7ff;\n}\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n}\n.custom-range::-ms-fill-lower {\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n.nav {\n  display: flex;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n.nav-link:hover,\n.nav-link:focus {\n  text-decoration: none;\n}\n.nav-link.disabled {\n  color: #6c757d;\n}\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n.nav-tabs .nav-link:hover,\n.nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #007bff;\n}\n.nav-fill .nav-item {\n  flex: 1 1 auto;\n  text-align: center;\n}\n.nav-justified .nav-item {\n  flex-basis: 0;\n  flex-grow: 1;\n  text-align: center;\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.navbar {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n.navbar > .container,\n.navbar > .container-fluid {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n}\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-nav {\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n.navbar-collapse {\n  flex-basis: 100%;\n  flex-grow: 1;\n  align-items: center;\n}\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n.navbar-toggler:hover,\n.navbar-toggler:focus {\n  text-decoration: none;\n}\n.navbar-toggler:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n.navbar-expand {\n  flex-flow: row nowrap;\n  justify-content: flex-start;\n}\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    flex-flow: row nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n.navbar-expand .navbar-nav {\n  flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  flex-wrap: nowrap;\n}\n.navbar-expand .navbar-collapse {\n  display: flex !important;\n  flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-brand:hover,\n.navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n.navbar-light .navbar-nav .nav-link:hover,\n.navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-text a:hover,\n.navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n.navbar-dark .navbar-brand:hover,\n.navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.5);\n}\n.navbar-dark .navbar-nav .nav-link:hover,\n.navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.5);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.5);\n}\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n.navbar-dark .navbar-text a:hover,\n.navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n.card {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n.card-body {\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n.card-title {\n  margin-bottom: 0.75rem;\n}\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n.card-text:last-child {\n  margin-bottom: 0;\n}\n.card-link:hover {\n  text-decoration: none;\n}\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 1px);\n}\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.card-deck {\n  display: flex;\n  flex-direction: column;\n}\n.card-deck .card {\n  margin-bottom: 15px;\n}\n@media (min-width: 576px) {\n  .card-deck {\n    flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    display: flex;\n    flex: 1 0 0%;\n    flex-direction: column;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n.card-group {\n  display: flex;\n  flex-direction: column;\n}\n.card-group > .card {\n  margin-bottom: 15px;\n}\n@media (min-width: 576px) {\n  .card-group {\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:first-child {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-top,\n  .card-group > .card:first-child .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:first-child .card-img-bottom,\n  .card-group > .card:first-child .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:last-child {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-top,\n  .card-group > .card:last-child .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:last-child .card-img-bottom,\n  .card-group > .card:last-child .card-footer {\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:only-child {\n    border-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-top,\n  .card-group > .card:only-child .card-header {\n    border-top-left-radius: 0.25rem;\n    border-top-right-radius: 0.25rem;\n  }\n  .card-group > .card:only-child .card-img-bottom,\n  .card-group > .card:only-child .card-footer {\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) {\n    border-radius: 0;\n  }\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-header,\n  .card-group > .card:not(:first-child):not(:last-child):not(:only-child) .card-footer {\n    border-radius: 0;\n  }\n}\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n@media (min-width: 576px) {\n  .card-columns {\n    column-count: 3;\n    column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n.accordion .card:not(:first-of-type):not(:last-of-type) {\n  border-bottom: 0;\n  border-radius: 0;\n}\n.accordion .card:not(:first-of-type) .card-header:first-child {\n  border-radius: 0;\n}\n.accordion .card:first-of-type {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.accordion .card:last-of-type {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n.breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: \"/\";\n}\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n.pagination {\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n}\n.page-link:hover {\n  z-index: 2;\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n.page-link:focus {\n  z-index: 2;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n.page-link:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n.page-item.active .page-link {\n  z-index: 1;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n.badge-primary {\n  color: #fff;\n  background-color: #007bff;\n}\n.badge-primary[href]:hover,\n.badge-primary[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #0062cc;\n}\n.badge-secondary {\n  color: #fff;\n  background-color: #6c757d;\n}\n.badge-secondary[href]:hover,\n.badge-secondary[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #545b62;\n}\n.badge-success {\n  color: #fff;\n  background-color: #28a745;\n}\n.badge-success[href]:hover,\n.badge-success[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #1e7e34;\n}\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n.badge-info[href]:hover,\n.badge-info[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #117a8b;\n}\n.badge-warning {\n  color: #212529;\n  background-color: #ffc107;\n}\n.badge-warning[href]:hover,\n.badge-warning[href]:focus {\n  color: #212529;\n  text-decoration: none;\n  background-color: #d39e00;\n}\n.badge-danger {\n  color: #fff;\n  background-color: #dc3545;\n}\n.badge-danger[href]:hover,\n.badge-danger[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #bd2130;\n}\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n.badge-light[href]:hover,\n.badge-light[href]:focus {\n  color: #212529;\n  text-decoration: none;\n  background-color: #dae0e5;\n}\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n.badge-dark[href]:hover,\n.badge-dark[href]:focus {\n  color: #fff;\n  text-decoration: none;\n  background-color: #1d2124;\n}\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n.alert-heading {\n  color: inherit;\n}\n.alert-link {\n  font-weight: 700;\n}\n.alert-dismissible {\n  padding-right: 4rem;\n}\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n.alert-primary .alert-link {\n  color: #002752;\n}\n.alert-secondary {\n  color: #383d41;\n  background-color: #e2e3e5;\n  border-color: #d6d8db;\n}\n.alert-secondary hr {\n  border-top-color: #c8cbcf;\n}\n.alert-secondary .alert-link {\n  color: #202326;\n}\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n.alert-info .alert-link {\n  color: #062c33;\n}\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n.alert-warning .alert-link {\n  color: #533f03;\n}\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n.alert-danger .alert-link {\n  color: #491217;\n}\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n.alert-light hr {\n  border-top-color: #ececf5;\n}\n.alert-light .alert-link {\n  color: #686868;\n}\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n.alert-dark .alert-link {\n  color: #040405;\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n@media screen and (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n.progress-bar-animated {\n  animation: progress-bar-stripes 1s linear infinite;\n}\n.media {\n  display: flex;\n  align-items: flex-start;\n}\n.media-body {\n  flex: 1;\n}\n.list-group {\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n.list-group-item-action:hover,\n.list-group-item-action:focus {\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n.list-group-item:hover,\n.list-group-item:focus {\n  z-index: 1;\n  text-decoration: none;\n}\n.list-group-item.disabled,\n.list-group-item:disabled {\n  color: #6c757d;\n  background-color: #fff;\n}\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n.list-group-flush:last-child .list-group-item:last-child {\n  border-bottom: 0;\n}\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n.list-group-item-primary.list-group-item-action:hover,\n.list-group-item-primary.list-group-item-action:focus {\n  color: #004085;\n  background-color: #9fcdff;\n}\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #004085;\n  border-color: #004085;\n}\n.list-group-item-secondary {\n  color: #383d41;\n  background-color: #d6d8db;\n}\n.list-group-item-secondary.list-group-item-action:hover,\n.list-group-item-secondary.list-group-item-action:focus {\n  color: #383d41;\n  background-color: #c8cbcf;\n}\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #383d41;\n  border-color: #383d41;\n}\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n.list-group-item-success.list-group-item-action:hover,\n.list-group-item-success.list-group-item-action:focus {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #155724;\n  border-color: #155724;\n}\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n.list-group-item-info.list-group-item-action:hover,\n.list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n.list-group-item-warning.list-group-item-action:hover,\n.list-group-item-warning.list-group-item-action:focus {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #856404;\n  border-color: #856404;\n}\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n.list-group-item-danger.list-group-item-action:hover,\n.list-group-item-danger.list-group-item-action:focus {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n.list-group-item-light.list-group-item-action:hover,\n.list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf5;\n}\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n.list-group-item-dark.list-group-item-action:hover,\n.list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n.close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: 0.5;\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  opacity: 0.75;\n}\n.close:not(:disabled):not(.disabled) {\n  cursor: pointer;\n}\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  overflow: hidden;\n  outline: 0;\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n.modal.fade .modal-dialog {\n  transition: transform 0.3s ease-out;\n  transform: translate(0, -25%);\n}\n@media screen and (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n.modal.show .modal-dialog {\n  transform: translate(0, 0);\n}\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: calc(100% - (0.5rem * 2));\n}\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n.modal-header {\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n  padding: 1rem;\n  border-bottom: 1px solid #e9ecef;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n.modal-header .close {\n  padding: 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n.modal-body {\n  position: relative;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n.modal-footer {\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #e9ecef;\n}\n.modal-footer > :not(:first-child) {\n  margin-left: 0.25rem;\n}\n.modal-footer > :not(:last-child) {\n  margin-right: 0.25rem;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - (1.75rem * 2));\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    max-width: 800px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n.tooltip.show {\n  opacity: 0.9;\n}\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n.bs-tooltip-top,\n.bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n.bs-tooltip-top .arrow,\n.bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n.bs-tooltip-top .arrow::before,\n.bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n.bs-tooltip-right,\n.bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n.bs-tooltip-right .arrow,\n.bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n.bs-tooltip-right .arrow::before,\n.bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n.bs-tooltip-bottom,\n.bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n.bs-tooltip-bottom .arrow,\n.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n.bs-tooltip-bottom .arrow::before,\n.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n.bs-tooltip-left,\n.bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n.bs-tooltip-left .arrow,\n.bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n.bs-tooltip-left .arrow::before,\n.bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n.popover .arrow::before,\n.popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n.bs-popover-top,\n.bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n.bs-popover-top .arrow,\n.bs-popover-auto[x-placement^=\"top\"] .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n.bs-popover-top .arrow::before,\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0;\n}\n.bs-popover-top .arrow::before,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n  bottom: 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-top .arrow::after,\n.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n  bottom: 1px;\n  border-top-color: #fff;\n}\n.bs-popover-right,\n.bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n.bs-popover-right .arrow,\n.bs-popover-auto[x-placement^=\"right\"] .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n.bs-popover-right .arrow::before,\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n}\n.bs-popover-right .arrow::before,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n  left: 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-right .arrow::after,\n.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n  left: 1px;\n  border-right-color: #fff;\n}\n.bs-popover-bottom,\n.bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n.bs-popover-bottom .arrow,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n.bs-popover-bottom .arrow::before,\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n}\n.bs-popover-bottom .arrow::before,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n  top: 0;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-bottom .arrow::after,\n.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n  top: 1px;\n  border-bottom-color: #fff;\n}\n.bs-popover-bottom .popover-header::before,\n.bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n.bs-popover-left,\n.bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n.bs-popover-left .arrow,\n.bs-popover-auto[x-placement^=\"left\"] .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n.bs-popover-left .arrow::before,\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n}\n.bs-popover-left .arrow::before,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n  right: 0;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-left .arrow::after,\n.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n  right: 1px;\n  border-left-color: #fff;\n}\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  color: inherit;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n.popover-header:empty {\n  display: none;\n}\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-item {\n  position: relative;\n  display: none;\n  align-items: center;\n  width: 100%;\n  transition: transform 0.6s ease;\n  backface-visibility: hidden;\n  perspective: 1000px;\n}\n@media screen and (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n.carousel-item-next,\n.carousel-item-prev {\n  position: absolute;\n  top: 0;\n}\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n  transform: translateX(0);\n}\n@supports (transform-style: preserve-3d) {\n  .carousel-item-next.carousel-item-left,\n  .carousel-item-prev.carousel-item-right {\n    transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-item-next,\n.active.carousel-item-right {\n  transform: translateX(100%);\n}\n@supports (transform-style: preserve-3d) {\n  .carousel-item-next,\n  .active.carousel-item-right {\n    transform: translate3d(100%, 0, 0);\n  }\n}\n.carousel-item-prev,\n.active.carousel-item-left {\n  transform: translateX(-100%);\n}\n@supports (transform-style: preserve-3d) {\n  .carousel-item-prev,\n  .active.carousel-item-left {\n    transform: translate3d(-100%, 0, 0);\n  }\n}\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-duration: 0.6s;\n  transition-property: opacity;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  opacity: 1;\n}\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  opacity: 0;\n}\n.carousel-fade .carousel-item-next,\n.carousel-fade .carousel-item-prev,\n.carousel-fade .carousel-item.active,\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-prev {\n  transform: translateX(0);\n}\n@supports (transform-style: preserve-3d) {\n  .carousel-fade .carousel-item-next,\n  .carousel-fade .carousel-item-prev,\n  .carousel-fade .carousel-item.active,\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-prev {\n    transform: translate3d(0, 0, 0);\n  }\n}\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n}\n.carousel-control-prev:hover,\n.carousel-control-next:hover,\n.carousel-control-prev:focus,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n.carousel-control-prev {\n  left: 0;\n}\n.carousel-control-next {\n  right: 0;\n}\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: transparent no-repeat center center;\n  background-size: 100% 100%;\n}\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 10px;\n  left: 0;\n  z-index: 15;\n  display: flex;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n.carousel-indicators li {\n  position: relative;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: rgba(255, 255, 255, 0.5);\n}\n.carousel-indicators li::before {\n  position: absolute;\n  top: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n.carousel-indicators li::after {\n  position: absolute;\n  bottom: -10px;\n  left: 0;\n  display: inline-block;\n  width: 100%;\n  height: 10px;\n  content: \"\";\n}\n.carousel-indicators .active {\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n.align-baseline {\n  vertical-align: baseline !important;\n}\n.align-top {\n  vertical-align: top !important;\n}\n.align-middle {\n  vertical-align: middle !important;\n}\n.align-bottom {\n  vertical-align: bottom !important;\n}\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n.align-text-top {\n  vertical-align: text-top !important;\n}\n.bg-primary {\n  background-color: #007bff !important;\n}\na.bg-primary:hover,\nbutton.bg-primary:hover,\na.bg-primary:focus,\nbutton.bg-primary:focus {\n  background-color: #0062cc !important;\n}\n.bg-secondary {\n  background-color: #6c757d !important;\n}\na.bg-secondary:hover,\nbutton.bg-secondary:hover,\na.bg-secondary:focus,\nbutton.bg-secondary:focus {\n  background-color: #545b62 !important;\n}\n.bg-success {\n  background-color: #28a745 !important;\n}\na.bg-success:hover,\nbutton.bg-success:hover,\na.bg-success:focus,\nbutton.bg-success:focus {\n  background-color: #1e7e34 !important;\n}\n.bg-info {\n  background-color: #17a2b8 !important;\n}\na.bg-info:hover,\nbutton.bg-info:hover,\na.bg-info:focus,\nbutton.bg-info:focus {\n  background-color: #117a8b !important;\n}\n.bg-warning {\n  background-color: #ffc107 !important;\n}\na.bg-warning:hover,\nbutton.bg-warning:hover,\na.bg-warning:focus,\nbutton.bg-warning:focus {\n  background-color: #d39e00 !important;\n}\n.bg-danger {\n  background-color: #dc3545 !important;\n}\na.bg-danger:hover,\nbutton.bg-danger:hover,\na.bg-danger:focus,\nbutton.bg-danger:focus {\n  background-color: #bd2130 !important;\n}\n.bg-light {\n  background-color: #f8f9fa !important;\n}\na.bg-light:hover,\nbutton.bg-light:hover,\na.bg-light:focus,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n.bg-dark {\n  background-color: #343a40 !important;\n}\na.bg-dark:hover,\nbutton.bg-dark:hover,\na.bg-dark:focus,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n.bg-white {\n  background-color: #fff !important;\n}\n.bg-transparent {\n  background-color: transparent !important;\n}\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n.border-right {\n  border-right: 1px solid #dee2e6 !important;\n}\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n.border-left {\n  border-left: 1px solid #dee2e6 !important;\n}\n.border-0 {\n  border: 0 !important;\n}\n.border-top-0 {\n  border-top: 0 !important;\n}\n.border-right-0 {\n  border-right: 0 !important;\n}\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n.border-left-0 {\n  border-left: 0 !important;\n}\n.border-primary {\n  border-color: #007bff !important;\n}\n.border-secondary {\n  border-color: #6c757d !important;\n}\n.border-success {\n  border-color: #28a745 !important;\n}\n.border-info {\n  border-color: #17a2b8 !important;\n}\n.border-warning {\n  border-color: #ffc107 !important;\n}\n.border-danger {\n  border-color: #dc3545 !important;\n}\n.border-light {\n  border-color: #f8f9fa !important;\n}\n.border-dark {\n  border-color: #343a40 !important;\n}\n.border-white {\n  border-color: #fff !important;\n}\n.rounded {\n  border-radius: 0.25rem !important;\n}\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n.rounded-circle {\n  border-radius: 50% !important;\n}\n.rounded-0 {\n  border-radius: 0 !important;\n}\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n.d-none {\n  display: none !important;\n}\n.d-inline {\n  display: inline !important;\n}\n.d-inline-block {\n  display: inline-block !important;\n}\n.d-block {\n  display: block !important;\n}\n.d-table {\n  display: table !important;\n}\n.d-table-row {\n  display: table-row !important;\n}\n.d-table-cell {\n  display: table-cell !important;\n}\n.d-flex {\n  display: flex !important;\n}\n.d-inline-flex {\n  display: inline-flex !important;\n}\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n}\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n}\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n}\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n}\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n.embed-responsive-21by9::before {\n  padding-top: 42.85714286%;\n}\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n.flex-row {\n  flex-direction: row !important;\n}\n.flex-column {\n  flex-direction: column !important;\n}\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n.justify-content-center {\n  justify-content: center !important;\n}\n.justify-content-between {\n  justify-content: space-between !important;\n}\n.justify-content-around {\n  justify-content: space-around !important;\n}\n.align-items-start {\n  align-items: flex-start !important;\n}\n.align-items-end {\n  align-items: flex-end !important;\n}\n.align-items-center {\n  align-items: center !important;\n}\n.align-items-baseline {\n  align-items: baseline !important;\n}\n.align-items-stretch {\n  align-items: stretch !important;\n}\n.align-content-start {\n  align-content: flex-start !important;\n}\n.align-content-end {\n  align-content: flex-end !important;\n}\n.align-content-center {\n  align-content: center !important;\n}\n.align-content-between {\n  align-content: space-between !important;\n}\n.align-content-around {\n  align-content: space-around !important;\n}\n.align-content-stretch {\n  align-content: stretch !important;\n}\n.align-self-auto {\n  align-self: auto !important;\n}\n.align-self-start {\n  align-self: flex-start !important;\n}\n.align-self-end {\n  align-self: flex-end !important;\n}\n.align-self-center {\n  align-self: center !important;\n}\n.align-self-baseline {\n  align-self: baseline !important;\n}\n.align-self-stretch {\n  align-self: stretch !important;\n}\n@media (min-width: 576px) {\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n}\n@media (min-width: 768px) {\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n}\n@media (min-width: 992px) {\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n}\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n}\n.float-left {\n  float: left !important;\n}\n.float-right {\n  float: right !important;\n}\n.float-none {\n  float: none !important;\n}\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n.position-static {\n  position: static !important;\n}\n.position-relative {\n  position: relative !important;\n}\n.position-absolute {\n  position: absolute !important;\n}\n.position-fixed {\n  position: fixed !important;\n}\n.position-sticky {\n  position: sticky !important;\n}\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n@supports (position: sticky) {\n  .sticky-top {\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n.shadow-none {\n  box-shadow: none !important;\n}\n.w-25 {\n  width: 25% !important;\n}\n.w-50 {\n  width: 50% !important;\n}\n.w-75 {\n  width: 75% !important;\n}\n.w-100 {\n  width: 100% !important;\n}\n.w-auto {\n  width: auto !important;\n}\n.h-25 {\n  height: 25% !important;\n}\n.h-50 {\n  height: 50% !important;\n}\n.h-75 {\n  height: 75% !important;\n}\n.h-100 {\n  height: 100% !important;\n}\n.h-auto {\n  height: auto !important;\n}\n.mw-100 {\n  max-width: 100% !important;\n}\n.mh-100 {\n  max-height: 100% !important;\n}\n.m-0 {\n  margin: 0 !important;\n}\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n.m-1 {\n  margin: 0.25rem !important;\n}\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n.m-2 {\n  margin: 0.5rem !important;\n}\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n.m-3 {\n  margin: 1rem !important;\n}\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n.m-4 {\n  margin: 1.5rem !important;\n}\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n.m-5 {\n  margin: 3rem !important;\n}\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n.p-0 {\n  padding: 0 !important;\n}\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n.p-1 {\n  padding: 0.25rem !important;\n}\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n.p-2 {\n  padding: 0.5rem !important;\n}\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n.p-3 {\n  padding: 1rem !important;\n}\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n.p-4 {\n  padding: 1.5rem !important;\n}\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n.p-5 {\n  padding: 3rem !important;\n}\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n.m-auto {\n  margin: auto !important;\n}\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n.text-justify {\n  text-align: justify !important;\n}\n.text-nowrap {\n  white-space: nowrap !important;\n}\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.text-left {\n  text-align: left !important;\n}\n.text-right {\n  text-align: right !important;\n}\n.text-center {\n  text-align: center !important;\n}\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n.font-weight-light {\n  font-weight: 300 !important;\n}\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n.font-italic {\n  font-style: italic !important;\n}\n.text-white {\n  color: #fff !important;\n}\n.text-primary {\n  color: #007bff !important;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #0062cc !important;\n}\n.text-secondary {\n  color: #6c757d !important;\n}\na.text-secondary:hover,\na.text-secondary:focus {\n  color: #545b62 !important;\n}\n.text-success {\n  color: #28a745 !important;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #1e7e34 !important;\n}\n.text-info {\n  color: #17a2b8 !important;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #117a8b !important;\n}\n.text-warning {\n  color: #ffc107 !important;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #d39e00 !important;\n}\n.text-danger {\n  color: #dc3545 !important;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #bd2130 !important;\n}\n.text-light {\n  color: #f8f9fa !important;\n}\na.text-light:hover,\na.text-light:focus {\n  color: #dae0e5 !important;\n}\n.text-dark {\n  color: #343a40 !important;\n}\na.text-dark:hover,\na.text-dark:focus {\n  color: #1d2124 !important;\n}\n.text-body {\n  color: #212529 !important;\n}\n.text-muted {\n  color: #6c757d !important;\n}\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.visible {\n  visibility: visible !important;\n}\n.invisible {\n  visibility: hidden !important;\n}\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #dee2e6 !important;\n  }\n  .table-dark {\n    color: inherit;\n  }\n  .table-dark th,\n  .table-dark td,\n  .table-dark thead th,\n  .table-dark tbody + tbody {\n    border-color: #dee2e6;\n  }\n  .table .thead-dark th {\n    color: inherit;\n    border-color: #dee2e6;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/3rd-party/bootstrap4.less",
    "content": "@import \"bootstrap-less-port/less/bootstrap\";"
  },
  {
    "path": "packages/test-data/tests-config/3rd-party/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": 0\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/at-rules-compressed/at-rules-compressed.css",
    "content": "@media screen{body{margin:0}p{padding:0}}@layer base{body{margin:0}p{padding:0}div{border:0}}@supports (display: grid){.grid{display:grid}.item{grid-column:1}}@page{margin:2cm;size:A4}@keyframes slide{from{transform:translateX(0)}to{transform:translateX(100px)}}"
  },
  {
    "path": "packages/test-data/tests-config/at-rules-compressed/at-rules-compressed.less",
    "content": "// Tests for atrule.js coverage - compressed output path (lines 243-250)\n// Also covers parser + genCSS + outputRuleset\n\n// Compressed @media with rules\n@media screen {\n  body { margin: 0; }\n  p { padding: 0; }\n}\n\n// Compressed @layer with multiple rules\n@layer base {\n  body { margin: 0; }\n  p { padding: 0; }\n  div { border: 0; }\n}\n\n// Compressed @supports\n@supports (display: grid) {\n  .grid { display: grid; }\n  .item { grid-column: 1; }\n}\n\n// Compressed @page\n@page {\n  margin: 2cm;\n  size: A4;\n}\n\n// Compressed @keyframes\n@keyframes slide {\n  from { transform: translateX(0); }\n  to { transform: translateX(100px); }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/at-rules-compressed/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            compress: true\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/test-data/tests-config/at-rules-compressed-evaluation/at-rules-compressed-evaluation.css",
    "content": "@charset \"UTF-8\";@media screen,print,handheld{body{font-size:12pt}}@media screen{.container{color:red;background:blue}}@media screen{.test{color:red;background:blue}}@media screen,print{body{margin:0}}@media screen{.container{color:red}.container .child{color:blue}}@media screen{.wrapper .inner{color:green}}@page{margin:2cm;size:A4}@supports (display: grid){.grid{display:grid}.flex{display:flex}}@media screen{body{color:black}}@layer base{body{margin:0}p{padding:0}}@media screen{.test{color:value}}@media screen and print{body{color:black}}"
  },
  {
    "path": "packages/test-data/tests-config/at-rules-compressed-evaluation/at-rules-compressed-evaluation.less",
    "content": "// Test at-rule evaluation paths (eval, evalRoot, genCSS, accept, etc.)\n\n// Test keywordList - @media with keyword list\n@media screen, print, handheld {\n  body {\n    font-size: 12pt;\n  }\n}\n\n// Test declarationsBlock with mergeable=true (nested ruleset with declarations)\n@media screen {\n  .container {\n    color: red;\n    background: blue;\n  }\n}\n\n// Test simpleBlock optimization with allRulesetDeclarations (single ruleset)\n@media screen {\n  .test {\n    color: red;\n    background: blue;\n  }\n}\n\n// Test eval with value evaluation and keywordList conversion\n@breakpoint: screen;\n@media @breakpoint, print {\n  body {\n    margin: 0;\n  }\n}\n\n// Test evalRoot with ampersand handling\n.container {\n  @media screen {\n    & {\n      color: red;\n    }\n    .child {\n      color: blue;\n    }\n  }\n}\n\n// Test evalRoot with mixed ampersands\n.wrapper {\n  .inner {\n    @media screen {\n      & {\n        color: green;\n      }\n    }\n  }\n}\n\n// Test genCSS with value\n@charset \"UTF-8\";\n\n// Test genCSS with simpleBlock\n@page {\n  margin: 2cm;\n  size: A4;\n}\n\n// Test genCSS with rules (non-simpleBlock)\n@supports (display: grid) {\n  .grid {\n    display: grid;\n  }\n  .flex {\n    display: flex;\n  }\n}\n\n// Test isCharset\n@charset \"UTF-8\";\n\n// Test isRulesetLike (non-charset)\n@media screen {\n  body {\n    color: black;\n  }\n}\n\n// Test compressed output (outputRuleset compressed path)\n@layer base {\n  body {\n    margin: 0;\n  }\n  p {\n    padding: 0;\n  }\n}\n\n// Test variable/find/rulesets delegation\n@media screen {\n  @var: value;\n  .test {\n    color: @var;\n  }\n}\n\n// Test eval with media bubbling\n@media screen {\n  @media print {\n    body {\n      color: black;\n    }\n  }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/at-rules-compressed-evaluation/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            compress: true\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/test-data/tests-config/compression/compression.css",
    "content": "#colours{color1:#fea;color2:#ffeeaa;color3:rgba(255,238,170,0.1);string:\"#fea\";/*! but not this type\n      Note preserved whitespace\n  */}dimensions{val:.1px;val:0em;val:4cm;val:.2;val:5;angles-must-have-unit:0deg;durations-must-have-unit:0s;length-doesnt-have-unit:0px;width:auto\\9}@page{marks:none;@top-left-corner{vertical-align:top}@top-left{vertical-align:top}}.shadow^.dom,body^^.shadow{display:done}"
  },
  {
    "path": "packages/test-data/tests-config/compression/compression.less",
    "content": "#colours {\n  color1: #fea;\n  color2: #ffeeaa;\n  color3: rgba(255, 238, 170, 0.1);\n  @color1: #fea;\n  string: \"@{color1}\";\n  /* comments are stripped */\n  // both types!\n  /*! but not this type\n      Note preserved whitespace\n  */\n}\ndimensions {\n  val: 0.1px;\n  val: 0em;\n  val: 4cm;\n  val: 0.2;\n  val: 5;\n  angles-must-have-unit: 0deg;\n  durations-must-have-unit: 0s;\n  length-doesnt-have-unit: 0px;\n  width: auto\\9;\n}\n@page  {\n  marks: none;\n@top-left-corner {\n  vertical-align: top;\n}\n@top-left {\n  vertical-align: top;\n}\n}\n.shadow ^ .dom,\nbody ^^ .shadow {\n  display: done;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/compression/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"strict\",\n      \"compress\": true\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/all/linenumbers-all.css",
    "content": "@charset \"UTF-8\";\n/* line 1, {pathimport}test.less */\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000031}}\n/* @charset \"ISO-8859-1\"; */\n/* line 23, {pathimport}test.less */\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\0000323}}\n.tst3 {\n  color: grey;\n}\n/* line 15, {path}linenumbers.less */\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathesc}linenumbers\\.less}line{font-family:\\0000315}}\n.test-rule1 {\n  color: black;\n}\n/* line 6, {path}linenumbers.less */\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathesc}linenumbers\\.less}line{font-family:\\000036}}\n.test-rule2 {\n  color: red;\n}\n@media all {\n  /* line 5, {pathimport}test.less */\n  @media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000035}}\n  .tst {\n    color: black;\n  }\n}\n@media all and screen {\n  /* line 7, {pathimport}test.less */\n  @media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000037}}\n  .tst {\n    color: red;\n  }\n  /* line 9, {pathimport}test.less */\n  @media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000039}}\n  .tst .tst3 {\n    color: inherit;\n  }\n}\n/* line 18, {pathimport}test.less */\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\0000318}}\n.tst2 {\n  color: inherit;\n}\n/* line 27, {path}linenumbers.less */\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathesc}linenumbers\\.less}line{font-family:\\0000327}}\n.test-rule {\n  color: red;\n  width: 2;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/all/linenumbers-all.less",
    "content": "// Entry file for -all configuration\n@import \"../linenumbers.less\";\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/all/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"strict\",\n      \"dumpLineNumbers\": \"all\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/comments/linenumbers-comments.css",
    "content": "@charset \"UTF-8\";\n/* line 1, {pathimport}test.less */\n/* @charset \"ISO-8859-1\"; */\n/* line 23, {pathimport}test.less */\n.tst3 {\n  color: grey;\n}\n/* line 15, {path}linenumbers.less */\n.test-rule1 {\n  color: black;\n}\n/* line 6, {path}linenumbers.less */\n.test-rule2 {\n  color: red;\n}\n@media all {\n  /* line 5, {pathimport}test.less */\n  .tst {\n    color: black;\n  }\n}\n@media all and screen {\n  /* line 7, {pathimport}test.less */\n  .tst {\n    color: red;\n  }\n  /* line 9, {pathimport}test.less */\n  .tst .tst3 {\n    color: inherit;\n  }\n}\n/* line 18, {pathimport}test.less */\n.tst2 {\n  color: inherit;\n}\n/* line 27, {path}linenumbers.less */\n.test-rule {\n  color: red;\n  width: 2;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/comments/linenumbers-comments.less",
    "content": "// Entry file for -comments configuration\n@import \"../linenumbers.less\";\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/comments/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"strict\",\n      \"dumpLineNumbers\": \"comments\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/import/test.less",
    "content": "@charset \"ISO-8859-1\";\n\n.mixin_import1() {\n    @media all {\n        .tst {\n            color: black;\n            @media screen {\n                color: red;\n                .tst3 {\n                    color: inherit;\n                }\n            }\n        }\n    }\n}\n\n.mixin_import2() {\n    .tst2 {\n        color: inherit;\n    }\n}\n\n.tst3 {\n    color: grey;\n}"
  },
  {
    "path": "packages/test-data/tests-config/debug/linenumbers.less",
    "content": "@charset \"UTF-8\";\n\n@import \"import/test.less\";\n\n.start() {\n  .test-rule2 {\n      color: red;\n  }\n}\n\n.mix() {\n    color: black;\n}\n\n.test-rule1 {\n  .mix();\n}\n\n.start();\n\n.mixin_import1();\n\n.mixin_import2();\n\n@debug: 1;\n& when (@debug = 1) {\n  .test-rule {\n    color: red;\n    & when (@debug = 1) {\n      width: 2;\n    }\n  }\n}"
  },
  {
    "path": "packages/test-data/tests-config/debug/mediaquery/linenumbers-mediaquery.css",
    "content": "@charset \"UTF-8\";\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000031}}\n/* @charset \"ISO-8859-1\"; */\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\0000323}}\n.tst3 {\n  color: grey;\n}\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathesc}linenumbers\\.less}line{font-family:\\0000315}}\n.test-rule1 {\n  color: black;\n}\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathesc}linenumbers\\.less}line{font-family:\\000036}}\n.test-rule2 {\n  color: red;\n}\n@media all {\n  @media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000035}}\n  .tst {\n    color: black;\n  }\n}\n@media all and screen {\n  @media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000037}}\n  .tst {\n    color: red;\n  }\n  @media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\000039}}\n  .tst .tst3 {\n    color: inherit;\n  }\n}\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathimportesc}test\\.less}line{font-family:\\0000318}}\n.tst2 {\n  color: inherit;\n}\n@media -sass-debug-info{filename{font-family:file\\:\\/\\/{pathesc}linenumbers\\.less}line{font-family:\\0000327}}\n.test-rule {\n  color: red;\n  width: 2;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/mediaquery/linenumbers-mediaquery.less",
    "content": "// Entry file for -mediaquery configuration\n@import \"../linenumbers.less\";\n"
  },
  {
    "path": "packages/test-data/tests-config/debug/mediaquery/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"strict\",\n      \"dumpLineNumbers\": \"mediaquery\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/filemanagerPlugin/colors.test",
    "content": "@color: red;\n"
  },
  {
    "path": "packages/test-data/tests-config/filemanagerPlugin/filemanager.css",
    "content": ".test-rule {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/filemanagerPlugin/filemanager.less",
    "content": "@import \"test.test\";\n.test-rule {\n    color: @color;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/filemanagerPlugin/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"plugin\": \"test/plugins/filemanager/index.cjs\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/globalVars/extended.css",
    "content": "/**\n  * Test\n  */\n#header {\n  color: #333333;\n  border-left: 1px;\n  border-right: 2px;\n}\n#footer {\n  color: #114411;\n  border-color: #f20d0d;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/globalVars/extended.json",
    "content": "{\n    \"the-border\": \"1px\",\n    \"base-color\": \"#111\",\n    \"red\": \"#842210\"\n}"
  },
  {
    "path": "packages/test-data/tests-config/globalVars/extended.less",
    "content": "#header {\n  color: (@base-color * 3);\n  border-left: @the-border;\n  border-right: (@the-border * 2);\n}\n#footer {\n  color: (@base-color + #003300);\n  border-color: @red;\n}\n@red: desaturate(red, 10%); // less file overrides passed in color <- note line comment on last line to check it is okay"
  },
  {
    "path": "packages/test-data/tests-config/globalVars/simple.css",
    "content": "/**\n  * Test\n  */\n.class {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/globalVars/simple.json",
    "content": "{\n    \"my-color\": \"red\"\n}"
  },
  {
    "path": "packages/test-data/tests-config/globalVars/simple.less",
    "content": ".class {\n  color: @my-color;\n}"
  },
  {
    "path": "packages/test-data/tests-config/globalVars/styles.config.cjs",
    "content": " module.exports = {\n    language: {\n        less: {\n            globalVars: {\n                'my-color': 'red',\n                'base-color': '#111',\n                'the-border': '1px',\n                'red': '#842210'\n            },\n            banner: '/**\\n  * Test\\n  */\\n'\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/import-redirect/import-redirect.less",
    "content": "@import \"https://example.com/redirect.less\";\n\nh1 { color: red; }\n"
  },
  {
    "path": "packages/test-data/tests-config/include-path/import-test-e.less",
    "content": "\nbody { width: 100% }\n"
  },
  {
    "path": "packages/test-data/tests-config/include-path/include-path.css",
    "content": "body {\n  width: 100%;\n}\ndata-uri {\n  property: url(\"data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3Csvg%20height%3D%22100%22%20width%3D%22100%22%3E%0A%20%20%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2240%22%20stroke%3D%22black%22%20stroke-width%3D%221%22%20fill%3D%22blue%22%20%2F%3E%0A%3C%2Fsvg%3E%0A\");\n}\nimage-size {\n  property: 100px 100px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/include-path/include-path.less",
    "content": "@import \"import-test-e\";\n\ndata-uri {\n  property: data-uri('image.svg');\n}\nimage-size {\n  property: image-size('image.svg');\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/include-path/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"paths\": [\n            \"../../data/\"\n      ]\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/include-path-string/include-path-string.css",
    "content": "data-uri {\n  property: url(\"data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3Csvg%20height%3D%22100%22%20width%3D%22100%22%3E%0A%20%20%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2240%22%20stroke%3D%22black%22%20stroke-width%3D%221%22%20fill%3D%22blue%22%20%2F%3E%0A%3C%2Fsvg%3E%0A\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/include-path-string/include-path-string.less",
    "content": "data-uri {\n  property: data-uri('image.svg');\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/include-path-string/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"paths\": [\"../../data/\"]\n    }\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/js-type-errors/js-type-error-2.txt",
    "content": "SyntaxError: JavaScript evaluation error: 'TypeError: Cannot read properties of undefined (reading 'toJS')' in {path}js-type-error.less on line 2, column 8:\n1 .scope {\n2   var: `this.foo.toJS`;\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-config/js-type-errors/js-type-error.less",
    "content": ".scope {\n  var: `this.foo.toJS`;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/js-type-errors/js-type-error.txt",
    "content": "SyntaxError: JavaScript evaluation error: 'TypeError: Cannot read property 'toJS' of undefined' in {path}js-type-error.less on line 2, column 8:\n1 .scope {\n2   var: `this.foo.toJS`;\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-config/js-type-errors/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            math: 'strict',\n            strictUnits: true,\n            javascriptEnabled: true\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/math/always/mixins-guards.css",
    "content": ".test-rule-2798 {\n  regression: fixed;\n}\n.conditions-parser-1 {\n  only-atomic: ok;\n}\n.conditions-parser-2 {\n  only-atomic-with-nested-parenthesis: ok;\n}\n.conditions-parser-3 {\n  only-atomic-nested-parenthesis-on-right: ok;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/always/no-sm-operations.css",
    "content": ".named-colors-in-expressions {\n  color-0: 0 -red;\n  color-1: #000101;\n  color-2: #ff0000;\n  color-3: #ff0000;\n  background-color: blue-2;\n  color: green-black;\n  animation: blue-change 5s infinite;\n}\n.named-colors-in-expressions-bar-red {\n  x: y;\n}\n.named-colors-in-expressions-barred {\n  a: a;\n}\n.division {\n  value: 2px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/parens-division/media-math.css",
    "content": "@media (min-width: 17) {\n  .foo {\n    bar: 1;\n  }\n}\n@media (min-width: 16 / 9) {\n  .foo {\n    bar: 1;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/parens-division/mixins-args.css",
    "content": "#hidden {\n  color: transparent;\n}\n#hidden1 {\n  color: transparent;\n}\n.two-args {\n  color: blue;\n  width: 10px;\n  height: 99%;\n  depth: 99%;\n  border: 2px dotted black;\n}\n.one-arg {\n  width: 15px;\n  height: 49%;\n  depth: 49%;\n}\n.no-args {\n  width: 5px;\n  height: 49%;\n  depth: 49%;\n}\n.var-args {\n  width: 45;\n  height: 8%;\n  depth: 18 / 2 - 1%;\n}\n.multi-mix {\n  width: 10px;\n  height: 29%;\n  depth: 29%;\n  margin: 4;\n  padding: 5;\n}\nbody {\n  padding: 30px;\n  color: #f00;\n}\n.scope-mix {\n  width: 8;\n}\n.content {\n  width: 600px;\n}\n.content .column {\n  margin: 600px;\n}\n#same-var-name {\n  radius: 5px;\n}\n#var-inside {\n  width: 10px;\n}\n.arguments {\n  border: 1px solid black;\n  width: 1px;\n}\n.arguments2 {\n  border: 0px;\n  width: 0px;\n}\n.arguments3 {\n  border: 0px;\n  width: 0px;\n}\n.arguments4 {\n  border: 0 1 2 3 4;\n  rest: 1 2 3 4;\n  width: 0;\n}\n.edge-case {\n  border: \"{\";\n  width: \"{\";\n}\n.slash-vs-math {\n  border-radius: 2px/5px;\n  border-radius: 5px/10px;\n  border-radius: 6px;\n}\n.comma-vs-semi-colon {\n  one: a;\n  two: b, c;\n  one: d, e;\n  two: f;\n  one: g;\n  one: h;\n  one: i;\n  one: j;\n  one: k;\n  two: l;\n  one: m, n;\n  one: o, p;\n  two: q;\n  one: r, s;\n  two: t;\n}\n#named-conflict {\n  four: a, 11, 12, 13;\n  four: a, 21, 22, 23;\n}\n.test-rule-mixin-default-arg {\n  defaults: 1px 1px 1px;\n  defaults: 2px 2px 2px;\n}\n.selector {\n  margin: 2, 2, 2, 2;\n}\n.selector2 {\n  margin: 2, 2, 2, 2;\n}\n.selector3 {\n  margin: 4;\n}\nmixins-args-expand-op-1 {\n  m3: 1, 2, 3;\n}\nmixins-args-expand-op-2 {\n  m3: 4, 5, 6;\n}\nmixins-args-expand-op-3a {\n  m3: a, b, c;\n}\nmixins-args-expand-op-3b {\n  m4: 0, a, b, c;\n}\nmixins-args-expand-op-3c {\n  m4: a, b, c, 4;\n}\nmixins-args-expand-op-4a {\n  m3: a, b, c, d;\n}\nmixins-args-expand-op-4b {\n  m4: 0, a, b, c, d;\n}\nmixins-args-expand-op-4c {\n  m4: a, b, c, d, 4;\n}\nmixins-args-expand-op-5a {\n  m3: 1, 2, 3;\n}\nmixins-args-expand-op-5b {\n  m4: 0, 1, 2, 3;\n}\nmixins-args-expand-op-5c {\n  m4: 1, 2, 3, 4;\n}\nmixins-args-expand-op-6 {\n  m4: 0, 1, 2, 3;\n}\nmixins-args-expand-op-7 {\n  m4: 0, 1, 2, 3;\n}\nmixins-args-expand-op-8 {\n  m4: 1, 1.5, 2, 3;\n}\nmixins-args-expand-op-9 {\n  aa: 4 5 6 1 2 3 and again 4 5 6;\n  a4: and;\n  a8: 5;\n}\n#test-mixin-matching-when-default-2645 {\n  height: 20px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/parens-division/new-division.css",
    "content": ".units {\n  font: 1.2rem/2rem;\n  font: 8vw/9vw;\n  font: 10vh/12vh;\n  font: 12vm/15vm;\n  font: 12vmin/15vmin;\n  font: 1.2ch/1.5ch;\n}\n.math {\n  a: 2;\n  b: 2px / 2;\n  c: 1px;\n  d: 1px;\n  e: 4px / 2;\n  f: 2px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/parens-division/parens.css",
    "content": ".parens-issues-3616 {\n  bar: 888 / 444;\n  bar2: 2;\n  bar3: 2;\n}\n.parens {\n  border: 2px solid black;\n  margin: 1px 3px 16 3;\n  width: 36;\n  padding: 2px 36px;\n}\n.more-parens {\n  padding: 8 4 4 4px;\n  width-all: 96;\n  width-first: 96;\n  width-keep: 96;\n  height: calc(100% + (25vh - 20px));\n  height-keep: 113;\n  height-all: 113;\n  height-parts: 113;\n  margin-keep: 12;\n  margin-parts: 12;\n  margin-all: 12;\n  border-radius-keep: 8px / 4 + 3px;\n  border-radius-parts: 8px / 7px;\n  border-radius-all: 5px;\n}\n.negative {\n  neg-var: -1;\n  neg-var-paren: -1;\n}\n.nested-parens {\n  width: 71;\n  height: 6;\n}\n.mixed-units {\n  margin: 2px 4em 1 5pc;\n  padding: 6px 1em 2px 2;\n}\n.test-rule-false-negatives {\n  a: (;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/strict/css.css",
    "content": "@charset \"utf-8\";\ndiv {\n  color: black;\n}\ndiv {\n  width: 99%;\n}\n* {\n  min-width: 45em;\n}\nh1,\nh2 > a > p,\nh3 {\n  color: none;\n}\ndiv.class {\n  color: blue;\n}\ndiv#id {\n  color: green;\n}\n.class#id {\n  color: purple;\n}\n.one.two.three {\n  color: grey;\n}\n@media print {\n  * {\n    font-size: 3em;\n  }\n}\n@media screen {\n  * {\n    font-size: 10px;\n  }\n}\n@font-face {\n  font-family: 'Garamond Pro';\n}\na:hover,\na:link {\n  color: #999;\n}\np,\np:first-child {\n  text-transform: none;\n}\nq:lang(no) {\n  quotes: none;\n}\np + h1 {\n  font-size: 2.2em;\n}\n#shorthands {\n  border: 1px solid #000;\n  font: 12px/16px Arial;\n  font: 100%/16px Arial;\n  margin: 1px 0;\n  padding: 0 auto;\n}\n#more-shorthands {\n  margin: 0;\n  padding: 1px 0 2px 0;\n  font: normal small / 20px 'Trebuchet MS', Verdana, sans-serif;\n  font: 0/0 a;\n  border-radius: 5px / 10px;\n}\n.misc {\n  -moz-border-radius: 2px;\n  display: -moz-inline-stack;\n  width: 0.1em;\n  background-color: #009998;\n  background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));\n  margin: ;\n  filter: alpha(opacity=100);\n  width: auto\\9;\n}\n.misc .nested-multiple {\n  multiple-semi-colons: yes;\n}\n#important {\n  color: red !important;\n  width: 100%!important;\n  height: 20px ! important;\n}\n@font-face {\n  font-family: font-a;\n}\n@font-face {\n  font-family: font-b;\n}\n.æøå {\n  margin: 0;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/strict/media-math.css",
    "content": "@media (min-width: 16 + 1) {\n  .foo {\n    bar: 1;\n  }\n}\n@media (min-width: 16 / 9) {\n  .foo {\n    bar: 1;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/strict/mixins-args.css",
    "content": "#hidden {\n  color: transparent;\n}\n#hidden1 {\n  color: transparent;\n}\n.two-args {\n  color: blue;\n  width: 10px;\n  height: 99%;\n  depth: 100% - 1%;\n  border: 2px dotted black;\n}\n.one-arg {\n  width: 15px;\n  height: 49%;\n  depth: 50% - 1%;\n}\n.no-args {\n  width: 5px;\n  height: 49%;\n  depth: 50% - 1%;\n}\n.var-args {\n  width: 45;\n  height: 8%;\n  depth: 18 / 2 - 1%;\n}\n.multi-mix {\n  width: 10px;\n  height: 29%;\n  depth: 30% - 1%;\n  margin: 4;\n  padding: 5;\n}\nbody {\n  padding: 30px;\n  color: #f00;\n}\n.scope-mix {\n  width: 8;\n}\n.content {\n  width: 600px;\n}\n.content .column {\n  margin: 600px;\n}\n#same-var-name {\n  radius: 5px;\n}\n#var-inside {\n  width: 10px;\n}\n.arguments {\n  border: 1px solid black;\n  width: 1px;\n}\n.arguments2 {\n  border: 0px;\n  width: 0px;\n}\n.arguments3 {\n  border: 0px;\n  width: 0px;\n}\n.arguments4 {\n  border: 0 1 2 3 4;\n  rest: 1 2 3 4;\n  width: 0;\n}\n.edge-case {\n  border: \"{\";\n  width: \"{\";\n}\n.slash-vs-math {\n  border-radius: 2px/5px;\n  border-radius: 5px/10px;\n  border-radius: 6px;\n}\n.comma-vs-semi-colon {\n  one: a;\n  two: b, c;\n  one: d, e;\n  two: f;\n  one: g;\n  one: h;\n  one: i;\n  one: j;\n  one: k;\n  two: l;\n  one: m, n;\n  one: o, p;\n  two: q;\n  one: r, s;\n  two: t;\n}\n#named-conflict {\n  four: a, 11, 12, 13;\n  four: a, 21, 22, 23;\n}\n.test-rule-mixin-default-arg {\n  defaults: 1px 1px 1px;\n  defaults: 2px 2px 2px;\n}\n.selector {\n  margin: 2, 2, 2, 2;\n}\n.selector2 {\n  margin: 2, 2, 2, 2;\n}\n.selector3 {\n  margin: 4;\n}\nmixins-args-expand-op-1 {\n  m3: 1, 2, 3;\n}\nmixins-args-expand-op-2 {\n  m3: 4, 5, 6;\n}\nmixins-args-expand-op-3a {\n  m3: a, b, c;\n}\nmixins-args-expand-op-3b {\n  m4: 0, a, b, c;\n}\nmixins-args-expand-op-3c {\n  m4: a, b, c, 4;\n}\nmixins-args-expand-op-4a {\n  m3: a, b, c, d;\n}\nmixins-args-expand-op-4b {\n  m4: 0, a, b, c, d;\n}\nmixins-args-expand-op-4c {\n  m4: a, b, c, d, 4;\n}\nmixins-args-expand-op-5a {\n  m3: 1, 2, 3;\n}\nmixins-args-expand-op-5b {\n  m4: 0, 1, 2, 3;\n}\nmixins-args-expand-op-5c {\n  m4: 1, 2, 3, 4;\n}\nmixins-args-expand-op-6 {\n  m4: 0, 1, 2, 3;\n}\nmixins-args-expand-op-7 {\n  m4: 0, 1, 2, 3;\n}\nmixins-args-expand-op-8 {\n  m4: 1, 1.5, 2, 3;\n}\nmixins-args-expand-op-9 {\n  aa: 4 5 6 1 2 3 and again 4 5 6;\n  a4: and;\n  a8: 5;\n}\n#test-mixin-matching-when-default-2645 {\n  height: 20px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math/strict/parens.css",
    "content": ".parens-issues-3616 {\n  bar: 888 / 444;\n  bar2: 2;\n  bar3: 2;\n}\n.parens {\n  border: 2px solid black;\n  margin: 1px 3px 16 3;\n  width: 36;\n  padding: 2px 36px;\n}\n.more-parens {\n  padding: 8 4 4 4px;\n  width-all: 96;\n  width-first: 16 * 6;\n  width-keep: 16 * 6;\n  height: calc(100% + (25vh - 20px));\n  height-keep: 49 + 64;\n  height-all: 113;\n  height-parts: 49 + 64;\n  margin-keep: 20 - 8;\n  margin-parts: 20 - 8;\n  margin-all: 12;\n  border-radius-keep: 4px * 2 / 4 + 3px;\n  border-radius-parts: 8px / 7px;\n  border-radius-all: 5px;\n}\n.negative {\n  neg-var: -1;\n  neg-var-paren: -1;\n}\n.nested-parens {\n  width: 2 * 36 - 1;\n  height: 5 + 1;\n}\n.mixed-units {\n  margin: 2px 4em 1 5pc;\n  padding: 6px 1em 2px 2;\n}\n.test-rule-false-negatives {\n  a: (;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math-always/mixins-guards.less",
    "content": "// https://github.com/less/less.js/issues/2798\n.test-rule-2798 when ((8+4) < 13) { \n  regression: fixed; \n}\n.test-rule-2798 when ((8+6) < 13) { \n  regression: should not be visible; \n}\n.conditions-parser-1 when (8+4 < 13) {\n  only-atomic: ok;\n}\n.conditions-parser-1 when (8+6 < 13) {\n  only-atomic: should not be visible;\n}\n.conditions-parser-2 when (8+(5-1) < 13) {\n  only-atomic-with-nested-parenthesis: ok;\n}\n.conditions-parser-2 when (8+(15-1) < 13) {\n  only-atomic-with-nested-parenthesis: should not be visible;\n}\n.conditions-parser-3 when (8 < (13+1)) {\n  only-atomic-nested-parenthesis-on-right: ok;\n}\n.conditions-parser-3 when (8 < (3+1)) {\n  only-atomic-nested-parenthesis-on-right: should not be visible;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math-always/no-sm-operations.less",
    "content": ".named-colors-in-expressions {\n    color-0: 0 -red;  \n    color-1: 1 - red; \n    color-2: red * 2;\n    color-3: 2 * red;\n    @3: -red;\n    &-bar@{3} {x: y}\n    @color: red;\n    &-bar@{color} {a: a};\n    background-color: blue-2;\n    color: green-black;\n    animation: blue-change 5s infinite;\n}\n.division {\n    value: ((16px ./ 2) / 2) / 2;\n}"
  },
  {
    "path": "packages/test-data/tests-config/math-always/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"always\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/math-parens-division/media-math.less",
    "content": "@var: 10 + 6;\n\n@media (min-width: @var + 1) {\n  .foo { bar: 1; }\n}\n\n@media (min-width: @var / 9) {\n  .foo { bar: 1; }\n}"
  },
  {
    "path": "packages/test-data/tests-config/math-parens-division/mixins-args.less",
    "content": ".mixin (@a: 1px, @b: 50%) {\n  width: (@a * 5);\n  height: (@b - 1%);\n  depth: @b - 1%;\n}\n\n.mixina (@style, @width, @color: black) {\n    border: @width @style @color;\n}\n\n.mixiny\n(@a: 0, @b: 0) {\n  margin: @a;\n  padding: @b;\n}\n\n.hidden() {\n  color: transparent; // asd\n}\n\n#hidden {\n  .hidden();\n}\n\n#hidden1 {\n  .hidden();\n}\n\n.two-args {\n  color: blue;\n  .mixin(2px, 100%);\n  .mixina(dotted, 2px);\n}\n\n.one-arg {\n  .mixin(3px);\n}\n\n.no-args {\n  .mixin();\n}\n\n.var-args {\n  @var: 9;\n  .mixin(@var, (@var * 2) / 2);\n}\n\n.multi-mix {\n  .mixin(2px, 30%);\n  .mixiny(4, 5);\n}\n\n.maxa(@arg1: 10, @arg2: #f00) {\n  padding: (@arg1 * 2px);\n  color: @arg2;\n}\n\nbody {\n  .maxa(15);\n}\n\n@glob: 5;\n.global-mixin(@a:2) {\n  width: (@glob + @a);\n}\n\n.scope-mix {\n  .global-mixin(3);\n}\n\n.nested-ruleset (@width: 200px) {\n    width: @width;\n    .column { margin: @width; }\n}\n.content {\n    .nested-ruleset(600px);\n}\n\n//\n\n.same-var-name2(@radius) {\n  radius: @radius;\n}\n.same-var-name(@radius) {\n  .same-var-name2(@radius);\n}\n#same-var-name {\n  .same-var-name(5px);\n}\n\n//\n\n.var-inside () {\n    @var: 10px;\n    width: @var;\n}\n#var-inside { .var-inside(); }\n\n.mixin-arguments (@width: 0px, ...) {\n    border: @arguments;\n    width: @width;\n}\n\n.arguments {\n    .mixin-arguments(1px, solid, black);\n}\n.arguments2 {\n    .mixin-arguments();\n}\n.arguments3 {\n    .mixin-arguments();\n}\n\n.mixin-arguments2 (@width, @rest...) {\n    border: @arguments;\n    rest: @rest;\n    width: @width;\n}\n.arguments4 {\n    .mixin-arguments2(0, 1, 2, 3, 4);\n}\n\n// Edge cases\n\n.edge-case {\n    .mixin-arguments(\"{\");\n}\n\n// Division vs. Literal Slash\n.border-radius(@r: 2px/5px) {\n  border-radius: @r;\n}\n.slash-vs-math {\n  .border-radius();\n  .border-radius(5px/10px);\n  .border-radius((3px * 2));\n}\n// semi-colon vs comma for delimiting\n\n.mixin-takes-one(@a) {\n    one: @a;\n}\n\n.mixin-takes-two(@a; @b) {\n    one: @a;\n    two: @b;\n}\n\n.comma-vs-semi-colon {\n    .mixin-takes-two(@a : a; @b : b, c);\n    .mixin-takes-two(@a : d, e; @b : f);\n    .mixin-takes-one(@a: g);\n    .mixin-takes-one(@a : h;);\n    .mixin-takes-one(i);\n    .mixin-takes-one(j;);\n    .mixin-takes-two(k, l);\n    .mixin-takes-one(m, n;);\n    .mixin-takes-two(o, p; q);\n    .mixin-takes-two(r, s; t;);\n}\n\n.mixin-conflict(@a:defA, @b:defB, @c:defC) {\n  three: @a, @b, @c;\n}\n\n.mixin-conflict(@a:defA, @b:defB, @c:defC, @d:defD) {\n  four: @a, @b, @c, @d;\n}\n\n#named-conflict {\n  .mixin-conflict(11, 12, 13, @a:a);\n  .mixin-conflict(@a:a, 21, 22, 23);\n}\n@a: 3px;\n.mixin-default-arg(@a: 1px, @b: @a, @c: @b) {\n  defaults: 1px 1px 1px;\n  defaults: 2px 2px 2px;\n}\n\n.test-rule-mixin-default-arg {\n  .mixin-default-arg();\n  .mixin-default-arg(2px);\n}\n\n.mixin-comma-default1(@color; @padding; @margin: 2, 2, 2, 2) {\n  margin: @margin;\n}\n.selector {\n  .mixin-comma-default1(#33acfe; 4);\n}\n.mixin-comma-default2(@margin: 2, 2, 2, 2;) {\n  margin: @margin;\n}\n.selector2 {\n  .mixin-comma-default2();\n}\n.mixin-comma-default3(@margin: 2, 2, 2, 2) {\n  margin: @margin;\n}\n.selector3 {\n  .mixin-comma-default3(4,2,2,2);\n}\n\n.test-rule-calling-one-arg-mixin(@a) {\n}\n\n.test-rule-calling-one-arg-mixin(@a, @b, @rest...) {\n}\n\ndiv {\n  .test-rule-calling-one-arg-mixin(1);\n}\n\nmixins-args-expand-op- {\n  @x: 1, 2, 3;\n  @y: 4  5  6;\n\n  &1 {.m3(@x...)}\n  &2 {.m3(@y...)}\n  &3 {.wr(a, b, c)}\n  &4 {.wr(a; b; c, d)}\n  &5 {.wr(@x...)}\n  &6 {.m4(0; @x...)}\n  &7 {.m4(@x..., @a: 0)}\n  &8 {.m4(@b: 1.5; @x...)}\n  &9 {.aa(@y, @x..., and again, @y...)}\n\n  .m3(@a, @b, @c) {\n    m3: @a, @b, @c;\n  }\n\n  .m4(@a, @b, @c, @d) {\n    m4: @a, @b, @c, @d;\n  }\n\n  .wr(@a...) {\n    &a {.m3(@a...)}\n    &b {.m4(0, @a...)}\n    &c {.m4(@a..., 4)}\n  }\n\n  .aa(@a...) {\n    aa: @a;\n    a4: extract(@a, 5);\n    a8: extract(@a, 8);\n  }\n}\n#test-mixin-matching-when-default-2645 {\n  .mixin(@height) {\n    height: @height;\n  }\n\n  .mixin(@width, @height: 10px) {\n    width: @width;\n\n    .mixin(@height: @height);\n  }\n\n  .mixin(@height: 20px);\n}"
  },
  {
    "path": "packages/test-data/tests-config/math-parens-division/new-division.less",
    "content": ".units {\n  font: 1.2rem/2rem;\n  font: 8vw/9vw;\n  font: 10vh/12vh;\n  font: 12vm/15vm;\n  font: 12vmin/15vmin;\n  font: 1.2ch/1.5ch;\n}\n\n.math {\n  a: 1 + 1;\n  b: 2px / 2;\n  c: 2px ./ 2;\n  d: (10px / 10px);\n  e: ((16px ./ 2) / 2) / 2;\n  f: ((16px ./ 2) / 2) ./ 2;\n}"
  },
  {
    "path": "packages/test-data/tests-config/math-parens-division/parens.less",
    "content": ".parens-issues-3616 {\n  bar: if(false, 666, 888 / 444);\n  bar2: if(false, 666, (666 / 333));\n  bar3: if(false, 666, ((444 / 222)));\n}\n\n.parens {\n  @var: 1px;\n  border: (@var * 2) solid black;\n  margin: (@var * 1) (@var + 2) (4 * 4) 3;\n  width: (6 * 6);\n  padding: 2px (6 * 6px);\n}\n\n.more-parens {\n  @var: (2 * 2);\n  padding: (2 * @var) 4 4 (@var * 1px);\n  width-all: ((@var * @var) * 6);\n  width-first: ((@var * @var)) * 6;\n  width-keep: (@var * @var) * 6;\n  height: calc(100% + (25vh - 20px));\n  height-keep: (7 * 7) + (8 * 8);\n  height-all: ((7 * 7) + (8 * 8));\n  height-parts: ((7 * 7)) + ((8 * 8));\n  margin-keep: (4 * (5 + 5) / 2) - (@var * 2);\n  margin-parts: ((4 * (5 + 5) / 2)) - ((@var * 2));\n  margin-all: ((4 * (5 + 5) / 2) + (-(@var * 2)));\n  border-radius-keep: 4px * (1 + 1) / @var + 3px;\n  border-radius-parts: ((4px * (1 + 1))) / ((@var + 3px));\n  border-radius-all: (4px * (1 + 1) / @var + 3px);\n  // margin: (6 * 6)px;\n}\n\n.negative {\n  @var: 1;\n  neg-var: -@var; // -1 ?\n  neg-var-paren: -(@var); // -(1) ?\n}\n\n.nested-parens {\n  width: 2 * (4 * (2 + (1 + 6))) - 1;\n  height: ((2 + 3) * (2 + 3) / (9 - 4)) + 1;\n}\n\n.mixed-units {\n  margin: 2px 4em 1 5pc;\n  padding: (2px + 4px) 1em 2px 2;\n}\n\n.test-rule-false-negatives {\n  a: ~\"(\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math-parens-division/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"parens-division\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/math-strict/css.less",
    "content": "@charset \"utf-8\";\ndiv { color: black; }\ndiv { width: 99%; }\n\n* {\n  min-width: 45em;\n}\n\nh1, h2 > a > p, h3 {\n  color: none;\n}\n\ndiv.class {\n  color: blue;\n}\n\ndiv#id {\n  color: green;\n}\n\n.class#id {\n  color: purple;\n}\n\n.one.two.three {\n  color: grey;\n}\n\n@media print {\n  * {\n    font-size: 3em;\n  }\n}\n\n@media screen {\n  * {\n    font-size: 10px;\n  }\n}\n\n@font-face {\n  font-family: 'Garamond Pro';\n}\n\na:hover, a:link {\n  color: #999;\n}\n\np, p:first-child {\n  text-transform: none;\n}\n\nq:lang(no) {\n  quotes: none;\n}\n\np + h1 {\n  font-size: +2.2em;\n}\n\n#shorthands {\n  border: 1px solid #000;\n  font: 12px/16px Arial;\n  font: 100%/16px Arial;\n  margin: 1px 0;\n  padding: 0 auto;\n}\n\n#more-shorthands {\n  margin: 0;\n  padding: 1px 0 2px 0;\n  font: normal small/20px 'Trebuchet MS', Verdana, sans-serif;\n  font: 0/0 a;\n  border-radius: 5px / 10px;\n}\n\n.misc {\n  -moz-border-radius: 2px;\n  display: -moz-inline-stack;\n  width: .1em;\n  background-color: #009998;\n  background: -webkit-gradient(linear, left top, left bottom, from(red), to(blue));\n  margin: ;\n  .nested-multiple {\n    multiple-semi-colons: yes;;;;;;\n  };\n  filter: alpha(opacity=100);\n  width: auto\\9;\n}\n\n#important {\n  color: red !important;\n  width: 100%!important;\n  height: 20px ! important;\n}\n\n.def-font(@name) {\n    @font-face {\n        font-family: @name\n    }\n}\n\n.def-font(font-a);\n.def-font(font-b);\n\n.æøå {\n  margin: 0;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math-strict/media-math.less",
    "content": "@var: 16;\n\n@media (min-width: @var + 1) {\n  .foo { bar: 1; }\n}\n\n@media (min-width: @var / 9) {\n  .foo { bar: 1; }\n}"
  },
  {
    "path": "packages/test-data/tests-config/math-strict/mixins-args.less",
    "content": ".mixin (@a: 1px, @b: 50%) {\n  width: (@a * 5);\n  height: (@b - 1%);\n  depth: @b - 1%;\n}\n\n.mixina (@style, @width, @color: black) {\n    border: @width @style @color;\n}\n\n.mixiny\n(@a: 0, @b: 0) {\n  margin: @a;\n  padding: @b;\n}\n\n.hidden() {\n  color: transparent; // asd\n}\n\n#hidden {\n  .hidden();\n}\n\n#hidden1 {\n  .hidden();\n}\n\n.two-args {\n  color: blue;\n  .mixin(2px, 100%);\n  .mixina(dotted, 2px);\n}\n\n.one-arg {\n  .mixin(3px);\n}\n\n.no-args {\n  .mixin();\n}\n\n.var-args {\n  @var: 9;\n  .mixin(@var, (@var * 2) / 2);\n}\n\n.multi-mix {\n  .mixin(2px, 30%);\n  .mixiny(4, 5);\n}\n\n.maxa(@arg1: 10, @arg2: #f00) {\n  padding: (@arg1 * 2px);\n  color: @arg2;\n}\n\nbody {\n  .maxa(15);\n}\n\n@glob: 5;\n.global-mixin(@a:2) {\n  width: (@glob + @a);\n}\n\n.scope-mix {\n  .global-mixin(3);\n}\n\n.nested-ruleset (@width: 200px) {\n    width: @width;\n    .column { margin: @width; }\n}\n.content {\n    .nested-ruleset(600px);\n}\n\n//\n\n.same-var-name2(@radius) {\n  radius: @radius;\n}\n.same-var-name(@radius) {\n  .same-var-name2(@radius);\n}\n#same-var-name {\n  .same-var-name(5px);\n}\n\n//\n\n.var-inside () {\n    @var: 10px;\n    width: @var;\n}\n#var-inside { .var-inside(); }\n\n.mixin-arguments (@width: 0px, ...) {\n    border: @arguments;\n    width: @width;\n}\n\n.arguments {\n    .mixin-arguments(1px, solid, black);\n}\n.arguments2 {\n    .mixin-arguments();\n}\n.arguments3 {\n    .mixin-arguments();\n}\n\n.mixin-arguments2 (@width, @rest...) {\n    border: @arguments;\n    rest: @rest;\n    width: @width;\n}\n.arguments4 {\n    .mixin-arguments2(0, 1, 2, 3, 4);\n}\n\n// Edge cases\n\n.edge-case {\n    .mixin-arguments(\"{\");\n}\n\n// Division vs. Literal Slash\n.border-radius(@r: 2px/5px) {\n  border-radius: @r;\n}\n.slash-vs-math {\n  .border-radius();\n  .border-radius(5px/10px);\n  .border-radius((3px * 2));\n}\n// semi-colon vs comma for delimiting\n\n.mixin-takes-one(@a) {\n    one: @a;\n}\n\n.mixin-takes-two(@a; @b) {\n    one: @a;\n    two: @b;\n}\n\n.comma-vs-semi-colon {\n    .mixin-takes-two(@a : a; @b : b, c);\n    .mixin-takes-two(@a : d, e; @b : f);\n    .mixin-takes-one(@a: g);\n    .mixin-takes-one(@a : h;);\n    .mixin-takes-one(i);\n    .mixin-takes-one(j;);\n    .mixin-takes-two(k, l);\n    .mixin-takes-one(m, n;);\n    .mixin-takes-two(o, p; q);\n    .mixin-takes-two(r, s; t;);\n}\n\n.mixin-conflict(@a:defA, @b:defB, @c:defC) {\n  three: @a, @b, @c;\n}\n\n.mixin-conflict(@a:defA, @b:defB, @c:defC, @d:defD) {\n  four: @a, @b, @c, @d;\n}\n\n#named-conflict {\n  .mixin-conflict(11, 12, 13, @a:a);\n  .mixin-conflict(@a:a, 21, 22, 23);\n}\n@a: 3px;\n.mixin-default-arg(@a: 1px, @b: @a, @c: @b) {\n  defaults: 1px 1px 1px;\n  defaults: 2px 2px 2px;\n}\n\n.test-rule-mixin-default-arg {\n  .mixin-default-arg();\n  .mixin-default-arg(2px);\n}\n\n.mixin-comma-default1(@color; @padding; @margin: 2, 2, 2, 2) {\n  margin: @margin;\n}\n.selector {\n  .mixin-comma-default1(#33acfe; 4);\n}\n.mixin-comma-default2(@margin: 2, 2, 2, 2;) {\n  margin: @margin;\n}\n.selector2 {\n  .mixin-comma-default2();\n}\n.mixin-comma-default3(@margin: 2, 2, 2, 2) {\n  margin: @margin;\n}\n.selector3 {\n  .mixin-comma-default3(4,2,2,2);\n}\n\n.test-rule-calling-one-arg-mixin(@a) {\n}\n\n.test-rule-calling-one-arg-mixin(@a, @b, @rest...) {\n}\n\ndiv {\n  .test-rule-calling-one-arg-mixin(1);\n}\n\nmixins-args-expand-op- {\n  @x: 1, 2, 3;\n  @y: 4  5  6;\n\n  &1 {.m3(@x...)}\n  &2 {.m3(@y...)}\n  &3 {.wr(a, b, c)}\n  &4 {.wr(a; b; c, d)}\n  &5 {.wr(@x...)}\n  &6 {.m4(0; @x...)}\n  &7 {.m4(@x..., @a: 0)}\n  &8 {.m4(@b: 1.5; @x...)}\n  &9 {.aa(@y, @x..., and again, @y...)}\n\n  .m3(@a, @b, @c) {\n    m3: @a, @b, @c;\n  }\n\n  .m4(@a, @b, @c, @d) {\n    m4: @a, @b, @c, @d;\n  }\n\n  .wr(@a...) {\n    &a {.m3(@a...)}\n    &b {.m4(0, @a...)}\n    &c {.m4(@a..., 4)}\n  }\n\n  .aa(@a...) {\n    aa: @a;\n    a4: extract(@a, 5);\n    a8: extract(@a, 8);\n  }\n}\n#test-mixin-matching-when-default-2645 {\n  .mixin(@height) {\n    height: @height;\n  }\n\n  .mixin(@width, @height: 10px) {\n    width: @width;\n\n    .mixin(@height: @height);\n  }\n\n  .mixin(@height: 20px);\n}"
  },
  {
    "path": "packages/test-data/tests-config/math-strict/parens.less",
    "content": ".parens-issues-3616 {\n  bar: if(false, 666, 888 / 444);\n  bar2: if(false, 666, (666 / 333));\n  bar3: if(false, 666, ((444 / 222)));\n}\n\n.parens {\n  @var: 1px;\n  border: (@var * 2) solid black;\n  margin: (@var * 1) (@var + 2) (4 * 4) 3;\n  width: (6 * 6);\n  padding: 2px (6 * 6px);\n}\n\n.more-parens {\n  @var: (2 * 2);\n  padding: (2 * @var) 4 4 (@var * 1px);\n  width-all: ((@var * @var) * 6);\n  width-first: ((@var * @var)) * 6;\n  width-keep: (@var * @var) * 6;\n  height: calc(100% + (25vh - 20px));\n  height-keep: (7 * 7) + (8 * 8);\n  height-all: ((7 * 7) + (8 * 8));\n  height-parts: ((7 * 7)) + ((8 * 8));\n  margin-keep: (4 * (5 + 5) / 2) - (@var * 2);\n  margin-parts: ((4 * (5 + 5) / 2)) - ((@var * 2));\n  margin-all: ((4 * (5 + 5) / 2) + (-(@var * 2)));\n  border-radius-keep: 4px * (1 + 1) / @var + 3px;\n  border-radius-parts: ((4px * (1 + 1))) / ((@var + 3px));\n  border-radius-all: (4px * (1 + 1) / @var + 3px);\n  // margin: (6 * 6)px;\n}\n\n.negative {\n  @var: 1;\n  neg-var: -@var; // -1 ?\n  neg-var-paren: -(@var); // -(1) ?\n}\n\n.nested-parens {\n  width: 2 * (4 * (2 + (1 + 6))) - 1;\n  height: ((2 + 3) * (2 + 3) / (9 - 4)) + 1;\n}\n\n.mixed-units {\n  margin: 2px 4em 1 5pc;\n  padding: (2px + 4px) 1em 2px 2;\n}\n\n.test-rule-false-negatives {\n  a: ~\"(\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/math-strict/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"parens\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/modifyVars/extended.css",
    "content": "#header {\n  color: #333333;\n  border-left: 1px;\n  border-right: 2px;\n}\n#footer {\n  color: #114411;\n  border-color: #842210;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/modifyVars/extended.json",
    "content": "{\n    \"the-border\": \"1px\",\n    \"base-color\": \"#111\",\n    \"red\": \"#842210\"\n}"
  },
  {
    "path": "packages/test-data/tests-config/modifyVars/extended.less",
    "content": "#header {\n  color: (@base-color * 3);\n  border-left: @the-border;\n  border-right: (@the-border * 2);\n}\n#footer {\n  color: (@base-color + #003300);\n  border-color: @red;\n}\n@red: blue; // var is overridden by the modifyVars\n//@base-color: green;"
  },
  {
    "path": "packages/test-data/tests-config/modifyVars/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            modifyVars: {\n                'the-border': '1px',\n                'base-color': '#111',\n                'red': '#842210'\n            }\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/imports/a-better-bootstrap.less",
    "content": "#theme() {\n  .light() {} //...\n  .dark() {\n    // ...\n    .navbar() {\n      .colors() {\n        primary: blue;\n        secondary: lightblue;\n      }\n    }\n    // ...\n  }\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/imports/library.less",
    "content": "\n// I am a library\n#library {\n  .sizes() {\n    @width: 600px;\n  }\n  .add-one(@val) {\n    @return: @val + 1px;\n  }\n  .sizes(@test) when (@test = true) {\n    @width: 400px;\n  }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-1.css",
    "content": ".foo {\n  color1: red;\n  color2: yellow;\n  color3: red;\n  color4: yellow;\n  color5: red;\n  prop: uno;\n  var: dos;\n  sub: tres;\n}\n#ns1 {\n  foo: bar;\n}\n#ns1 {\n  foo: uno;\n}\n.button {\n  color: grey;\n  border-color: #AAA #CCC;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-1.less",
    "content": "@varToGet: default-color;\n.foo {\n  color1: @defaults[@default-color];\n  color2: @defaults[@nested][@color];\n  color3: @theme[color];\n  color4: @theme[@nested][color];\n  color5: @defaults[@@varToGet];\n  prop: #ns1[foo];\n  var: #ns1[@foo];\n  sub: #ns1.vars[$sub];\n}\n\n@defaults: {\n  @default-color: red;\n  @nested: {\n    @color: yellow;\n  }\n};\n\n@theme: {\n  color: red;\n  @nested: {\n    color: yellow;\n  }\n};\n\n#ns1 {\n  foo: bar;\n  @foo: baz;\n  .vars() {\n    sub: value;\n  }\n}\n\n// Test that it matches more than one mixin\n#ns1 {\n  foo: uno;\n  @foo: dos;\n  .vars() {\n    sub: tres;\n  }\n}\n\n// https://github.com/less/less.js/issues/3346\n#DEF() {\n  .colors() { primary: grey; }\n}\n\n.button {\n  color: #DEF.colors[primary];\n  border-color: #AAA #CCC;\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-2.css",
    "content": ".bar {\n  width: 800px;\n  height: 2px;\n}\n.foo {\n  width: 800px;\n}\n.lunch {\n  treat: ice cream;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-2.less",
    "content": "@import \"imports/library.less\";\n\n.bar {\n  width: #library.sizes[@width];\n  height: #library.add-one(1px)[@return];\n}\n\n// I'm gonna override some values\n#library {\n  .sizes() {\n    @width: 800px;\n  }\n}\n\n.foo {\n  width: #library.sizes[@width];\n}\n\n.foods() {\n  @dessert: ice cream;\n}\n\n@key-to-lookup: dessert;\n\n.lunch {\n  treat: .foods[@@key-to-lookup];\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-3.css",
    "content": "@media (min-width: 320px) {\n  .toolbar {\n    width: 400px;\n    height: 200px;\n    background: red;\n    color: inherit;\n  }\n}\n.cell {\n  margin: 0 5px !important;\n}\n.class1 {\n  color: #33acfe !important;\n  margin: 20px !important;\n  padding: 20px !important;\n  width: 0 !important;\n}\n.class2 {\n  color: #efca44;\n  margin: 10px;\n  padding: 40px 10px;\n  width: 0 !important;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-3.less",
    "content": "@map: {\n  @width: 400px;\n  @colors: {\n    toolbar-background: red;\n    toolbar-foreground: inherit;\n  }\n};\n\n#ns {\n  .mixin() {\n    @height: 200px;\n  }\n}\n\n@breakpoints: {\n  mobile: 320px;\n  tablet: 768px;\n  desktop: 1024px;\n};\n\n@media (min-width: @breakpoints[mobile]) {\n  .toolbar {\n    width: @map[@width];\n    height: #ns.mixin[@height];\n    background: @map[@colors][toolbar-background];\n    color: @map[@colors][toolbar-foreground];\n  }\n}\n\n// !important after map usage\n// https://github.com/less/less.js/issues/3430\n@margins: {\n    zero: 0;\n    ten: 10px;\n}\n.cell {\n  margin: @margins[zero] (@margins[ten]/2) !important;\n}\n\n.mixin(@color: black; @margin: 10px; @padding: 20px) {\n  color: @color;\n  margin: @margin;\n  padding: @padding;\n  width: @margins[zero] !important\n}\n.class1 {\n  .mixin(@margin: 20px; @color: #33acfe) !important;\n}\n.class2 {\n  .mixin(#efca44; @padding: 40px 10px);\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-4.css",
    "content": ".foo {\n  width: 20px;\n  background: rebeccapurple;\n  color: inherit;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-4.less",
    "content": "#ns {\n  .mixin(@a) when (@a = 1) {\n    @a: 20px;\n  }\n}\n\n.alias() {\n  #ns.mixin(1);\n}\n\n#library {\n  .core() {\n    .colors() {\n      primary: blue;\n      foreground: inherit;\n    }\n  }\n}\n\n#library {\n  .core() {\n    .colors() {\n      primary: rebeccapurple;\n    }\n  }\n}\n\n.foo {\n  .colors() { #library.core.colors(); }\n  width: .alias[@a];\n  background: .colors[primary];\n  color: .colors[foreground];\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-5.css",
    "content": ".my-navbar {\n  background: rebeccapurple;\n  val: output;\n}\n.another-navbar {\n  background: rebeccapurple !important;\n  border: 1px solid lightblue !important;\n}\n.another {\n  background: black;\n  border: 1px solid grey;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-5.less",
    "content": "@import \"imports/a-better-bootstrap\";\n\n#theme.dark.navbar {\n  .colors() {\n    primary: rebeccapurple;\n  }\n  .colors(dark) {\n    primary: black;\n    secondary: grey;\n  }\n  .test-rule() {\n    val: output;\n  }\n}\n\n.my-navbar {\n  #theme.dark.navbar();\n  background: .colors[primary];\n  .test-rule();\n}\n\n.another-navbar {\n  @colors: #theme.dark.navbar.colors() !important;\n  background: @colors[primary];\n  border: 1px solid @colors[secondary];\n}\n\n.another {\n  @colors: #theme.dark.navbar.colors(dark);\n  background: @colors[primary];\n  border: 1px solid @colors[secondary];\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-6.css",
    "content": ".rule-1 {\n  width: 10px;\n}\n.rule-2 {\n  width: 10px;\n}\n.rule-3 {\n  width: 10px;\n  height: 10px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-6.less",
    "content": ".wrapper(@another-mixin) {\n  @another-mixin();\n}\n\n.something(foo) {\n  width: 10px;\n}\n\n.output-height() {\n  height: 10px;\n}\n\n.rule-1 {\n  @alias: .something(foo);\n  @alias();\n}\n\n.rule-2 {\n  @alias: .something(foo);\n  .wrapper(@alias);\n}\n\n.rule-3 {\n  .wrapper(.something(foo));\n  .wrapper(.output-height());\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-7.css",
    "content": ".output {\n  a: b;\n}\n.output-2 {\n  c: d;\n}\n.dr {\n  a: b;\n}\n.dr-2 {\n  c: d;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-7.less",
    "content": "#ns {\n  .options() {\n    option: true;\n  }\n}\n\n@ns: {\n  @options: {\n    option: true;\n  };\n};\n\n& when (#ns.options[option]) {\n  .output {\n    a: b;\n  }\n}\n\n& when (#ns.options[option] = true) {\n  .output-2 {\n    c: d;\n  }\n}\n\n& when (#ns.options[option] = false) {\n  .no-reach {\n    c: d;\n  }\n}\n\n// DR access\n& when (@ns[@options][option]) {\n  .dr {\n    a: b;\n  }\n}\n\n& when (@ns[@options][option] = true) {\n  .dr-2 {\n    c: d;\n  }\n}\n\n& when (@ns[@options][option] = false) {\n  .dr-no-reach {\n    c: d;\n  }\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-8.css",
    "content": ":root {\n  --background-color: black;\n  --color: #fff;\n}\ndiv {\n  display: inline-block;\n  padding: 1rem;\n  background-color: var(--background-color);\n  color: var(--color);\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-8.less",
    "content": "// see: https://github.com/less/less.js/issues/3368\n@vars: {\n  background-color: black;\n  color: contrast($background-color, #000, #fff);\n}\n  \n:root {\n  each(@vars, {\n    --@{key}: @value;\n  });\n}\n\ndiv {\n  display: inline-block;\n  padding: 1rem;\n  background-color: var(--background-color);\n  color: var(--color);\n}\n\n// see: https://github.com/less/less.js/issues/3339\n// still fails - move to 4.0\n// @components: {\n//   columns: true;\n//   ratios: false;\n// };\n\n// each(@components, {\n//   & when (@value = true) {\n//       @import (optional) \"components/@{key}.less\";\n//   }\n// });"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-functions.css",
    "content": ".foo {\n  width: 20px;\n  bar: val;\n}\n.bar {\n  width: test;\n}\n.example {\n  value: lookup;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-functions.less",
    "content": ".add(@a, @b) {\n  @r: @a + @b;\n}\n.foo {\n  width: .add(10px, 10px)[];\n  bar: @return[];\n}\n\n@return: {\n  single: val;\n}\n\n// Issue #3405\n#lookup {\n  @prop: test;\n}\n\n.mix (@var) {\n  width: @var;\n}\n\n.bar {\n  .mix(#lookup[@prop]);\n}\n\n// Issue #3406\n.mix2 (@n) {\n  value: @n;\n}\n#lookup2 {\n  @var: .mix2(lookup);\n}\n.example {\n  // #lookup[@var](); -- fails, need the following alias\n  @dr: #lookup2[@var];\n  @dr();\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-media.css",
    "content": "@media not all and (min-width: 480px) {\n  .selector {\n    prop: val;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-media.less",
    "content": "#ns {\n  .sizes() {\n    @small: 600px;\n  }\n  .breakpoint(@size) {\n    @val: #ns.sizes[@@size];\n    @min: (min-width: @val);\n    @max: not all and @min;\n  }\n}\n\n#ns {\n  .sizes() {\n    @small: 480px;\n  }\n}\n\n.valToGet() {\n  keyword: small;\n}\n\n@media #ns.breakpoint(.valToGet[])[@max] {\n  .selector {\n    prop: val;\n  }\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-operations.css",
    "content": ".foo {\n  val: 35px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/namespacing-operations.less",
    "content": "#ns {\n  .options() {\n    val1: 10px;\n  }\n}\n\n@ns: {\n  @options: {\n    val2: 20px;\n  }\n}\n\n.foo {\n  val: #ns.options[val1] + @ns[@options][val2] + 5px;\n}"
  },
  {
    "path": "packages/test-data/tests-config/namespacing/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/no-js-errors/no-js-errors.less",
    "content": ".a {\n  a: `1 + 1`;\n}"
  },
  {
    "path": "packages/test-data/tests-config/no-js-errors/no-js-errors.txt",
    "content": "SyntaxError: Inline JavaScript is not enabled. Is it set in your options? in {path}no-js-errors.less on line 2, column 6:\n1 .a {\n2   a: `1 + 1`;\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-config/no-js-errors/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            math: 'strict',\n            strictUnits: true,\n            javascriptEnabled: false\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/postProcessorPlugin/postProcessor.css",
    "content": "hr {height:50px;}\n.test-rule {\n  color: inherit;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/postProcessorPlugin/postProcessor.less",
    "content": "@color: inherit;\n.test-rule {\n    color: @color;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/postProcessorPlugin/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"plugin\": \"test/plugins/postprocess/index.cjs\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/preProcessorPlugin/preProcessor.css",
    "content": ".test-rule {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/preProcessorPlugin/preProcessor.less",
    "content": ".test-rule {\n    color: @color;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/preProcessorPlugin/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"plugin\": \"test/plugins/preprocess/index.cjs\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/process-imports/google.css",
    "content": ".a {\n  b: c;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/process-imports/google.less",
    "content": "@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');\n\n.a { b: c; }"
  },
  {
    "path": "packages/test-data/tests-config/process-imports/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"processImports\": false\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-all/folder/file.less",
    "content": "#imported-file {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"../../relative/path\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-all/rewrite-urls-all.css",
    "content": "#imported-file {\n  background-image: url(\"./folder/relative/path\");\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"folder/module\");\n  background-image: url(\"folder/module/path\");\n  background-image: url(\"folder/module/relative/path\");\n}\n#rewrite-urls-all {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"./path\");\n  background-image: url(\"./\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-all/rewrite-urls-all.less",
    "content": "@import \"./folder/file.less\";\n\n#rewrite-urls-all {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"./relative/../path\");\n  background-image: url(\"./relative/../path/..\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-all/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"rewriteUrls\": \"all\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-local/folder/file.less",
    "content": "#imported-file {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"../../relative/path\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-local/rewrite-urls-local.css",
    "content": "#imported-file {\n  background-image: url(\"./folder/relative/path\");\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/relative/path\");\n}\n#rewrite-urls-local {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"./path\");\n  background-image: url(\"./\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-local/rewrite-urls-local.less",
    "content": "@import \"./folder/file.less\";\n\n#rewrite-urls-local {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"./relative/../path\");\n  background-image: url(\"./relative/../path/..\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rewrite-urls-local/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"rewriteUrls\": \"local\"\n    },\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/root-registry/file.less",
    "content": "@charset \"utf-8\";"
  },
  {
    "path": "packages/test-data/tests-config/root-registry/root.less",
    "content": "// https://github.com/less/less.js/issues/3112\n@file: ext();\n@import '@{file}';"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-all/folder/file.less",
    "content": "#imported-file {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"../../relative/path\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-all/rootpath-rewrite-urls-all.css",
    "content": "#imported-file {\n  background-image: url(\"http://example.com/assets/css/folder/relative/path\");\n  background-image: url(\"http://example.com/assets/css/relative/path\");\n  background-image: url(\"http://example.com/assets/relative/path\");\n  background-image: url(\"http://example.com/assets/css/folder/module\");\n  background-image: url(\"http://example.com/assets/css/folder/module/path\");\n  background-image: url(\"http://example.com/assets/css/folder/module/relative/path\");\n}\n#rootpath-rewrite-urls-all {\n  background-image: url(\"http://example.com/assets/css/relative/path\");\n  background-image: url(\"http://example.com/assets/relative/path\");\n  background-image: url(\"http://example.com/assets/css/path\");\n  background-image: url(\"http://example.com/assets/css\");\n  background-image: url(\"http://example.com/assets/css/module\");\n  background-image: url(\"http://example.com/assets/css/module/path\");\n  background-image: url(\"http://example.com/assets/css/module/relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-all/rootpath-rewrite-urls-all.less",
    "content": "@import \"./folder/file.less\";\n\n#rootpath-rewrite-urls-all {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"./relative/../path\");\n  background-image: url(\"./relative/../path/..\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-all/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"rootpath\": \"http://example.com/assets/css/\",\n      \"rewriteUrls\": \"all\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-local/folder/file.less",
    "content": "#imported-file {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"../../relative/path\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-local/rootpath-rewrite-urls-local.css",
    "content": "#imported-file {\n  background-image: url(\"http://example.com/assets/css/folder/relative/path\");\n  background-image: url(\"http://example.com/assets/css/relative/path\");\n  background-image: url(\"http://example.com/assets/relative/path\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/relative/path\");\n}\n#rootpath-rewrite-urls-local {\n  background-image: url(\"http://example.com/assets/css/relative/path\");\n  background-image: url(\"http://example.com/assets/relative/path\");\n  background-image: url(\"http://example.com/assets/css/path\");\n  background-image: url(\"http://example.com/assets/css\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-local/rootpath-rewrite-urls-local.less",
    "content": "@import \"./folder/file.less\";\n\n#rootpath-rewrite-urls-local {\n  background-image: url(\"./relative/path\");\n  background-image: url(\"../relative/path\");\n  background-image: url(\"./relative/../path\");\n  background-image: url(\"./relative/../path/..\");\n  background-image: url(\"module\");\n  background-image: url(\"module/path\");\n  background-image: url(\"module/path/../relative/path\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/rootpath-rewrite-urls-local/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"rootpath\": \"http://example.com/assets/css/\",\n      \"rewriteUrls\": \"local\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/basic.json",
    "content": "{\n    \"my-color\": \"red\"\n}"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/basic.less",
    "content": "@var: black;\n\n.a() {\n  color: red;\n}\n\n.b {\n  color: green;\n  .a();\n  color: blue;\n  background: @var;\n}\n\n.a, .b {\n  background: green;\n  .c, .d {\n    background: gray;\n    & + & {\n      color: red;\n    }\n  }\n}\n\n.extend:extend(.a all) {\n  color: pink;\n}\n@import (inline) \"imported.css\";"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/comprehensive/comprehensive.css",
    "content": ".container {\n  padding: 20px;\n  background: #3498db;\n}\n.container .header {\n  color: white;\n  font-size: 24px;\n}\n.container .header .title {\n  font-weight: bold;\n  margin-bottom: 10px;\n}\n.container .content {\n  background: #2ecc71;\n  padding: 15px;\n}\n.container .content p {\n  margin: 0;\n  line-height: 1.5;\n}\n.calculated {\n  width: calc(100% - 20px * 2);\n  height: calc(50vh + 20px);\n  margin: 10px;\n}\n.functions {\n  color: #217dbb;\n  background: #7ee2a8;\n  border: 1px solid rgba(52, 152, 219, 0.5);\n}\n.card {\n  border-radius: 10px;\n  -webkit-border-radius: 10px;\n  -moz-border-radius: 10px;\n  box-shadow: 0 2px 15px rgba(0, 0, 0, 0.1);\n  padding: 20px;\n  background: white;\n}\n@media (max-width: 768px) {\n  .container {\n    padding: 10px;\n  }\n  .container .header {\n    font-size: 18px;\n  }\n}\n@supports (display: grid) {\n  .grid-layout {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 20px;\n  }\n}\n.button-base,\n.button-primary {\n  padding: 10px 20px;\n  border: none;\n  cursor: pointer;\n}\n.button-primary {\n  background: #3498db;\n  color: white;\n}\n.navigation ul {\n  list-style: none;\n}\n.navigation ul li {\n  display: inline-block;\n}\n.navigation ul li a {\n  text-decoration: none;\n}\n.navigation ul li a:hover {\n  color: #3498db;\n}\n.navigation ul li a:active {\n  color: #196090;\n}\n.my-component {\n  color: #3498db;\n}\n.level1 .level2 .level3 .level4 {\n  color: #2ecc71;\n}\n/*# sourceMappingURL=tests-config/sourcemaps-comprehensive/comprehensive.css.map */"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/comprehensive/comprehensive.less",
    "content": "// Comprehensive sourcemap test covering various Less.js features\n// This test exercises sourcemap generation for different code structures\n\n// Variables\n@primary-color: #3498db;\n@secondary-color: #2ecc71;\n@spacing: 20px;\n\n// Mixins\n.border-radius(@radius: 5px) {\n  border-radius: @radius;\n  -webkit-border-radius: @radius;\n  -moz-border-radius: @radius;\n}\n\n.box-shadow(@x: 0, @y: 0, @blur: 10px, @color: rgba(0,0,0,0.5)) {\n  box-shadow: @x @y @blur @color;\n}\n\n// Nested rules\n.container {\n  padding: @spacing;\n  background: @primary-color;\n  \n  .header {\n    color: white;\n    font-size: 24px;\n    \n    .title {\n      font-weight: bold;\n      margin-bottom: 10px;\n    }\n  }\n  \n  .content {\n    background: @secondary-color;\n    padding: 15px;\n    \n    p {\n      margin: 0;\n      line-height: 1.5;\n    }\n  }\n}\n\n// Operations\n.calculated {\n  width: calc(100% - @spacing * 2);\n  height: calc(50vh + 20px);\n  margin: (@spacing / 2);\n}\n\n// Functions\n.functions {\n  color: darken(@primary-color, 10%);\n  background: lighten(@secondary-color, 20%);\n  border: 1px solid fade(@primary-color, 50%);\n}\n\n// Mixins\n.card {\n  .border-radius(10px);\n  .box-shadow(0, 2px, 15px, rgba(0,0,0,0.1));\n  padding: @spacing;\n  background: white;\n}\n\n// @-rules\n@media (max-width: 768px) {\n  .container {\n    padding: (@spacing / 2);\n    \n    .header {\n      font-size: 18px;\n    }\n  }\n}\n\n@supports (display: grid) {\n  .grid-layout {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: @spacing;\n  }\n}\n\n// Extend\n.button-base {\n  padding: 10px 20px;\n  border: none;\n  cursor: pointer;\n}\n\n.button-primary {\n  &:extend(.button-base);\n  background: @primary-color;\n  color: white;\n}\n\n// Selectors with &\n.navigation {\n  ul {\n    list-style: none;\n    \n    li {\n      display: inline-block;\n      \n      a {\n        text-decoration: none;\n        \n        &:hover {\n          color: @primary-color;\n        }\n        \n        &:active {\n          color: darken(@primary-color, 20%);\n        }\n      }\n    }\n  }\n}\n\n// Import (if we have imported files)\n// @import \"imported.less\";\n\n// Variables in selectors\n@selector-name: my-component;\n.@{selector-name} {\n  color: @primary-color;\n}\n\n// Multiple levels of nesting\n.level1 {\n  .level2 {\n    .level3 {\n      .level4 {\n        color: @secondary-color;\n      }\n    }\n  }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/comprehensive/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            math: 'strict',\n            strictUnits: true,\n            sourceMap: true\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/custom-props.less",
    "content": "@color: var(--foo);\n\nbody {\n\tborder-left: 1px solid @color;\n\twidth: calc(50% - 5px);\n\tborder-top: 1px solid @color;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/imported.css",
    "content": "/*comments*/\n.unused-css {\n    color: inherit;\n}\n.imported {\n    color: black;\n}"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            math: 'strict',\n            strictUnits: true,\n            sourceMap: true,\n            globalVars: {\n                '@my-color': 'red'\n            }\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-basepath/sourcemaps-basepath.css",
    "content": ".text {\n  font-size: 16px;\n  line-height: 1.5;\n}\n.title {\n  font-weight: bold;\n}\n/*# sourceMappingURL=tests-config/sourcemaps-basepath/sourcemaps-basepath.css.map */"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-basepath/sourcemaps-basepath.less",
    "content": "@size: 16px;\n\n.text {\n  font-size: @size;\n  line-height: 1.5;\n}\n\n.title {\n  font-weight: bold;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-basepath/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            sourceMap: {\n                // Test sourceMapBasepath by setting it to a path that should be removed from source paths\n                // Since the actual file is in packages/test-data/tests-config/sourcemaps-basepath/,\n                // setting basepath to that directory should remove it from the sourcemap sources\n                sourceMapBasepath: require('path').dirname(require.resolve('./sourcemaps-basepath.less')),\n                sourceMapRootpath: 'testweb/'\n            }\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-disable-annotation/basic.less",
    "content": "body {\n  /*# sourceMappingURL=this-should-be-ok.css.map */\n  color: white;\n}"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-disable-annotation/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            math: 'strict',\n            strictUnits: true,\n            sourceMap: {\n                disableSourcemapAnnotation: true\n            }\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-empty/empty.less",
    "content": ""
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-empty/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            math: 'strict',\n            strictUnits: true,\n            sourceMap: {\n                sourceMapFileInline: true\n            }\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-empty/var-defs.less",
    "content": "@test-var: 'something';"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-include-source/sourcemaps-include-source.css",
    "content": ".button {\n  background: #007bff;\n  color: white;\n  padding: 10px 20px;\n}\n.secondary {\n  background: #6c757d;\n}\n/*# sourceMappingURL=tests-config/sourcemaps-include-source/sourcemaps-include-source.css.map */"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-include-source/sourcemaps-include-source.less",
    "content": "@primary: #007bff;\n@secondary: #6c757d;\n\n.button {\n  background: @primary;\n  color: white;\n  padding: 10px 20px;\n}\n\n.secondary {\n  background: @secondary;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-include-source/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            sourceMap: {\n                outputSourceFiles: true\n            }\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-rootpath/sourcemaps-rootpath.css",
    "content": ".container {\n  padding: 20px;\n  color: green;\n}\n.item {\n  margin: 5px;\n}\n/*# sourceMappingURL=tests-config/sourcemaps-rootpath/sourcemaps-rootpath.css.map */"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-rootpath/sourcemaps-rootpath.less",
    "content": "@var: green;\n\n.container {\n  padding: 20px;\n  color: @var;\n}\n\n.item {\n  margin: 5px;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-rootpath/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            sourceMap: {\n                sourceMapRootpath: 'https://example.com/less/'\n            }\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-url/sourcemaps-url.css",
    "content": ".header {\n  color: red;\n  background: blue;\n}\n.footer {\n  margin: 10px;\n}\n/*# sourceMappingURL=../custom-path/sourcemaps-url.map */"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-url/sourcemaps-url.less",
    "content": "@color: red;\n\n.header {\n  color: @color;\n  background: blue;\n}\n\n.footer {\n  margin: 10px;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-url/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            sourceMap: {\n                sourceMapURL: '../custom-path/sourcemaps-url.map'\n            }\n        }\n    }\n};\n\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-variable-selector/basic.less",
    "content": "@import (reference) \"./vars.less\";\n\n.@{hello}-class {\n    font-size: @font-size;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-variable-selector/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            math: 'strict',\n            strictUnits: true,\n            sourceMap: true\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/sourcemaps-variable-selector/vars.less",
    "content": "@foo: bar;\n@font-size: 12px;\n@hello: world;\n"
  },
  {
    "path": "packages/test-data/tests-config/static-urls/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": \"strict\",\n      \"relativeUrls\": false,\n      \"rootpath\": \"folder (1)/\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/static-urls/urls.css",
    "content": "@import \"folder (1)/css/background.css\";\n@import \"folder (1)/import-test-d.css\";\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(folder\\ \\(1\\)/fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(folder\\ \\(1\\)/images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(folder\\ \\(1\\)/bg.jpg) no-repeat, url(folder\\ \\(1\\)/bg.png) repeat-x top left, url(folder\\ \\(1\\)/bg);\n}\n.values {\n  url: url('folder (1)/Trebuchet');\n}\n#logo {\n  width: 100px;\n  height: 100px;\n  background: url('./folder (1)/assets/logo.png');\n  background: url(\"#inline-svg\");\n}\n@font-face {\n  font-family: xecret;\n  src: url('./assets/xecret.ttf');\n}\n#secret {\n  font-family: xecret, sans-serif;\n}\n#imported-relative-path {\n  background-image: url(../data/image.jpg);\n  border-image: url('../data/image.jpg');\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/static-urls/urls.less",
    "content": "@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n\n@import \"../../tests-unit/import/import/import-and-relative-paths-test\";\n\n"
  },
  {
    "path": "packages/test-data/tests-config/strict-imports/imported.less",
    "content": ".imported {\n  background: green;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/strict-imports/strict-imports.css",
    "content": ".imported {\n  background: green;\n}\n@media (max-width: 768px) {\n  .mobile {\n    color: red;\n  }\n}\n.container .nested {\n  color: blue;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/strict-imports/strict-imports.less",
    "content": "// Test that strictImports: true allows @import at root level\n@import \"imported.less\";\n\n// Test that strictImports: true allows @import inside @media blocks\n@media (max-width: 768px) {\n  @import \"imported.less\";\n  .mobile {\n    color: red;\n  }\n}\n\n// Test that strictImports: true skips @import inside selector blocks (import is not processed)\n.container {\n  @import \"imported.less\";\n  .nested {\n    color: blue;\n  }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-config/strict-imports/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            strictImports: true\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/units/no-strict/no-strict.css",
    "content": "@media (-o-min-device-pixel-ratio: 2) {\n  .test-rule-math-and-units {\n    font: ignores 0/0 rules;\n    test-division: 7em;\n    simple: 2px;\n  }\n}\n#units {\n  t1: 22em;\n  t2: 22em;\n  t3: 2em;\n  t4: 22em;\n  t5: 22em;\n  t6: 2em;\n  t7: 22em;\n  t8: 22em;\n  t9: 2em;\n  t10: 22em;\n  t11: 22em;\n  t12: 2em;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/units/no-strict/no-strict.less",
    "content": "@media (-o-min-device-pixel-ratio: 2) {\n  .test-rule-math-and-units {\n    font: ignores 0/0 rules;\n    test-division: 4 / 2 + 5em;\n    simple: 1px + 1px;\n  }\n}\n#units {\n  t1: (2em/1em) + 20;\n  t2: 20 + (2em/1em);\n  t3: 2em/1em;\n  t4: (2em/1px) + 20;\n  t5: 20 + (2em/1px);\n  t6: 2em/1px;\n  t7: (2em*1em) + 20;\n  t8: 20 + (2em*1em);\n  t9: 2em*1em;\n  t10: (2em*1px) + 20;\n  t11: 20 + (2em*1px);\n  t12: 2em*1px;\n}"
  },
  {
    "path": "packages/test-data/tests-config/units/no-strict/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": 0,\n      \"strictUnits\": false\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/units/strict/strict-units.css",
    "content": ".units {\n  cancels-to-nothing: 1;\n  cancels: 6px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/units/strict/strict-units.less",
    "content": ".units {\n  cancels-to-nothing: (1px / 1px);\n  cancels: ((((10px / 5em) / 1px) * 3em) * 1px);\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/units/strict/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"math\": 0,\n      \"strictUnits\": true\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/url-args/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"urlArgs\": \"424242\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/url-args/urls.css",
    "content": "@font-face {\n  src: url(\"/fonts/garamond-pro.ttf?424242\");\n  src: local(Futura-Medium), url(fonts.svg?424242#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html?424242\") no-repeat 0 4px;\n  background: url(\"img.jpg?424242\") center / 100px;\n  background: #fff url(image.png?424242) center / 1px 100px repeat-x scroll content-box padding-box;\n}\n#misc {\n  background-image: url(images/image.jpg?424242);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700&424242);\n  background-image: url(\"http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700&424242\");\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(bg.jpg?424242) no-repeat, url(bg.png?424242) repeat-x top left, url(bg?424242);\n}\n.values {\n  url: url('Trebuchet?424242');\n}\n@font-face {\n  font-family: xecret;\n  src: url('../assets/xecret.ttf?424242');\n}\n#secret {\n  font-family: xecret, sans-serif;\n}\n#data-uri {\n  uri: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\");\n}\n#data-uri-guess {\n  uri: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/onDKOUh3PglJfCuRbc3eCKH0GHB7zrBqmDZZ6AG+BdQUAUTNeDoMG9evvh46RjwOnroX4SBzBmXCmBBHXCXAqLUOO+NOXGJcTmw9xBHXA7R14aaTAMW1KdMvuQX2l5le0WoFSybYw4hjhFFgObfH0kB3AOo+01MQq5kisJmI7J8EwEuX5oWmC7lIPBHTKvM/PFfEeyN9jWk+afJFu/4J//xAAmEQEAAgICAgICAQUAAAAAAAABABEhMRBBQFEgYTBQkXBxgbHB/9oACAECAQE/EP2rVa9ff6fDKw3DPbg/WD+YIln6Uae4pDDR/iYCNVr/AL+hchVUy2n4dyuWYYZ7cPVqAA7+V16QqBpf48dAHqBt3mWOZQeZAiU1DUOS5bPUxCtXzhEw3G9hMNW+vUSgu/GcvTO8IcmuT3xX2SBiDuH2iVtrrlBYwkvWbYa8g1w65Yb+kxGn1w5dVMyMw+DqHkGuHXPcIWNkBBDJMDy+vqDZwfB15Jrh5IH2EQdT7RDUIBVbCe33H6V8vkmuHk1y64bC8OZsGKjcHPfkmuHXDr4PFAF8AU0c9+STUatz7JZ38O+Hjvi4EVaqf9+UlXfwFNQLcCDjvhAViUtjzq1FtYyQrlffj34PwErwwbhxYrgwHcbcJDKefBxTiEdKDTBEsnfB8HVoN+Cs1+F5s5QjU+yWtfE6KmrwVl+A5Z2iXZEpp+CJXCm4iIrZq8HcIlb+fXBx2hDhNvnYrwgpiVcGNsqIm+BqLcC48dcbcmcyoDAj6MRN8LpDHhhtMgQRuW7JXViHuViXDMcymahJmOeAEGR5o8faRXUUbh7m5mN1MQCMxBdM+yZWVK81DuJ6l4lETZLqf24v7h0Q/wBGoZ9U+iBdf0J//8QALRABAAECBAQGAwEBAQEBAAAAAREAITFBUWEQIHGBMFCRobHB0eHwQGDxgJD/2gAIAQEAAT8Q/wDgrIdKU7RP+OCBNKOZs+hFWaAgTOc6i6FQn/GQJS+JsJg0ZmiULzQB2zoiXPFpIY/4uY35FGD9vSmcAlMGB/xYxhRqKhUuFaLXtLHvPpxOA4xlTqI2/wCBFiiBIDhJj4L3EoCgeYXQLcDEmnAN2mgMkzKS4KUYnjpGPmAm6oZBxtakdZxLU8C8MF7wt7xxgRNWAI2TBq4kYhnUUXoJclNAkZ+LeKZfRI7e9IFxA+XYNAGSmgBjMFZK5AoO7CyocJiBnzb5E6YvwcZCOS0UPV0O9YiDgGRpyLYFi7BhSjwJBmi2mONsqmSCxu0mQcXKnheEpT5YoDyTF6MNndi35jm6oN3QPlxmhZk1DelthTyIu66O3KWKDCE6Xn6oH5pQwH5rAHPWQre8Chre8Cl4QisEEpis4SHV8sXcUJnFb1TWMK34g92frm6AvqflzEfJWa5CnKlJXkDcqOlQhMBpSs5YZEdKigXFdOCiRbiDvy5bxWMakTVukHt8wbTN3sB++USDVpWcl9Nvrmt+3qDgenKsuSI3a9m9x5hGDW9Sri0Y1hNR6CPrzDuMu68uyY9631H35TwJ9ApW809uY1cBGVKrLV4aJ9eDsGFb3r3fMLX+wcveHsvzLVXsYvAzKj7Zk4kdaRX579uXv4JGXAR6DNJRYrPmGLoHty43Ue/mtBq9S7wUS0pMRBRxBYDJmkpKgBdpQWKC5y2LqD2eDb+rjj3jzHD6Q5ca0+OPvlkzCZehepEzGsKoTOdO77kSFOHvm040PJNQBukQUQBmR2knksXVHv4PQsDqh8T5h7w5utXRe6H3y73O6eJDfisEtSJqxfr5Pri4hE4BTdBisRlD4O4jugJ+vMPeHh9BvVH2scRTCjqVPSkxUhmJepojMEHSeKFtkdYp3JhslOwXEaGpEYebfjfSwfD5goR0owfgoAlgpwfD7j757MnL0H6cQBGoICSNNvC3GbUtwoq0Qtiy5U642Qnfm6x3qfMT0g+3gwb1it7hOfrcHVB8Lxguz5LhVj/ojlCAJVgokxki9LD48xv1D9uW8c1/I8nWYOsW8C7Zkdgr8ORCLygqY0yEmcU5VIr10N7jPKEFPYRd9imvhUvmN+pj6Mct8Nfjn65Ouw+s/Xgd+11X4DkBPwC+xNKpXFvxs/mDl6sg6o+C+Zfwhx++W8dfnv1yWT9AR984KgErTITIQ9kfXJ6d+qx8Tx3TNb/LkCoKkmCOjYP2np5lZdH1EfXHAg1LPWv7A+k1pw5JxR91/wCa0HH9VPqv4VetaR9liu1SIugjmBYlXoCX4pnEqyvJvBuwI++IIvBl6UqquLyPGYqBQ3oS/wAalYERhHEfMe7U6ifujC6ZF3oUMIC3vbCgAgIOeKE0E1PLrH4LU92XZ+z8VMIOq9Rx3lDqL8Dy2Llnq3fnj0f77wipxYzXd4SIdKioXESiJIlybrRpgYMS4Fi9R1klNFKgRGEcR8uYq6AKBhQ9vFJJDhQbL8iDuYVLd6J30rdjHTB8PryTtYRLoVvvJxx9fZCoO6L2b8Veq3ZvnwUdfCUw4PZIQySJSNzgq1/a+WpgVAGdCSB9DY/wIE4Behg5xbI02pc+OHj/AO2iz4nkuZJJoLSLis4aBSqpWeAwyVhKAyd+MCDGt5vQGB6y+nlobeDka/4VJzB2Z+00WIqN8BaxP1UNRyGA1OG+EuhY4kAYrFFgWEu2FKBicnd83vY9j3oLBaVpKqD0QutW3gsaAWD08saAxy9CjLgID/C2zKTu/wB78VAxiz1T2EIG+5QLEiDtZ954yyS/pcHx4v8APFjUpAUh2SOgI+uL0PbL9vx4IQFzrBhSQo5eRxgvW6P8OF2rlx9Bl7cgLktBmhYpmWcc54k6MOBBIcGlSKyjLbgIlwRdTD3ikouKzwEEgbIxaeIyNAsHg9F71f1UZkCR08ibFRFEBYj/AAvDxcO/6oADAI5C65Qd39fNFZltGTnxV4tb7cU5ExEmnCM5KSrADBYWC8fHpTFidzSYyyLNMaLIc8jux9PCUVe30Kkxgz28ik6SB/xfRPd5ARWAlpgYjLv+qOBuh+/biMzdA3cfk8AqAU2y6cTpM1FXuPhylZLwVhKkUAhmJ9XyLocPt/hBsAJaYzjLktFoPQu/2/CeMh7cNBkTRS0KXRw8G/8AMAZDf0o0mq4HQoBAA0KihNEmiXp5ipE/Rke/AEpMApiQkXMn54ISMh8vkRGauf4bpZpehy7A/a/tuBkW8qkhRxK7AnVtQoiWSgNtwNTXwASGIth/7yuXrITUsdBApidiJeMaGwPSX8ivNUt03oGppE/wXlg+gckWkuAauVXNlC7q58Ly2rYJnvW/1fQsffCItkZJpQpYJcbn+BfoQqdmVLyO7szcw7aVDFrWJ4PrPM68qBxmH3RGMAjk2qT65ffIoEuoO7RqwEHbH3niYWeCMVPIuw21KsB2INzt4wwXGKex5ItVO4xGVqu8aTHOplRR/EEmdbtKTc7c7k4xmDRq3c0pU1JLUX3eN8/wy8hOkAS0wjhpbbenJAr56IPelUqyt3kEK3K4E3XsfNHFSSNnW6aVGQg0lUJvUXUJz5FiRrrwdhjcFAwBqM86Fwlj5NJgRKufknyhVs1OUAXsTptU/fdqepnU1m4FgdvxUCRLIYO/5qIG0bD1wo4BMFSPgGEoXE6GtYTAW5LTwfRP3ysDRMxsck5Ze27UM6bkOXTkZQsR6t3496uBCI6mx7tS6tEUhmr9QoAHMWB6NAEA4I8SldNUvpjQK8to79inLkZVbvkyNWkSiYOCHF10oEJLiMjUIS2QnfGnyldc9Sm5QziPWPuo0RMbj1KgRfWA+qiIi5P7VFGajPFQKsBjUgOgOVPkGw6NR4rufJatFWwn6oJY7G1HbH4qcY8Tky7cg4aCaZSgr1NEc26A14RIALowDVaNvW2QZbFPiZTxQAVMAZ1Lhd6j+ihcewjD3+ORWevhQJB/ZvQ8H6I+VwSbNd/So95csbo0AFCOZw9ZIVq6iWrlN96R+qJJ+pd81gjaDf5WojoaP1RUcC5fFJEtAcX4oRJGeChdp0lS1gGnekGCCYRRkmtXOjUDGep9ytIXRfioUgxcYbUIgjI4VCuBg4qhlF7GXYNaw7z1LVZ10BDox9+JpSWAJWhYf2LvSgVYC6tIK4+yw/PfzNEhdV6KhULrnpjULds3OVITkB80YlzN1cVpBIblM8le9Pauk9vxSxxCW8elAoJxGhkUYkyfyoCUJtwAKoDOojFlbowqSw950U3ADQ2alGIlCPX5e1DyQECBTMQ4z/rSlh2H5UX1xu+vAMFGD+L+bFSrBUNQIR5C/rUSPallETsJdRyYrYDNpEpOJttSCmWJk1gGd3Nf+RUmKdCkUYvQLTkTRiMHFZcEskmqj4qeR9z8Url3SYFItKeI9xUaSbUfBG5NbQ6UlInWL0pbTS/rkYq+GYtKkgPPTbzkVSKJmUbTiwfmqKCtVDUGTNk/FEnQKCJIibVhKbQ3qwTK3XVpIWQYCyVkV2Q1HiHpRajmKyqESYhZ2cLkNZRWWCUSZO91YzWCxHSkEIjCcFSNYRYYhvQsgm1Ib/JxonSBh4Dz9Wa4DYhFQLO3o9x4n4rDdtZQ89EFCRmXt/GBSARJHKso/wAsaixewrQ7yFaIGqy0RuFmZx7VPZcbUQmc1u0wjorH7pMx83/hRRkUdqyMtFWRDRvwvBPgooOK91f+ypxcuq0YgSqeO3T/APih/9k=\");\n}\n#data-uri-ascii {\n  uri-1: url(\"data:text/html,%3Chtml%3E%3Ch1%3EThis%20page%20is%20100%25%20Awesome.%3C%2Fh1%3E%3C%2Fhtml%3E%0A\");\n  uri-2: url(\"data:text/html,%3Chtml%3E%3Ch1%3EThis%20page%20is%20100%25%20Awesome.%3C%2Fh1%3E%3C%2Fhtml%3E%0A\");\n}\n#svg-functions {\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23000000%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23000000%22%2F%3E%3Cstop%20offset%3D%223%25%22%20stop-color%3D%22%23ffa500%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%221%25%22%20stop-color%3D%22%23c4c4c4%22%2F%3E%3Cstop%20offset%3D%223%25%22%20stop-color%3D%22%23ffa500%22%2F%3E%3Cstop%20offset%3D%225%25%22%20stop-color%3D%22%23008000%22%2F%3E%3Cstop%20offset%3D%2295%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n}\n#data-uri-with-spaces {\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(' data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==');\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/url-args/urls.less",
    "content": "@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n  background: url(\"img.jpg\") center / 100px;\n  background: #fff url(image.png) center / 1px 100px repeat-x scroll content-box padding-box;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n  background-image: url(\"http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700\");\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n\n@import \"../../tests-unit/import/import/imports/font\";\n\n#data-uri {\n  uri: data-uri('image/jpeg;base64', '../../data/image.jpg');\n}\n\n#data-uri-guess {\n  uri: data-uri('../../data/image.jpg');\n}\n\n#data-uri-ascii {\n  uri-1: data-uri('text/html', '../../data/page.html');\n  uri-2: data-uri('../../data/page.html');\n}\n\n#svg-functions {\n  background-image: svg-gradient(to bottom, black, white);\n  background-image: svg-gradient(to bottom, black, orange 3%, white);\n  @green_5: green 5%;\n  @orange_percentage: 3%;\n  @orange_color: orange;\n  background-image: svg-gradient(to bottom, (mix(black, white) + #444) 1%, @orange_color @orange_percentage, ((@green_5)), white 95%);\n}\n\n#data-uri-with-spaces {\n  background-image: url( data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url( ' data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==');\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/visitorPlugin/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"plugin\": \"test/plugins/visitor/index.cjs\"\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-config/visitorPlugin/visitor.css",
    "content": ".test-rule {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-config/visitorPlugin/visitor.less",
    "content": ".test-rule {\n    color: red;\n    -some-aribitrary-property: value;\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/add-mixed-units.less",
    "content": ".a {\n  error: (1px + 3em);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/add-mixed-units.txt",
    "content": "SyntaxError: Incompatible units. Change the units or use the unit function. Bad units: 'px' and 'em'. in {path}add-mixed-units.less on line 2, column 3:\n1 .a {\n2   error: (1px + 3em);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/add-mixed-units2.less",
    "content": ".a {\n  error: ((1px * 2px) + (3em * 3px));\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/add-mixed-units2.txt",
    "content": "SyntaxError: Incompatible units. Change the units or use the unit function. Bad units: 'px*px' and 'em*px'. in {path}add-mixed-units2.less on line 2, column 3:\n1 .a {\n2   error: ((1px * 2px) + (3em * 3px));\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/at-rules-undefined-var.less",
    "content": "\n@keyframes @name {\n    50% {width: 20px;}\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/at-rules-undefined-var.txt",
    "content": "NameError: variable @name is undefined in {path}at-rules-undefined-var.less on line 2, column 12:\n1 \n2 @keyframes @name {\n3     50% {width: 20px;}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/color-func-invalid-color-2.less",
    "content": "// https://github.com/less/less.js/issues/3338\n@base-color: darken(var(--baseColor, red), 50%);"
  },
  {
    "path": "packages/test-data/tests-error/eval/color-func-invalid-color-2.txt",
    "content": "RuntimeError: Error evaluating function `darken`: Argument cannot be evaluated to a color in {path}color-func-invalid-color-2.less on line 2, column 14:\n1 // https://github.com/less/less.js/issues/3338\n2 @base-color: darken(var(--baseColor, red), 50%);\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/color-func-invalid-color.less",
    "content": ".test-rule {\n  color: color(\"NOT A COLOR\");\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/color-func-invalid-color.txt",
    "content": "ArgumentError: Error evaluating function `color`: argument must be a color keyword or 3|4|6|8 digit hex e.g. #FFF in {path}color-func-invalid-color.less on line 2, column 10:\n1 .test-rule {\n2   color: color(\"NOT A COLOR\");\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/css-guard-default-func.less",
    "content": "\nselector when (default()) {\n    color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/css-guard-default-func.txt",
    "content": "SyntaxError: Error evaluating function `default`: it is currently only allowed in parametric mixin guards, in {path}css-guard-default-func.less on line 2, column 16:\n1 \n2 selector when (default()) {\n3     color: red;\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-1.less",
    "content": "@a: {\n  b: 1;\n};\n.a {\n  a: @a;\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-1.txt",
    "content": "SyntaxError: Rulesets cannot be evaluated on a property. in {path}detached-ruleset-1.less on line 5, column 3:\n4 .a {\n5   a: @a;\n6 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-2.less",
    "content": "@a: {\n  b: 1;\n};\n.a {\n  a: @a();\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-2.txt",
    "content": "ParseError: Missing '[...]' lookup in variable call in {path}detached-ruleset-2.less on line 5, column 10:\n4 .a {\n5   a: @a();\n6 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-3.less",
    "content": "@a: {\n  b: 1;\n};\n@a();"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-3.txt",
    "content": "SyntaxError: Properties must be inside selector blocks. They cannot be in the root in {path}detached-ruleset-3.less on line 2, column 3:\n1 @a: {\n2   b: 1;\n3 };\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-5.less",
    "content": ".mixin-definition(@b) {\n  @a();\n}\n.mixin-definition({color: red;});"
  },
  {
    "path": "packages/test-data/tests-error/eval/detached-ruleset-5.txt",
    "content": "NameError: variable @a is undefined in {path}detached-ruleset-5.less on line 4, column 1:\n3 }\n4 .mixin-definition({color: red;});\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/divide-mixed-units.less",
    "content": ".a {\n  error: (1px / 3em);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/divide-mixed-units.txt",
    "content": "SyntaxError: Multiple units in dimension. Correct the units or use the unit function. Bad unit: px/em in {path}divide-mixed-units.less on line 2, column 3:\n1 .a {\n2   error: (1px / 3em);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/extend-no-selector.less",
    "content": ":extend(.a all) {\n  property: red;\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/extend-no-selector.txt",
    "content": "SyntaxError: Extend must be used to extend a selector, it cannot be used on its own in {path}extend-no-selector.less on line 1, column 17:\n1 :extend(.a all) {\n2   property: red;\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-1.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-undefined();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-1.txt",
    "content": "SyntaxError: Function 'test-undefined' did not return a root node in {path}functions-1.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-undefined();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-10-keyword.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-keyword();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-10-keyword.txt",
    "content": "SyntaxError: Keyword node returned by a function is not valid here in {path}functions-10-keyword.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-keyword();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-11-operation.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-operation();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-11-operation.txt",
    "content": "SyntaxError: Operation node returned by a function is not valid here in {path}functions-11-operation.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-operation();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-12-quoted.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-quoted();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-12-quoted.txt",
    "content": "SyntaxError: Quoted node returned by a function is not valid here in {path}functions-12-quoted.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-quoted();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-13-selector.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-selector();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-13-selector.txt",
    "content": "SyntaxError: Selector node returned by a function is not valid here in {path}functions-13-selector.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-selector();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-14-url.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-url();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-14-url.txt",
    "content": "SyntaxError: Url node returned by a function is not valid here in {path}functions-14-url.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-url();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-15-value.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-value();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-15-value.txt",
    "content": "SyntaxError: Value node returned by a function is not valid here in {path}functions-15-value.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-value();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-3-assignment.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-assignment();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-3-assignment.txt",
    "content": "SyntaxError: Assignment node returned by a function is not valid here in {path}functions-3-assignment.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-assignment();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-4-call.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-call();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-4-call.txt",
    "content": "SyntaxError: Function 'foo' did not return a root node in {path}functions-4-call.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-call();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-5-color-2.less",
    "content": "rgba(0,0,0,0);"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-5-color-2.txt",
    "content": "SyntaxError: Color node returned by a function is not valid here in {path}functions-5-color-2.less on line 1, column 1:\n1 rgba(0,0,0,0);\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-5-color.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-color();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-5-color.txt",
    "content": "SyntaxError: Color node returned by a function is not valid here in {path}functions-5-color.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-color();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-6-condition.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-condition();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-6-condition.txt",
    "content": "SyntaxError: Condition node returned by a function is not valid here in {path}functions-6-condition.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-condition();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-7-dimension.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-dimension();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-7-dimension.txt",
    "content": "SyntaxError: Dimension node returned by a function is not valid here in {path}functions-7-dimension.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-dimension();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-8-element.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-element();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-8-element.txt",
    "content": "SyntaxError: Element node returned by a function is not valid here in {path}functions-8-element.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-element();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-9-expression.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes\";\ntest-expression();"
  },
  {
    "path": "packages/test-data/tests-error/eval/functions-9-expression.txt",
    "content": "SyntaxError: Expression node returned by a function is not valid here in {path}functions-9-expression.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes\";\n2 test-expression();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/import-missing.less",
    "content": ".a {\n    color: green;\n    // tests line number for import reference is correct\n}\n\n@import \"file-does-not-exist.less\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/import-missing.txt",
    "content": "FileError: '{pathhref}file-does-not-exist.less' wasn't found{404status}{node}. Tried - {path}file-does-not-exist.less,{path}file-does-not-exist.less,npm://file-does-not-exist.less,file-does-not-exist.less{/node} in {path}import-missing.less on line 6, column 1:\n5 \n6 @import \"file-does-not-exist.less\";\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/import-subfolder1.less",
    "content": "@import \"imports/import-subfolder1.less\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/import-subfolder1.txt",
    "content": "NameError: .mixin-not-defined is undefined in {path}mixin-not-defined.less on line 11, column 1:\n10 \n11 .mixin-not-defined();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/imports/import-subfolder1.less",
    "content": "@import \"subfolder/mixin-not-defined.less\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/imports/import-test.less",
    "content": ".someclass\n{\n    font-weight: bold;\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/imports/subfolder/mixin-not-defined.less",
    "content": "@import \"../../mixin-not-defined.less\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/javascript-undefined-var.less",
    "content": ".scope {\n    @a: `@{b}`;\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/javascript-undefined-var.txt",
    "content": "NameError: variable @b is undefined in {path}javascript-undefined-var.less on line 2, column 9:\n1 .scope {\n2     @a: `@{b}`;\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-defined-2.less",
    "content": ".non-matching-mixin(@a @b) {\n  args: @a @b;  \n}\n\nx {\n  .non-matching-mixin(x, y);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-defined-2.txt",
    "content": "RuntimeError: No matching definition was found for `.non-matching-mixin(x, y)` in {path}mixin-not-defined-2.less on line 6, column 3:\n5 x {\n6   .non-matching-mixin(x, y);\n7 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-defined.less",
    "content": "\n.error-is-further-on() {\n}\n\n.pad-here-to-reproduce-error-in() {\n}\n\n.the-import-subfolder-test() {\n}\n\n.mixin-not-defined();"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-defined.txt",
    "content": "NameError: .mixin-not-defined is undefined in {path}mixin-not-defined.less on line 11, column 1:\n10 \n11 .mixin-not-defined();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-matched.less",
    "content": "@saxofon:trumpete;\n\n.mixin(saxofon) {\n}\n\n.mixin(@saxofon);"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-matched.txt",
    "content": "RuntimeError: No matching definition was found for `.mixin(trumpete)` in {path}mixin-not-matched.less on line 6, column 1:\n5 \n6 .mixin(@saxofon);\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-matched2.less",
    "content": "@saxofon:trumpete;\n\n.mixin(@a, @b) {\n}\n\n.mixin(@a: @saxofon);"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-matched2.txt",
    "content": "RuntimeError: No matching definition was found for `.mixin(@a:trumpete)` in {path}mixin-not-matched2.less on line 6, column 1:\n5 \n6 .mixin(@a: @saxofon);\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-visible-in-scope-1.less",
    "content": ".something {\n    & {\n        .a {value: a}\n    }\n\n    & {\n        .b {.a()} // was Err. before 1.6.2\n    }\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixin-not-visible-in-scope-1.txt",
    "content": "NameError: .a is undefined in {path}mixin-not-visible-in-scope-1.less on line 7, column 13:\n6     & {\n7         .b {.a()} // was Err. before 1.6.2\n8     }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixins-guards-default-func-1.less",
    "content": "\nguard-default-func-conflict {\n    .m(@x, 1)                  {}\n    .m(@x, 2) when (default()) {}\n    .m(@x, 2) when (default()) {}\n\n    .m(1, 1);\n    .m(1, 2);\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixins-guards-default-func-1.txt",
    "content": "RuntimeError: Ambiguous use of `default()` found when matching for `.m(1, 2)` in {path}mixins-guards-default-func-1.less on line 8, column 5:\n7     .m(1, 1);\n8     .m(1, 2);\n9 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixins-guards-default-func-2.less",
    "content": "\nguard-default-func-conflict {\n    .m(1)                                {}\n    .m(@x) when not(default())           {}\n    .m(@x) when (@x = 3) and (default()) {}\n\n    .m(2);\n    .m(3);\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixins-guards-default-func-2.txt",
    "content": "RuntimeError: Ambiguous use of `default()` found when matching for `.m(3)` in {path}mixins-guards-default-func-2.less on line 8, column 5:\n7     .m(2);\n8     .m(3);\n9 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixins-guards-default-func-3.less",
    "content": "\nguard-default-func-conflict {\n    .m(1)                      {}\n    .m(@x) when not(default()) {}\n    .m(@x) when not(default()) {}\n\n    .m(1);\n    .m(2);\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/mixins-guards-default-func-3.txt",
    "content": "RuntimeError: Ambiguous use of `default()` found when matching for `.m(2)` in {path}mixins-guards-default-func-3.less on line 8, column 5:\n7     .m(1);\n8     .m(2);\n9 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/multiple-guards-on-css-selectors.less",
    "content": "@ie8: true;\n.a when (@ie8 = true),\n.b {\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/multiple-guards-on-css-selectors.txt",
    "content": "SyntaxError: Guards are only currently allowed on a single selector. in {path}multiple-guards-on-css-selectors.less on line 3, column 1:\n2 .a when (@ie8 = true),\n3 .b {\n4 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/multiple-guards-on-css-selectors2.less",
    "content": "@ie8: true;\n.a,\n.b when (@ie8 = true) {\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/multiple-guards-on-css-selectors2.txt",
    "content": "SyntaxError: Guards are only currently allowed on a single selector. in {path}multiple-guards-on-css-selectors2.less on line 3, column 23:\n2 .a,\n3 .b when (@ie8 = true) {\n4 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/multiply-mixed-units.less",
    "content": "/* Test */\n#blah {\n  // blah\n}\n.a {\n  error: (1px * 1em);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/multiply-mixed-units.txt",
    "content": "SyntaxError: Multiple units in dimension. Correct the units or use the unit function. Bad unit: em*px in {path}multiply-mixed-units.less on line 6, column 3:\n5 .a {\n6   error: (1px * 1em);\n7 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespace-property-not-found.less",
    "content": "#namespace {\n  existing-prop: value;\n}\n.test {\n  value: #namespace[$nonexistent-prop];\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespace-property-not-found.txt",
    "content": "NameError: property \"nonexistent-prop\" not found\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespace-variable-not-found.less",
    "content": "#namespace {\n  @existing-var: value;\n}\n.test {\n  color: #namespace[@nonexistent-var];\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespace-variable-not-found.txt",
    "content": "NameError: variable @nonexistent-var not found\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespacing-2.less",
    "content": "@dr: {\n  nothing: here;\n};\n\n.val {\n  foo: @dr[not-found];\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespacing-2.txt",
    "content": "NameError: property \"not-found\" not found in {path}namespacing-2.less on line 6, column 11:\n5 .val {\n6   foo: @dr[not-found];\n7 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespacing-3.less",
    "content": ".theme() {\n  foo: bar;\n}\n\n.val {\n  @alias: .theme;  // aliasing not allowed without ()\n  foo: @alias[foo];\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespacing-3.txt",
    "content": "SyntaxError: Could not evaluate variable call @alias in {path}namespacing-3.less on line 7, column 3:\n6   @alias: .theme;  // aliasing not allowed without ()\n7   foo: @alias[foo];\n8 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespacing-4.less",
    "content": "@dr: {\n  nothing: here;\n};\n\n.val {\n  foo: @dr[@not-found];\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/namespacing-4.txt",
    "content": "NameError: variable @not-found not found in {path}namespacing-4.less on line 6, column 11:\n5 .val {\n6   foo: @dr[@not-found];\n7 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/percentage-non-number-argument.less",
    "content": "div {\n  percentage: percentage(16/17);\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/percentage-non-number-argument.txt",
    "content": "ArgumentError: Error evaluating function `percentage`: argument must be a number in {path}percentage-non-number-argument.less on line 2, column 15:\n1 div {\n2   percentage: percentage(16/17);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin/plugin-error-2.js",
    "content": "registerPlugin({\n    use: function() {\n        throw new Error('An error was here.')\n    }\n});"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin/plugin-error-3.js",
    "content": "registerPlugin({\n    eval: function() {\n        throw new Error('An error was here.')\n    }\n});"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin/plugin-error.js",
    "content": "throw new Error('Error');"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin-1.less",
    "content": "@plugin \"plugin/plugin-error\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin-1.txt",
    "content": "SyntaxError: Error in {path}plugin-error.js on line 1, column 8:\n1 throw new Error('Error');\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin-2.less",
    "content": "@plugin \"plugin/plugin-error-2\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin-2.txt",
    "content": "SyntaxError: An error was here. in {path}plugin-error-2.js on line 3, column 16:\n2     use: function() {\n3         throw new Error('An error was here.')\n4     }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin-3.less",
    "content": "@plugin \"plugin/plugin-error-3\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/plugin-3.txt",
    "content": "SyntaxError: Plugin error during evaluation in {path}plugin-error-3.js on line 3, column 16:\n2     eval: function() {\n3         throw new Error('An error was here.')\n4     }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-in-root.less",
    "content": ".a() {\n  prop:1;\n}\n.a();"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-in-root.txt",
    "content": "SyntaxError: Properties must be inside selector blocks. They cannot be in the root in {path}property-in-root.less on line 2, column 3:\n1 .a() {\n2   prop:1;\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-in-root2.less",
    "content": "@import \"property-in-root\";"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-in-root2.txt",
    "content": "SyntaxError: Properties must be inside selector blocks. They cannot be in the root in {path}property-in-root.less on line 2, column 3:\n1 .a() {\n2   prop:1;\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-in-root3.less",
    "content": "prop:1;\n.a {\n  prop:1;\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-in-root3.txt",
    "content": "SyntaxError: Properties must be inside selector blocks. They cannot be in the root in {path}property-in-root3.less on line 1, column 1:\n1 prop:1;\n2 .a {\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-interp-not-defined.less",
    "content": "a {outline-@{color}: green}"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-interp-not-defined.txt",
    "content": "NameError: variable @color is undefined in {path}property-interp-not-defined.less on line 1, column 12:\n1 a {outline-@{color}: green}\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-undefined.less",
    "content": ".test {\n  value: $undefined-prop;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/property-undefined.txt",
    "content": "NameError: Property '$undefined-prop' is undefined in {path}property-undefined.less on line 2, column 10:\n1 .test {\n2   value: $undefined-prop;\n3 }\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/recursive-property.less",
    "content": ".test {\n  color: darken($color, 10%);\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/recursive-property.txt",
    "content": "NameError: Error evaluating function `darken`: Recursive property reference for $color in {path}recursive-property.less on line 2, column 10:\n1 .test {\n2   color: darken($color, 10%);\n3 }\n\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/recursive-variable.less",
    "content": "@bodyColor: darken(@bodyColor, 30%);"
  },
  {
    "path": "packages/test-data/tests-error/eval/recursive-variable.txt",
    "content": "NameError: Error evaluating function `darken`: Recursive variable definition for @bodyColor in {path}recursive-variable.less on line 1, column 13:\n1 @bodyColor: darken(@bodyColor, 30%);\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/root-func-undefined-1.less",
    "content": "func();"
  },
  {
    "path": "packages/test-data/tests-error/eval/root-func-undefined-1.txt",
    "content": "SyntaxError: Function 'func' did not return a root node in {path}root-func-undefined-1.less on line 1, column 1:\n1 func();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/root-func-undefined-2.less",
    "content": "@plugin \"../../plugin/plugin-tree-nodes.js\";\ntest-undefined();"
  },
  {
    "path": "packages/test-data/tests-error/eval/root-func-undefined-2.txt",
    "content": "SyntaxError: Function 'test-undefined' did not return a root node in {path}root-func-undefined-2.less on line 2, column 1:\n1 @plugin \"../../plugin/plugin-tree-nodes.js\";\n2 test-undefined();\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            strictMath: true,\n            strictUnits: true,\n            javascriptEnabled: true\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient1.less",
    "content": ".a {\n  a: svg-gradient(horizontal, black, white);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient1.txt",
    "content": "ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient1.less on line 2, column 6:\n1 .a {\n2   a: svg-gradient(horizontal, black, white);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient2.less",
    "content": ".a {\n  a: svg-gradient(to bottom, black, orange, 45%, white);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient2.txt",
    "content": "ArgumentError: Error evaluating function `svg-gradient`: svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list in {path}svg-gradient2.less on line 2, column 6:\n1 .a {\n2   a: svg-gradient(to bottom, black, orange, 45%, white);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient3.less",
    "content": ".a {\n  a: svg-gradient(black, orange);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient3.txt",
    "content": "ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient3.less on line 2, column 6:\n1 .a {\n2   a: svg-gradient(black, orange);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient4.less",
    "content": ".a {\n  a: svg-gradient(horizontal, @colors);\n}\n@colors: black, white;\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient4.txt",
    "content": "ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient4.less on line 2, column 6:\n1 .a {\n2   a: svg-gradient(horizontal, @colors);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient5.less",
    "content": ".a {\n  a: svg-gradient(to bottom, @colors);\n}\n@colors: black, orange, 45%, white;\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient5.txt",
    "content": "ArgumentError: Error evaluating function `svg-gradient`: svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position] or direction, color list in {path}svg-gradient5.less on line 2, column 6:\n1 .a {\n2   a: svg-gradient(to bottom, @colors);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient6.less",
    "content": ".a {\n  a: svg-gradient(black, @colors);\n}\n@colors: orange;\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/svg-gradient6.txt",
    "content": "ArgumentError: Error evaluating function `svg-gradient`: svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center' in {path}svg-gradient6.less on line 2, column 6:\n1 .a {\n2   a: svg-gradient(black, @colors);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/eval/unit-function.less",
    "content": ".a {\n  font-size: unit(80/16,rem);\n}"
  },
  {
    "path": "packages/test-data/tests-error/eval/unit-function.txt",
    "content": "ArgumentError: Error evaluating function `unit`: the first argument to unit must be a number. Have you forgotten parenthesis? in {path}unit-function.less on line 2, column 14:\n1 .a {\n2   font-size: unit(80/16,rem);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/at-rules-unmatching-block.less",
    "content": "\n@unknown url( {\n    50% {width: 20px;}\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/at-rules-unmatching-block.txt",
    "content": "SyntaxError: expected ')' got '' in {path}at-rules-unmatching-block.less on line 5, column 1:\n4 }\n5 \n"
  },
  {
    "path": "packages/test-data/tests-error/parse/bad-variable-declaration1.less",
    "content": "@@demo: \"hi\";"
  },
  {
    "path": "packages/test-data/tests-error/parse/bad-variable-declaration1.txt",
    "content": "ParseError: Unrecognised input in {path}bad-variable-declaration1.less on line 1, column 1:\n1 @@demo: \"hi\";\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/custom-property-unmatched-block-1.less",
    "content": ".custom {\n  --custom: ({\n    this;\n    is-unmatched: [\n  })\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/custom-property-unmatched-block-1.txt",
    "content": "ParseError: Expected ']' in {path}custom-property-unmatched-block-1.less on line 5, column 3:\n4     is-unmatched: [\n5   })\n6 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/custom-property-unmatched-block-2.less",
    "content": ".custom {\n  --custom: {{\n    this;\n    is-unmatched: [\n  }}\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/custom-property-unmatched-block-2.txt",
    "content": "ParseError: Expected ']' in {path}custom-property-unmatched-block-2.less on line 5, column 3:\n4     is-unmatched: [\n5   }}\n6 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/custom-property-unmatched-block-3.less",
    "content": ".custom {\n  --custom: {{\n    this;\n    is-unmatched: \"\n  }}\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/custom-property-unmatched-block-3.txt",
    "content": "ParseError: Expected '\"' in {path}custom-property-unmatched-block-3.less on line 4, column 19:\n3     this;\n4     is-unmatched: \"\n5   }}\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/detached-ruleset-6.less",
    "content": ".a {\n  b: {\n    color: red;\n  };\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/detached-ruleset-6.txt",
    "content": "ParseError: Unrecognised input in {path}detached-ruleset-6.less on line 2, column 6:\n1 .a {\n2   b: {\n3     color: red;\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/extend-not-at-end.less",
    "content": ".a:extend(.b all).c {\n  property: red;\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/extend-not-at-end.txt",
    "content": "SyntaxError: Extend can only be used at the end of selector in {path}extend-not-at-end.less on line 1, column 21:\n1 .a:extend(.b all).c {\n2   property: red;\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/import-malformed.less",
    "content": "@import malformed \"this-statement-is-invalid.less\";\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/import-malformed.txt",
    "content": "SyntaxError: malformed import statement in {path}import-malformed.less on line 1, column 1:\n1 @import malformed \"this-statement-is-invalid.less\";\n2 \n"
  },
  {
    "path": "packages/test-data/tests-error/parse/import-no-semi.less",
    "content": "@import \"this-statement-is-invalid.less\""
  },
  {
    "path": "packages/test-data/tests-error/parse/import-no-semi.txt",
    "content": "SyntaxError: missing semi-colon or unrecognised media features on import in {path}import-no-semi.less on line 1, column 1:\n1 @import \"this-statement-is-invalid.less\"\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/import-subfolder2.less",
    "content": "@import \"imports/import-subfolder2.less\";"
  },
  {
    "path": "packages/test-data/tests-error/parse/import-subfolder2.txt",
    "content": "ParseError: Unrecognised input. Possibly missing opening '{' in {path}parse-error-curly-bracket.less on line 4, column 1:\n3   }\n4 }\n5 \n"
  },
  {
    "path": "packages/test-data/tests-error/parse/imports/import-subfolder2.less",
    "content": "@import \"subfolder/parse-error-curly-bracket.less\";"
  },
  {
    "path": "packages/test-data/tests-error/parse/imports/subfolder/parse-error-curly-bracket.less",
    "content": "@import \"../../parse-error-curly-bracket.less\";"
  },
  {
    "path": "packages/test-data/tests-error/parse/invalid-color-with-comment.less",
    "content": ".test {color: #fffff /* comment */ ;}"
  },
  {
    "path": "packages/test-data/tests-error/parse/invalid-color-with-comment.txt",
    "content": "ParseError: Unrecognised input in {path}invalid-color-with-comment.less on line 1, column 36:\n1 .test {color: #fffff /* comment */ ;}\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/mixed-mixin-definition-args-1.less",
    "content": ".mixin(@a : 4, @b : 3, @c: 2) {\n    will: fail;\n}\n.mixin-test {\n    .mixin(@a: 5; @b: 6, @c: 7);\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/mixed-mixin-definition-args-1.txt",
    "content": "SyntaxError: Cannot mix ; and , as delimiter types in {path}mixed-mixin-definition-args-1.less on line 5, column 30:\n4 .mixin-test {\n5     .mixin(@a: 5; @b: 6, @c: 7);\n6 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/mixed-mixin-definition-args-2.less",
    "content": ".mixin(@a : 4, @b : 3, @c: 2) {\n    will: fail;\n}\n.mixin-test {\n    .mixin(@a: 5, @b: 6; @c: 7);\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/mixed-mixin-definition-args-2.txt",
    "content": "SyntaxError: Cannot mix ; and , as delimiter types in {path}mixed-mixin-definition-args-2.less on line 5, column 26:\n4 .mixin-test {\n5     .mixin(@a: 5, @b: 6; @c: 7);\n6 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/mixins-guards-cond-expected.less",
    "content": ".max (@a, @b) when @a {\n  width: @b;\n}\n\n.max1 { .max(3, 6) }"
  },
  {
    "path": "packages/test-data/tests-error/parse/mixins-guards-cond-expected.txt",
    "content": "SyntaxError: expected condition in {path}mixins-guards-cond-expected.less on line 1, column 20:\n1 .max (@a, @b) when @a {\n2   width: @b;\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parens-error-1.less",
    "content": ".a {\n  something: (12 (13 + 5 -23) + 5);\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/parens-error-1.txt",
    "content": "ParseError: Expected ')' in {path}parens-error-1.less on line 2, column 18:\n1 .a {\n2   something: (12 (13 + 5 -23) + 5);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parens-error-2.less",
    "content": ".a {\n  something: (12 * (13 + 5 -23));\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/parens-error-2.txt",
    "content": "ParseError: Expected ')' in {path}parens-error-2.less on line 2, column 28:\n1 .a {\n2   something: (12 * (13 + 5 -23));\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parens-error-3.less",
    "content": ".a {\n  something: (12 + (13 + 10 -23));\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/parens-error-3.txt",
    "content": "ParseError: Expected ')' in {path}parens-error-3.less on line 2, column 29:\n1 .a {\n2   something: (12 + (13 + 10 -23));\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-curly-bracket.less",
    "content": "body {\n    background-color: #fff;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-curly-bracket.txt",
    "content": "ParseError: Unrecognised input. Possibly missing opening '{' in {path}parse-error-curly-bracket.less on line 4, column 1:\n3   }\n4 }\n5 \n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-media-no-block-1.less",
    "content": "@media (extra: bracket)) {\n  body {\n    background-color: #fff;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-media-no-block-1.txt",
    "content": "SyntaxError: media definitions require block statements after any features in {path}parse-error-media-no-block-1.less on line 1, column 24:\n1 @media (extra: bracket)) {\n2   body {\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-media-no-block-2.less",
    "content": "@media"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-media-no-block-2.txt",
    "content": "SyntaxError: media definitions require block statements after any features in {path}parse-error-media-no-block-2.less on line 1, column 7:\n1 @media\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-media-no-block-3.less",
    "content": "@media (min-width: 500px) {\n  .sometimes-big {\n    font-size: 5000px;\n  }"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-media-no-block-3.txt",
    "content": "SyntaxError: media definitions require block statements after any features in {path}parse-error-media-no-block-3.less on line 4, column 4:\n3     font-size: 5000px;\n4   }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-missing-bracket.less",
    "content": "body {\n  background-color: #fff;\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-missing-bracket.txt",
    "content": "ParseError: Unrecognised input. Possibly missing something in {path}parse-error-missing-bracket.less on line 3, column 1:\n2   background-color: #fff;\n3 \n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-missing-parens.less",
    "content": "@media (missing: bracket {\n  body {\n    background-color: #fff;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-missing-parens.txt",
    "content": "ParseError: Missing closing ')' in {path}parse-error-missing-parens.less on line 1, column 26:\n1 @media (missing: bracket {\n2   body {\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-with-import.less",
    "content": "@import 'import/import-test.less';\n\nbody\n{\n    font-family: arial, sans-serif;\n}\n\nnonsense;\n\n.clickable\n{\n    cursor: pointer;\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/parse-error-with-import.txt",
    "content": "ParseError: Unrecognised input in {path}parse-error-with-import.less on line 8, column 9:\n7 \n8 nonsense;\n9 \n"
  },
  {
    "path": "packages/test-data/tests-error/parse/percentage-missing-space.less",
    "content": ".a {\n  error: calc(1 %);\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/percentage-missing-space.txt",
    "content": "SyntaxError: Invalid % without number in {path}percentage-missing-space.less on line 2, column 3:\n1 .a {\n2   error: calc(1 %);\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/property-asterisk-only-name.less",
    "content": "a {\n    * : 1;\n}"
  },
  {
    "path": "packages/test-data/tests-error/parse/property-asterisk-only-name.txt",
    "content": "ParseError: Unrecognised input in {path}property-asterisk-only-name.less on line 2, column 7:\n1 a {\n2     * : 1;\n3 }\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/single-character.less",
    "content": "x"
  },
  {
    "path": "packages/test-data/tests-error/parse/single-character.txt",
    "content": "ParseError: Unrecognised input. Possibly missing something in {path}single-character.less on line 1, column 2:\n1 x\n"
  },
  {
    "path": "packages/test-data/tests-error/parse/styles.config.cjs",
    "content": "module.exports = {\n    language: {\n        less: {\n            strictMath: true,\n            strictUnits: true,\n            javascriptEnabled: true\n        }\n    }\n};\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules/at-rules.css",
    "content": "@charset \"UTF-8\";\n@page {\n  margin: 2cm;\n  @top-left {\n    content: \"Page \" counter(page);\n  }\n}\n@page :first {\n  margin: 3cm;\n  @top-center {\n    content: \"First Page\";\n  }\n}\n@namespace url(http://www.w3.org/1999/xhtml);\n@namespace svg url(http://www.w3.org/2000/svg);\n@viewport {\n  width: device-width;\n  initial-scale: 1;\n}\n@keyframes slidein {\n  from {\n    margin-left: 100%;\n    width: 300%;\n  }\n  to {\n    margin-left: 0%;\n    width: 100%;\n  }\n}\n@keyframes \"complex-animation\" {\n  0% {\n    opacity: 0;\n    transform: scale(0.5);\n  }\n  50% {\n    opacity: 0.5;\n    transform: scale(1.2);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n@font-face {\n  font-family: \"MyFont\";\n  src: url(\"myfont.woff2\") format(\"woff2\");\n  font-weight: normal;\n  font-style: normal;\n}\n@font-face {\n  font-family: \"CustomFont\";\n  src: url(\"custom.woff\") format(\"woff\");\n}\n@supports (display: grid) {\n  .grid-container {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n  }\n}\n@supports (transform-style: preserve-3d) {\n  @media (min-width: 768px) {\n    .card {\n      transform: rotateY(15deg);\n    }\n  }\n}\n@media print {\n  body {\n    font-size: 12pt;\n    color: black;\n  }\n}\n@media screen {\n  @supports (display: flex) {\n    .container {\n      display: flex;\n    }\n  }\n}\n@media (max-width: 600px) {\n  .sidebar {\n    display: none;\n  }\n}\n@media (max-width: 768px) {\n  .container {\n    padding: 10px;\n  }\n}\n@page :left {\n  margin-left: 4cm;\n  margin-right: 3cm;\n}\n@page :right {\n  margin-left: 3cm;\n  margin-right: 4cm;\n}\n@media (max-width: 600px) {\n  .wrapper .mobile-only {\n    display: block;\n  }\n}\n@media (min-width: 1024px) {\n  .desktop {\n    display: block;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules/at-rules.less",
    "content": "// Test various @-rule types and structures\n\n// @page with simple block\n@page {\n  margin: 2cm;\n  @top-left {\n    content: \"Page \" counter(page);\n  }\n}\n\n// @page with nested rules\n@page :first {\n  margin: 3cm;\n  @top-center {\n    content: \"First Page\";\n  }\n}\n\n// @charset\n@charset \"UTF-8\";\n\n// @namespace\n@namespace url(http://www.w3.org/1999/xhtml);\n@namespace svg url(http://www.w3.org/2000/svg);\n\n// @viewport\n@viewport {\n  width: device-width;\n  initial-scale: 1.0;\n}\n\n// @keyframes with simple block\n@keyframes slidein {\n  from {\n    margin-left: 100%;\n    width: 300%;\n  }\n  to {\n    margin-left: 0%;\n    width: 100%;\n  }\n}\n\n// @keyframes with nested rules (name can be a string)\n@keyframes \"complex-animation\" {\n  0% {\n    opacity: 0;\n    transform: scale(0.5);\n  }\n  50% {\n    opacity: 0.5;\n    transform: scale(1.2);\n  }\n  100% {\n    opacity: 1;\n    transform: scale(1);\n  }\n}\n\n// @font-face with simple block\n@font-face {\n  font-family: \"MyFont\";\n  src: url(\"myfont.woff2\") format(\"woff2\");\n  font-weight: normal;\n  font-style: normal;\n}\n\n// @font-face with variables\n@font-family-name: \"CustomFont\";\n@font-face {\n  font-family: @font-family-name;\n  src: url(\"custom.woff\") format(\"woff\");\n}\n\n// @supports with simple block\n@supports (display: grid) {\n  .grid-container {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n  }\n}\n\n// @supports with nested @-rules\n@supports (transform-style: preserve-3d) {\n  @media (min-width: 768px) {\n    .card {\n      transform: rotateY(15deg);\n    }\n  }\n}\n\n// @media with simple block\n@media print {\n  body {\n    font-size: 12pt;\n    color: black;\n  }\n}\n\n// @media with nested @-rules\n@media screen {\n  @supports (display: flex) {\n    .container {\n      display: flex;\n    }\n  }\n}\n\n// @-rule with value (not simple block)\n@media (max-width: 600px) {\n  .sidebar {\n    display: none;\n  }\n}\n\n// @-rule inside ruleset\n.container {\n  @media (max-width: 768px) {\n    padding: 10px;\n  }\n}\n\n// Multiple @-rules\n@page :left {\n  margin-left: 4cm;\n  margin-right: 3cm;\n}\n\n@page :right {\n  margin-left: 3cm;\n  margin-right: 4cm;\n}\n\n// @-rule with mixins\n.mixin-with-atrule() {\n  @media (max-width: 600px) {\n    .mobile-only {\n      display: block;\n    }\n  }\n}\n\n.wrapper {\n  .mixin-with-atrule();\n}\n\n// @-rule with variables in value\n@breakpoint: 1024px;\n@media (min-width: @breakpoint) {\n  .desktop {\n    display: block;\n  }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-declarations/at-rules-declarations.css",
    "content": "@page {\n  margin: 2cm;\n  size: A4;\n  marks: crop cross;\n}\n@font-face {\n  font-family: \"MyFont\";\n  src: url(\"myfont.woff2\");\n  font-weight: 400;\n  font-style: normal;\n}\n@counter-style my-counter {\n  system: fixed;\n  symbols: \"A\" \"B\" \"C\";\n  suffix: \". \";\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-declarations/at-rules-declarations.less",
    "content": "// Tests for atrule.js line 117 - genCSS with simpleBlock declarations\n// Covers parser + genCSS + outputRuleset with declarations path\n\n// @page with declarations (simpleBlock)\n@page {\n  margin: 2cm;\n  size: A4;\n  marks: crop cross;\n}\n\n// @font-face with declarations\n@font-face {\n  font-family: \"MyFont\";\n  src: url(\"myfont.woff2\");\n  font-weight: 400;\n  font-style: normal;\n}\n\n// @counter-style with declarations\n@counter-style my-counter {\n  system: fixed;\n  symbols: \"A\" \"B\" \"C\";\n  suffix: \". \";\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-empty/at-rules-empty.css",
    "content": "@charset \"UTF-8\";\n@import url(\"test.css\");\n@namespace \"http://www.w3.org/1999/xhtml\";\n@namespace svg \"http://www.w3.org/2000/svg\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-empty/at-rules-empty.less",
    "content": "// Tests for atrule.js line 121 - genCSS with no rules or declarations\n// Covers parser + genCSS path\n\n// @charset without block\n@charset \"UTF-8\";\n\n// @import (will be processed separately, but tests the path)\n@import url(\"test.css\");\n\n// @namespace\n@namespace \"http://www.w3.org/1999/xhtml\";\n\n// @namespace with prefix\n@namespace svg \"http://www.w3.org/2000/svg\";\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-empty-block/at-rules-empty-block.css",
    "content": ""
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-empty-block/at-rules-empty-block.less",
    "content": "// Tests for atrule.js lines 255-256 - empty rules block in non-compressed mode\n// Covers parser + genCSS + outputRuleset with empty rules\n\n// @media with empty block\n@media screen {\n}\n\n// @supports with empty block  \n@supports (display: grid) {\n}\n\n// @layer with empty block\n@layer base {\n}\n\n// @page with empty block\n@page {\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-keyword-comments/at-rules-keyword-comments.css",
    "content": "@import \"test.css\" screen, print;\n@media screen, print, handheld {\n  /* comment */\n  /* another */\n  body {\n    font-size: 12pt;\n  }\n}\n/* comment */\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-keyword-comments/at-rules-keyword-comments.less",
    "content": "// Tests for atrule.js keywordList method with Comments (line 84)\n// Covers parser + eval + keywordList path\n// This tests when a keyword list contains Comments\n\n@media screen /* comment */, print /* another */, handheld {\n  body {\n    font-size: 12pt;\n  }\n}\n\n// @import with media queries containing comments\n@import \"test.css\" screen /* comment */, print;\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-targeted/at-rules-targeted.css",
    "content": "@charset \"UTF-8\";\n@media screen {\n  .test {\n    color: red;\n  }\n}\n@media screen, print, handheld {\n  body {\n    font-size: 12pt;\n  }\n}\n@supports (display: grid) {\n  .grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n  }\n}\n@page {\n  margin: 2cm;\n  size: A4;\n}\n@media screen and (max-width: 768px) {\n  .nested {\n    display: block;\n  }\n}\n@media screen {\n  .container {\n    color: red;\n  }\n  .container .child {\n    color: blue;\n  }\n}\n@media screen {\n  .test-var-access {\n    color: value;\n  }\n}\n@layer base {\n  body {\n    margin: 0;\n  }\n  p {\n    padding: 0;\n  }\n}\n@media screen {\n  body {\n    color: black;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/at-rules-targeted/at-rules-targeted.less",
    "content": "// Targeted tests for specific uncovered lines in atrule.js\n\n// Line 35-36: Single ruleset with declarations (allRulesetDeclarations path)\n@media screen {\n  .test {\n    color: red;\n  }\n}\n\n// Line 138-140: Value that evaluates to keyword list (keywordList method)\n@media screen, print, handheld {\n  body {\n    font-size: 12pt;\n  }\n}\n\n// Line 146-154: rules[0].rules path with mergeable declarations\n@supports (display: grid) {\n  .grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n  }\n}\n\n// Line 155-158: simpleBlock with rules evaluation\n@page {\n  margin: 2cm;\n  size: A4;\n}\n\n// Line 172-174: Non-simpleBlock rules evaluation (evalRoot)\n@media screen {\n  @media (max-width: 768px) {\n    .nested {\n      display: block;\n    }\n  }\n}\n\n// Line 203-215: evalRoot with ampersand counting\n.container {\n  @media screen {\n    & {\n      color: red;\n    }\n    .child {\n      color: blue;\n    }\n  }\n}\n\n// Line 217-236: variable, find, rulesets methods\n// These methods are called when accessing variables/properties from within at-rule scope\n@media screen {\n  @var: value;\n  .test-var-access {\n    color: @var;\n  }\n}\n\n// Line 238-270: outputRuleset (compressed and non-compressed)\n@layer base {\n  body {\n    margin: 0;\n  }\n  p {\n    padding: 0;\n  }\n}\n\n// Line 121: At-rule without rules or declarations\n@charset \"UTF-8\";\n\n// Line 103-105: isRulesetLike and isCharset\n@charset \"UTF-8\";\n@media screen {\n  body {\n    color: black;\n  }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/calc/calc.css",
    "content": ".calc-basic {\n  width: calc(100% - 30px);\n  height: calc(50% + 20px);\n  margin: calc(10px * 2);\n  padding: calc(100vh - 50px);\n}\n.calc-variables {\n  root: calc(100% - 30px);\n  root2: calc(100% - 40px);\n  width: calc(50% + (25vh - 20px));\n  height: calc(50% + (25vh - 20px));\n}\n.calc-nested {\n  min-height: calc(10vh + calc(5vh));\n  nested: calc(calc(2.25rem + 2px) - 1px * 2);\n}\n.calc-functions {\n  one: calc(100% - 20px);\n  two: calc(100% - (10px + 10px));\n  bar: calc(1 + 20%);\n}\n.calc-escape {\n  three: calc(100% - (3 * 1));\n  four: calc(100% - (3 * 1));\n}\n.calc-mixed {\n  foo: 3 calc(3 + 4) 11;\n  height: calc(100% - ((10px * 3) + (10px * 2)));\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/calc/calc.less",
    "content": "@val: 10px;\n@var: 50vh/2;\n\n.calc-basic {\n  width: calc(100% - 30px);\n  height: calc(50% + 20px);\n  margin: calc(10px * 2);\n  padding: calc(100vh - 50px);\n}\n\n.calc-variables {\n  @c: 10px + 20px;\n  @calc: (@val + 30px);\n  root: calc(100% - @c);\n  root2: calc(100% - @calc);\n  width: calc(50% + (@var - 20px));\n  height: calc(50% + ((@var - 20px)));\n}\n\n.calc-nested {\n  min-height: calc(((10vh)) + calc((5vh)));\n  nested: calc(calc(2.25rem + 2px) - 1px * 2);\n}\n\n.calc-functions {\n  @a: 10px;\n  @b: 10px;\n  @floor: floor(1 + .1);\n  \n  one: calc(100% - ((min(@a + @b))));\n  two: calc(100% - (((@a + @b))));\n  bar: calc(@floor + 20%);\n}\n\n.calc-escape {\n  three: calc(e('100%') - (3 * 1));\n  four: calc(~'100%' - (3 * 1));\n}\n\n.calc-mixed {\n  foo: 1 + 2 calc(3 + 4) 5 + 6;\n  @v: 10px;\n  height: calc(100% - ((@v * 3) + (@v * 2)));\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/charsets/charsets.css",
    "content": "@charset \"UTF-8\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/charsets/charsets.less",
    "content": "// @charset directive test\n@charset \"UTF-8\";\n\n@import \"import/import-charset-test\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/charsets/import/import-charset-test.less",
    "content": "@charset \"ISO-8859-1\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/alpha.css",
    "content": "#alpha #fromvar {\n  opacity: 0.7;\n}\n#alpha #short {\n  opacity: 1;\n}\n#alpha #long {\n  opacity: 1;\n}\n#alpha #rgba {\n  opacity: 0.2;\n}\n#alpha #hsl {\n  opacity: 1;\n}\n#alpha #transparent-hex4 {\n  opacity: 0;\n}\n#alpha #transparent-hex8 {\n  opacity: 0;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/alpha.less",
    "content": "// Alpha function tests - no nesting, just alpha function behavior\n#alpha {\n    @colorvar: rgba(150, 200, 150, 0.7);\n    #fromvar {\n        opacity: alpha(@colorvar);\n    }\n    #short {\n        opacity: alpha(#aaa);\n    }\n    #long {\n        opacity: alpha(#bababa);\n    }\n    #rgba {\n        opacity: alpha(rgba(50, 120, 95, 0.2));\n    }\n    #hsl {\n        opacity: alpha(hsl(120, 100%, 50%));\n    }\n    #transparent-hex4 {\n        opacity: alpha(#0000);\n    }\n    #transparent-hex8 {\n        opacity: alpha(#00000000);\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/basic.css",
    "content": ".lightenblue {\n  color: #3333ff;\n}\n.darkenblue {\n  color: #0000cc;\n}\n.unknowncolors {\n  color: blue2;\n  border: 2px solid superred;\n}\n.transparent {\n  color: transparent;\n  background-color: rgba(0, 0, 0, 0);\n}\n#percentage {\n  color: 255;\n  border-color: rgba(255, 0, 0, 0.5);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/basic.less",
    "content": "// Basic color function tests - no nesting, just color functions\n.lightenblue {\n    color: lighten(blue, 10%);\n}\n\n.darkenblue {\n    color: darken(blue, 10%);\n}\n\n.unknowncolors {\n    color: blue2;\n    border: 2px solid superred;\n}\n\n.transparent {\n    color: transparent;\n    background-color: rgba(0, 0, 0, 0);\n}\n\n#percentage {\n  color: red(rgb(100%, 0, 0));\n  border-color: rgba(100%, 0, 0, 50%);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/comprehensive.css",
    "content": ".lightenblue {\n  color: #3333ff;\n}\n.darkenblue {\n  color: #0000cc;\n}\n.unknowncolors {\n  color: blue2;\n  border: 2px solid superred;\n}\n.transparent {\n  color: transparent;\n  background-color: rgba(0, 0, 0, 0);\n}\n#alpha #fromvar {\n  opacity: 0.7;\n}\n#alpha #short {\n  opacity: 1;\n}\n#alpha #long {\n  opacity: 1;\n}\n#alpha #rgba {\n  opacity: 0.2;\n}\n#alpha #hsl {\n  opacity: 1;\n}\n#percentage {\n  color: 255;\n  border-color: rgba(255, 0, 0, 0.5);\n}\n#grey {\n  color: #c8c8c8;\n}\n#aa3333 {\n  color: #aa3333;\n}\n#bb8080 {\n  color: hsl(0, 30%, 62%);\n}\n#ccff00 {\n  color: hsl(72, 100%, 50%);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/comprehensive.less",
    "content": "// Comprehensive color function tests - all color functions without problematic nesting\n.lightenblue {\n    color: lighten(blue, 10%);\n}\n\n.darkenblue {\n    color: darken(blue, 10%);\n}\n\n.unknowncolors {\n    color: blue2;\n    border: 2px solid superred;\n}\n\n.transparent {\n    color: transparent;\n    background-color: rgba(0, 0, 0, 0);\n}\n\n#alpha {\n    @colorvar: rgba(150, 200, 150, 0.7);\n    #fromvar {\n        opacity: alpha(@colorvar);\n    }\n    #short {\n        opacity: alpha(#aaa);\n    }\n    #long {\n        opacity: alpha(#bababa);\n    }\n    #rgba {\n        opacity: alpha(rgba(50, 120, 95, 0.2));\n    }\n    #hsl {\n        opacity: alpha(hsl(120, 100%, 50%));\n    }\n}\n\n#percentage {\n  color: red(rgb(100%, 0, 0));\n  border-color: rgba(100%, 0, 0, 50%);\n}\n\n#grey {\n  color: rgb(200, 200, 200);\n}\n\n#aa3333 {\n  color: rgb(66.66%, 20%, 20%);\n}\n\n#bb8080 {\n  color: hsl(0deg, 30%, 62%);\n}\n\n#ccff00 {\n  color: hsl(72deg, 100%, 50%);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/formats.css",
    "content": "#yelow #short {\n  color: #fea;\n}\n#yelow #long {\n  color: #ffeeaa;\n}\n#yelow #rgba {\n  color: rgba(255, 238, 170, 0.1);\n}\n#yelow #argb {\n  color: #1affeeaa;\n}\n#blue #short {\n  color: #00f;\n}\n#blue #long {\n  color: #0000ff;\n}\n#blue #rgba {\n  color: rgba(0, 0, 255, 0.1);\n}\n#blue #argb {\n  color: #1a0000ff;\n}\n#alpha #hsla {\n  color: hsla(11, 20%, 20%, 0.6);\n}\n#grey {\n  color: #c8c8c8;\n}\n#aa3333 {\n  color: #aa3333;\n}\n#bb8080 {\n  color: hsl(0, 30%, 62%);\n}\n#ccff00 {\n  color: hsl(72, 100%, 50%);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/formats.less",
    "content": "// Color format tests - testing different color formats and conversions\n#yelow #short {\n  color: #fea;\n}\n#yelow #long {\n  color: #ffeeaa;\n}\n#yelow #rgba {\n  color: rgba(255, 238, 170, 0.1);\n}\n#yelow #argb {\n  color: argb(rgba(255, 238, 170, 0.1));\n}\n\n#blue #short {\n  color: #00f;\n}\n#blue #long {\n  color: #0000ff;\n}\n#blue #rgba {\n  color: rgba(0, 0, 255, 0.1);\n}\n#blue #argb {\n  color: argb(rgba(0, 0, 255, 0.1));\n}\n\n#alpha #hsla {\n    color: hsla(11, 20%, 20%, 0.6);\n}\n\n#grey {\n  color: rgb(200, 200, 200);\n}\n\n#aa3333 {\n  color: rgb(66.66%, 20%, 20%);\n}\n\n#bb8080 {\n  color: hsl(0deg, 30%, 62%);\n}\n\n#ccff00 {\n  color: hsl(72deg, 100%, 50%);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/modern-syntax.css",
    "content": "foo {\n  color: #0080ff;\n  color: rgba(0, 128, 255, 0.5);\n  color: hsl(198, 28%, 50%);\n  color: hsla(198, 28%, 50%, 0.5);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/modern-syntax.less",
    "content": "// Modern CSS color syntax tests - space-separated values and / alpha syntax\nfoo {\n  color: rgb(0 128 255);\n  color: rgb(0 128 255 / 50%);\n  color: hsl(198deg 28% 50%);\n  color: hsl(198deg 28% 50% / 50%);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/modern.css",
    "content": ".color-oklch-sub {\n  background: oklch(from #0000FF calc(l - 0.1) c h);\n}\n.color-oklch-add {\n  background: oklch(from #0000FF calc(l + 0.1) c h);\n}\n.color-oklch-mult {\n  background: oklch(from #0000FF calc(l * 0.1) c h);\n}\n.color-oklch-div {\n  background: oklch(from #0000FF calc(l / 2) c h);\n}\n.color-hsl-sub {\n  background: hsl(from #0000FF calc(h - 1) s l);\n}\n.color-hsl-add {\n  background: hsl(from #0000FF calc(h + 1) s l);\n}\n.color-hsl-mult {\n  background: hsl(from #0000FF calc(h * 1) s l);\n}\n.color-hsl-div {\n  background: hsl(from #0000FF calc(h / 2) s l);\n}\n.color-rgb-sub {\n  background: rgb(from #0000FF calc(r - 1) g b);\n}\n.color-rgb-add {\n  background: rgb(from #0000FF calc(r + 1) g b);\n}\n.color-rgb-mult {\n  background: rgb(from #0000FF calc(r * 1) g b);\n}\n.color-rgb-div {\n  background: rgb(from #0000FF calc(r / 2) g b);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/modern.less",
    "content": "// Modern color space function tests\n.color-oklch-sub {\n  background: oklch(from #0000FF calc(l - 0.1) c h);\n}\n\n.color-oklch-add {\n  background: oklch(from #0000FF calc(l + 0.1) c h);\n}\n\n.color-oklch-mult {\n  background: oklch(from #0000FF calc(l * 0.1) c h);\n}\n\n.color-oklch-div {\n  background: oklch(from #0000FF calc(l / 2) c h);\n}\n\n.color-hsl-sub {\n  background: hsl(from #0000FF calc(h - 1) s l);\n}\n\n.color-hsl-add {\n  background: hsl(from #0000FF calc(h + 1) s l);\n}\n\n.color-hsl-mult {\n  background: hsl(from #0000FF calc(h * 1) s l);\n}\n\n.color-hsl-div {\n  background: hsl(from #0000FF calc(h / 2) s l);\n}\n\n.color-rgb-sub {\n  background: rgb(from #0000FF calc(r - 1) g b);\n}\n\n.color-rgb-add {\n  background: rgb(from #0000FF calc(r + 1) g b);\n}\n\n.color-rgb-mult {\n  background: rgb(from #0000FF calc(r * 1) g b);\n}\n\n.color-rgb-div {\n  background: rgb(from #0000FF calc(r / 2) g b);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/operations.css",
    "content": "#overflow .a {\n  color: #000000;\n}\n#overflow .b {\n  color: #ffffff;\n}\n#overflow .c {\n  color: #ffffff;\n}\n#overflow .d {\n  color: #00ff00;\n}\n#overflow .e {\n  color: rgba(0, 31, 255, 0.42);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/operations.less",
    "content": "// Color operations tests - testing color math operations\n#overflow {\n  .a { color: (#111111 - #444444); } // #000000\n  .b { color: (#eee + #fff); } // #ffffff\n  .c { color: (#aaa * 3); } // #ffffff\n  .d { color: (#00ee00 + #009900); } // #00ff00\n  .e { color: rgba(-99.9, 31.4159, 321, 0.42); }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/rgba.css",
    "content": "#rrggbbaa {\n  test-1: #55FF5599;\n  test-2: #5F59;\n  test-3: rgba(136, 255, 136, 0.6);\n  test-4: rgba(85, 255, 85, 0.1);\n  test-5: rgba(85, 255, 85, 0.6);\n  test-6: rgba(85, 255, 85, 0.6);\n  test-7: rgba(85, 255, 85, 0.5);\n  test-8: rgba(var(--color-accent), 0.2);\n  test-9: rgb(var(--color-accent));\n  test-9: hsla(var(--color-accent));\n  test-10: #55FF5599;\n  test-11: hsla(120, 100%, 66.66666667%, 0.6);\n  test-12: hsla(120, 100%, 66.66666667%, 0.5);\n  --semi-transparent-dark-background: #001e00ee;\n  --semi-transparent-dark-background-2: #001e00;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/color-functions/rgba.less",
    "content": "// RGBA and RRGGBBAA tests\n#rrggbbaa {\n  test-1: #55FF5599;\n  test-2: #5F59;\n  test-3: lighten(#55FF5599, 10%);\n  test-4: fade(#5F59, 10%);\n  test-5: rgba(#55FF5599);\n  test-6: rgba(#5F59);\n  test-7: rgba(#5F59, 0.5);\n  test-8: rgba(var(--color-accent), 0.2);\n  test-9: rgb(var(--color-accent));\n  test-9: hsla(var(--color-accent));\n  test-10: color('#55FF5599');\n  test-11: hsla(#5F59);\n  test-12: hsla(#5F59, 0.5);\n  --semi-transparent-dark-background: #001e00ee;\n  --semi-transparent-dark-background-2: rgba(0, 30, 0, 238); // invalid opacity will be capped\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/comments/comments.css",
    "content": "/******************\\\n*                  *\n*  Comment Header  *\n*                  *\n\\******************/\n/*\n\n    Comment\n\n*/\n/*\n * Comment Test\n *\n * - cloudhead (http://cloudhead.net)\n *\n */\n/* Colors\n * ------\n *   #EDF8FC (background blue)\n *   #166C89 (darkest blue)\n *\n * Text:\n *   #333 (standard text) // A comment within a comment!\n *   #1F9EC9 (standard link)\n *\n */\n/* @group Variables\n------------------- */\n#comments,\n.comments {\n  /**/\n  color: red;\n  /* A C-style comment */\n  /* A C-style comment */\n  background-color: orange;\n  font-size: 12px;\n  /* lost comment */\n  content: \"content\";\n  border: 1px solid black;\n  padding: 0;\n  margin: 2em;\n}\n/* commented out\n  #more-comments {\n    color: grey;\n  }\n*/\n.selector,\n.lots,\n.comments {\n  color: grey, /* blue */ orange;\n  -webkit-border-radius: 2px /* webkit only */;\n  -moz-border-radius: 8px /* moz only with operation */;\n}\n.test-rule {\n  color: 1px;\n}\n.sr-only-focusable {\n  clip: auto;\n}\n@-webkit-keyframes hover {\n  /* and Chrome */\n  0% {\n    color: red;\n  }\n}\n#last {\n  color: blue;\n}\n/*  */\n/* { */\n/*  */\n/*  */\n/*  */\n#div {\n  color: #A33;\n}\n/* } */\n/*by block */\n#output-block {\n  --comment: /* // Not commented out // */;\n}\n/*comment on last line*/\n"
  },
  {
    "path": "packages/test-data/tests-unit/comments/comments.less",
    "content": "// Comprehensive comment handling tests\n/******************\\\n*                  *\n*  Comment Header  *\n*                  *\n\\******************/\n\n/*\n\n    Comment\n\n*/\n\n/*\n * Comment Test\n *\n * - cloudhead (http://cloudhead.net)\n *\n */\n\n////////////////\n@var: \"content\";\n////////////////\n\n/* Colors\n * ------\n *   #EDF8FC (background blue)\n *   #166C89 (darkest blue)\n *\n * Text:\n *   #333 (standard text) // A comment within a comment!\n *   #1F9EC9 (standard link)\n *\n */\n\n/* @group Variables\n------------------- */\n#comments /* boo *//* boo again*/,\n//.commented_out1\n//.commented_out2\n//.commented_out3\n.comments //end of comments1\n//end of comments2\n{\n  /**/ // An empty comment\n  color: red; /* A C-style comment */  /* A C-style comment */\n  background-color: orange; // A little comment\n  font-size: 12px;\n\n  /* lost comment */ content: @var;\n\n  border: 1px solid black;\n\n  // padding & margin //\n  padding: 0; // }{ '\"\n  margin: 2em;\n} //\n\n/* commented out\n  #more-comments {\n    color: grey;\n  }\n*/\n\n.selector /* .with */, .lots, /* of */ .comments {\n  color/* survive */ /* me too */: grey, /* blue */ orange;\n  -webkit-border-radius: 2px /* webkit only */;\n  -moz-border-radius: (2px * 4) /* moz only with operation */;\n}\n\n.mixin_def_with_colors(@a: white, // in\n       @b: 1px //put in @b - causes problems! --->\n       ) // the\n       when (@a = white) {\n    .test-rule {\n        color: @b;\n    }\n}\n.mixin_def_with_colors();\n\n// .s when\n//R/2\n\n.sr-only-focusable {\n  clip: auto;\n}\n\n@-webkit-keyframes /* Safari */ hover /* and Chrome */ {\n  0% {\n    color: red;\n  }\n}\n\n#last { color: blue }\n//\n\n/*  *//* { *//*  *//*  *//*  */#div { color:#A33; }/* } */\n\n// line immediately followed\n/*by block */\n@string_w_comment: ~\"/* // Not commented out // */\";\n#output-block { --comment: @string_w_comment; }\n/*comment on last line*/\n"
  },
  {
    "path": "packages/test-data/tests-unit/comments/comments2.css",
    "content": "@-webkit-keyframes hover {\n  /* Safari and Chrome */\n}\n.bg {\n  background-image: linear-gradient(#333 /*{comment}*/, #111);\n}\n#planadvisor,\n.first,\n.planning {\n  margin: 10px;\n  total-width: 96em;\n}\n.some-inline-comments {\n  a: yes /* comment */;\n  b: red /* comment */;\n  c: yes /* comment */;\n  d: red /* comment */;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/comments/comments2.less",
    "content": "// Inline comments and grid system tests\n@media all and/*! */(max-width:1024px) {}\n@-webkit-keyframes hover /* Safari and Chrome */{  }\n.bg {\n  background-image: linear-gradient(#333 /*{comment}*/, #111);\n}\n#planadvisor,\n/*comment*//*comment*/\n.first,/*comment*//*comment*/.planning {\n    margin:10px;\n    total-width: @total-width;\n}\n@base                       :   1;\n@column-width               :   @base * 6em;                //      Width of column             */\n@gutter-width               :   2em;                        //      Width of column spacing     */\n@columns                    :   12;                         //      Number of Columns           */\n@gridsystem-width           :   (@column-width *            //      For calculating the total   */\n                                    @columns) + (               //      width of the content area.  */\n                                    @gutter-width *             //      We strongly recommend you   */\n                                    @columns);                  //      do not change this formula. */\n@total-width                :   @gridsystem-width;          //      set to 100% for fluid grid  */\n\n// .............................................................................\n\n.some-inline-comments {\n    a: yes /* comment */;\n    b: red /* comment */;\n   @c: yes /* comment */;\n   @d: red /* comment */;\n    c: @c;\n    d: @d;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/container/container.css",
    "content": ".widget.discoverresults,\n.widget.repositoriesresults {\n  container-type: inline-size;\n}\n@container (max-width: 350px) {\n  .widget.discoverresults .cite .wdr-authors,\n  .widget.repositoriesresults .cite .wdr-authors {\n    display: none;\n  }\n}\n@container (min-width: 700px) {\n  .card h2 {\n    font-size: 2em;\n  }\n}\n@container sidebar (min-width: 700px) {\n  .card {\n    font-size: 2em;\n  }\n}\n@container (min-width: 60ch) {\n  .container:nth-child(odd) > article {\n    border: 1px solid grey;\n  }\n}\n@container size(min-width: 60ch) {\n  .article--post header {\n    grid-template-areas: \"avatar name\" \"avatar headline\";\n    align-items: start;\n  }\n  .article--post {\n    grid-template-areas: \"header header\" \". stats\" \". content\";\n    grid-auto-columns: 5rem 1fr;\n    column-gap: 1rem;\n  }\n  .article--post__title {\n    font-size: 1.75rem;\n  }\n}\n.card h2 {\n  container-type: inline-size;\n  margin: 0;\n  padding: 10px;\n}\n@container (min-width: 500px) {\n  .card h2 .card-content {\n    grid-template-columns: 1fr 2fr;\n    grid-template-rows: auto 1fr;\n    align-items: start;\n    column-gap: 20px;\n  }\n  .card h2 .card-content h2 {\n    padding: 0;\n    margin: 0.5em 0 0 0;\n  }\n}\n@container (width >= 500px) and (height >= 500px) {\n  .card-content h2 {\n    padding: 0;\n    margin: 0.5em 0 0 0;\n  }\n}\n@container (width > 760px) not (height > 670px) {\n  .card-content h2 {\n    padding: 0;\n    margin: 0.5em 0 0 0;\n  }\n}\n@container not (height <= 1080px) {\n  .card-content h2 {\n    padding: 0;\n    margin: 0.5em 0 0 0;\n  }\n}\n@container (width < 500px) or (height < 500px) {\n  .card-content h2 {\n    padding: 0;\n    margin: 0.5em 0 0 0;\n  }\n}\n@container (width < 500px) or (height < 500px) and (inline-size >= 0px) {\n  .card-content p {\n    padding: 0;\n  }\n  .card-content p h2 {\n    margin: 0.5em 0 0 0;\n  }\n}\n@container my-page-layout (width < 500px) or (height < 500px) and (block-size > 12em) {\n  .card-content p {\n    padding: 0;\n  }\n  .card-content p h2 {\n    margin: 0.5em 0 0 0;\n  }\n}\n@container (width < 500px) or (height < 500px) and (aspect-ratio: 3/2) {\n  .card-content p {\n    padding: 0;\n  }\n  .card-content p h2 {\n    margin: 0.5em 0 0 0;\n  }\n}\n@container (width < 500px) or (height < 500px) and (orientation: portrait) {\n  .card-content p {\n    padding: 0;\n  }\n  .card-content p h2 {\n    margin: 0.5em 0 0 0;\n  }\n}\n@container card (inline-size > 30em) {\n  .card-content p {\n    padding: 0;\n  }\n  .card-content p h2 {\n    margin: 0.5em 0 0 0;\n  }\n}\n@container card (inline-size > 30em) and style(--responsive: true) {\n  .card-content {\n    grid-template-columns: 1fr 2fr;\n    grid-template-rows: auto 1fr;\n    align-items: start;\n    column-gap: 20px;\n  }\n  .card-content h2 {\n    padding: 0;\n    margin: 0.5em 0 0 0;\n  }\n}\n@container (width < 500px) or (height < 500px) and (orientation: portrait) {\n  .card-content p {\n    padding: 0;\n  }\n  .card-content p h2 {\n    margin: 0.5em 0 0 0;\n  }\n}\n@container my-page-layout (width < 500px) or (height < 500px) and (block-size > 12em) {\n  .card-content p {\n    padding: 0;\n  }\n  .card-content p h2 {\n    margin: 0.5em 0 0 0;\n  }\n}\n.wrapper {\n  container-name: wrapper;\n  container-type: size;\n}\n@container wrapper (height < 100) {\n  a {\n    max-height: 100;\n  }\n}\n@container wrapper (height < 200) {\n  a {\n    max-height: 200;\n  }\n}\n@container wrapper (height < 300) {\n  a {\n    max-height: 300;\n  }\n}\n@media only screen and (min-width: 768px) {\n  @container (min-width: 500px) {\n    .primary-content {\n      font-size: 1rem;\n    }\n  }\n}\n@media only screen and (min-width: 768px) {\n  .media-1 {\n    font-size: 1.5rem;\n  }\n  @container (min-width: 500px) {\n    .primary-content {\n      font-size: 1rem;\n    }\n  }\n}\n@media only screen and (min-width: 768px) {\n  .media-1 {\n    font-size: 1.5rem;\n  }\n  @container (min-width: 500px) {\n    .primary-content {\n      font-size: 1rem;\n    }\n  }\n  .media-2 {\n    font-size: 2rem;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .media-1 {\n    font-size: 1.5rem;\n  }\n  @container (min-width: 500px) {\n    .primary-content {\n      font-size: 1rem;\n    }\n    @media (hover: hover) {\n      .foo {\n        font-size: 1.75rem;\n      }\n    }\n  }\n  .media-2 {\n    font-size: 2rem;\n  }\n}\n@media only screen and (min-width: 768px) {\n  .media-1 {\n    font-size: 1.5rem;\n  }\n  @container (min-width: 500px) {\n    .primary-content {\n      font-size: 1rem;\n    }\n    @media (hover: hover) {\n      .foo {\n        font-size: 1.75rem;\n      }\n      @media not all and (hover: hover) {\n        .foo {\n          color: limegreen;\n        }\n      }\n      .media-3 {\n        padding: 0.5rem;\n      }\n    }\n  }\n  .media-2 {\n    font-size: 2rem;\n  }\n}\n@container (min-width: 768px) {\n  @media only screen and (min-width: 768px) {\n    .foo {\n      color: aliceblue;\n    }\n  }\n  .container-1 {\n    color: purple;\n  }\n}\n#sticky {\n  position: sticky;\n  container-type: scroll-state;\n}\n@container scroll-state(stuck: top) {\n  #sticky-child {\n    font-size: 75%;\n  }\n}\n@container scroll-state(snapped: x) {\n  #sticky-child {\n    font-size: 75%;\n  }\n}\n@container scroll-state(scrollable: top) {\n  #sticky-child {\n    font-size: 75%;\n  }\n}\n@container foo (min-width: 400px) {\n  #sticky-child {\n    font-size: 75%;\n  }\n}\n.mixin-container-test {\n  color: red;\n}\n@container name (width < 125px) {\n  .mixin-container-test {\n    display: none;\n  }\n}\n@container sidebar (width < 500px) {\n  .sidebar-test {\n    display: none;\n  }\n}\n@container header (width < 800px) {\n  .header-test {\n    display: none;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/container/container.less",
    "content": ".widget.discoverresults, .widget.repositoriesresults {\n    container-type: inline-size;\n\n    @container (max-width: 350px) {           \n        .cite {\n            .wdr-authors {\n                display: none;\n            }\n        }\n    }\n}\n\n@container (min-width: 700px) {\n    .card h2 {\n        font-size: 2em;\n    }\n}\n\n@container sidebar (min-width: 700px) {\n    .card {\n        font-size: 2em;\n    }\n}\n\n@container (min-width: 60ch) {\n    .container:nth-child(odd) > article {\n        border: 1px solid grey;\n    }\n}\n\n@container size(min-width: 60ch) {\n    .article--post header {\n        grid-template-areas:\n            \"avatar name\"\n            \"avatar headline\";\n        align-items: start;\n    }\n  \n    .article--post {\n        grid-template-areas: \"header header\" \". stats\" \". content\";\n        grid-auto-columns: 5rem 1fr;\n        column-gap: 1rem;\n    }\n  \n    .article--post__title {\n        font-size: 1.75rem;\n    }\n}\n\n.card h2 {\n    container-type: inline-size;\n    margin: 0;\n    padding: 10px;\n\n    @container (min-width: 500px) {\n        .card-content {\n            grid-template-columns: 1fr 2fr;\n            grid-template-rows: auto 1fr;\n            align-items: start;\n            column-gap: 20px;\n        }\n \n        .card-content h2 {\n            padding: 0;\n            margin: 0.5em 0 0 0;\n        } \n    }\n}\n\n@container (width >= 500px) and (height >= 500px) {\n    .card-content h2 {\n        padding: 0;\n        margin: 0.5em 0 0 0;\n    } \n}\n\n@container (width > 760px) not (height > 670px) {\n    .card-content h2 {\n        padding: 0;\n        margin: 0.5em 0 0 0;\n    } \n}\n\n@container not (height <= 1080px) {\n    .card-content h2 {\n        padding: 0;\n        margin: 0.5em 0 0 0;\n    } \n}\n\n@container (width < 500px) or (height < 500px) {\n    .card-content h2 {\n        padding: 0;\n        margin: 0.5em 0 0 0;\n    } \n}\n\n@container (width < 500px) or (height < 500px) and (inline-size >= 0px) {\n    .card-content p {\n        padding: 0;\n\n        h2 {\n            margin: 0.5em 0 0 0;\n        }\n    } \n}\n\n@container my-page-layout (width < 500px) or (height < 500px) and (block-size > 12em) {\n    .card-content p {\n        padding: 0;\n\n        h2 {\n            margin: 0.5em 0 0 0;\n        }\n    } \n}\n\n@container (width < 500px) or (height < 500px) and (aspect-ratio: 3/2) {\n    .card-content p {\n        padding: 0;\n\n        h2 {\n            margin: 0.5em 0 0 0;\n        }\n    } \n}\n\n@container (width < 500px) or (height < 500px) and (orientation: portrait) {\n    .card-content p {\n        padding: 0;\n\n        h2 {\n            margin: 0.5em 0 0 0;\n        }\n    } \n}\n\n@container card (inline-size > 30em) {\n    .card-content p {\n        padding: 0;\n\n        h2 {\n            margin: 0.5em 0 0 0;\n        }\n    }\n    \n    @container style(--responsive: true) {\n        .card-content {\n            grid-template-columns: 1fr 2fr;\n            grid-template-rows: auto 1fr;\n            align-items: start;\n            column-gap: 20px;\n        }\n \n        .card-content h2 {\n            padding: 0;\n            margin: 0.5em 0 0 0;\n        }\n    }\n}\n\n@container ( width < 500px ) or (height<500px) and (orientation: portrait) {\n    .card-content p {\n        padding: 0;\n\n        h2 {\n            margin: 0.5em 0 0 0;\n        }\n    } \n}\n\n@container my-page-layout ( width< 500px) or ( height<500px) and ( block-size>12em ) {\n    .card-content p {\n        padding: 0;\n\n        h2 {\n            margin: 0.5em 0 0 0;\n        }\n    } \n}\n\n.wrapper {\n    container-name: wrapper;\n    container-type: size;\n}\n  \n.my_mixin(@height) {\n    @container wrapper (height < @height) {\n        a {\n            max-height: @height;\n        }\n    }\n}\n  \n.my_mixin(100);\n.my_mixin(200);\n.my_mixin(300);\n\n@media only screen and (min-width: 768px) {\n    @container (min-width: 500px) {\n        .primary-content {\n            font-size: 1rem;\n        }\n    }\n}\n\n@media only screen and (min-width: 768px) {\n    .media-1 {\n        font-size: 1.5rem;\n    }\n\n    @container (min-width: 500px) {\n        .primary-content {\n            font-size: 1rem;\n        }\n    }\n}\n\n@media only screen and (min-width: 768px) {\n    .media-1 {\n        font-size: 1.5rem;\n    }\n    \n    @container (min-width: 500px) {\n        .primary-content {\n            font-size: 1rem;\n        }\n    }\n\n    .media-2 {\n        font-size: 2rem;\n    }\n}\n\n@media only screen and (min-width: 768px) {\n    .media-1 {\n        font-size: 1.5rem;\n    }\n    \n    @container (min-width: 500px) {\n        .primary-content {\n            font-size: 1rem;\n        }\n\n        @media (hover: hover) {\n            .foo {\n                font-size: 1.75rem;\n            }\n        }\n    }\n\n    .media-2 {\n        font-size: 2rem;\n    }\n}\n\n@media only screen and (min-width: 768px) {\n    .media-1 {\n        font-size: 1.5rem;\n    }\n    \n    @container (min-width: 500px) {\n        .primary-content {\n            font-size: 1rem;\n        }\n\n        @media (hover: hover) {\n            .foo {\n                font-size: 1.75rem;\n\n                @media not all and (hover: hover) {\n                    color: limegreen;\n                }\n            }\n\n            .media-3 {\n                padding: 0.5rem;\n            }\n        }\n    }\n\n    .media-2 {\n        font-size: 2rem;\n    }\n}\n\n@container (min-width: 768px) {\n    @media only screen and (min-width: 768px) {\n        .foo {\n            color: aliceblue;\n        }\n    }\n\n    .container-1 {\n        color: purple;\n    }\n}\n\n#sticky {\n    position: sticky;\n    container-type: scroll-state;\n}\n\n@container scroll-state(stuck: top) {\n    #sticky-child {\n      font-size: 75%;\n    }\n}\n\n@container scroll-state(snapped: x) {\n    #sticky-child {\n      font-size: 75%;\n    }\n}\n\n@container scroll-state(scrollable: top) {\n    #sticky-child {\n      font-size: 75%;\n    }\n}\n\n@varfoo: foo;\n@threshold: 400px;\n@container @varfoo (min-width: @threshold) {\n    #sticky-child {\n      font-size: 75%;\n    }\n}\n\n// Regression test: mixin with variable container name and variable query condition\n// Issue: mixins with parameters using @container @name (condition < @var) failed\n// with \"variable @bp is undefined\" error in older versions\n@issue-width: 125px;\n\n.container-query-mixin(@container-name; @bp) {\n    @container @container-name (width < @bp) {\n        display: none;\n    }\n}\n\n.mixin-container-test {\n    .container-query-mixin(name, @issue-width);\n    color: red;\n}\n\n// Verify multiple calls with different params produce correct output\n.sidebar-test {\n    .container-query-mixin(sidebar, 500px);\n}\n.header-test {\n    .container-query-mixin(header, 800px);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-3/css-3.css",
    "content": "@namespace foo url(http://www.example.com);\n.comma-delimited {\n  text-shadow: -1px -1px 1px red, 6px 5px 5px yellow;\n  -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset, 0pt 4px 6px rgba(255, 255, 255, 0.4) inset;\n  -webkit-transform: rotate(0deg);\n}\n@font-face {\n  font-family: Headline;\n  unicode-range: U+??????, U+0???, U+0-7F, U+A5;\n}\n.other {\n  -moz-transform: translate(0, 11em) rotate(-90deg);\n  transform: rotateX(45deg);\n}\n.item[data-cra_zy-attr1b-ut3=bold] {\n  font-weight: bold;\n}\np:not([class*=\"lead\"]) {\n  color: black;\n}\ninput[type=\"text\"].class#id[attr=i32]:not(.one) {\n  color: inherit;\n}\ndiv#id.class[a=one][b=two].class:not(.one) {\n  color: inherit;\n}\nul.comma > li:not(:only-child)::after {\n  color: inherit;\n}\nol.comma > li:nth-last-child(2)::after {\n  color: inherit;\n}\nli:nth-child(4n+1),\nli:nth-child(-5n),\nli:nth-child(-n+2) {\n  color: inherit;\n}\na[href^=\"http://\"] {\n  color: black;\n}\na[href$=\"http://\"] {\n  color: black;\n}\nform[data-disabled] {\n  color: black;\n}\np::before {\n  color: black;\n}\n#issue322 {\n  -webkit-animation: anim2 7s infinite ease-in-out;\n}\n@-webkit-keyframes frames {\n  0% {\n    border: 1px;\n  }\n  5.5% {\n    border: 2px;\n  }\n  100% {\n    border: 3px;\n  }\n}\n@keyframes fontbulger1 {\n  to {\n    font-size: 15px;\n  }\n  from,\n  to {\n    font-size: 12px;\n  }\n  0%,\n  100% {\n    font-size: 12px;\n  }\n}\n@supports ( box-shadow: 2px 2px 2px black ) or\n          ( -moz-box-shadow: 2px 2px 2px black ) {\n  .outline {\n    box-shadow: 2px 2px 2px black;\n    -moz-box-shadow: 2px 2px 2px black;\n  }\n}\n@-x-document url-prefix(\"\"github.com\"\") {\n  h1 {\n    color: red;\n  }\n}\n@viewport {\n  font-size: 10px;\n}\nfoo|h1 {\n  color: blue;\n}\nfoo|* {\n  color: yellow;\n}\n*|h1 {\n  color: green;\n}\nh1 {\n  color: green;\n}\n.upper-test {\n  UpperCaseProperties: allowed;\n}\n@host {\n  div {\n    display: block;\n  }\n}\n:not(input::placeholder) {\n  color: #b3b3b3;\n}\n.shadow > .dom,\nbody > .shadow {\n  display: done;\n}\n:host(.sel.a),\n:host-context(.sel.b),\n.sel > .b,\n::content .sel {\n  type: shadow-dom;\n}\n* b {\n  c: 'd';\n}\n* b[e] {\n  f: 'g';\n}\n#issue2066 {\n  background: url('/images/icon-team.svg') 0 0 / contain;\n}\n@counter-style triangle {\n  system: cyclic;\n  symbols: ‣;\n  suffix: \" \";\n}\n@unknown foo 42 (bar) {\n  x {\n    y: z;\n  }\n}\n@unknown foo 43;\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-3/css-3.less",
    "content": "@namespace foo url(http://www.example.com);\n.comma-delimited {\n  text-shadow: -1px -1px 1px red, 6px 5px 5px yellow;\n  -moz-box-shadow: 0pt 0pt 2px rgba(255, 255, 255, 0.4) inset,\n    0pt 4px 6px rgba(255, 255, 255, 0.4) inset;\n  -webkit-transform: rotate(-0.0000000001deg);\n}\n@font-face {\n  font-family: Headline;\n  unicode-range: U+??????, U+0???, U+0-7F, U+A5;\n}\n.other {\n  -moz-transform: translate(0, 11em) rotate(-90deg);\n  transform: rotateX(45deg);\n}\n.item[data-cra_zy-attr1b-ut3=bold] {\n  font-weight: bold;\n}\np:not([class*=\"lead\"]) {\n  color: black;\n}\n\ninput[type=\"text\"].class#id[attr=i32]:not(.one) {\n  color: inherit;\n}\n\ndiv#id.class[a=one][b=two].class:not(.one) {\n  color: inherit;\n}\n\nul.comma > li:not(:only-child)::after {\n  color: inherit;\n}\n\nol.comma > li:nth-last-child(2)::after {\n  color: inherit;\n}\n\nli:nth-child(4n+1),\nli:nth-child(-5n),\nli:nth-child(-n+2) {\n  color: inherit;\n}\n\na[href^=\"http://\"] {\n  color: black;\n}\n\na[href$=\"http://\"] {\n  color: black;\n}\n\nform[data-disabled] {\n  color: black;\n}\n\np::before {\n  color: black;\n}\n\n#issue322 {\n  -webkit-animation: anim2 7s infinite ease-in-out;\n}\n\n@-webkit-keyframes frames {\n  0% { border: 1px }\n  5.5% { border: 2px }\n  100% { border: 3px }\n}\n\n@keyframes fontbulger1 {\n  to {\n    font-size: 15px;\n  }\n  from,to {\n    font-size: 12px;\n  }\n  0%,100% {\n    font-size: 12px;\n  }\n}\n\n@supports ( box-shadow: 2px 2px 2px black ) or\n          ( -moz-box-shadow: 2px 2px 2px black ) {\n  .outline {\n    box-shadow: 2px 2px 2px black;\n    -moz-box-shadow: 2px 2px 2px black;\n  }\n}\n\n@-x-document url-prefix(\"\"github.com\"\") {\n  h1 {\n    color: red;\n  }\n}\n\n@viewport {\n  font-size: 10px;\n}\n\nfoo|h1 { color: blue; }\nfoo|* { color: yellow; }\n*|h1 { color: green; }\nh1 { color: green; }\n.upper-test {\n  UpperCaseProperties: allowed;\n}\n@host {\n  div {\n    display: block;\n  }\n}\n:not(input::placeholder) {\n  color: #b3b3b3;\n}\n.shadow > .dom,\nbody > .shadow {\n  display: done;\n}\n\n:host(.sel.a),\n:host-context(.sel.b),\n.sel > .b,\n::content .sel {\n  type: shadow-dom;\n}\n* b {\n c: 'd';\n &[e]{\n   f: 'g';\n }\n}\n\n#issue2066 {\n  background: url('/images/icon-team.svg') 0 0 / contain;\n}\n\n@counter-style triangle {\n  system: cyclic;\n  symbols: ‣;\n  suffix: \" \";\n}\n\n@-ms-viewport{\n  // width: auto !important;\n}\n\n@unknown foo 42 (bar) {\n    x {y: z}\n}\n\n@unknown foo 43;\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-escapes/css-escapes.css",
    "content": ".escape\\|random\\|char {\n  color: red;\n}\n.mixin\\!tUp {\n  font-weight: bold;\n}\n.\\34 04 {\n  background: red;\n}\n.\\34 04 strong {\n  color: fuchsia;\n  font-weight: bold;\n}\n.trailingTest\\+ {\n  color: red;\n}\n/* This hideous test of hideousness checks for the selector \"blockquote\" with various permutations of hex escapes */\n\\62\\6c\\6f \\63 \\6B \\0071 \\000075o\\74 e {\n  color: silver;\n}\n[ng\\:cloak],\nng\\:form {\n  display: none;\n}\n.bootstrap {\n  background-color: #000 \\9;\n}\ntextarea {\n  font-family: 'helvetica neue', 'wenquanyi micro hei', \\5FAE\\8F6F\\96C5\\9ED1, \\5B8B\\4F53, sans-serif;\n}\n/* anything to unquote */\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-escapes/css-escapes.less",
    "content": "// CSS escapes tests\n@ugly: fuchsia;\n\n.escape\\|random\\|char {\n    color: red;\n}\n\n.mixin\\!tUp {\n    font-weight: bold;\n}\n\n// class=\"404\"\n.\\34 04 {\n    background: red;\n\n    strong {\n        color: @ugly;\n        .mixin\\!tUp();\n    }\n}\n\n.trailingTest\\+ {\n    color: red;\n}\n\n/* This hideous test of hideousness checks for the selector \"blockquote\" with various permutations of hex escapes */\n\\62\\6c\\6f \\63 \\6B \\0071 \\000075o\\74 e {\n    color: silver;\n}\n\n[ng\\:cloak],\nng\\:form {\n  display: none;\n}\n\n// In Bootstrap v3\n.bootstrap {\n    background-color: #000 \\9;\n}\n\ntextarea {\n    font-family: 'helvetica neue','wenquanyi micro hei',\\5FAE\\8F6F\\96C5\\9ED1, \\5B8B\\4F53, sans-serif;\n}\n\ne('/* anything to unquote */');\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-grid/css-grid.css",
    "content": ".wrapper {\n  display: grid;\n  grid-template-columns: [col1-start] 9fr [col1-end] 10px [col2-start] 3fr [col2-end];\n  grid-template-rows: auto;\n}\n.wrapper {\n  display: grid;\n  grid-template-columns: [left-bound] auto [container-left] 1170px [container-right] auto [right-bound];\n  grid-template-rows: [row-1-start] 140px [row-2-start] 390px [row-3-start] 200px [row-4-start] 120px [row-5-start] 120px [row-6-start] 120px;\n}\n.container-12 {\n  z-index: 20;\n  display: grid;\n  grid-column: container-left / span 1;\n  grid-row: 2;\n  grid-template-columns: [wrapcol-1-start] 1fr [wrapcol-1-end] 15px [wrapcol-2-start] 1fr [wrapcol-2-end] 15px [wrapcol-3-start] 1fr [wrapcol-3-end] 15px [wrapcol-4-start] 1fr [wrapcol-4-end] 15px [wrapcol-5-start] 1fr [wrapcol-5-end] 15px [wrapcol-6-start] 1fr [wrapcol-6-end] 15px [wrapcol-7-start] 1fr [wrapcol-7-end] 15px [wrapcol-8-start] 1fr [wrapcol-8-end] 15px [wrapcol-9-start] 1fr [wrapcol-9-end] 15px [wrapcol-10-start] 1fr [wrapcol-10-end] 15px [wrapcol-11-start] 1fr [wrapcol-11-end] 15px [wrapcol-12-start] 1fr [wrapcol-12-end];\n  grid-template-rows: repeat(14, [gutter] 10px [row] 60px);\n}\n.wrapper {\n  display: grid;\n  grid-template-columns: 9fr 1.875em 3fr;\n  grid-template-rows: auto;\n  grid-template-areas: \"header header header\" \"content . sidebar\" \"footer footer footer\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-grid/css-grid.less",
    "content": ".wrapper {\n  display: grid;\n  grid-template-columns: [col1-start] 9fr [col1-end] 10px [col2-start] 3fr [col2-end];\n  grid-template-rows: auto;\n}\n\n.wrapper {\n  display: grid;\n  grid-template-columns: [left-bound] auto [container-left] 1170px [container-right] auto [right-bound];\n  grid-template-rows: [row-1-start] 140px [row-2-start] 390px [row-3-start] 200px [row-4-start] 120px [row-5-start] 120px [row-6-start] 120px;\n}\n\n.container-12 {\n  z-index: 20;\n  display: grid;\n  grid-column: container-left / span 1;\n  grid-row: 2;\n  grid-template-columns: [wrapcol-1-start] 1fr [wrapcol-1-end] 15px [wrapcol-2-start] 1fr [wrapcol-2-end] 15px [wrapcol-3-start] 1fr [wrapcol-3-end] 15px [wrapcol-4-start] 1fr [wrapcol-4-end] 15px [wrapcol-5-start] 1fr [wrapcol-5-end] 15px [wrapcol-6-start] 1fr [wrapcol-6-end] 15px [wrapcol-7-start] 1fr [wrapcol-7-end] 15px [wrapcol-8-start] 1fr [wrapcol-8-end] 15px [wrapcol-9-start] 1fr [wrapcol-9-end] 15px [wrapcol-10-start] 1fr [wrapcol-10-end] 15px [wrapcol-11-start] 1fr [wrapcol-11-end] 15px [wrapcol-12-start] 1fr [wrapcol-12-end];\n  grid-template-rows: repeat(14, [gutter] 10px [row] 60px);\n}\n\n.wrapper {\n  display: grid;\n  grid-template-columns: 9fr 1.875em 3fr;\n  grid-template-rows: auto;\n  grid-template-areas:\n    \"header header header\"\n    \"content . sidebar\"\n    \"footer footer footer\";\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-guards/css-guards.css",
    "content": ".light {\n  color: green;\n}\n.see-the {\n  color: green;\n}\n.hide-the {\n  color: green;\n}\n.multiple-conditions-1 {\n  color: red;\n}\n.inheritance .test-rule {\n  color: black;\n}\n.inheritance:hover {\n  color: pink;\n}\n.clsWithGuard {\n  dispaly: none;\n}\n.dont-split-me-up {\n  width: 1px;\n  color: red;\n  height: 1px;\n}\n* .dont-split-me-up {\n  sibling: true;\n}\n.scope-check {\n  sub-prop: 2px;\n  prop: 1px;\n}\n.scope-check-2 {\n  sub-prop: 2px;\n  prop: 1px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/css-guards/css-guards.less",
    "content": ".light when (lightness(@a) > 50%) {\n  color: green;\n}\n.dark when (lightness(@a) < 50%) {\n  color: orange;\n}\n@a: #ddd;\n\n.see-the {\n  @a: #444; // this mirrors what mixins do - they evaluate the guards at the point of definition\n  .light();\n  .dark();\n}\n\n.hide-the {\n  .light();\n  .dark();\n}\n\n.multiple-conditions-1 when (@b = 1), (@c = 2), (@d = 3) {\n  color: red;\n}\n\n.multiple-conditions-2 when (@b = 1), (@c = 2), (@d = 2) {\n  color: blue;\n}\n\n@b: 2;\n@c: 3;\n@d: 3;\n\n.inheritance when (@b = 2) {\n  .test-rule {\n    color: black;\n  }\n  &:hover {\n    color: pink;\n  }\n  .hideme when (@b = 1) {\n    color: green;\n  }\n  & when (@b = 1) {\n    hideme: green;\n  }\n}\n\n.hideme when (@b = 1) {\n  .test-rule {\n    color: black;\n  }\n  &:hover {\n    color: pink;\n  }\n  .hideme when (@b = 1) {\n    color: green;\n  }\n}\n\n& when (@b = 1) {\n  .hideme {\n    color: red;\n  }\n}\n\n.mixin-with-guard-inside(@colWidth) {\n  // selector with guard (applies also to & when() ...)\n  .clsWithGuard when (@colWidth <= 0) {\n    dispaly: none;\n  }\n}\n\n.mixin-with-guard-inside(0px);\n\n.dont-split-me-up {\n  width: 1px;\n  & when (@c = 3) {\n    color: red;\n  }\n  & when (@c = 3) {\n    height: 1px;\n  }\n  * & when (@c = 3) {\n    sibling: true;\n  }\n}\n\n.scope-check when (@c = 3) {\n  @k: 1px;\n  & when (@c = 3) {\n    @k: 2px;\n    sub-prop: @k;\n  }\n  prop: @k;\n}\n.scope-check-2 {\n  .scope-check();\n  @k:4px;\n}\n.errors-if-called when (@c = never) {\n  .mixin-doesnt-exist();\n}\na:hover when (2 = true) {5:-}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/detached-rulesets/detached-rulesets.css",
    "content": ".wrap-selector {\n  color: black;\n  one: 1px;\n  four: magic-frame;\n  visible-one: visible;\n  visible-two: visible;\n}\n.wrap-selector {\n  color: red;\n  visible-one: visible;\n  visible-two: visible;\n}\n.wrap-selector {\n  color: black;\n  background: white;\n  visible-one: visible;\n  visible-two: visible;\n}\nheader {\n  background: blue;\n}\n@media screen and (min-width: 1200) {\n  header {\n    background: red;\n  }\n}\nhtml.lt-ie9 header {\n  background: red;\n}\n.wrap-selector {\n  test: extra-wrap;\n  visible-one: visible;\n  visible-two: visible;\n}\n.wrap-selector .wrap-selector {\n  test: wrapped-twice;\n  visible-one: visible;\n  visible-two: visible;\n}\n.wrap-selector {\n  test-func: 90;\n  test-arithmetic: 18px;\n  visible-one: visible;\n  visible-two: visible;\n}\n.without-mixins {\n  b: 1;\n}\n@media (orientation: portrait) and (tv) {\n  .my-selector {\n    background-color: black;\n  }\n}\n@media (orientation: portrait) and (widescreen) and (print) and (tv) {\n  .triple-wrapped-mq {\n    triple: true;\n  }\n}\n@media (orientation: portrait) and (widescreen) and (tv) {\n  .triple-wrapped-mq {\n    triple: true;\n  }\n}\n@media (orientation: portrait) and (tv) {\n  .triple-wrapped-mq {\n    triple: true;\n  }\n}\n.a {\n  test: test;\n}\n.argument-default {\n  default: works;\n  direct: works;\n  named: works;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/detached-rulesets/detached-rulesets.less",
    "content": "@ruleset: {\n  color: black;\n  background: white;\n}\n\n@a: 1px;\n.wrap-mixin(@ruleset) {\n  @a: hidden and if you see this in the output its a bug;\n  @b: visible;\n  @d: magic-frame; // same behaviour as mixin calls - falls back to this frame\n  .wrap-selector {\n      @c: visible;\n      @ruleset();\n      visible-one: @b;\n      visible-two: @c;\n    }\n}\n\n.wrap-mixin({\n  color: black;\n  one: @a;\n  @b: hidden and if you see this in the output its a bug;\n  @c: hidden and if you see this in the output its a bug;\n  four: @d;\n});\n\n.wrap-mixin(@ruleset: {\n  color: red;\n});\n\n.wrap-mixin(@ruleset);\n\n.desktop-and-old-ie(@rules) {\n  @media screen and (min-width: 1200) { @rules() }\n  html.lt-ie9 &                       { @rules() }\n}\n\nheader {\n  background: blue;\n\n  .desktop-and-old-ie({\n    background: red;\n  });\n}\n\n.wrap-mixin-calls-wrap(@ruleset) {\n  .wrap-mixin(@ruleset);\n};\n\n.wrap-mixin({\n  test: extra-wrap;\n  .wrap-mixin-calls-wrap({\n    test: wrapped-twice;\n  });\n});\n\n.wrap-mixin({\n  test-func: unit(90px);\n  test-arithmetic: unit((9+9), px);\n});\n// without mixins\n@ruleset-2: {\n  b: 1;\n};\n.without-mixins {\n  @ruleset-2();\n}\n@my-ruleset: {\n    .my-selector {\n      @media (tv) {\n        background-color: black;\n      }\n    }\n  };\n@media (orientation:portrait) {\n    @my-ruleset();\n    .wrap-media-mixin({\n      @media (tv) {\n        .triple-wrapped-mq {\n          triple: true;\n        }\n      }\n    });\n}\n.wrap-media-mixin(@ruleset) {\n  @media (widescreen) {\n    @media (print) {\n      @ruleset();\n    }\n    @ruleset();\n  }\n  @ruleset();\n}\n// unlocking mixins\n@my-mixins: {\n  .mixin() {\n    test: test;\n  }\n};\n@my-mixins();\n.a {\n  .mixin();\n}\n// as mixin argument default\n.mixin-definition(@a: {}; @b: {default: works;};) {\n  @a();\n  @b();\n}\n.argument-default {\n  .mixin-definition();\n  .mixin-definition({direct: works;}; @b: {named: works;});\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/directives-bubbling/directives-bubbling.css",
    "content": ".parent {\n  color: green;\n}\n@document url-prefix() {\n  .parent .child {\n    color: red;\n  }\n}\n@supports (sandwitch: butter) {\n  .inside .top {\n    property: value;\n  }\n}\n@supports (sandwitch: bread) {\n  .in1 .in2 {\n    property: value;\n  }\n}\n@supports (sandwitch: ham) {\n  .inside .top {\n    property: value;\n  }\n}\n@supports (font-family: weirdFont) {\n  @font-face {\n    font-family: something;\n    src: made-up-url;\n  }\n}\n@font-face {\n  @supports not (-webkit-font-smoothing: subpixel-antialiased) {\n    font-family: something;\n    src: made-up-url;\n  }\n}\n@supports (property: value) {\n  @media (max-size: 2px) {\n    @supports (whatever: something) {\n      .outOfMedia  {\n        property: value;\n      }\n    }\n  }\n}\n@supports (property: value) {\n  @media (max-size: 2px) {\n    @supports (whatever: something) {\n      .onTop  {\n        property: value;\n      }\n    }\n  }\n}\n@media print {\n  html {\n    in-html: visible;\n  }\n  @supports (upper: test) {\n    html {\n      in-supports: first;\n    }\n    html div {\n      in-div: visible;\n    }\n    @supports not (-webkit-font-smoothing: subpixel-antialiased) {\n      html div {\n        in-supports: second;\n      }\n      @media screen {\n        html div {\n          font-weight: 400;\n        }\n        html div nested {\n          property: value;\n        }\n      }\n    }\n  }\n}\n@media print and (max-size: 2px) {\n  .in1 {\n    stay: here;\n  }\n  @supports not (-webkit-font-smoothing: subpixel-antialiased) {\n    @supports (whatever: something) {\n      .in2 .in1 {\n        property: value;\n      }\n    }\n  }\n}\nhtml {\n  font-weight: 300;\n  -webkit-font-smoothing: subpixel-antialiased;\n}\n@supports not (-webkit-font-smoothing: subpixel-antialiased) {\n  html {\n    font-weight: 400;\n  }\n  html nested {\n    property: value;\n  }\n}\n.onTop {\n  animation: \"textscale\";\n  font-family: something;\n}\n@font-face {\n  font-family: something;\n  src: made-up-url;\n}\n@keyframes \"textscale\" {\n  0% {\n    font-size: 1em;\n  }\n  100% {\n    font-size: 2em;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/directives-bubbling/directives-bubbling.less",
    "content": "//simple case: @document\n.parent {\n  color:green;\n  \n  @document url-prefix() {\n    .child {\n      color:red;\n    }\n  }   \n}\n\n//selectors joinings test\n.top {\n  @supports (sandwitch: butter) {\n    .inside & {\n      property: value;\n    }\n  }\n}\n\n@supports (sandwitch: bread) {\n  .in1 {\n    .in2 {\n      property: value;\n    }\n  }\n}\n\n.top {\n  .inside & {\n    @supports (sandwitch: ham) {\n      property: value;\n    }\n  }\n}\n\n//combined with @font-face which has different kind of body\n@supports (font-family: weirdFont) {\n  @font-face {\n    font-family: something;\n    src: made-up-url;\n  }\n}\n\n@font-face {\n  @supports not (-webkit-font-smoothing: subpixel-antialiased) {\n    font-family: something;\n    src: made-up-url;\n  }\n}\n\n//bubbling through media\n@supports (property: value) {\n  .outOfMedia & {\n    @media (max-size: 2px) {\n      @supports (whatever: something) {\n        property: value;\n      } \n    }\n  }\n}\n\n.onTop & {\n  @supports (property: value) {\n    @media (max-size: 2px) {\n      @supports (whatever: something) {\n        property: value;\n      } \n    }\n  }\n}\n\n\n//long combination of supports and media\n@media print {\n  html {\n    in-html: visible;\n    @supports (upper: test) {\n      in-supports: first;\n      div {\n        in-div: visible;\n        @supports not (-webkit-font-smoothing: subpixel-antialiased) {\n          in-supports: second;\n          @media screen {\n            font-weight: 400;\n            nested {\n              property: value;\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\n//another long combination of supports and media\n@media print {\n  @media (max-size: 2px) {\n    .in1 {\n      stay: here;\n      @supports not (-webkit-font-smoothing: subpixel-antialiased) {\n        .in2 & {\n          @supports (whatever: something) {\n            property: value;\n          } \n        }\n      }\n    }\n  }\n}\n\n//called from mixin \n.nestedSupportsMixin() {\n  font-weight: 300;\n  -webkit-font-smoothing: subpixel-antialiased;\n  @supports not (-webkit-font-smoothing: subpixel-antialiased) {\n    font-weight: 400;\n    nested {\n      property: value;\n    }\n  }\n}\n\nhtml {\n    .nestedSupportsMixin();\n}\n\n// selectors should not propagate into all directive types\n.onTop {\n  @font-face {\n    font-family: something;\n    src: made-up-url;\n  }\n\n  @keyframes \"textscale\" {\n      0% { font-size : 1em; }\n    100% { font-size : 2em; }\n  }\n\n  animation   : \"textscale\";\n  font-family : something;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/empty/empty.css",
    "content": ""
  },
  {
    "path": "packages/test-data/tests-unit/empty/empty.less",
    "content": "\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend/extend-clearfix.css",
    "content": ".clearfix,\n.foo,\n.bar {\n  *zoom: 1;\n}\n.clearfix:after,\n.foo:after,\n.bar:after {\n  content: '';\n  display: block;\n  clear: both;\n  height: 0;\n}\n.foo {\n  color: red;\n}\n.bar {\n  color: blue;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend/extend-clearfix.less",
    "content": ".clearfix {\n  *zoom: 1;\n  &:after {\n    content: '';\n    display: block;\n    clear: both;\n    height: 0;\n  }\n}\n\n.foo {\n  &:extend(.clearfix all);\n  color: red;\n}\n\n.bar {\n  &:extend(.clearfix all);\n  color: blue;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend/extend.css",
    "content": ".error,\n.badError {\n  border: 1px #f00;\n  background: #fdd;\n}\n.error.intrusion,\n.badError.intrusion {\n  font-size: 1.3em;\n  font-weight: bold;\n}\n.intrusion .error,\n.intrusion .badError {\n  display: none;\n}\n.badError {\n  border-width: 3px;\n}\n.foo .bar,\n.foo .baz,\n.ext1 .ext2 .bar,\n.ext1 .ext2 .baz,\n.ext3 .bar,\n.ext3 .baz,\n.foo .ext3,\n.ext4 .bar,\n.ext4 .baz,\n.foo .ext4 {\n  display: none;\n}\ndiv.ext5,\n.ext6 > .ext5,\ndiv.ext7,\n.ext6 > .ext7 {\n  width: 100px;\n}\n.ext8.ext9,\n.fuu {\n  result: add-foo;\n}\n.ext8 .ext9,\n.ext8 + .ext9,\n.ext8 > .ext9,\n.buu,\n.zap,\n.zoo {\n  result: bar-matched;\n}\n.ext8.nomatch {\n  result: none;\n}\n.ext8 .ext9,\n.buu {\n  result: match-nested-bar;\n}\n.ext8.ext9,\n.fuu {\n  result: match-nested-foo;\n}\n.aa,\n.cc {\n  color: black;\n}\n.aa .dd,\n.aa .ee {\n  background: red;\n}\n.bb,\n.cc,\n.ee,\n.ff {\n  background: red;\n}\n.bb .bb,\n.ff .ff {\n  color: black;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend/extend.less",
    "content": "// Extend functionality tests\n.error {\n  border: 1px #f00;\n  background: #fdd;\n}\n.error.intrusion {\n  font-size: 1.3em;\n  font-weight: bold;\n}\n.intrusion .error {\n  display: none;\n}\n.badError {\n  &:extend(.error all);\n  border-width: 3px;\n}\n\n.foo .bar, .foo .baz {\n    display: none;\n}\n\n.ext1 .ext2 {\n    &:extend(.foo all);\n}\n\n.ext3,\n.ext4 {\n  &:extend(.foo all);\n  &:extend(.bar all);\n}\n\ndiv.ext5,\n.ext6 > .ext5 {\n    width: 100px;\n}\n\n.ext7 {\n    &:extend(.ext5 all);\n}\n\n.ext8.ext9 {\n  result: add-foo;\n}\n.ext8 .ext9,\n.ext8 + .ext9,\n.ext8 > .ext9 {\n  result: bar-matched;\n}\n.ext8.nomatch {\n  result: none;\n}\n.ext8 {\n  .ext9 {\n    result: match-nested-bar;\n  }\n}\n.ext8 {\n  &.ext9 {\n    result: match-nested-foo;\n  }\n}\n\n.fuu:extend( .ext8.ext9 all) {}\n.buu:extend(.ext8 .ext9 all) {}\n.zap:extend(.ext8 + .ext9 all) {}\n.zoo:extend(.ext8 > .ext9 all) {}\n\n.aa {\n  color: black;\n  .dd {\n    background: red;\n  }\n}\n.bb {\n  background: red;\n  .bb {\n    color: black;\n  }\n}\n.cc:extend(.aa,.bb) {}\n.ee:extend(.dd all,.bb) {}\n.ff:extend(.dd,.bb all) {}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-chaining/extend-chaining.css",
    "content": ".a,\n.b,\n.c {\n  color: black;\n}\n.f,\n.e,\n.d {\n  color: black;\n}\n.g.h,\n.i.j.h,\n.k.j.h {\n  color: black;\n}\n.i.j,\n.k.j {\n  color: inherit;\n}\n.l,\n.m,\n.n,\n.o,\n.p,\n.q,\n.r,\n.s,\n.t {\n  color: black;\n}\n.u,\n.v.u.v {\n  color: black;\n}\n.w,\n.v.w.v {\n  color: black;\n}\n.x,\n.y,\n.z {\n  color: x;\n}\n.y,\n.z,\n.x {\n  color: y;\n}\n.z,\n.x,\n.y {\n  color: z;\n}\n.va,\n.vb,\n.vc {\n  color: black;\n}\n.vb,\n.vc {\n  color: inherit;\n}\n@media (tv) {\n  .ma,\n  .mb,\n  .mc {\n    color: black;\n  }\n  .md,\n  .ma,\n  .mb,\n  .mc {\n    color: inherit;\n  }\n}\n@media (tv) and (plasma) {\n  .me,\n  .mf {\n    background: red;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-chaining/extend-chaining.less",
    "content": "//very simple chaining\n.a {\n  color: black;\n}\n.b:extend(.a) {}\n.c:extend(.b) {}\n\n//very simple chaining, ordering not important\n\n.d:extend(.e) {}\n.e:extend(.f) {}\n.f {\n  color: black;\n}\n\n//extend with all\n\n.g.h {\n  color: black;\n}\n.i.j:extend(.g all) {\n  color: inherit;\n}\n.k:extend(.i all) {}\n\n//extend multi-chaining\n\n.l {\n  color: black;\n}\n.m:extend(.l){}\n.n:extend(.m){}\n.o:extend(.n){}\n.p:extend(.o){}\n.q:extend(.p){}\n.r:extend(.q){}\n.s:extend(.r){}\n.t:extend(.s){}\n\n// self referencing is ignored\n\n.u {color: black;}\n.v.u.v:extend(.u all){}\n\n// circular reference because the new extend product will match the existing extend\n\n.w:extend(.w) {color: black;}\n.v.w.v:extend(.w all){}\n\n// classic circular references\n\n.x:extend(.z) {\n  color: x;\n}\n.y:extend(.x) {\n  color: y;\n}\n.z:extend(.y) {\n  color: z;\n}\n\n//very simple chaining, but with the extend inside the ruleset\n.va {\n  color: black;\n}\n.vb {\n  &:extend(.va);\n  color: inherit;\n}\n.vc {\n  &:extend(.vb);\n}\n\n// media queries - don't extend outside, do extend inside\n\n@media (tv) {\n  .ma:extend(.a,.b,.c,.d,.e,.f,.g,.h,.i,.j,.k,.l,.m,.n,.o,.p,.q,.r,.s,.t,.u,.v,.w,.x,.y,.z,.md) {\n    color: black;\n  }\n  .md {\n    color: inherit;\n  }\n  @media (plasma) {\n    .me, .mf {\n      &:extend(.mb,.md);\n      background: red;\n    }\n  }\n}\n.mb:extend(.ma) {};\n.mc:extend(.mb) {};\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-clearfix/extend-clearfix.css",
    "content": ".clearfix,\n.foo,\n.bar {\n  *zoom: 1;\n}\n.clearfix:after,\n.foo:after,\n.bar:after {\n  content: '';\n  display: block;\n  clear: both;\n  height: 0;\n}\n.foo {\n  color: red;\n}\n.bar {\n  color: blue;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-clearfix/extend-clearfix.less",
    "content": ".clearfix {\n  *zoom: 1;\n  &:after {\n    content: '';\n    display: block;\n    clear: both;\n    height: 0;\n  }\n}\n\n.foo {\n  &:extend(.clearfix all);\n  color: red;\n}\n\n.bar {\n  &:extend(.clearfix all);\n  color: blue;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-exact/extend-exact.css",
    "content": ".replace.replace .replace,\n.c.replace + .replace .replace,\n.replace.replace .c,\n.c.replace + .replace .c,\n.rep_ace {\n  prop: copy-paste-replace;\n}\n.a .b .c {\n  prop: not_effected;\n}\n.a,\n.effected {\n  prop: is_effected;\n}\n.a .b {\n  prop: not_effected;\n}\n.a .b.c {\n  prop: not_effected;\n}\n.c .b .a,\n.a .b .a,\n.c .a .a,\n.a .a .a,\n.c .b .c,\n.a .b .c,\n.c .a .c,\n.a .a .c {\n  prop: not_effected;\n}\n.e.e,\n.dbl {\n  prop: extend-double;\n}\n.e.e:hover {\n  hover: not-extended;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-exact/extend-exact.less",
    "content": ".replace.replace,\n.c.replace + .replace {\n  .replace,\n  .c {\n    prop: copy-paste-replace;\n  }\n}\n.rep_ace:extend(.replace.replace .replace) {}\n\n.a .b .c {\n  prop: not_effected;\n}\n\n.a {\n  prop: is_effected;\n  .b {\n    prop: not_effected;\n  }\n  .b.c {\n    prop: not_effected;\n  }\n}\n\n.c, .a {\n  .b, .a {\n    .a, .c {\n      prop: not_effected;\n    }\n  }\n}\n\n.effected {\n  &:extend(.a);\n  &:extend(.b);\n  &:extend(.c);\n}\n\n.e {\n  && {\n    prop: extend-double;\n    &:hover {\n      hover: not-extended;\n    }\n  }\n}\n.dbl:extend(.e.e) {}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-media/extend-media.css",
    "content": ".ext1 .ext2,\n.all .ext2 {\n  background: black;\n}\n@media (tv) {\n  .ext1 .ext3,\n  .tv-lowres .ext3,\n  .all .ext3 {\n    color: inherit;\n  }\n  .tv-lowres {\n    background: blue;\n  }\n}\n@media (tv) and (hires) {\n  .ext1 .ext4,\n  .tv-hires .ext4,\n  .all .ext4 {\n    color: green;\n  }\n  .tv-hires {\n    background: red;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-media/extend-media.less",
    "content": ".ext1 .ext2 {\n  background: black;\n}\n\n@media (tv) {\n  .ext1 .ext3 {\n    color: inherit;\n  }\n  .tv-lowres :extend(.ext1 all) {\n    background: blue;\n  }\n  @media (hires) {\n    .ext1 .ext4 {\n      color: green;\n    }\n    .tv-hires :extend(.ext1 all) {\n      background: red;\n    }\n  }\n}\n\n.all:extend(.ext1 all) {\n\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-nest/extend-nest.css",
    "content": ".sidebar,\n.sidebar2,\n.type1 .sidebar3,\n.type2.sidebar4 {\n  width: 300px;\n  background: red;\n}\n.sidebar .box,\n.sidebar2 .box,\n.type1 .sidebar3 .box,\n.type2.sidebar4 .box {\n  background: #FFF;\n  border: 1px solid #000;\n  margin: 10px 0;\n}\n.sidebar2 {\n  background: blue;\n}\n.type1 .sidebar3 {\n  background: green;\n}\n.type2.sidebar4 {\n  background: red;\n}\n.button,\n.submit {\n  color: black;\n}\n.button:hover,\n.submit:hover {\n  color: inherit;\n}\n.button2 :hover {\n  nested: white;\n}\n.button2 :hover {\n  notnested: black;\n}\n.amp-test-h,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-a.amp-test-d.amp-test-b.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-a.amp-test-e.amp-test-g,\n.amp-test-f.amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e + .amp-test-c .amp-test-b.amp-test-d.amp-test-b.amp-test-e.amp-test-g {\n  test: extended by masses of selectors;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-nest/extend-nest.less",
    "content": ".sidebar {\n  width: 300px;\n  background: red;\n\n  .box {\n    background: #FFF;\n    border: 1px solid #000;\n    margin: 10px 0;\n  }\n}\n\n.sidebar2 {\n  &:extend(.sidebar all);\n  background: blue;\n}\n\n.type1 {\n    .sidebar3 {\n      &:extend(.sidebar all);\n      background: green;\n    }\n}\n\n.type2 {\n  &.sidebar4 {\n    &:extend(.sidebar all);\n    background: red;\n  }\n}\n\n.button {\n  color: black;\n  &:hover {\n    color: inherit;\n  }\n}\n.submit {\n  &:extend(.button);\n  &:hover:extend(.button:hover) {}\n}\n\n.nomatch {\n  &:hover:extend(.button :hover) {}\n}\n\n.button2 {\n  :hover {\n    nested: white;\n  }\n}\n.button2 :hover {\n  notnested: black;\n}\n\n.nomatch :extend(.button2:hover) {}\n\n.amp-test-a,\n.amp-test-b {\n  .amp-test-c &.amp-test-d&.amp-test-e {\n    .amp-test-f&+&.amp-test-g:extend(.amp-test-h) {}\n  }\n}\n.amp-test-h {\n  test: extended by masses of selectors;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-selector/extend-selector.css",
    "content": ".error,\n.badError {\n  border: 1px #f00;\n  background: #fdd;\n}\n.error.intrusion,\n.badError.intrusion {\n  font-size: 1.3em;\n  font-weight: bold;\n}\n.intrusion .error,\n.intrusion .badError {\n  display: none;\n}\n.badError {\n  border-width: 3px;\n}\n.foo .bar,\n.foo .baz,\n.ext1 .ext2 .bar,\n.ext1 .ext2 .baz,\n.ext3 .bar,\n.ext3 .baz,\n.ext4 .bar,\n.ext4 .baz {\n  display: none;\n}\ndiv.ext5,\n.ext6 > .ext5,\ndiv.ext7,\n.ext6 > .ext7 {\n  width: 100px;\n}\n.ext,\n.a .c,\n.b .c {\n  test: 1;\n}\n.a,\n.b {\n  test: 2;\n}\n.a .c,\n.b .c {\n  test: 3;\n}\n.a .c .d,\n.b .c .d {\n  test: 4;\n}\n.replace.replace .replace,\n.c.replace + .replace .replace,\n.replace.replace .c,\n.c.replace + .replace .c,\n.rep_ace.rep_ace .rep_ace,\n.c.rep_ace + .rep_ace .rep_ace,\n.rep_ace.rep_ace .c,\n.c.rep_ace + .rep_ace .c {\n  prop: copy-paste-replace;\n}\n.attributes [data=\"test\"],\n.attributes .attributes .attribute-test {\n  extend: attributes;\n}\n.attributes [data],\n.attributes .attributes .attribute-test2 {\n  extend: attributes2;\n}\n.attributes [data=\"test3\"],\n.attributes .attributes .attribute-test {\n  extend: attributes2;\n}\n.header .header-nav,\n.footer .footer-nav {\n  background: red;\n}\n.header .header-nav:before,\n.footer .footer-nav:before {\n  background: blue;\n}\n.issue-2586-bordered,\n.issue-2586-somepage .content {\n  border: solid 1px black;\n}\n.issue-2586-somepage .content > span {\n  margin-bottom: 10px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extend-selector/extend-selector.less",
    "content": ".error {\n  border: 1px #f00;\n  background: #fdd;\n}\n.error.intrusion {\n  font-size: 1.3em;\n  font-weight: bold;\n}\n.intrusion .error {\n  display: none;\n}\n.badError:extend(.error all) {\n  border-width: 3px;\n}\n\n.foo .bar, .foo .baz {\n    display: none;\n}\n\n.ext1 .ext2\n    :extend(.foo all) {\n}\n\n.ext3:extend(.foo all),\n.ext4:extend(.foo all) {\n}\n\ndiv.ext5,\n.ext6 > .ext5 {\n    width: 100px;\n}\n\n.should-not-exist-in-output,\n.ext7:extend(.ext5 all) {\n}\n\n.ext {\n  test: 1;\n}\n// same as\n// .a .c:extend(.ext all)\n// .b .c:extend(.ext all)\n// .a .c .d\n// .b .c .d\n.a, .b {\n  test: 2;\n  .c:extend(.ext all) {\n    test: 3;\n    .d {\n      test: 4;\n    }\n  }\n}\n\n.replace.replace,\n.c.replace + .replace {\n  .replace,\n  .c {\n    prop: copy-paste-replace;\n  }\n}\n.rep_ace:extend(.replace all) {}\n\n.attributes {\n  [data=\"test\"] {\n    extend: attributes;\n  }\n  .attribute-test {\n    &:extend([data=\"test\"] all);\n  }\n  [data] {\n    extend: attributes2;\n  }\n  .attribute-test2 {\n    &:extend([data] all); //you could argue it should match [data=\"test\"]... not for now though...\n  }\n  @attr-data: \"test3\";\n  [data=@{attr-data}] {\n    extend: attributes2;\n  }\n  .attribute-test {\n    &:extend([data=\"test3\"] all);\n  }\n}\n\n.header {\n  .header-nav {\n    background: red;\n    &:before {\n      background: blue;\n    }\n  }\n}\n\n.footer {\n  .footer-nav {\n    &:extend( .header .header-nav all );\n  }\n}\n\n.issue-2586-bordered {\n    border: solid 1px black;\n}\n.issue-2586-somepage {\n    .content:extend(.issue-2586-bordered) {\n        &>span {\n            margin-bottom: 10px;\n        }\n    }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/extract-and-length/extract-and-length.css",
    "content": ".multiunit {\n  length: 6;\n  extract: abc \"abc\" 1 1px 1% #123;\n}\n.incorrect-index {\n  v1: extract(a b c, 5);\n  v2: extract(a, b, c, -2);\n}\n.scalar {\n  var-value: variable;\n  var-length: 1;\n  ill-index: extract(variable, 2);\n  name-value: name;\n  string-value: \"string\";\n  number-value: 12345678;\n  color-value: blue;\n  rgba-value: rgba(80, 160, 240, 0.67);\n  --empty-value: ;\n  name-length: 1;\n  string-length: 1;\n  number-length: 1;\n  color-length: 1;\n  rgba-length: 1;\n  empty-length: 1;\n}\n.mixin-arguments-1 {\n  length: 4;\n  extract: c | b | a;\n}\n.mixin-arguments-2 {\n  length: 4;\n  extract: c | b | a;\n}\n.mixin-arguments-3 {\n  length: 4;\n  extract: c | b | a;\n}\n.mixin-arguments-4 {\n  length: 0;\n  extract: extract(, 2) | extract(, 1);\n}\n.mixin-arguments-2 {\n  length: 4;\n  extract: c | b | a;\n}\n.mixin-arguments-3 {\n  length: 4;\n  extract: c | b | a;\n}\n.mixin-arguments-4 {\n  length: 3;\n  extract: c | b;\n}\n.mixin-arguments-2 {\n  length: 4;\n  extract: 3 | 2 | 1;\n}\n.mixin-arguments-3 {\n  length: 4;\n  extract: 3 | 2 | 1;\n}\n.mixin-arguments-4 {\n  length: 3;\n  extract: 3 | 2;\n}\n.md-space-comma {\n  length-1: 3;\n  extract-1: 1 2 3;\n  length-2: 3;\n  extract-2: 2;\n}\n.md-space-comma-as-args-2 {\n  length: 3;\n  extract: \"x\" \"y\" \"z\" | 1 2 3 | a b c;\n}\n.md-space-comma-as-args-3 {\n  length: 3;\n  extract: \"x\" \"y\" \"z\" | 1 2 3 | a b c;\n}\n.md-space-comma-as-args-4 {\n  length: 2;\n  extract: \"x\" \"y\" \"z\" | 1 2 3;\n}\n.md-cat-space-comma {\n  length-1: 3;\n  extract-1: 1 2 3;\n  length-2: 3;\n  extract-2: 2;\n}\n.md-cat-space-comma-as-args-2 {\n  length: 3;\n  extract: \"x\" \"y\" \"z\" | 1 2 3 | a b c;\n}\n.md-cat-space-comma-as-args-3 {\n  length: 3;\n  extract: \"x\" \"y\" \"z\" | 1 2 3 | a b c;\n}\n.md-cat-space-comma-as-args-4 {\n  length: 2;\n  extract: \"x\" \"y\" \"z\" | 1 2 3;\n}\n.md-cat-comma-space {\n  length-1: 3;\n  extract-1: 1, 2, 3;\n  length-2: 3;\n  extract-2: 2;\n}\n.md-cat-comma-space-as-args-1 {\n  length: 3;\n  extract: \"x\", \"y\", \"z\" | 1, 2, 3 | a, b, c;\n}\n.md-cat-comma-space-as-args-2 {\n  length: 3;\n  extract: \"x\", \"y\", \"z\" | 1, 2, 3 | a, b, c;\n}\n.md-cat-comma-space-as-args-3 {\n  length: 3;\n  extract: \"x\", \"y\", \"z\" | 1, 2, 3 | a, b, c;\n}\n.md-cat-comma-space-as-args-4 {\n  length: 0;\n  extract: extract(, 2) | extract(, 1);\n}\n.md-3D {\n  length-1: 2;\n  extract-1: a b c d, 1 2 3 4;\n  length-2: 2;\n  extract-2: 5 6 7 8;\n  length-3: 4;\n  extract-3: 7;\n  length-4: 1;\n  extract-4: 8;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/extract-and-length/extract-and-length.less",
    "content": "// test late parsing\n@cols: 1, 2;\n\n.a(@i: length(@cols)) when (@i > 0) {\n  @divider: e(extract(@cols, @i));\n}\n.a();\n\n.b(@j: 1) when (@j < length(@cols)) {\n  @divider: e(extract(@cols, @j));\n}\n.b();\n\n// simple array/list:\n\n.multiunit {\n  @v: abc \"abc\" 1 1px 1% #123;\n  length: length(@v);\n  extract: extract(@v, 1) extract(@v, 2) extract(@v, 3) extract(@v, 4) extract(@v, 5) extract(@v, 6);\n}\n\n.incorrect-index {\n    @v1: a  b  c;\n    @v2: a, b, c;\n    v1: extract(@v1,  5);\n    v2: extract(@v2, -2);\n}\n\n.scalar {\n    @var:          variable;\n    var-value:     extract(@var, 1);\n    var-length:    length(@var);\n    ill-index:     extract(@var, 2);\n\n    name-value:    extract(name, 1);\n    string-value:  extract(\"string\", 1);\n    number-value:  extract(12345678, 1);\n    color-value:   extract(blue, 1);\n    rgba-value:    extract(rgba(80, 160, 240, 0.67), 1);\n    --empty-value:   extract(~'', 1);\n\n    name-length:   length(name);\n    string-length: length(\"string\");\n    number-length: length(12345678);\n    color-length:  length(blue);\n    rgba-length:   length(rgba(80, 160, 240, 0.67));\n    empty-length:  length(~'');\n}\n\n.mixin-arguments {\n    .mixin-args(a b c d);\n    .mixin-args(a, b, c, d);\n    .mixin-args(1; 2; 3; 4);\n}\n\n.mixin-args(@value) {\n    &-1 {\n        length:  length(@value);\n        extract: extract(@value, 3) ~\"|\" extract(@value, 2) ~\"|\" extract(@value, 1);\n    }\n}\n\n.mixin-args(...) {\n    &-2 {\n        length:  length(@arguments);\n        extract: extract(@arguments, 3) ~\"|\" extract(@arguments, 2) ~\"|\" extract(@arguments, 1);\n    }\n}\n\n.mixin-args(@values...) {\n    &-3 {\n        length:  length(@values);\n        extract: extract(@values, 3) ~\"|\" extract(@values, 2) ~\"|\" extract(@values, 1);\n    }\n}\n\n.mixin-args(@head, @tail...) {\n    &-4 {\n        length:  length(@tail);\n        extract: extract(@tail, 2) ~\"|\" extract(@tail, 1);\n    }\n}\n\n// \"multidimensional\" array/list\n\n.md-space-comma {\n    @v: a b c, 1 2 3, \"x\" \"y\" \"z\";\n    length-1:  length(@v);\n    extract-1: extract(@v, 2);\n    length-2:  length(extract(@v, 2));\n    extract-2: extract(extract(@v, 2), 2);\n\n    &-as-args {.mixin-args(a b c, 1 2 3, \"x\" \"y\" \"z\")}\n}\n\n.md-cat-space-comma {\n    @a: a b c;\n    @b: 1 2 3;\n    @c: \"x\" \"y\" \"z\";\n    @v: @a, @b, @c;\n    length-1:  length(@v);\n    extract-1: extract(@v, 2);\n    length-2:  length(extract(@v, 2));\n    extract-2: extract(extract(@v, 2), 2);\n\n    &-as-args {.mixin-args(@a, @b, @c)}\n}\n\n.md-cat-comma-space {\n    @a: a, b, c;\n    @b: 1, 2, 3;\n    @c: \"x\", \"y\", \"z\";\n    @v: @a @b @c;\n    length-1:  length(@v);\n    extract-1: extract(@v, 2);\n    length-2:  length(extract(@v, 2));\n    extract-2: extract(extract(@v, 2), 2);\n\n    &-as-args {.mixin-args(@a @b @c)}\n}\n\n.md-3D {\n    @a: a b c d, 1 2 3 4;\n    @b: 5 6 7 8, e f g h;\n    .3D(@a, @b);\n\n    .3D(...) {\n\n        @v1:       @arguments;\n        length-1:  length(@v1);\n        extract-1: extract(@v1, 1);\n\n        @v2:       extract(@v1, 2);\n        length-2:  length(@v2);\n        extract-2: extract(@v2, 1);\n\n        @v3:       extract(@v2, 1);\n        length-3:  length(@v3);\n        extract-3: extract(@v3, 3);\n\n        @v4:       extract(@v3, 4);\n        length-4:  length(@v4);\n        extract-4: extract(@v4, 1);\n    }\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/functions/functions.css",
    "content": "#functions {\n  color: #660000;\n  width: 16;\n  height: undefined(\"self\");\n  border-width: 5;\n  variable: 11;\n  background: linear-gradient(#000, #fff);\n}\n#built-in {\n  escaped: -Some::weird(#thing, y);\n  lighten: #ffcccc;\n  lighten-relative: #ff6666;\n  darken: #330000;\n  darken-relative: #990000;\n  saturate: #203c31;\n  saturate-relative: #28342f;\n  desaturate: #29332f;\n  desaturate-relative: #233930;\n  greyscale: #2e2e2e;\n  hsl-clamp: hsl(0, 0%, 100%);\n  spin-p: hsl(20, 50%, 50%);\n  spin-n: hsl(350, 50%, 50%);\n  luma-white: 100%;\n  luma-black: 0%;\n  luma-black-alpha: 0%;\n  luma-red: 21.26%;\n  luma-green: 71.52%;\n  luma-blue: 7.22%;\n  luma-yellow: 92.78%;\n  luma-cyan: 78.74%;\n  luma-differs-from-luminance: 23.89833349%;\n  luminance-white: 100%;\n  luminance-black: 0%;\n  luminance-black-alpha: 0%;\n  luminance-red: 21.26%;\n  luminance-differs-from-luma: 36.40541176%;\n  contrast-filter: contrast(30%);\n  saturate-filter: saturate(5%);\n  contrast-white: #000000;\n  contrast-black: #ffffff;\n  contrast-red: #ffffff;\n  contrast-green: #000000;\n  contrast-blue: #ffffff;\n  contrast-yellow: #000000;\n  contrast-cyan: #000000;\n  contrast-light: #111111;\n  contrast-dark: #eeeeee;\n  contrast-wrongorder: #111111;\n  contrast-light-thresh: #111111;\n  contrast-dark-thresh: #eeeeee;\n  contrast-high-thresh: #eeeeee;\n  contrast-low-thresh: #111111;\n  contrast-light-thresh-per: #111111;\n  contrast-dark-thresh-per: #eeeeee;\n  contrast-high-thresh-per: #eeeeee;\n  contrast-low-thresh-per: #111111;\n  replace: \"Hello, World!\";\n  replace-captured: \"This is a new string.\";\n  replace-with-flags: \"2 + 2 = 4\";\n  replace-single-quoted: 'foo-2';\n  replace-escaped-string: bar-2;\n  replace-keyword: baz-2;\n  replace-with-color: \"#135#1357\";\n  replace-with-number: \"2em07\";\n  format: \"rgb(32, 128, 64)\";\n  format-string: \"hello world\";\n  format-multiple: \"hello earth 2\";\n  format-url-encode: \"red is %23ff0000\";\n  format-single-quoted: 'hello single world';\n  format-escaped-string: hello escaped world;\n  format-color-as-string: \"#123\";\n  format-number-as-string: \"4px\";\n  eformat: rgb(32, 128, 64);\n  unitless: 12;\n  unit: 14em;\n  unitpercentage: 100%;\n  get-unit: px;\n  get-unit-empty: ;\n  hue: 98;\n  saturation: 12%;\n  lightness: 95%;\n  hsvhue: 98;\n  hsvsaturation: 12%;\n  hsvvalue: 95%;\n  red: 255;\n  green: 255;\n  blue: 255;\n  rounded: 11;\n  rounded-two: 10.67;\n  roundedpx: 3px;\n  roundedpx-three: 3.333px;\n  rounded-percentage: 10%;\n  ceil: 11px;\n  floor: 12px;\n  sqrt: 5px;\n  pi: 3.14159265;\n  mod: 2m;\n  abs: 4%;\n  tan: 0.90040404;\n  sin: 0.17364818;\n  cos: 0.84385396;\n  atan: 0.1rad;\n  atan: 34deg;\n  atan: 45deg;\n  pow: 64px;\n  pow: 64;\n  pow: 27;\n  min: 0;\n  min: 5;\n  min: 1pt;\n  min: 3mm;\n  min: min(1, 4ex, 2pt);\n  min: min(calc(1 + 1), 1);\n  min: min(var(--width), 802px);\n  max: 3;\n  max: 5em;\n  max: max(5m, 3em);\n  max: min(var(--body-max-width), calc(100vw - 20px));\n  max: max(1, calc(1 + 1));\n  max-native: max(10vw, 100px);\n  percentage: 20%;\n  color-quoted-digit: #dda0dd;\n  color-quoted-keyword: #dda0dd;\n  color-color: #dda0dd;\n  color-keyword: #dda0dd;\n  tint: #898989;\n  tint-full: #ffffff;\n  tint-percent: #898989;\n  tint-negative: #656565;\n  shade: #686868;\n  shade-full: #000000;\n  shade-percent: #686868;\n  shade-negative: #868686;\n  fade-out: rgba(255, 0, 0, 0.95);\n  fade-in: rgba(255, 0, 0, 0.95);\n  fade-out-relative: rgba(255, 0, 0, 0.95);\n  fade-in-relative: rgba(255, 0, 0, 0.945);\n  fade-out2: rgba(255, 0, 0, 0);\n  fade-out2-relative: rgba(255, 0, 0, 0.25);\n  hsv: #4d2926;\n  hsva: rgba(77, 40, 38, 0.2);\n  mix: #ff3300;\n  mix-0: #ffff00;\n  mix-100: #ff0000;\n  mix-weightless: #ff8000;\n  mixt: rgba(255, 0, 0, 0.5);\n}\n#built-in .is-a {\n  rules-defined: true;\n  foo-defined: false;\n  ruleset: true;\n  color: true;\n  color1: true;\n  color2: true;\n  color3: true;\n  keyword: true;\n  number: true;\n  string: true;\n  pixel: true;\n  percent: true;\n  em: true;\n  ex: true;\n  rem: true;\n  vw: true;\n  vh: true;\n  vmin: true;\n  vmax: true;\n  ch: true;\n  cm: true;\n  mm: true;\n  pt: true;\n  q: true;\n  in: true;\n  cat: true;\n  no-unit-is-empty: true;\n  case-insensitive-1: true;\n  case-insensitive-2: true;\n}\n#alpha {\n  alpha: hsla(25, 50%, 40%, 0.6);\n  alpha2: 0.5;\n  alpha3: 0;\n}\n#blendmodes {\n  multiply: #ed0000;\n  screen: #f600f6;\n  overlay: #ed0000;\n  softlight: #fa0000;\n  hardlight: #0000ed;\n  difference: #f600f6;\n  exclusion: #f600f6;\n  average: #7b007b;\n  negation: #d73131;\n}\n#extract-and-length {\n  extract: 3 2 1 C B A;\n  length: 6;\n}\n#quoted-functions-in-mixin {\n  replace-double-quoted: 'foo-2';\n  replace-single-quoted: 'foo-4';\n  replace-escaped-string: bar-2;\n  replace-keyword: baz-2;\n  replace-anonymous: qux-2;\n  format-double-quoted: \"hello world\";\n  format-single-quoted: 'hello single world';\n  format-escaped-string: hello escaped world;\n  format-keyword: hello;\n  format-anonymous: hello anonymous world;\n}\n#list-details {\n  length: 2;\n  one: a 1;\n  two: b 2;\n  two-length: 2;\n  two-one: b;\n  two-two: 2;\n}\n/* comment1 */\nhtml {\n  color: #8080ff;\n}\n#boolean {\n  a: true;\n  b: false;\n  c: false;\n  d: true;\n  e: false;\n}\n#if {\n  a: 1;\n  b: 2;\n  c: 3;\n  --e: ;\n  f: 6;\n  g: 3;\n  h: 5;\n  i: 6;\n  j: 8;\n  k: 1;\n  m: 1;\n  n: 2;\n  l: black;\n  /* results in void */\n  color: green;\n  color: purple;\n}\n.paren-escapes {\n  list-1: 1, 2, 3;\n  length-1: 3;\n  item-1: 4;\n  item-2: 5;\n  item-3: 6;\n  list-2: 1, 2, 3;\n  list-3: 7, 8, 9;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/functions/functions.less",
    "content": "#functions {\n  @var: 10;\n  @colors: #000, #fff;\n  color: _color(\"evil red\"); // #660000\n  width: increment(15);\n  height: undefined(\"self\");\n  border-width: add(2, 3);\n  variable: increment(@var);\n  background: linear-gradient(@colors);\n}\n\n#built-in {\n  @r: 32;\n  escaped: e(\"-Some::weird(#thing, y)\");\n  lighten: lighten(#ff0000, 40%);\n  lighten-relative: lighten(#ff0000, 40%, relative);\n  darken: darken(#ff0000, 40%);\n  darken-relative: darken(#ff0000, 40%, relative);\n  saturate: saturate(#29332f, 20%);\n  saturate-relative: saturate(#29332f, 20%, relative);\n  desaturate: desaturate(#203c31, 20%);\n  desaturate-relative: desaturate(#203c31, 20%, relative);\n  greyscale: greyscale(#203c31);\n  hsl-clamp: hsl(380, 150%, 150%);\n  spin-p: spin(hsl(340, 50%, 50%), 40);\n  spin-n: spin(hsl(30, 50%, 50%), -40);\n  luma-white: luma(#fff);\n  luma-black: luma(#000);\n  luma-black-alpha: luma(rgba(0,0,0,0.5));\n  luma-red: luma(#ff0000);\n  luma-green: luma(#00ff00);\n  luma-blue: luma(#0000ff);\n  luma-yellow: luma(#ffff00);\n  luma-cyan: luma(#00ffff);\n  luma-differs-from-luminance: luma(#ff3600);\n  luminance-white: luma(#fff);\n  luminance-black: luma(#000);\n  luminance-black-alpha: luma(rgba(0,0,0,0.5));\n  luminance-red: luma(#ff0000);\n  luminance-differs-from-luma: luminance(#ff3600);\n  contrast-filter: contrast(30%);\n  saturate-filter: saturate(5%);\n  contrast-white: contrast(#fff);\n  contrast-black: contrast(#000);\n  contrast-red: contrast(#ff0000);\n  contrast-green: contrast(#00ff00);\n  contrast-blue: contrast(#0000ff);\n  contrast-yellow: contrast(#ffff00);\n  contrast-cyan: contrast(#00ffff);\n  contrast-light: contrast(#fff, #111111, #eeeeee);\n  contrast-dark: contrast(#000, #111111, #eeeeee);\n  contrast-wrongorder: contrast(#fff, #eeeeee, #111111, 0.5);\n  contrast-light-thresh: contrast(#fff, #111111, #eeeeee, 0.5);\n  contrast-dark-thresh: contrast(#000, #111111, #eeeeee, 0.5);\n  contrast-high-thresh: contrast(#555, #111111, #eeeeee, 0.6);\n  contrast-low-thresh: contrast(#555, #111111, #eeeeee, 0.09);\n  contrast-light-thresh-per: contrast(#fff, #111111, #eeeeee, 50%);\n  contrast-dark-thresh-per: contrast(#000, #111111, #eeeeee, 50%);\n  contrast-high-thresh-per: contrast(#555, #111111, #eeeeee, 60%);\n  contrast-low-thresh-per: contrast(#555, #111111, #eeeeee, 9%);\n  replace: replace(\"Hello, Mars.\", \"Mars\\.\", \"World!\");\n  replace-captured: replace(\"This is a string.\", \"(string)\\.$\", \"new $1.\");\n  replace-with-flags: replace(\"One + one = 4\", \"one\", \"2\", \"gi\");\n  replace-single-quoted: replace('foo-1', \"1\", \"2\");\n  replace-escaped-string: replace(~\"bar-1\", \"1\", \"2\");\n  replace-keyword: replace(baz-1, \"1\", \"2\");\n  replace-with-color: replace(\"007\", \"0\", #135, g);\n  replace-with-number: replace(\"007\", \"0\", 2em);\n  format: %(\"rgb(%d, %d, %d)\", @r, 128, 64);\n  format-string: %(\"hello %s\", \"world\");\n  format-multiple: %(\"hello %s %d\", \"earth\", 2);\n  format-url-encode: %(\"red is %A\", #ff0000);\n  format-single-quoted: %('hello %s', \"single world\");\n  format-escaped-string: %(~\"hello %s\", \"escaped world\");\n  format-color-as-string: %(\"%s\", #123);\n  format-number-as-string: %(\"%s\", 4px);\n  eformat: e(%(\"rgb(%d, %d, %d)\", @r, 128, 64));\n\n  unitless: unit(12px);\n  unit: unit((13px + 1px), em);\n  unitpercentage: unit(100, %);\n\n  get-unit: get-unit(10px);\n  get-unit-empty: get-unit(10);\n\n  hue: hue(hsl(98, 12%, 95%));\n  saturation: saturation(hsl(98, 12%, 95%));\n  lightness: lightness(hsl(98, 12%, 95%));\n  hsvhue: hsvhue(hsv(98, 12%, 95%));\n  hsvsaturation: hsvsaturation(hsv(98, 12%, 95%));\n  hsvvalue: hsvvalue(hsv(98, 12%, 95%));\n  red: red(#f00);\n  green: green(#0f0);\n  blue: blue(#00f);\n  rounded: round((@r/3));\n  rounded-two: round((@r/3), 2);\n  roundedpx: round((10px / 3));\n  roundedpx-three: round((10px / 3), 3);\n  rounded-percentage: round(10.2%);\n  ceil: ceil(10.1px);\n  floor: floor(12.9px);\n  sqrt: sqrt(25px);\n  pi: pi();\n  mod: mod(13m, 11cm); // could take into account units, doesn't at the moment\n  abs: abs(-4%);\n  tan: tan(42deg);\n  sin: sin(10deg);\n  cos: cos(12);\n  atan: atan(tan(0.1rad));\n  atan: convert(acos(cos(34deg)), deg);\n  atan: convert(acos(cos(50grad)), deg);\n  pow: pow(8px, 2);\n  pow: pow(4, 3);\n  pow: pow(3, 3em);\n  min: min(0);\n  min: min(6, 5);\n  min: min(1pt, 3pt);\n  min: min(1cm, 3mm);\n  min: min(6em, 5, 4ex, 3, 2pt, 1);\n  min: min(calc(1 + 1), 1);\n  min: min(~'var(--width), 802px');\n  max: max(1, 3);\n  max: max(3em, 1em, 2em, 5em);\n  max: max(1px, 2, 3em, 4, 5m, 6);\n  max: min(var(--body-max-width), calc(100vw - 20px));\n  max: max(1, calc(1 + 1));\n  max-native: max(10vw, 100px);\n  percentage: percentage((10px / 50));\n  color-quoted-digit: color(\"#dda0dd\");\n  color-quoted-keyword: color(\"plum\");\n  color-color: color(#dda0dd);\n  color-keyword: color(plum);\n  tint: tint(#777777, 13);\n  tint-full: tint(#777777, 100);\n  tint-percent: tint(#777777, 13%);\n  tint-negative: tint(#777777, -13%);\n  shade: shade(#777777, 13);\n  shade-full: shade(#777777, 100);\n  shade-percent: shade(#777777, 13%);\n  shade-negative: shade(#777777, -13%);\n\n  fade-out: fadeout(red, 5%); // support fadeOut and fadeout\n  fade-in: fadein(fadeout(red, 10%), 5%);\n  fade-out-relative: fadeout(red, 5%,relative);\n  fade-in-relative: fadein(fadeout(red, 10%, relative), 5%, relative);\n  fade-out2:  fadeout(fadeout(red, 50%), 50%);\n  fade-out2-relative: fadeout(fadeout(red, 50%, relative), 50%, relative);\n\n  hsv: hsv(5, 50%, 30%);\n  hsva: hsva(3, 50%, 30%, 0.2);\n\n  mix: mix(#ff0000, #ffff00, 80);\n  mix-0: mix(#ff0000, #ffff00, 0);\n  mix-100: mix(#ff0000, #ffff00, 100);\n  mix-weightless: mix(#ff0000, #ffff00);\n  mixt: mix(#ff0000, transparent);\n\n  .is-a {\n    @rules: {\n      color: red;\n    };\n    rules-defined: isdefined(@rules);\n    foo-defined: isdefined(@foo);\n    ruleset: isruleset(@rules);\n    color: iscolor(#ddd);\n    color1: iscolor(red);\n    color2: iscolor(rgb(0, 0, 0));\n    color3: iscolor(transparent);\n    keyword: iskeyword(hello);\n    number: isnumber(32);\n    string: isstring(\"hello\");\n    pixel: ispixel(32px);\n    percent: ispercentage(32%);\n    em: isem(32em);\n    ex: isunit(32ex, ex);\n    rem: isunit(32rem, rem);\n    vw: isunit(32vw, vw);\n    vh: isunit(32vh, vh);\n    vmin: isunit(32vmin, vmin);\n    vmax: isunit(32vmax, vmax);\n    ch: isunit(32ch, ch);\n    cm: isunit(32cm, cm);\n    mm: isunit(32mm, mm);\n    pt: isunit(32pt, pt);\n    q: isunit(32q, q);\n    in: isunit(32in, in);\n    cat: isunit(32cat, cat);\n    no-unit-is-empty: isunit(32, '');\n    case-insensitive-1: isunit(32CAT, cat);\n    case-insensitive-2: isunit(32px, PX);\n  }\n}\n\n#alpha {\n  alpha: darken(hsla(25, 50%, 50%, 0.6), 10%);\n  alpha2: alpha(rgba(3, 4, 5, 0.5));\n  alpha3: alpha(transparent);\n}\n\n#blendmodes {\n  multiply: multiply(#f60000, #f60000);\n  screen: screen(#f60000, #0000f6);\n  overlay: overlay(#f60000, #0000f6);\n  softlight: softlight(#f60000, #ffffff);\n  hardlight: hardlight(#f60000, #0000f6);\n  difference: difference(#f60000, #0000f6);\n  exclusion: exclusion(#f60000, #0000f6);\n  average: average(#f60000, #0000f6);\n  negation: negation(#f60000, #313131);\n}\n\n#extract-and-length {\n  @anon: A B C 1 2 3;\n  extract: extract(@anon, 6) extract(@anon, 5) extract(@anon, 4) extract(@anon, 3) extract(@anon, 2) extract(@anon, 1);\n  length: length(@anon);\n}\n\n#quoted-functions-in-mixin {\n  // Quoted type may have some weird side-effects when used in mixins (#2308)\n  .mixin();\n  .mixin() {\n    replace-double-quoted: replace('foo-1', \"1\", \"2\");\n    replace-single-quoted: replace('foo-3', \"3\", \"4\");\n    replace-escaped-string: replace(~\"bar-1\", \"1\", \"2\");\n    replace-keyword: replace(baz-1, \"1\", \"2\");\n    replace-anonymous: replace(e(\"qux-1\"), \"1\", \"2\");\n    format-double-quoted: %(\"hello %s\", \"world\");\n    format-single-quoted: %('hello %s', \"single world\");\n    format-escaped-string: %(~\"hello %s\", \"escaped world\");\n    format-keyword: %(hello);\n    format-anonymous: %(e(\"hello %s\"), \"anonymous world\");\n  }\n}\n\n#list-details {\n  @list:\n    a 1, // Some comment\n    b 2;\n\n  length: length(@list);\n  one: extract(@list, 1);\n  @two: extract(@list, 2);\n  two: @two;\n  two-length: length(@two);\n  two-one: extract(@two, 1);\n  two-two: extract(@two, 2);\n}\n@color1: #FFF;/* comment1 */\n@color2: #FFF/* comment2 */;\nhtml {\n  color: mix(blue, @color1, 50%);\n  color: mix(blue, @color2, 50%);\n}\n\n#boolean {\n  a: boolean(not(2 < 1));\n  b: boolean(not(2 > 1) and (true));\n  c: boolean(not(boolean(true)));\n  // not without parentheses (should behave the same as with parentheses)\n  d: boolean(not false);\n  e: boolean(not true);\n}\n\n#if {\n  a: if(not(false), 1, 2);\n  b: if(not(true), 1, 2);\n  @1: if(not(false), {c: 3}, {d: 4}); @1();\n\n  --e: if(not(true), 5);\n  @f: boolean(3 = 4);\n  f: if(not(@f), 6);\n  g: if(true, 3, 5);\n  h: if(false, 3, 5);\n  i: if(true and isnumber(6), 6, 8);\n  j: if(not(true) and true, 6, 8);\n  k: if(true or true, 1);\n  // not without parentheses\n  m: if(not false, 1, 2);\n  n: if(not true, 1, 2);\n\n  // see: https://github.com/less/less.js/issues/3371\n  @some: foo;\n  l: if((iscolor(@some)), darken(@some, 10%), black);\n\n\n  if((false), {g: 7}); /* results in void */\n\n  @conditional: if((true), {\n    color: green;\n  }, {});\n  @conditional();\n\n  @falsey: if((false), {\n    color: orange;\n  }, {\n    color: purple;\n  });\n  @falsey();\n}\n\n.paren-escapes {\n  list-1: ~(1, 2, 3);\n  length-1: length($list-1);\n  each(~(1 2 3); {\n    item-@{value}: @value + 3;\n  })\n\n  .mixin(@list-1; @list-2) {\n    list-2: @list-1;\n    list-3: @list-2;\n  }\n  .mixin($list-1, ~(7; 8; 9));\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/functions-each/functions-each.css",
    "content": ".sel-blue {\n  a: b;\n}\n.sel-green {\n  a: b;\n}\n.sel-red {\n  a: b;\n}\n.each {\n  index: 1, 2, 3, 4;\n  item1: a;\n  item2: b;\n  item3: c;\n  item4: d;\n  nest-1-1: 10px 1;\n  nest-2-1: 15px 2;\n  nest-1-2: 20px 1;\n  nest-2-2: 25px 2;\n  padding: 10px 20px 30px 40px;\n}\n.each .nest-anon {\n  nest-1-1: a c;\n  nest-1-2: a d;\n  nest-2-1: b c;\n  nest-2-2: b d;\n}\n.set {\n  one: blue;\n  two: green;\n  three: red;\n}\n.set-2 {\n  one-1: blue;\n  two-2: green;\n  three-3: red;\n}\n.single {\n  val: true;\n  val2: 2;\n  val3: 4;\n}\n.column-list {\n  list: 1 2 3 4;\n}\n.col-1 {\n  width: 25%;\n}\n.col-2 {\n  width: 25%;\n}\n.col-3 {\n  width: 25%;\n}\n.col-4 {\n  width: 25%;\n}\n.row-1 {\n  width: 10px;\n}\n.row-2 {\n  width: 20px;\n}\n.row-3 {\n  width: 30px;\n}\n.box {\n  -less-log: a;\n  -less-log: b;\n  -less-log: c;\n  -less-log: d;\n}\n.test-rule {\n  color: blue;\n  color: red;\n}\n.foo {\n  content: red;\n}\n.bar {\n  content: blue;\n}\nspan {\n  content: 'foo';\n  content: 'bar';\n}\ndiv {\n  content: 'foo';\n}\n.a .w-1 {\n  width: 90 100 110;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/functions-each/functions-each.less",
    "content": "@selectors: blue, green, red;\n@list: a b c d;\n\neach(@selectors, {\n  .sel-@{value} {\n    a: b;\n  }\n});\n\n.each {\n  each(@list, {\n    index+: @index;\n    item@{index}: @value;\n  });\n\n  // nested each\n  each(10px 15px, 20px 25px; { \n    // demonstrates nesting of each()\n    each(@value; #(@v, @k, @i) {\n      nest-@{i}-@{index}: @v @k;\n    });\n  });\n\n  // nested anonymous mixin\n  .nest-anon {\n    each(a b, .(@v;@i) {\n      each(c d, .(@vv;@ii) {\n        nest-@{i}-@{ii}: @v @vv;\n      });\n    });\n  }\n\n  // vector math\n  each(1 2 3 4, {\n    padding+_: (@value * 10px);\n  });\n}\n\n@set: {\n  one: blue;\n  // skip comments\n  two: green;\n  /** and these\n  */\n  three: red; //and this\n}\n.set {\n  each(@set, {\n    @{key}: @value;\n  });\n}\n.set-2() {\n  one: blue;\n  two: green;\n  three: red;\n}\n.set-2 {\n  each(.set-2(), .(@v, @k, @i) {\n    @{k}-@{i}: @v;\n  });\n}\n\n.pick(@a) when (@a = 4) {\n  val3: @a;\n}\n.single {\n  each(true, {\n    val: @value;\n  });\n  @exp: 1 + 1;\n  each(@exp, {\n    val2: @value;\n  });\n  each(1 2 3 4, {\n    .pick(@value);\n  });\n}\n\n@columns: range(4);\n.column-list {\n  list: @columns;\n}\n\neach(@columns, .(@val) {\n  .col-@{val} {\n    width: (100% / length(@columns));\n  }\n});\n\neach(range(10px, 30px, 10px), .(@val, @index) {\n  .row-@{index} {\n    width: @val;\n  }\n});\n\n@list: a b c d;\n.box {\n  each(@list, {\n    -less-log: extract(@list, @index);\n  })\n}\n\n// https://github.com/less/less.js/issues/3325\n\n@color-schemes: {\n  @primary: {\n    @color: blue;\n  }\n  @secondary: {\n    @color: red;\n  }\n}\n.test-rule {\n  each(primary secondary, .(@color-name) {\n    @scheme: @color-schemes[@@color-name]; // e.g. @color-name = primary\n    color: @scheme[@color];\n  });\n}\n\n@one: {\n  @two: {\n    foo: red;\n    bar: blue;\n  };\n};\n\neach(@one[@two], {\n  .@{key} {\n    content: @value;\n  }\n});\n\n// https://github.com/less/less.js/issues/3354\n.log(@msgs) {\n  each(@msgs; {\n    content: @value;\n  });\n}\n\n@messages: 'foo', 'bar';\n\nspan {\n  .log(@messages);\n}\n\ndiv {\n  .log('foo');\n}\n\n// https://github.com/less/less.js/issues/3345\n.mixin-create-width-style() {\n  @list: e(\"90 100 110\");\n\n  each(@list, {\n      .w-@{key} {\n          width: @value;\n      }\n  })\n}\n\n.a {\n  .mixin-create-width-style();\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/ie-filters/ie-filters.css",
    "content": ".nav {\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=20);\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#333333\", endColorstr=\"#000000\", GradientType=0);\n}\n.evalTest1 {\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=30);\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=5);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/ie-filters/ie-filters.less",
    "content": "@fat: 0;\n@cloudhead: \"#000000\";\n\n.nav {\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity = 20);\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=@fat);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=\"#333333\", endColorstr=@cloudhead, GradientType=@fat);\n}\n.evalTest(@arg) {\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=@arg);\n}\n.evalTest1 {\n  .evalTest(30);\n  .evalTest(5);\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/impor/impor.css",
    "content": "@impor \"impor-typo-dont-parse-as-@import.less\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/impor/impor.less",
    "content": "// https://github.com/less/less.js/issues/3660\n// const dir = parserInput.$re(/^@import?\\s+/);\n// correct regexp is /^@import\\s+/\n// so follow code will change nothing, parse result is same with raw less code\n@impor \"impor-typo-dont-parse-as-@import.less\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/css-import.less",
    "content": "@import url(\"test.css\");\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/deeper/deeper-2/url-import-2.less",
    "content": ".deep-import-url {\n  color: red;\n}"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/deeper/deeper-2/url-import.less",
    "content": "@import url(\"url-import-2.less\");"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/deeper/import-once-test-a.less",
    "content": "@import \"../import-once-test-c\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/deeper/url-import.less",
    "content": "@import url(\"deeper-2/url-import.less\");"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-and-relative-paths-test.less",
    "content": "@import \"css/background.css\";\n@import \"import-test-d.css\";\n\n@import \"imports/logo\";\n@import \"imports/font\";\n\n.unquoted-relative-path-bg() {\n    background-image: url(../../data/image.jpg);\n}\n.quoted-relative-path-border-image() {\n    border-image: url('../../data/image.jpg');\n}\n\n#imported-relative-path {\n    .unquoted-relative-path-bg();\n    .quoted-relative-path-border-image();\n}"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-charset-test.less",
    "content": "@charset \"ISO-8859-1\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-inline-invalid-css.less",
    "content": "@import (inline) \"invalid-css.less\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-interpolation.less",
    "content": "@import (inline) \"imports/logo.less\";\n@import \"import-@{in}@{terpolation}2.less\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-interpolation2.less",
    "content": ".a {\n  var: test;\n}\n\n@in: \"redefined-does-nothing\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-once-test-c.less",
    "content": "\n@c: red;\n\n#import {\n  color: @c;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-reference.less",
    "content": ".z {\n  color: red;\n  .c {\n    color: green;\n  }\n}\n.only-with-visible,\n.z {\n  color: green;\n  &:hover {\n    color: green;\n  }\n  & {\n    color: green;\n  }\n  & + & {\n    color: green;\n    .sub {\n      color: green;\n    }\n  }\n}\n\n& {\n  .hidden {\n    hidden: true;\n  }\n}\n\n@media tv {\n  .hidden {\n    hidden: true;\n  }\n}\n\n/* comment is not output */\n\n.zz {\n  .y {\n    pulled-in: yes /* inline comment survives */;\n  }\n  /* comment pulled in */\n}\n@max-size: 450px;\n.mixin-with-mediaq(@num) {\n  color: green;\n  test: @num;\n  @media (max-size: @max-size) {\n    color: red;\n  }\n}\n//https://github.com/less/less.js/issues/2359\n@supports (something: else) {\n  .class {\n    something: else;\n  }\n  .nestedToo {\n    .class {\n      something: else;\n    }\n  }\n  .invisible {\n    something: else;\n  }\n}\n//https://github.com/less/less.js/issues/1979\n.mixin-with-nested-selectors() {\n  .test-rule {\n    color: red;\n    &:first-child {\n      color: blue;\n    }\n  }\n}\n.mixin-with-directives(@keyframeName) {\n  @keyframes @keyframeName {\n    @rules1();\n  }\n  @supports (animation-name: test) {\n    @keyframes @keyframeName {\n      @rules2();\n    }\n    .selector {\n      color: red;\n    }\n  }\n  @rules1: {property: value;};\n  @rules2: {property: value;};\n}\n\n@import (inline, multiple) \"invalid-css.less\";\n@import \"import-inline-invalid-css.less\";\n.print-referenced-import-inline() {\n  div {\n    @import (inline, multiple) \"invalid-css.less\";\n  }\n  @import (inline, multiple) \"invalid-css.less\";\n}"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-test-a.less",
    "content": "@import \"import-test-b.less\";\n@import url(import-test-f.less);\n@import url(\"deeper/url-import.less\");\n@a: 20%;\n@import \"urls.less\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-test-b.less",
    "content": "@import \"import-test-c\";\n\n@b: 100%;\n\n.mixin {\n  height: 10px;\n  color: @c;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-test-c.less",
    "content": "\n@c: red;\n\n#import {\n  color: @c;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-test-d.css",
    "content": "#css { color: yellow; }\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-test-e.less",
    "content": "\nbody { width: 100% }\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/import-test-f.less",
    "content": "@import \"import-test-e\";\n\n.test-rule-f {\n  height: 10px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/imports/font.less",
    "content": "@font-face {\n    font-family: xecret;\n    src: url('../assets/xecret.ttf');\n}\n\n#secret {\n    font-family: xecret, sans-serif;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/imports/logo.less",
    "content": "#logo {\n  width: 100px;\n  height: 100px;\n  background: url('./assets/logo.png');\n  background: url(\"#inline-svg\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/interpolation-vars.less",
    "content": "@in: \"in\";\n@terpolation: \"terpolation\";\n\n// should be ignored because its already imported\n// and it uses a variable from the parent scope\n@import \"import-@{my_theme}-e.less\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/invalid-css.less",
    "content": "this isn't very valid CSS."
  },
  {
    "path": "packages/test-data/tests-unit/import/import/json/index.json",
    "content": "[\n  \"{path}/import/import-test-a.less\",\n  \"{path}/import/import-test-b.less\",\n  \"{path}/import/deeper/url-import.less\",\n  \"{path}/import/urls.less\",\n  \"{path}/import/import-test-c.less\",\n  \"{path}/import/deeper/deeper-2/url-import.less\",\n  \"{path}/import/deeper/deeper-2/url-import-2.less\",\n  \"{path}/import/import-test-f.less\",\n  \"{path}/import/import-test-e.less\"\n]"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/json/index.less",
    "content": "@import \"../import-test-a\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/layer-import-2.css",
    "content": ".sub-rule {\n    ul {\n        color: white;\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/layer-import-3.css",
    "content": ""
  },
  {
    "path": "packages/test-data/tests-unit/import/import/layer-import-4.css",
    "content": ".sub-rule {\n    ul {\n        color: white;\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/layer-import-5.css",
    "content": ".sub-rule {\n    ul {\n        color: white;\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/layer-import.less",
    "content": ".sub-rule {\n    ul {\n        color: white;\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import/urls.less",
    "content": "// empty file showing that it loads from the relative path first\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-inline.css",
    "content": "#import {\n  color: red;\n}\n@media (min-width: 600px) {\n  #css { color: yellow; }\n\n}\nthis isn't very valid CSS.\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-inline.less",
    "content": "@import url(\"import/import-test-c.less\");// import inline should not float above this #1954\n@import (inline) url(\"import/import-test-d.css\") (min-width:600px);\n@import (inline, css) url(\"import/invalid-css.less\");"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-interpolation.css",
    "content": "body {\n  width: 100%;\n}\n#logo {\n  width: 100px;\n  height: 100px;\n  background: url('./assets/logo.png');\n  background: url(\"#inline-svg\");\n}\n\n.a {\n  var: test;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-interpolation.less",
    "content": "@my_theme: \"test\";\n\n@import \"import/import-@{my_theme}-e.less\";\n\n@import \"import/import-@{in}@{terpolation}.less\";\n\n@import \"import/interpolation-vars.less\";\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-module.css",
    "content": ".three {\n  color: green;\n}\n.two {\n  color: blue;\n}\n.one {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-module.less",
    "content": "@import \"@less/test-import-module/one/two/three/3.less\";\n@import \"@less/test-import-module/one/two/2\";\n@import \"@less/test-import-module/one/1.less\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-once.css",
    "content": "#import {\n  color: red;\n}\nbody {\n  width: 100%;\n}\n.test-rule-f {\n  height: 10px;\n}\nbody {\n  width: 100%;\n}\n.test-rule-f {\n  height: 10px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-once.less",
    "content": "@import \"import/import-once-test-c\";\n@import \"import/import-once-test-c\";\n@import \"import/import-once-test-c.less\";\n@import \"import/deeper/import-once-test-a\";\n@import (multiple) \"import/import-test-f.less\";\n@import (multiple) \"import/import-test-f.less\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/appender-reference-1968.less",
    "content": ".container-no-parent-selector {\n   .mixin-no-parent-selector();\n}\n.container-with-parent-selector {\n  .mixin-with-parent-selector()\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/comments-2991.less",
    "content": ".referenced {\n\t// This file should not output anything if referenced.\n    @media (hover) {\n        // This file should not output anything if referenced.\n    }\n\t// This file should not output anything if referenced.\n    @media (hover) {\n\t\t// This file should not output anything if referenced.\n    }\n\t// This file should not output anything if referenced.\n    @media (hover) {\n        /* This file should not output anything if referenced. */\n    }\n\t// This file should not output anything if referenced.\n    @media (hover) {\n        color: #000000;\n    }\n}\n// This file should not output anything if referenced.\n@media (hover) {\n\t// This file should not output anything if referenced.\n}\n@media (hover) {\n\t/* This file should not output anything if referenced. */\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/global-scope-import.less",
    "content": ".theOnlySelector {\n  avoid: warning;\n}\n.unusedAndReference:extend(.theOnlySelector) {\n    unused-and: reference;\n}\n\n@import (reference) \"global-scope-nested.less\";\n\n.test-rule-b {\n  background-color: green;\n  &:extend(.test-rule-a all);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/global-scope-nested.less",
    "content": ".test-rule-a {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/mixin-1968.less",
    "content": ".mixin-no-parent-selector() {\n  background-color: red;\n}\n.mixin-with-parent-selector() {\n  &:first-child{ //  USING AN & SELECTOR HERE\n    background-color: blue;\n }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/multiple-import-nested.less",
    "content": "/* double nested file */\nshould {\n  be: invisible;\n}\n/* do not extend outside of this */\n.something {\n  invisible: suppress warning;\n}\n.invisible {\n &:extend(.something all);\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/multiple-import.less",
    "content": "/*\n  tralala\n*/\n.fix {\n  fix: fix;\n}\n.something {\n  @import (reference) \"multiple-import-nested.less\";\n  inside: something;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/simple-mixin.css",
    "content": ".mixin {\n  was: included;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues/simple-ruleset-2162.less",
    "content": "ruleset {\n  shall-be-invisible: less;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues.css",
    "content": ".test-rule-c {\n  background-color: green;\n}\n.theOnlySelector {\n  shall-have: one selector;\n}\nshow-all-content {\n  /*\n  tralala\n*/\n}\nshow-all-content .fix {\n  fix: fix;\n}\nshow-all-content .something {\n  inside: something;\n}\n#used-namespaced-mixin {\n  was: included;\n  shall-see: another property above;\n}\ncall-mixin-with-import-by-reference-inside {\n  the-only-property: nothing-below-this;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference-issues.less",
    "content": "// Tests following past issues:\n// * #1851 - Extend within (reference) imported files \n// * #1896 - Namespace imported less code does not get properly referenced, when there's a (reference) keyword.\n// * #1878 - extend inside referenced file should not extend outside selectors\n// * #2716 - A file imported by reference and then normally - multiple imports should be independent\n// * #1968 - When using an @import (reference), mixins that contain an & selector get added to the compiled output improperly\n// * #2162 - Cannot put import by reference inside of a mixin (also doubles #1896)\n// * #2991 - Empty @media queries generated through line comments when compiling less file with (reference)\n\n// #1878: extend inside referenced file should not extend outside selectors\n@import (reference) \"import-reference-issues/global-scope-import.less\";\n.theOnlySelector {\n  shall-have: one selector;\n}\n\n// #2716: A file imported by reference and then normally - multiple imports should be independent\n// #1878: - double nested version\n#do-not-show-import {\n  @import (reference, multiple) \"import-reference-issues/multiple-import.less\";\n}\n\nshow-all-content {\n  @import (multiple) \"import-reference-issues/multiple-import.less\";\n}\n// #1896: Namespace imported less code does not get properly referenced, when there's a (reference) keyword.\n#Namespace {\n  @import (less, reference) \"import-reference-issues/simple-mixin.css\";\n}\n#used-namespaced-mixin {\n  #Namespace > .mixin();\n  shall-see: another property above;\n}\n\n// #1851: Extend within (reference) imported files \n// test-b is in global-scope-import.less file\n.test-rule-c {\n  &:extend(.test-rule-b all);\n}\n\n// #1968: When using an @import (reference), mixins that contain an & selector get added to the compiled output improperly\n@import \"import-reference-issues/mixin-1968.less\";\n@import (reference) \"import-reference-issues/appender-reference-1968.less\";\n\n// #2162 - Cannot put import by reference inside of a mixin (also doubles #1896)\n.mixin-with-import-by-reference-inside() {\n  the-only-property: nothing-below-this;\n  @import (reference) \"import-reference-issues/simple-ruleset-2162.less\";\n}\ncall-mixin-with-import-by-reference-inside {\n  .mixin-with-import-by-reference-inside();\n}\n\n@import (reference) \"import-reference-issues/comments-2991.less\";"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference.css",
    "content": "input[type=\"text\"].class#id[attr=i32]:not(.one) {\n  color: inherit;\n}\ndiv#id.class[a=one][b=two].class:not(.one) {\n  color: inherit;\n}\n@media print {\n  .class {\n    color: blue;\n  }\n  .class .sub {\n    width: 42;\n  }\n}\n.visible {\n  color: red;\n}\n.visible .c {\n  color: green;\n}\n.visible {\n  color: green;\n}\n.visible:hover {\n  color: green;\n}\n.only-with-visible + .visible,\n.visible + .only-with-visible,\n.visible + .visible {\n  color: green;\n}\n.only-with-visible + .visible .sub,\n.visible + .only-with-visible .sub,\n.visible + .visible .sub {\n  color: green;\n}\n@supports (something: else) {\n  .class {\n    something: else;\n  }\n  .nestedToo .class {\n    something: else;\n  }\n}\n.b {\n  color: red;\n  color: green;\n}\n.b .c {\n  color: green;\n}\n.b:hover {\n  color: green;\n}\n.b + .b {\n  color: green;\n}\n.b + .b .sub {\n  color: green;\n}\n.y {\n  pulled-in: yes /* inline comment survives */;\n}\n/* comment pulled in */\n.visible {\n  extend: test;\n}\n.test-rule-mediaq-import {\n  color: green;\n  test: 340px;\n}\n@media (max-size: 450px) {\n  .test-rule-mediaq-import {\n    color: red;\n  }\n}\n.test-rule {\n  color: red;\n}\n.test-rule:first-child {\n  color: blue;\n}\n@keyframes some-name {\n  property: value;\n}\n@supports (animation-name: test) {\n  @keyframes some-name {\n    property: value;\n  }\n  .selector {\n    color: red;\n  }\n}\ndiv {\n  this isn't very valid CSS.\n}\nthis isn't very valid CSS.\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-reference.less",
    "content": "@import (reference) url(\"import-once.less\");\n@import (reference) url(\"../css-3/css-3.less\");\n@import (reference) url(\"../media/media.less\");\n@import (reference) url(\"import/import-reference.less\");\n@import (reference) url(\"import/css-import.less\");\n\n.b {\n  .z();\n}\n\n.zz();\n\n.visible:extend(.z all) {\n  extend: test;\n}\n\n.test-rule-mediaq-import {\n  .mixin-with-mediaq(340px);\n}\n\n.class:extend(.class all) {\n}\n.mixin-with-nested-selectors();\n.mixin-with-directives(some-name);\n\n.print-referenced-import-inline();\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-remote.css",
    "content": ".test {\n  color: 42;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import-remote.less",
    "content": "// https://github.com/less/less.js/issues/3541\n@import (reference) url(https://cdn.jsdelivr.net/npm/@less/test-data/tests-unit/selectors/selectors.less);\n@import (reference) url(\"https://cdn.jsdelivr.net/npm/@less/test-data/tests-unit/media/media.less\");\n@import (reference) url(\"https://cdn.jsdelivr.net/npm/@less/test-data/tests-unit/empty/empty.less?arg\");\n\n.test {\n  color: @var;\n}"
  },
  {
    "path": "packages/test-data/tests-unit/import/import.css",
    "content": "@charset \"UTF-8\";\n/** comment at the top**/\n@import url(/absolute/something.css) screen and (color) and (max-width: 600px);\n@import url(\"//ha.com/file.css\") (min-width: 100px);\n#import-test {\n  height: 10px;\n  color: red;\n  width: 10px;\n  height: 30%;\n  value: 3.141592653589793;\n}\n@media screen and (max-width: 600px) {\n  body {\n    width: 100%;\n  }\n}\n#import {\n  color: red;\n}\n.mixin {\n  height: 10px;\n  color: red;\n}\n.test-rule-f {\n  height: 10px;\n}\n.deep-import-url {\n  color: red;\n}\n@media screen and (max-width: 601px) {\n  #css {\n    color: yellow;\n  }\n}\n@media screen and (max-width: 602px) {\n  body {\n    width: 100%;\n  }\n}\n@media screen and (max-width: 603px) {\n  #css {\n    color: yellow;\n  }\n}\n@media print {\n  body {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/import.less",
    "content": "/** comment at the top**/\n@plugin \"../../plugin/plugin-simple\";\n\n@import url(/absolute/something.css) screen and (color) and (max-width: 600px);\n\n@import (optional) \"file-does-not-exist.does-not-exist\";\n\n@var: 100px;\n@import url(\"//ha.com/file.css\") (min-width:@var);\n\n#import-test {\n  .mixin();\n  width: 10px;\n  height: (@a + 10%);\n  value: pi-anon();\n}\n@import \"import/import-test-e\" screen and (max-width: 600px);\n\n@import url(\"import/import-test-a.less\");\n\n@import (less, multiple) \"import/import-test-d.css\" screen and (max-width: 601px);\n\n@import (multiple) \"import/import-test-e\" screen and (max-width: 602px);\n\n@import (less, multiple) url(\"import/import-test-d.css\") screen and (max-width: 603px);\n\n@media print {\n  @import (multiple) \"import/import-test-e\";\n}\n\n@charset \"UTF-8\"; // climb on top #2126\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/import/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"syncImport\": true\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-unit/javascript/javascript.css",
    "content": ".eval {\n  js: 42;\n  js: 2;\n  js: \"hello world\";\n  js: 1, 2, 3;\n  title: \"string\";\n  ternary: true;\n  multiline: 2;\n}\n.scope {\n  --empty: ;\n  var: 42;\n  escaped: 7px;\n}\n.vars {\n  width: 8;\n}\n.escape-interpol {\n  width: hello world;\n}\n.arrays {\n  ary: \"1, 2, 3\";\n  ary1: \"1, 2, 3\";\n}\n.test-rule-tran {\n  one: opacity 0.3s ease-in 0.3s, max-height 0.6s linear, margin-bottom 0.4s linear;\n  two: [opacity 0.3s ease-in 0.3s, max-height 0.6s linear, margin-bottom 0.4s linear];\n  three: opacity 0.3s ease-in 0.3s, max-height 0.6s linear, margin-bottom 0.4s linear;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/javascript/javascript.less",
    "content": "// JavaScript evaluation tests\n.eval {\n    js: `42`;\n    js: `1 + 1`;\n    js: `\"hello world\"`;\n    js: `[1, 2, 3]`;\n    title: `typeof process.title`;\n    ternary: `(1 + 1 == 2 ? true : false)`;\n    multiline: `(function(){var x = 1 + 1;\n           return x})()`;\n}\n.scope {\n    --empty: `+function(){}`;\n    @foo: 42;\n    var: `parseInt(this.foo.toJS())`;\n    escaped: ~`2 + 5 + 'px'`;\n}\n.vars {\n    @var: `4 + 4`;\n    width: @var;\n}\n.escape-interpol {\n    @world: \"world\";\n    width: ~`\"hello\" + \" \" + @{world}`;\n}\n.arrays {\n    @ary:  1, 2, 3;\n    @ary2: 1  2  3;\n    ary: `@{ary}.join(', ')`;\n    ary1: `@{ary2}.join(', ')`;\n}\n.transitions(...) {\n  @arg: ~`\"@{arguments}\".replace(/[\\[\\]]*/g, '')`;\n  one: @arg;              // rounded to integers\n  two: ~`\"@{arguments}\"`; // rounded to integers\n  three: @arguments;        // OK\n}\n.test-rule-tran {\n  .transitions(opacity 0.3s ease-in 0.3s, max-height 0.6s linear, margin-bottom 0.4s linear;);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/javascript/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"javascriptEnabled\": true\n    }\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-unit/layer/assets/import/layer-import.less",
    "content": ".layer-import {\n  color: indigo;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/layer/import/layer-import.less",
    "content": ".sub-rule {\n    ul {\n        color: white;\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/layer/layer.css",
    "content": "@import url(\"/import/layer-import-2.css\") layer(foo);\n@import url(\"/import/layer-import-3.css\") layer(responsive) supports(display: flex) screen and (max-width: 768px);\n@import url(\"/import/layer-import-4.css\") layer(print) print;\n@import url(\"/import/layer-import-4.css\") layer(print) print, (max-width: 600px);\n@import url(\"/import/layer-import-5.css\") layer(features) supports(display: grid);\n@layer {\n  .main::before {\n    color: #f00;\n  }\n}\n@layer legacy {\n  .sub-rule ul {\n    color: white;\n  }\n}\n@layer primevue {\n  .test {\n    foo: bar;\n  }\n}\n@layer reset, base, components, utilities;\n@layer reset {\n  *,\n  *::before,\n  *::after {\n    box-sizing: border-box;\n  }\n}\n@layer base {\n  body {\n    margin: 0;\n    font-family: system-ui, sans-serif;\n  }\n  body header {\n    background-color: #f0f0f0;\n    padding: 1rem;\n  }\n}\n@layer components {\n  .button {\n    display: inline-block;\n    padding: 0.5rem 1rem;\n    background-color: blue;\n    color: white;\n  }\n  .button:hover {\n    background-color: darkblue;\n  }\n}\n@layer utilities {\n  .text-center {\n    text-align: center;\n  }\n  .responsive {\n    width: 100%;\n  }\n  @media (min-width: 768px) {\n    .responsive {\n      width: 50%;\n    }\n  }\n}\n.parent {\n  color: black;\n}\n.parent .child {\n  color: red;\n}\n.parent:hover {\n  background: lightgray;\n}\n@layer foo.baz {\n  .bar {\n    font-weight: bold;\n  }\n}\n@layer framework {\n  @layer layout {\n    .container {\n      display: grid;\n      gap: 2rem;\n    }\n  }\n}\n@layer framework.layout {\n  main {\n    padding: 2rem;\n  }\n  p {\n    margin-block: 1rem;\n    color: #555;\n  }\n}\n@layer theme;\n@layer layout, utilities;\nbody {\n  color: black;\n}\n@layer components {\n  .btn {\n    color: red;\n  }\n  .btn:hover {\n    color: blue;\n  }\n}\n@layer {\n  p {\n    margin-block: 1rem;\n  }\n}\n@layer framework.buttons.primary {\n  .btn-primary {\n    background: dodgerblue;\n    color: white;\n  }\n}\n.feature {\n  color: gray;\n}\n@layer component {\n  .feature h2 {\n    font-size: 1.5rem;\n  }\n}\n@layer ui {\n  .btn {\n    padding: 0.5rem 1rem;\n    border-radius: 4px;\n    background: rebeccapurple;\n    color: white;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/layer/layer.less",
    "content": ".main {\n    @layer {\n        &::before {\n            color: #f00;\n        }\n    }\n}\n\n@layer legacy {\n    @import \"./import/layer-import.less\";\n}\n\n@import url(\"/import/layer-import-2.css\") layer(foo);\n@import url(\"/import/layer-import-3.css\") layer(responsive) supports(display: flex) screen and (max-width: 768px);\n@import url(\"/import/layer-import-4.css\") layer(print) print;\n@import url(\"/import/layer-import-4.css\") layer(print) print, (max-width: 600px);\n@import url(\"/import/layer-import-5.css\") layer(features) supports(display: grid);\n\n@layer-name: primevue;\n\n@layer @layer-name {\n    .test {\n        foo: bar;\n    }\n}\n\n@layer reset, base, components, utilities;\n\n@layer reset {\n\n    *,\n    *::before,\n    *::after {\n        box-sizing: border-box;\n    }\n}\n\n@layer base {\n    body {\n        margin: 0;\n        font-family: system-ui, sans-serif;\n\n        header {\n            background-color: #f0f0f0;\n            padding: 1rem;\n        }\n    }\n}\n\n@layer components {\n    .button {\n        display: inline-block;\n        padding: 0.5rem 1rem;\n        background-color: blue;\n        color: white;\n\n        &:hover {\n            background-color: darkblue;\n        }\n    }\n}\n\n@layer utilities {\n    .text-center {\n        text-align: center;\n    }\n\n    .responsive {\n        width: 100%;\n\n        @media (min-width: 768px) {\n            width: 50%;\n        }\n    }\n}\n\n.parent {\n    color: black;\n\n    .child {\n        color: red;\n    }\n\n    &:hover {\n        background: lightgray;\n    }\n}\n\n@layer foo.baz {\n   .bar {\n       font-weight: bold;\n   }\n}\n\n@layer framework {\n    @layer layout {\n        .container {\n            display: grid;\n            gap: 2rem;\n        }\n    }\n}\n\n@layer framework.layout {\n    main {\n        padding: 2rem;\n    }\n    p {\n        margin-block: 1rem;\n        color: #555;\n    }\n}\n\n\n@layer theme;\n@layer layout, utilities;\n\nbody {\n  color: black;\n}\n\n@layer components {\n  .btn {\n    color: red;\n    &:hover {\n      color: blue;\n    }\n  }\n}\n\n@layer {\n  p {\n    margin-block: 1rem;\n  }\n}\n\n@layer framework.buttons.primary {\n  .btn-primary {\n    background: dodgerblue;\n    color: white;\n  }\n}\n\n.feature {\n  color: gray;\n\n  @layer component {\n    h2 {\n      font-size: 1.5rem;\n    }\n  }\n}\n\n@primary-color: rebeccapurple;\n\n.button-styles() {\n  padding: 0.5rem 1rem;\n  border-radius: 4px;\n}\n\n@layer ui {\n  .btn {\n    .button-styles();\n    background: @primary-color;\n    color: white;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/lazy-eval/lazy-eval.css",
    "content": ".lazy-eval {\n  width: 100%;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/lazy-eval/lazy-eval.less",
    "content": "// Lazy evaluation tests\n@var: @a;\n@a: 100%;\n\n.lazy-eval {\n  width: @var;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/media/media.css",
    "content": "@media print {\n  .class {\n    color: blue;\n  }\n  .class .sub {\n    width: 42;\n  }\n  .top,\n  header > h1 {\n    color: #444444;\n  }\n}\n@media screen {\n  .body {\n    max-width: 480;\n  }\n}\n@media all and (device-aspect-ratio: 16 / 9) {\n  .body {\n    max-width: 800px;\n  }\n}\n@media all and (orientation: portrait) {\n  aside {\n    float: none;\n  }\n}\n@media handheld and (min-width: 42), screen and (min-width: 20em) {\n  .body {\n    max-width: 480px;\n  }\n}\n@media print {\n  .body {\n    padding: 20px;\n  }\n  .body header {\n    background-color: red;\n  }\n}\n@media print and (orientation: landscape) {\n  .body {\n    margin-left: 20px;\n  }\n}\n@media screen {\n  .sidebar {\n    width: 300px;\n  }\n}\n@media screen and (orientation: landscape) {\n  .sidebar {\n    width: 500px;\n  }\n}\n@media a and (b) {\n  .first .second .third {\n    width: 300px;\n  }\n  .first .second .fourth {\n    width: 3;\n  }\n}\n@media a and (b) and (c) {\n  .first .second .third {\n    width: 500px;\n  }\n}\n@media a, (b) and (c) {\n  .body {\n    width: 95%;\n  }\n}\n@media a and (x), (b) and (c) and (x), a and (y), (b) and (c) and (y) {\n  .body {\n    width: 100%;\n  }\n}\n.a {\n  background: black;\n}\n@media handheld {\n  .a {\n    background: white;\n  }\n}\n@media handheld and (max-width: 100px) {\n  .a {\n    background: red;\n  }\n}\n.b {\n  background: black;\n}\n@media handheld {\n  .b {\n    background: white;\n  }\n}\n@media handheld and (max-width: 200px) {\n  .b {\n    background: red;\n  }\n}\n@media only screen and (max-width: 200px) {\n  .body {\n    width: 480px;\n  }\n}\n@media print {\n  @page :left {\n    margin: 0.5cm;\n  }\n  @page :right {\n    margin: 0.5cm;\n  }\n  @page Test:first {\n    margin: 1cm;\n  }\n  @page :first {\n    size: 8.5in 11in;\n    @top-left {\n      margin: 1cm;\n    }\n    @top-left-corner {\n      margin: 1cm;\n    }\n    @top-center {\n      margin: 1cm;\n    }\n    @top-right {\n      margin: 1cm;\n    }\n    @top-right-corner {\n      margin: 1cm;\n    }\n    @bottom-left {\n      margin: 1cm;\n    }\n    @bottom-left-corner {\n      margin: 1cm;\n    }\n    @bottom-center {\n      margin: 1cm;\n    }\n    @bottom-right {\n      margin: 1cm;\n    }\n    @bottom-right-corner {\n      margin: 1cm;\n    }\n    @left-top {\n      margin: 1cm;\n    }\n    @left-middle {\n      margin: 1cm;\n    }\n    @left-bottom {\n      margin: 1cm;\n    }\n    @right-top {\n      margin: 1cm;\n    }\n    @right-middle {\n      content: \"Page \" counter(page);\n    }\n    @right-bottom {\n      margin: 1cm;\n    }\n  }\n}\n@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: 2/1), (min-resolution: 2dppx), (min-resolution: 128dpcm) {\n  .b {\n    background: red;\n  }\n}\n.body {\n  background: red;\n}\n@media (max-width: 500px) {\n  .body {\n    background: green;\n  }\n}\n@media (max-width: 1000px) {\n  .body {\n    background: red;\n    background: blue;\n  }\n}\n@media (max-width: 1000px) and (max-width: 500px) {\n  .body {\n    background: green;\n  }\n}\n@media (max-width: 1200px) {\n  /* a comment */\n}\n@media (max-width: 1200px) and (max-width: 900px) {\n  .body {\n    font-size: 11px;\n  }\n}\n@media (min-width: 480px) {\n  .nav-justified > li {\n    display: table-cell;\n  }\n}\n@media (min-width: 768px) and (min-width: 480px) {\n  .menu > li {\n    display: table-cell;\n  }\n}\n@media all and (tv) {\n  .all-and-tv-variables {\n    var: all-and-tv;\n  }\n}\n@media screen and (min-width: 61px) {\n  .selector {\n    foo: bar;\n  }\n}\n@media screen and (color), projection and (color) {\n  .selector {\n    color: #eee;\n  }\n}\n@media not (width <= -100px) {\n  body {\n    background: green;\n  }\n}\n@media (height > -100px) {\n  body {\n    background: green;\n  }\n}\n@media not (resolution: -300dpi) {\n  body {\n    background: green;\n  }\n}\n@media (min-orientation: portrait) {\n  body {\n    background: green;\n  }\n}\n@media print and (min-resolution: 118dpcm) {\n  body {\n    background: green;\n  }\n}\n@media (200px <= width <= 500px) {\n  .test-range-syntax {\n    padding: 0;\n  }\n}\n.selector {\n  color: #eee;\n}\n@media (200px <= width <= 500px) {\n  .selector .test-range-syntax {\n    padding: 0;\n  }\n}\n@media print, (max-width: 992px) {\n  div {\n    color: red;\n  }\n}\n@media screen and (max-width: 1280px) {\n  .form-process-table {\n    color: red;\n  }\n}\n@media ((color) and (hover)), all {\n  body {\n    background: green;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/media/media.less",
    "content": "// For now, variables can't be declared inside @media blocks.\n\n@var: 42;\n\n@media print {\n    .class {\n        color: blue;\n        .sub {\n            width: @var;\n        }\n    }\n    .top, header > h1 {\n        color: (#222 * 2);\n    }\n}\n\n@media screen {\n    @base: 8;\n    .body { max-width: (@base * 60); }\n}\n\n@ratio_large: 16;\n@ratio_small: 9;\n\n@media all and (device-aspect-ratio: ~'@{ratio_large} / @{ratio_small}') {\n   .body { max-width: 800px; }\n}\n\n@media all and (orientation:portrait) {\n    aside { float: none; }\n}\n\n@media handheld and (min-width: @var), screen and (min-width: 20em) {\n    .body {\n        max-width: 480px;\n    }\n}\n\n.body {\n    @media print {\n        padding: 20px;\n\n        header {\n            background-color: red;\n        }\n\n        @media (orientation:landscape) {\n            margin-left: 20px;\n        }\n    }\n}\n\n@media screen {\n  .sidebar {\n    width: 300px;\n    @media (orientation: landscape) {\n      width: 500px;\n    }\n  }\n}\n\n@media a {\n  .first {\n    @media (b) {\n      .second {\n        .third {\n          width: 300px;\n          @media (c) {\n            width: 500px;\n          }\n        }\n        .fourth {\n          width: 3;\n        }\n      }\n    }\n  }\n}\n\n.body {\n    @media a, (b) and (c) {\n        width: 95%;\n\n        @media (x), (y) {\n            width: 100%;\n        }\n    }\n}\n\n.mediaMixin(@fallback: 200px) {\n    background: black;\n\n    @media handheld {\n        background: white;\n\n        @media (max-width: @fallback) {\n            background: red;\n        }\n    }\n}\n\n.a {\n  .mediaMixin(100px);\n}\n\n.b {\n  .mediaMixin();\n}\n@smartphone: ~\"only screen and (max-width: 200px)\";\n@media @smartphone {\n  .body {\n    width: 480px;\n  }\n}\n\n@media print {\n  @page :left {\n    margin: 0.5cm;\n  }\n  @page :right {\n    margin: 0.5cm;\n  }\n  @page Test:first {\n    margin: 1cm;\n  }\n  @page :first {\n    size: 8.5in 11in;\n    @top-left {\n      margin: 1cm;\n    }\n    @top-left-corner {\n      margin: 1cm;\n    }\n    @top-center {\n      margin: 1cm;\n    }\n    @top-right {\n      margin: 1cm;\n    }\n    @top-right-corner {\n      margin: 1cm;\n    }\n    @bottom-left {\n      margin: 1cm;\n    }\n    @bottom-left-corner {\n      margin: 1cm;\n    }\n    @bottom-center {\n      margin: 1cm;\n    }\n    @bottom-right {\n      margin: 1cm;\n    }\n    @bottom-right-corner {\n      margin: 1cm;\n    }\n    @left-top {\n      margin: 1cm;\n    }\n    @left-middle {\n      margin: 1cm;\n    }\n    @left-bottom {\n      margin: 1cm;\n    }\n    @right-top {\n      margin: 1cm;\n    }\n    @right-middle {\n      content: \"Page \" counter(page);\n    }\n    @right-bottom {\n      margin: 1cm;\n    }\n  }\n}\n\n@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: ~\"2/1\"), (min-resolution: 2dppx), (min-resolution: 128dpcm) {\n  .b {\n    background: red;\n  }\n}\n\n.bg() {\n    background: red;\n\n    @media (max-width: 500px) {\n        background: green;\n    }\n}\n\n.body {\n    .bg();\n}\n\n@bpMedium: 1000px;\n@media (max-width: @bpMedium) {\n    .body {\n        .bg();\n        background: blue;\n    }\n}\n\n@media (max-width: 1200px) {\n  /* a comment */\n\n  @media (max-width: 900px) {\n    .body { font-size: 11px; }\n  }\n}\n\n.nav-justified {\n  @media (min-width: 480px) {\n    > li {\n      display: table-cell;\n    }\n  }\n}\n\n.menu\n{\n  @media (min-width: 768px) {\n    .nav-justified();\n  }\n}\n@all: ~\"all\";\n@tv: ~\"(tv)\";\n@media @all and @tv {\n  .all-and-tv-variables {\n    var: all-and-tv;\n  }\n}\n\n@some-var: 60px;\n@media screen and (min-width: (@some-var + 1)) {\n  .selector {\n    foo: bar;\n  }\n}\n\n@media screen and (color), projection and (color) {\n  .selector {\n    color: #eee;\n  }\n}\n\n@media not (width <= -100px) {\n  body { \n    background: green; \n  }\n}\n\n@media (height > -100px) {\n  body { \n    background: green; \n  }\n}\n\n@media not (resolution: -300dpi) {\n  body { \n    background: green; \n  }\n}\n\n@media (min-orientation:portrait) {\n  body { \n    background: green; \n  }\n}\n\n@media print and (min-resolution: 118dpcm) {\n  body { \n    background: green; \n  }\n}\n\n@media (200px <= width <= 500px) {\n  .test-range-syntax {\n      padding: 0;\n  }\n}\n\n.selector {\n  color: #eee;\n\n  @media (200px <= width <= 500px) {\n    .test-range-syntax {\n        padding: 0;\n    }\n  }\n}\n\n@media print, (max-width: 992px) {\n    div {\n        color: red;\n    }\n}\n\n.form-process-table {\n    @media screen and(max-width: 1280px) {\n        color: red;\n    }\n}\n\n@media ((color) and (hover)), all {\n  body {\n    background: green;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/merge/merge.css",
    "content": ".test-rule1 {\n  transform: rotate(90deg), skew(30deg), scale(2, 4);\n}\n.test-rule2 {\n  transform: rotate(90deg), skew(30deg);\n  transform: scaleX(45deg);\n}\n.test-rule3 {\n  transform: scaleX(45deg);\n  background: url(data://img1.png);\n}\n.test-rule4 {\n  transform: rotate(90deg), skew(30deg), scale(2, 4) !important;\n}\n.test-rule5 {\n  transform: rotate(90deg), skew(30deg), scale(2, 4) !important;\n}\n.test-rule6 {\n  transform: scale(2, 4);\n}\n.test-rule7 {\n  transform: scale(2, 4), scale(2, 4), scale(2, 4) !important;\n}\n.test-rule-interleaved {\n  transform: t1, t2, t3;\n  background: b1, b2, b3;\n}\n.test-rule-spaced {\n  transform: t1 t2 t3;\n  background: b1 b2, b3;\n}\n.test-rule-interleaved-with-spaced {\n  transform: t1s, t2 t3s, t4 t5s t6s;\n  background: b1 b2s, b3, b4;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/merge/merge.less",
    "content": "// Merge functionality tests\n.first-transform() {\n  transform+: rotate(90deg), skew(30deg);\n}\n.second-transform() {\n  transform+: scale(2,4);\n}\n.third-transform() {\n  transform: scaleX(45deg);\n}\n.fourth-transform() {\n  transform+: scaleX(45deg);\n}\n.fifth-transform() {\n  transform+: scale(2,4) !important;\n}\n.first-background() {\n  background+: url(data://img1.png);\n}\n.second-background() {\n  background+: url(data://img2.png);\n}\n\n.test-rule1 {\n  // Can merge values\n  .first-transform();\n  .second-transform();\n}\n.test-rule2 {\n  // Won't merge values without +: merge directive, for backwards compatibility with css\n  .first-transform();\n  .third-transform();\n}\n.test-rule3 {\n  // Won't merge values from two sources with different properties\n  .fourth-transform();\n  .first-background();\n}\n.test-rule4 {\n  .first-transform();\n  .fifth-transform();\n}\n.test-rule5 {\n  .first-transform();\n  .second-transform() !important;\n}\n.test-rule6 {\n  .second-transform();\n}\n.test-rule7 {\n  // inherit !important from merged subrules\n  .second-transform();\n  .second-transform() !important;\n  .second-transform();\n}\n\n.test-rule-interleaved {\n    transform+:  t1;\n    background+: b1;\n    transform+:  t2;\n    background+: b2, b3;\n    transform+:  t3;\n}\n\n.test-rule-spaced {\n    transform+_:  t1;\n    background+_: b1;\n    transform+_:  t2;\n    background+_: b2, b3;\n    transform+_:  t3;\n}\n\n.test-rule-interleaved-with-spaced {\n    transform+_:  t1s;\n    transform+:   t2;\n    background+:  b1;\n    transform+_:  t3s;\n    transform+:   t4 t5s;\n    background+_: b2s, b3;\n    transform+_:  t6s;\n    background+:  b4;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixin-noparens/mixin-noparens.css",
    "content": "#theme > .mixin {\n  background-color: grey;\n}\n#container {\n  color: black;\n  background-color: grey;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixin-noparens/mixin-noparens.less",
    "content": "#theme {\n  > .mixin {\n    background-color: grey;\n  }\n}\n#container {\n  color: black;\n  #theme > .mixin;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins/maps.css",
    "content": ".maps h2 {\n  width: 10px;\n}\n.maps h1 {\n  color: white;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins/maps.less",
    "content": ".maps {\n    @a: 10;\n    h2 { width: unit(@a, px); }\n\n    .mk-map() {\n        text: white;\n        background: black;\n    }\n\n    @p: .mk-map();\n\n    h1 { color: @p[text]; }\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins/mixins-advanced.css",
    "content": ".test-expanded {\n  a: 1px;\n  b: 2px;\n}\n.test-multi-def {\n  small: 10;\n  large: 15;\n}\n.test-conditions {\n  large: 15;\n  small: 5;\n}\n.test-no-args-filter {\n  no-args: true;\n  with-args: 10;\n}\n.test-recursive {\n  level: 3;\n  level: 2;\n  level: 1;\n  done: true;\n}\n.test-namespace-path {\n  from-namespace: true;\n}\n.test-important {\n  important: true !important;\n}\n.test-multi {\n  value1: 1;\n  value2: 2;\n}\n.test-named {\n  a: A;\n  b: B;\n}\n.test-array-expand {\n  a: 1;\n  b: 2;\n  c: 3;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins/mixins-advanced.less",
    "content": "// Advanced mixin call tests to cover edge cases\n\n// Mixin call with expanded arguments\n.mixin(@a, @b) {\n  a: @a;\n  b: @b;\n}\n@args: 1px, 2px;\n.test-expanded {\n  .mixin(@args...);\n}\n\n// Mixin call with condition matching and multiple definitions\n.mixin-multi-def(@x: 10) when (@x > 10) {\n  large: @x;\n}\n.mixin-multi-def(@x: 10) when (@x <= 10) {\n  small: @x;\n}\n.test-multi-def {\n  .mixin-multi-def();\n  .mixin-multi-def(15);\n}\n\n// Mixin call with condition matching\n.mixin-guarded(@x) when (@x > 10) {\n  large: @x;\n}\n.mixin-guarded(@x) when (@x <= 10) {\n  small: @x;\n}\n.test-conditions {\n  .mixin-guarded(15);\n  .mixin-guarded(5);\n}\n\n// Mixin call with no arguments filter\n.mixin-no-args() {\n  no-args: true;\n}\n.mixin-no-args(@x) {\n  with-args: @x;\n}\n.test-no-args-filter {\n  .mixin-no-args();\n  .mixin-no-args(10);\n}\n\n// Mixin call with recursive mixin\n.mixin-recursive(@n) when (@n > 0) {\n  level: @n;\n  .mixin-recursive(@n - 1);\n}\n.mixin-recursive(@n) when (@n <= 0) {\n  done: true;\n}\n.test-recursive {\n  .mixin-recursive(3);\n}\n\n// Mixin call with namespace path\n#namespace {\n  .mixin() {\n    from-namespace: true;\n  }\n}\n.test-namespace-path {\n  #namespace > .mixin();\n}\n\n// Mixin call with important flag\n.mixin-important() {\n  important: true;\n}\n.test-important {\n  .mixin-important() !important;\n}\n\n// Mixin call with multiple candidates\n.mixin-multi(@x: 1) {\n  value1: @x;\n}\n.mixin-multi(@x: 2) {\n  value2: @x;\n}\n.test-multi {\n  .mixin-multi();\n}\n\n// Mixin call with named arguments\n.mixin-named(@a: a, @b: b) {\n  a: @a;\n  b: @b;\n}\n.test-named {\n  .mixin-named(@b: B, @a: A);\n}\n\n// Mixin call with expanded array\n.mixin-array(@a, @b, @c) {\n  a: @a;\n  b: @b;\n  c: @c;\n}\n@array: 1, 2, 3;\n.test-array-expand {\n  .mixin-array(@array...);\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins/mixins.css",
    "content": ".mixin {\n  border: 1px solid black;\n}\n.mixout {\n  border-color: orange;\n}\n.borders {\n  border-style: dashed;\n}\n.mixin > * {\n  border: do not match me;\n}\n#namespace .borders {\n  border-style: dotted;\n}\n#namespace .biohazard {\n  content: \"death\";\n}\n#namespace .biohazard .man {\n  color: transparent;\n}\n#theme > .mixin {\n  background-color: grey;\n}\n#container {\n  color: black;\n  border: 1px solid black;\n  border-color: orange;\n  background-color: grey;\n}\n#header .milk {\n  color: inherit;\n  border: 1px solid black;\n  background-color: grey;\n}\n#header #cookie {\n  border-style: dashed;\n}\n#header #cookie .chips {\n  border-style: dotted;\n}\n#header #cookie .chips .calories {\n  color: black;\n  border: 1px solid black;\n  border-color: orange;\n  background-color: grey;\n}\n.secure-zone {\n  color: transparent;\n}\n.direct {\n  border-style: dotted;\n}\n.bo,\n.bar {\n  width: 100%;\n}\n.bo {\n  border: 1px;\n}\n.ar.bo.ca {\n  color: black;\n}\n.jo.ki {\n  background: none;\n}\n.amp.support {\n  color: orange;\n}\n.amp.support .higher {\n  top: 0px;\n}\n.amp.support.deeper {\n  height: auto;\n}\n.extended {\n  width: 100%;\n  border: 1px;\n  background: none;\n  color: orange;\n  top: 0px;\n  height: auto;\n}\n.extended .higher {\n  top: 0px;\n}\n.extended.deeper {\n  height: auto;\n}\n.do .re .mi .fa .sol .la .si {\n  color: cyan;\n}\n.mutli-selector-parents {\n  color: cyan;\n}\n.foo .bar {\n  width: 100%;\n}\n.underParents {\n  color: red;\n}\n.parent .underParents {\n  color: red;\n}\n* + h1 {\n  margin-top: 25px;\n}\nlegend + h1 {\n  margin-top: 0;\n}\nh1 + * {\n  margin-top: 10px;\n}\n* + h2 {\n  margin-top: 20px;\n}\nlegend + h2 {\n  margin-top: 0;\n}\nh2 + * {\n  margin-top: 8px;\n}\n* + h3 {\n  margin-top: 15px;\n}\nlegend + h3 {\n  margin-top: 0;\n}\nh3 + * {\n  margin-top: 5px;\n}\n.error {\n  background-image: \"/a.png\";\n  background-position: center center;\n}\n.test-rule-rec .recursion {\n  color: black;\n}\n.button {\n  padding-left: 44px;\n}\n.button.large {\n  padding-left: 40em;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins/mixins.less",
    "content": ".mixin { border: 1px solid black; }\n.mixout { border-color: orange; }\n.borders { border-style: dashed; }\n.mixin > * { border: do not match me; }\n\n#namespace {\n  .borders {\n    border-style: dotted;\n  }\n  .biohazard {\n    content: \"death\";\n    .man {\n      color: transparent;\n    }\n  }\n}\n#theme {\n  > .mixin {\n    background-color: grey;\n  }\n}\n#container {\n  color: black;\n  .mixin();\n  .mixout ();\n  #theme > .mixin();\n}\n\n#header {\n  .milk {\n    color: inherit;\n    .mixin();\n    #theme > .mixin();\n  }\n  #cookie {\n    .chips {\n      #namespace .borders();\n      .calories {\n        #container();\n      }\n    }\n    .borders();\n  }\n}\n.secure-zone { #namespace .biohazard .man(); }\n.direct {\n  #namespace > .borders();\n}\n\n.bo, .bar {\n    width: 100%;\n}\n.bo {\n    border: 1px;\n}\n.ar.bo.ca {\n    color: black;\n}\n.jo.ki {\n    background: none;\n}\n.amp {\n    &.support {\n        color: orange;\n        .higher {\n            top: 0px;\n        }\n        &.deeper {\n            height: auto;\n        }\n    }\n}\n.extended {\n    .bo();\n    .jo.ki();\n    .amp.support();\n    .amp.support.higher();\n    .amp.support.deeper();\n}\n.do .re .mi .fa {\n    .sol .la {\n        .si {\n            color: cyan;\n        }\n    }\n}\n.mutli-selector-parents {\n    .do.re.mi.fa.sol.la.si();\n}\n.foo .bar {\n  .bar();\n}\n.has_parents() {\n  & .underParents {\n    color: red;\n  }\n}\n.has_parents();\n.parent {\n  .has_parents();\n}\n.margin_between(@above, @below) {\n     * + & { margin-top: @above; }\n     legend + & { margin-top: 0; }\n     & + * { margin-top: @below; }\n}\nh1 { .margin_between(25px, 10px); }\nh2 { .margin_between(20px, 8px); }\nh3 { .margin_between(15px, 5px); }\n\n.mixin_def(@url, @position){\n    background-image: @url;\n    background-position: @position;\n}\n.error{\n  @s: \"/\";\n  .mixin_def( \"@{s}a.png\", center center);\n}\n.recursion() {\n  color: black;\n}\n.test-rule-rec {\n  .recursion {\n    .recursion();\n  }\n}\n.paddingFloat(@padding) { padding-left: @padding; }\n\n.button {\n    .paddingFloat(((10px + 12) * 2));\n\n    &.large { .paddingFloat(((10em * 2) * 2)); }\n}\n.clearfix() {\n  // ...\n}\n.clearfix {\n  .clearfix();\n}\n.clearfix {\n  .clearfix();\n}\n.foo {\n  .clearfix();\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-closure/mixins-closure.css",
    "content": ".class {\n  width: 99px;\n}\n.overwrite {\n  width: 99px;\n}\n.nested .class {\n  width: 5px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-closure/mixins-closure.less",
    "content": ".scope {\n    @var: 99px;\n    .mixin () {\n        width: @var;\n    }\n}\n\n.class {\n    .scope > .mixin();\n}\n\n.overwrite {\n    @var: 0px;\n    .scope > .mixin();\n}\n\n.nested {\n    @var: 5px;\n    .mixin () {\n        width: @var;\n    }\n    .class {\n        @var: 10px;\n       .mixin();\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-guards/mixins-guards.css",
    "content": ".light1 {\n  color: inherit;\n  margin: 1px;\n}\n.light2 {\n  color: black;\n  margin: 1px;\n}\n.max1 {\n  width: 6;\n}\n.max2 {\n  width: 8;\n}\n.glob1 {\n  margin: auto auto;\n}\n.ops1 {\n  height: gt-or-eq;\n  height: lt-or-eq;\n  height: lt-or-eq-alias;\n}\n.ops2 {\n  height: gt-or-eq;\n  height: not-eq;\n}\n.ops3 {\n  height: lt-or-eq;\n  height: lt-or-eq-alias;\n  height: not-eq;\n}\n.default1 {\n  content: default;\n}\n.test-rule1 {\n  content: \"true.\";\n}\n.test-rule2 {\n  content: \"false.\";\n}\n.test-rule3 {\n  content: \"false.\";\n}\n.test-rule4 {\n  content: \"false.\";\n}\n.test-rule5 {\n  content: \"false.\";\n}\n.bool1 {\n  content: true and true;\n  content: true;\n  content: false, true;\n  content: false and true and true, true;\n  content: false, true and true;\n  content: false, false, true;\n  content: false, true and true and true, false;\n  content: not false;\n  content: not false and false, not false;\n}\n.equality-units {\n  test: pass;\n}\n.colorguardtest {\n  content: is red;\n  content: is not blue its red;\n  content: is not blue its purple;\n}\n.stringguardtest {\n  content: \"theme1\" is \"theme1\";\n  content: \"theme1\" is not \"theme2\";\n  content: \"theme1\" is 'theme1';\n  content: \"theme1\" is not 'theme2';\n  content: 'theme1' is \"theme1\";\n  content: 'theme1' is not \"theme2\";\n  content: 'theme1' is 'theme1';\n  content: 'theme1' is not 'theme2';\n  content: theme1 is not \"theme2\";\n  content: theme1 is not 'theme2';\n  content: theme1 is theme1;\n}\n.variouse-types-comparison {\n  /**/\n  content: true is not equal to false;\n  content: false is not equal to true too;\n  /**/\n  content: 1 is not equal to true;\n  content: true is not equal to 1 too;\n  /**/\n  content: 2 is equal to 2px;\n  content: 2px is equal to 2 too;\n  /**/\n  content: 3 is equal to 3;\n  content: 3 is equal to 3 too;\n  /**/\n  content: 5 is not equal to 4;\n  content: 4 is not equal to 5 too;\n  /**/\n  content: abc is equal to abc;\n  content: abc is equal to abc too;\n  /**/\n  content: abc is not equal to \"abc\";\n  content: \"abc\" is not equal to abc too;\n  /**/\n  content: 'abc' is less than \"abd\";\n  content: \"abd\" is greater than 'abc' too;\n  content: 'abc' is not equal to \"abd\";\n  content: \"abd\" is not equal to 'abc' too;\n  /**/\n  content: 6 is equal to 6;\n  content: 6 is equal to 6 too;\n  /**/\n  content: 8 is less than 9 too;\n  content: 9 is greater than 8;\n  content: 9 is not equal to 8;\n  content: 8 is not equal to 9 too;\n  /**/\n  content: a is not equal to b;\n  content: b is not equal to a too;\n  /**/\n  content: 1 2 is not equal to 3;\n  content: 3 is not equal to 1 2 too;\n}\n.list-comparison {\n  /**/\n  content: a b c is equal to a b c;\n  content: a b c is equal to a b c too;\n  /**/\n  content: a b c is not equal to a b d;\n  content: a b d is not equal to a b c too;\n  /**/\n  content: a, b, c is equal to a, b, c;\n  content: a, b, c is equal to a, b, c too;\n  /**/\n  content: a, b, c is not equal to a, b, d;\n  content: a, b, d is not equal to a, b, c too;\n  /**/\n  content: 1 2px 300ms is equal to 1em 2 0.3s;\n  content: 1em 2 0.3s is equal to 1 2px 300ms too;\n  /**/\n  content: 1 2 3 is not equal to 1, 2, 3;\n  content: 1, 2, 3 is not equal to 1 2 3 too;\n  /**/\n  content: 1, 2, 3 is equal to 1, 2, 3;\n  content: 1, 2, 3 is equal to 1, 2, 3 too;\n  /**/\n  content: 1 2 3 1, 2, 3 is equal to 1 2 3 1, 2, 3;\n  content: 1 2 3 1, 2, 3 is equal to 1 2 3 1, 2, 3 too;\n  /**/\n  content: 1 2 3 1, 2, 3 is not equal to 1, 2, 3 1 2 3;\n  content: 1, 2, 3 1 2 3 is not equal to 1 2 3 1, 2, 3 too;\n  /**/\n  content: 1 2 3 1, 2, 3 4 is equal to 1 2 3 1, 2, 3 4;\n  content: 1 2 3 1, 2, 3 4 is equal to 1 2 3 1, 2, 3 4 too;\n}\n#tryNumberPx {\n  catch: all;\n  declare: 4;\n  declare: 4px;\n}\n.call-lock-mixin .call-inner-lock-mixin {\n  a: 1;\n  x: 1;\n}\n.mixin-generated-class {\n  a: 1;\n}\n#guarded-caller {\n  guarded: namespace;\n  silent: namespace;\n  guarded: with default;\n}\n#guarded-deeper {\n  should: match 1;\n}\n#parenthesisNot-true {\n  parenthesisNot: just-value;\n  parenthesisNot: negated twice 1;\n  parenthesisNot: negated twice 2;\n  parenthesisNot: negated twice 3;\n}\n#parenthesisNot-false {\n  parenthesisNot: negated once inside;\n  parenthesisNot: negated once outside;\n  parenthesisNot: negated once middle;\n}\n#orderOfEvaluation-false-false-true {\n  no-parenthesis: evaluated true 1a;\n  no-parenthesis: evaluated true 1b;\n  no-parenthesis: evaluated true 1d;\n  no-parenthesis: evaluated true 3;\n  no-parenthesis: evaluated true 4;\n  with-parenthesis: evaluated true;\n}\n#orderOfEvaluation-false-false-false {\n  no-parenthesis: evaluated true 2a;\n  no-parenthesis: evaluated true 2b;\n  no-parenthesis: evaluated true 2c;\n}\n#orderOfEvaluation-true-true-false {\n  no-parenthesis: evaluated true 1a;\n  no-parenthesis: evaluated true 1b;\n  no-parenthesis: evaluated true 1c;\n  no-parenthesis: evaluated true 1d;\n  no-parenthesis: evaluated true 1e;\n  no-parenthesis: evaluated true 2a;\n  no-parenthesis: evaluated true 2b;\n  no-parenthesis: evaluated true 2c;\n  no-parenthesis: evaluated true 4;\n  with-parenthesis: evaluated true;\n}\n.test-not-noparens1 {\n  content: \"not without parens true.\";\n}\n.test-not-noparens2 {\n  content: \"not without parens false.\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-guards/mixins-guards.less",
    "content": "// Stacking, functions..\n\n.light (@a) when (lightness(@a) > 50%) {\n  color: inherit;\n}\n.light (@a) when (lightness(@a) < 50%) {\n  color: black;\n}\n.light (@a) {\n  margin: 1px;\n}\n\n.light1 { .light(#ddd) }\n.light2 { .light(#444) }\n\n// Arguments against each other\n\n.max (@a, @b) when (@a > @b) {\n  width: @a;\n}\n.max (@a, @b) when (@a < @b) {\n  width: @b;\n}\n\n.max1 { .max(3, 6) }\n.max2 { .max(8, 1) }\n\n// Globals inside guards\n\n@g: auto;\n\n.glob (@a) when (@a = @g) {\n  margin: @a @g;\n}\n.glob1 { .glob(auto) }\n\n// Other operators\n\n.ops (@a) when (@a >= 0) {\n  height: gt-or-eq;\n}\n.ops (@a) when (@a =< 0) {\n  height: lt-or-eq;\n}\n.ops (@a) when (@a <= 0) {\n  height: lt-or-eq-alias;\n}\n.ops (@a) when not(@a = 0) {\n  height: not-eq;\n}\n.ops1 { .ops(0) }\n.ops2 { .ops(1) }\n.ops3 { .ops(-1) }\n\n// Scope and default values\n\n@a: auto;\n\n.default (@a: inherit) when (@a = inherit) {\n  content: default;\n}\n.default1 { .default() }\n\n// true & false keywords\n.test-rule (@a) when (@a) {\n    content: \"true.\";\n}\n.test-rule (@a) when not (@a) {\n    content: \"false.\";\n}\n\n.test-rule1 { .test-rule(true) }\n.test-rule2 { .test-rule(false) }\n.test-rule3 { .test-rule(1) }\n.test-rule4 { .test-rule(boo) }\n.test-rule5 { .test-rule(\"true\") }\n\n// Boolean expressions\n\n.bool () when (true) and (false)                             { content: true and false } // FALSE\n.bool () when (true) and (true)                              { content: true and true } // TRUE\n.bool () when (true)                                         { content: true } // TRUE\n.bool () when (false) and (false)                            { content: true } // FALSE\n.bool () when (false), (true)                                { content: false, true } // TRUE\n.bool () when (false) and (true) and (true),  (true)         { content: false and true and true, true } // TRUE\n.bool () when (true)  and (true) and (false), (false)        { content: true and true and false, false } // FALSE\n.bool () when (false), (true) and (true)                     { content: false, true and true } // TRUE\n.bool () when (false), (false), (true)                       { content: false, false, true } // TRUE\n.bool () when (false), (false) and (true), (false)           { content: false, false and true, false } // FALSE\n.bool () when (false), (true) and (true) and (true), (false) { content: false, true and true and true, false } // TRUE\n.bool () when not (false)                                    { content: not false }\n.bool () when not (true) and not (false)                     { content: not true and not false }\n.bool () when not (true) and not (true)                      { content: not true and not true }\n.bool () when not (false) and (false), not (false)           { content: not false and false, not false }\n\n.bool1 { .bool() }\n\n.equality-unit-test(@num) when (@num = 1%) {\n  test: fail;\n}\n.equality-unit-test(@num) when (@num = 2) {\n  test: pass;\n}\n.equality-units {\n  .equality-unit-test(1px);\n  .equality-unit-test(2px);\n}\n\n.colorguard(@col) when (@col = red)                         { content: is @col; }\n.colorguard(@col) when not (blue = @col)                    { content: is not blue its @col; }\n.colorguard(@col)                                           {}\n.colorguardtest {\n    .colorguard(red);\n    .colorguard(blue);\n    .colorguard(purple);\n}\n\n.stringguard(@str) when (@str = \"theme1\")\t\t\t\t\t{ content: @str is \"theme1\"; }\n.stringguard(@str) when not (\"theme2\" = @str)\t\t\t\t{ content: @str is not \"theme2\"; }\n.stringguard(@str) when (@str = 'theme1')\t\t\t\t\t{ content: @str is 'theme1'; }\n.stringguard(@str) when not ('theme2' = @str)\t\t\t\t{ content: @str is not 'theme2'; }\n.stringguard(@str) when (~\"theme1\" = @str)\t\t\t\t\t{ content: @str is theme1; }\n.stringguard(@str)                                          {}\n.stringguardtest {\n    .stringguard(\"theme1\");\n    .stringguard(\"theme2\");\n    .stringguard('theme1');\n    .stringguard('theme2');\n    .stringguard(theme1);\n}\n\n.generic(@a, @b) {/**/}\n.generic(@a, @b) when (@a = @b) {content: @a is equal to @b}\n.generic(@a, @b) when (@b = @a) {content: @b is equal to @a too}\n.generic(@a, @b) when (@a < @b) {content: @a is less than @b}\n.generic(@a, @b) when (@b < @a) {content: @b is less than @a too}\n.generic(@a, @b) when (@a > @b) {content: @a is greater than @b}\n.generic(@a, @b) when (@b > @a) {content: @b is greater than @a too}\n.generic(@a, @b) when not(@a = @b) {content: @a is not equal to @b}\n.generic(@a, @b) when not(@b = @a) {content: @b is not equal to @a too}\n\n.variouse-types-comparison {\n    .generic(true, false);\n    .generic(1, true);\n    .generic(2, 2px);\n    .generic(3, ~\"3\");\n    .generic(5, ~\"4\");\n    .generic(abc, ~\"abc\");\n    .generic(abc, \"abc\");\n    .generic('abc', \"abd\");\n    .generic(6, e(\"6\"));\n    .generic(9, 8);\n    .generic(a, b);\n    .generic(1 2, 3);\n}\n\n.list-comparison {\n    .generic(a b c, a b c);\n    .generic(a b c, a b d);\n    .generic(a, b, c; a, b, c);\n    .generic(a, b, c; a, b, d);\n    .generic(1 2px 300ms, 1em 2 .3s);\n    \n    @space-list: 1 2 3;\n    @comma-list: 1, 2, 3;\n    @compound: @space-list @comma-list;\n    \n    .generic(@space-list, @comma-list);\n    .generic(@comma-list, ~\"1, 2, 3\");\n    .generic(@compound, @space-list @comma-list);\n    .generic(@compound, @comma-list @space-list);\n    .generic(@compound 4, ~\"1 2 3 1, 2, 3 4\");\n}\n\n.mixin(...) {\n  catch:all;\n}\n.mixin(@var) when (@var=4) {\n  declare: 4;\n}\n.mixin(@var) when (@var=4px) {\n  declare: 4px;\n}\n#tryNumberPx {\n  .mixin(4px);\n}\n\n.lock-mixin(@a) {\n .inner-locked-mixin(@x: @a) when (@a = 1) {\n    a: @a;\n    x: @x;\n  }\n}\n.call-lock-mixin {\n  .lock-mixin(1);\n  .call-inner-lock-mixin {\n    .inner-locked-mixin();\n  }\n}\n.bug-100cm-1m(@a) when (@a = 1) {\n  .failed {\n    one-hundred: not-equal-to-1;\n  }\n}\n.bug-100cm-1m(100cm);\n\n#ns {\n    .mixin-for-root-usage(@a) when (@a > 0) {\n        .mixin-generated-class {\n            a: @a;\n        }\n    }\n}\n\n#ns > .mixin-for-root-usage(1);\n\n@namespaceGuard: 1;\n#guarded when (@namespaceGuard>0) {\n  #deeper {\n    .mixin() {\n      guarded: namespace;\n    }\n  }\n}\n#guarded() when (@namespaceGuard>0) {\n  #deeper {\n    .mixin() {\n      silent: namespace;\n    }\n  }\n}\n#guarded(@variable) when (@namespaceGuard>0) {\n  #deeper {\n    .mixin() {\n      should: not match because namespace argument;\n    }\n  }\n}\n#guarded(@variable: default) when (@namespaceGuard>0) {\n  #deeper {\n    .mixin() {\n      guarded: with default;\n    }\n  }\n}\n#guarded when (@namespaceGuard<0) {\n  #deeper {\n    .mixin() {\n      should: not match because namespace guard;\n    }\n  }\n}\n#guarded-caller {\n  #guarded > #deeper > .mixin();\n}\n#top {\n  #deeper when (@namespaceGuard<0) {\n    .mixin(@a) {\n      should: not match because namespace guard;\n    }\n  }\n  #deeper() when (@namespaceGuard>0) {\n    .mixin(@a) {\n      should: match @a;\n    }\n  }\n}\n#guarded-deeper {\n  #top > #deeper > .mixin(1);\n}\n\n// namespaced & guarded mixin in root\n// outputs nothing but should pass:\n\n@guarded-mixin-for-root: true;\n#ns {\n    .guarded-mixin-for-root() when (@guarded-mixin-for-root) {}\n}\n#ns > .guarded-mixin-for-root();\n// various combinations of nested or, and, parenthesis and negation\n.parenthesisNot(@value) when ((((@value)))) {\n  parenthesisNot: just-value;\n}\n.parenthesisNot(@value) when (((not(@value)))) {\n  parenthesisNot: negated once inside;\n}\n.parenthesisNot(@value) when not((((@value)))) {\n  parenthesisNot: negated once outside;\n}\n.parenthesisNot(@value) when ((not((@value)))) {\n  parenthesisNot: negated once middle;\n}\n.parenthesisNot(@value) when not(((not(@value)))) {\n  parenthesisNot: negated twice 1;\n}\n.parenthesisNot(@value) when (not((not(@value)))) {\n  parenthesisNot: negated twice 2;\n}\n.parenthesisNot(@value) when ((not(not(@value)))) {\n  parenthesisNot: negated twice 3;\n}\n.parenthesisNot (...) when (default()) {\n  parenthesisNot: none matched;\n}\n\n#parenthesisNot-true {\n  .parenthesisNot(true);\n}\n#parenthesisNot-false {\n  .parenthesisNot(false);\n}\n\n.orderOfEvaluation(@a1, @a2, @a3) when ((@a1) and (@a2) or (@a3)) {\n  no-parenthesis: evaluated true 1a;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when ((@a3) or (@a1) and (@a2)) {\n  no-parenthesis: evaluated true 1b;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when ((@a1) and ((@a2) or (@a3))) {\n  no-parenthesis: evaluated true 1c;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when (@a3), (@a1) and (@a2) {\n  no-parenthesis: evaluated true 1d;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when (((@a3) or (@a1)) and (@a2)) {\n  no-parenthesis: evaluated true 1e;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when ((@a1) and (@a2) or not (@a3)) {\n  no-parenthesis: evaluated true 2a;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when (not (@a3) or (@a1) and (@a2)) {\n  no-parenthesis: evaluated true 2b;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when not (@a3), (@a1) and (@a2) {\n  no-parenthesis: evaluated true 2c;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when (not (@a1) and (@a2) or (@a3)) {\n  no-parenthesis: evaluated true 3;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when ((((@a1) and (@a2) or (@a3)))) {\n  no-parenthesis: evaluated true 4;\n}\n.orderOfEvaluation(@a1, @a2, @a3) when (((@a1) and (@a2)) or (@a3)) {\n  with-parenthesis: evaluated true;\n}\n.orderOfEvaluation(...) when (default()) {\n  orderOfEvaluation: evaluated false;\n}\n#orderOfEvaluation-false-false-true {\n  .orderOfEvaluation(false, false, true);\n}\n#orderOfEvaluation-false-false-false {\n  .orderOfEvaluation(false, false, false);\n}\n#orderOfEvaluation-true-true-false {\n  .orderOfEvaluation(true, true, false);\n}\n\n// not without parentheses should work the same as not with parentheses\n.test-not-noparens (@a) when not @a {\n    content: \"not without parens false.\";\n}\n.test-not-noparens (@a) when (@a) {\n    content: \"not without parens true.\";\n}\n\n.test-not-noparens1 { .test-not-noparens(true) }\n.test-not-noparens2 { .test-not-noparens(false) }\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-guards-default-func/mixins-guards-default-func.css",
    "content": "guard-default-basic-1-1 {\n  case: 1;\n}\nguard-default-basic-1-2 {\n  default: 2;\n}\nguard-default-basic-2-0 {\n  default: 0;\n}\nguard-default-basic-2-2 {\n  case: 2;\n}\nguard-default-basic-3-0 {\n  default: 0;\n}\nguard-default-basic-3-2 {\n  case: 2;\n}\nguard-default-basic-3-3 {\n  case: 3;\n}\nguard-default-definition-order-0 {\n  default: 0;\n}\nguard-default-definition-order-2 {\n  case: 2;\n}\nguard-default-definition-order-2 {\n  case: 3;\n}\nguard-default-out-of-guard-0 {\n  case-0: default();\n  case-1: 1;\n  default: 2;\n  case-2: default();\n}\nguard-default-out-of-guard-1 {\n  default: default();\n}\nguard-default-out-of-guard-2 {\n  default: default();\n}\nguard-default-expr-not-1 {\n  case: 1;\n  default: 1;\n}\nguard-default-expr-eq-true {\n  case: true;\n}\nguard-default-expr-eq-false {\n  case: false;\n  default: false;\n}\nguard-default-expr-or-1 {\n  case: 1;\n}\nguard-default-expr-or-2 {\n  case: 2;\n  default: 2;\n}\nguard-default-expr-or-3 {\n  default: 3;\n}\nguard-default-expr-and-1 {\n  case: 1;\n}\nguard-default-expr-and-2 {\n  case: 2;\n}\nguard-default-expr-and-3 {\n  default: 3;\n}\nguard-default-expr-always-1 {\n  case: 1;\n  default: 1;\n}\nguard-default-expr-always-2 {\n  default: 2;\n}\nguard-default-expr-never-1 {\n  case: 1;\n}\nguard-default-multi-1-0 {\n  case: 0;\n}\nguard-default-multi-1-1 {\n  default-1: 1;\n}\nguard-default-multi-2-1 {\n  default-1: no;\n}\nguard-default-multi-2-2 {\n  default-2: no;\n}\nguard-default-multi-2-3 {\n  default-3: 3;\n}\nguard-default-multi-3-blue {\n  case-2: darkblue;\n}\nguard-default-multi-3-green {\n  default-color: green;\n}\nguard-default-multi-3-foo {\n  case-1: I am 'foo';\n}\nguard-default-multi-3-baz {\n  default-string: I am 'baz';\n}\nguard-default-multi-4 {\n  always: 1;\n  always: 2;\n  case: 2;\n}\nguard-default-not-ambiguous-2 {\n  case: 1;\n  not-default: 2;\n}\nguard-default-not-ambiguous-3 {\n  case: 1;\n  not-default-1: 2;\n  not-default-2: 2;\n}\nguard-default-scopes-3 {\n  three: when default;\n}\nguard-default-scopes-1 {\n  one: no condition;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-guards-default-func/mixins-guards-default-func.less",
    "content": "// basics:\n\nguard-default-basic-1 {\n    .m(1)                   {case:     1}\n    .m(@x) when (default()) {default: @x}\n\n    &-1 {.m(1)}\n    &-2 {.m(2)}\n}\n\nguard-default-basic-2 {\n    .m(1)                   {case:     1}\n    .m(2)                   {case:     2}\n    .m(3)                   {case:     3}\n    .m(@x) when (default()) {default: @x}\n\n    &-0 {.m(0)}\n    &-2 {.m(2)}\n}\n\nguard-default-basic-3 {\n    .m(@x) when (@x = 1)    {case:     1}\n    .m(2)                   {case:     2}\n    .m(@x) when (@x = 3)    {case:     3}\n    .m(@x) when (default()) {default: @x}\n\n    &-0 {.m(0)}\n    &-2 {.m(2)}\n    &-3 {.m(3)}\n}\n\nguard-default-definition-order {\n    .m(@x) when (default()) {default: @x}\n    .m(@x) when (@x = 1)    {case:     1}\n    .m(2)                   {case:     2}\n    .m(@x) when (@x = 3)    {case:     3}\n\n    &-0 {.m(0)}\n    &-2 {.m(2)}\n    &-2 {.m(3)}\n}\n\n// out of guard:\n\nguard-default-out-of-guard {\n    .m(1)                              {case-1:   1}\n    .m(@x: default()) when (default()) {default: @x}\n\n    &-0 {\n        case-0: default();\n        .m(1);\n        .m(2);\n        case-2: default();\n    }\n    &-1 {.m(default())}\n    &-2 {.m()}\n}\n\n// expressions:\n\nguard-default-expr-not {\n    .m(1)                      {case:     1}\n    .m(@x) when not(default()) {default: @x}\n\n    &-1 {.m(1)}\n    &-2 {.m(2)}\n}\n\nguard-default-expr-eq {\n    .m(@x) when (@x = true)      {case:    @x}\n    .m(@x) when (@x = false)     {case:    @x}\n    .m(@x) when (@x = default()) {default: @x}\n\n    &-true  {.m(true)}\n    &-false {.m(false)}\n}\n\nguard-default-expr-or {\n    .m(1)                             {case:     1}\n    .m(2)                             {case:     2}\n    .m(@x) when (default()), (@x = 2) {default: @x}\n\n    &-1 {.m(1)}\n    &-2 {.m(2)}\n    &-3 {.m(3)}\n}\n\nguard-default-expr-and {\n    .m(1)                                {case:     1}\n    .m(2)                                {case:     2}\n    .m(@x) when (default()) and (@x = 3) {default: @x}\n\n    &-1 {.m(1)}\n    &-2 {.m(2)}\n    &-3 {.m(3)}\n    &-4 {.m(4)}\n}\n\nguard-default-expr-always {\n    .m(1)                                   {case:     1}\n    .m(@x) when (default()), not(default()) {default: @x} // always match\n\n    &-1 {.m(1)}\n    &-2 {.m(2)}\n}\n\nguard-default-expr-never {\n    .m(1)                                      {case:     1}\n    .m(@x) when (default()) and not(default()) {default: @x} // never match\n\n    &-1 {.m(1)}\n    &-2 {.m(2)}\n}\n\n\n// not conflicting multiple default() uses:\n\nguard-default-multi-1 {\n    .m(0)                   {case:       0}\n    .m(@x) when (default()) {default-1: @x}\n    .m(2)  when (default()) {default-2: @x}\n\n    &-0 {.m(0)}\n    &-1 {.m(1)}\n}\n\nguard-default-multi-2 {\n    .m(1, @x)   when (default()) {default-1: @x}\n    .m(2, @x)   when (default()) {default-2: @x}\n    .m(@x, yes) when (default()) {default-3: @x}\n\n    &-1 {.m(1, no)}\n    &-2 {.m(2, no)}\n    &-3 {.m(3, yes)}\n}\n\nguard-default-multi-3 {\n    .m(red)                                    {case-1: darkred}\n    .m(blue)                                   {case-2: darkblue}\n    .m(@x) when (iscolor(@x)) and (default())  {default-color: @x}\n    .m('foo')                                  {case-1: I am 'foo'}\n    .m('bar')                                  {case-2: I am 'bar'}\n    .m(@x) when (isstring(@x)) and (default()) {default-string: I am @x}\n\n    &-blue  {.m(blue)}\n    &-green {.m(green)}\n    &-foo   {.m('foo')}\n    &-baz   {.m('baz')}\n}\n\nguard-default-multi-4 {\n    .m(@x) when (default()), not(default())    {always: @x}\n    .m(@x) when (default()) and not(default()) {never:  @x}\n    .m(2)                                      {case:    2}\n\n    .m(1);\n    .m(2);\n}\n\nguard-default-not-ambiguous-2 {\n    .m(@x)                     {case:         1}\n    .m(@x) when (default())    {default:     @x}\n    .m(@x) when not(default()) {not-default: @x}\n\n    .m(2);\n}\n\nguard-default-not-ambiguous-3 {\n    .m(@x)                     {case:           1}\n    .m(@x) when not(default()) {not-default-1: @x}\n    .m(@x) when not(default()) {not-default-2: @x}\n\n    .m(2);\n}\n\n// default & scope\n\nguard-default-scopes {\n    .s1() {.m(@v)                  {one: no condition}}\n    .s2() {.m(@v) when (@v)        {two: when true}}\n    .s3() {.m(@v) when (default()) {three: when default}}\n\n    &-3 {\n        .s2();\n        .s3();\n        .m(false);\n    }\n\n    &-1 {\n        .s1();\n        .s3();\n        .m(false);\n    }\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-important/mixins-important.css",
    "content": ".class {\n  border: 1;\n  boxer: 1;\n  border-width: 1;\n  border: 2 !important;\n  boxer: 2 !important;\n  border-width: 2 !important;\n  border: 3;\n  boxer: 3;\n  border-width: 3;\n  border: 4 !important;\n  boxer: 4 !important;\n  border-width: 4 !important;\n  border: 5;\n  boxer: 5;\n  border-width: 5;\n  border: 0 !important;\n  boxer: 0 !important;\n  border-width: 0 !important;\n  border: 9 !important;\n  border: 9;\n  boxer: 9;\n  border-width: 9;\n}\n.class .inner {\n  test: 1;\n}\n.class .inner {\n  test: 2 !important;\n}\n.class .inner {\n  test: 3;\n}\n.class .inner {\n  test: 4 !important;\n}\n.class .inner {\n  test: 5;\n}\n.class .inner {\n  test: 0 !important;\n}\n.class .inner {\n  test: 9;\n}\n.when-calling-nested-issue-2394 {\n  width: auto !important;\n}\n.when-calling-nested-with-param-issue-2394 {\n  width: 10px !important;\n}\n.class1-2421 {\n  margin: 5px !important;\n}\n.class2-2421 {\n  margin: 5px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-important/mixins-important.less",
    "content": ".submixin(@a) {\n  border-width: @a;\n}\n.mixin (9) {\n  border: 9 !important;\n}\n.mixin (@a: 0) {\n  border: @a;\n  boxer: @a;\n  .inner {\n    test: @a;\n  }\n  // comment\n  .submixin(@a);\n}\n\n.class {\n  .mixin(1);\n  .mixin(2) !important;\n  .mixin(3);\n  .mixin(4) !important;\n  .mixin(5);\n  .mixin() !important;\n  .mixin(9);\n}\n.size(@aaa: auto) {\n  .set-width(@aaa) {\n    width: @aaa;\n  }\n  .set-width(@aaa);\n}\n.when-calling-nested-issue-2394 {\n  .size() !important;\n}\n.when-calling-nested-with-param-issue-2394 {\n  .size(10px) !important;\n}\n.test-ruleMixin-2421 () {\n    .topCheck-2421 () {\n        .nestedCheck-2421() {\n            margin: 5px;\n        }\n        .nestedCheck-2421();\n    }\n    .topCheck-2421();\n}\n.class1-2421 {\n    .test-ruleMixin-2421() !important;\n}\n.class2-2421 {\n    .test-ruleMixin-2421();\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-interpolated/mixins-interpolated.css",
    "content": ".\\123 {\n  a: 0;\n}\n.foo {\n  a: 1;\n}\n.foo {\n  a: 2;\n}\n#foo {\n  a: 3;\n}\n#foo {\n  a: 4;\n}\nmi-test-a {\n  a: 0;\n  a: 1;\n  a: 2;\n  a: 3;\n  a: 4;\n}\n.b .bb.foo-xxx .yyy-foo#foo .foo.bbb {\n  b: 1;\n}\nmi-test-b {\n  b: 1;\n}\n#foo-foo > .bar .baz {\n  c: c;\n}\nmi-test-c-1 > .bar .baz {\n  c: c;\n}\nmi-test-c-2 .baz {\n  c: c;\n}\nmi-test-c-3 {\n  c: c;\n}\nmi-test-d {\n  gender: \"Male\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-interpolated/mixins-interpolated.less",
    "content": "@a0: \\123;\n@a1: foo;\n@a2: ~\".foo\";\n@a4: ~\"#foo\";\n\n.@{a0} {\n    a: 0;\n}\n\n.@{a1} {\n    a: 1;\n}\n\n@{a2} {\n    a: 2;\n}\n\n#@{a1} {\n    a: 3;\n}\n\n@{a4} {\n    a: 4;\n}\n\nmi-test-a {\n    .\\123();\n    .foo();\n    #foo();\n}\n\n.b .bb {\n    &.@{a1}-xxx .yyy-@{a1}@{a4} {\n        & @{a2}.bbb {\n            b: 1;\n        }\n    }\n}\n\nmi-test-b {\n    .b.bb.foo-xxx.yyy-foo#foo.foo.bbb();\n}\n\n@c1: @a1;\n@c2: bar;\n@c3: baz;\n\n#@{c1}-foo {\n    > .@{c2} {\n        .@{c3} {\n            c: c;\n        }\n    }\n}\n\nmi-test-c {\n    &-1 {#foo-foo();}\n    &-2 {#foo-foo > .bar();}\n    &-3 {#foo-foo > .bar.baz();}\n}\n\n.Person(@name, @gender_) {\n    .@{name} {\n        @gender: @gender_;\n        .sayGender() {\n            gender: @gender;\n        }\n    }\n}\n\nmi-test-d {\n    .Person(person, \"Male\");\n    .person.sayGender();\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-named-args/mixins-named-args.css",
    "content": ".named-arg {\n  color: blue;\n  width: 5px;\n  height: 99%;\n  args: 1px 100%;\n  text-align: center;\n}\n.class {\n  width: 5px;\n  height: 19%;\n  args: 1px 20%;\n}\n.all-args-wrong-args {\n  width: 10px;\n  height: 9%;\n  args: 2px 10%;\n}\n.named-args2 {\n  width: 15px;\n  height: 49%;\n  color: #646464;\n}\n.named-args3 {\n  width: 5px;\n  height: 29%;\n  color: #123456;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-named-args/mixins-named-args.less",
    "content": ".mixin (@a: 1px, @b: 50%) {\n  width: (@a * 5);\n  height: (@b - 1%);\n  args: @arguments;\n}\n.mixin (@a: 1px, @b: 50%) when (@b > 75%){\n  text-align: center;\n}\n\n.named-arg {\n  color: blue;\n  .mixin(@b: 100%);\n}\n\n.class {\n  @var: 20%;\n  .mixin(@b: @var);\n}\n\n.all-args-wrong-args {\n  .mixin(@b: 10%, @a: 2px);\n}\n\n.mixin2 (@a: 1px, @b: 50%, @c: 50) {\n  width: (@a * 5);\n  height: (@b - 1%);\n  color: (#000000 + @c);\n}\n\n.named-args2 {\n  .mixin2(3px, @c: 100);\n}\n\n.named-args3 {\n  .mixin2(@b: 30%, @c: #123456);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-nested/mixins-nested.css",
    "content": ".class .inner {\n  height: 300;\n}\n.class .inner .innest {\n  width: 30;\n  border-width: 60;\n}\n.class2 .inner {\n  height: 600;\n}\n.class2 .inner .innest {\n  width: 60;\n  border-width: 120;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-nested/mixins-nested.less",
    "content": ".mix-inner (@var) {\n  border-width: @var;\n}\n\n.mix (@a: 10) {\n  .inner {\n    height: (@a * 10);\n\n    .innest {\n      width: @a;\n      .mix-inner((@a * 2));\n    }\n  }\n}\n\n.class {\n  .mix(30);\n}\n\n.class2 {\n  .mix(60);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-pattern/mixins-pattern.css",
    "content": ".zero {\n  variadic: true;\n  named-variadic: true;\n  zero: 0;\n  one: 1;\n  two: 2;\n  three: 3;\n}\n.one {\n  variadic: true;\n  named-variadic: true;\n  one: 1;\n  one-req: 1;\n  two: 2;\n  three: 3;\n}\n.two {\n  variadic: true;\n  named-variadic: true;\n  two: 2;\n  three: 3;\n}\n.three {\n  variadic: true;\n  named-variadic: true;\n  three-req: 3;\n  three: 3;\n}\n.left {\n  left: 1;\n}\n.right {\n  right: 1;\n}\n.border-right {\n  color: black;\n  border-right: 4px;\n}\n.border-left {\n  color: black;\n  border-left: 4px;\n}\n.only-right {\n  right: 33;\n}\n.only-left {\n  left: 33;\n}\n.left-right {\n  both: 330;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/mixins-pattern/mixins-pattern.less",
    "content": ".mixin (...) {\n  variadic: true;\n}\n.mixin (@a...) {\n  named-variadic: true;\n}\n.mixin () {\n    zero: 0;\n}\n.mixin (@a: 1px) {\n    one: 1;\n}\n.mixin (@a) {\n    one-req: 1;\n}\n.mixin (@a: 1px, @b: 2px) {\n    two: 2;\n}\n\n.mixin (@a, @b, @c) {\n    three-req: 3;\n}\n\n.mixin (@a: 1px, @b: 2px, @c: 3px) {\n    three: 3;\n}\n\n.zero {\n    .mixin();\n}\n\n.one {\n    .mixin(1);\n}\n\n.two {\n    .mixin(1, 2);\n}\n\n.three {\n    .mixin(1, 2, 3);\n}\n\n//\n\n.mixout ('left') {\n    left: 1;\n}\n\n.mixout ('right') {\n    right: 1;\n}\n\n.left {\n    .mixout('left');\n}\n.right {\n    .mixout('right');\n}\n\n//\n\n.border (@side, @width) {\n    color: black;\n    .border-side(@side, @width);\n}\n.border-side (left, @w) {\n    border-left: @w;\n}\n.border-side (right, @w) {\n    border-right: @w;\n}\n\n.border-right {\n    .border(right, 4px);\n}\n.border-left {\n    .border(left, 4px);\n}\n\n//\n\n\n.border-radius (@r) {\n    both: (@r * 10);\n}\n.border-radius (@r, left) {\n    left: @r;\n}\n.border-radius (@r, right) {\n    right: @r;\n}\n\n.only-right {\n    .border-radius(33, right);\n}\n.only-left {\n    .border-radius(33, left);\n}\n.left-right {\n    .border-radius(33);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/namespace-targeted/namespace-targeted.css",
    "content": "#namespace {\n  my-prop: prop-value;\n}\n.test-prop-interp {\n  value: prop-value;\n}\n#namespace-with-prop {\n  existing-prop: value;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/namespace-targeted/namespace-targeted.less",
    "content": "// Targeted tests for specific uncovered lines in namespace-value.js\n\n// Lines 51-52: $@var interpolation (property interpolation with variable)\n// This tests: name.substring(0, 2) === '$@'\n// The syntax is #namespace[$@var-name] where @var-name contains the property name\n@prop-name: my-prop;\n#namespace {\n  my-prop: prop-value;\n}\n.test-prop-interp {\n  value: #namespace[$@prop-name];\n}\n\n// Lines 43-47: Variable not found error path\n// Access a variable that doesn't exist in the namespace\n#namespace-with-var {\n  @existing-var: value;\n}\n.test-var-not-found {\n  // This will error: variable @nonexistent-var not found\n  // color: #namespace-with-var[@nonexistent-var];\n}\n\n// Lines 61-65: Property not found error path\n// Access a property that doesn't exist in the namespace\n#namespace-with-prop {\n  existing-prop: value;\n}\n.test-prop-not-found {\n  // This will error: property \"nonexistent-prop\" not found\n  // value: #namespace-with-prop[$nonexistent-prop];\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/nesting/nesting.css",
    "content": ".nesting-parent {\n  color: red;\n}\n.nesting-parent .nesting-child {\n  color: blue;\n}\n.nesting-parent .nesting-child .nesting-grandchild {\n  color: green;\n}\n.nesting-parent:hover {\n  color: orange;\n}\n.nesting-parent.modifier {\n  color: purple;\n}\n.correctly-exit-calc-mode h2 {\n  width: 10px;\n}\n.correctly-exit-calc-mode div {\n  width: calc(100px * 2);\n}\n.correctly-exit-calc-mode h1 {\n  color: white;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/nesting/nesting.less",
    "content": ".nesting-parent {\n  color: red;\n  \n  .nesting-child {\n    color: blue;\n    \n    .nesting-grandchild {\n      color: green;\n    }\n  }\n  \n  &:hover {\n    color: orange;\n  }\n  \n  &.modifier {\n    color: purple;\n  }\n}\n\n.correctly-exit-calc-mode {\n    @a: 10;\n    h2 { width: unit(@a, px); }\n\n    div { width: calc(100px * 2); }\n\n    .mk-map() {\n        text: white;\n        background: black;\n    }\n\n    @p: .mk-map();\n\n    h1 { color: @p[text]; }\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/no-output/no-output.css",
    "content": ""
  },
  {
    "path": "packages/test-data/tests-unit/no-output/no-output.less",
    "content": ".mixin() {\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/operations/operations-advanced.css",
    "content": ".test-math-off {\n  result: 15px;\n}\n.test-dim-to-color {\n  result: #ff0a0a;\n}\n.test-color-to-dim {\n  result: #ff0a0a;\n}\n.test-division {\n  result: 10px / 2 * 2;\n}\n.test-nested {\n  result: 30px;\n}\n.test-spaced {\n  result: 15px;\n}\n.test-non-spaced {\n  result: 15px;\n}\n.test-div {\n  result: 10px / 2;\n}\n.test-op-operands {\n  result: 150px;\n}\n.test-math-context {\n  add: 15;\n  sub: 5;\n  mul: 50;\n  div: 10 / 5;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/operations/operations-advanced.less",
    "content": "// Advanced operation tests to cover edge cases\n\n// Operations with math off\n@math-off: true;\n.test-math-off {\n  @a: 10px;\n  @b: 5px;\n  result: @a + @b;\n}\n\n// Operations with Dimension to Color conversion\n@dimension: 10px;\n@color: #ff0000;\n.test-dim-to-color {\n  // This should convert dimension to color for operation\n  result: @dimension + @color;\n}\n\n// Operations with Color to Dimension conversion\n.test-color-to-dim {\n  result: @color + @dimension;\n}\n\n// Operations with division and PARENS_DIVISION math mode\n@div-op: (10px / 2);\n.test-division {\n  result: @div-op * 2;\n}\n\n// Operations with nested operations\n@nested: (10px + 5px) * 2;\n.test-nested {\n  result: @nested;\n}\n\n// Operations with spaced operators\n@spaced: 10px + 5px;\n.test-spaced {\n  result: @spaced;\n}\n\n// Operations with non-spaced operators\n@non-spaced: 10px+5px;\n.test-non-spaced {\n  result: @non-spaced;\n}\n\n// Operations with division operator\n@div-op: 10px / 2;\n.test-div {\n  result: @div-op;\n}\n\n// Operations with invalid types (should error, but test the path)\n.test-invalid {\n  // This will error, but tests the error path\n  // result: \"string\" + 10px;\n}\n\n// Operations with Operation operands\n@op1: 10px + 5px;\n@op2: 20px - 10px;\n.test-op-operands {\n  result: @op1 * @op2;\n}\n\n// Operations with math context\n.test-math-context {\n  @a: 10;\n  @b: 5;\n  add: @a + @b;\n  sub: @a - @b;\n  mul: @a * @b;\n  div: @a / @b;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/operations/operations.css",
    "content": "#operations {\n  color: #111111;\n  color-2: #f8f800;\n  height: 9px;\n  width: 3em;\n  subtraction: 0;\n  division: 1;\n}\n#operations .spacing {\n  height: 9px;\n  width: 3em;\n}\n.with-variables {\n  height: 16em;\n  width: 24em;\n  size: 1cm;\n}\n.with-functions {\n  color: #646464;\n  color: #ff8080;\n  color: #c94a4a;\n}\n.negative {\n  height: 0px;\n  width: 4px;\n}\n.shorthands {\n  padding: -1px 2px 0 -4px;\n}\n.rem-dimensions {\n  font-size: 5.5rem;\n}\n.colors {\n  color: #123;\n  border-color: #334455;\n  background-color: #000000;\n}\n.colors .other {\n  color: #222222;\n  border-color: #222222;\n}\n.negations {\n  variable: -4px;\n  variable1: 0px;\n  variable2: 0px;\n  variable3: 8px;\n  variable4: 0px;\n  paren: -4px;\n  paren2: 16px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/operations/operations.less",
    "content": "// Mathematical operations tests\n#operations {\n  color: (#110000 + #000011 + #001100); // #111111\n  color-2: (yellow - #070707);\n  height: (10px / 2px + 6px - 1px * 2); // 9px\n  width: (2 * 4 - 5em); // 3em\n  .spacing {\n    height: (10px / 2px+6px-1px*2);\n    width: (2  * 4-5em);\n  }\n  subtraction: (20 - 10 - 5 - 5); // 0\n  division: (20 / 5 / 4); // 1\n}\n\n@x: 4;\n@y: 12em;\n\n.with-variables {\n  height: (@x + @y); // 16em\n  width: (12 + @y); // 24em\n  size: (5cm - @x); // 1cm\n}\n\n.with-functions {\n  color: (rgb(200, 200, 200) / 2);\n  color: (2 * hsl(0, 50%, 50%));\n  color: (rgb(10, 10, 10) + hsl(0, 50%, 50%));\n}\n\n@z: -2;\n\n.negative {\n  height: (2px + @z); // 0px\n  width: (2px - @z); // 4px\n}\n\n.shorthands {\n  padding: -1px 2px 0 -4px; //\n}\n\n.rem-dimensions {\n  font-size: (20rem / 5 + 1.5rem); // 5.5rem\n}\n\n.colors {\n  color: #123; // #112233\n  border-color: (#234 + #111111); // #334455\n  background-color: (#222222 - #fff); // #000000\n  .other {\n    color: (2 * #111); // #222222\n    border-color: (#333333 / 3 + #111); // #222222\n  }\n}\n\n.negations {\n    @var: 4px;\n    variable: (-@var); // 4\n    variable1: (-@var + @var); // 0\n    variable2: (@var + -@var); // 0\n    variable3: (@var - -@var); // 8\n    variable4: (-@var - -@var); // 0\n    paren: (-(@var)); // -4px\n    paren2: (-(2 + 2) * -@var); // 16\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/parse-interpolation/parse-interpolation.css",
    "content": "input[type=text]:focus,\ninput[type=email]:focus,\ninput[type=password]:focus,\ntextarea:focus {\n  foo: bar;\n}\n.a + .z,\n.b + .z,\n.c + .z {\n  color: blue;\n}\n.bar .d.a,\n.bar .b,\n.c.bar:hover,\n.bar baz {\n  color: blue;\n}\n.a + .e,\n.b.c + .e,\n.d + .e {\n  foo: bar;\n}\ninput[class=\"text\"],\ninput.text {\n  background: red;\n}\n.master-page-1 .selector-1,\n.master-page-1 .selector-2 {\n  background-color: red;\n}\n.fruit-apple,\n.fruit-satsuma,\n.fruit-banana,\n.fruit-pear {\n  content: \"Just a test.\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/parse-interpolation/parse-interpolation.less",
    "content": "// Parse interpolation tests\n@inputs: input[type=text], input[type=email], input[type=password], textarea;\n\n@{inputs} {\n  &:focus {\n    foo: bar;\n  }\n} \n\n@classes: .a, .b, .c;\n\n@{classes} {  \n  + .z {\n    color: blue; \n  }\n}\n\n.bar {\n  .d@{classes}&:hover, baz {\n    color: blue;\n  }\n}\n\n@c: ~'.a, .b';\n@d: ~'.c, .d';\n@e: ~' + .e';\n\n@{c}@{d} {\n  @{e} {\n    foo: bar;\n  }\n}\n\n@textClasses: ~'&[class=\"text\"], &.text';\n\ninput {\n  @{textClasses} {\n    background: red;\n  }\n}\n\n@my-selector: ~'.selector-1, .selector-2';\n.master-page-1 {\n    @{my-selector} {\n        background-color: red;\n    }\n}\n\n@list: apple, satsuma, banana, pear;\n@{list} {\n  .fruit-& {\n    content: \"Just a test.\";\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/parser-property-interp/parser-property-interp.css",
    "content": ".test {\n  prop-name: color;\n  my: background;\n  value: width;\n  color: red;\n  border-color-width: 2px;\n  *-z-color: 1px dashed blue;\n  background-color-width: green;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/parser-property-interp/parser-property-interp.less",
    "content": "// Test for ruleProperty parser with ${prop} interpolation (line 2640)\n// This tests complex property names using ${property} interpolation in property NAMES\n// ${prop} uses the VALUE of a plain property (not a variable) as the property name\n// Note: This is different from @{var} which uses variables\n\n.test {\n  // Define properties - their VALUES will be used as property names\n  prop-name: color;\n  my: background;\n  value: width;\n  \n  // Simple ${prop} interpolation in property name (ruleProperty parser line 2640)\n  // ${prop-name} uses the value of prop-name (\"color\") as the property name\n  // This triggers the branch at line 2640: new(tree.Property)(`$${s.slice(2, -1)}`, ...)\n  ${prop-name}: red;\n  \n  // Multiple interpolations with literal parts\n  // border-${prop-name} becomes \"border-color\" (since prop-name's value is \"color\")\n  border-${prop-name}-width: 2px;\n  \n  // Complex property name with ${prop}\n  *-z-${prop-name}: 1px dashed blue;\n  \n  // Multiple ${prop} in same property name\n  // ${my}-${prop-name}-${value} becomes \"background-color-width\"\n  ${my}-${prop-name}-${value}: green;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/parser-slashed-combinator/parser-slashed-combinator.css",
    "content": ".parent /deep/ .child {\n  color: red;\n}\n.container /shadow/ .content {\n  background: blue;\n}\n.wrapper /deep/ .inner /deep/ .deepest {\n  padding: 10px;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/parser-slashed-combinator/parser-slashed-combinator.less",
    "content": "// Test for slashedCombinator parser (lines 1392-1399)\n// This tests /deep/ and /shadow/ combinators\n// NOTE: These combinators are DEPRECATED in CSS and should not be used in new code\n// They were part of the Shadow DOM specification but have been removed\n\n// /deep/ combinator (deprecated)\n.parent /deep/ .child {\n  color: red;\n}\n\n// /shadow/ combinator (deprecated)\n.container /shadow/ .content {\n  background: blue;\n}\n\n// Test with nested selectors\n.wrapper /deep/ .inner /deep/ .deepest {\n  padding: 10px;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/permissive-parse/permissive-parse.css",
    "content": "@-moz-document regexp(\"(\\d{0,15})\") {\n  a {\n    color: red;\n  }\n}\n.custom-property {\n  --this: () => {\n    basically anything until final semi-colon;\n    even other stuff; // i\\'m serious;\n  };\n  --that: () => {\n    basically anything until final semi-colon;\n    even other stuff; // i\\'m serious;\n  };\n  --custom-color: #ff3333 #ff3333;\n  custom-color: #ff3333 #ff3333;\n}\n.var {\n  --fortran: read (*, *, iostat=1) radius, height;\n}\n@-moz-whatever (foo: \"(\" bam \")\") {\n  bar: foo;\n}\n#selector,\n.bar,\nfoo[attr=\"blah\"] {\n  bar: value;\n}\n@media (min-width: 640px) {\n  .holy-crap {\n    this: works;\n  }\n}\n@media (min-width: 640px) {\n  .with-curly {\n    this: works;\n  }\n}\n.test-rule-comment {\n  --value: a /* { ; } */;\n  --comment-within: ( /* okay?; comment; */ );\n}\n.test-no-trailing-semicolon {\n  --value: foo;\n}\n.test-no-trailing-semicolon2 {\n  --value: foo;\n}\n.test-no-trailing-semicolon3 {\n  --value: foo;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/permissive-parse/permissive-parse.less",
    "content": "@function-name: regexp;\n@d-value: 15;\n@-moz-document @function-name(\"(\\d{0,@{d-value}})\") {\n\ta {\n\t\tcolor: red;\n\t}\n}\n\n.custom-property {\n  --this: () => {\n    basically anything until final semi-colon;\n    even other stuff; // i\\'m serious;\n  };\n  @this: () => {\n    basically anything until final semi-colon;\n    even other stuff; // i\\'m serious;\n  };\n  --that: @this;\n  @red: lighten(red, 10%);\n  --custom-color: @red lighten(red, 10%);\n  custom-color: $--custom-color;\n}\n\n@iostat: 1;\n.var {\n  --fortran: read (*, *, iostat=@iostat) radius, height;\n}\n\n@boom-boom: bam;\n@-moz-whatever (foo: \"(\" @boom-boom \")\") {\n  bar: foo;\n}\n\n@selectorList: #selector, .bar, foo[attr=\"blah\"];\n@{selectorList} {\n  bar: value;\n}\n\n@size: 640px;\n@tablet: (min-width: @size);\n@media @tablet {\n  .holy-crap {\n    this: works;\n  }\n}\n@tablet: (min-width: @{size});\n@media @tablet {\n  .with-curly {\n    this: works;\n  }\n}\n// @todo - fix comment absorption after property\n.test-rule-comment {\n  --value: a/* { ; } */;\n  --comment-within: ( /* okay?; comment; */ );\n}\n.test-no-trailing-semicolon {\n  --value: foo\n}\n.test-no-trailing-semicolon2 {--value: foo}\n.test-no-trailing-semicolon3 { --value: foo }\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/plugi/plugi.css",
    "content": "@plugi \"plugi-typo-dont-parse-as-@plugin\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/plugi/plugi.less",
    "content": "// https://github.com/less/less.js/issues/3660\n// const dir = parserInput.$re(/^@plugin?\\s+/);\n// correct regexp is /^@plugin\\s+/\n// so follow code will change nothing, parse result is same with raw less code\n@plugi \"plugi-typo-dont-parse-as-@plugin\";\n"
  },
  {
    "path": "packages/test-data/tests-unit/plugin/plugin.css",
    "content": "@charset \"utf-8\";\n.other {\n  trans: transitive;\n}\n.class {\n  trans: transitive;\n  global: global;\n  local: test-local();\n  shadow: global;\n}\n.class .local {\n  global: global;\n  local: local;\n  shadow: local;\n}\n.class {\n  ns-mixin-global: global;\n  ns-mixin-local: local;\n  ns-mixin-shadow: local;\n  mixin-local: local;\n  mixin-global: global;\n  mixin-shadow: local;\n  ruleset-local: local;\n  ruleset-global: global;\n  ruleset-shadow: local;\n  class-local: test-local();\n}\n@media screen {\n  .test-rule {\n    result: global;\n  }\n}\n@font-face {\n  result: global;\n}\n@media screen and (min-width: 100px) and (max-width: 400px) {\n  .test-rule {\n    result: global;\n  }\n}\n@media screen {\n  .test-rule {\n    result: local;\n  }\n}\n.root {\n  prop: value;\n}\n.test-rule-empty {\n  val1: foo;\n  val2: foo;\n}\n.test-rule-simple {\n  value: 3.141592653589793;\n  value: 6.28318531;\n}\n.test-rule-conflicts {\n  value: foo;\n}\n.test-rule-conflicts {\n  value: bar;\n}\n.test-rule-conflicts {\n  value: foo;\n}\n.test-rule-collection {\n  list: 32, 5, \"bird\";\n}\n@arbitrary value after ();\n"
  },
  {
    "path": "packages/test-data/tests-unit/plugin/plugin.less",
    "content": "// importing plugin globally\n@plugin \"../../plugin/plugin-global\";\n\n// transitively include plugins from importing another sheet\n@import \"../../plugin/plugin-transitive\";\n\n\n// `test-global` function should be reachable\n// `test-local`  function should not be reachable\n// `test-shadow` function should return global version\n.class {\n  trans  : test-transitive();\n  global : test-global();\n  local  : test-local();\n  shadow : test-shadow();\n\n  // `test-global` function should propagate and be reachable\n  // `test-local`  function should be reachable\n  // `test-shadow` function should return local version, shadowing global version\n  .local {\n    @plugin (option) \"../../plugin/plugin-local\";\n    global : test-global();\n    local  : test-local();\n    shadow : test-shadow();\n  }\n}\n\n// calling a mixin or detached ruleset should not bubble local plugins\n// imported inside either into the parent scope.\n.mixin() {\n  @plugin \"../../plugin/plugin-local\";\n  mixin-local  : test-local();\n  mixin-global : test-global();\n  mixin-shadow : test-shadow();\n}\n@ruleset : {\n  @plugin \"../../plugin/plugin-local\";\n  ruleset-local  : test-local();\n  ruleset-global : test-global();\n  ruleset-shadow : test-shadow();\n};\n#ns {\n  @plugin (test=test) \"../../plugin/plugin-local\";\n  .mixin() {\n    ns-mixin-global : test-global();\n    ns-mixin-local  : test-local();\n    ns-mixin-shadow : test-shadow();\n  }\n}\n.class {\n  #ns > .mixin();\n  .mixin();\n  @ruleset();\n  class-local : test-local();\n}\n\n\n// `test-global` function should propagate into directive scope\n@media screen {\n  .test-rule {\n    result : test-global();\n  }\n}\n@font-face {\n  result : test-global();\n}\n\n// `test-global` function should propagate into nested directive scopes\n@media screen and (min-width:100px) {\n  @media (max-width:400px) {\n\t\t.test-rule {\n\t\t\tresult : test-global();\n\t\t}\n\t}\n}\n\n.test-rule {\n  @media screen {\n    @plugin \"../../plugin/plugin-local\";\n    result : test-local();\n  }\n}\n\n@plugin \"../../plugin/plugin-tree-nodes\";\n@ruleset2: test-detached-ruleset();\n.root {\n  @ruleset2();\n}\n.test-rule-empty {\n  val1: foo;\n  test-collapse();\n  val2: foo;\n}\n.test-rule-simple {\n  @plugin \"../../plugin/plugin-simple\";\n  value: pi-anon();\n  value: (pi() * 2);\n}\n.test-rule-conflicts {\n  @plugin \"../../plugin/plugin-scope1\";\n  value: foo();\n}\n.test-rule-conflicts {\n  @plugin \"../../plugin/plugin-scope2\";\n  value: foo();\n}\n.test-rule-conflicts {\n  @plugin \"../../plugin/plugin-scope1\";\n  value: foo();\n}\n.test-rule-collection {\n  @plugin \"../../plugin/plugin-collection\";\n  @var: 32;\n  store(@var);\n  store(5);\n  store(\"bird\");\n  list: list();\n}\n\ntest-atrule(\"@charset\"; '\"utf-8\"');\ntest-atrule(\"@arbitrary\"; \"value after ()\");\n\n// no minVersion specified\n@plugin (option1) \"../../plugin/plugin-set-options\";\n@plugin \"../../plugin/plugin-set-options\";\n@plugin (option2) \"../../plugin/plugin-set-options\";\n@plugin \"../../plugin/plugin-set-options\";\n@plugin (option3) \"../../plugin/plugin-set-options\";\n\n// specifies minVersion: [2,0,0]\n@plugin (option1) \"../../plugin/plugin-set-options-v2\";\n@plugin \"../../plugin/plugin-set-options-v2\";\n@plugin (option2) \"../../plugin/plugin-set-options-v2\";\n@plugin \"../../plugin/plugin-set-options-v2\";\n@plugin (option3) \"../../plugin/plugin-set-options-v2\";\n\n// specifies minVersion: [3,0,0]\n@plugin (option1) \"../../plugin/plugin-set-options-v3\";\n@plugin \"../../plugin/plugin-set-options-v3\";\n@plugin (option2) \"../../plugin/plugin-set-options-v3\";\n@plugin \"../../plugin/plugin-set-options-v3\";\n@plugin (option3) \"../../plugin/plugin-set-options-v3\";\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/plugin-module/plugin-module.css",
    "content": "a{background:0 0}"
  },
  {
    "path": "packages/test-data/tests-unit/plugin-module/plugin-module.less",
    "content": "// Test NPM import\n@plugin \"clean-css\";\n\na {\n  background: none;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/plugin-preeval/plugin-preeval.css",
    "content": ":root.two .one {\n  --foo: bar !important;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/plugin-preeval/plugin-preeval.less",
    "content": "@plugin \"../../plugin/plugin-preeval\";\n\n.two(@rules: {}) {\n    :root.two & {\n        @rules();\n    }\n}\n\n.one {\n    .two({\n        --foo: @replace !important;\n    });\n}\n\n@stop: end;\n"
  },
  {
    "path": "packages/test-data/tests-unit/property-accessors/property-accessors.css",
    "content": ".block_1 {\n  color: red;\n  background-color: red;\n  width: 50px;\n  height: 25px;\n  border: 1px solid #ff3333;\n  content: \"red\";\n  prop: red;\n}\n.block_1:hover {\n  background-color: green;\n  color: green;\n}\n.block_1 .one {\n  background: red;\n}\n.block_2 {\n  color: red;\n  color: blue;\n}\n.block_2 .two {\n  background-color: blue;\n}\n.block_3 {\n  color: red;\n  color: yellow;\n  color: blue;\n}\n.block_3 .three {\n  background-color: blue;\n}\n.block_4 {\n  color: red;\n  color: blue;\n  color: yellow;\n}\n.block_4 .four {\n  background-color: yellow;\n}\na {\n  background-color: red, foo;\n}\nab {\n  background: red, foo;\n}\n.value_as_property {\n  prop1: color;\n  color: #FF0000;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/property-accessors/property-accessors.less",
    "content": ".block_1 {\n  color: red;\n  background-color: $color;\n  @width: 50px;\n  width: @width;\n  height: ($width / 2);\n  @color: red;\n  border: 1px solid lighten($color, 10%);\n  &:hover {\n    color: $color;\n    background-color: $color;\n    .mixin1();\n  }\n  .one {\n    background: $color;\n  }\n  content: \"${color}\";\n  prop: $color;\n\n}\n\n.block_2 {\n  color: red; \n  .two {\n    background-color: $color; \n  }\n  color: blue;  \n}\n\n.block_3 {\n  color: red; \n  .three {\n    background-color: $color;\n  }\n  .mixin2();\n  color: blue;\n}\n.block_4 {\n  color: red; \n  .four {\n    background-color: $color;\n  }\n  color: blue;\n  .mixin2();\n}\n// property merging\na {\n    background-color+: red;\n    background-color+: foo;\n\n    &b {\n        background: $background-color;\n    }\n}\n\n.value_as_property {\n  prop1: color;\n  ${prop1}: #FF0000;  // not sure why you'd want to do this, but ok\n}\n\n.mixin1() {\n  color: green;\n}\n.mixin2() { \n  color: yellow;\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/property-name-interp/property-name-interp.css",
    "content": "pi-test {\n  border: 0;\n  @not-variable: @not-variable;\n  ufo-width: 50%;\n  *-z-border: 1px dashed blue;\n  -www-border-top: 2px;\n  radius-is-not-a-border: true;\n  border-top-left-radius: 2em;\n  border-top-red-radius-: 3pt;\n  global-local-mixer-property: strong;\n}\npi-test-merge {\n  pre-property-ish: high, middle, low, base;\n  pre-property-ish+: nice try dude;\n}\npi-indirect-vars {\n  auto: auto;\n}\npi-complex-values {\n  3px rgba(255, 255, 0, 0.5), 3.141592653589793 /* foo */3px rgba(255, 255, 0, 0.5), 3.141592653589793 /* foo */: none;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/property-name-interp/property-name-interp.less",
    "content": "// Property name interpolation tests\npi-test {\n    @prefix: ufo-;\n    @a:    border;\n    @bb:      top;\n    @c_c:    left;\n    @d-d4: radius;\n    @-:         -;\n\n    @var: ~'@not-variable';\n\n    @{a}: 0;\n    @{var}: @var;\n    @{prefix}width: 50%;\n    *-z-@{a} :1px dashed blue;\n    -www-@{a}-@{bb}: 2px;\n    @{d-d4}-is-not-a-@{a}:true;\n    @{a}-@{bb}-@{c_c}-@{d-d4}       : 2em;\n    @{a}@{-}@{bb}@{-}red@{-}@{d-d4}-: 3pt;\n\n    .mixin(mixer);\n    .merge(ish, base);\n}\n\n@global: global;\n\n.mixin(@arg) {\n    @local: local;\n    @{global}-@{local}-@{arg}-property: strong;\n}\n\n.merge(@p, @v) {\n    &-merge {\n        @prefix: pre;\n        @suffix: ish;\n        @{prefix}-property-ish+       :high;\n        pre-property-@{suffix}    +: middle;\n        @{prefix}-property-@{suffix}+:  low;\n        @{prefix}-property-@{p}   +  :   @v;\n\n        @subterfuge: ~'+';\n        pre-property-ish@{subterfuge}: nice try dude;\n    }\n}\n\npi-indirect-vars {\n    @{p}: @p;\n    @p: @@a;\n    @a: b;\n    @b: auto;\n}\n\npi-complex-values {\n    @{p}@{p}: none;\n    @p: (1 + 2px) fadeout(#ff0, 50%), pi() /* foo */;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/property-targeted/property-targeted.css",
    "content": ".test-important {\n  color: red!important;\n  background: red !important;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/property-targeted/property-targeted.less",
    "content": "// Targeted tests for specific uncovered lines in property.js\n\n// Lines 49-51: Property with important flag handling\n// This tests when a property accessor accesses a property that has !important\n.test-important {\n  color: red !important;\n  background: $color;\n}\n\n// Lines 60-64: Property undefined error (should be in tests-error, but testing the path)\n// This will error, but tests the error path\n.test-undefined {\n  // value: @undefined-property;\n}\n\n// Lines 72-73: find method returning null (property not found in any frame)\n// This tests the find method when property doesn't exist\n.test-not-found {\n  // value: @nonexistent;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/rulesets/rulesets.css",
    "content": "#first > .one {\n  font-size: 2em;\n  hasOwnProperty: blue;\n}\n#first > .one > #second .two > #deux {\n  width: 50%;\n}\n#first > .one > #second .two > #deux #third {\n  height: 100%;\n}\n#first > .one > #second .two > #deux #third:focus {\n  color: black;\n}\n#first > .one > #second .two > #deux #third:focus #fifth > #sixth .seventh #eighth + #ninth {\n  color: purple;\n}\n#first > .one > #second .two > #deux #fourth,\n#first > .one > #second .two > #deux #five,\n#first > .one > #second .two > #deux #six {\n  color: #110000;\n}\n#first > .one > #second .two > #deux #fourth .seven,\n#first > .one > #second .two > #deux #five .seven,\n#first > .one > #second .two > #deux #six .seven,\n#first > .one > #second .two > #deux #fourth .eight > #nine,\n#first > .one > #second .two > #deux #five .eight > #nine,\n#first > .one > #second .two > #deux #six .eight > #nine {\n  border: 1px solid black;\n}\n#first > .one > #second .two > #deux #fourth #ten,\n#first > .one > #second .two > #deux #five #ten,\n#first > .one > #second .two > #deux #six #ten {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/rulesets/rulesets.less",
    "content": "// Ruleset nesting and selector tests\n#first > .one {\n  > #second .two > #deux {\n    width: 50%;\n    #third {\n      &:focus {\n        color: black;\n        #fifth {\n          > #sixth {\n            .seventh #eighth {\n              + #ninth {\n                color: purple;\n              }\n            }\n          }\n        }\n      }\n      height: 100%;\n    }\n    #fourth, #five, #six {\n      color: #110000;\n      .seven, .eight > #nine {\n        border: 1px solid black;\n      }\n      #ten {\n        color: red;\n      }\n    }\n  }\n  font-size: 2em;\n  hasOwnProperty: blue;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/scope/scope.css",
    "content": ".tiny-scope {\n  color: #989;\n}\n.scope1 {\n  color: blue;\n  border-color: black;\n}\n.scope1 .scope2 {\n  color: blue;\n}\n.scope1 .scope2 .scope3 {\n  color: red;\n  border-color: black;\n  background-color: white;\n}\n.scope {\n  scoped-val: green;\n}\n.heightIsSet {\n  height: 1024px;\n}\n.useHeightInMixinCall {\n  mixin-height: 1024px;\n}\n.imported {\n  exists: true;\n}\n.testImported {\n  exists: true;\n}\n#allAreUsedHere {\n  default: 'top level';\n  scope: 'top level';\n  sub-scope-only: 'inside';\n}\n#parentSelectorScope {\n  prop: white;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/scope/scope.less",
    "content": "@x: red;\n@x: blue;\n@z: transparent;\n@mix: none;\n\n.mixin {\n  @mix: #989;\n}\n@mix: blue;\n.tiny-scope {\n  color: @mix; // #989\n  .mixin();\n}\n\n.scope1 {\n  @y: orange;\n  @z: black;\n  color: @x; // blue\n  border-color: @z; // black\n  .hidden {\n    @x: #131313;\n  }\n  .scope2 {\n    @y: red;\n    color: @x; // blue\n    .scope3 {\n      @local: white;\n      color: @y; // red\n      border-color: @z; // black\n      background-color: @local; // white\n    }\n  }\n}\n\n#namespace {\n  .scoped_mixin() {\n    @local-will-be-made-global: green;\n    .scope {\n      scoped-val: @local-will-be-made-global;\n    }\n  }\n}\n\n#namespace > .scoped_mixin();\n\n.setHeight(@h) { @height: 1024px; }\n.useHeightInMixinCall(@h) { .useHeightInMixinCall { mixin-height: @h; } }\n@mainHeight: 50%;\n.setHeight(@mainHeight);\n.heightIsSet { height: @height; }\n.useHeightInMixinCall(@height);\n\n.importRuleset() {\n  .imported {\n    exists: true;\n  }\n}\n.importRuleset();\n.testImported {\n  .imported();\n}\n\n@parameterDefault: 'top level';\n@anotherVariable: 'top level';\n//mixin uses top-level variables\n.mixinNoParam(@parameter: @parameterDefault) when (@parameter = 'top level') {\n  default: @parameter;\n  scope: @anotherVariable;\n  sub-scope-only: @subScopeOnly;\n}\n\n#allAreUsedHere {\n  //redefine top-level variables in different scope\n  @parameterDefault: 'inside';\n  @anotherVariable: 'inside';\n  @subScopeOnly: 'inside';\n  //use the mixin\n  .mixinNoParam();\n}\n#parentSelectorScope {\n  @col: white;\n  & {\n    @col: black;\n  }\n  prop: @col;\n  & {\n    @col: black;\n  }\n}\n.test-empty-mixin() {\n}\n#parentSelectorScopeMixins {\n  & {\n    .test-empty-mixin() {\n      should: never seee 1;\n    }\n  }\n  .test-empty-mixin();\n  & {\n    .test-empty-mixin() {\n      should: never seee 2;\n    }\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/selectors/selectors.css",
    "content": "h1 a:hover,\nh2 a:hover,\nh3 a:hover,\nh1 p:hover,\nh2 p:hover,\nh3 p:hover {\n  color: red;\n}\n#all {\n  color: blue;\n}\n#the {\n  color: blue;\n}\n#same {\n  color: blue;\n}\nul,\nli,\ndiv,\nq,\nblockquote,\ntextarea {\n  margin: 0;\n}\ntd {\n  margin: 0;\n  padding: 0;\n}\ntd,\ninput {\n  line-height: 1em;\n}\na {\n  color: red;\n}\na:hover {\n  color: blue;\n}\ndiv a {\n  color: green;\n}\np a span {\n  color: yellow;\n}\n.foo .bar .qux,\n.foo .baz .qux {\n  display: block;\n}\n.qux .foo .bar,\n.qux .foo .baz {\n  display: inline;\n}\n.qux.foo .bar,\n.qux.foo .baz {\n  display: inline-block;\n}\n.qux .foo .bar .biz,\n.qux .foo .baz .biz {\n  display: none;\n}\n.a.b.c {\n  color: red;\n}\n.c .b.a {\n  color: red;\n}\n.foo .p.bar {\n  color: red;\n}\n.foo.p.bar {\n  color: red;\n}\n.foo + .foo {\n  background: amber;\n}\n.foo + .foo {\n  background: amber;\n}\n.foo + .foo,\n.foo + .bar,\n.bar + .foo,\n.bar + .bar {\n  background: amber;\n}\n.foo a > .foo a,\n.foo a > .bar a,\n.foo a > .foo b,\n.foo a > .bar b,\n.bar a > .foo a,\n.bar a > .bar a,\n.bar a > .foo b,\n.bar a > .bar b,\n.foo b > .foo a,\n.foo b > .bar a,\n.foo b > .foo b,\n.foo b > .bar b,\n.bar b > .foo a,\n.bar b > .bar a,\n.bar b > .foo b,\n.bar b > .bar b {\n  background: amber;\n}\n.other ::fnord {\n  color: red;\n}\n.other::fnord {\n  color: red;\n}\n.other ::bnord {\n  color: red;\n}\n.other::bnord {\n  color: red;\n}\n.blood {\n  color: red;\n}\n.bloodred {\n  color: green;\n}\n#blood.blood.red.black:blood {\n  color: black;\n}\n:nth-child(3) {\n  selector: interpolated;\n}\n.test-rule:nth-child(3) {\n  selector: interpolated;\n}\n.test-rule:nth-child(odd):not(:nth-child(3)) {\n  color: #ff0000;\n}\n[prop],\n[prop=ten-percent],\n[prop|=\"value3\"],\n[prop*=\"val3\"],\n[|prop~=\"val3\"],\n[*|prop$=\"val3\"],\n[ns|prop^=\"val3\"],\n[p^=\"val3\"],\n[p] {\n  attributes: yes;\n}\n/**\n * https://www.w3.org/TR/selectors-4/#attribute-case\n */\na[href*=\"insensitive\" i] {\n  color: cyan;\n}\na[href*=\"cAsE\" s] {\n  color: pink;\n}\na[href*=\"less\" I] {\n  background-color: silver;\n}\na[href*=\"less\" S] {\n  background-color: red;\n}\n/*\nLarge comment means chunk will be emitted after } which means chunk will begin with whitespace...\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\n*/\n.blood {\n  color: red;\n}\n.foo:not(.tst.only-nested .level2:hover) {\n  test: only-nested;\n}\n.foo.nestend-and-non-nested:not(.tst.nestend-and-non-nested:hover) {\n  test: nestend-and-non-nested;\n}\n.selector:not(:hover) {\n  test: global scope;\n}\n.extend-this,\n.active.first-level .second-level,\n.first-level .second-level.active2 {\n  content: '\\2661';\n}\n.x:is(.x.a) {\n  color: red;\n}\n.x:not(.x.b, .x.c) {\n  color: green;\n}\n.x:is(.x.d, .x.e, .x.f) {\n  color: blue;\n}\na:is(.b, :is(.c)) {\n  color: blue;\n}\na:is(.b, :is(.c), :has(div)) {\n  color: red;\n}\n:is(:not(:has(>.foo)), :has(>.foo.bar)) {\n  overflow: clip;\n}\n:matches(:not(:has(>.foo)), :has(>.foo.bar)) {\n  overflow: clip;\n}\n:where(:not(:has(>.foo)), :has(>.foo.bar)) {\n  overflow: clip;\n}\n:is(:has(>.foo + .bar), :has(>.baz ~ .qux), :not(:has(.quux))) {\n  color: blue;\n}\n:where(.a, .b, .c) {\n  color: red;\n}\n:not(.a, .b, .c) {\n  color: green;\n}\n:where(:is(.a, .b), :has(>.c)) {\n  color: blue;\n}\n:is(:where(:has(.foo)), :not(:has(.bar))) {\n  color: purple;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/selectors/selectors.less",
    "content": "// Selector handling tests\nh1, h2, h3 {\n  a, p {\n    &:hover {\n      color: red;\n    }\n  }\n}\n\n#all { color: blue; }\n#the { color: blue; }\n#same { color: blue; }\n\nul, li, div, q, blockquote, textarea {\n  margin: 0;\n}\n\ntd {\n  margin: 0;\n  padding: 0;\n}\n\ntd, input {\n  line-height: 1em;\n}\n\na {\n  color: red;\n\n  &:hover { color: blue; }\n\n  div & { color: green; }\n\n  p & span { color: yellow; }\n}\n\n.foo {\n  .bar, .baz {\n    & .qux {\n      display: block;\n    }\n    .qux & {\n      display: inline;\n    }\n    .qux& {\n      display: inline-block;\n    }\n    .qux & .biz {\n      display: none;\n    }\n  }\n}\n\n.b {\n &.c {\n  .a& {\n   color: red;\n  }\n }\n}\n\n.b {\n .c & {\n  &.a {\n   color: red;\n  }\n }\n}\n\n.p {\n  .foo &.bar {\n    color: red;\n  }\n}\n\n.p {\n  .foo&.bar {\n    color: red;\n  }\n}\n\n.foo {\n  .foo + & {\n    background: amber;\n  }\n  & + & {\n    background: amber;\n  }\n}\n\n.foo, .bar {\n  & + & {\n    background: amber;\n  }\n}\n\n.foo, .bar {\n  a, b {\n    & > & {\n      background: amber;\n    }\n  }\n}\n\n.other ::fnord { color: red }\n.other::fnord { color: red }\n.other {\n  ::bnord {color: red }\n  &::bnord {color: red }\n}\n\n// selector interpolation\n@theme: blood;\n@selector: ~\".@{theme}\";\n@{selector} {\n  color:red;\n}\n@{selector}red {\n  color: green;\n}\n.red {\n  #@{theme}.@{theme}&.black:@{theme} {\n    color:black;\n  }\n}\n@num: 3;\n:nth-child(@{num}) {\n  selector: interpolated;\n}\n.test-rule {\n  &:nth-child(@{num}) {\n    selector: interpolated;\n  }\n  &:nth-child(odd):not(:nth-child(3)) {\n    color: #ff0000;\n  }\n}\n@prop: p;\n[prop],\n[prop=ten-percent],\n[prop|=\"value@{num}\"],\n[prop*=\"val@{num}\"],\n[|prop~=\"val@{num}\"],\n[*|prop$=\"val@{num}\"],\n[ns|prop^=\"val@{num}\"],\n[@{prop}^=\"val@{num}\"],\n[@{prop}] {\n  attributes: yes;\n}\n\n/**\n * https://www.w3.org/TR/selectors-4/#attribute-case\n */\n@pattern: less;\na[href*=\"insensitive\" i] {\n  color: cyan;\n}\na[href*=\"cAsE\" s] {\n  color: pink;\n}\na[href*=\"@{pattern}\" I] {\n  background-color: silver;\n}\na[href*=\"@{pattern}\" S] {\n  background-color: red;\n}\n\n/*\nLarge comment means chunk will be emitted after } which means chunk will begin with whitespace...\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\nblank blank blank blank blank blank blank blank blank blank blank blank blank blank blank blank\n*/\n@{selector} {\n  color: red;\n}\n.only-nested {\n  .level2 {\n    .foo:not(.tst&:hover) {\n      test: only-nested;\n    }\n  }\n}\n.nestend-and-non-nested {\n  .foo&:not(.tst&:hover) {\n    test: nestend-and-non-nested;\n  }\n}\n.selector:not(&:hover) {\n  test: global scope;\n}\n// https://github.com/less/less.js/issues/2206\n.extend-this {\n  content: '\\2661';\n}\n.first-level {\n  .second-level {\n    .active&:extend(.extend-this) { }\n    &.active2:extend(.extend-this) { }\n  }\n}\n\n// https://github.com/less/less.js/issues/4358\n.x {\n    &:is(&.a) { color: red; }\n    &:not(&.b, &.c) { color: green; }\n    &:is(&.d, &.e, &.f) { color: blue; }\n}\n\na:is(.b, :is(.c)) {\n  color: blue;\n}\n\na:is(.b, :is(.c), :has(div)) {\n  color: red;\n}\n\n// https://github.com/less/less.js/issues/4378\n:is(:not(:has(>.foo)), :has(>.foo.bar)) {\n  overflow: clip;\n}\n\n:matches(:not(:has(>.foo)), :has(>.foo.bar)) {\n  overflow: clip;\n}\n\n:where(:not(:has(>.foo)), :has(>.foo.bar)) {\n  overflow: clip;\n}\n\n:is(:has(>.foo + .bar), :has(>.baz ~ .qux), :not(:has(.quux))) {\n  color: blue;\n}\n\n:where(.a, .b, .c) {\n  color: red;\n}\n\n:not(.a, .b, .c) {\n  color: green;\n}\n\n:where(:is(.a, .b), :has(>.c)) {\n  color: blue;\n}\n\n:is(:where(:has(.foo)), :not(:has(.bar))) {\n  color: purple;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/starting-style/starting-style.css",
    "content": "#nav {\n  transition: background-color 3.5s;\n  background-color: gray;\n}\n[popover]:popover-open {\n  opacity: 1;\n  transform: scaleX(1);\n  @starting-style {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n}\n#target {\n  transition: background-color 1.5s;\n  background-color: green;\n}\n@starting-style {\n  #target {\n    background-color: transparent;\n  }\n}\n#source {\n  transition: background-color 2.5s;\n  background-color: red;\n}\nsource:first {\n  opacity: 1;\n  transform: scaleX(1);\n  @starting-style {\n    opacity: 0;\n    transform: scaleX(0);\n  }\n}\n#footer {\n  color: yellow;\n}\n@starting-style {\n  #footer {\n    background-color: transparent;\n  }\n}\nnav > [popover]:popover-open {\n  opacity: 1;\n  transform: scaleX(1);\n  @starting-style {\n    padding: 10px 8px 6px 4px;\n  }\n}\naside > [popover]:popover-open {\n  opacity: 1;\n  transform: scaleX(1);\n  @starting-style {\n    padding: 10px 20px 30px 40px;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/starting-style/starting-style.less",
    "content": "#nav {\n    transition: background-color 3.5s;\n    background-color: gray;\n}\n\n[popover]:popover-open {\n    opacity: 1;\n    transform: scaleX(1);\n\n    @starting-style {\n        opacity: 0;\n        transform: scaleX(0);\n    }\n}\n\n#target {\n    transition: background-color 1.5s;\n    background-color: green;\n}\n\n@starting-style {\n    #target {\n        background-color: transparent;\n    }\n}\n\n#source {\n    transition: background-color 2.5s;\n    background-color: red;\n}\n\nsource:first {\n    opacity: 1;\n    transform: scaleX(1);\n\n    @starting-style {\n        opacity: 0;\n        transform: scaleX(0);\n    }\n}\n\n#footer {\n    color: yellow;\n}\n\n@starting-style {\n    #footer {\n        background-color: transparent;\n    }\n}\n\nnav > [popover]:popover-open {\n  opacity: 1;\n  transform: scaleX(1);\n\n  @starting-style {\n    padding+_: 10px;\n    padding+_: 8px;\n    padding+_: 6px;\n    padding+_: 4px;\n  }\n}\n\naside > [popover]:popover-open {\n  opacity: 1;\n  transform: scaleX(1);\n\n  @starting-style {\n    // vector math\n    each(1 2 3 4, {\n        padding+_: (@value * 10px);\n    });\n  }\n}\n\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/strings/strings.css",
    "content": "#strings {\n  background-image: url(\"http://son-of-a-banana.com\");\n  quotes: \"~\" \"~\";\n  content: \"#*%:&^,)!.(~*})\";\n  empty: \"\";\n  brackets: \"{\" \"}\";\n  escapes: \"\\\"hello\\\" \\\\world\";\n  escapes2: \"\\\"llo\";\n}\n#comments {\n  content: \"/* hello */ // not-so-secret\";\n}\n#single-quote {\n  quotes: \"'\" \"'\";\n  content: '\"\"#!&\"\"';\n  empty: '';\n  semi-colon: ';';\n}\n#one-line {\n  image: url(http://tooks.com);\n}\n#crazy {\n  image: url(http://), \"}\", url(\"http://}\");\n}\n#interpolation {\n  url: \"http://lesscss.org/dev/image.jpg\";\n  url2: \"http://lesscss.org/image-256.jpg\";\n  url3: \"http://lesscss.org#456\";\n  url4: \"http://lesscss.org/hello\";\n  url5: \"http://lesscss.org/54.4px\";\n}\n.mix-mul-class {\n  color: blue;\n  color: red;\n  color: black;\n  color: orange;\n}\n.watermark {\n  family: Univers, Arial, Verdana, San-Serif;\n}\n#iterated-interpolation .mixin {\n  width: 100px;\n  weird: 100px;\n  width-str: \"100px\";\n  weird-str: \"100px\";\n}\n#iterated-interpolation .interpolation-mixin {\n  width: 100px;\n  weird: 100px;\n  width-str: \"100px\";\n  weird-str: \"100px\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/strings/strings.less",
    "content": "// String handling and interpolation tests\n#strings {\n  background-image: url(\"http://son-of-a-banana.com\");\n  quotes: \"~\" \"~\";\n  content: \"#*%:&^,)!.(~*})\";\n  empty: \"\";\n  brackets: \"{\" \"}\";\n  escapes: \"\\\"hello\\\" \\\\world\";\n  escapes2: \"\\\"llo\";\n}\n#comments {\n  content: \"/* hello */ // not-so-secret\";\n}\n#single-quote {\n  quotes: \"'\" \"'\";\n  content: '\"\"#!&\"\"';\n  empty: '';\n  semi-colon: ';';\n}\n#one-line { image: url(http://tooks.com) }\n#crazy { image: url(http://), \"}\", url(\"http://}\") }\n#interpolation {\n  @var: '/dev';\n  url: \"http://lesscss.org@{var}/image.jpg\";\n\n  @var2: 256;\n  url2: \"http://lesscss.org/image-@{var2}.jpg\";\n\n  @var3: #456;\n  url3: \"http://lesscss.org@{var3}\";\n\n  @var4: hello;\n  url4: \"http://lesscss.org/@{var4}\";\n\n  @var5: 54.4px;\n  url5: \"http://lesscss.org/@{var5}\";\n}\n\n// multiple calls with string interpolation\n\n.mix-mul (@a: green) {\n    color: ~\"@{a}\";\n}\n.mix-mul-class {\n    .mix-mul(blue);\n    .mix-mul(red);\n    .mix-mul(black);\n    .mix-mul(orange);\n}\n\n@test: Arial, Verdana, San-Serif;\n.watermark {\n  @family: ~\"Univers, @{test}\";\n  family: @family;\n}\n#iterated-interpolation {\n  @box-small: 10px;\n  @box-large: 100px;\n\n  .mixin { // both ruleset and mixin\n    width: ~\"@{box-@{suffix}}\";\n    weird: ~\"@{box}-@{suffix}}\";\n    width-str: \"@{box-@{suffix}}\";\n    weird-str: \"@{box}-@{suffix}}\";\n    @box: ~\"@{box\";\n    @suffix: large;\n  }\n  .interpolation-mixin {\n    .mixin(); //call the above as mixin\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/styles.config.cjs",
    "content": "module.exports = {\n  language: {\n    less: {\n      \"relativeUrls\": true,\n      \"silent\": true,\n      \"javascriptEnabled\": true\n}\n  }\n};\n"
  },
  {
    "path": "packages/test-data/tests-unit/tailwind/tailwind.css",
    "content": ".box {\n  @apply h-64 w-64;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/tailwind/tailwind.less",
    "content": ".box {\n  @apply h-64 w-64;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/actual.css",
    "content": "@import \"../css/background.css\";\n@import \"import-test-d.css\";\n@import \"file.css\";\n.mixin-consumer {\n  color: violet;\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(fonts.svg#MyGeometricModern) format(\"svg\");\n  not-a-comment: url(//z);\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n  background: url(\"img.jpg\") center / 100px;\n  background: #fff url(image.png) center / 1px 100px repeat-x scroll content-box padding-box;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n  background-image: url(\"http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700\");\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n  url: url('Trebuchet');\n}\n#logo {\n  width: 100px;\n  height: 100px;\n  background: url('./assets/logo.png');\n  background: url(\"#inline-svg\");\n}\n@font-face {\n  font-family: xecret;\n  src: url('../assets/xecret.ttf');\n}\n#secret {\n  font-family: xecret, sans-serif;\n}\n#imported-relative-path {\n  background-image: url(../../data/image.jpg);\n  border-image: url('../../data/image.jpg');\n}\n#relative-url-import {\n  background-image: url(../../data/image.jpg);\n  border-image: url('../../data/image.jpg');\n}\n#data-uri {\n  uri: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\");\n  background-image: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\"), url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\");\n  uri-fragment: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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#fragment\");\n}\n#data-uri-guess {\n  uri: url(\"data:image/jpeg;base64,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"
  },
  {
    "path": "packages/test-data/tests-unit/urls/assets/nested-gradient-with-svg-gradient/mixin-consumer.less",
    "content": ".mixin-consumer {\n  color: violet;\n}\n\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/assets/nested-gradient-with-svg-gradient/svg-gradient-mixin.less",
    "content": ".gradient-mixin(@color) {\n  background: svg-gradient(to bottom,\n    fade(@color, 0%) 0%,\n    fade(@color, 5%) 60%,\n    fade(@color, 10%) 70%,\n    fade(@color, 15%) 73%,\n    fade(@color, 20%) 75%,\n    fade(@color, 25%) 80%,\n    fade(@color, 30%) 85%,\n    fade(@color, 35%) 88%,\n    fade(@color, 40%) 90%,\n    fade(@color, 45%) 95%,\n    fade(@color, 50%) 100%\n  );\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/css/background.css",
    "content": "body {\n  background: white;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/import/import-and-relative-paths-test.less",
    "content": "@import \"../css/background.css\";\n@import \"import-test-d.css\";\n\n@import \"imports/logo\";\n@import \"imports/font\";\n\n.unquoted-relative-path-bg() {\n    background-image: url(../../../data/image.jpg);\n}\n.quoted-relative-path-border-image() {\n    border-image: url('../../../data/image.jpg');\n}\n\n#imported-relative-path {\n    .unquoted-relative-path-bg();\n    .quoted-relative-path-border-image();\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/import/import-test-d.css",
    "content": "#css { color: yellow; }\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/import/imports/font.less",
    "content": "@font-face {\n    font-family: xecret;\n    src: url('../assets/xecret.ttf');\n}\n\n#secret {\n    font-family: xecret, sans-serif;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/import/imports/logo.less",
    "content": "#logo {\n  width: 100px;\n  height: 100px;\n  background: url('../assets/logo.png');\n  background: url(\"#inline-svg\");\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/nested-gradient-with-svg-gradient/mixin-consumer.less",
    "content": "@import \"svg-gradient-mixin.less\";\n\n.gray-gradient {\n  .gradient-mixin(#999);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/nested-gradient-with-svg-gradient/svg-gradient-mixin.less",
    "content": ".gradient-mixin(@color) {\n  background: svg-gradient(to bottom,\n    fade(@color, 0%) 0%,\n    fade(@color, 5%) 60%,\n    fade(@color, 10%) 70%,\n    fade(@color, 15%) 73%,\n    fade(@color, 20%) 75%,\n    fade(@color, 25%) 80%,\n    fade(@color, 30%) 85%,\n    fade(@color, 35%) 88%,\n    fade(@color, 40%) 90%,\n    fade(@color, 45%) 95%,\n    fade(@color, 50%) 100%\n  );\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/urls.css",
    "content": "@import \"../css/background.css\";\n@import \"import-test-d.css\";\n@import \"file.css\";\n.gray-gradient {\n  background: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220%22%2F%3E%3Cstop%20offset%3D%2260%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.05%22%2F%3E%3Cstop%20offset%3D%2270%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.1%22%2F%3E%3Cstop%20offset%3D%2273%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.15%22%2F%3E%3Cstop%20offset%3D%2275%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.2%22%2F%3E%3Cstop%20offset%3D%2280%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.25%22%2F%3E%3Cstop%20offset%3D%2285%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.3%22%2F%3E%3Cstop%20offset%3D%2288%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.35%22%2F%3E%3Cstop%20offset%3D%2290%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.4%22%2F%3E%3Cstop%20offset%3D%2295%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.45%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23999999%22%20stop-opacity%3D%220.5%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n}\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium), url(fonts.svg#MyGeometricModern) format(\"svg\");\n  not-a-comment: url(//z);\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n  background: url(\"img.jpg\") center / 100px;\n  background: #fff url(image.png) center / 1px 100px repeat-x scroll content-box padding-box;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n  background-image: url(\"http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700\");\n}\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n  url: url('Trebuchet');\n}\n#logo {\n  width: 100px;\n  height: 100px;\n  background: url('../assets/logo.png');\n  background: url(\"#inline-svg\");\n}\n@font-face {\n  font-family: xecret;\n  src: url('../assets/xecret.ttf');\n}\n#secret {\n  font-family: xecret, sans-serif;\n}\n#imported-relative-path {\n  background-image: url(../../../data/image.jpg);\n  border-image: url('../../../data/image.jpg');\n}\n#relative-url-import {\n  background-image: url(../../../data/image.jpg);\n  border-image: url('../../../data/image.jpg');\n}\n#data-uri {\n  uri: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\");\n  background-image: url(\"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAA4KCwwLCQ4MCwwQDw4RFSMXFRMTFSsfIRojMy02NTItMTA4P1FFODxNPTAxRmBHTVRWW1xbN0RjamNYalFZW1f/2wBDAQ8QEBUSFSkXFylXOjE6V1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1f/wgARCAGuAoADASIAAhEBAxEB/8QAGgABAAMBAQEAAAAAAAAAAAAAAAECAwUEBv/EABkBAQEBAQEBAAAAAAAAAAAAAAABAwIEBf/aAAwDAQACEAMQAAABwG/nAABAJAFAAJgSAAAAAAAAAAAAAAAAAAAAAQAAABCJgABQAAAAARMCQBQACYEgANsst4GuAAAAAAAAAAAAAAAAgAAAAEQAACgRMSAAAAgEokCgAAEwJL4+jr08Onl9viX9G2HkHp8QWAAAAAAAAAAAACAAAAAIgAAKABAJRIAAACASiQKAAAXoz20Vnx/Rm2emvnzg9XhNc89oGuAAAAAAAAAACAAAAACEAACgAAQBMCQAAAAgEolV4+i8/r+benzbecO8wALXnGWUXz267n6+T3eFf065eMerwheQAAAA56Pd489qobecAAAAAIQAAKAAAIAAEwJAAAACLVnnS/S5z5/1d65FnLXL2/NDbzgbY7Yyr0caaKz4/ozbPXXDOsPX4JQL16uvk9/FJ9HkhDvOUBMaYent48x5fbTbKepk0z93zAvIAAiJgAAUAAAQAAAASiQAAAAEtbNl6NK1S7Za5becLANctcpQsA2y1xlCxatst9/Zznh+m9PmgU1y+h8gO+FquNNFHl916Q282uWuW3nCwIIAAAKAAAAgAAAAAJRIAAAACAbY7YrKCTemq0qAWNM9pc6rc9Verzc9wNMrTRl6LVOs9ctcu8wsAATGssZgISYAAAFAAAAQAAAAAAAEokAAAAA2x2xARtjsuSCSiRtSFraunn9f0fHzzx9Ga7rnFens+cFmuWuUoIAA1x2XEIAAACgAAAIAAAAiQAAAACUCQAAJiS+emYA2x1MggG2O2KzfOc9tFHl9t80+jyaZXz2882p78t/Nl9F8/LWLRplA6zAbY7LiEABQAAABAAAAABEwJAAAAAAmBKJAANctcgBrlqZAGhbG1QEAbY7LiEtpnfx/S6XOhj6PR5ltvNiPZ84BtjquQAAAAACAAAAAABAEwJRIAAAAABKBINctcgBrlqZAbY7GIAAG2OxiBems6Voy3nXHXXz5CwDXPXEAAAAEEwAAAAAACAAAAlEgAAAAAAG2WuJJoZ67+idct0oTna+iDxpiwABqzIA2x2MQWm2QAL86Xx6/K47qNcABBMAAAAAAAAgAAAAAJRIAAAAALGm/R92enl9Rx2CgAR5vUTk+D6V1z8o7/K04yy2xvIDWsFQa5a+yXDy+7wk3pp5fd9FxfOz2nPeneWA9nzwAAAAAABBMAAAAAAAAmBIAAAJ7/n6megcaAAAAAAImieHj/U4d8/NtMtMtstcSUSe3t0jLb5yprjOuO2epk8/rvekejyUGmQAAAAABAAAAAAAAAAAAlAkDfDtzroSY7AAAAAAAKXolwuPz30/k644eRrk9Xl6svXx2Y7fJvb4t8J0nEGhbG9AAABvh0pea2xsEEwAAAAAETAkAAAAAAAFvqeD9BnoHGgAAAAAAFL0ugKpeicTw/QfP65O3xO4dAZbR4feTnU6izh+b6Xw9c8EaZl4KgAdvjfT8d8Pw9Lm9chYAAAAABAEwJAAAAAAB1uvzujjsE6AAAAAARNEXFApel0z+X+r+U04v6sMeuPrHj9mOwKAB890/ZbrlEueufyPp464+Tn6HXrnx9Iz04nN9nj2xCwAAAAAgAoIBKJAAAAAPZ3/lPTx39Iw3z0BQABUsABRZJCq2ok2Fj5b6r5jvOcdctONO/wDOTzfq3J6WeuglAAAAAUvybOVU2wAAAAEEwAAKACAJgSiQAAB0ubpL6PR0K8d7a8GZe68Xs56kK83pJ4vToBmNIkBYrGiAridvl9c8eDXEXNq6+OXStVnY6vG6eWuk/J7WfTvF7eOwUy5lnr4CNcgvIAABAAABQAAAAQBMCUSAAW6/GS/WZ/P9fPTDx/Qjhev3+Y0359V6bxejm65lJuikaY1G7ONFBbOu9fMY/TcbTLy+jG1mVSxLsy+vx9T5nPTAa5LVGsZlBAAACAAAACgAAAAAAAgCYEoEgA26fGTr6nT5P18dfQub7ee9aTEL0AVCmqVvNJbqULF6i0VjDD31s5t+mMdmMvk4d6bZBeQAABBKAAAACgAAEIkUAAAAAACAASgSgSADf2cxL3vV8u56+tr8x6Je+5O869zHaWK20FCApEiulOanQ+epTTMOuQBBKAAAAACgAAAAQITAlE0AAAAAAACAAAASgSgSgSgSgaa+ZL7r84vUnlI6mHiF6w65lAAAAAABQAAAAAACEAAAJgSiQKAAAAAAAABAAAAAAAAAAAAAUAAAAAAAAAhAAAAAAACYEokCgAAAAAAAAAAAAAAAAAAAAAAAAAACEAAAAAAAAAAAJgSgSAKAAAAAAAAAAAAAAAAAAAAAERMAAAAAAB//xAAtEAACAQIEBgEEAwADAAAAAAABAgMAEQQQEiAhMDEyM1AUEyJAYCNBQ0KAkP/aAAgBAQABBQL/AKFKjMP0/CePFRi36dHIYzJM0gqUR/qC8STc/pd6vkeEeQQsP0K3JHEyH7ssJ2YmMaf0AVoVo5o9Db4+7OOQxmSdnFSGPTzhh2ZGUqfWjKPEaVmf6jRIGZxZto8eQ2KL0xuc7crDtePFgWtUkRj9ivE7W8ed6vk32jZhKnhBHIBIoknJmJphb1t8r0vZtk67Urrtjcxs+Juta1+kRypO71/+W2TybW4LsG3/AC5Mnk9e3ZsTi54nYguzG7bb1er5Dx8gcS/f699sfk2jglCmhcDeOzkR+T2Endsj7tr8MhSm64lArhb0ylTsXs5Efd7CTybE2oLsxuckldKZixUlWdyzMLbB4+QnT1/9yd+xOmxeC75O/IC9dE5A8Xr/AO5O/YnTYeEed6vkBcubvlhfLJErhhY23nx+wk8mxOmyTrui8mQpTpPyuB4mOQIp6bX9jJ37E6ZoLuxu25OmQ2nx7ZPJ7CTrsTpnH13/AOWY6ngb5P02R+T2L9NibB497ducffnJ3bE9kfHsj65nxb5O/Ne3JeLN3bOkfsR4slRmoYaU0mFYH4jV8R6OFlp4pACCN0ffs6RZR92xafDcCLexTpHh3ekgjTkWvTQRtTYSnidM14LskzTtr6emOhQ4FHDriLGVULURb1wBYwYcJzpMOj1JA8dHhHmguzG7Zf5YaHVWKe8lDYjlD3etAuYIRGPwJMPrVgVOScBmkes8FVjc5f1kTR+2P1mEi/BbpUsSyCRDG1HhHnGmlZ+EObcEq9INTMdTerhT6knT8H/llLGJFZCryd2WHXVLUovFnJ35dsfIiTW3o8Ilk/BXZMgOzBDjliIijVH3ZINTMdTcjBD75Rpl9CBcqNK/gN02dWxUeiTLBj+PIi9NhYzQwoA+GKfCuKP2LycGto8WP5vQ4Vbzfg9W2L0xS6ocsMeRiIda5aWNFSNoGooulMb5fQ4IfhL0zbKTjHSC7QyWn5EsZ+vFh1TK16kwqtTxshyw0GnLG+T0OD8f4DbRxaj0pOArDy/UTfpGrYQDRw8RpYkTPFG83oYJvpsCCOeOJzJsALDJu48I6RyjRSrIOex0qTc+iimaMxyrIORcX2Nt6tnIP5ZO7IEgw4kkq6vzsZJ6SCKOVHhkiqPFkUjq++SPVQ+QKXVmOJ2L0zlXTiNkYNmNhqarmsNMzNVxyJ5xGCbn0aMUaKVZRJh0emw8kdJipFpMTG1deQxsNh4nZi76cwCxkOhc8Ev3TNpipJGjMeJR9jSIlS4uuvpgSDFigcnjR6fB19OaKlxUgpcYlCeJqvfYONWIrVWoVc0OGw1p1JIhjalUsVtcm5zgT6ceNb7cwSK+rJRdz6uOZ46jxKNmUVqOGiNfDSviChCwoKRR+6r22FgTViK1VqFMTlLGsith2Qs3Dtjzw+H05TP9ST2SSulJixSurbWNqXpWkVarCgOF7bF41xFahk8URpsMrV8Ohg1pIkTLFy6V9re1JiZFpcWhpZEaibUBVquavVzR1Eg3y0irURXbnpFWAocDnJII1di7e5WWRaXGNS4uM0JEbIm1AWBF6+6uNEmhcZaa4191aa0ir2ykkWMSyGRvfB3FDEyChjDQxcdCeI0GU13GrEVc1c191aasa+1KlxKimYsf0UOwoTyCvlS18uSvmNXzGr5jUcTKaLFv/FD/xAApEQABBAADCAIDAQAAAAAAAAABAAIDEQQSMRATICEwQFBRFEEiMmFw/9oACAEDAQE/AfKvgcwX4eCLOt27eWjhf6iK8LDLuzaE8Z+1NiL5M2Pgc0X4FjWiP8hqpGZDwwx7xGN2ewjhQiKNcTRmNJ8Ffrz7eM04FGNpFLIBopy0u/Hgik3brQxEZ+1NiARTdr447y6LdPvTbh48xv0t1T8yMTGj+I68u2ZiHs5J+Jc4V0cPlz05GNpT6Asp7szr2RvMZsIYtv2FNPvOQ79jc7qT4i3n9bG4mQJ8rpNfCYaOzmTYSCfSdAxo8NDLuyvkxqebechpsgAskp8YIzNRjc3mR4bDZS1NY1uixDw38ffhmOLTyXypESTzPfUVlKo9KJmd1KSIfszTuQ33xZAi0jhq0VhmNIzIQgWpYmBvrt2j76JbwAVsilMei+W30pJTIb7YCz03C9g16I17JnUcOabrspZQi31wsR17FunUfxBuwtWRAUjr2LXV1H7AaQN8ZNdkFXpZvfSdwt0WfaTSJvswaQcCsoVFc+gW7QLTuQ7oEhZ1fRpZRsJvvbKzrOrHFdIuvwllZirP+E//xAAnEQABAwIGAgIDAQAAAAAAAAABAAIRAxIQICEwMUATUEFRBBQicP/aAAgBAgEBPwH2raod6eq+1XC2F5/TVGXhGk8fCp0fl2Daod6FxdfomOuGWo+1XC2F5ygZE5iYEptWeeu8S0q4q4qkHAa5KjLxCNJ4VOkZl2LXuiVe3Gs60K/+YQe5xQ6zqTXJtFrTOzVm2QrimyTATRaIwe0PEFH8dyp0rNe+42iU2oHYGiwptNrePSVnx/KNRNqvJ9NUp3heB6pU7NThVJjRNeZgoOB49NWkORcSqLSdfTOaHDVeBiAjQd6QrgpG091rZTH/AA7sl31muKDpyzCCrOIMLyJlRxPXcdkOyEzg9gev1ymMDNOsTA22nA8bJ46T9xp0TuMJVxQd95XIcdF3O4zMXYByvRMocdEtncZgRKIjOBPSKn7Vv1tNyu5VmIEoCOmRKLSFcpC02A7EmE3U9ogFWKNmVccAI7sK1WqDmiUBHpICtCgf4T//xAAxEAABAQUHBAIBAgcAAAAAAAABAAIQESAhEjAxUFFhcSIyQYFAkWADEyMzYnKAkKH/2gAIAQEABj8C/wACqD8QPKtj8PooYBwsfiGwUfw/l9B+G8UeVbH4EAQoXEdJIhQwDhYFfN/aCrmEGgoqBMEQJmt6T1wCjfQ0QPlwj5zHaZke57H3K0rTONzQwVTF1TFDjMGjMBtNa0miFAB1mzXVRuvQzD3MZgz7N17ujmDMo5RmjdNXTXOYDiUTE60fEi4auWec29GYM6PBVPKgoGVq59HMTK1xKES+hUSohRKHEjVy3xmJla4laN4RcnnMTK3xKN5wE0d3hbqFwzzmJlb4lhoJxtWSIXbVRRBZjFRmZG2YmVviQImdo7XA5mOYjiVriQnQXB3MkFB7I2lGZM8StcSNXDA9ycXLR2zJmU8GQbm4hpSRovCMp3OZHYv6WSVgAokhdwWIXhM9JVZh9yjc3PScyaGyiekLCJ3uKrthwuhr7XUy9o+pQNA9outt+cBJEI2VAVy+AUWqtX2h2Wo1TI1rIAiX8lW2sFDSaLKP3lsAq93wYihUC9praRhnxiVwiXxkh5Ncttn18GGrq46qDTgNaytSMj3JHLAPhcPgVZOKhpR4c0JOKP3auSNskta/CjrIGodQwkaL4jtdHSr9lG5J2TQ3yIBAfG4URgXkvqqURFrFd6pVWfJxuidUciG3wuJjs8saC4tDuD8CqiWAQZQ4yJo/Ghq5obOAUfBuSyyMV1VLqrpoV1B9trFw4yI8/BhKTI01s7cXFrzLVdq6WXnbIv6Soj4EbgobuiFvp8Ak+ETke2iofVzC64kaG6hpR8QrLY9rpMb79se8k0aUR9hQ/UruukzxZNlrVVDLS6oenxl5kaa9ymHCss4LuKxVhqu7sRcQHconJIsrfRaHZRZrwoNVWNnlUvYS09yQC/bHsyNNJo7OiyVXpMnU0FD9P7yeIUP1Kbu6mYroa+1SPpVgV1Ahd4liqKsXYfatHzLA+VAuorLOHk6qMgHnygxrJQrva+1Vo/eV0NNFXpL+pkFdsFiVRsr+c0qtkqC6pIOpgsCvP0sKOgV1duqgKMr+6S23jo4nM+krrEF0mMu8ncVVV8qv3JHVUwfUIQaK7/8Aiq0V0h1gYnNqLGPK6hBdLQdE4qiwWBWEuJUFs/B0JIlFo51RpdTMVWIVGhNg6LXl+KxVaugXRKic/o0VjFVZVYhdyoQtnUWCwWixKxVSv4eOqi0fwajRXeVisAu0LsC7QsYKpj/pQ//EAC0QAAEDAgUDBAIDAQEBAAAAAAEAESExURAgQWFxMFCBkaGx8EBgwdHx4YCQ/9oACAEBAAE/If8AwUUE5AqyIb9O1TNxIEY6/p70pNQnwAQEBO8T+mA5BDpuFOF36cEqENZnjE0Jy1UQR+giSidW6IMAapwwKQYs3XRTBiKrVN3+tAAhDJz0adCBW3x0XqVCicYBEIghj1RVCJBOiIADEduqTIYTi1CFRjDRAbRdDMHY1zQNcMRZAETdFFOWQOCboCqGPVBbnfZBKE2N2wVytK9AJOaF0/16Zh7KKFa8srXvhFoGD3REpjnKuYtkVcxb4VO5IRM1A9sBZMThFIcIZoWQ/wB5hAJKk/KJJEmpyAOEAeYXT2zJ1JxvEYaDlByEuqAt8XcKBvlCq9KWzbsPRBKrwzXTnH0sdwiHZ8os7gjdXOVjBpUpyuzmYvdDoiyLlG5rl3DTsOWttObf0GFSoI3CIbP8fo+2IyX7hp2Ay1NvizeKTzhWhDKELSUA7IxgA5OiIAMRocvw/no1DYnt3H3uX5uVpLcwoVTIA0VinOuUFVwjKuU73AcnxOjA33I7gKF7vpH4iwxBfIS60rAD2x0AdciT0YFuA+e4Che7y/V3GWBufI7AS63kLLeQsWSWKpJtBTjqCdngK5HuAXvcv1dxlo2Az1H0E4yRAEkJyhOFU4EgDgfNEWh95/nuNdfL9XcZGButwDnhZN9cSnISwUN4jlElkfhLencaq4dE4XB0BH0W/wByPIXIgSwpiJdQ5zKLu0BcolySde41eV83JEl2HQjtPdkpHkq46dgBliLfzjuUzWJGX6q2SG6HoV/oGSOybEWW6Nzb5BKotQe3cpchj8OCqnIK0OREcYUdJYFAXBQyeYS0ogwEc5hd6gl4RLkk5DA3MdewfKDlV7xsdUYp7jO6T10SvfJ0BAGAHlaMLwX9YlXGuKY+Ls85YG2Yw2TYb8wQOnuIEN/xHGjwirJLZGJj24YC5KYf6jrSwG8kwRslzQf4ZOTFuQcaIPmI0F1F6RwryOYYqsyaSPbSAA5KeciqfwDSaJqPDTRFIWIx4Awech9IBGjDAE5mpxDmxTFhQNy47ayG5P4L1hsGHDQhYLzfDcxfXziA5ZAiqRKJztk5I6OU66ZAaVJ2T5RYdssjqgAAAoPwa8WOp7Q2TGqkcwpiM/QScGotiA5AFSjDgKQeMfsadHmkR2R7Ovx/CmDcfI0DvUZPZOJWCVMPTUMnCEMBJNgnygaCw6LlsmyHYjWalBA6D8HQvCEBsnslAGri1cHEAMDhEXdxQbH4KyXogrmBQ2U+wW6Tw6kxvAdi9SPwvRyCWDoKzUynBrLFo2A9ARg/yYikN4VSByMpw1igCNAg7E5/D+CSwcoKjUzkk17ANwLDkxSao3R1VDhBgQWA1EQBgBU1/GTWY3wAJLAOVQu0W7I4zX/BSa/LwCBhV4w4gzATBN7oSGSDPlAsAI3RR4cFUoBvj6PdiM0dxDRXB/AmeIyPBTQMDQoGBuoK98AY8hRuNX4AdBA6MdqS/Y4lOtHtN0QMQGRUZShhUwgGDZDANJZSSpUxHEMUEONiHOHrNV37IIxIdXRyYgIiBllUHcZzvwaGgIodydlDENsUnQIGQlg5QVGssjwUAWuQ49RggucKm5Wl7iAy4J+VbwwEdReUCDIL56yD9kQhHJ7IHGYhRmNaSbbyHqMa1Iiz5wVV3EBAOTjboRF0AAABkieZyiTggFiyDAJTQekg1yOWIZeh7D04NChTHslAghxONMGyIYG3Ikk5Lnsw0UgjUJsmehAghwXCAxbkCrWyE5wHc1D+aGRHskqkeSEABwQcaIZHrThbmLFM0ByFzeiJqMF0fMJFW2QmBJTSj3It8ZvgwPI2RWjKj2WuIDlhVeVXJMhVJzkqwOCv9Kqo+e1jPrFFC+ZRAvTD3oAv4oKOiNNFwvGHvxzBTNMalClDfTIIDQ1K0W52FbgeMAKID9R4w1U6GyMCUNCdZ7F+UJTqXtiASWAcoxAOyxUVt6DjudfWsaI+OcELcOUyiSomU4WI4T0EQdx5KfJiOjMICDTAlqqp9gmurLIE1lQp8YNxCDkAAGCaoWu4hUFBvhJl/Yd2BE5EHZVZlK4e9VEeUwTVwjNzYpmvpT1WfWUDJxC4BtgbDcYYZIeS9XVTgcLIEEOCiAagHBCkAVUoaZDfxi6KTJ7zRFHJ5lAUOC+QKr284NIqaYQHldMFCDyn/wB0CHYDynvmbYECXEHZMP8AcJrHomGoknqufKnqboEGhT7eBdaO9Bbv9NHlGnIcgtN+CjqEaJHKqi8rU0e5VVqMWKu+9b1SsnkL6QiQOAblOQB0T8H9GoA8qhIANB5CGsRD/tL/AGEdES01wCNObl/8UP/aAAwDAQACAAMAAAAQCCS//DR99tBBBBR1+++++++++8xBBBBF995DX/6CCCC2/vDV99tBBJBBRx888885xBBBBBF999BH/wD4gqggkv8A8sHX321GqkIEEEEEEEEEEEEEX332EP8A/wCggvigglv/AMsHX32zD6IkEEEEEEEEEEF3332EN/8A6CCC+uCCC2//ACosfffVnYsCAQQQQRzTfffeYQ3/AP6IIIb764IILb+7d3rX1a/Hk03gk03sMzT3EEd//wCiCCG+2++KCCC2/O/hBV299e99OKf9/wBj+gQz/wD/AOiCCCe+S+++KCCCy/8A1T1ggYs8vjPfucYUih3/AP8A6CCCCe++CS+++KCCCS2V/qPLJahdCBqDDDL/AP8A/wDyCCCCe++6LCS+++OCCCC72v8A/wD1r9852Zr/APp//wAgggghvvvugrQwkvvvrigkiQl8unv/AOn+U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\"), url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\");\n  uri-fragment: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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#fragment\");\n}\n#data-uri-guess {\n  uri: url(\"data:image/jpeg;base64,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U3v/APtyCCCCCO+++6CD9tLCS2+++OCpCVCBCyyhylaHiCBCCCCGe+++yCDf999LDC2++++lCcJTCCCxCBCpCQJCCGe++++iCDf9R999LDCS2+62P888f7IhCZCvKPMP+++++yCCHd99BR999vDCCy188888885AOtK4+P3j+++yCCDP999xBBB1999PDU88888888j8P9pr1V496yCDBHf999hBtBBBR9999l88888888n8nWp8fvfCBCDTV9995BBB9tBBBBx9938888888708XEy/8880Mrz+d95hBBBN899JBBBBxe/888888v8AO/JwFuPPPPPPOOYQQQRXfdPPfbSQQQQ6d/8Az9/3/wA/8sd5FdZbz8wwBBBBN998AQ8899tJBBRjFHEyUnQGzgdp9hWxhwBBBBN99984AAA08899tNBBg18vro5/j0PfvfoBBBBFN99984gAOAAAQ088999NNBBBDJ0AATAQ/RBBFN999988wAAA+uIAAAQw8899999NNNNNOcuetN99999884wAAAAO+++uKAAAAw088899999999999998888wgAAAAO++C2+++uKAAAAAQw0888888888888wwAAAAAAO++++CCS2+++uOCAAAAAAAAAQwwAAAAAAAAAAGe++++yC/8QAJhEBAAICAgEDBAMBAAAAAAAAAQARITEQQUAgUWEwUHGRcIHRof/aAAgBAwEBPxD7r3B7/H2eyo5KiFOmDrZvrERI/ZU7w7ht4fmELvyzKzuT3+PsJRst+qmFGxyejqKmnJUB1mWdtvtojstnqrT3Guuh+/HBzQkwZiUOjVXLd/b/AHlj+07hN4fmXD/LN8Mx2Kz/ALMgE1NcEwaaMMQ4mbhTfv8AuEEaeMRRs+Z1YR5d8vtwFQwlRAU1H14zLqtXymWZI4qojvyHfBvkjge4fTPuOAau/wAzHPEfQbj5Dvg3z1EIunX9QAXK41sorfdxKa4fQb8l3wb5Yt2xgxa/8lo0o7jALoZorWz/ACFWg5PJd8G+XfJvgDayWS0pCkFu3PXku+DfBv0HFudTBVn6iqlrz15LKuF2p8Eo69HXBx1wAvUAKWP2eThgA16EHcU1wDx1wJASg0QT2FjmWEqLsHse78evL6DL8kSo8UL4SXT2hVlXLg10eNiPovA5RzDYIlkRGmdcPoNgjjwRi/on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\");\n}\n#data-uri-ascii {\n  uri-1: url(\"data:text/html,%3Chtml%3E%3Ch1%3EThis%20page%20is%20100%25%20Awesome.%3C%2Fh1%3E%3C%2Fhtml%3E%0A\");\n  uri-2: url(\"data:text/html,%3Chtml%3E%3Ch1%3EThis%20page%20is%20100%25%20Awesome.%3C%2Fh1%3E%3C%2Fhtml%3E%0A\");\n}\n#file-functions {\n  svg-not-base-64: url(\"data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20standalone%3D%22no%22%3F%3E%0A%3Csvg%20height%3D%22100%22%20width%3D%22100%22%3E%0A%20%20%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2240%22%20stroke%3D%22black%22%20stroke-width%3D%221%22%20fill%3D%22blue%22%20%2F%3E%0A%3C%2Fsvg%3E%0A\");\n  size: 640px 430px;\n  width: 640px;\n  height: 430px;\n}\n#svg-functions {\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23000000%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%220%25%22%20stop-color%3D%22%23000000%22%2F%3E%3Cstop%20offset%3D%223%25%22%20stop-color%3D%22%23ffa500%22%2F%3E%3Cstop%20offset%3D%22100%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n  background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%201%201%22%3E%3ClinearGradient%20id%3D%22g%22%20x1%3D%220%25%22%20y1%3D%220%25%22%20x2%3D%220%25%22%20y2%3D%22100%25%22%3E%3Cstop%20offset%3D%221%25%22%20stop-color%3D%22%23c4c4c4%22%2F%3E%3Cstop%20offset%3D%223%25%22%20stop-color%3D%22%23ffa500%22%2F%3E%3Cstop%20offset%3D%225%25%22%20stop-color%3D%22%23008000%22%2F%3E%3Cstop%20offset%3D%2295%25%22%20stop-color%3D%22%23ffffff%22%2F%3E%3C%2FlinearGradient%3E%3Crect%20x%3D%220%22%20y%3D%220%22%20width%3D%221%22%20height%3D%221%22%20fill%3D%22url(%23g)%22%20%2F%3E%3C%2Fsvg%3E');\n}\n@font-face {\n  font-family: 'MyWebFont';\n  src: url(webfont.eot);\n  src: url('webfont.eot?#iefix') format('embedded-opentype'), url('webfont.woff') format('woff'), format('truetype') url('webfont.ttf'), url('webfont.svg#svgFontName') format('svg');\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/urls/urls.less",
    "content": "@import \"nested-gradient-with-svg-gradient/mixin-consumer.less\";\n\n@font-face {\n  src: url(\"/fonts/garamond-pro.ttf\");\n  src: local(Futura-Medium),\n       url(fonts.svg#MyGeometricModern) format(\"svg\");\n  not-a-comment: url(//z);\n}\n#shorthands {\n  background: url(\"http://www.lesscss.org/spec.html\") no-repeat 0 4px;\n  background: url(\"img.jpg\") center / 100px;\n  background: #fff url(image.png) center / 1px 100px repeat-x scroll content-box padding-box;\n}\n#misc {\n  background-image: url(images/image.jpg);\n}\n#data-uri {\n  background: url(data:image/png;charset=utf-8;base64,\n    kiVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/\n    k//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U\n    kg9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC);\n  background-image: url(data:image/x-png,f9difSSFIIGFIFJD1f982FSDKAA9==);\n  background-image: url(http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700);\n  background-image: url(\"http://fonts.googleapis.com/css?family=\\\"Rokkitt\\\":\\(400\\),700\");\n}\n\n#svg-data-uri {\n  background: transparent url('data:image/svg+xml, <svg version=\"1.1\"><g></g></svg>');\n}\n\n.comma-delimited {\n  background: url(bg.jpg) no-repeat, url(bg.png) repeat-x top left, url(bg);\n}\n.values {\n    @a: 'Trebuchet';\n    url: url(@a);\n}\n\n@import \"import/import-and-relative-paths-test\";\n\n#relative-url-import {\n    .unquoted-relative-path-bg();\n    .quoted-relative-path-border-image();\n}\n\n#data-uri {\n  uri: data-uri('image/jpeg;base64', '../../data/image.jpg');\n  @var: replace('../../data/replace.jpg', \"replace\", \"image\");\n  background-image: data-uri(@var), data-uri(replace('../../data/image.filext', \"filext\", \"jpg\"));\n\n  uri-fragment: data-uri('image/jpeg;base64', '../../data/image.jpg#fragment');\n}\n\n#data-uri-guess {\n  uri: data-uri('../../data/image.jpg');\n}\n\n#data-uri-ascii {\n  uri-1: data-uri('text/html', '../../data/page.html');\n  uri-2: data-uri('../../data/page.html');\n}\n\n#file-functions {\n  svg-not-base-64: data-uri('../../data/image.svg');\n  size: image-size('../../data/data-uri-fail.png');\n  width: image-width('../../data/data-uri-fail.png');\n  height: image-height('../../data/data-uri-fail.png');\n}\n.add_an_import(@file_to_import) {\n@import \"@{file_to_import}\";\n}\n\n.add_an_import(\"file.css\");\n\n#svg-functions {\n  background-image: svg-gradient(to bottom, black, white);\n  background-image: svg-gradient(to bottom, black, orange 3%, white);\n  @green_5: green 5%;\n  @orange_percentage: 3%;\n  @orange_color: orange;\n  background-image: svg-gradient(to bottom, (mix(black, white) + #444) 1%, @orange_color @orange_percentage, ((@green_5)), white 95%);\n}\n//it should work also inside @font-face #2035\n@font-face {\n  font-family: 'MyWebFont';\n  src: url(webfont.eot);\n  src+: url('webfont.eot?#iefix');\n  src+_: format('embedded-opentype');\n  src+: url('webfont.woff') format('woff');\n  src+: format('truetype');\n  src+_: url('webfont.ttf');\n  src+: url('webfont.svg#svgFontName') format('svg');\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/variables/variable-advanced.css",
    "content": ".alpha {\n  filter: alpha(opacity=42);\n}\n.units-extended {\n  width: 1px;\n  same-unit-as-previously: 1px;\n  square-pixel-divided: 1px;\n  odd-unit: 2;\n  percentage: 500%;\n  pixels: 500px;\n  conversion-metric-a: 30mm;\n  conversion-metric-b: 3cm;\n  conversion-imperial: 3in;\n  custom-unit: 420octocats;\n  custom-unit-cancelling: 18dogs;\n  mix-units: 2px;\n  invalid-units: 1px;\n}\n.units-extended .fallback {\n  div-px-1: 10px;\n  div-px-2: 1px;\n  sub-px-1: 12.6px;\n  sub-cm-1: 9.666625cm;\n  mul-px-1: 19.6px;\n  mul-em-1: 19.6em;\n  mul-em-2: 196em;\n  mul-cm-1: 196cm;\n  add-px-1: 15.4px;\n  add-px-2: 393.35275591px;\n  mul-px-2: 140px;\n  mul-px-3: 140px;\n}\n.css-custom-properties {\n  --tw-pan-x: ;\n  --tw-pan-y: ;\n  --tw-pinch-zoom: ;\n  --tw-scroll-snap-strictness: proximity;\n}\n.variable-interpolation .radio_checked {\n  border-color: #fff;\n}\n.each-with-variables div#apple {\n  color: blue;\n}\n.each-with-variables div#banana {\n  color: blue;\n}\n.each-with-variables div#cherry {\n  color: blue;\n}\n.each-with-variables div#carrot {\n  color: blue;\n}\n.each-with-variables div#potato {\n  color: blue;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/variables/variable-advanced.less",
    "content": "// Advanced variable features not covered in existing tests\n@a: 2;\n@c: #888;\n@onePixel: 1px;\n\n.alpha {\n    @var: 42;\n    filter: alpha(opacity=@var);\n}\n\n.units-extended {\n  width: @onePixel;\n  same-unit-as-previously: (@onePixel / @onePixel);\n  square-pixel-divided: (@onePixel * @onePixel / @onePixel);\n  odd-unit: unit((@onePixel * 4em / 2cm));\n  percentage: (10 * 50%);\n  pixels: (50px * 10);\n  conversion-metric-a: (20mm + 1cm);\n  conversion-metric-b: (1cm + 20mm);\n  conversion-imperial: (1in + 72pt + 6pc);\n  custom-unit: (42octocats * 10);\n  custom-unit-cancelling: (8cats * 9dogs / 4cats);\n  mix-units: (1px + 1em);\n  invalid-units: (1px * 1px);\n  .fallback {\n    @px: 14px;\n    @em: 1.4em;\n    @cm: 10cm;\n    div-px-1: (@px / @em);\n    div-px-2: ((@px / @em) / @cm);\n    sub-px-1: (@px - @em);\n    sub-cm-1: (@cm - (@px - @em));\n    mul-px-1: (@px * @em);\n    mul-em-1: (@em * @px);\n    mul-em-2: ((@em * @px) * @cm);\n    mul-cm-1: (@cm * (@em * @px));\n    add-px-1: (@px + @em);\n    add-px-2: ((@px + @em) + @cm);\n    mul-px-2: ((1 * @px) * @cm);\n    mul-px-3: ((@px * 1) * @cm);\n  }\n}\n\n.css-custom-properties {\n\t--tw-pan-x:  ;\n\t--tw-pan-y:  ;\n\t--tw-pinch-zoom:  ;\n\t--tw-scroll-snap-strictness: proximity;\n}\n\n.variable-interpolation {\n  @a1: 1px;\n  @b2: 2px;\n  @c3: @a1 + @b2;\n\n  @radio-cls: radio;\n  @radio-cls-checked: @{radio-cls}_checked;\n\n  .@{radio-cls-checked} {\n    border-color: #fff;\n  }\n}\n\n.each-with-variables {\n  @items:\n  // Fruit\n      apple,\n      banana,\n      cherry,\n  // Vegetables\n      carrot,\n      potato,\n  ;\n\n  each(@items, {\n    div#@{value} {\n      color: blue;\n    }\n  })\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/variables/variables.css",
    "content": ".variables-basic {\n  width: 14cm;\n  height: 24px;\n  color: #888;\n  font-family: \"Trebuchet MS\", Verdana, sans-serif;\n  quotes: \"~\" \"~\";\n}\n.variable-dash {\n  padding: 30px 15px;\n}\n.variable-redefinition {\n  zero: 0;\n}\n.variable-scope {\n  three: 3;\n}\n.variable-important {\n  minus-one: -1;\n  font-family: 'Trebuchet', 'Trebuchet', 'Trebuchet';\n  color: #888 !important;\n  same-color: #888 !important;\n  same-again: #888 !important;\n  multi-important: #888 #888, 'Trebuchet' !important;\n  multi: something 'A', B, C, 'Trebuchet';\n}\n.variable-names-quoted {\n  name: 'hello';\n}\n.variable-names-unquoted {\n  name: 'hello';\n}\n.variable-names-color-keyword {\n  name: 'hello';\n}\n.variable-units {\n  width: 1px;\n  same-unit-as-previously: 1px;\n  square-pixel-divided: 1px;\n  odd-unit: 2;\n}\n.variable-pollution {\n  a: 'no-pollution';\n}\n.icon-5_large {\n  background-image: url(/img/icon/5_large.svg);\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/variables/variables.less",
    "content": "@a: 2;\n@x: (@a * @a);\n@y: (@x + 1);\n@z: (@x * 2 + @y);\n@var: -1;\n@b: @a * 10;\n@c: #888;\n@fonts: \"Trebuchet MS\", Verdana, sans-serif;\n@f: @fonts;\n@quotes: \"~\" \"~\";\n@q: @quotes;\n@onePixel: 1px;\n\n.variables-basic {\n  width: (@z + 1cm);\n  height: (@b + @x + 0px);\n  color: @c;\n  font-family: @f;\n  quotes: @q;\n}\n\n.variable-dash {\n  @jumbotron-padding: 30px;\n  padding: @jumbotron-padding (@jumbotron-padding/2);\n}\n\n.variable-redefinition {\n  @var: 0;\n  zero: @var;\n}\n\n.variable-scope {\n  @var: 4;\n  @var: 2;\n  three: @var;\n  @var: 3;\n}\n\n.variable-important {\n  @important-var: @c !important;\n  @important-var-two: @a !important;\n  minus-one: @var;\n  @a: 'Trebuchet';\n  @multi: 'A', B, C;\n  font-family: @a, @a, @a;\n  color: @c !important;\n  same-color: @important-var;\n  same-again: @important-var !important;\n  multi-important: @important-var @important-var, @important-var-two;\n  multi: something @multi, @a;\n}\n\n.variable-names-quoted {\n  @var: 'hello';\n  @name: 'var';\n  name: @@name;\n}\n\n.variable-names-unquoted {\n  @var: 'hello';\n  @name: var;\n  name: @@name;\n}\n\n.variable-names-color-keyword {\n  @red: 'hello';\n  @name: red;\n  name: @@name;\n}\n\n.variable-units {\n  width: @onePixel;\n  same-unit-as-previously: (@onePixel / @onePixel);\n  square-pixel-divided: (@onePixel * @onePixel / @onePixel);\n  odd-unit: unit((@onePixel * 4em / 2cm));\n}\n\n.variable-pollution {\n  @a: 'no-pollution';\n  a: @a;\n}\n\n.polluteMixin() {\n  @a: 'pollution';\n}\n\n\n\n// https://github.com/less/less.js/issues/2462\n@type: 5_large;\n.icon-@{type} {\n  background-image: ~\"url(/img/icon/@{type}.svg)\";\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/variables-in-at-rules/variables-in-at-rules.css",
    "content": "@charset \"UTF-8\";\n@namespace less \"http://lesscss.org\";\n@keyframes enlarger {\n  from {\n    font-size: 12px;\n  }\n  to {\n    font-size: 15px;\n  }\n}\n@-webkit-keyframes reducer {\n  from {\n    font-size: 13px;\n  }\n  to {\n    font-size: 10px;\n  }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/variables-in-at-rules/variables-in-at-rules.less",
    "content": "@Eight: 8;\n@charset \"UTF-@{Eight}\";\n\n@ns: less;\n@namespace @ns \"http://lesscss.org\";\n\n@name: enlarger;\n@keyframes @name {\n    from {font-size: 12px;}\n    to   {font-size: 15px;}\n}\n\n.m(reducer);\n.m(@name) {\n    @-webkit-keyframes @name {\n        from {font-size: 13px;}\n        to   {font-size: 10px;}\n    }\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/whitespace/whitespace.css",
    "content": ".whitespace {\n  color: white;\n}\n.whitespace {\n  color: white;\n}\n.whitespace {\n  color: white;\n}\n.whitespace {\n  color: white;\n}\n.whitespace {\n  color: white ;\n}\n.white,\n.space,\n.mania {\n  color: white;\n}\n.no-semi-column {\n  color: white;\n}\n.no-semi-column {\n  color: white;\n  white-space: pre;\n}\n.no-semi-column {\n  border: 2px solid white;\n}\n.newlines {\n  background: the,\n              great,\n              wall;\n  border: 2px\n          solid\n          black;\n}\n.sel .newline_ws .tab_ws {\n  color: white;\n  background-position: 45 -23;\n}\n"
  },
  {
    "path": "packages/test-data/tests-unit/whitespace/whitespace.less",
    "content": "// Whitespace handling tests\n\n\n.whitespace\n  { color: white; }\n\n.whitespace\n{\n  color: white;\n}\n  .whitespace\n{ color: white; }\n\n.whitespace{color:white;}\n.whitespace { color : white ; }\n\n.white,\n.space,\n.mania\n{ color: white; }\n\n.no-semi-column { color: white }\n.no-semi-column {\n  color: white;\n  white-space: pre\n}\n.no-semi-column {border: 2px solid white}\n.newlines {\n  background: the,\n              great,\n              wall;\n  border: 2px\n          solid\n          black;\n}\n.empty {\n\n}\n.sel\n.newline_ws .tab_ws {\ncolor:\nwhite;\nbackground-position: 45\n-23;\n}\n"
  },
  {
    "path": "packages/test-import-module/one/1.less",
    "content": ".one {\n  color: red;\n}\n"
  },
  {
    "path": "packages/test-import-module/one/two/2.less",
    "content": ".two {\n  color: blue;\n}\n"
  },
  {
    "path": "packages/test-import-module/one/two/three/3.less",
    "content": ".three {\n  color: green;\n}\n"
  },
  {
    "path": "packages/test-import-module/package.json",
    "content": "{\n\t\"name\": \"@less/test-import-module\",\n\t\"private\": true,\n\t\"version\": \"4.6.3\",\n\t\"description\": \"Less files to be included in node_modules directory for testing import from node_modules\",\n\t\"author\": \"Alexis Sellier <self@cloudhead.net>\",\n\t\"contributors\": [\n\t\t\"The Core Less Team\"\n\t],\n\t\"license\": \"Apache-2.0\"\n}\n"
  },
  {
    "path": "pnpm-workspace.yaml",
    "content": "packages:\n  - 'packages/*'"
  },
  {
    "path": "scripts/bump-and-publish.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Version bumping and publishing script for Less.js monorepo\n * \n * This script:\n * 1. Determines the next version (patch increment or explicit)\n * 2. Updates all package.json files to the same version\n * 3. Creates and pushes an annotated git tag\n * 4. Publishes all packages to NPM\n * \n * Both master and alpha now use a PR-based release flow:\n *\n *   master → \"chore: release vX.Y.Z\" PR        created by create-release-pr.yml\n *   alpha  → \"chore: alpha release vX.Y.Z\" PR  created by create-release-pr.yml\n *\n * Merging the release PR lands the version-bump commit on the branch and\n * triggers this script.  At that point package.json already carries the\n * target version.  This script validates it, creates an annotated tag, pushes\n * the tag, and publishes to npm.  No local commit or branch push is made here.\n */\n\nconst fs = require('fs');\nconst path = require('path');\nconst { execSync } = require('child_process');\nconst semver = require('semver');\n\nconst ROOT_DIR = path.resolve(__dirname, '..');\nconst PACKAGES_DIR = path.join(ROOT_DIR, 'packages');\n\n// Get all package.json files\nfunction getPackageFiles() {\n  const packages = [];\n  \n  // Root package.json\n  const rootPkgPath = path.join(ROOT_DIR, 'package.json');\n  if (fs.existsSync(rootPkgPath)) {\n    packages.push(rootPkgPath);\n  }\n  \n  // Package directories\n  const packageDirs = fs.readdirSync(PACKAGES_DIR, { withFileTypes: true })\n    .filter(dirent => dirent.isDirectory())\n    .map(dirent => path.join(PACKAGES_DIR, dirent.name));\n  \n  for (const pkgDir of packageDirs) {\n    const pkgPath = path.join(pkgDir, 'package.json');\n    if (fs.existsSync(pkgPath)) {\n      packages.push(pkgPath);\n    }\n  }\n  \n  return packages;\n}\n\n// Read package.json\nfunction readPackage(pkgPath) {\n  return JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n}\n\n// Write package.json\nfunction writePackage(pkgPath, pkg) {\n  const content = JSON.stringify(pkg, null, '\\t') + '\\n';\n  fs.writeFileSync(pkgPath, content, 'utf8');\n}\n\n// Parse version string\nfunction parseVersion(version) {\n  const parts = version.split('.');\n  return {\n    major: parseInt(parts[0], 10),\n    minor: parseInt(parts[1], 10),\n    patch: parseInt(parts[2], 10),\n    prerelease: parts[3] || null\n  };\n}\n\n// Get current version from main package\nfunction getCurrentVersion() {\n  const lessPkgPath = path.join(PACKAGES_DIR, 'less', 'package.json');\n  const pkg = readPackage(lessPkgPath);\n  return pkg.version;\n}\n\n// Get the latest published version from NPM\nfunction getNpmVersion(packageName) {\n  try {\n    return execSync(`npm view ${packageName} version`, { encoding: 'utf8' }).trim();\n  } catch (e) {\n    // Package not yet published\n    return null;\n  }\n}\n\n// Get the current alpha dist-tag version from NPM\nfunction getNpmAlphaVersion(packageName) {\n  try {\n    const result = execSync(`npm view ${packageName} dist-tags.alpha`, { encoding: 'utf8' }).trim();\n    return result || null;\n  } catch (e) {\n    return null;\n  }\n}\n\n// Determine the target version for publishing.\n// Priority: EXPLICIT_VERSION env > package.json (if ahead of NPM) > NPM patch bump\nfunction getTargetVersion(currentVersion, npmVersion) {\n  // 1. Explicit override via environment variable\n  if (process.env.EXPLICIT_VERSION) {\n    console.log(`✨ Using explicit version from env: ${process.env.EXPLICIT_VERSION}`);\n    return process.env.EXPLICIT_VERSION;\n  }\n\n  // 2. If package.json is ahead of NPM, use it\n  if (npmVersion && semver.valid(currentVersion) && semver.gt(currentVersion, npmVersion)) {\n    console.log(`📦 package.json (${currentVersion}) is ahead of NPM (${npmVersion}), using it`);\n    return currentVersion;\n  }\n\n  // 3. Otherwise, bump from the latest NPM version\n  const base = npmVersion || currentVersion;\n  const next = semver.inc(base, 'patch');\n  console.log(`🔢 Auto-incrementing patch: ${base} → ${next}`);\n  return next;\n}\n\n// Update all package.json files with new version\nfunction updateAllVersions(newVersion) {\n  const packageFiles = getPackageFiles();\n  const updated = [];\n  \n  for (const pkgPath of packageFiles) {\n    const pkg = readPackage(pkgPath);\n    if (pkg.version) {\n      pkg.version = newVersion;\n      writePackage(pkgPath, pkg);\n      updated.push(pkgPath);\n    }\n  }\n  \n  return updated;\n}\n\n// Get packages that should be published (not private)\nfunction getPublishablePackages() {\n  const packageFiles = getPackageFiles();\n  const publishable = [];\n  \n  for (const pkgPath of packageFiles) {\n    const pkg = readPackage(pkgPath);\n    // Skip root package and private packages\n    if (!pkg.private && pkg.name && pkg.name !== '@less/root') {\n      publishable.push({\n        path: pkgPath,\n        name: pkg.name,\n        dir: path.dirname(pkgPath)\n      });\n    }\n  }\n  \n  return publishable;\n}\n\n// Main function\nfunction main() {\n  const dryRun = process.env.DRY_RUN === 'true' || process.argv.includes('--dry-run');\n  const branch = process.env.GITHUB_REF_NAME || execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf8' }).trim();\n  const isAlpha = branch === 'alpha';\n  const isMaster = branch === 'master';\n  \n  if (dryRun) {\n    console.log(`🧪 DRY RUN MODE - No changes will be committed or published\\n`);\n  }\n  \n  // Enforce branch restrictions - only allow publishing from master or alpha branches\n  if (!isMaster && !isAlpha) {\n    console.error(`❌ ERROR: Publishing is only allowed from 'master' or 'alpha' branches`);\n    console.error(`   Current branch: ${branch}`);\n    console.error(`   Please switch to 'master' or 'alpha' branch before publishing`);\n    process.exit(1);\n  }\n  \n  console.log(`🚀 Starting publish process for branch: ${branch}`);\n  \n  // Get current version\n  const currentVersion = getCurrentVersion();\n  console.log(`📦 Current version: ${currentVersion}`);\n\n  // Determine next version.\n  // Both master and alpha now use the PR-based release flow: the version bump\n  // was already applied by the release PR.  Use the version in package.json\n  // as-is and fail fast if it is not ahead of the already-published version.\n  let nextVersion;\n\n  if (isAlpha) {\n    // Validate that the version carries the expected '-alpha.' prerelease tag.\n    if (!currentVersion.includes('-alpha.')) {\n      console.error(`❌ ERROR: Alpha branch package.json version (${currentVersion}) must contain '-alpha.'`);\n      console.error(`   The alpha release PR should have bumped to an X.Y.Z-alpha.N version.`);\n      process.exit(1);\n    }\n\n    const npmAlphaVersion = getNpmAlphaVersion('less');\n    console.log(`📦 NPM alpha version: ${npmAlphaVersion || '(not published)'}`);\n    if (npmAlphaVersion && semver.valid(currentVersion) && !semver.gt(currentVersion, npmAlphaVersion)) {\n      console.error(`❌ ERROR: package.json version (${currentVersion}) must be greater than NPM alpha version (${npmAlphaVersion})`);\n      console.error(`   On alpha the version bump should have arrived via the alpha release PR.`);\n      process.exit(1);\n    }\n    nextVersion = currentVersion;\n    console.log(`📦 Using package.json version (no auto-increment on alpha): ${nextVersion}`);\n  } else {\n    // For master: the version bump was already applied via the release PR.\n    // Use the version already in package.json as-is; never auto-increment here\n    // because that would create a local commit whose tag would point to a\n    // commit that is NOT on the master branch.\n    const npmVersion = getNpmVersion('less');\n    console.log(`📦 NPM version: ${npmVersion || '(not published)'}`);\n    if (npmVersion && semver.valid(currentVersion) && !semver.gt(currentVersion, npmVersion)) {\n      console.error(`❌ ERROR: package.json version (${currentVersion}) must be greater than NPM version (${npmVersion})`);\n      console.error(`   On master the version bump should have arrived via the release PR.`);\n      process.exit(1);\n    }\n    nextVersion = currentVersion;\n    console.log(`📦 Using package.json version (no auto-increment on master): ${nextVersion}`);\n  }\n\n  // Get publishable packages\n  const publishable = getPublishablePackages();\n  console.log(`📦 Found ${publishable.length} publishable packages:`);\n  publishable.forEach(pkg => console.log(`   - ${pkg.name}`));\n\n  // Both master and alpha: the version-bump commit already lives on the branch\n  // (it came from the release PR).  Do NOT create another local commit or push\n  // to the branch — doing so would produce a tag pointing at a commit that is\n  // not on the target branch.\n  //\n  // Only the annotated tag is pushed.  Tag pushes bypass branch-protection\n  // \"require pull request\" rules.\n  \n  // Create tag\n  const tagName = `v${nextVersion}`;\n  console.log(`🏷️  Creating git tag: ${tagName}...`);\n  if (!dryRun) {\n    try {\n      execSync(`git tag -a \"${tagName}\" -m \"Release ${tagName}\"`, { \n        cwd: ROOT_DIR, \n        stdio: 'inherit' \n      });\n    } catch (e) {\n      console.log(`⚠️  Tag might already exist, continuing...`);\n    }\n  } else {\n    console.log(`   [DRY RUN] Would create tag: ${tagName}`);\n  }\n  \n  // For master the version-bump commit already lives in master (it came from\n  // the release PR).  Only push the git tag — tag pushes bypass branch\n  // protection \"require pull request\" rules.\n  // Alpha follows the same pattern: the version bump arrived via the alpha\n  // release PR, so we only push the tag here too.  console.log(`📤 Pushing tag ${tagName}...`);\n  if (!dryRun) {\n    execSync(`git push origin \"${tagName}\"`, { cwd: ROOT_DIR, stdio: 'inherit' });\n  } else {\n    console.log(`   [DRY RUN] Would push tag: origin ${tagName}`);\n  }\n  \n  // Validate alpha branch requirements\n  if (isAlpha) {\n    console.log(`\\n🔍 Validating alpha branch requirements...`);\n    \n    // Validation 1: Version must contain 'alpha'\n    if (!nextVersion.includes('-alpha.')) {\n      console.error(`❌ ERROR: Alpha branch version must contain '-alpha.'`);\n      console.error(`   Generated version: ${nextVersion}`);\n      console.error(`   Expected format: X.Y.Z-alpha.N`);\n      process.exit(1);\n    }\n    console.log(`✅ Version contains 'alpha' suffix: ${nextVersion}`);\n    \n    // Validation 2: Must publish with 'alpha' tag\n    // (This is enforced in the code below, but we log it for clarity)\n    console.log(`✅ Will publish with 'alpha' tag (enforced)`);\n    \n    // Validation 3: Check if alpha is behind master\n    try {\n      execSync('git fetch origin master:master 2>/dev/null || true', { cwd: ROOT_DIR });\n      const masterCommits = execSync('git rev-list --count alpha..master 2>/dev/null || echo \"0\"', { \n        cwd: ROOT_DIR, \n        encoding: 'utf8' \n      }).trim();\n      \n      if (parseInt(masterCommits, 10) > 0) {\n        console.error(`❌ ERROR: Alpha branch is behind master by ${masterCommits} commit(s)`);\n        console.error(`   Alpha branch must include all commits from master before publishing`);\n        console.error(`   Please merge master into alpha first`);\n        process.exit(1);\n      }\n      console.log(`✅ Alpha branch is up to date with master`);\n    } catch (e) {\n      console.log(`⚠️  Could not verify master sync status, continuing...`);\n    }\n    \n    // Validation 4: Alpha base version must be >= master version\n    try {\n      const masterVersionStr = execSync('git show master:packages/less/package.json 2>/dev/null', { \n        cwd: ROOT_DIR, \n        encoding: 'utf8' \n      });\n      const masterPkg = JSON.parse(masterVersionStr);\n      const masterVersion = masterPkg.version;\n      \n      // Extract base version from alpha version (remove -alpha.X)\n      const alphaBase = nextVersion.replace(/-alpha\\.\\d+$/, '');\n      \n      // Semver comparison using semver library\n      const isGreaterOrEqual = semver.gte(alphaBase, masterVersion);\n      \n      if (!isGreaterOrEqual) {\n        console.error(`❌ ERROR: Alpha base version (${alphaBase}) is lower than master version (${masterVersion})`);\n        console.error(`   According to semver, alpha base version must be >= master version`);\n        process.exit(1);\n      }\n      console.log(`✅ Alpha base version (${alphaBase}) is >= master version (${masterVersion})`);\n    } catch (e) {\n      console.log(`⚠️  Could not compare with master version, continuing...`);\n    }\n  }\n  \n  // Determine NPM tag based on branch and version\n  const npmTag = isAlpha ? 'alpha' : 'latest';\n  const isAlphaVersion = nextVersion.includes('-alpha.');\n  \n  // Validation: Alpha versions must use 'alpha' tag, non-alpha versions must use 'latest' tag\n  if (isAlphaVersion && npmTag !== 'alpha') {\n    console.error(`❌ ERROR: Alpha version (${nextVersion}) must be published with 'alpha' tag, not '${npmTag}'`);\n    console.error(`   Alpha versions cannot be published to 'latest' tag`);\n    process.exit(1);\n  }\n  \n  if (!isAlphaVersion && npmTag === 'alpha') {\n    console.error(`❌ ERROR: Non-alpha version (${nextVersion}) cannot be published with 'alpha' tag`);\n    console.error(`   Only versions containing '-alpha.' can be published to 'alpha' tag`);\n    process.exit(1);\n  }\n  \n  // Enforce alpha tag for alpha branch\n  if (isAlpha && npmTag !== 'alpha') {\n    console.error(`❌ ERROR: Alpha branch must publish with 'alpha' tag, not '${npmTag}'`);\n    process.exit(1);\n  }\n  \n  console.log(`\\n📦 Publishing packages to NPM with tag: ${npmTag}...`);\n  \n  const publishErrors = [];\n  \n  for (const pkg of publishable) {\n    console.log(`\\n📤 Publishing ${pkg.name}...`);\n    if (dryRun) {\n      console.log(`   [DRY RUN] Would publish: ${pkg.name}@${nextVersion} with tag: ${npmTag}`);\n      console.log(`   [DRY RUN] Command: npm publish --tag ${npmTag}`);\n    } else {\n      try {\n        // For scoped packages, ensure access is set correctly\n        const publishCmd = `npm publish --tag ${npmTag} --access public`;\n        execSync(publishCmd, { \n          cwd: pkg.dir, \n          stdio: 'inherit',\n          env: { ...process.env, NODE_AUTH_TOKEN: process.env.NPM_TOKEN }\n        });\n        console.log(`✅ Successfully published ${pkg.name}@${nextVersion}`);\n      } catch (e) {\n        const errorMsg = e.message || String(e);\n        console.error(`❌ Failed to publish ${pkg.name}: ${errorMsg}`);\n        publishErrors.push({ name: pkg.name, error: errorMsg });\n        // Continue with other packages instead of exiting immediately\n      }\n    }\n  }\n  \n  // Report any publish errors at the end\n  if (publishErrors.length > 0) {\n    console.error(`\\n❌ Publishing completed with ${publishErrors.length} error(s):`);\n    publishErrors.forEach(({ name, error }) => {\n      console.error(`   - ${name}: ${error}`);\n    });\n    console.error(`\\n⚠️  Note: Git tag was pushed successfully.`);\n    console.error(`   Some packages failed to publish. You may need to publish them manually.`);\n    process.exit(1);\n  }\n  \n  if (dryRun) {\n    console.log(`\\n🧪 DRY RUN COMPLETE - No changes were made`);\n    console.log(`   Would publish version: ${nextVersion}`);\n    console.log(`   Would create tag: ${tagName}`);\n    console.log(`   Would use NPM tag: ${npmTag}`);\n  } else {\n    console.log(`\\n🎉 Successfully published all packages!`);\n    console.log(`   Version: ${nextVersion}`);\n    console.log(`   Tag: ${tagName}`);\n    console.log(`   NPM Tag: ${npmTag}`);\n  }\n  \n  // Output version for GitHub Actions\n  if (process.env.GITHUB_OUTPUT) {\n    fs.appendFileSync(process.env.GITHUB_OUTPUT, `version=${nextVersion}\\n`);\n    fs.appendFileSync(process.env.GITHUB_OUTPUT, `tag=${tagName}\\n`);\n  }\n  \n  return { version: nextVersion, tag: tagName };\n}\n\n// Run if called directly\nif (require.main === module) {\n  main();\n}\n\nmodule.exports = { main };\n"
  },
  {
    "path": "scripts/post-merge-version-fix.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Post-merge hook to preserve alpha versions when merging master into alpha branch\n * \n * This script runs after a merge and checks if:\n * 1. We're on the alpha branch\n * 2. The version in package.json doesn't contain '-alpha.' (was overwritten)\n * 3. If so, restores the previous alpha version from git history\n */\n\nconst fs = require('fs');\nconst path = require('path');\nconst { execSync } = require('child_process');\n\nconst ROOT_DIR = path.resolve(__dirname, '..');\nconst LESS_PKG_PATH = path.join(ROOT_DIR, 'packages', 'less', 'package.json');\n\n// Get current branch\nfunction getCurrentBranch() {\n  try {\n    return execSync('git rev-parse --abbrev-ref HEAD', { \n      cwd: ROOT_DIR, \n      encoding: 'utf8' \n    }).trim();\n  } catch (e) {\n    return null;\n  }\n}\n\n// Read package.json version\nfunction getVersion(pkgPath) {\n  try {\n    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n    return pkg.version;\n  } catch (e) {\n    return null;\n  }\n}\n\n// Update version in package.json\nfunction updateVersion(pkgPath, newVersion) {\n  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n  pkg.version = newVersion;\n  fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, '\\t') + '\\n', 'utf8');\n}\n\n// Find last alpha version from git history\nfunction findLastAlphaVersion() {\n  try {\n    // Get recent commits on alpha that modified package.json\n    const commits = execSync(\n      'git log alpha --oneline -20 -- packages/less/package.json',\n      { cwd: ROOT_DIR, encoding: 'utf8' }\n    ).trim().split('\\n');\n    \n    // Search through commits to find the last alpha version\n    for (const commitLine of commits) {\n      const commitHash = commitLine.split(' ')[0];\n      try {\n        const pkgContent = execSync(\n          `git show ${commitHash}:packages/less/package.json 2>/dev/null`,\n          { cwd: ROOT_DIR, encoding: 'utf8' }\n        );\n        const pkg = JSON.parse(pkgContent);\n        if (pkg.version && pkg.version.includes('-alpha.')) {\n          return pkg.version;\n        }\n      } catch (e) {\n        // Continue to next commit\n      }\n    }\n  } catch (e) {\n    // Ignore errors\n  }\n  return null;\n}\n\n// Update all package.json files with new version\nfunction updateAllVersions(newVersion) {\n  const packageFiles = [\n    path.join(ROOT_DIR, 'package.json'),\n    path.join(ROOT_DIR, 'packages', 'less', 'package.json'),\n    path.join(ROOT_DIR, 'packages', 'test-data', 'package.json')\n  ];\n  \n  for (const pkgPath of packageFiles) {\n    if (fs.existsSync(pkgPath)) {\n      const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n      if (pkg.version) {\n        pkg.version = newVersion;\n        fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, '\\t') + '\\n', 'utf8');\n      }\n    }\n  }\n}\n\n// Main function\nfunction main() {\n  const branch = getCurrentBranch();\n  \n  // Only run on alpha branch\n  if (branch !== 'alpha') {\n    return;\n  }\n  \n  const currentVersion = getVersion(LESS_PKG_PATH);\n  \n  if (!currentVersion) {\n    return;\n  }\n  \n  // Check if version was overwritten (doesn't contain -alpha.)\n  if (!currentVersion.includes('-alpha.')) {\n    console.log(`\\n⚠️  Post-merge: Alpha version was overwritten (${currentVersion})`);\n    console.log(`   Attempting to restore alpha version...`);\n    \n    const lastAlphaVersion = findLastAlphaVersion();\n    \n    if (lastAlphaVersion) {\n      // Increment the alpha number\n      const alphaMatch = lastAlphaVersion.match(/^(\\d+\\.\\d+\\.\\d+)-alpha\\.(\\d+)$/);\n      if (alphaMatch) {\n        const alphaNum = parseInt(alphaMatch[2], 10);\n        const newAlphaVersion = `${alphaMatch[1]}-alpha.${alphaNum + 1}`;\n        console.log(`   Restoring and incrementing: ${lastAlphaVersion} → ${newAlphaVersion}`);\n        updateAllVersions(newAlphaVersion);\n        console.log(`✅ Restored alpha version: ${newAlphaVersion}`);\n        console.log(`   Please commit this change: git add package.json packages/*/package.json && git commit -m \"chore: restore alpha version after merge\"`);\n      } else {\n        console.log(`   Restoring to: ${lastAlphaVersion}`);\n        updateAllVersions(lastAlphaVersion);\n        console.log(`✅ Restored alpha version: ${lastAlphaVersion}`);\n        console.log(`   Please commit this change: git add package.json packages/*/package.json && git commit -m \"chore: restore alpha version after merge\"`);\n      }\n    } else {\n      // No previous alpha version found, create one\n      const parts = currentVersion.split('.');\n      const nextMajor = parseInt(parts[0], 10) + 1;\n      const newAlphaVersion = `${nextMajor}.0.0-alpha.1`;\n      console.log(`   No previous alpha version found. Creating: ${newAlphaVersion}`);\n      updateAllVersions(newAlphaVersion);\n      console.log(`✅ Created new alpha version: ${newAlphaVersion}`);\n      console.log(`   Please commit this change: git add package.json packages/*/package.json && git commit -m \"chore: restore alpha version after merge\"`);\n    }\n  }\n}\n\nif (require.main === module) {\n  main();\n}\n\nmodule.exports = { main };\n"
  },
  {
    "path": "scripts/publish-beta.js",
    "content": "#!/usr/bin/env node\n\n/**\n * Publish a beta release locally.\n * 1. Fetches latest version from npm\n * 2. Sets version to next patch + beta.0 (e.g. 4.6.2 → 4.6.3-beta.0)\n * 3. Updates all package.json files\n * 4. Builds and runs tests\n * 5. Publishes to npm with --tag beta (use NPM_TAG=xyz to override)\n *\n * Usage: pnpm run publish:beta\n *        pnpm run publish:beta -- --no-test      # skip tests\n *        pnpm run publish:beta -- --dry-run        # no publish\n *        NPM_TAG=next pnpm run publish:beta      # use different tag (default: beta)\n */\n\nconst fs = require('fs');\nconst path = require('path');\nconst { execSync } = require('child_process');\nconst semver = require('semver');\n\nconst ROOT_DIR = path.resolve(__dirname, '..');\nconst PACKAGES_DIR = path.join(ROOT_DIR, 'packages');\n\nfunction getPackageFiles() {\n  const packages = [path.join(ROOT_DIR, 'package.json')];\n  const dirs = fs.readdirSync(PACKAGES_DIR, { withFileTypes: true })\n    .filter(d => d.isDirectory())\n    .map(d => path.join(PACKAGES_DIR, d.name, 'package.json'))\n    .filter(p => fs.existsSync(p));\n  return [...packages, ...dirs];\n}\n\nfunction getNpmVersion(name) {\n  try {\n    return execSync(`npm view ${name} version`, { encoding: 'utf8' }).trim();\n  } catch {\n    return null;\n  }\n}\n\nfunction updateAllVersions(version) {\n  for (const pkgPath of getPackageFiles()) {\n    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n    if (pkg.version) {\n      pkg.version = version;\n      fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, '\\t') + '\\n');\n    }\n  }\n}\n\nfunction getPublishablePackages() {\n  const publishable = [];\n  for (const pkgPath of getPackageFiles()) {\n    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));\n    if (!pkg.private && pkg.name && pkg.name !== '@less/root') {\n      publishable.push({ name: pkg.name, dir: path.dirname(pkgPath) });\n    }\n  }\n  return publishable;\n}\n\nfunction main() {\n  const args = process.argv.slice(2);\n  const dryRun = args.includes('--dry-run');\n  const skipTest = args.includes('--no-test');\n  const npmTag = process.env.NPM_TAG || 'beta';\n\n  const npmVersion = getNpmVersion('less');\n  if (!npmVersion) {\n    console.error('Could not fetch latest version from npm');\n    process.exit(1);\n  }\n\n  const nextPatch = semver.inc(npmVersion, 'patch');\n  const betaVersion = `${nextPatch}-beta.0`;\n\n  console.log(`📦 NPM latest: ${npmVersion}`);\n  console.log(`🔢 Setting version: ${betaVersion}\\n`);\n\n  if (!dryRun) {\n    updateAllVersions(betaVersion);\n    console.log(`✅ Updated all package.json files\\n`);\n  } else {\n    console.log(`   [DRY RUN] Would update package.json files to ${betaVersion}\\n`);\n  }\n\n  console.log('🔨 Building...');\n  execSync('pnpm run build', { cwd: path.join(PACKAGES_DIR, 'less'), stdio: 'inherit' });\n  console.log('');\n\n  if (!skipTest) {\n    console.log('🧪 Running tests...');\n    execSync('pnpm run test:node', { cwd: ROOT_DIR, stdio: 'inherit' });\n    console.log('');\n  }\n\n  if (dryRun) {\n    console.log(`🧪 DRY RUN - Would publish ${betaVersion} with tag '${npmTag}'`);\n    return;\n  }\n\n  const publishable = getPublishablePackages();\n  console.log(`📤 Publishing to npm with tag '${npmTag}'...\\n`);\n\n  for (const pkg of publishable) {\n    console.log(`   Publishing ${pkg.name}@${betaVersion}...`);\n    execSync(`npm publish --tag ${npmTag} --access public`, {\n      cwd: pkg.dir,\n      stdio: 'inherit'\n    });\n  }\n\n  console.log(`\\n🎉 Published ${betaVersion} to npm`);\n  console.log(`   Install with: npm install less@${npmTag}`);\n}\n\nmain();\n"
  },
  {
    "path": "scripts/test-release-automation.js",
    "content": "#!/usr/bin/env node\n/**\n * Release-automation test suite\n *\n * Tests four components of the release flow without requiring a live\n * GitHub token or npm credentials:\n *\n *   1. publish.yml `if:` expression\n *      - master release PR merged → publish\n *      - alpha release PR merged  → publish (alpha tag)\n *      - other PRs / direct pushes → skip\n *\n *   2. create-release-pr.yml `if:` expression\n *      - normal merges to master or alpha → trigger\n *      - release PR merges (both flavours) → skip (loop guard)\n *\n *   3. Alpha version increment logic (from create-release-pr.yml)\n *      - Works for any X.Y.Z-alpha.N regardless of major version\n *      - Double-digit rollover (alpha.9 → alpha.10)\n *      - Non-alpha package.json on alpha branch → bump major, start alpha.1\n *\n *   4. bump-and-publish.js behaviour (subprocess, DRY_RUN=true)\n *      - master path: uses package.json version as-is, no commit, no branch push\n *      - master path: rejects when package.json version ≤ npm latest version\n *      - alpha path:  uses package.json version as-is, no commit, no branch push\n *      - alpha path:  rejects when package.json alpha version lacks '-alpha.'\n *\n *   5. create-release-pr no-op safety (isolated temp git repo)\n *      - when a version bump produces changes → a commit is created\n *      - when no version changes are needed  → exits cleanly with no commit\n *\n * Run:\n *   node scripts/test-release-automation.js\n *\n * Uses only Node.js built-ins.  semver is resolved from the workspace\n * node_modules (present after `pnpm install`).  In sandboxes where pnpm\n * install hasn't run, install it manually:\n *   npm install --prefix /tmp/test-deps semver\n */\n\n'use strict';\n\nconst assert = require('assert');\nconst fs     = require('fs');\nconst os     = require('os');\nconst path   = require('path');\nconst { spawnSync, execSync } = require('child_process');\n\nconst ROOT_DIR = path.resolve(__dirname, '..');\n\n// ---------------------------------------------------------------------------\n// Resolve semver — works both after `pnpm install` and in a bare sandbox\n// ---------------------------------------------------------------------------\n\nfunction resolveSemverPath() {\n  const candidates = [\n    path.join(ROOT_DIR, 'node_modules', 'semver'),\n    '/tmp/test-deps/node_modules/semver',\n  ];\n  for (const c of candidates) {\n    if (fs.existsSync(c)) return c;\n  }\n  return null;\n}\n\nconst SEMVER_PATH = resolveSemverPath();\n\n// ---------------------------------------------------------------------------\n// Tiny test harness (no external dependencies)\n// ---------------------------------------------------------------------------\n\nlet passed = 0;\nlet failed = 0;\nconst failures = [];\n\nfunction test(name, fn) {\n  try {\n    fn();\n    console.log(`  ✅ ${name}`);\n    passed++;\n  } catch (err) {\n    console.error(`  ❌ ${name}`);\n    console.error(`     ${err.message}`);\n    failures.push({ name, message: err.message });\n    failed++;\n  }\n}\n\nfunction section(title) {\n  console.log(`\\n── ${title}`);\n}\n\n// ---------------------------------------------------------------------------\n// Workflow condition helpers\n//\n// These replicate the job-level `if:` expressions from the YAML files\n// verbatim in JavaScript so the tests are authoritative.\n// ---------------------------------------------------------------------------\n\n/**\n * publish.yml `if:` condition:\n *\n *   github.repository == 'less/less.js' &&\n *   github.event.pull_request.merged == true &&\n *   (\n *     (github.event.pull_request.base.ref == 'master' &&\n *      startsWith(github.event.pull_request.title, 'chore: release v')) ||\n *     (github.event.pull_request.base.ref == 'alpha' &&\n *      startsWith(github.event.pull_request.title, 'chore: alpha release v'))\n *   )\n */\nfunction publishShouldRun({ repo, prMerged, prBaseRef, prTitle }) {\n  if (repo !== 'less/less.js') return false;\n  if (!prMerged) return false;\n\n  const isMasterRelease =\n    prBaseRef === 'master' &&\n    typeof prTitle === 'string' &&\n    prTitle.startsWith('chore: release v');\n\n  const isAlphaRelease =\n    prBaseRef === 'alpha' &&\n    typeof prTitle === 'string' &&\n    prTitle.startsWith('chore: alpha release v');\n\n  return isMasterRelease || isAlphaRelease;\n}\n\n/**\n * create-release-pr.yml `if:` condition:\n *\n *   github.repository == 'less/less.js' &&\n *   !contains(github.event.head_commit.message, 'chore: release v') &&\n *   !contains(github.event.head_commit.message, 'chore: alpha release v') &&\n *   !contains(github.event.head_commit.message, '/release-v') &&\n *   !contains(github.event.head_commit.message, '/alpha-release-v')\n */\nfunction createReleasePRShouldRun({ repo, commitMessage }) {\n  if (repo !== 'less/less.js') return false;\n  if (commitMessage.includes('chore: release v')) return false;\n  if (commitMessage.includes('chore: alpha release v')) return false;\n  if (commitMessage.includes('/release-v')) return false;\n  if (commitMessage.includes('/alpha-release-v')) return false;\n  return true;\n}\n\n/**\n * Alpha version increment — mirrors the inline Node script in\n * create-release-pr.yml \"Determine next version\" step for the alpha branch.\n *\n *   X.Y.Z-alpha.N  →  X.Y.Z-alpha.(N+1)\n *   X.Y.Z          →  (X+1).0.0-alpha.1   (no alpha suffix yet)\n */\nfunction nextAlphaVersion(current) {\n  const m = current.match(/^(\\d+\\.\\d+\\.\\d+)-alpha\\.(\\d+)$/);\n  if (m) {\n    return `${m[1]}-alpha.${parseInt(m[2], 10) + 1}`;\n  }\n  const parts = current.replace(/-.*/, '').split('.');\n  const nextMajor = parseInt(parts[0], 10) + 1;\n  return `${nextMajor}.0.0-alpha.1`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers: temporary git repo\n// ---------------------------------------------------------------------------\n\nfunction makeFakeRepo({ packageVersion }) {\n  const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'less-release-test-'));\n\n  // root package.json (private monorepo root)\n  fs.writeFileSync(\n    path.join(dir, 'package.json'),\n    JSON.stringify({ name: '@less/root', private: true, version: packageVersion }, null, '\\t') + '\\n',\n  );\n\n  // packages/less/package.json (the publishable package)\n  const pkgDir = path.join(dir, 'packages', 'less');\n  fs.mkdirSync(pkgDir, { recursive: true });\n  fs.writeFileSync(\n    path.join(pkgDir, 'package.json'),\n    JSON.stringify({ name: 'less', version: packageVersion }, null, '\\t') + '\\n',\n  );\n\n  // Minimal git repo\n  execSync('git init -b master', { cwd: dir, stdio: 'ignore' });\n  execSync('git config user.email \"test@test.com\"', { cwd: dir, stdio: 'ignore' });\n  execSync('git config user.name \"Test\"', { cwd: dir, stdio: 'ignore' });\n  execSync('git add .', { cwd: dir, stdio: 'ignore' });\n  execSync('git commit -m \"initial\"', { cwd: dir, stdio: 'ignore' });\n\n  return dir;\n}\n\n// ---------------------------------------------------------------------------\n// Run bump-and-publish.js in a fake repo\n//\n// Strategy: copy the script into the temp repo with ROOT_DIR patched so it\n// reads/writes from the temp dir.  semver is resolved via NODE_PATH.\n// ---------------------------------------------------------------------------\n\nfunction runBumpAndPublish(fakeRoot, extraEnv = {}) {\n  const scriptsDir = path.join(fakeRoot, 'scripts');\n  fs.mkdirSync(scriptsDir, { recursive: true });\n\n  // Read the production script and patch the ROOT_DIR line.\n  let src = fs.readFileSync(path.join(ROOT_DIR, 'scripts', 'bump-and-publish.js'), 'utf8');\n\n  // Remove shebang so Node can require() it without SyntaxError\n  src = src.replace(/^#!.*\\n/, '');\n\n  // Override ROOT_DIR to point at fakeRoot\n  src = src.replace(\n    /const ROOT_DIR\\s*=\\s*path\\.resolve\\(__dirname,\\s*'\\.\\.'\\s*\\);/,\n    `const ROOT_DIR = ${JSON.stringify(fakeRoot)};`,\n  );\n\n  // Redirect require('semver') to the resolved absolute path so the patched\n  // script works even when run from an isolated temp directory that has no\n  // node_modules of its own.\n  if (SEMVER_PATH) {\n    src = src.replace(\n      /require\\('semver'\\)/g,\n      `require(${JSON.stringify(SEMVER_PATH)})`,\n    );\n  }\n\n  const patchedScript = path.join(scriptsDir, '_bap_patched.cjs');\n  fs.writeFileSync(patchedScript, src);\n\n  const result = spawnSync('node', [patchedScript], {\n    cwd: fakeRoot,\n    env: {\n      ...process.env,\n      ...extraEnv,\n    },\n    encoding: 'utf8',\n  });\n\n  // Clean up patched script; ENOENT is fine if it was never written\n  try { fs.unlinkSync(patchedScript); } catch (e) { if (e.code !== 'ENOENT') throw e; }\n\n  return {\n    exitCode: result.status,\n    stdout: result.stdout || '',\n    stderr: result.stderr || '',\n  };\n}\n\n// ---------------------------------------------------------------------------\n// Run the core shell logic from create-release-pr.yml in an isolated repo.\n//\n// We run everything up to (but not including) `git push` and `gh pr create`\n// so we don't need network access.  The critical behaviour under test is\n// whether a commit is created when there are (or aren't) version changes.\n// ---------------------------------------------------------------------------\n\nfunction runCreateReleasePRStep({ repoDir, nextVersion, releaseBranch }) {\n  // Stub `gh` binary so any calls are recorded but do nothing\n  const binDir = path.join(repoDir, '.test-bin');\n  fs.mkdirSync(binDir, { recursive: true });\n  const ghLog = path.join(repoDir, 'gh-calls.log');\n  fs.writeFileSync(path.join(binDir, 'gh'), `#!/bin/sh\\necho \"$@\" >> \"${ghLog}\"\\n`);\n  fs.chmodSync(path.join(binDir, 'gh'), 0o755);\n\n  const initialHead = execSync('git rev-parse HEAD', { cwd: repoDir, encoding: 'utf8' }).trim();\n\n  const script = `\nset -euo pipefail\nNEXT_VERSION=${JSON.stringify(nextVersion)}\nRELEASE_BRANCH=${JSON.stringify(releaseBranch)}\nTITLE=\"chore: release v\\${NEXT_VERSION}\"\n\ngit checkout -b \"\\${RELEASE_BRANCH}\"\n\nnode -e \"\n  const fs = require('fs');\n  const version = process.env.NEXT_VERSION;\n  const dirs = fs.readdirSync('packages', { withFileTypes: true })\n    .filter(d => d.isDirectory())\n    .map(d => 'packages/' + d.name + '/package.json');\n  for (const f of ['package.json', ...dirs].filter(f => fs.existsSync(f))) {\n    const pkg = JSON.parse(fs.readFileSync(f, 'utf8'));\n    if (!pkg.version) continue;\n    pkg.version = version;\n    fs.writeFileSync(f, JSON.stringify(pkg, null, '\\\\t') + '\\\\n');\n  }\n\"\n\ngit add package.json packages/*/package.json\nCOMMITTED=false\nif git diff --cached --quiet; then\n  echo \"STATUS:NO_CHANGES\"\nelse\n  git commit -m \"\\${TITLE}\"\n  COMMITTED=true\nfi\necho \"STATUS:COMMITTED=\\${COMMITTED}\"\n`;\n\n  const result = spawnSync('bash', ['-c', script], {\n    cwd: repoDir,\n    env: {\n      ...process.env,\n      NEXT_VERSION: nextVersion,\n      GH_TOKEN: 'fake-token',\n      PATH: `${binDir}:${process.env.PATH}`,\n    },\n    encoding: 'utf8',\n  });\n\n  const finalHead = execSync('git rev-parse HEAD', { cwd: repoDir, encoding: 'utf8' }).trim();\n  const ghCalls = fs.existsSync(ghLog) ? fs.readFileSync(ghLog, 'utf8').trim() : '';\n\n  return {\n    exitCode: result.status,\n    stdout: result.stdout || '',\n    stderr: result.stderr || '',\n    initialHead,\n    finalHead,\n    newCommitCreated: finalHead !== initialHead,\n    ghCalls,\n  };\n}\n\n// ============================================================================\n// TEST SUITE\n// ============================================================================\n\n// ----------------------------------------------------------------------------\n// Section 1 — publish.yml trigger conditions\n// ----------------------------------------------------------------------------\n\nsection('1. publish.yml — workflow trigger conditions');\n\ntest('master release PR merged → SHOULD publish', () => {\n  assert.strictEqual(\n    publishShouldRun({\n      repo: 'less/less.js',\n      prMerged: true,\n      prBaseRef: 'master',\n      prTitle: 'chore: release v4.6.4',\n    }),\n    true,\n  );\n});\n\ntest('alpha release PR merged → SHOULD publish (alpha tag)', () => {\n  assert.strictEqual(\n    publishShouldRun({\n      repo: 'less/less.js',\n      prMerged: true,\n      prBaseRef: 'alpha',\n      prTitle: 'chore: alpha release v5.0.0-alpha.2',\n    }),\n    true,\n  );\n});\n\ntest('non-release PR merged into master → should NOT publish', () => {\n  assert.strictEqual(\n    publishShouldRun({\n      repo: 'less/less.js',\n      prMerged: true,\n      prBaseRef: 'master',\n      prTitle: 'fix: some bug fix',\n    }),\n    false,\n  );\n});\n\ntest('non-release PR merged into alpha → should NOT publish', () => {\n  assert.strictEqual(\n    publishShouldRun({\n      repo: 'less/less.js',\n      prMerged: true,\n      prBaseRef: 'alpha',\n      prTitle: 'feat: add something for next major',\n    }),\n    false,\n  );\n});\n\ntest('release PR closed but NOT merged → should NOT publish', () => {\n  assert.strictEqual(\n    publishShouldRun({\n      repo: 'less/less.js',\n      prMerged: false,\n      prBaseRef: 'master',\n      prTitle: 'chore: release v4.6.4',\n    }),\n    false,\n  );\n});\n\ntest('alpha release PR title used against master base → should NOT publish', () => {\n  // Wrong convention: \"chore: alpha release v\" into master should not trigger\n  assert.strictEqual(\n    publishShouldRun({\n      repo: 'less/less.js',\n      prMerged: true,\n      prBaseRef: 'master',\n      prTitle: 'chore: alpha release v5.0.0-alpha.1',\n    }),\n    false,\n  );\n});\n\ntest('wrong repository → should NOT publish', () => {\n  assert.strictEqual(\n    publishShouldRun({\n      repo: 'fork/less.js',\n      prMerged: true,\n      prBaseRef: 'master',\n      prTitle: 'chore: release v4.6.4',\n    }),\n    false,\n  );\n});\n\n// ----------------------------------------------------------------------------\n// Section 2 — create-release-pr.yml trigger conditions\n// ----------------------------------------------------------------------------\n\nsection('2. create-release-pr.yml — workflow trigger conditions');\n\ntest('normal merge to master → SHOULD trigger', () => {\n  assert.strictEqual(\n    createReleasePRShouldRun({ repo: 'less/less.js', commitMessage: 'fix: correct color parsing' }),\n    true,\n  );\n});\n\ntest('normal merge to alpha → SHOULD trigger', () => {\n  assert.strictEqual(\n    createReleasePRShouldRun({ repo: 'less/less.js', commitMessage: 'feat: new feature for next major' }),\n    true,\n  );\n});\n\ntest('master release PR merge → should NOT trigger (loop guard)', () => {\n  assert.strictEqual(\n    createReleasePRShouldRun({ repo: 'less/less.js', commitMessage: 'chore: release v4.6.4' }),\n    false,\n  );\n});\n\ntest('alpha release PR merge → should NOT trigger (loop guard)', () => {\n  assert.strictEqual(\n    createReleasePRShouldRun({ repo: 'less/less.js', commitMessage: 'chore: alpha release v5.0.0-alpha.2' }),\n    false,\n  );\n});\n\ntest('release branch ref in commit message → should NOT trigger (loop guard for master)', () => {\n  assert.strictEqual(\n    createReleasePRShouldRun({\n      repo: 'less/less.js',\n      commitMessage: 'Merge chore/release-v4.6.4 into master',\n    }),\n    false,\n  );\n});\n\ntest('alpha release branch ref in commit message → should NOT trigger (loop guard for alpha)', () => {\n  assert.strictEqual(\n    createReleasePRShouldRun({\n      repo: 'less/less.js',\n      commitMessage: 'Merge chore/alpha-release-v5.0.0-alpha.2 into alpha',\n    }),\n    false,\n  );\n});\n\ntest('wrong repository → should NOT trigger', () => {\n  assert.strictEqual(\n    createReleasePRShouldRun({ repo: 'fork/less.js', commitMessage: 'fix: something' }),\n    false,\n  );\n});\n\n// ----------------------------------------------------------------------------\n// Section 3 — Alpha version increment logic (from create-release-pr.yml)\n//\n// These are pure-logic tests of the nextAlphaVersion() helper, which mirrors\n// the inline Node script in the \"Determine next version\" step of the workflow.\n// This directly answers: \"does this work for 5.x alphas as well?\"\n// ----------------------------------------------------------------------------\n\nsection('3. create-release-pr.yml — alpha version increment logic');\n\ntest('4.x: 4.6.3-alpha.1 → 4.6.3-alpha.2', () => {\n  assert.strictEqual(nextAlphaVersion('4.6.3-alpha.1'), '4.6.3-alpha.2');\n});\n\ntest('5.x: 5.0.0-alpha.1 → 5.0.0-alpha.2  (answers the original question)', () => {\n  assert.strictEqual(nextAlphaVersion('5.0.0-alpha.1'), '5.0.0-alpha.2');\n});\n\ntest('5.x: 5.0.0-alpha.3 → 5.0.0-alpha.4  (preserves major, not 4.x)', () => {\n  assert.strictEqual(nextAlphaVersion('5.0.0-alpha.3'), '5.0.0-alpha.4');\n});\n\ntest('5.x minor/patch: 5.1.2-alpha.7 → 5.1.2-alpha.8', () => {\n  assert.strictEqual(nextAlphaVersion('5.1.2-alpha.7'), '5.1.2-alpha.8');\n});\n\ntest('double-digit rollover: 5.0.0-alpha.9 → 5.0.0-alpha.10  (integer, not string comparison)', () => {\n  assert.strictEqual(nextAlphaVersion('5.0.0-alpha.9'), '5.0.0-alpha.10');\n});\n\ntest('non-alpha version on alpha branch: 4.6.3 → 5.0.0-alpha.1  (bumps major, starts fresh)', () => {\n  assert.strictEqual(nextAlphaVersion('4.6.3'), '5.0.0-alpha.1');\n});\n\ntest('non-alpha 5.x version: 5.0.0 → 6.0.0-alpha.1', () => {\n  assert.strictEqual(nextAlphaVersion('5.0.0'), '6.0.0-alpha.1');\n});\n\n// ----------------------------------------------------------------------------\n// Section 4 — bump-and-publish.js master path\n// ----------------------------------------------------------------------------\n\nsection('4. bump-and-publish.js — master path (DRY_RUN=true)');\n\n// A version clearly higher than any real npm publish so validation passes\nconst MASTER_TEST_VERSION = '999.0.0';\n\ntest('master: uses package.json version as-is (no auto-increment)', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: MASTER_TEST_VERSION });\n  try {\n    const { exitCode, stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'master',\n      DRY_RUN: 'true',\n    });\n    assert.strictEqual(exitCode, 0, `Expected exit 0.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`);\n    assert.ok(\n      stdout.includes(MASTER_TEST_VERSION),\n      `Expected version ${MASTER_TEST_VERSION} in output.\\nSTDOUT: ${stdout}`,\n    );\n    assert.ok(\n      stdout.includes('no auto-increment on master') || stdout.includes('Using package.json version'),\n      `Expected \"no auto-increment\" message.\\nSTDOUT: ${stdout}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('master: no commit step (version bump is skipped)', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: MASTER_TEST_VERSION });\n  try {\n    const { stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'master',\n      DRY_RUN: 'true',\n    });\n    assert.ok(\n      !stdout.includes('[DRY RUN] Would commit'),\n      `Expected no commit step on master path.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('master: no branch push step', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: MASTER_TEST_VERSION });\n  try {\n    const { stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'master',\n      DRY_RUN: 'true',\n    });\n    assert.ok(\n      !stdout.includes('Would push to: origin master'),\n      `Expected no branch push on master path.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('master: rejects when package.json version ≤ npm published version', () => {\n  // 0.0.1 is well below the real npm \"less\" version, so validation should fail\n  const fakeDir = makeFakeRepo({ packageVersion: '0.0.1' });\n  try {\n    const { exitCode, stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'master',\n      DRY_RUN: 'true',\n    });\n    assert.notStrictEqual(exitCode, 0, `Expected non-zero exit.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`);\n    const combined = stdout + stderr;\n    assert.ok(\n      combined.includes('must be greater than NPM version') || combined.includes('ERROR'),\n      `Expected error message about version being too low.\\nCombined: ${combined}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\n// ----------------------------------------------------------------------------\n// Section 5 — bump-and-publish.js alpha path\n//\n// Alpha now uses the same PR-based flow as master: the version bump is applied\n// by the release PR, and bump-and-publish.js uses the existing version as-is.\n// ----------------------------------------------------------------------------\n\nsection('5. bump-and-publish.js — alpha path (DRY_RUN=true)');\n\ntest('alpha: uses package.json version as-is (no auto-increment)', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: '5.0.0-alpha.2' });\n  try {\n    const { exitCode, stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'alpha',\n      DRY_RUN: 'true',\n    });\n    assert.strictEqual(exitCode, 0, `Expected exit 0.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`);\n    assert.ok(\n      stdout.includes('5.0.0-alpha.2'),\n      `Expected version 5.0.0-alpha.2 in output.\\nSTDOUT: ${stdout}`,\n    );\n    assert.ok(\n      stdout.includes('no auto-increment on alpha') || stdout.includes('Using package.json version'),\n      `Expected \"no auto-increment\" message.\\nSTDOUT: ${stdout}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('alpha: no commit step (same as master)', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: '5.0.0-alpha.2' });\n  try {\n    const { stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'alpha',\n      DRY_RUN: 'true',\n    });\n    assert.ok(\n      !stdout.includes('[DRY RUN] Would commit'),\n      `Expected no commit step on alpha path.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('alpha: no branch push step (same as master)', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: '5.0.0-alpha.2' });\n  try {\n    const { stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'alpha',\n      DRY_RUN: 'true',\n    });\n    assert.ok(\n      !stdout.includes('Would push to: origin alpha'),\n      `Expected no branch push on alpha path.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('alpha: publishes with \"alpha\" npm tag (not \"latest\")', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: '5.0.0-alpha.2' });\n  try {\n    const { exitCode, stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'alpha',\n      DRY_RUN: 'true',\n    });\n    assert.strictEqual(exitCode, 0, `Expected exit 0.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`);\n    assert.ok(\n      stdout.includes('tag: alpha'),\n      `Expected npm tag \"alpha\" in output.\\nSTDOUT: ${stdout}`,\n    );\n    assert.ok(\n      !stdout.includes('tag: latest'),\n      `Expected no \"latest\" npm tag for alpha versions.\\nSTDOUT: ${stdout}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('alpha: rejects when package.json version lacks \"-alpha.\" suffix', () => {\n  // If somehow the alpha release PR bumped to a non-alpha version, the script\n  // must fail fast before publishing.\n  const fakeDir = makeFakeRepo({ packageVersion: '5.0.0' });\n  try {\n    const { exitCode, stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'alpha',\n      DRY_RUN: 'true',\n    });\n    assert.notStrictEqual(exitCode, 0, `Expected non-zero exit.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`);\n    const combined = stdout + stderr;\n    assert.ok(\n      combined.includes('-alpha.') || combined.includes('ERROR'),\n      `Expected error about missing '-alpha.' suffix.\\nCombined: ${combined}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\ntest('alpha: 4.x alpha version also accepted (4.6.3-alpha.2)', () => {\n  const fakeDir = makeFakeRepo({ packageVersion: '4.6.3-alpha.2' });\n  try {\n    const { exitCode, stdout, stderr } = runBumpAndPublish(fakeDir, {\n      GITHUB_REF_NAME: 'alpha',\n      DRY_RUN: 'true',\n    });\n    assert.strictEqual(exitCode, 0, `Expected exit 0.\\nSTDOUT: ${stdout}\\nSTDERR: ${stderr}`);\n    assert.ok(\n      stdout.includes('4.6.3-alpha.2'),\n      `Expected version 4.6.3-alpha.2 in output.\\nSTDOUT: ${stdout}`,\n    );\n  } finally {\n    fs.rmSync(fakeDir, { recursive: true, force: true });\n  }\n});\n\n// ----------------------------------------------------------------------------\n// Section 6 — create-release-pr no-op safety\n// ----------------------------------------------------------------------------\n\nsection('6. create-release-pr — no-op safety');\n\ntest('version bump needed: creates a commit on the release branch', () => {\n  // Repo starts at 4.6.3; bump target is 4.6.4 → files change → commit\n  const repoDir = makeFakeRepo({ packageVersion: '4.6.3' });\n  try {\n    const res = runCreateReleasePRStep({\n      repoDir,\n      nextVersion: '4.6.4',\n      releaseBranch: 'chore/release-v4.6.4',\n    });\n    assert.strictEqual(res.exitCode, 0, `Script exited ${res.exitCode}.\\nSTDOUT: ${res.stdout}\\nSTDERR: ${res.stderr}`);\n    assert.ok(res.newCommitCreated, 'Expected a new commit when versions differ');\n    assert.ok(\n      res.stdout.includes('STATUS:COMMITTED=true'),\n      `Expected COMMITTED=true status.\\nSTDOUT: ${res.stdout}`,\n    );\n  } finally {\n    fs.rmSync(repoDir, { recursive: true, force: true });\n  }\n});\n\ntest('no version bump needed: exits cleanly, no new commit, no gh calls', () => {\n  // Repo starts at 4.6.4 (target version) → no diff → no commit\n  const repoDir = makeFakeRepo({ packageVersion: '4.6.4' });\n  try {\n    const res = runCreateReleasePRStep({\n      repoDir,\n      nextVersion: '4.6.4',\n      releaseBranch: 'chore/release-v4.6.4',\n    });\n    assert.strictEqual(res.exitCode, 0, `Script exited ${res.exitCode}.\\nSTDOUT: ${res.stdout}\\nSTDERR: ${res.stderr}`);\n    assert.ok(!res.newCommitCreated, 'Expected NO new commit when version is already at target');\n    assert.ok(\n      res.stdout.includes('STATUS:NO_CHANGES'),\n      `Expected NO_CHANGES status.\\nSTDOUT: ${res.stdout}`,\n    );\n    assert.strictEqual(\n      res.ghCalls, '',\n      `Expected no gh commands to be invoked.\\ngh calls log: ${res.ghCalls}`,\n    );\n  } finally {\n    fs.rmSync(repoDir, { recursive: true, force: true });\n  }\n});\n\ntest('alpha version bump needed: commit created for alpha release branch', () => {\n  // Repo at 5.0.0-alpha.1; bump target is 5.0.0-alpha.2 → diff → commit\n  const repoDir = makeFakeRepo({ packageVersion: '5.0.0-alpha.1' });\n  try {\n    const res = runCreateReleasePRStep({\n      repoDir,\n      nextVersion: '5.0.0-alpha.2',\n      releaseBranch: 'chore/alpha-release-v5.0.0-alpha.2',\n    });\n    assert.strictEqual(res.exitCode, 0, `Script exited ${res.exitCode}.\\nSTDOUT: ${res.stdout}\\nSTDERR: ${res.stderr}`);\n    assert.ok(res.newCommitCreated, 'Expected a new commit for alpha version bump');\n    assert.ok(\n      res.stdout.includes('STATUS:COMMITTED=true'),\n      `Expected COMMITTED=true status.\\nSTDOUT: ${res.stdout}`,\n    );\n  } finally {\n    fs.rmSync(repoDir, { recursive: true, force: true });\n  }\n});\n\n// ============================================================================\n// Summary\n// ============================================================================\n\nconsole.log(`\\n${'─'.repeat(60)}`);\nconsole.log(`Results: ${passed} passed, ${failed} failed`);\n\nif (failures.length > 0) {\n  console.error('\\nFailed tests:');\n  failures.forEach(f => console.error(`  ✗ ${f.name}\\n    ${f.message}`));\n  process.exit(1);\n} else {\n  console.log('All release automation tests passed! ✅');\n}\n"
  }
]