[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "<img width=\"94\" height=\"71\" src=\"../logo.svg\" title=\"Autoprefixer logo by Anton Lovchikov\">\n\n# Contributing to Autoprefixer\n\n* [Filing Issues](#filing-issues)\n* [Getting Started](#getting-started)\n* [Adding a Prefix](#adding-a-prefix)\n\n\n## Filing Issues\n\n- If you have problems with the output CSS from Autoprefixer;\nyou’ll need to post:\n\n  1. Input CSS.\n  2. Output CSS.\n  3. Expected output CSS.\n  4. Browserslist config. If you use `browsers` or option,\n     create Browserslist config first.\n  5. Run `npm ls | grep autoprefixer` and check output.\n\n- If Autoprefixer throws error:\n\n  1. Input CSS.\n  2. Browserslist config.\n  3. Error stacktrace (copy and paste the error message that you get\n     so we can identify where the problem is).\n  4. Run `npm ls | grep autoprefixer` and check output.\n  5. Run `npm ls | grep postcss` and check output.\n\n\n## Getting Started\n\nBefore you begin contributing make sure you have a [GitHub account].\n\n* [Fork the repository](https://github.com/postcss/autoprefixer)\n* Clone a copy of it to your computer:\n  `git clone https://github.com/USERNAME/autoprefixer` (replace `USERNAME`\n  to your GitHub name).\n* Ensure that you have the [pnpm](https://pnpm.io/) package manager\n  installed.\n* Run `pnpm install` this will install all dependencies needed to run tests.\n\n[GitHub account]: https://github.com/signup/free\n\n\n## Adding a Prefix\n\nWe’ll explain how would you go about adding a CSS feature to Autoprefixer.\nFor example, we’ll add support for a CSS feature called `background-clip: text`.\n\nNote: Remember that the feature that you want to add must also be supported\non [Can I use](https://caniuse.com/).\n\n1. Create a topic branch from the `master` branch.\n   Like this: `git checkout -b background-clip-text`.\n\n2. To add support for a CSS feature you must call the convert function inside\n   of `data/prefixes.js` and specify three parameters: data, options\n   and a callback. Like this:\n\n   ```js\n   f(require('caniuse-lite/data/features/background-clip-text'), browsers =>\n     prefix(['background-clip'], {\n       feature: 'background-clip-text',\n       browsers\n     })\n   )\n   ```\n\n3. If the prefix is simple (`-webkit-` for Safari, `-moz-` for Firefox,\n  all use the same syntax) go to step 8.\n\n4. If you need some non-standard behavior for the prefix (`-webkit-` prefix\n   for Firefox or different syntax for different browsers) you will need\n   to create a “hack”. Create a JS file in the `libs/hacks` folder using\n   the name of the CSS feature as the filename.\n\n5. Check out other hacks for examples. In this new class change the prefix\n   for `IE` to `-webkit-`. [See complete example](https://github.com/postcss/Autoprefixer/blob/73c7b6ab090a9a9a03869b3099096af00be7eb7d/lib/hacks/background-clip.js)\n\n6. Load the new hack in `lib/prefixes.js`. Load it into `Declaration`\n   if you need a prefix for property name. Load it into `Value` if you need\n   a prefix for value.\n\n   ```js\n   Declaration.hack(require('./hacks/background-clip'))\n   ```\n\n7. Create a `.css` and `.out.css` example in `test/cases`. Add this test to\n   `test/autoprefixer.test.js`:\n\n   ```js\n   it('supports background-clip', () => check('background-clip'))\n   ```\n\n   If you need different browsers, change `prefixer()` function in the top\n   of test file.\n\n8. Run `pnpm test`.\n9. Push the branch to GitHub.\n10. Open your fork on GitHub an send pull request.\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "open_collective: postcss\ntidelift: npm/autoprefixer\ngithub: ai\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release\non:\n  push:\n    tags:\n      - '*'\npermissions:\n  contents: write\njobs:\n  release:\n    name: Release On Tag\n    if: startsWith(github.ref, 'refs/tags/')\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      - name: Extract the changelog\n        id: changelog\n        run: |\n          TAG_NAME=${GITHUB_REF/refs\\/tags\\//}\n          READ_SECTION=false\n          CHANGELOG=\"\"\n          while IFS= read -r line; do\n            if [[ \"$line\" =~ ^#+\\ +(.*) ]]; then\n              if [[ \"${BASH_REMATCH[1]}\" == \"$TAG_NAME\" ]]; then\n                READ_SECTION=true\n              elif [[ \"$READ_SECTION\" == true ]]; then\n                break\n              fi\n            elif [[ \"$READ_SECTION\" == true ]]; then\n              CHANGELOG+=\"$line\"$'\\n'\n            fi\n          done < \"CHANGELOG.md\"\n          CHANGELOG=$(echo \"$CHANGELOG\" | awk '/./ {$1=$1;print}')\n          echo \"changelog_content<<EOF\" >> $GITHUB_OUTPUT\n          echo \"$CHANGELOG\" >> $GITHUB_OUTPUT\n          echo \"EOF\" >> $GITHUB_OUTPUT\n      - name: Create the release\n        if: steps.changelog.outputs.changelog_content != ''\n        uses: softprops/action-gh-release@a06a81a03ee405af7f2048a818ed3f03bbf83c7b # v2.5.0\n        with:\n          name: ${{ github.ref_name }}\n          body: '${{ steps.changelog.outputs.changelog_content }}'\n          draft: false\n          prerelease: false\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Test\non:\n  push:\n    branches:\n      - main\n  pull_request:\npermissions:\n  contents: read\njobs:\n  full:\n    name: Node.js Latest Full\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      - name: Install pnpm\n        uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0\n        with:\n          version: 10\n      - name: Install Node.js\n        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0\n        with:\n          node-version: 25\n          cache: pnpm\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile --ignore-scripts\n      - name: Run tests\n        run: pnpm test\n  short:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version:\n          - 24\n          - 22\n          - 20\n          - 18\n    name: Node.js ${{ matrix.node-version }} Quick\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      - name: Install pnpm\n        uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0\n        with:\n          version: 10\n      - name: Install Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0\n        with:\n          node-version: ${{ matrix.node-version }}\n          cache: pnpm\n      - name: Install dependencies\n        run: pnpm install --frozen-lockfile --ignore-scripts\n      - name: Run unit tests\n        run: pnpm unit\n  old:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version:\n          - 16\n          - 14\n          - 12\n          - 10\n    name: Node.js ${{ matrix.node-version }} Quick\n    steps:\n      - name: Checkout the repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      - name: Install pnpm\n        uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0\n        with:\n          version: 3\n        env:\n          ACTIONS_ALLOW_UNSECURE_COMMANDS: true\n      - name: Install Node.js ${{ matrix.node-version }}\n        uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0\n        with:\n          node-version: ${{ matrix.node-version }}\n      - name: Install dependencies\n        run: pnpm install --no-frozen-lockfile --ignore-scripts\n      - name: Run unit tests\n        run: for f in test/*.test.js; do node \"$f\"; done\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules/\n\ncoverage/\n"
  },
  {
    "path": ".npmignore",
    "content": "test/\ncoverage/\n\nlogo.svg\nAUTHORS\neslint.config.mjs\npatches\n"
  },
  {
    "path": "AUTHORS",
    "content": "# This is the official list of Autoprefixer authors for copyright purposes.\n#\n# This does not necessarily list everyone who has contributed code, since in\n# some cases, their employer may be the copyright holder. To see the full list\n# of contributors, see the revision history in source control or\n# https://github.com/postcss/autoprefixer/graphs/contributors\n#\n# Authors who wish to be recognized in this file should add themselves (or\n# their employer, as appropriate).\n\nAaron <me@aaron.md>\nAdam Lynch <contact@adamlynch.ie>\nAdonis K <aklp08@gmail.com>\nAdriaan <https://github.com/harianus>\nAlbert Juhé Lluveras <aljullu@gmail.com>\nAleksei Androsov <aandrosov@yandex-team.ru>\nAleksey Shvayka <shvaikalesh@gmail.com>\nAleks Hudochenkov <aleks@hudochenkov.com>\nAlexey Komarov <alex7kom@gmail.com>\nAlexey Plutalov <demiazz.py@gmail.com>\nAnders Olsen Sandvik <https://github.com/Andersos>\nAndreas Haller <Andreas.Haller@invision.de>\nAndreas Lind <andreas@one.com>\nAndrew Rhoads <andrew.c.rhoads@gmail.com\nAndrey Alexandrov <icima.fan@gmail.com>\nAndrey Deryabin <deriabin@gmail.com>\nAndrey Sitnik <andrey@sitnik.ru>\nAndrey Taritsyn <taritsyn@gmail.com>\nAndy Trevorah <a.trevorah@gmail.com>\nAntoine du Hamel <duhamelantoine1995@gmail.com>\nAnton Khlynovskiy <subzey@gmail.com>\nArtem Yavorsky <info@yavorsky.org>\naruseni <aruseni.magiku@gmail.com>\nBen Briggs <beneb.info@gmail.com>\nbernig <https://github.com/bernig>\nBogdan Chadkin <trysound@yandex.ru>\nBogdan Dolin <d.bogdan@inbox.ru>\nbrainopia <brainopia@evilmartians.com>\nBrandon Mathis <brandon@imathis.com>\nChad von Nau <chad@vonnau.com>\nChi Vinh Le <vinh@wikiwi.io>\nChristian Oliff <christianoliff@yahoo.com>\nCory House <housecor@gmail.com>\nCory Simmons <cory@mojotech.com>\nCraig Martin <https://github.com/craigmichaelmartin>\nDamon <motoxer4533@gmail.com>\nDaniel Garcia-Carrillo <garciacarrillo.daniel@gmail.com>\nDaniel Tonon <https://github.com/Dan503>\nDaniel Tschinder <daniel@tschinder.de>\nDanny Pule <kojikusan@gmail.com>\nDarius\nDavid Narbutovich <vamnemne@gmail.com>\nDavid Pike <david@evolution7.com.au>\nDenys Kniazevych <webschik@gmail.com>\nDenis Sokolov <denis@sokolov.cc>\nDiablohu <https://github.com/Diablohu>\nDominik Porada <dominik@porada.co>\nDominik Schilling <dominikschilling+git@gmail.com>\ndotch <ch.weiss@hotmail.de>\nDmitry Semigradsky <semigradskyd@gmail.com>\nEduard Kyvenko <duardeco@gmail.com>\nEfremov Alexey <lexich121@gmail.com>\neitanr <eitanr@wix.com>\nErik Sundahl <esundahl@gmail.com>\nEugene Datsky <eugene@datsky.ru>\nEven Stensberg <evenstensberg@gmail.com>\nEvgeny Petukhov <petukhov.yevgeny@gmail.com>\nEvilebot Tnawi <sheo13666q@gmail.com>\nFangzhou Li <riophaelee@gmail.com>\nForrest York <https://github.com/badisa>\nGibr <todayz@yandex.ru>\nGoogle Inc.\nGregory Eremin <magnolia_fan@me.com>\nGU Yiling <justice360@gmail.com>\nGustavo Real <https://github.com/kotfire>\nHallvord R. M. Steen <hallvord@hallvord.com>\nheady <https://github.com/heady>\nHongShaoRou <evanzlist@sina.com>\nHuáng Jùnliàng <https://github.com/JLHwung>\nIain Beeston <iain.beeston@gmail.com>\nIgor Adamenko <https://github.com/igoradamenko>\nIvan <menshikov.ivn@gmail.com>\nIvan Malov <https://github.com/ivandata>\nIvan Verevkin <ivan.p.verevkin@gmail.com>\nFilipe W. Lima <fwl.ufpe@gmail.com>\nJack Moore <hello@jacklmoore.com>\nJason Kuhrt <jasonkuhrt@me.com>\nJeff Escalante <hello@jenius.me>\nJoan León <joan.leon@gmail.com>\nJohannes J. Schmidt <schmidt@netzmerk.com>\nJohn Kreitlow <jkreitlow@deepfocus.net>\nJonathan Ong <jonathanrichardong@gmail.com>\nJosh Gillies <github@joshgilli.es>\nJoshua Hall <joshuahallmail@gmail.com>\nJuan Martin Marco <jmmarco@gmail.com>\nJunliang Huang\njvdanilo <jvdanilo@gmail.com>\nKevin Pfefferle <kevin@rebaseinteractive.com>\nKieran <Kieranju@gmail.com>\nKir Shatrov <shatrov@me.com>\nKiwi <vinh@wikiwi.io>\nkizu <kizmarh@gmail.com>\nLeonya Khachaturov <leonidkhachaturov@gmail.com>\nLovchikov Anton <besyanya@yandex.ru>\nL.T <ec.huyinghuan@gmail.com>\nLucas Caton <lucascaton@gmail.com>\nLuciano Battagliero <lucianobattagliero+git@gmail.com>\nLuke Page <luke.a.page@gmail.com>\nmartco <martco@gmail.com>\nMat Gadd <github@catchall.drarok.com>\nMatt Buresh <matt@mburesh.com>\nMatt Smith <runner_28@hotmail.com>\nMaxime Thirouin <m@moox.io>\nMax Mechanic <max@philo.com>\nMichael Beil <michaelbeil@me.com>\nMichael Prentice <splaktar@gmail.com>\nMichael Scott Hertzberg <mshertzberg@gmail.com>\nMichał Gołębiowski-Owczarek <m.goleb@gmail.com>\nMikael Jorhult <mikael@jorhult.se>\nMorton Fox <github@qslw.com>\nmvasilkov <mvasilkov@gmail.com>\nNick Howes <nick@nickhowes.co.uk>\nNick Marchenko <n30n1ck@gmail.com>\nNic Nilov <https://github.com/nicnilov>\nNick Schonning <nschonni@gmail.com>\nnickspielgist <dev@nickspiel.me>\nNiels Dequeker <niels.dequeker@gmail.com>\nNikolay Burlov <kohgpat@gmail.com>\nOleh Aloshkin <olegaleshkin@gmail.com>\nOleksandr Sergiienko <sigerello@gmail.com>\nPavel Pustovalov <pustovalov.pavel@gmail.com>\nPavel Vostrikov <mail@vostrik.com>\nPaul Statezny <Paulstatezny@gmail.com>\nPeter van Westen <info@regularlabs.com>\nPeter Zotov <whitequark@whitequark.org>\nPhani Kandula <phani.kandula@gmail.com>\nPhil Dokas <phil@jetless.org>\nRafael Silva <rafael@rafaelsilva.net>\nRay Lehnhoff <raymond.lehnhoff@gmail.com>\nReadmeCritic <frankensteinbot@gmail.com>\nReinaldo Schiehll <rn.schiehll@gmail.com>\nRené Stalder <rene@whatwedo.ch>\nRichard Wang <richardwa@google.com>\nRob Howell <rob@robhowell.com>\nRoland Warmerdam <rowno@webspirited.com>\nRoman Dvornov <rdvornov@gmail.com>\nRoy Revelt <roy@codsen.com>\nRyan Zimmerman <https://github.com/RyanZim>\nSami Suo-Heikki <suoheikki.sami@gmail.com>\nSasha Koss <koss@nocorp.me>\nSean Anderson <Sean.Palmer.Anderson@gmail.com>\nSemen Levenson <levenson94@gmail.com>\nSergey Belov <peimei@ya.ru>\nSergey Leschina <mail@putnik.ws>\nSergey Lysenko <soulwish.ls@gmail.com>\nsethjgore <sethjgore@gmail.com>\nŠime Vidas <sime.vidas@gmail.com>\nSimon Lydell <simon.lydell@gmail.com>\nSindre Sorhus <sindresorhus@gmail.com>\nSire\nStanislav <botev.st@gmail.com>\nStanislav Lashmanov <stasvarenkin@gmail.com>\nStephen Edgar <stephen@netweb.com.au>\nSteve Mao <https://github.com/stevemao>\nStig Otnes Kolstad <stig@stigok.net>\nSubash Pathak <sbspk@msn.com>\nsunhao <sunhao_1988@msn.cn>\nSven Wagner <https://github.com/svewag>\nTimothy <zzzzBov@gmail.com>\ntomdavenport <playmusic@me.com>\nTony Ganch <tonyganch@gmail.com>\nVegard Andreas Larsen <vegard@xaltra.net>\nVera Surkova <vera@surkova.se>\nVincent De Oliveira <vincent@iamvdo.me>\nVishnu Ravi <vishnu@vishnu.io>\nVladimir Pouzanov <farcaller@gmail.com>\nvladkens <vladkens@yandex.ru>\nYet Another Minion <yam@thinkalexandria.com>\nYuriy Alekseyev <dev.yuriy.a@gmail.com>\nYury Timofeev <y.timofeyev@gmail.com>\nДаниил Пронин <mail@grawl.ru>\n一丝 <jie.lijie@alibaba-inc.com>\n刘祺 <gucong@gmail.com>\n忆初 <baby@justjavac.com>\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\nThis project adheres to [Semantic Versioning](http://semver.org/).\n\n## 10.4.27\n* Removed development key from `package.json`.\n\n## 10.4.26\n* Reduced package size.\n\n## 10.4.25\n* Fixed broken gradients on CSS Custom Properties (by @serger777).\n\n## 10.4.24\n* Made Autoprefixer a little faster (by @Cherry).\n\n## 10.4.23\n* Reduced dependencies (by @hyperz111).\n\n## 10.4.22\n* Fixed `stretch` prefixes on new Can I Use database.\n* Updated `fraction.js`.\n\n## 10.4.21\n* Fixed old `-moz-` prefix for `:placeholder-shown` (by @Marukome0743).\n\n## 10.4.20\n* Fixed `fit-content` prefix for Firefox.\n\n## 10.4.19\n* Removed `end value has mixed support, consider using flex-end` warning\n  since `end`/`start` now have good support.\n\n## 10.4.18\n* Fixed removing `-webkit-box-orient` on `-webkit-line-clamp` (@Goodwine).\n\n## 10.4.17\n* Fixed `user-select: contain` prefixes.\n\n## 10.4.16\n* Improved performance (by Romain Menke).\n* Fixed docs (by Christian Oliff).\n\n## 10.4.15\n* Fixed `::backdrop` prefixes (by 一丝).\n* Fixed docs (by Christian Oliff).\n\n## 10.4.14\n* Improved startup time and reduced JS bundle size (by Kārlis Gaņģis).\n\n## 10.4.13\n* Fixed missed prefixes on vendor prefixes in name of CSS Custom Property.\n\n## 10.4.12\n* Fixed support of unit-less zero angle in backgrounds (by 一丝).\n\n## 10.4.11\n* Fixed `text-decoration` prefixes by moving to MDN data (by Romain Menke).\n\n## 10.4.10\n* Fixed `unicode-bidi` prefixes by moving to MDN data.\n\n## 10.4.9\n* Fixed `css-unicode-bidi` issue from latest Can I Use.\n\n## 10.4.8\n* Do not print `color-adjust` warning if `print-color-adjust` also is in rule.\n\n## 10.4.7\n* Fixed `print-color-adjust` support in Firefox.\n\n## 10.4.6\n* Fixed `print-color-adjust` support.\n\n## 10.4.5\n* Fixed `NaN` in grid (by @SukkaW).\n\n## 10.4.4\n* Fixed `package.funding` to have same value between all PostCSS packages.\n\n## 10.4.3\n* Fixed `package.funding` (by Álvaro Mondéjar).\n\n## 10.4.2\n* Fixed missed `-webkit-` prefix for `width: stretch`.\n\n## 10.4.1\n* Fixed `::file-selector-button` data (by Luke Warlow).\n\n## 10.4 “ǃke e꞉ ǀxarra ǁke”\n* Added `:autofill` support (by Luke Warlow).\n\n## 10.3.7\n* Replaced `nanocolors` to `picocolors`.\n\n## 10.3.6\n* Updated `nanocolors`.\n* Reduced package size.\n\n## 10.3.5\n* Replaced `colorette` to `nanocolors`.\n\n## 10.3.4\n* Fixed `stretch` value in latest Firefox.\n\n## 10.3.3\n* Fixed wrong `-moz-` prefix from  `::file-selector-button` (by Usman Yunusov).\n\n## 10.3.2\n* Fixed `::file-selector-button` support (by Usman Yunusov).\n\n## 10.3.1\n* Fixed adding wrong prefixes to `content` (by Luke Warlow).\n\n## 10.3 “Чести своей не отдам никому”\n* Added `::file-selector-button` support (by Luke Warlow).\n\n## 10.2.6\n* Fixed “no prefixes needed” warning (by @Pwntheon).\n\n## 10.2.5\n* Fixed `:` support in `@supports` (by Dmitry Semigradsky).\n* Fixed docs (by Christian Oliff).\n\n## 10.2.4\n* Fixed browser names in `npx autoprefixer --info`.\n\n## 10.2.3\n* Fixed PostCSS 8 support.\n\n## 10.2.2\n* Fixed PostCSS 8 plugins compatibility.\n\n## 10.2.1\n* Fixed `transition-property` warnings (by @Sheraff).\n\n## 10.2 “Sub rosa”\n* Added TypeScript definitions (by Dmitry Semigradsky).\n* Fixed docs (by Florian Pellet).\n\n## 10.1 “Pula”\n* Added `dpcm` unit support to `min-resolution: 2dppx` (by Robert Eisele).\n* Fixed rational approximation in `min-resolution` (by Robert Eisele).\n\n## 10.0.4\n* Fixed `Cannot read property 'proxyOf' of undefined` error (by Igor Kamyshev).\n\n## 10.0.3\n* Fixed `substract` to `subtract` value for `mask-composite` (by Michelle Enos).\n\n## 10.0.2\n* Removed `-ms-user-select: all` because IE and old Edge don’t support it.\n* Fixed Grid Layout warning.\n\n## 10.0.1\n* Fix PostCSS 8.1 compatability.\n* Add our OpenCollective to `package.json`.\n* Clean up code (by Sukka).\n\n## 10.0 “Alis volat propriis”\n* Removed support for Node.js 6.x, 8.x, 11.x.\n* Moved `postcss` to `peerDependencies`.\n* Moved to PostCSS 8.\n\n## 9.8.6\n* Fixed `env` option.\n\n## 9.8.5\n* Improved Grid Layout warnings (by Daniel Tonon).\n* Fixed `align-self` and `justify-self` with `display: flex` (by Daniel Tonon).\n\n## 9.8.4\n* Replace color output library.\n\n## 9.8.3\n* Return old non-LTS Node.js versions to avoid breaking changes.\n\n## 9.8.2\n* Remove Node.js 13.0-13.7 from supported engines, because of buggy ESM support.\n\n## 9.8.1\n* Replace `chalk` to `kleur` (by Luke Edwards).\n* Update docs (by @mbomb007).\n\n## 9.8 “Vigilo Confido”\n* Add `:placeholder-shown` support (by Tanguy Krotoff).\n\n## 9.7.6\n* Revert `-webkit-stretch` fix.\n\n## 9.7.5\n* Fix `-webkit-stretch` support.\n\n## 9.7.4\n* Fix warning text (by Dmitry Ishkov).\n\n## 9.7.3\n* Fix compatibility with PostCSS Modules.\n\n## 9.7.2\n* Add `-ms-user-select: element` support.\n* Add funding link for `npm fund`.\n\n## 9.7.1\n* Avoid unnecessary transitions in prefixed selectors (by Andrey Alexandrov).\n* Fix `fit-content` for Firefox.\n\n## 9.7 “Ad Victoriam”\n* Add `AUTOPREFIXER_GRID` env variable to enable Grid Layout polyfill for IE.\n* Fix `Cannot read property 'grid' of undefined` error.\n\n## 9.6.5\n* Fix selector prefixing (by Andrey Alexandrov).\n\n## 9.6.4\n* Now the real fix for `'startsWith' of undefined` error.\n\n## 9.6.3\n* Fix `Cannot read property 'startsWith' of undefined` error.\n\n## 9.6.2\n* Fix false `Replace fill to stretch` warning.\n\n## 9.6.1\n* Fix `-webkit-line-clamp` truncating multi-line text support.\n\n## 9.6 “Nunc id vides, nunc ne vides”\n* Show warning about Browserslist config on `browser` option.\n* Add warning-less `overrideBrowserslist` option.\n* Add `text-orientation` support.\n* Add `min-resolution: 2x` alias support.\n* Add `.github/CONTRIBUTING.md` (by Juan Martin Marco).\n\n## 9.5.1\n* Fix `backdrop-filter` for Edge (by Oleh Aloshkin).\n* Fix `min-resolution` media query support in Firefox < 16.\n\n## 9.5 “Draco dormiens nunquam titillandus”\n* Add `mask-composite` support (by Semen Levenson).\n\n## 9.4.10\n* Add warning for named Grid rows.\n\n## 9.4.9\n* Fix `grid-template` and `@media` case (by Bogdan Dolin).\n\n## 9.4.8\n* Fix `calc()` support in Grid gap.\n\n## 9.4.7\n* Fix infinite loop on mismatched parens.\n\n## 9.4.6\n* Fix warning text (by Albert Juhé Lluveras).\n\n## 9.4.5\n* Fix `text-decoration-skip-ink` support.\n\n## 9.4.4\n* Use `direction` value for `-ms-writing-mode` (by Denys Kniazevych).\n* Fix warning text (by @zzzzBov).\n\n## 9.4.3\n* Add warning to force `flex-start` instead of `start` (by Antoine du Hamel).\n* Fix docs (by Christian Oliff).\n\n## 9.4.2\n* Fix Grid autoplacement warning.\n\n## 9.4.1\n* Fix unnecessary Flexbox prefixes in Grid elements.\n\n## 9.4 “Advance Australia”\n* Add Grid autoplacement for `-ms-` (by Bogdan Dolin).\n* Improve docs and warnings (by Daniel Tonon).\n* Remove some unnecessary warnings for Grid (by Andrey Alexandrov).\n\n## 9.3.1\n* Fix Grid prefixes with `repeat()` value (by Bogdan Dolin).\n\n## 9.3 “Labor omnia vincit”\n* Add `place-self` support (by Bogdan Dolin).\n* Fix Grid row/column span inheritance bug (by Bogdan Dolin).\n\n## 9.2.1\n* Fix broken AST.\n\n## 9.2 “Onyi est glavnaya krepost”\n* Add `/* autoprefixer grid: on */` control comment (by Andrey Alexandrov).\n* Add duplicate `grid-area` support (by Bogdan Dolin).\n* Fix `grid-gap` support for rules with different specifity (by Bogdan Dolin).\n* Disable Grid in `@supports` at-rule with non-supported Grid features.\n* Improve Grid warnings (by Daniel Tonon).\n* Improve docs (by Joshua Hall, Mat Gadd, Roy Revelt, and Ivan).\n\n## 9.1.5\n* Remove `@babel/register` from dependencies.\n\n## 9.1.4\n* Use Babel 7.\n\n## 9.1.3\n* Sort properties in `autoprefixer --info` alphabetically.\n* Fix old Firefox gradient prefix.\n\n## 9.1.2\n* Fix `autoprefixer --info` in new Node.js.\n\n## 9.1.1\n* Retain `grid-gap` through `@media` (by Bogdan Dolin).\n* Fix `grid-template` and  `@media` (by Bogdan Dolin).\n* Fix Grid areas searching error (by Bogdan Dolin).\n* Fix `span X` Grid prefix (by Bogdan Dolin).\n* Fix docs (by Eduard Kyvenko).\n\n## 9.1 “Equality before the law”\n* Add `background-clip: text` support.\n* Fix adding Grid span for IE (by Bogdan Dolin).\n\n## 9.0.2\n* Show warning on Grid area names conflict (by Bogdan Dolin).\n* Fix documentation (by Sven Wagner).\n\n## 9.0.1\n* Fix nested at-rules in Grid prefixes (by Ivan Malov).\n\n## 9.0 “A Mari Usque Ad Mare”\n* Remove Node.js 9 and Node.js 4 support.\n* Remove IE and “dead” browsers from Babel.\n* Use PostCSS 7.0.\n* Use Browserslist 4.0.\n\n## 8.6.5\n* Do not show Grid warnings if IE was not selected.\n\n## 8.6.4\n* Fix `stretch` prefix in Chrome >= 46.\n\n## 8.6.3\n* Add warnings for unsupported Grid features.\n* Add warnings about wrong Grid properties.\n* Add note about `grid` option for grid properties in `autoprefixer --info`.\n\n## 8.6.2\n* Fix error during adding Grid prefixes in `@media` (by Evgeny Petukhov).\n\n## 8.6.1\n* Fix `grid-template` with media queries (by Evgeny Petukhov).\n\n## 8.6 “Follow Reason”\n* Add `gap` support (by Evgeny Petukhov).\n* Add two values support for `grid-gap` and `gap` (by Evgeny Petukhov).\n* Add `ignoreUnknownVersions` option for Browserslist.\n\n## 8.5.2\n* Fix `grid-template` support wit auto row sizes (by Yury Timofeev).\n\n## 8.5.1\n* Remove unnecessary warning on `-webkit-fill-available`.\n\n## 8.5 “Muito Nobre e Sempre Leal”\n* Add `grid-gap` support (by Evgeny Petukhov).\n* Fix radial gradients direction fix.\n* Fix docs (by Phani Kandula and Huáng Jùnliàng).\n\n## 8.4.1\n* Fix working in old PostCSS versions (by Diablohu).\n\n## 8.4 “Non in aves, sed in angues”\n* Add `/* autoprefixer: ignore next */` control comment (by Pavel Vostrikov).\n\n## 8.3 “Benigno Numine”\n* Add `@media` support to `grid-template` (by Evgeny Petukhov).\n* Fix `radial-gradient` direction warning (by Gustavo Real).\n\n## 8.2 “Ad Astra per Aspera”\n* Add `color-adjust` (by Sergey Lysenko, Stanislav Botev, and Yuriy Alekseyev).\n\n## 8.1 “Rex, Familia et Ultio”\n* Add `overscroll-behavior` support.\n* Add `grid-template` shortcut support (by Evgeny Petukhov).\n* Add better `grid-column-end` and `grid-row-end` support (by Evgeny Petukhov).\n* Fix Grid properties support in `@supports`.\n\n## 8.0 “Excelsior”\n* Use Browserslist 3.0.\n* Rename `autoprefixer-info` CLI tool to `autoprefixer --info`.\n* Remove `break-*` to `page-break-*` conversion for Firefox.\n\n## 7.2.6\n* Fix `-ms-` prefix for grid cells with same `grid-area` (by Evgeny Petukhov).\n\n## 7.2.5\n* Fix multiple prefixes in declaration value.\n\n## 7.2.4\n* Fix IE 10 support.\n\n## 7.2.3\n* Fix `grid-template-areas` in `@media` (by Evgeny Petukhov).\n\n## 7.2.2\n* Fix `_autoprefixerDisabled is undefined` issue.\n\n## 7.2.1\n* Fix IE and other old JS runtimes support.\n\n## 7.2 “Ordem e Progresso”\n* Add `grid-template-areas` support (by Evgeny Petukhov).\n* Add `grid-template` support (by Evgeny Petukhov).\n* Add `grid-area` support (by Alexey Komarov).\n* Add `autoprefixer-info` CLI tool.\n* Add wrong `radial-gradient` properties warning.\n* Use current working dir on missed `from` in `info()` (by Phil Dokas).\n* Fix `grid-row` and `grid-column` support (by Alexey Komarov).\n* Do not prefix `reverse` animation direction.\n* Improve test coverage (by Dmitry Semigradsky).\n\n## 7.1.6\n* Add warning for using `browserslist` option instead of `browsers`.\n* Add warning for multiple control comments in the same scope.\n* Fix `Invalid array length` error during indent changes.\n\n## 7.1.5\n* Fix `::placeholder` prefix for Edge.\n* Fix `inherit`/`initial`/`unset` values for `flex-direction`.\n* Fix RegExp usage in gradients (by Yet Another Minion).\n\n## 7.1.4\n* Fix `radial-gradient` direction conversion.\n* Fix `image-set` in `cursor`.\n\n## 7.1.3\n* Add warning for old `radial-gradient` direction syntax.\n\n## 7.1.2\n* Fix `text-decoration` shortcut support.\n\n## 7.1.1\n* Remove non-`-webkit-` intrinsic prefixes in Grid Layout (by 一丝).\n\n## 7.1 “Universitas litterarum”\n* Add `unicode-bidi` support.\n* Add `-webkit-appearance` support for Edge.\n* Add `from` option to `info()`.\n* Fix intrinsic widths prefixes in Grid Layout.\n\n## 7.0.1\n* Fix Autoprefixer for old JS runtimes.\n\n## 7.0 “Coelestem adspicit lucem”\n* Remove node.js 0.12 support.\n* Use PostCSS 6.0.\n* Use Browserslist 2.\n* Use `caniuse-lite` instead of `caniuse-db` (by Ben Briggs).\n* Use `^` for Browserslist dependencies, instead of `~`.\n* Rewrite project from CoffeeScript to Babel (by Dmitry Semigradsky).\n* Disable Grid Layout prefixes for IE by default.\n* Fix `-ms-grid-column-align`.\n* Move tests to Jest.\n\n## 6.7.7\n* Fix `order` for non-digit values.\n\n## 6.7.6\n* Fix `font-kerning` (by Chi Vinh Le).\n\n## 6.7.5\n* Fix `text-decoration-skip` in iOS (by Chi Vinh Le).\n* Fix `clip-path` (by Chi Vinh Le).\n\n## 6.7.4\n* Improve `browsers` option perfomance.\n* Update CoffeeScript compiler.\n\n## 6.7.3\n* Fix compatibility with “Intrinsic & Extrinsic Sizing” spec update.\n\n## 6.7.2\n* Do not prefix grid/flexbox in `@supports` on `grid: false`/`flexbox: false`.\n\n## 6.7.1\n* Update Browserslist with `last n version` fix.\n\n## 6.7 “Krungthep doot thep saang”\n* Add Electron support in browsers list (by Kilian Valkhof).\n* Add `flex-flow` partial support for Flexbox 2009 specification.\n* Fix browsers `0` version issue in some Can I Use data.\n\n## 6.6.1\n* Add metadata to use Autoprefixer in JSS tests (by Chi Vinh Le).\n\n## 6.6 “Kaiyuan”\n* Add `browserslist` key in `package.json` support.\n* Add support for separated environments in browserslist config.\n* Add `browserslist-stats.json` file support to load custom usage statistics.\n\n## 6.5.4\n* Fix unitless 0 basis in IE10/IE11 shorthand flex (by Google).\n\n## 6.5.3\n* Add error for popular mistake with `browser` option instead of `browsers`.\n\n## 6.5.2\n* Clean prefixes data (by Reinaldo Schiehll).\n\n## 6.5.1\n* Fix selectors with `:--` prefix support.\n\n## 6.5 “Einigkeit und Recht und Freiheit”\n* Add `defaults` keyword to browsers requirements.\n* Fix CSS Grid Layout support.\n* Fix `align-self` cleaning.\n\n## 6.4.1\n* Fix node cloning after some PostCSS plugins.\n\n## 6.4 “Hic et ubique terrarum”\n* Add `:any-link` selector support.\n* Add `text-decoration-skip` support.\n* Add `transition: duration property` support.\n* Fix `-webkit-` prefix for `backface-visibility`.\n* Fix `rad` unit support in gradients (by 刘祺).\n* Fix `transition` support in Opera 12.\n* Removed Safari TP Grid prefixes support.\n\n## 6.3.7\n* Fix rare `Cannot read property 'constructor' of null` issue.\n\n## 6.3.6\n* Add Safari TP prefix support for Grid Layout.\n\n## 6.3.5\n* Fix duplicate prefixes for `-ms-interpolation-mode`.\n\n## 6.3.4\n* Show users coverage for selected browsers in `info()`.\n\n## 6.3.3\n* Fix transition warning.\n\n## 6.3.2\n* Fix jspm support (by Sean Anderson).\n\n## 6.3.1\n* Fix compatibility with Flexibility polyfill.\n\n## 6.3 “Pro rege et lege”\n* Add Grid Layout support.\n* Add `text-spacing` support.\n* Add `> 10% in my stats` browsers query with custom usage statistics.\n* Add options to disable `@supports`, Flexbox or Grid support.\n* Fix compatibility with other PostCSS plugins.\n\n## 6.2.3\n* Fix error on broken transition with double comma.\n\n## 6.2.2\n* Fix issues in broken transitions.\n\n## 6.2.1\n* Fix AST error in transition warning (by @jvdanilo).\n\n## 6.2 “Fluctuat nec mergitur”\n* Use `fill` instead of `fill-available` according spec changes (by 一丝).\n* Add `fill` support for logical dimension properties (by 一丝).\n* Add `text-emphasis` support (by 一丝).\n* Add prefixes to `@supports` only for compatible browsers.\n* Add `rad`, `grad` and `turn` units support to linear gradients.\n* Add some `deg` directions support for old WebKit linear gradients.\n* Fix `@supports` parenthesis (by @heady).\n* Add warning when prefixes could not be generated\n  for complicated `transition-property` values.\n* Add warning for outdated `fill-available` value.\n* Add warning for wrong `text-emphasis-position` value.\n* Add “time capsule” warning for prefix-less future.\n* Normalizes all warning messages.\n\n## 6.1.2\n* Fix gradient hack on some parameters (by Alexey Efremov).\n\n## 6.1.1\n* Fix `cursor: grab` and `cursor: grabbing` support.\n\n## 6.1 “Bil-shaʿb wa lil-shaʿb”\n* Change `transition` support to output more robust CSS.\n* Add `:read-only` support.\n* Add support for `appearance` with any values.\n* Add CSS-in-JS support via `postcss-js`.\n* Add loud `/*! autoprefixer: off */` control comments support.\n* Convert `rotateZ` to `rotate` for `-ms-transform`.\n* Use `postcss-value-parser` to carefully work with gradients.\n* Remove `-ms-transform-style` and `-o-transform-style` that never existed.\n\n## 6.0.3\n* Fix old gradient direction warning.\n\n## 6.0.2\n* Remove unnecessary `-khtml-` prefix too.\n\n## 6.0.1\n* Fix `cross-fade()` support (by 一丝).\n\n## 6.0 “Eureka”\n* CLI was removed from `autoprefixer` package to `autoprefixer-cli`.\n* `autoprefixer-core` and `autoprefixer` packages was merged back.\n* Remove `autoprefixer(opt).process(css)`, use `autoprefixer.process(css, opt)`.\n* Remove `safe` option. Use separated Safe parser from PostCSS.\n* Remove Opera 12.1 from default query.\n* Use PostCSS 5.0 API.\n* Add custom syntaxes support.\n* Add `image-set` support (by 一丝).\n* Add `mask-border` support (by 一丝).\n* Add `filter()` function support (by Vincent De Oliveira).\n* Add `backdrop-filter` support (by Vincent De Oliveira).\n* Add `element()` support (by Vincent De Oliveira).\n* Add CSS Regions support.\n* Add Scroll Snap Points support.\n* Add `writing-mode` support.\n* Add `::backdrop` support.\n* Add `cross-fade()` support.\n* Add other `break-` properties support.\n* Add Microsoft Edge support (by Andrey Polischuk).\n* Add `not` keyword and exclude browsers by query.\n* Add version ranges `IE 6-9` (by Ben Briggs).\n* Fix `filter` in `transition` support on Safari.\n* Fix `url()` parsing.\n* Fix `pixelated` cleaning.\n* Always show old gradient direction warning.\n\n## 5.2.1\n* Fix parent-less node issue on some cases (by Josh Gillies).\n\n## 5.2 “Dont tread on me”\n* Add `appearance` support.\n* Warn users on old gradient direction or flexbox syntax.\n* Add `add: false` option to disable new prefixes adding.\n* Make Autoprefixer 30% faster.\n* Use PostCSS 4.1 plugin API.\n* Add prefixes for `pixelated` instead of `crisp-edges` in `image-rendering`.\n* Do not add `::placeholder` prefixes for `:placeholder-shown`.\n* Fix `text-decoration` prefixes.\n* `autoprefixer.process()` was deprecated. Use PostCSS API.\n\n## 5.1.11\n* Update `num2fraction` to fix resolution media query (by 一丝).\n\n## 5.1.10\n* Do not generate `-webkit-image-rendering`.\n\n## 5.1.9\n* Fix DynJS compatibility (by Nick Howes).\n\n## 5.1.8\n* Fix gradients in `mask` and `mask-image` properties.\n* Fix old webkit prefix on some unsupported gradients.\n\n## 5.1.7\n* Fix placeholder selector (by Vincent De Oliveira).\n\n## 5.1.6\n* Use official `::placeholder-shown` selector (by Vincent De Oliveira).\n\n## 5.1.5\n* Add transition support for CSS Masks properties.\n\n## 5.1.4\n* Use `-webkit-` prefix for Opera Mobile 24.\n\n## 5.1.3\n* Add IE support for `image-rendering: crisp-edges`.\n\n## 5.1.2\n* Add never existed `@-ms-keyframes` to common mistake.\n\n## 5.1.1\n* Safer value split in `flex` hack.\n\n## 5.1 “Jianyuan”\n* Add support for resolution media query (by 一丝).\n* Higher accuracy while removing prefixes in values.\n* Add support for logical properties (by 一丝).\n* Add `@viewport` support.\n* Add `text-overflow` support (by 一丝).\n* Add `text-emphasis` support (by 一丝).\n* Add `image-rendering: crisp-edges` support.\n* Add `text-align-last` support.\n* Return `autoprefixer.defaults` as alias to current `browserslist.defaults`.\n* Save code style while adding prefixes to `@keyframes` and `@viewport`.\n* Do not remove `-webkit-background-clip` with non-spec `text` value.\n* Fix `-webkit-filter` in `transition`.\n* Better support for browser versions joined on Can I Use\n  like `ios_saf 7.0-7.1` (by Vincent De Oliveira).\n* Fix compatibility with `postcss-import` (by Jason Kuhrt).\n* Fix Flexbox prefixes for BlackBerry and UC Browser.\n* Fix gradient prefixes for old Chrome.\n\n## 5.0 “Pravda vítězí”\n* Use PostCSS 4.0.\n* Use Browserslist to parse browsers queries.\n* Use global `browserslist` config.\n* Add `> 5% in US` query to select browsers by usage in some country.\n* Add `object-fit` and `object-position` properties support.\n* Add CSS Shape properties support.\n* Fix UC Browser name in debug info.\n* Remove `autoprefixer.defaults` and use defaults from Browserslist.\n\n## 4.0.2\n* Remove `o-border-radius`, which is common mistake in legacy CSS.\n\n## 4.0.1\n* Fix `@supports` support with brackets in values (by Vincent De Oliveira).\n\n## 4.0 “Indivisibiliter ac Inseparabiliter”\n* Become 2.5 times fatser by new PostCSS 3.0 parser.\n* Do not remove outdated prefixes by `remove: false` option.\n* `map.inline` and `map.sourcesContent` options are now `true` by default.\n* Add `box-decoration-break` support.\n* Do not add old `-webkit-` prefix for gradients with `px` units.\n* Use previous source map to show origin source of CSS syntax error.\n* Use `from` option from previous source map `file` field.\n* Set `to` value to `from` if `to` option is missing.\n* Trim Unicode BOM on source maps parsing.\n* Parse at-rules without spaces like `@import\"file\"`.\n* Better previous `sourceMappingURL` annotation comment cleaning.\n* Do not remove previous `sourceMappingURL` comment on `map.annotation: false`.\n\n## 3.1.2\n* Update Firefox ESR version from 24 to 31.\n\n## 3.1.1\n* Use Flexbox 2009 spec for Android stock browser < 4.4.\n\n## 3.1 “Satyameva Jayate”\n* Do not remove comments from prefixed values (by Eitan Rousso).\n* Allow Safari 6.1 to use final Flexbox spec (by John Kreitlow).\n* Fix `filter` value in `transition` in Webkits.\n* Show greetings if your browsers don’t require any prefixes.\n* Add `<=` and `<` browsers requirement (by Andreas Lind).\n\n## 3.0.1\n* Fix `autoprefixer.postcss` in callbacks.\n\n## 3.0 “Liberté, Égalité, Fraternité”\n* Project was split to autoprefixer (with CLI) and autoprefixer-core.\n* `autoprefixer()` now receives only `options` object with `browsers` key.\n* GNU format for syntax error messages from PostCSS 2.2.\n\n## 2.2 “Mobilis in mobili”\n* Allow to disable Autoprefixer for some rule by control comment.\n* Use PostCSS 2.1 with Safe Mode option and broken source line\n  in CSS syntax error messages.\n\n## 2.1.1\n* Fix `-webkit-background-size` hack for `contain` and `cover` values.\n* Don’t add `-webkit-` prefix to `filter` with SVG (by Vincent De Oliveira).\n\n## 2.1 “Eleftheria i thanatos”\n* Add support for `clip-path` and `mask` properties.\n* Return `-webkit-` prefix to `filter` with SVG URI.\n\n## 2.0.2\n* Add readable names for new browsers from 2.0 release.\n* Don’t add `-webkit-` prefix to `filter` with SVG URI.\n* Don’t add `-o-` prefix 3D transforms.\n\n## 2.0.1\n* Save declaration style, when clone declaration to prefix.\n\n## 2.0 “Hongik Ingan”\n* Based on PostCSS 1.0.\n  See [options changes](https://github.com/postcss/postcss/releases/tag/1.0.0).\n* Restore visual cascade after declaration removing.\n* Enable visual cascade by default.\n* Prefix declareation in `@supports` at-rule conditions.\n* Add all browsers from Can I Use: `ie_mob`, `and_chr`, `and_ff`,\n  `op_mob` and `op_mini`.\n* Allow to use latest Autoprefixer from GitHub by npm.\n* Add `--no-cascade`, `--annotation` and `--sources-content` options to binary.\n\n## 1.3.1\n* Fix gradient hack, when `background` property contains color.\n\n## 1.3 “Tenka Fubu”\n* Add `text-size-adjust` support.\n* Add `background-size` to support Android 2.\n\n## 1.2 “Meiji”\n* Use Can I Use data from official `caniuse-db` npm package.\n* Remove package data update from binary.\n* Use increment value instead of current date in minor versions.\n\n## 1.1 “Nutrisco et extingo”\n* Add source map annotation comment support.\n* Add inline source map support.\n* Autodetect previous source map.\n* Fix source maps support on Windows.\n* Fix source maps support in subdirectory.\n* Prefix selector even if it is already prefixed by developer.\n* Add option `cascade` to create nice visual cascade of prefixes.\n* Fix flexbox support for IE 10 (by Roland Warmerdam).\n* Better `break-inside` support.\n* Fix prefixing, when two same properties are near.\n\n### 20140222\n* Add `touch-action` support.\n\n### 20140226\n* Chrome 33 is moved to released versions.\n* Add Chrome 36 data.\n\n### 20140302\n* Add `text-decoration-*` properties support.\n* Update browsers usage statistics.\n* Use new PostCSS version.\n\n### 20140319\n* Check already prefixed properties after current declaration.\n* Normalize spaces before already prefixed check.\n* Firefox 28 is moved to released versions.\n* Add Firefox 31 data.\n* Add some Blackberry data.\n\n### 20140327\n* Don’t use `-ms-transform` in `@keyframes`, because IE 9 doesn’t support\n  animations.\n* Update BlackBerry 10 data.\n\n### 20140403\n* Update browsers usage statistics.\n* Opera 20 is moved to released versions.\n* Add Opera 22 data.\n\n### 20140410\n* Chrome 34 is moved to released versions.\n* Add Chrome 37 data.\n* Fix Chrome 36 data.\n\n### 20140429\n* Fix `display: inline-flex` support by 2009 spec.\n* Fix old WebKit gradient converter (by Sergey Belov).\n* Fix CSS 3 cursors data (by Nick Schonning).\n\n### 20140430\n* Separate 2D and 3D transform prefixes to clean unnecessary `-ms-` prefixes.\n* Firefox 29 is moved to released versions.\n* Add Firefox 32 data.\n\n### 20140510\n* Do not add `-ms-` prefix for `transform` with 3D functions.\n* Update browsers global usage statistics.\n\n### 20140512\n* Remove unnecessary `-moz-` prefix for `wavy` in `text-decoration`.\n* Update Safari data for font properties.\n\n### 20140521\n* Chrome 36 is moved to released versions.\n* Add Chrome 38 data.\n\n### 20140523\n* Opera 21 is moved to released versions.\n* Add Opera 23 data.\n\n### 20140605\n* Allow to parse gradients without space between color and position.\n* Add iOS 8, Safari 8 and Android 4.4.3 data.\n* Update browsers usage statistics.\n\n## 1.0 “Plus ultra”\n* Source map support.\n* Save origin indents and code formatting.\n* Change CSS parser to PostCSS.\n* Preserve vendor-prefixed properties put right after unprefixed ones.\n* Rename `compile()` to `process()` and return result object,\n  instead of CSS string.\n* Rename `inspect()` to `info()`.\n* Add in binary `-d` option to specify output directory.\n* Binary now will not concat output files.\n* Allow to select last versions for specified browser.\n* Add full browser names aliases: `firefox`, `explorer` and `blackberry`.\n* Ignore case in browser names.\n* Change license to MIT.\n* Add prefixes inside custom at-rules.\n* Add only necessary prefixes to selector inside prefixed at-rule.\n* Safer backgrounds list parser in gradient hack.\n* Prefix `@keyframes` inside `@media`.\n* Don’t prefix values for CSS3 PIE properties.\n* Binary now shows file name in syntax error.\n* Use browserify to build standalone version.\n\n### 20131225\n* Fix deprecated API convertor.\n* Add `::placeholder` support for Firefix >= 18.\n* Fix vendor prefixes order.\n\n### 20140103\n* Add `-webkit-` prefix for `sticky` position.\n* Update browsers popularity statistics.\n\n### 20140109\n* Add selectors and at-rules sections to debug info.\n* Fix outdated prefixes cleaning.\n\n### 20140110\n* Add `Firefox ESR` browser requirement.\n* Opera 18 is moved to released versions.\n* Add Opera 20 data.\n\n### 20140117\n* Chrome 32 is moved to released versions.\n* Add Opera 34 data.\n\n### 20140130\n* Fix flexbox properties names in transitions.\n* Add Chrome 35 and Firefox 29 data.\n\n### 20140203\n* Android 4.4 stock browser and Opera 19 are moved to released versions.\n* Add Opera 21 data.\n* Update browsers usage statistics.\n\n### 20140213\n* Add case insensitive to IE’s filter hack (by Dominik Schilling).\n* Improve selector prefixing in some rare cases (by Simon Lydell).\n* Firefox 27 is moved to released versions.\n* Add Firefox 30 data.\n\n## 0.8 “Unbowed, Unbent, Unbroken”\n* Add more browsers to defaults (\"> 1%, last 2 versions, ff 17, opera 12.1\"\n  instead of just \"last 2 browsers\").\n* Keep vendor prefixes without unprefixed version (like vendor-specific hacks).\n* Convert gradients to old WebKit syntax (actual for Android 2.3).\n* Better support for several syntaxes with one prefix (like Flexbox and\n  gradients in WebKit).\n* Add intrinsic and extrinsic sizing values support.\n* Remove never existed prefixes from common mistakes (like -ms-transition).\n* Add Opera 17 data.\n* Fix selector prefixes order.\n* Fix browser versions order in inspect.\n\n### 20130903\n* Fix old WebKit gradients convertor on rgba() colors.\n* Allow to write old direction syntax in gradients.\n\n### 20130906\n* Fix direction syntax in radial gradients.\n* Don’t prefix IE filter with modern syntax.\n\n### 20130911\n* Fix parsing property name with spaces.\n\n### 20130919\n* Fix processing custom framework prefixes (by Johannes J. Schmidt).\n* Concat outputs if several files compiled to one output.\n* Decrease standalone build size by removing unnecessary Binary class.\n* iOS 7 is moved to released versions.\n* Clean up binary code (by Simon Lydell).\n\n### 20130923\n* Firefox 24 is moved to released versions.\n\n### 20131001\n* Add support for grab, grabbing, zoom-in and zoom-out cursor values.\n\n### 20131006\n* Chrome 30 is moved to released versions.\n\n### 20131007\n* Don’t add another prefixes in rule with prefixed selector.\n\n### 20131009\n* Opera 17 is moved to released versions.\n\n### 20131015\n* Fix converting multiple gradients to old webkit syntax (by Aleksei Androsov).\n\n### 20131017\n* Fix @host at-rule parsing.\n\n### 20131020\n* IE 11 and Andrid 4.3 is moved to released versions.\n* Add Opera 18 data.\n* Add @namespace support.\n* Sort browser versions in data file.\n\n### 20131029\n* Add Safari 6.1 data.\n* Add fx alias for Firefox.\n\n### 20131104\n* Update Android future version to 4.4.\n* Google Chrome 32 added to future versions list.\n* Firefox 25 now is actual version, 27 and 28 added to future versions.\n* Browsers statistics are updated.\n\n### 20131205\n* Google Chrome 33 added to future releases list.\n* Google Chrome 31 moved to current releases list.\n\n### 20131209\n* Use old webkit gradients for old iOS and Safari (by Chad von Nau).\n* Fix direction conversion for old webkit gradients (by Chad von Nau).\n* Update browsers popularity statistics.\n\n### 20131213\n* Firefox ESR in default browsers was changed to 24 version.\n* Firefox 26 was moved to current releases list.\n* Firefox 28 was added to future releases list.\n\n## 0.7 “We Do Not Sow”\n* Add vendor prefixes to selectors.\n* Add ::selection and ::placeholder selectors support.\n* Allow to load support data from Can I Use pull requests.\n* Remove deprecated API.\n\n### 20130806\n* Add hyphens support.\n\n### 20130807\n* Add tab-size support.\n* Add :fullscreen support.\n\n### 20130808\n* Allow to select browser versions by > and >= operator.\n* Fix flex properties in transition.\n\n### 20130810\n* Add Firefox 25 data.\n\n### 20130824\n* Add Chrome 31 and 30 data.\n* Fix CSS comments parsing (by vladkens).\n\n## 0.6 “As High As Honor”\n* New faster API, which cache preprocessed data. Old API is deprecated.\n* A lot of perfomance improvements.\n* Add Opera 15 -webkit- prefix support.\n* Update Chrome 29 and Safari 7 prefixes data.\n* Add minor browsers in popularity select.\n* Better syntax error messages.\n\n### 20130721\n* Add Chrome 30 data.\n\n### 20130728\n* Don’t remove non-standard -webkit-background-clip: text.\n* Don’t remove IE hack on CSS parse.\n\n### 20130729\n* Add Opera 16 data.\n* Fix “Invalid range in character class” error on Firefox.\n\n### 20130730\n* Fix correct clone comments inside keyframes (by Alexey Plutalov).\n* Fix angle recalculation in gradients (by Roman Komarov).\n\n### 20130731\n* Add border-image support.\n\n## 0.5 “Ours is the Fury”\n* Rewrite Autoprefixer to be more flexible.\n* Use css, instead of Rework, to fix CSS parsing errors faster.\n* Fix a lot of CSS parsing errors.\n\n### 20130616\n* More useful message for CSS parsing errors.\n* Remove old WebKit gradient syntax.\n* Fix parsing error on comment with braces.\n\n### 20130617\n* Remove old Mozilla border-radius.\n* Don’t prefix old IE filter.\n* Remove old background-clip, background-size and background-origin prefixes.\n* Speed up regexps in values.\n* Allow to hack property declarations.\n\n### 20130625\n* Convert flexbox properties to 2009 and 2012 specifications.\n* Improve messages on syntax errors.\n\n### 20130626\n* Add Firefox 24 data.\n* Add prefixes for font-feature-settings.\n\n### 20130629\n* Fix convert flex properties to old box-flex.\n\n## 0.4 “Winter Is Coming”\n* Remove outdated prefixes.\n* Add border-radius and box-shadow properties to database.\n* Change degrees in webkit gradients.\n\n### 20130515\n* Add old syntax in gradient direction.\n* Add old syntax for display: flex.\n* Update browser global usage statistics.\n\n### 20130521\n* Add Firefox 23 data.\n\n### 20130524\n* Add Chrome 29 data.\n\n### 20130528\n* Fix compatibilty with Rework from git master.\n* Add minor browsers to data, which can be selected only directly.\n\n### 20130530\n* Add Opera 15 and iOS 6.1 data.\n* Fix iOS versions in properties and values data.\n\n### 20130603\n* Use latest Rework 0.15 with a lot of CSS parsing fixes.\n* Update browsers usage statistics.\n\n## 0.3 “Growing Strong”\n* Rename `autoprefixer.filter()` to `autoprefixer.rework()`.\n* Use own filters instead of Rework’s `prefix` and `prefixValue`.\n* Smarter value prefixer without false match “order” in “border”.\n* 40% faster.\n* Don’t add unnecessary properties instead of Rework’s `prefixValue`.\n* Don’t change properties order.\n* Sort properties and values in inspect output.\n* Add main to component config (by Jonathan Ong).\n* Fix documentation (by Sergey Leschina and Mark Vasilkov).\n\n### 20130424\n* Fix value override in prefixer.\n\n### 20130427\n* Prefix several same values in one property.\n* Fix Windows support in binary.\n* Improve print errors in binary.\n\n### 20130502\n* Don’t add -webkit- prefix to IE filter.\n* Don’t duplicate prefixes on second run.\n\n## 0.2 “Hear Me Roar!”\n* Update parse libraries.\n* Use component package manager to build standalone script.\n* Add inspect to standalone script.\n\n## 0.1 “Fire and Blood”\n* Initial release.\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright 2013 Andrey Sitnik <andrey@sitnik.ru>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Autoprefixer [![Cult Of Martians][cult-img]][cult]\n\n<img align=\"right\" width=\"94\" height=\"71\"\n     src=\"https://postcss.github.io/autoprefixer/logo.svg\"\n     title=\"Autoprefixer logo by Anton Lovchikov\">\n\n[PostCSS] plugin to parse CSS and add vendor prefixes to CSS rules using values\nfrom [Can I Use]. It is recommended by Google and used in Twitter and Alibaba.\n\nWrite your CSS rules without vendor prefixes (in fact, forget about them\nentirely):\n\n```css\n::placeholder {\n  color: gray;\n}\n\n.image {\n  width: stretch;\n}\n```\n\nAutoprefixer will use the data based on current browser popularity and property\nsupport to apply prefixes for you. You can try the [interactive demo]\nof Autoprefixer.\n\n```css\n::-moz-placeholder {\n  color: gray;\n}\n::placeholder {\n  color: gray;\n}\n\n.image {\n  width: -webkit-fill-available;\n  width: -moz-available;\n  width: stretch;\n}\n```\n\nTwitter account for news and releases: [@autoprefixer].\n\n<a href=\"https://evilmartians.com/?utm_source=autoprefixer\">\n<img src=\"https://evilmartians.com/badges/sponsored-by-evil-martians.svg\" alt=\"Sponsored by Evil Martians\" width=\"236\" height=\"54\">\n</a>\n\n[interactive demo]: https://autoprefixer.github.io/\n[@autoprefixer]:    https://twitter.com/autoprefixer\n[Can I Use]:        https://caniuse.com/\n[cult-img]:         https://cultofmartians.com/assets/badges/badge.svg\n[PostCSS]:          https://github.com/postcss/postcss\n[cult]:             https://cultofmartians.com/tasks/autoprefixer-grid.html\n\n\n## Contents\n\n* [Contents](#contents)\n* [Browsers](#browsers)\n* [FAQ](#faq)\n  * [Does Autoprefixer polyfill Grid Layout for IE?](#does-autoprefixer-polyfill-grid-layout-for-ie)\n  * [Does it add polyfills?](#does-it-add-polyfills)\n  * [Why doesn’t Autoprefixer add prefixes to `border-radius`?](#why-doesnt-autoprefixer-add-prefixes-to-border-radius)\n  * [Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`?](#why-does-autoprefixer-use-unprefixed-properties-in--webkit-keyframes)\n  * [How to work with legacy `-webkit-` only code?](#how-to-work-with-legacy--webkit--only-code)\n  * [Does Autoprefixer add `-epub-` prefix?](#does-autoprefixer-add--epub--prefix)\n  * [Why doesn’t Autoprefixer transform generic font-family `system-ui`?](#why-doesnt-autoprefixer-transform-generic-font-family-system-ui)\n* [Usage](#usage)\n  * [Gulp](#gulp)\n  * [Webpack](#webpack)\n  * [CSS-in-JS](#css-in-js)\n  * [CLI](#cli)\n  * [Other Build Tools](#other-build-tools)\n    * [Preprocessors](#preprocessors)\n    * [GUI Tools](#gui-tools)\n  * [JavaScript](#javascript)\n  * [Text Editors and IDE](#text-editors-and-ide)\n* [Warnings](#warnings)\n* [Disabling](#disabling)\n  * [Prefixes](#prefixes)\n  * [Features](#features)\n  * [Control Comments](#control-comments)\n* [Options](#options)\n* [Environment Variables](#environment-variables)\n  * [Using environment variables to support CSS Grid prefixes in Create React App](#using-environment-variables-to-support-css-grid-prefixes-in-create-react-app)\n* [Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie)\n  * [Beware of enabling autoplacement in old projects](#beware-of-enabling-autoplacement-in-old-projects)\n  * [Autoplacement limitations](#autoplacement-limitations)\n    * [Both columns and rows must be defined](#both-columns-and-rows-must-be-defined)\n    * [Repeat auto-fit and auto-fill are not supported](#repeat-auto-fit-and-auto-fill-are-not-supported)\n    * [No manual cell placement or column/row spans allowed inside an autoplacement grid](#no-manual-cell-placement-or-columnrow-spans-allowed-inside-an-autoplacement-grid)\n    * [Do not create `::before` and `::after` pseudo elements](#do-not-create-before-and-after-pseudo-elements)\n    * [When changing the `grid gap` value, columns and rows must be re-declared](#when-changing-the-grid-gap-value-columns-and-rows-must-be-re-declared)\n* [Debug](#debug)\n* [Security Contact](#security-contact)\n* [For Enterprise](#for-enterprise)\n\n## Browsers\n\nAutoprefixer uses [Browserslist], so you can specify the browsers\nyou want to target in your project with queries like `> 5%`\n(see [Best Practices]).\n\nThe best way to provide browsers is a `.browserslistrc` file in your project\nroot, or by adding a `browserslist` key to your `package.json`.\n\nWe recommend the use of these options over passing options to Autoprefixer so\nthat the config can be shared with other tools such as [babel-preset-env] and\n[Stylelint].\n\nSee [Browserslist docs] for queries, browser names, config format, and defaults.\n\n[Browserslist docs]: https://github.com/browserslist/browserslist#queries\n[babel-preset-env]:  https://github.com/babel/babel/tree/master/packages/babel-preset-env\n[Best Practices]:    https://github.com/browserslist/browserslist#best-practices\n[Browserslist]:      https://github.com/browserslist/browserslist\n[Stylelint]:         https://stylelint.io/\n\n\n## FAQ\n\n### Does Autoprefixer polyfill Grid Layout for IE?\n\nAutoprefixer can be used to translate modern CSS Grid syntax into IE 10\nand IE 11 syntax, but this polyfill will not work in 100% of cases.\nThis is why it is disabled by default.\n\nFirst, you need to enable Grid prefixes by using either the `grid: \"autoplace\"`\noption or the `/* autoprefixer grid: autoplace */` control comment.\nAlso you can use environment variable to enable Grid:\n`AUTOPREFIXER_GRID=autoplace npm build`.\n\nSecond, you need to test every fix with Grid in IE. It is not an enable and\nforget feature, but it is still very useful.\nFinancial Times and Yandex use it in production.\n\nThird, there is only very limited auto placement support. Read the\n[Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie) section\nfor more details.\n\nFourth, if you are not using the autoplacement feature, the best way\nto use Autoprefixer is by using  `grid-template` or `grid-template-areas`.\n\n```css\n.page {\n  display: grid;\n  grid-gap: 33px;\n  grid-template:\n    \"head head  head\" 1fr\n    \"nav  main  main\" minmax(100px, 1fr)\n    \"nav  foot  foot\" 2fr /\n    1fr   100px 1fr;\n}\n.page__head {\n  grid-area: head;\n}\n.page__nav {\n  grid-area: nav;\n}\n.page__main {\n  grid-area: main;\n}\n.page__footer {\n  grid-area: foot;\n}\n```\n\nSee also:\n\n* [The guide about Grids in IE and Autoprefixer].\n* [`postcss-gap-properties`] to use new `gap` property\n  instead of old `grid-gap`.\n* [`postcss-grid-kiss`] has alternate “everything in one property” syntax,\n  which makes using Autoprefixer’s Grid translations safer.\n\n[The guide about Grids in IE and Autoprefixer]: https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/\n[`postcss-gap-properties`]:                     https://github.com/jonathantneal/postcss-gap-properties\n[`postcss-grid-kiss`]:                          https://github.com/sylvainpolletvillard/postcss-grid-kiss\n\n\n### Does it add polyfills?\n\nNo. Autoprefixer only adds prefixes.\n\nMost new CSS features will require client side JavaScript to handle a new\nbehavior correctly.\n\nDepending on what you consider to be a “polyfill”, you can take a look at some\nother tools and libraries. If you are just looking for syntax sugar,\nyou might take a look at:\n\n- [postcss-preset-env] is a plugins preset with polyfills and Autoprefixer\n  to write future CSS today.\n- [Oldie], a PostCSS plugin that handles some IE hacks (opacity, rgba, etc).\n- [postcss-flexbugs-fixes], a PostCSS plugin to fix flexbox issues.\n\n[postcss-flexbugs-fixes]: https://github.com/luisrudge/postcss-flexbugs-fixes\n[postcss-preset-env]:     https://github.com/jonathantneal/postcss-preset-env\n[Oldie]:                  https://github.com/jonathantneal/oldie\n\n\n### Why doesn’t Autoprefixer add prefixes to `border-radius`?\n\nDevelopers are often surprised by how few prefixes are required today.\nIf Autoprefixer doesn’t add prefixes to your CSS, check if they’re still\nrequired on [Can I Use].\n\n[Can I Use]: https://caniuse.com/\n\n\n### Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`?\n\nBrowser teams can remove some prefixes before others, so we try to use all\ncombinations of prefixed/unprefixed values.\n\n\n### How to work with legacy `-webkit-` only code?\n\nAutoprefixer needs unprefixed property to add prefixes. So if you only\nwrote `-webkit-gradient` without W3C’s `gradient`,\nAutoprefixer will not add other prefixes.\n\nBut [PostCSS] has plugins to convert CSS to unprefixed state.\nUse [postcss-unprefix] before Autoprefixer.\n\n[postcss-unprefix]: https://github.com/gucong3000/postcss-unprefix\n\n\n### Does Autoprefixer add `-epub-` prefix?\n\nNo, Autoprefixer works only with browsers prefixes from Can I Use.\nBut you can use [postcss-epub] for prefixing ePub3 properties.\n\n[postcss-epub]: https://github.com/Rycochet/postcss-epub\n\n\n### Why doesn’t Autoprefixer transform generic font-family `system-ui`?\n\n`system-ui` is technically not a prefix and the transformation is not\nfuture-proof. You can use [postcss-font-family-system-ui] to transform\n`system-ui` to a practical font-family list.\n\n[postcss-font-family-system-ui]: https://github.com/JLHwung/postcss-font-family-system-ui\n\n\n## Usage\n\n### Gulp\n\nIn Gulp you can use [gulp-postcss] with `autoprefixer` npm package.\n\n```js\ngulp.task('autoprefixer', () => {\n  const autoprefixer = require('autoprefixer')\n  const sourcemaps = require('gulp-sourcemaps')\n  const postcss = require('gulp-postcss')\n\n  return gulp.src('./src/*.css')\n    .pipe(sourcemaps.init())\n    .pipe(postcss([ autoprefixer() ]))\n    .pipe(sourcemaps.write('.'))\n    .pipe(gulp.dest('./dest'))\n})\n```\n\nWith `gulp-postcss` you also can combine Autoprefixer\nwith [other PostCSS plugins].\n\n[gulp-postcss]:          https://github.com/postcss/gulp-postcss\n[other PostCSS plugins]: https://github.com/postcss/postcss#plugins\n\n\n### Webpack\n\nIn [webpack] you can use [postcss-loader] with `autoprefixer`\nand [other PostCSS plugins].\n\n```js\nmodule.exports = {\n  module: {\n    rules: [\n      {\n        test: /\\.css$/,\n        use: [\"style-loader\", \"css-loader\", \"postcss-loader\"]\n      }\n    ]\n  }\n}\n```\n\nAnd create a `postcss.config.js` with:\n\n```js\nmodule.exports = {\n  plugins: [\n    require('autoprefixer')\n  ]\n}\n```\n\n[other PostCSS plugins]: https://github.com/postcss/postcss#plugins\n[postcss-loader]:        https://github.com/postcss/postcss-loader\n[webpack]:               https://webpack.js.org/\n\n\n### CSS-in-JS\n\nThe best way to use PostCSS with CSS-in-JS is [`astroturf`].\nAdd its loader to your `webpack.config.js`:\n\n```js\nmodule.exports = {\n  module: {\n    rules: [\n      {\n        test: /\\.css$/,\n        use: ['style-loader', 'postcss-loader'],\n      },\n      {\n        test: /\\.jsx?$/,\n        use: ['babel-loader', 'astroturf/loader'],\n      }\n    ]\n  }\n}\n```\n\nThen create `postcss.config.js`:\n\n```js\nmodule.exports = {\n  plugins: [\n    require('autoprefixer')\n  ]\n}\n```\n\n[`astroturf`]: https://github.com/4Catalyzer/astroturf\n\n\n### CLI\n\nYou can use the [postcss-cli] to run Autoprefixer from CLI:\n\n```sh\nnpm install postcss postcss-cli autoprefixer\nnpx postcss *.css --use autoprefixer -d build/\n```\n\nSee `postcss -h` for help.\n\n[postcss-cli]: https://github.com/postcss/postcss-cli\n\n\n### Other Build Tools\n\n* **Grunt:** [grunt-postcss]\n* **Ruby on Rails**: [autoprefixer-rails]\n* **Neutrino**: [neutrino-middleware-postcss]\n* **Jekyll**: add `autoprefixer-rails` and `jekyll-assets` to `Gemfile`\n* **Brunch**: [postcss-brunch]\n* **Broccoli**: [broccoli-postcss]\n* **Middleman**: [middleman-autoprefixer]\n* **Mincer**: add `autoprefixer` npm package and enable it:\n  `environment.enable('autoprefixer')`\n\n[neutrino-middleware-postcss]: https://www.npmjs.com/package/neutrino-middleware-postcss\n[middleman-autoprefixer]:      https://github.com/middleman/middleman-autoprefixer\n[autoprefixer-rails]:          https://github.com/ai/autoprefixer-rails\n[broccoli-postcss]:            https://github.com/jeffjewiss/broccoli-postcss\n[postcss-brunch]:              https://github.com/iamvdo/postcss-brunch\n[grunt-postcss]:               https://github.com/C-Lodder/grunt-postcss\n\n\n#### Preprocessors\n\n* **Less**: [less-plugin-autoprefix]\n* **Stylus**: [autoprefixer-stylus]\n* **Compass**: [autoprefixer-rails#compass]\n\n[less-plugin-autoprefix]: https://github.com/less/less-plugin-autoprefix\n[autoprefixer-stylus]:    https://github.com/jenius/autoprefixer-stylus\n[autoprefixer-rails#compass]:     https://github.com/ai/autoprefixer-rails#compass\n\n\n#### GUI Tools\n\n* [CodeKit](https://codekitapp.com/help/autoprefixer/)\n* [Prepros](https://prepros.io)\n\n\n### JavaScript\n\nYou can use Autoprefixer with [PostCSS] in your Node.js application\nor if you want to develop an Autoprefixer plugin for a new environment.\n\n```js\nconst autoprefixer = require('autoprefixer')\nconst postcss = require('postcss')\n\npostcss([ autoprefixer ]).process(css).then(result => {\n  result.warnings().forEach(warn => {\n    console.warn(warn.toString())\n  })\n  console.log(result.css)\n})\n```\n\nThere is also a [standalone build] for the browser or for a non-Node.js runtime.\n\nYou can use [html-autoprefixer] to process HTML with inlined CSS.\n\n[html-autoprefixer]: https://github.com/RebelMail/html-autoprefixer\n[standalone build]:  https://raw.github.com/ai/autoprefixer-rails/master/vendor/autoprefixer.js\n[PostCSS]:           https://github.com/postcss/postcss\n\n\n### Text Editors and IDE\n\nAutoprefixer should be used in assets build tools. Text editor plugins are not\na good solution, because prefixes decrease code readability and you will need\nto change values in all prefixed properties.\n\nI recommend you to learn how to use build tools like [Parcel].\nThey work much better and will open you a whole new world of useful plugins\nand automation.\n\nIf you can’t move to a build tool, you can use text editor plugins:\n\n* [Visual Studio Code](https://github.com/mrmlnc/vscode-autoprefixer)\n* [Sublime Text](https://github.com/sindresorhus/sublime-autoprefixer)\n\n[Parcel]: https://parceljs.org/\n\n\n## Warnings\n\nAutoprefixer uses the [PostCSS warning API] to warn about really important\nproblems in your CSS:\n\n* Old direction syntax in gradients.\n* Old unprefixed `display: box` instead of `display: flex`\n  by latest specification version.\n\nYou can get warnings from `result.warnings()`:\n\n```js\nresult.warnings().forEach(warn => {\n  console.warn(warn.toString())\n})\n```\n\nEvery Autoprefixer runner should display these warnings.\n\n[PostCSS warning API]: https://postcss.org/api/#warning\n\n\n## Disabling\n\n### Prefixes\n\nAutoprefixer was designed to have no interface – it just works.\nIf you need some browser specific hack just write a prefixed property\nafter the unprefixed one.\n\n```css\na {\n  transform: scale(0.5);\n  -moz-transform: scale(0.6);\n}\n```\n\nIf some prefixes were generated incorrectly, please create an [issue on GitHub].\n\n[issue on GitHub]: https://github.com/postcss/autoprefixer/issues\n\n\n### Features\n\nYou can use these plugin options to control some of Autoprefixer’s features.\n\n* `grid: \"autoplace\"` will enable `-ms-` prefixes for Grid Layout including some\n  [limited autoplacement support](#grid-autoplacement-support-in-ie).\n* `supports: false` will disable `@supports` parameters prefixing.\n* `flexbox: false` will disable flexbox properties prefixing.\n  Or `flexbox: \"no-2009\"` will add prefixes only for final and IE\n  versions of specification.\n* `remove: false` will disable cleaning outdated prefixes.\n\nYou should set them inside the plugin like so:\n\n```js\nautoprefixer({ grid: 'autoplace' })\n```\n\n\n### Control Comments\n\nIf you do not need Autoprefixer in some part of your CSS,\nyou can use control comments to disable Autoprefixer.\n\n```css\n.a {\n  transition: 1s; /* will be prefixed */\n}\n\n.b {\n  /* autoprefixer: off */\n  transition: 1s; /* will not be prefixed */\n}\n\n.c {\n  /* autoprefixer: ignore next */\n  transition: 1s; /* will not be prefixed */\n  mask: url(image.png); /* will be prefixed */\n}\n```\n\nThere are three types of control comments:\n\n* `/* autoprefixer: (on|off) */`: enable/disable all Autoprefixer translations for the\n  whole block both *before* and *after* the comment.\n* `/* autoprefixer: ignore next */`: disable Autoprefixer only for the next property\n  or next rule selector or at-rule parameters (but not rule/at‑rule body).\n* `/* autoprefixer grid: (autoplace|no-autoplace|off) */`: control how Autoprefixer handles\n  grid translations for the whole block:\n  * `autoplace`: enable grid translations with autoplacement support.\n  * `no-autoplace`: enable grid translations with autoplacement\n    support *disabled* (alias for deprecated value `on`).\n  * `off`: disable all grid translations.\n\nYou can also use comments recursively:\n\n```css\n/* autoprefixer: off */\n@supports (transition: all) {\n  /* autoprefixer: on */\n  a {\n    /* autoprefixer: off */\n  }\n}\n```\n\nNote that comments that disable the whole block should not be featured in the same\nblock twice:\n\n```css\n/* How not to use block level control comments */\n\n.do-not-do-this {\n  /* autoprefixer: off */\n  transition: 1s;\n  /* autoprefixer: on */\n  transform: rotate(20deg);\n}\n```\n\n\n## Options\n\nFunction `autoprefixer(options)` returns a new PostCSS plugin.\nSee [PostCSS API] for plugin usage documentation.\n\n```js\nautoprefixer({ cascade: false })\n```\n\nAvailable options are:\n\n* `env` (string): environment for Browserslist.\n* `cascade` (boolean): should Autoprefixer use Visual Cascade,\n  if CSS is uncompressed. Default: `true`\n* `add` (boolean): should Autoprefixer add prefixes. Default is `true`.\n* `remove` (boolean): should Autoprefixer [remove outdated] prefixes.\n  Default is `true`.\n* `supports` (boolean): should Autoprefixer add prefixes for `@supports`\n  parameters. Default is `true`.\n* `flexbox` (boolean|string): should Autoprefixer add prefixes for flexbox\n  properties. With `\"no-2009\"` value Autoprefixer will add prefixes only\n  for final and IE 10 versions of specification. Default is `true`.\n* `grid` (false|`\"autoplace\"`|`\"no-autoplace\"`): should Autoprefixer\n  add IE 10-11 prefixes for Grid Layout properties?\n    * `false` (default): prevent Autoprefixer from outputting\n       CSS Grid translations.\n    * `\"autoplace\"`: enable Autoprefixer grid translations\n      and *include* autoplacement support. You can also use\n      `/* autoprefixer grid: autoplace */` in your CSS.\n    * `\"no-autoplace\"`: enable Autoprefixer grid translations\n      but *exclude* autoplacement support. You can also use\n      `/* autoprefixer grid: no-autoplace */` in your CSS.\n      (alias for the deprecated `true` value)\n* `stats` (object): custom [usage statistics] for `> 10% in my stats`\n  browsers query.\n* `overrideBrowserslist` (array): list of queries for target browsers.\n  Try to not use it. The best practice is to use `.browserslistrc` config\n  or `browserslist` key in `package.json` to share target browsers\n  with Babel, ESLint and Stylelint. See [Browserslist docs]\n  for available queries and default value.\n* `ignoreUnknownVersions` (boolean): do not raise error on unknown browser\n  version in Browserslist config. Default is `false`.\n\nPlugin object has `info()` method for debugging purpose.\n\nYou can use PostCSS processor to process several CSS files\nto increase performance.\n\n[usage statistics]: https://github.com/browserslist/browserslist#custom-usage-data\n[PostCSS API]:      https://postcss.org/api/\n\n## Environment Variables\n\n* `AUTOPREFIXER_GRID`: (`autoplace`|`no-autoplace`) should Autoprefixer\n  add IE 10-11 prefixes for Grid Layout properties?\n    * `autoplace`: enable Autoprefixer grid translations\n      and *include* autoplacement support.\n    * `no-autoplace`: enable Autoprefixer grid translations\n      but *exclude* autoplacement support.\n\nEnvironment variables are useful, when you want to change Autoprefixer options but don't have access to config files.\n[Create React App] is a good example of this.\n\n[Create React App]: (https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)\n\n### Using environment variables to support CSS Grid prefixes in Create React App\n\n1. Install the latest version of Autoprefixer and [cross-env](https://www.npmjs.com/package/cross-env):\n\n```\nnpm install autoprefixer@latest cross-env --save-dev\n```\n\n2. Under `\"browserslist\"` > `\"development\"` in the package.json file, add `\"last 1 ie version\"`\n\n```\n\"browserslist\": {\n  \"production\": [\n    \">0.2%\",\n    \"not dead\",\n    \"not op_mini all\"\n  ],\n  \"development\": [\n    \"last 1 chrome version\",\n    \"last 1 firefox version\",\n    \"last 1 safari version\",\n    \"last 1 ie version\"\n  ]\n}\n```\n\n3. Update `\"scripts\"` in the package.json file to the following:\n\n```\n\"scripts\": {\n  \"start\": \"cross-env AUTOPREFIXER_GRID=autoplace react-scripts start\",\n  \"build\": \"cross-env AUTOPREFIXER_GRID=autoplace react-scripts build\",\n  \"test\": \"cross-env AUTOPREFIXER_GRID=autoplace react-scripts test\",\n  \"eject\": \"react-scripts eject\"\n},\n```\n\nReplace `autoplace` with `no-autoplace` in the above example if you prefer to disable Autoprefixer Grid autoplacement support.\n\nNow when you run `npm start` you will see CSS Grid prefixes automatically being applied to your output CSS.\n\nSee also [Browserslist environment variables] for more examples on how to use environment variables in your project.\n\n[Browserslist environment variables]: https://github.com/browserslist/browserslist#environment-variables\n\n## Grid Autoplacement support in IE\n\nIf the `grid` option is set to `\"autoplace\"`, limited autoplacement support is added to Autoprefixers grid translations. You can also use\nthe `/* autoprefixer grid: autoplace */` control comment or\n`AUTOPREFIXER_GRID=autoplace npm build` environment variable.\n\nAutoprefixer will only autoplace grid cells if both `grid-template-rows`\nand `grid-template-columns` has been set. If `grid-template`\nor `grid-template-areas` has been set, Autoprefixer will use area based\ncell placement instead.\n\nAutoprefixer supports autoplacement by using `nth-child` CSS selectors.\nIt creates [number of columns] x [number of rows] `nth-child` selectors.\nFor this reason Autoplacement is only supported within the explicit grid.\n\n```css\n/* Input CSS */\n\n/* autoprefixer grid: autoplace */\n\n.autoplacement-example {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  grid-template-rows: auto auto;\n  grid-gap: 20px;\n}\n```\n\n```css\n/* Output CSS */\n\n/* autoprefixer grid: autoplace */\n\n.autoplacement-example {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 20px 1fr;\n  grid-template-columns: 1fr 1fr;\n  -ms-grid-rows: auto 20px auto;\n  grid-template-rows: auto auto;\n  grid-gap: 20px;\n}\n\n.autoplacement-example > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n\n.autoplacement-example > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n\n.autoplacement-example > *:nth-child(3) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n}\n\n.autoplacement-example > *:nth-child(4) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n}\n```\n\n### Beware of enabling autoplacement in old projects\n\nBe careful about enabling autoplacement in any already established projects that have\npreviously not used Autoprefixer's grid autoplacement feature before.\n\nIf this was your html:\n\n```html\n<div class=\"grid\">\n  <div class=\"grid-cell\"></div>\n</div>\n```\n\nThe following CSS will not work as expected with the autoplacement feature enabled:\n\n```css\n/* Unsafe CSS when Autoplacement is enabled */\n\n.grid-cell {\n  grid-column: 2;\n  grid-row: 2;\n}\n\n.grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(3, 1fr);\n}\n```\n\nSwapping the rules around will not fix the issue either:\n\n```css\n/* Also unsafe to use this CSS */\n\n.grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(3, 1fr);\n}\n\n.grid-cell {\n  grid-column: 2;\n  grid-row: 2;\n}\n```\n\nOne way to deal with this issue is to disable autoplacement in the\ngrid-declaration rule:\n\n```css\n/* Disable autoplacement to fix the issue */\n\n.grid {\n  /* autoprefixer grid: no-autoplace */\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(3, 1fr);\n}\n\n.grid-cell {\n  grid-column: 2;\n  grid-row: 2;\n}\n```\n\nThe absolute best way to integrate autoplacement into already existing projects\nthough is to leave autoplacement turned off by default and then use a control\ncomment to enable it when needed. This method is far less likely to cause\nsomething on the site to break.\n\n```css\n/* Disable autoplacement by default in old projects */\n/* autoprefixer grid: no-autoplace */\n\n/* Old code will function the same way it always has */\n.old-grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(3, 1fr);\n}\n.old-grid-cell {\n  grid-column: 2;\n  grid-row: 2;\n}\n\n/* Enable autoplacement when you want to use it in new code */\n.new-autoplace-friendly-grid {\n  /* autoprefixer grid: autoplace */\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(3, auto);\n}\n```\n\nNote that the `grid: \"no-autoplace\"` setting and the\n`/* autoprefixer grid: no-autoplace */` control comment share identical\nfunctionality to the `grid: true` setting and the `/* autoprefixer grid: on */`\ncontrol comment. There is no need to refactor old code to use `no-autoplace`\nin place of the old `true` and `on` statements.\n\n### Autoplacement limitations\n\n#### Both columns and rows must be defined\n\nAutoplacement only works inside the explicit grid. The columns and rows need to be defined\nso that Autoprefixer knows how many `nth-child` selectors to generate.\n\n```css\n.not-allowed {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n}\n\n.is-allowed {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(10, auto);\n}\n```\n\n#### Repeat auto-fit and auto-fill are not supported\n\nThe `repeat(auto-fit, ...)` and `repeat(auto-fill, ...)` grid functionality relies on\nknowledge from the browser about screen dimensions and the number of available grid\nitems for it to work properly. Autoprefixer does not have access to this information\nso unfortunately this little snippet will _never_ be IE friendly.\n\n```css\n.grid {\n  /* This will never be IE friendly */\n  grid-template-columns: repeat(auto-fit, min-max(200px, 1fr))\n}\n```\n\n#### No manual cell placement or column/row spans allowed inside an autoplacement grid\n\nElements must not be manually placed or given column/row spans inside\nan autoplacement grid. Only the most basic of autoplacement grids are supported.\nGrid cells can still be placed manually outside the the explicit grid though.\nSupport for manually placing individual grid cells inside an explicit\nautoplacement grid is planned for a future release.\n\n```css\n.autoplacement-grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-rows: repeat(3, auto);\n}\n\n/* Grid cells placed inside the explicit grid\n   will break the layout in IE */\n.not-permitted-grid-cell {\n  grid-column: 1;\n  grid-row: 1;\n}\n\n/* Grid cells placed outside the\n   explicit grid will work in IE */\n.permitted-grid-cell {\n  grid-column: 1 / span 2;\n  grid-row: 4;\n}\n```\n\nIf manual cell placement is required, we recommend using `grid-template` or\n`grid-template-areas` instead:\n\n```css\n.page {\n  display: grid;\n  grid-gap: 30px;\n  grid-template:\n      \"head head\"\n      \"nav  main\" minmax(100px, 1fr)\n      \"foot foot\" /\n      200px 1fr;\n}\n.page__head {\n  grid-area: head;\n}\n.page__nav {\n  grid-area: nav;\n}\n.page__main {\n  grid-area: main;\n}\n.page__footer {\n  grid-area: foot;\n}\n```\n\n#### Do not create `::before` and `::after` pseudo elements\n\nLet's say you have this HTML:\n\n```html\n<div class=\"grid\">\n  <div class=\"grid-cell\"></div>\n</div>\n```\n\nAnd you write this CSS:\n\n```css\n.grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  grid-template-rows: auto;\n}\n\n.grid::before {\n  content: 'before';\n}\n\n.grid::after {\n  content: 'after';\n}\n```\n\nThis will be the output:\n\n```css\n.grid {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 1fr;\n  grid-template-columns: 1fr 1fr;\n  -ms-grid-rows: auto;\n  grid-template-rows: auto;\n}\n\n.grid > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n\n\n.grid > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 2;\n}\n\n.grid::before {\n  content: 'before';\n}\n\n.grid::after {\n  content: 'after';\n}\n```\n\nIE will place `.grid-cell`, `::before` and `::after` in row 1 column 1.\nModern browsers on the other hand will place `::before` in row 1 column 1,\n`.grid-cell` in row 1 column 2, and `::after` in row 2 column 1.\n\nSee this [CodePen](https://codepen.io/daniel-tonon/pen/gBymVw) to see a visualization\nof the issue. View the CodePen in both a modern browser and IE to see the difference.\n\nNote that you can still create `::before` and `::after` elements as long as you manually\nplace them outside the explicit grid.\n\n#### When changing the `grid gap` value, columns and rows must be re-declared\n\nIf you wish to change the size of a `grid-gap`, you will need to redeclare the grid columns and rows.\n\n```css\n.grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 50px;\n}\n\n/* This will *NOT* work in IE */\n@media (max-width: 600px) {\n  .grid {\n    grid-gap: 20px;\n  }\n}\n\n/* This will *NOT* work in IE */\n.grid.small-gap {\n  grid-gap: 20px;\n}\n```\n\n```css\n.grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 50px;\n}\n\n/* This *WILL* work in IE */\n@media (max-width: 600px) {\n  .grid {\n    grid-template-columns: 1fr 1fr;\n    grid-template-rows: auto;\n    grid-gap: 20px;\n  }\n}\n\n/* This *WILL* work in IE */\n.grid.small-gap {\n  grid-template-columns: 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 20px;\n}\n```\n\n## Debug\n\nRun `npx autoprefixer --info` in your project directory to check\nwhich browsers are selected and which properties will be prefixed:\n\n```console\n$ npx autoprefixer --info\nBrowsers:\n  Edge: 16\n\nThese browsers account for 0.26% of all users globally\n\nAt-Rules:\n  @viewport: ms\n\nSelectors:\n  ::placeholder: ms\n\nProperties:\n  appearance: webkit\n  flow-from: ms\n  flow-into: ms\n  hyphens: ms\n  overscroll-behavior: ms\n  region-fragment: ms\n  scroll-snap-coordinate: ms\n  scroll-snap-destination: ms\n  scroll-snap-points-x: ms\n  scroll-snap-points-y: ms\n  scroll-snap-type: ms\n  text-size-adjust: ms\n  text-spacing: ms\n  user-select: ms\n```\n\nJS API is also available:\n\n```js\nconsole.log(autoprefixer().info())\n```\n\n## Security Contact\n\nTo report a security vulnerability, please use the [Tidelift security contact].\nTidelift will coordinate the fix and disclosure.\n\n[Tidelift security contact]: https://tidelift.com/security\n\n## For Enterprise\n\nAvailable as part of the Tidelift Subscription.\n\nThe maintainers of `autoprefixer` and thousands of other packages are working\nwith Tidelift to deliver commercial support and maintenance for the open source\ndependencies you use to build your applications. Save time, reduce risk,\nand improve code health, while paying the maintainers of the exact dependencies\nyou use. [Learn more.](https://tidelift.com/subscription/pkg/npm-autoprefixer?utm_source=npm-autoprefixer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)\n"
  },
  {
    "path": "bin/autoprefixer",
    "content": "#!/usr/bin/env node\n\nlet mode = process.argv[2]\nif (mode === '--info') {\n  process.stdout.write(require('../')().info() + '\\n')\n} else if (mode === '--version') {\n  process.stdout.write(\n    'autoprefixer ' + require('../package.json').version + '\\n'\n  )\n} else {\n  process.stdout.write(\n    'autoprefix\\n' +\n      '\\n' +\n      'Options:\\n' +\n      '  --info    Show target browsers and used prefixes\\n' +\n      '  --version Show version number\\n' +\n      '  --help    Show help\\n' +\n      '\\n' +\n      'Usage:\\n' +\n      '  autoprefixer --info\\n'\n  )\n}\n"
  },
  {
    "path": "data/prefixes.js",
    "content": "let unpack = require('caniuse-lite/dist/unpacker/feature')\n\nfunction browsersSort(a, b) {\n  a = a.split(' ')\n  b = b.split(' ')\n  if (a[0] > b[0]) {\n    return 1\n  } else if (a[0] < b[0]) {\n    return -1\n  } else {\n    return Math.sign(parseFloat(a[1]) - parseFloat(b[1]))\n  }\n}\n\n// Convert Can I Use data\nfunction f(data, opts, callback) {\n  data = unpack(data)\n\n  if (!callback) {\n    ;[callback, opts] = [opts, {}]\n  }\n\n  let match = opts.match || /\\sx($|\\s)/\n  let need = []\n\n  for (let browser in data.stats) {\n    let versions = data.stats[browser]\n    for (let version in versions) {\n      let support = versions[version]\n      if (support.match(match)) {\n        need.push(browser + ' ' + version)\n      }\n    }\n  }\n\n  callback(need.sort(browsersSort))\n}\n\n// Add data for all properties\nlet result = {}\n\nfunction prefix(names, data) {\n  for (let name of names) {\n    result[name] = Object.assign({}, data)\n  }\n}\n\nfunction add(names, data) {\n  for (let name of names) {\n    result[name].browsers = result[name].browsers\n      .concat(data.browsers)\n      .sort(browsersSort)\n  }\n}\n\nmodule.exports = result\n\n// Border Radius\nlet prefixBorderRadius = require('caniuse-lite/data/features/border-radius')\n\nf(prefixBorderRadius, browsers =>\n  prefix(\n    [\n      'border-radius',\n      'border-top-left-radius',\n      'border-top-right-radius',\n      'border-bottom-right-radius',\n      'border-bottom-left-radius'\n    ],\n    {\n      browsers,\n      feature: 'border-radius',\n      mistakes: ['-khtml-', '-ms-', '-o-']\n    }\n  )\n)\n\n// Box Shadow\nlet prefixBoxshadow = require('caniuse-lite/data/features/css-boxshadow')\n\nf(prefixBoxshadow, browsers =>\n  prefix(['box-shadow'], {\n    browsers,\n    feature: 'css-boxshadow',\n    mistakes: ['-khtml-']\n  })\n)\n\n// Animation\nlet prefixAnimation = require('caniuse-lite/data/features/css-animation')\n\nf(prefixAnimation, browsers =>\n  prefix(\n    [\n      'animation',\n      'animation-name',\n      'animation-duration',\n      'animation-delay',\n      'animation-direction',\n      'animation-fill-mode',\n      'animation-iteration-count',\n      'animation-play-state',\n      'animation-timing-function',\n      '@keyframes'\n    ],\n    {\n      browsers,\n      feature: 'css-animation',\n      mistakes: ['-khtml-', '-ms-']\n    }\n  )\n)\n\n// Transition\nlet prefixTransition = require('caniuse-lite/data/features/css-transitions')\n\nf(prefixTransition, browsers =>\n  prefix(\n    [\n      'transition',\n      'transition-property',\n      'transition-duration',\n      'transition-delay',\n      'transition-timing-function'\n    ],\n    {\n      browsers,\n      feature: 'css-transitions',\n      mistakes: ['-khtml-', '-ms-']\n    }\n  )\n)\n\n// Transform 2D\nlet prefixTransform2d = require('caniuse-lite/data/features/transforms2d')\n\nf(prefixTransform2d, browsers =>\n  prefix(['transform', 'transform-origin'], {\n    browsers,\n    feature: 'transforms2d'\n  })\n)\n\n// Transform 3D\nlet prefixTransforms3d = require('caniuse-lite/data/features/transforms3d')\n\nf(prefixTransforms3d, browsers => {\n  prefix(['perspective', 'perspective-origin'], {\n    browsers,\n    feature: 'transforms3d'\n  })\n  return prefix(['transform-style'], {\n    browsers,\n    feature: 'transforms3d',\n    mistakes: ['-ms-', '-o-']\n  })\n})\n\nf(prefixTransforms3d, { match: /y\\sx|y\\s#2/ }, browsers =>\n  prefix(['backface-visibility'], {\n    browsers,\n    feature: 'transforms3d',\n    mistakes: ['-ms-', '-o-']\n  })\n)\n\n// Gradients\nlet prefixGradients = require('caniuse-lite/data/features/css-gradients')\n\nf(prefixGradients, { match: /y\\sx/ }, browsers =>\n  prefix(\n    [\n      'linear-gradient',\n      'repeating-linear-gradient',\n      'radial-gradient',\n      'repeating-radial-gradient'\n    ],\n    {\n      browsers,\n      feature: 'css-gradients',\n      mistakes: ['-ms-'],\n      props: [\n        'background',\n        'background-image',\n        'border-image',\n        'mask',\n        'list-style',\n        'list-style-image',\n        'content',\n        'mask-image'\n      ]\n    }\n  )\n)\n\nf(prefixGradients, { match: /a\\sx/ }, browsers => {\n  browsers = browsers.map(i => {\n    if (/firefox|op/.test(i)) {\n      return i\n    } else {\n      return `${i} old`\n    }\n  })\n  return add(\n    [\n      'linear-gradient',\n      'repeating-linear-gradient',\n      'radial-gradient',\n      'repeating-radial-gradient'\n    ],\n    {\n      browsers,\n      feature: 'css-gradients'\n    }\n  )\n})\n\n// Box sizing\nlet prefixBoxsizing = require('caniuse-lite/data/features/css3-boxsizing')\n\nf(prefixBoxsizing, browsers =>\n  prefix(['box-sizing'], {\n    browsers,\n    feature: 'css3-boxsizing'\n  })\n)\n\n// Filter Effects\nlet prefixFilters = require('caniuse-lite/data/features/css-filters')\n\nf(prefixFilters, browsers =>\n  prefix(['filter'], {\n    browsers,\n    feature: 'css-filters'\n  })\n)\n\n// filter() function\nlet prefixFilterFunction = require('caniuse-lite/data/features/css-filter-function')\n\nf(prefixFilterFunction, browsers =>\n  prefix(['filter-function'], {\n    browsers,\n    feature: 'css-filter-function',\n    props: [\n      'background',\n      'background-image',\n      'border-image',\n      'mask',\n      'list-style',\n      'list-style-image',\n      'content',\n      'mask-image'\n    ]\n  })\n)\n\n// Backdrop-filter\nlet prefixBackdropFilter = require('caniuse-lite/data/features/css-backdrop-filter')\n\nf(prefixBackdropFilter, { match: /y\\sx|y\\s#2/ }, browsers =>\n  prefix(['backdrop-filter'], {\n    browsers,\n    feature: 'css-backdrop-filter'\n  })\n)\n\n// element() function\nlet prefixElementFunction = require('caniuse-lite/data/features/css-element-function')\n\nf(prefixElementFunction, browsers =>\n  prefix(['element'], {\n    browsers,\n    feature: 'css-element-function',\n    props: [\n      'background',\n      'background-image',\n      'border-image',\n      'mask',\n      'list-style',\n      'list-style-image',\n      'content',\n      'mask-image'\n    ]\n  })\n)\n\n// Multicolumns\nlet prefixMulticolumns = require('caniuse-lite/data/features/multicolumn')\n\nf(prefixMulticolumns, browsers => {\n  prefix(\n    [\n      'columns',\n      'column-width',\n      'column-gap',\n      'column-rule',\n      'column-rule-color',\n      'column-rule-width',\n      'column-count',\n      'column-rule-style',\n      'column-span',\n      'column-fill'\n    ],\n    {\n      browsers,\n      feature: 'multicolumn'\n    }\n  )\n\n  let noff = browsers.filter(i => !/firefox/.test(i))\n  prefix(['break-before', 'break-after', 'break-inside'], {\n    browsers: noff,\n    feature: 'multicolumn'\n  })\n})\n\n// User select\nlet prefixUserSelect = require('caniuse-lite/data/features/user-select-none')\n\nf(prefixUserSelect, browsers =>\n  prefix(['user-select'], {\n    browsers,\n    feature: 'user-select-none',\n    mistakes: ['-khtml-']\n  })\n)\n\n// Flexible Box Layout\nlet prefixFlexbox = require('caniuse-lite/data/features/flexbox')\n\nf(prefixFlexbox, { match: /a\\sx/ }, browsers => {\n  browsers = browsers.map(i => {\n    if (/ie|firefox/.test(i)) {\n      return i\n    } else {\n      return `${i} 2009`\n    }\n  })\n  prefix(['display-flex', 'inline-flex'], {\n    browsers,\n    feature: 'flexbox',\n    props: ['display']\n  })\n  prefix(['flex', 'flex-grow', 'flex-shrink', 'flex-basis'], {\n    browsers,\n    feature: 'flexbox'\n  })\n  prefix(\n    [\n      'flex-direction',\n      'flex-wrap',\n      'flex-flow',\n      'justify-content',\n      'order',\n      'align-items',\n      'align-self',\n      'align-content'\n    ],\n    {\n      browsers,\n      feature: 'flexbox'\n    }\n  )\n})\n\nf(prefixFlexbox, { match: /y\\sx/ }, browsers => {\n  add(['display-flex', 'inline-flex'], {\n    browsers,\n    feature: 'flexbox'\n  })\n  add(['flex', 'flex-grow', 'flex-shrink', 'flex-basis'], {\n    browsers,\n    feature: 'flexbox'\n  })\n  add(\n    [\n      'flex-direction',\n      'flex-wrap',\n      'flex-flow',\n      'justify-content',\n      'order',\n      'align-items',\n      'align-self',\n      'align-content'\n    ],\n    {\n      browsers,\n      feature: 'flexbox'\n    }\n  )\n})\n\n// calc() unit\nlet prefixCalc = require('caniuse-lite/data/features/calc')\n\nf(prefixCalc, browsers =>\n  prefix(['calc'], {\n    browsers,\n    feature: 'calc',\n    props: ['*']\n  })\n)\n\n// Background options\nlet prefixBackgroundOptions = require('caniuse-lite/data/features/background-img-opts')\n\nf(prefixBackgroundOptions, browsers =>\n  prefix(['background-origin', 'background-size'], {\n    browsers,\n    feature: 'background-img-opts'\n  })\n)\n\n// background-clip: text\nlet prefixBackgroundClipText = require('caniuse-lite/data/features/background-clip-text')\n\nf(prefixBackgroundClipText, browsers =>\n  prefix(['background-clip'], {\n    browsers,\n    feature: 'background-clip-text'\n  })\n)\n\n// Font feature settings\nlet prefixFontFeature = require('caniuse-lite/data/features/font-feature')\n\nf(prefixFontFeature, browsers =>\n  prefix(\n    [\n      'font-feature-settings',\n      'font-variant-ligatures',\n      'font-language-override'\n    ],\n    {\n      browsers,\n      feature: 'font-feature'\n    }\n  )\n)\n\n// CSS font-kerning property\nlet prefixFontKerning = require('caniuse-lite/data/features/font-kerning')\n\nf(prefixFontKerning, browsers =>\n  prefix(['font-kerning'], {\n    browsers,\n    feature: 'font-kerning'\n  })\n)\n\n// Border image\nlet prefixBorderImage = require('caniuse-lite/data/features/border-image')\n\nf(prefixBorderImage, browsers =>\n  prefix(['border-image'], {\n    browsers,\n    feature: 'border-image'\n  })\n)\n\n// Selection selector\nlet prefixSelection = require('caniuse-lite/data/features/css-selection')\n\nf(prefixSelection, browsers =>\n  prefix(['::selection'], {\n    browsers,\n    feature: 'css-selection',\n    selector: true\n  })\n)\n\n// Placeholder selector\nlet prefixPlaceholder = require('caniuse-lite/data/features/css-placeholder')\n\nf(prefixPlaceholder, browsers => {\n  prefix(['::placeholder'], {\n    browsers: browsers.concat(['ie 10 old', 'ie 11 old', 'firefox 18 old']),\n    feature: 'css-placeholder',\n    selector: true\n  })\n})\n\n// Placeholder-shown selector\nlet prefixPlaceholderShown = require('caniuse-lite/data/features/css-placeholder-shown')\n\nf(prefixPlaceholderShown, browsers => {\n  prefix([':placeholder-shown'], {\n    browsers,\n    feature: 'css-placeholder-shown',\n    selector: true\n  })\n})\n\n// Hyphenation\nlet prefixHyphens = require('caniuse-lite/data/features/css-hyphens')\n\nf(prefixHyphens, browsers =>\n  prefix(['hyphens'], {\n    browsers,\n    feature: 'css-hyphens'\n  })\n)\n\n// Fullscreen selector\nlet prefixFullscreen = require('caniuse-lite/data/features/fullscreen')\n\nf(prefixFullscreen, browsers =>\n  prefix([':fullscreen'], {\n    browsers,\n    feature: 'fullscreen',\n    selector: true\n  })\n)\n\n// ::backdrop pseudo-element\n// https://caniuse.com/mdn-css_selectors_backdrop\nlet prefixBackdrop = require('caniuse-lite/data/features/mdn-css-backdrop-pseudo-element')\n\nf(prefixBackdrop, browsers =>\n  prefix(['::backdrop'], {\n    browsers,\n    feature: 'backdrop',\n    selector: true\n  })\n)\n\n// File selector button\nlet prefixFileSelectorButton = require('caniuse-lite/data/features/css-file-selector-button')\n\nf(prefixFileSelectorButton, browsers =>\n  prefix(['::file-selector-button'], {\n    browsers,\n    feature: 'file-selector-button',\n    selector: true\n  })\n)\n\n// :autofill\nlet prefixAutofill = require('caniuse-lite/data/features/css-autofill')\n\nf(prefixAutofill, browsers =>\n  prefix([':autofill'], {\n    browsers,\n    feature: 'css-autofill',\n    selector: true\n  })\n)\n\n// Tab size\nlet prefixTabsize = require('caniuse-lite/data/features/css3-tabsize')\n\nf(prefixTabsize, browsers =>\n  prefix(['tab-size'], {\n    browsers,\n    feature: 'css3-tabsize'\n  })\n)\n\n// Intrinsic & extrinsic sizing\nlet prefixIntrinsic = require('caniuse-lite/data/features/intrinsic-width')\n\nlet sizeProps = [\n  'width',\n  'min-width',\n  'max-width',\n  'height',\n  'min-height',\n  'max-height',\n  'inline-size',\n  'min-inline-size',\n  'max-inline-size',\n  'block-size',\n  'min-block-size',\n  'max-block-size',\n  'grid',\n  'grid-template',\n  'grid-template-rows',\n  'grid-template-columns',\n  'grid-auto-columns',\n  'grid-auto-rows'\n]\n\nf(prefixIntrinsic, browsers =>\n  prefix(['max-content', 'min-content'], {\n    browsers,\n    feature: 'intrinsic-width',\n    props: sizeProps\n  })\n)\n\nf(prefixIntrinsic, { match: /x|\\s#4/ }, browsers =>\n  prefix(['fill', 'fill-available'], {\n    browsers,\n    feature: 'intrinsic-width',\n    props: sizeProps\n  })\n)\n\nf(prefixIntrinsic, { match: /x|\\s#5/ }, browsers => {\n  let ffFix = browsers.filter(i => {\n    let [name, version] = i.split(' ')\n    if (name === 'firefox' || name === 'and_ff') {\n      return parseInt(version) < 94\n    } else {\n      return true\n    }\n  })\n  return prefix(['fit-content'], {\n    browsers: ffFix,\n    feature: 'intrinsic-width',\n    props: sizeProps\n  })\n})\n\n// Stretch value\n\nlet prefixStretch = require('caniuse-lite/data/features/css-width-stretch')\n\nf(prefixStretch, browsers => {\n  f(prefixIntrinsic, { match: /x|\\s#2/ }, firefox => {\n    browsers = browsers.concat(firefox)\n  })\n  return prefix(['stretch'], {\n    browsers,\n    feature: 'css-width-stretch',\n    props: sizeProps\n  })\n})\n\n// Zoom cursors\nlet prefixCursorsNew = require('caniuse-lite/data/features/css3-cursors-newer')\n\nf(prefixCursorsNew, browsers =>\n  prefix(['zoom-in', 'zoom-out'], {\n    browsers,\n    feature: 'css3-cursors-newer',\n    props: ['cursor']\n  })\n)\n\n// Grab cursors\nlet prefixCursorsGrab = require('caniuse-lite/data/features/css3-cursors-grab')\n\nf(prefixCursorsGrab, browsers =>\n  prefix(['grab', 'grabbing'], {\n    browsers,\n    feature: 'css3-cursors-grab',\n    props: ['cursor']\n  })\n)\n\n// Sticky position\nlet prefixSticky = require('caniuse-lite/data/features/css-sticky')\n\nf(prefixSticky, browsers =>\n  prefix(['sticky'], {\n    browsers,\n    feature: 'css-sticky',\n    props: ['position']\n  })\n)\n\n// Pointer Events\nlet prefixPointer = require('caniuse-lite/data/features/pointer')\n\nf(prefixPointer, browsers =>\n  prefix(['touch-action'], {\n    browsers,\n    feature: 'pointer'\n  })\n)\n\n// Text decoration\nlet prefixDecoration = require('caniuse-lite/data/features/text-decoration')\n\nf(prefixDecoration, { match: /x.*#[235]/ }, browsers =>\n  prefix(['text-decoration-skip', 'text-decoration-skip-ink'], {\n    browsers,\n    feature: 'text-decoration'\n  })\n)\n\nlet prefixDecorationShorthand = require('caniuse-lite/data/features/mdn-text-decoration-shorthand')\n\nf(prefixDecorationShorthand, browsers =>\n  prefix(['text-decoration'], {\n    browsers,\n    feature: 'text-decoration'\n  })\n)\n\nlet prefixDecorationColor = require('caniuse-lite/data/features/mdn-text-decoration-color')\n\nf(prefixDecorationColor, browsers =>\n  prefix(['text-decoration-color'], {\n    browsers,\n    feature: 'text-decoration'\n  })\n)\n\nlet prefixDecorationLine = require('caniuse-lite/data/features/mdn-text-decoration-line')\n\nf(prefixDecorationLine, browsers =>\n  prefix(['text-decoration-line'], {\n    browsers,\n    feature: 'text-decoration'\n  })\n)\n\nlet prefixDecorationStyle = require('caniuse-lite/data/features/mdn-text-decoration-style')\n\nf(prefixDecorationStyle, browsers =>\n  prefix(['text-decoration-style'], {\n    browsers,\n    feature: 'text-decoration'\n  })\n)\n\n// Text Size Adjust\nlet prefixTextSizeAdjust = require('caniuse-lite/data/features/text-size-adjust')\n\nf(prefixTextSizeAdjust, browsers =>\n  prefix(['text-size-adjust'], {\n    browsers,\n    feature: 'text-size-adjust'\n  })\n)\n\n// CSS Masks\nlet prefixCssMasks = require('caniuse-lite/data/features/css-masks')\n\nf(prefixCssMasks, browsers => {\n  prefix(\n    [\n      'mask-clip',\n      'mask-composite',\n      'mask-image',\n      'mask-origin',\n      'mask-repeat',\n      'mask-border-repeat',\n      'mask-border-source'\n    ],\n    {\n      browsers,\n      feature: 'css-masks'\n    }\n  )\n  prefix(\n    [\n      'mask',\n      'mask-position',\n      'mask-size',\n      'mask-border',\n      'mask-border-outset',\n      'mask-border-width',\n      'mask-border-slice'\n    ],\n    {\n      browsers,\n      feature: 'css-masks'\n    }\n  )\n})\n\n// CSS clip-path property\nlet prefixClipPath = require('caniuse-lite/data/features/css-clip-path')\n\nf(prefixClipPath, browsers =>\n  prefix(['clip-path'], {\n    browsers,\n    feature: 'css-clip-path'\n  })\n)\n\n// Fragmented Borders and Backgrounds\nlet prefixBoxdecoration = require('caniuse-lite/data/features/css-boxdecorationbreak')\n\nf(prefixBoxdecoration, browsers =>\n  prefix(['box-decoration-break'], {\n    browsers,\n    feature: 'css-boxdecorationbreak'\n  })\n)\n\n// CSS3 object-fit/object-position\nlet prefixObjectFit = require('caniuse-lite/data/features/object-fit')\n\nf(prefixObjectFit, browsers =>\n  prefix(['object-fit', 'object-position'], {\n    browsers,\n    feature: 'object-fit'\n  })\n)\n\n// CSS Shapes\nlet prefixShapes = require('caniuse-lite/data/features/css-shapes')\n\nf(prefixShapes, browsers =>\n  prefix(['shape-margin', 'shape-outside', 'shape-image-threshold'], {\n    browsers,\n    feature: 'css-shapes'\n  })\n)\n\n// CSS3 text-overflow\nlet prefixTextOverflow = require('caniuse-lite/data/features/text-overflow')\n\nf(prefixTextOverflow, browsers =>\n  prefix(['text-overflow'], {\n    browsers,\n    feature: 'text-overflow'\n  })\n)\n\n// Viewport at-rule\nlet prefixDeviceadaptation = require('caniuse-lite/data/features/css-deviceadaptation')\n\nf(prefixDeviceadaptation, browsers =>\n  prefix(['@viewport'], {\n    browsers,\n    feature: 'css-deviceadaptation'\n  })\n)\n\n// Resolution Media Queries\nlet prefixResolut = require('caniuse-lite/data/features/css-media-resolution')\n\nf(prefixResolut, { match: /( x($| )|a #2)/ }, browsers =>\n  prefix(['@resolution'], {\n    browsers,\n    feature: 'css-media-resolution'\n  })\n)\n\n// CSS text-align-last\nlet prefixTextAlignLast = require('caniuse-lite/data/features/css-text-align-last')\n\nf(prefixTextAlignLast, browsers =>\n  prefix(['text-align-last'], {\n    browsers,\n    feature: 'css-text-align-last'\n  })\n)\n\n// Crisp Edges Image Rendering Algorithm\nlet prefixCrispedges = require('caniuse-lite/data/features/css-crisp-edges')\n\nf(prefixCrispedges, { match: /y x|a x #1/ }, browsers =>\n  prefix(['pixelated'], {\n    browsers,\n    feature: 'css-crisp-edges',\n    props: ['image-rendering']\n  })\n)\n\nf(prefixCrispedges, { match: /a x #2/ }, browsers =>\n  prefix(['image-rendering'], {\n    browsers,\n    feature: 'css-crisp-edges'\n  })\n)\n\n// Logical Properties\nlet prefixLogicalProps = require('caniuse-lite/data/features/css-logical-props')\n\nf(prefixLogicalProps, browsers =>\n  prefix(\n    [\n      'border-inline-start',\n      'border-inline-end',\n      'margin-inline-start',\n      'margin-inline-end',\n      'padding-inline-start',\n      'padding-inline-end'\n    ],\n    {\n      browsers,\n      feature: 'css-logical-props'\n    }\n  )\n)\n\nf(prefixLogicalProps, { match: /x\\s#2/ }, browsers =>\n  prefix(\n    [\n      'border-block-start',\n      'border-block-end',\n      'margin-block-start',\n      'margin-block-end',\n      'padding-block-start',\n      'padding-block-end'\n    ],\n    {\n      browsers,\n      feature: 'css-logical-props'\n    }\n  )\n)\n\n// CSS appearance\nlet prefixAppearance = require('caniuse-lite/data/features/css-appearance')\n\nf(prefixAppearance, { match: /#2|x/ }, browsers =>\n  prefix(['appearance'], {\n    browsers,\n    feature: 'css-appearance'\n  })\n)\n\n// CSS Scroll snap points\nlet prefixSnappoints = require('caniuse-lite/data/features/css-snappoints')\n\nf(prefixSnappoints, browsers =>\n  prefix(\n    [\n      'scroll-snap-type',\n      'scroll-snap-coordinate',\n      'scroll-snap-destination',\n      'scroll-snap-points-x',\n      'scroll-snap-points-y'\n    ],\n    {\n      browsers,\n      feature: 'css-snappoints'\n    }\n  )\n)\n\n// CSS Regions\nlet prefixRegions = require('caniuse-lite/data/features/css-regions')\n\nf(prefixRegions, browsers =>\n  prefix(['flow-into', 'flow-from', 'region-fragment'], {\n    browsers,\n    feature: 'css-regions'\n  })\n)\n\n// CSS image-set\nlet prefixImageSet = require('caniuse-lite/data/features/css-image-set')\n\nf(prefixImageSet, browsers =>\n  prefix(['image-set'], {\n    browsers,\n    feature: 'css-image-set',\n    props: [\n      'background',\n      'background-image',\n      'border-image',\n      'cursor',\n      'mask',\n      'mask-image',\n      'list-style',\n      'list-style-image',\n      'content'\n    ]\n  })\n)\n\n// Writing Mode\nlet prefixWritingMode = require('caniuse-lite/data/features/css-writing-mode')\n\nf(prefixWritingMode, { match: /a|x/ }, browsers =>\n  prefix(['writing-mode'], {\n    browsers,\n    feature: 'css-writing-mode'\n  })\n)\n\n// Cross-Fade Function\nlet prefixCrossFade = require('caniuse-lite/data/features/css-cross-fade')\n\nf(prefixCrossFade, browsers =>\n  prefix(['cross-fade'], {\n    browsers,\n    feature: 'css-cross-fade',\n    props: [\n      'background',\n      'background-image',\n      'border-image',\n      'mask',\n      'list-style',\n      'list-style-image',\n      'content',\n      'mask-image'\n    ]\n  })\n)\n\n// Read Only selector\nlet prefixReadOnly = require('caniuse-lite/data/features/css-read-only-write')\n\nf(prefixReadOnly, browsers =>\n  prefix([':read-only', ':read-write'], {\n    browsers,\n    feature: 'css-read-only-write',\n    selector: true\n  })\n)\n\n// Text Emphasize\nlet prefixTextEmphasis = require('caniuse-lite/data/features/text-emphasis')\n\nf(prefixTextEmphasis, browsers =>\n  prefix(\n    [\n      'text-emphasis',\n      'text-emphasis-position',\n      'text-emphasis-style',\n      'text-emphasis-color'\n    ],\n    {\n      browsers,\n      feature: 'text-emphasis'\n    }\n  )\n)\n\n// CSS Grid Layout\nlet prefixGrid = require('caniuse-lite/data/features/css-grid')\n\nf(prefixGrid, browsers => {\n  prefix(['display-grid', 'inline-grid'], {\n    browsers,\n    feature: 'css-grid',\n    props: ['display']\n  })\n  prefix(\n    [\n      'grid-template-columns',\n      'grid-template-rows',\n      'grid-row-start',\n      'grid-column-start',\n      'grid-row-end',\n      'grid-column-end',\n      'grid-row',\n      'grid-column',\n      'grid-area',\n      'grid-template',\n      'grid-template-areas',\n      'place-self'\n    ],\n    {\n      browsers,\n      feature: 'css-grid'\n    }\n  )\n})\n\nf(prefixGrid, { match: /a x/ }, browsers =>\n  prefix(['grid-column-align', 'grid-row-align'], {\n    browsers,\n    feature: 'css-grid'\n  })\n)\n\n// CSS text-spacing\nlet prefixTextSpacing = require('caniuse-lite/data/features/css-text-spacing')\n\nf(prefixTextSpacing, browsers =>\n  prefix(['text-spacing'], {\n    browsers,\n    feature: 'css-text-spacing'\n  })\n)\n\n// :any-link selector\nlet prefixAnyLink = require('caniuse-lite/data/features/css-any-link')\n\nf(prefixAnyLink, browsers =>\n  prefix([':any-link'], {\n    browsers,\n    feature: 'css-any-link',\n    selector: true\n  })\n)\n\n// unicode-bidi\n\nlet bidiIsolate = require('caniuse-lite/data/features/mdn-css-unicode-bidi-isolate')\n\nf(bidiIsolate, browsers =>\n  prefix(['isolate'], {\n    browsers,\n    feature: 'css-unicode-bidi',\n    props: ['unicode-bidi']\n  })\n)\n\nlet bidiPlaintext = require('caniuse-lite/data/features/mdn-css-unicode-bidi-plaintext')\n\nf(bidiPlaintext, browsers =>\n  prefix(['plaintext'], {\n    browsers,\n    feature: 'css-unicode-bidi',\n    props: ['unicode-bidi']\n  })\n)\n\nlet bidiOverride = require('caniuse-lite/data/features/mdn-css-unicode-bidi-isolate-override')\n\nf(bidiOverride, { match: /y x/ }, browsers =>\n  prefix(['isolate-override'], {\n    browsers,\n    feature: 'css-unicode-bidi',\n    props: ['unicode-bidi']\n  })\n)\n\n// overscroll-behavior selector\nlet prefixOverscroll = require('caniuse-lite/data/features/css-overscroll-behavior')\n\nf(prefixOverscroll, { match: /a #1/ }, browsers =>\n  prefix(['overscroll-behavior'], {\n    browsers,\n    feature: 'css-overscroll-behavior'\n  })\n)\n\n// text-orientation\nlet prefixTextOrientation = require('caniuse-lite/data/features/css-text-orientation')\n\nf(prefixTextOrientation, browsers =>\n  prefix(['text-orientation'], {\n    browsers,\n    feature: 'css-text-orientation'\n  })\n)\n\n// print-color-adjust\nlet prefixPrintAdjust = require('caniuse-lite/data/features/css-print-color-adjust')\n\nf(prefixPrintAdjust, browsers =>\n  prefix(['print-color-adjust', 'color-adjust'], {\n    browsers,\n    feature: 'css-print-color-adjust'\n  })\n)\n"
  },
  {
    "path": "eslint.config.mjs",
    "content": "import loguxConfig from '@logux/eslint-config'\n\nexport default [\n  {\n    ignores: ['coverage']\n  },\n  ...loguxConfig,\n  {\n    rules: {\n      'n/prefer-node-protocol': 'off',\n      'no-console': 'off'\n    }\n  },\n  {\n    files: ['bin/autoprefixer'],\n    rules: {\n      'n/global-require': 'off',\n      'n/no-unsupported-features/es-syntax': 'off'\n    }\n  },\n  {\n    files: ['data/prefixes.js'],\n    rules: {\n      'import/order': 'off'\n    }\n  }\n]\n"
  },
  {
    "path": "lib/at-rule.js",
    "content": "let Prefixer = require('./prefixer')\n\nclass AtRule extends Prefixer {\n  /**\n   * Clone and add prefixes for at-rule\n   */\n  add(rule, prefix) {\n    let prefixed = prefix + rule.name\n\n    let already = rule.parent.some(\n      i => i.name === prefixed && i.params === rule.params\n    )\n    if (already) {\n      return undefined\n    }\n\n    let cloned = this.clone(rule, { name: prefixed })\n    return rule.parent.insertBefore(rule, cloned)\n  }\n\n  /**\n   * Clone node with prefixes\n   */\n  process(node) {\n    let parent = this.parentPrefix(node)\n\n    for (let prefix of this.prefixes) {\n      if (!parent || parent === prefix) {\n        this.add(node, prefix)\n      }\n    }\n  }\n}\n\nmodule.exports = AtRule\n"
  },
  {
    "path": "lib/autoprefixer.d.ts",
    "content": "import { Plugin } from 'postcss'\nimport { Stats } from 'browserslist'\n\ndeclare function autoprefixer<T extends string[]>(\n  ...args: [...T, autoprefixer.Options]\n): Plugin & autoprefixer.ExportedAPI\n\ndeclare function autoprefixer(\n  browsers: string[],\n  options?: autoprefixer.Options\n): Plugin & autoprefixer.ExportedAPI\n\ndeclare function autoprefixer(\n  options?: autoprefixer.Options\n): Plugin & autoprefixer.ExportedAPI\n\ndeclare namespace autoprefixer {\n  type GridValue = 'autoplace' | 'no-autoplace'\n\n  interface Options {\n    /** environment for `Browserslist` */\n    env?: string\n\n    /** should Autoprefixer use Visual Cascade, if CSS is uncompressed */\n    cascade?: boolean\n\n    /** should Autoprefixer add prefixes. */\n    add?: boolean\n\n    /** should Autoprefixer [remove outdated] prefixes */\n    remove?: boolean\n\n    /** should Autoprefixer add prefixes for @supports parameters. */\n    supports?: boolean\n\n    /** should Autoprefixer add prefixes for flexbox properties */\n    flexbox?: boolean | 'no-2009'\n\n    /** should Autoprefixer add IE 10-11 prefixes for Grid Layout properties */\n    grid?: boolean | GridValue\n\n    /** custom usage statistics for > 10% in my stats browsers query */\n    stats?: Stats\n\n    /**\n     * list of queries for target browsers.\n     * Try to not use it.\n     * The best practice is to use `.browserslistrc` config or `browserslist` key in `package.json`\n     * to share target browsers with Babel, ESLint and Stylelint\n     */\n    overrideBrowserslist?: string | string[]\n\n    /** do not raise error on unknown browser version in `Browserslist` config. */\n    ignoreUnknownVersions?: boolean\n  }\n\n  interface ExportedAPI {\n    /** Autoprefixer data */\n    data: {\n      browsers: { [browser: string]: object | undefined }\n      prefixes: { [prefixName: string]: object | undefined }\n    }\n\n    /** Autoprefixer default browsers */\n    defaults: string[]\n\n    /** Inspect with default Autoprefixer */\n    info(options?: { from?: string }): string\n\n    options: Options\n\n    browsers: string | string[]\n  }\n\n  /** Autoprefixer data */\n  let data: ExportedAPI['data']\n\n  /** Autoprefixer default browsers */\n  let defaults: ExportedAPI['defaults']\n\n  /** Inspect with default Autoprefixer */\n  let info: ExportedAPI['info']\n\n  let postcss: true\n}\n\ndeclare global {\n  namespace NodeJS {\n    interface ProcessEnv {\n      AUTOPREFIXER_GRID?: autoprefixer.GridValue\n    }\n  }\n}\n\nexport = autoprefixer\n"
  },
  {
    "path": "lib/autoprefixer.js",
    "content": "let browserslist = require('browserslist')\nlet { agents } = require('caniuse-lite/dist/unpacker/agents')\nlet pico = require('picocolors')\n\nlet dataPrefixes = require('../data/prefixes')\nlet Browsers = require('./browsers')\nlet getInfo = require('./info')\nlet Prefixes = require('./prefixes')\n\nlet autoprefixerData = { browsers: agents, prefixes: dataPrefixes }\n\nconst WARNING =\n  '\\n' +\n  '  Replace Autoprefixer `browsers` option to Browserslist config.\\n' +\n  '  Use `browserslist` key in `package.json` or `.browserslistrc` file.\\n' +\n  '\\n' +\n  '  Using `browsers` option can cause errors. Browserslist config can\\n' +\n  '  be used for Babel, Autoprefixer, postcss-normalize and other tools.\\n' +\n  '\\n' +\n  '  If you really need to use option, rename it to `overrideBrowserslist`.\\n' +\n  '\\n' +\n  '  Learn more at:\\n' +\n  '  https://github.com/browserslist/browserslist#readme\\n' +\n  '  https://twitter.com/browserslist\\n' +\n  '\\n'\n\nfunction isPlainObject(obj) {\n  return Object.prototype.toString.apply(obj) === '[object Object]'\n}\n\nlet cache = new Map()\n\nfunction timeCapsule(result, prefixes) {\n  if (prefixes.browsers.selected.length === 0) {\n    return\n  }\n  if (prefixes.add.selectors.length > 0) {\n    return\n  }\n  if (Object.keys(prefixes.add).length > 2) {\n    return\n  }\n  /* c8 ignore next 11 */\n  result.warn(\n    'Autoprefixer target browsers do not need any prefixes.' +\n      'You do not need Autoprefixer anymore.\\n' +\n      'Check your Browserslist config to be sure that your targets ' +\n      'are set up correctly.\\n' +\n      '\\n' +\n      '  Learn more at:\\n' +\n      '  https://github.com/postcss/autoprefixer#readme\\n' +\n      '  https://github.com/browserslist/browserslist#readme\\n' +\n      '\\n'\n  )\n}\n\nmodule.exports = plugin\n\nfunction plugin(...reqs) {\n  let options\n  if (reqs.length === 1 && isPlainObject(reqs[0])) {\n    options = reqs[0]\n    reqs = undefined\n  } else if (reqs.length === 0 || (reqs.length === 1 && !reqs[0])) {\n    reqs = undefined\n  } else if (reqs.length <= 2 && (Array.isArray(reqs[0]) || !reqs[0])) {\n    options = reqs[1]\n    reqs = reqs[0]\n  } else if (typeof reqs[reqs.length - 1] === 'object') {\n    options = reqs.pop()\n  }\n\n  if (!options) {\n    options = {}\n  }\n\n  if (options.browser) {\n    throw new Error(\n      'Change `browser` option to `overrideBrowserslist` in Autoprefixer'\n    )\n  } else if (options.browserslist) {\n    throw new Error(\n      'Change `browserslist` option to `overrideBrowserslist` in Autoprefixer'\n    )\n  }\n\n  if (options.overrideBrowserslist) {\n    reqs = options.overrideBrowserslist\n  } else if (options.browsers) {\n    if (typeof console !== 'undefined' && console.warn) {\n      console.warn(\n        pico.red(WARNING.replace(/`[^`]+`/g, i => pico.yellow(i.slice(1, -1))))\n      )\n    }\n    reqs = options.browsers\n  }\n\n  let brwlstOpts = {\n    env: options.env,\n    ignoreUnknownVersions: options.ignoreUnknownVersions,\n    stats: options.stats\n  }\n\n  function loadPrefixes(opts) {\n    let d = autoprefixerData\n    let browsers = new Browsers(d.browsers, reqs, opts, brwlstOpts)\n    let key = browsers.selected.join(', ') + JSON.stringify(options)\n\n    if (!cache.has(key)) {\n      cache.set(key, new Prefixes(d.prefixes, browsers, options))\n    }\n\n    return cache.get(key)\n  }\n\n  return {\n    browsers: reqs,\n\n    info(opts) {\n      opts = opts || {}\n      opts.from = opts.from || process.cwd()\n      return getInfo(loadPrefixes(opts))\n    },\n\n    options,\n\n    postcssPlugin: 'autoprefixer',\n    prepare(result) {\n      let prefixes = loadPrefixes({\n        env: options.env,\n        from: result.opts.from\n      })\n\n      return {\n        OnceExit(root) {\n          timeCapsule(result, prefixes)\n          if (options.remove !== false) {\n            prefixes.processor.remove(root, result)\n          }\n          if (options.add !== false) {\n            prefixes.processor.add(root, result)\n          }\n        }\n      }\n    }\n  }\n}\n\nplugin.postcss = true\n\n/**\n * Autoprefixer data\n */\nplugin.data = autoprefixerData\n\n/**\n * Autoprefixer default browsers\n */\nplugin.defaults = browserslist.defaults\n\n/**\n * Inspect with default Autoprefixer\n */\nplugin.info = () => plugin().info()\n"
  },
  {
    "path": "lib/brackets.js",
    "content": "function last(array) {\n  return array[array.length - 1]\n}\n\nlet brackets = {\n  /**\n   * Parse string to nodes tree\n   */\n  parse(str) {\n    let current = ['']\n    let stack = [current]\n\n    for (let sym of str) {\n      if (sym === '(') {\n        current = ['']\n        last(stack).push(current)\n        stack.push(current)\n        continue\n      }\n\n      if (sym === ')') {\n        stack.pop()\n        current = last(stack)\n        current.push('')\n        continue\n      }\n\n      current[current.length - 1] += sym\n    }\n\n    return stack[0]\n  },\n\n  /**\n   * Generate output string by nodes tree\n   */\n  stringify(ast) {\n    let result = ''\n    for (let i of ast) {\n      if (typeof i === 'object') {\n        result += `(${brackets.stringify(i)})`\n        continue\n      }\n\n      result += i\n    }\n    return result\n  }\n}\n\nmodule.exports = brackets\n"
  },
  {
    "path": "lib/browsers.js",
    "content": "let browserslist = require('browserslist')\nlet { agents } = require('caniuse-lite/dist/unpacker/agents')\n\nlet utils = require('./utils')\n\nclass Browsers {\n  constructor(data, requirements, options, browserslistOpts) {\n    this.data = data\n    this.options = options || {}\n    this.browserslistOpts = browserslistOpts || {}\n    this.selected = this.parse(requirements)\n  }\n\n  /**\n   * Return all prefixes for default browser data\n   */\n  static prefixes() {\n    if (this.prefixesCache) {\n      return this.prefixesCache\n    }\n\n    this.prefixesCache = []\n    for (let name in agents) {\n      this.prefixesCache.push(`-${agents[name].prefix}-`)\n    }\n\n    this.prefixesCache = utils\n      .uniq(this.prefixesCache)\n      .sort((a, b) => b.length - a.length)\n\n    return this.prefixesCache\n  }\n\n  /**\n   * Check is value contain any possible prefix\n   */\n  static withPrefix(value) {\n    if (!this.prefixesRegexp) {\n      this.prefixesRegexp = new RegExp(this.prefixes().join('|'))\n    }\n\n    return this.prefixesRegexp.test(value)\n  }\n\n  /**\n   * Is browser is selected by requirements\n   */\n  isSelected(browser) {\n    return this.selected.includes(browser)\n  }\n\n  /**\n   * Return browsers selected by requirements\n   */\n  parse(requirements) {\n    let opts = {}\n    for (let i in this.browserslistOpts) {\n      opts[i] = this.browserslistOpts[i]\n    }\n    opts.path = this.options.from\n    return browserslist(requirements, opts)\n  }\n\n  /**\n   * Return prefix for selected browser\n   */\n  prefix(browser) {\n    let [name, version] = browser.split(' ')\n    let data = this.data[name]\n\n    let prefix = data.prefix_exceptions && data.prefix_exceptions[version]\n    if (!prefix) {\n      prefix = data.prefix\n    }\n    return `-${prefix}-`\n  }\n}\n\nmodule.exports = Browsers\n"
  },
  {
    "path": "lib/declaration.js",
    "content": "let Browsers = require('./browsers')\nlet Prefixer = require('./prefixer')\nlet utils = require('./utils')\n\nclass Declaration extends Prefixer {\n  /**\n   * Clone and add prefixes for declaration\n   */\n  add(decl, prefix, prefixes, result) {\n    let prefixed = this.prefixed(decl.prop, prefix)\n    if (\n      this.isAlready(decl, prefixed) ||\n      this.otherPrefixes(decl.value, prefix)\n    ) {\n      return undefined\n    }\n    return this.insert(decl, prefix, prefixes, result)\n  }\n\n  /**\n   * Calculate indentation to create visual cascade\n   */\n  calcBefore(prefixes, decl, prefix = '') {\n    let max = this.maxPrefixed(prefixes, decl)\n    let diff = max - utils.removeNote(prefix).length\n\n    let before = decl.raw('before')\n    if (diff > 0) {\n      before += Array(diff).fill(' ').join('')\n    }\n\n    return before\n  }\n\n  /**\n   * Always true, because we already get prefixer by property name\n   */\n  check(/* decl */) {\n    return true\n  }\n\n  /**\n   * Clone and insert new declaration\n   */\n  insert(decl, prefix, prefixes) {\n    let cloned = this.set(this.clone(decl), prefix)\n    if (!cloned) return undefined\n\n    let already = decl.parent.some(\n      i => i.prop === cloned.prop && i.value === cloned.value\n    )\n    if (already) {\n      return undefined\n    }\n\n    if (this.needCascade(decl)) {\n      cloned.raws.before = this.calcBefore(prefixes, decl, prefix)\n    }\n    return decl.parent.insertBefore(decl, cloned)\n  }\n\n  /**\n   * Did this declaration has this prefix above\n   */\n  isAlready(decl, prefixed) {\n    let already = this.all.group(decl).up(i => i.prop === prefixed)\n    if (!already) {\n      already = this.all.group(decl).down(i => i.prop === prefixed)\n    }\n    return already\n  }\n\n  /**\n   * Return maximum length of possible prefixed property\n   */\n  maxPrefixed(prefixes, decl) {\n    if (decl._autoprefixerMax) {\n      return decl._autoprefixerMax\n    }\n\n    let max = 0\n    for (let prefix of prefixes) {\n      prefix = utils.removeNote(prefix)\n      if (prefix.length > max) {\n        max = prefix.length\n      }\n    }\n    decl._autoprefixerMax = max\n\n    return decl._autoprefixerMax\n  }\n\n  /**\n   * Should we use visual cascade for prefixes\n   */\n  needCascade(decl) {\n    if (!decl._autoprefixerCascade) {\n      decl._autoprefixerCascade =\n        this.all.options.cascade !== false && decl.raw('before').includes('\\n')\n    }\n    return decl._autoprefixerCascade\n  }\n\n  /**\n   * Return unprefixed version of property\n   */\n  normalize(prop) {\n    return prop\n  }\n\n  /**\n   * Return list of prefixed properties to clean old prefixes\n   */\n  old(prop, prefix) {\n    return [this.prefixed(prop, prefix)]\n  }\n\n  /**\n   * Check `value`, that it contain other prefixes, rather than `prefix`\n   */\n  otherPrefixes(value, prefix) {\n    for (let other of Browsers.prefixes()) {\n      if (other === prefix) {\n        continue\n      }\n      if (value.includes(other)) {\n        return value.replace(/var\\([^)]+\\)/, '').includes(other)\n      }\n    }\n    return false\n  }\n\n  /**\n   * Return prefixed version of property\n   */\n  prefixed(prop, prefix) {\n    return prefix + prop\n  }\n\n  /**\n   * Add spaces for visual cascade\n   */\n  process(decl, result) {\n    if (!this.needCascade(decl)) {\n      super.process(decl, result)\n      return\n    }\n\n    let prefixes = super.process(decl, result)\n\n    if (!prefixes || !prefixes.length) {\n      return\n    }\n\n    this.restoreBefore(decl)\n    decl.raws.before = this.calcBefore(prefixes, decl)\n  }\n\n  /**\n   * Remove visual cascade\n   */\n  restoreBefore(decl) {\n    let lines = decl.raw('before').split('\\n')\n    let min = lines[lines.length - 1]\n\n    this.all.group(decl).up(prefixed => {\n      let array = prefixed.raw('before').split('\\n')\n      let last = array[array.length - 1]\n      if (last.length < min.length) {\n        min = last\n      }\n    })\n\n    lines[lines.length - 1] = min\n    decl.raws.before = lines.join('\\n')\n  }\n\n  /**\n   * Set prefix to declaration\n   */\n  set(decl, prefix) {\n    decl.prop = this.prefixed(decl.prop, prefix)\n    return decl\n  }\n}\n\nmodule.exports = Declaration\n"
  },
  {
    "path": "lib/hacks/align-content.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass AlignContent extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'align-content'\n  }\n\n  /**\n   * Change property name for 2012 spec\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2012) {\n      return prefix + 'flex-line-pack'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Change value for 2012 spec and ignore prefix for 2009\n   */\n  set(decl, prefix) {\n    let spec = flexSpec(prefix)[0]\n    if (spec === 2012) {\n      decl.value = AlignContent.oldValues[decl.value] || decl.value\n      return super.set(decl, prefix)\n    }\n    if (spec === 'final') {\n      return super.set(decl, prefix)\n    }\n    return undefined\n  }\n}\n\nAlignContent.names = ['align-content', 'flex-line-pack']\n\nAlignContent.oldValues = {\n  'flex-end': 'end',\n  'flex-start': 'start',\n  'space-around': 'distribute',\n  'space-between': 'justify'\n}\n\nmodule.exports = AlignContent\n"
  },
  {
    "path": "lib/hacks/align-items.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass AlignItems extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'align-items'\n  }\n\n  /**\n   * Change property name for 2009 and 2012 specs\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2009) {\n      return prefix + 'box-align'\n    }\n    if (spec === 2012) {\n      return prefix + 'flex-align'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Change value for 2009 and 2012 specs\n   */\n  set(decl, prefix) {\n    let spec = flexSpec(prefix)[0]\n    if (spec === 2009 || spec === 2012) {\n      decl.value = AlignItems.oldValues[decl.value] || decl.value\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nAlignItems.names = ['align-items', 'flex-align', 'box-align']\n\nAlignItems.oldValues = {\n  'flex-end': 'end',\n  'flex-start': 'start'\n}\n\nmodule.exports = AlignItems\n"
  },
  {
    "path": "lib/hacks/align-self.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass AlignSelf extends Declaration {\n  check(decl) {\n    return (\n      decl.parent &&\n      !decl.parent.some(i => {\n        return i.prop && i.prop.startsWith('grid-')\n      })\n    )\n  }\n\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'align-self'\n  }\n\n  /**\n   * Change property name for 2012 specs\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2012) {\n      return prefix + 'flex-item-align'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Change value for 2012 spec and ignore prefix for 2009\n   */\n  set(decl, prefix) {\n    let spec = flexSpec(prefix)[0]\n    if (spec === 2012) {\n      decl.value = AlignSelf.oldValues[decl.value] || decl.value\n      return super.set(decl, prefix)\n    }\n    if (spec === 'final') {\n      return super.set(decl, prefix)\n    }\n    return undefined\n  }\n}\n\nAlignSelf.names = ['align-self', 'flex-item-align']\n\nAlignSelf.oldValues = {\n  'flex-end': 'end',\n  'flex-start': 'start'\n}\n\nmodule.exports = AlignSelf\n"
  },
  {
    "path": "lib/hacks/animation.js",
    "content": "let Declaration = require('../declaration')\n\nclass Animation extends Declaration {\n  /**\n   * Don’t add prefixes for modern values.\n   */\n  check(decl) {\n    return !decl.value.split(/\\s+/).some(i => {\n      let lower = i.toLowerCase()\n      return lower === 'reverse' || lower === 'alternate-reverse'\n    })\n  }\n}\n\nAnimation.names = ['animation', 'animation-direction']\n\nmodule.exports = Animation\n"
  },
  {
    "path": "lib/hacks/appearance.js",
    "content": "let Declaration = require('../declaration')\nlet utils = require('../utils')\n\nclass Appearance extends Declaration {\n  constructor(name, prefixes, all) {\n    super(name, prefixes, all)\n\n    if (this.prefixes) {\n      this.prefixes = utils.uniq(\n        this.prefixes.map(i => {\n          if (i === '-ms-') {\n            return '-webkit-'\n          }\n          return i\n        })\n      )\n    }\n  }\n}\n\nAppearance.names = ['appearance']\n\nmodule.exports = Appearance\n"
  },
  {
    "path": "lib/hacks/autofill.js",
    "content": "let Selector = require('../selector')\nlet utils = require('../utils')\n\nclass Autofill extends Selector {\n  constructor(name, prefixes, all) {\n    super(name, prefixes, all)\n\n    if (this.prefixes) {\n      this.prefixes = utils.uniq(this.prefixes.map(() => '-webkit-'))\n    }\n  }\n\n  /**\n   * Return different selectors depend on prefix\n   */\n  prefixed(prefix) {\n    if (prefix === '-webkit-') {\n      return ':-webkit-autofill'\n    }\n    return `:${prefix}autofill`\n  }\n}\n\nAutofill.names = [':autofill']\n\nmodule.exports = Autofill\n"
  },
  {
    "path": "lib/hacks/backdrop-filter.js",
    "content": "let Declaration = require('../declaration')\nlet utils = require('../utils')\n\nclass BackdropFilter extends Declaration {\n  constructor(name, prefixes, all) {\n    super(name, prefixes, all)\n\n    if (this.prefixes) {\n      this.prefixes = utils.uniq(\n        this.prefixes.map(i => {\n          return i === '-ms-' ? '-webkit-' : i\n        })\n      )\n    }\n  }\n}\n\nBackdropFilter.names = ['backdrop-filter']\n\nmodule.exports = BackdropFilter\n"
  },
  {
    "path": "lib/hacks/background-clip.js",
    "content": "let Declaration = require('../declaration')\nlet utils = require('../utils')\n\nclass BackgroundClip extends Declaration {\n  constructor(name, prefixes, all) {\n    super(name, prefixes, all)\n\n    if (this.prefixes) {\n      this.prefixes = utils.uniq(\n        this.prefixes.map(i => {\n          return i === '-ms-' ? '-webkit-' : i\n        })\n      )\n    }\n  }\n\n  check(decl) {\n    return decl.value.toLowerCase() === 'text'\n  }\n}\n\nBackgroundClip.names = ['background-clip']\n\nmodule.exports = BackgroundClip\n"
  },
  {
    "path": "lib/hacks/background-size.js",
    "content": "let Declaration = require('../declaration')\n\nclass BackgroundSize extends Declaration {\n  /**\n   * Duplication parameter for -webkit- browsers\n   */\n  set(decl, prefix) {\n    let value = decl.value.toLowerCase()\n    if (\n      prefix === '-webkit-' &&\n      !value.includes(' ') &&\n      value !== 'contain' &&\n      value !== 'cover'\n    ) {\n      decl.value = decl.value + ' ' + decl.value\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nBackgroundSize.names = ['background-size']\n\nmodule.exports = BackgroundSize\n"
  },
  {
    "path": "lib/hacks/block-logical.js",
    "content": "let Declaration = require('../declaration')\n\nclass BlockLogical extends Declaration {\n  /**\n   * Return property name by spec\n   */\n  normalize(prop) {\n    if (prop.includes('-before')) {\n      return prop.replace('-before', '-block-start')\n    }\n    return prop.replace('-after', '-block-end')\n  }\n\n  /**\n   * Use old syntax for -moz- and -webkit-\n   */\n  prefixed(prop, prefix) {\n    if (prop.includes('-start')) {\n      return prefix + prop.replace('-block-start', '-before')\n    }\n    return prefix + prop.replace('-block-end', '-after')\n  }\n}\n\nBlockLogical.names = [\n  'border-block-start',\n  'border-block-end',\n  'margin-block-start',\n  'margin-block-end',\n  'padding-block-start',\n  'padding-block-end',\n  'border-before',\n  'border-after',\n  'margin-before',\n  'margin-after',\n  'padding-before',\n  'padding-after'\n]\n\nmodule.exports = BlockLogical\n"
  },
  {
    "path": "lib/hacks/border-image.js",
    "content": "let Declaration = require('../declaration')\n\nclass BorderImage extends Declaration {\n  /**\n   * Remove fill parameter for prefixed declarations\n   */\n  set(decl, prefix) {\n    decl.value = decl.value.replace(/\\s+fill(\\s)/, '$1')\n    return super.set(decl, prefix)\n  }\n}\n\nBorderImage.names = ['border-image']\n\nmodule.exports = BorderImage\n"
  },
  {
    "path": "lib/hacks/border-radius.js",
    "content": "let Declaration = require('../declaration')\n\nclass BorderRadius extends Declaration {\n  /**\n   * Return unprefixed version of property\n   */\n  normalize(prop) {\n    return BorderRadius.toNormal[prop] || prop\n  }\n\n  /**\n   * Change syntax, when add Mozilla prefix\n   */\n  prefixed(prop, prefix) {\n    if (prefix === '-moz-') {\n      return prefix + (BorderRadius.toMozilla[prop] || prop)\n    }\n    return super.prefixed(prop, prefix)\n  }\n}\n\nBorderRadius.names = ['border-radius']\n\nBorderRadius.toMozilla = {}\nBorderRadius.toNormal = {}\n\nfor (let ver of ['top', 'bottom']) {\n  for (let hor of ['left', 'right']) {\n    let normal = `border-${ver}-${hor}-radius`\n    let mozilla = `border-radius-${ver}${hor}`\n\n    BorderRadius.names.push(normal)\n    BorderRadius.names.push(mozilla)\n\n    BorderRadius.toMozilla[normal] = mozilla\n    BorderRadius.toNormal[mozilla] = normal\n  }\n}\n\nmodule.exports = BorderRadius\n"
  },
  {
    "path": "lib/hacks/break-props.js",
    "content": "let Declaration = require('../declaration')\n\nclass BreakProps extends Declaration {\n  /**\n   * Don’t prefix some values\n   */\n  insert(decl, prefix, prefixes) {\n    if (decl.prop !== 'break-inside') {\n      return super.insert(decl, prefix, prefixes)\n    }\n    if (/region/i.test(decl.value) || /page/i.test(decl.value)) {\n      return undefined\n    }\n    return super.insert(decl, prefix, prefixes)\n  }\n\n  /**\n   * Return property name by final spec\n   */\n  normalize(prop) {\n    if (prop.includes('inside')) {\n      return 'break-inside'\n    }\n    if (prop.includes('before')) {\n      return 'break-before'\n    }\n    return 'break-after'\n  }\n\n  /**\n   * Change name for -webkit- and -moz- prefix\n   */\n  prefixed(prop, prefix) {\n    return `${prefix}column-${prop}`\n  }\n\n  /**\n   * Change prefixed value for avoid-column and avoid-page\n   */\n  set(decl, prefix) {\n    if (\n      (decl.prop === 'break-inside' && decl.value === 'avoid-column') ||\n      decl.value === 'avoid-page'\n    ) {\n      decl.value = 'avoid'\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nBreakProps.names = [\n  'break-inside',\n  'page-break-inside',\n  'column-break-inside',\n  'break-before',\n  'page-break-before',\n  'column-break-before',\n  'break-after',\n  'page-break-after',\n  'column-break-after'\n]\n\nmodule.exports = BreakProps\n"
  },
  {
    "path": "lib/hacks/cross-fade.js",
    "content": "let list = require('postcss').list\n\nlet Value = require('../value')\n\nclass CrossFade extends Value {\n  replace(string, prefix) {\n    return list\n      .space(string)\n      .map(value => {\n        if (value.slice(0, +this.name.length + 1) !== this.name + '(') {\n          return value\n        }\n\n        let close = value.lastIndexOf(')')\n        let after = value.slice(close + 1)\n        let args = value.slice(this.name.length + 1, close)\n\n        if (prefix === '-webkit-') {\n          let match = args.match(/\\d*.?\\d+%?/)\n          if (match) {\n            args = args.slice(match[0].length).trim()\n            args += `, ${match[0]}`\n          } else {\n            args += ', 0.5'\n          }\n        }\n        return prefix + this.name + '(' + args + ')' + after\n      })\n      .join(' ')\n  }\n}\n\nCrossFade.names = ['cross-fade']\n\nmodule.exports = CrossFade\n"
  },
  {
    "path": "lib/hacks/display-flex.js",
    "content": "let OldValue = require('../old-value')\nlet Value = require('../value')\nlet flexSpec = require('./flex-spec')\n\nclass DisplayFlex extends Value {\n  constructor(name, prefixes) {\n    super(name, prefixes)\n    if (name === 'display-flex') {\n      this.name = 'flex'\n    }\n  }\n\n  /**\n   * Faster check for flex value\n   */\n  check(decl) {\n    return decl.prop === 'display' && decl.value === this.name\n  }\n\n  /**\n   * Change value for old specs\n   */\n  old(prefix) {\n    let prefixed = this.prefixed(prefix)\n    if (!prefixed) return undefined\n    return new OldValue(this.name, prefixed)\n  }\n\n  /**\n   * Return value by spec\n   */\n  prefixed(prefix) {\n    let spec, value\n    ;[spec, prefix] = flexSpec(prefix)\n\n    if (spec === 2009) {\n      if (this.name === 'flex') {\n        value = 'box'\n      } else {\n        value = 'inline-box'\n      }\n    } else if (spec === 2012) {\n      if (this.name === 'flex') {\n        value = 'flexbox'\n      } else {\n        value = 'inline-flexbox'\n      }\n    } else if (spec === 'final') {\n      value = this.name\n    }\n\n    return prefix + value\n  }\n\n  /**\n   * Add prefix to value depend on flebox spec version\n   */\n  replace(string, prefix) {\n    return this.prefixed(prefix)\n  }\n}\n\nDisplayFlex.names = ['display-flex', 'inline-flex']\n\nmodule.exports = DisplayFlex\n"
  },
  {
    "path": "lib/hacks/display-grid.js",
    "content": "let Value = require('../value')\n\nclass DisplayGrid extends Value {\n  constructor(name, prefixes) {\n    super(name, prefixes)\n    if (name === 'display-grid') {\n      this.name = 'grid'\n    }\n  }\n\n  /**\n   * Faster check for flex value\n   */\n  check(decl) {\n    return decl.prop === 'display' && decl.value === this.name\n  }\n}\n\nDisplayGrid.names = ['display-grid', 'inline-grid']\n\nmodule.exports = DisplayGrid\n"
  },
  {
    "path": "lib/hacks/file-selector-button.js",
    "content": "let Selector = require('../selector')\nlet utils = require('../utils')\n\nclass FileSelectorButton extends Selector {\n  constructor(name, prefixes, all) {\n    super(name, prefixes, all)\n\n    if (this.prefixes) {\n      this.prefixes = utils.uniq(this.prefixes.map(() => '-webkit-'))\n    }\n  }\n\n  /**\n   * Return different selectors depend on prefix\n   */\n  prefixed(prefix) {\n    if (prefix === '-webkit-') {\n      return '::-webkit-file-upload-button'\n    }\n    return `::${prefix}file-selector-button`\n  }\n}\n\nFileSelectorButton.names = ['::file-selector-button']\n\nmodule.exports = FileSelectorButton\n"
  },
  {
    "path": "lib/hacks/filter-value.js",
    "content": "let Value = require('../value')\n\nclass FilterValue extends Value {\n  constructor(name, prefixes) {\n    super(name, prefixes)\n    if (name === 'filter-function') {\n      this.name = 'filter'\n    }\n  }\n}\n\nFilterValue.names = ['filter', 'filter-function']\n\nmodule.exports = FilterValue\n"
  },
  {
    "path": "lib/hacks/filter.js",
    "content": "let Declaration = require('../declaration')\n\nclass Filter extends Declaration {\n  /**\n   * Check is it Internet Explorer filter\n   */\n  check(decl) {\n    let v = decl.value\n    return (\n      !v.toLowerCase().includes('alpha(') &&\n      !v.includes('DXImageTransform.Microsoft') &&\n      !v.includes('data:image/svg+xml')\n    )\n  }\n}\n\nFilter.names = ['filter']\n\nmodule.exports = Filter\n"
  },
  {
    "path": "lib/hacks/flex-basis.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass FlexBasis extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'flex-basis'\n  }\n\n  /**\n   * Return flex property for 2012 spec\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2012) {\n      return prefix + 'flex-preferred-size'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Ignore 2009 spec and use flex property for 2012\n   */\n  set(decl, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2012 || spec === 'final') {\n      return super.set(decl, prefix)\n    }\n    return undefined\n  }\n}\n\nFlexBasis.names = ['flex-basis', 'flex-preferred-size']\n\nmodule.exports = FlexBasis\n"
  },
  {
    "path": "lib/hacks/flex-direction.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass FlexDirection extends Declaration {\n  /**\n   * Use two properties for 2009 spec\n   */\n  insert(decl, prefix, prefixes) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec !== 2009) {\n      return super.insert(decl, prefix, prefixes)\n    }\n    let already = decl.parent.some(\n      i =>\n        i.prop === prefix + 'box-orient' || i.prop === prefix + 'box-direction'\n    )\n    if (already) {\n      return undefined\n    }\n\n    let v = decl.value\n    let dir, orient\n    if (v === 'inherit' || v === 'initial' || v === 'unset') {\n      orient = v\n      dir = v\n    } else {\n      orient = v.includes('row') ? 'horizontal' : 'vertical'\n      dir = v.includes('reverse') ? 'reverse' : 'normal'\n    }\n\n    let cloned = this.clone(decl)\n    cloned.prop = prefix + 'box-orient'\n    cloned.value = orient\n    if (this.needCascade(decl)) {\n      cloned.raws.before = this.calcBefore(prefixes, decl, prefix)\n    }\n    decl.parent.insertBefore(decl, cloned)\n\n    cloned = this.clone(decl)\n    cloned.prop = prefix + 'box-direction'\n    cloned.value = dir\n    if (this.needCascade(decl)) {\n      cloned.raws.before = this.calcBefore(prefixes, decl, prefix)\n    }\n    return decl.parent.insertBefore(decl, cloned)\n  }\n\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'flex-direction'\n  }\n\n  /**\n   * Clean two properties for 2009 spec\n   */\n  old(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2009) {\n      return [prefix + 'box-orient', prefix + 'box-direction']\n    } else {\n      return super.old(prop, prefix)\n    }\n  }\n}\n\nFlexDirection.names = ['flex-direction', 'box-direction', 'box-orient']\n\nmodule.exports = FlexDirection\n"
  },
  {
    "path": "lib/hacks/flex-flow.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass FlexFlow extends Declaration {\n  /**\n   * Use two properties for 2009 spec\n   */\n  insert(decl, prefix, prefixes) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec !== 2009) {\n      return super.insert(decl, prefix, prefixes)\n    }\n    let values = decl.value\n      .split(/\\s+/)\n      .filter(i => i !== 'wrap' && i !== 'nowrap' && 'wrap-reverse')\n    if (values.length === 0) {\n      return undefined\n    }\n\n    let already = decl.parent.some(\n      i =>\n        i.prop === prefix + 'box-orient' || i.prop === prefix + 'box-direction'\n    )\n    if (already) {\n      return undefined\n    }\n\n    let value = values[0]\n    let orient = value.includes('row') ? 'horizontal' : 'vertical'\n    let dir = value.includes('reverse') ? 'reverse' : 'normal'\n\n    let cloned = this.clone(decl)\n    cloned.prop = prefix + 'box-orient'\n    cloned.value = orient\n    if (this.needCascade(decl)) {\n      cloned.raws.before = this.calcBefore(prefixes, decl, prefix)\n    }\n    decl.parent.insertBefore(decl, cloned)\n\n    cloned = this.clone(decl)\n    cloned.prop = prefix + 'box-direction'\n    cloned.value = dir\n    if (this.needCascade(decl)) {\n      cloned.raws.before = this.calcBefore(prefixes, decl, prefix)\n    }\n    return decl.parent.insertBefore(decl, cloned)\n  }\n}\n\nFlexFlow.names = ['flex-flow', 'box-direction', 'box-orient']\n\nmodule.exports = FlexFlow\n"
  },
  {
    "path": "lib/hacks/flex-grow.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass Flex extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'flex'\n  }\n\n  /**\n   * Return flex property for 2009 and 2012 specs\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2009) {\n      return prefix + 'box-flex'\n    }\n    if (spec === 2012) {\n      return prefix + 'flex-positive'\n    }\n    return super.prefixed(prop, prefix)\n  }\n}\n\nFlex.names = ['flex-grow', 'flex-positive']\n\nmodule.exports = Flex\n"
  },
  {
    "path": "lib/hacks/flex-shrink.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass FlexShrink extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'flex-shrink'\n  }\n\n  /**\n   * Return flex property for 2012 spec\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2012) {\n      return prefix + 'flex-negative'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Ignore 2009 spec and use flex property for 2012\n   */\n  set(decl, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2012 || spec === 'final') {\n      return super.set(decl, prefix)\n    }\n    return undefined\n  }\n}\n\nFlexShrink.names = ['flex-shrink', 'flex-negative']\n\nmodule.exports = FlexShrink\n"
  },
  {
    "path": "lib/hacks/flex-spec.js",
    "content": "/**\n * Return flexbox spec versions by prefix\n */\nmodule.exports = function (prefix) {\n  let spec\n  if (prefix === '-webkit- 2009' || prefix === '-moz-') {\n    spec = 2009\n  } else if (prefix === '-ms-') {\n    spec = 2012\n  } else if (prefix === '-webkit-') {\n    spec = 'final'\n  }\n\n  if (prefix === '-webkit- 2009') {\n    prefix = '-webkit-'\n  }\n\n  return [spec, prefix]\n}\n"
  },
  {
    "path": "lib/hacks/flex-wrap.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass FlexWrap extends Declaration {\n  /**\n   * Don't add prefix for 2009 spec\n   */\n  set(decl, prefix) {\n    let spec = flexSpec(prefix)[0]\n    if (spec !== 2009) {\n      return super.set(decl, prefix)\n    }\n    return undefined\n  }\n}\n\nFlexWrap.names = ['flex-wrap']\n\nmodule.exports = FlexWrap\n"
  },
  {
    "path": "lib/hacks/flex.js",
    "content": "let list = require('postcss').list\n\nlet Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass Flex extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'flex'\n  }\n\n  /**\n   * Change property name for 2009 spec\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2009) {\n      return prefix + 'box-flex'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Spec 2009 supports only first argument\n   * Spec 2012 disallows unitless basis\n   */\n  set(decl, prefix) {\n    let spec = flexSpec(prefix)[0]\n    if (spec === 2009) {\n      decl.value = list.space(decl.value)[0]\n      decl.value = Flex.oldValues[decl.value] || decl.value\n      return super.set(decl, prefix)\n    }\n    if (spec === 2012) {\n      let components = list.space(decl.value)\n      if (components.length === 3 && components[2] === '0') {\n        decl.value = components.slice(0, 2).concat('0px').join(' ')\n      }\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nFlex.names = ['flex', 'box-flex']\n\nFlex.oldValues = {\n  auto: '1',\n  none: '0'\n}\n\nmodule.exports = Flex\n"
  },
  {
    "path": "lib/hacks/fullscreen.js",
    "content": "let Selector = require('../selector')\n\nclass Fullscreen extends Selector {\n  /**\n   * Return different selectors depend on prefix\n   */\n  prefixed(prefix) {\n    if (prefix === '-webkit-') {\n      return ':-webkit-full-screen'\n    }\n    if (prefix === '-moz-') {\n      return ':-moz-full-screen'\n    }\n    return `:${prefix}fullscreen`\n  }\n}\n\nFullscreen.names = [':fullscreen']\n\nmodule.exports = Fullscreen\n"
  },
  {
    "path": "lib/hacks/gradient.js",
    "content": "let parser = require('postcss-value-parser')\n\nlet OldValue = require('../old-value')\nlet utils = require('../utils')\nlet Value = require('../value')\n\nlet IS_DIRECTION = /top|left|right|bottom/gi\n\nclass Gradient extends Value {\n  /**\n   * Do not add non-webkit prefixes for list-style and object\n   */\n  add(decl, prefix) {\n    let p = decl.prop\n    if (p.includes('mask')) {\n      if (prefix === '-webkit-' || prefix === '-webkit- old') {\n        return super.add(decl, prefix)\n      }\n    } else if (\n      p === 'list-style' ||\n      p === 'list-style-image' ||\n      p === 'content'\n    ) {\n      if (prefix === '-webkit-' || prefix === '-webkit- old') {\n        return super.add(decl, prefix)\n      }\n    } else {\n      return super.add(decl, prefix)\n    }\n    return undefined\n  }\n\n  /**\n   * Get div token from exists parameters\n   */\n  cloneDiv(params) {\n    for (let i of params) {\n      if (i.type === 'div' && i.value === ',') {\n        return i\n      }\n    }\n    return { after: ' ', type: 'div', value: ',' }\n  }\n\n  /**\n   * Change colors syntax to old webkit\n   */\n  colorStops(params) {\n    let result = []\n    for (let i = 0; i < params.length; i++) {\n      let pos\n      let param = params[i]\n      let item\n      if (i === 0) {\n        continue\n      }\n\n      let color = parser.stringify(param[0])\n      if (param[1] && param[1].type === 'word') {\n        pos = param[1].value\n      } else if (param[2] && param[2].type === 'word') {\n        pos = param[2].value\n      }\n\n      let stop\n      if (i === 1 && (!pos || pos === '0%')) {\n        stop = `from(${color})`\n      } else if (i === params.length - 1 && (!pos || pos === '100%')) {\n        stop = `to(${color})`\n      } else if (pos) {\n        stop = `color-stop(${pos}, ${color})`\n      } else {\n        stop = `color-stop(${color})`\n      }\n\n      let div = param[param.length - 1]\n      params[i] = [{ type: 'word', value: stop }]\n      if (div.type === 'div' && div.value === ',') {\n        item = params[i].push(div)\n      }\n      result.push(item)\n    }\n    return result\n  }\n\n  /**\n   * Change new direction to old\n   */\n  convertDirection(params) {\n    if (params.length > 0) {\n      if (params[0].value === 'to') {\n        this.fixDirection(params)\n      } else if (params[0].value.includes('deg')) {\n        this.fixAngle(params)\n      } else if (this.isRadial(params)) {\n        this.fixRadial(params)\n      }\n    }\n    return params\n  }\n\n  /**\n   * Add 90 degrees\n   */\n  fixAngle(params) {\n    let first = params[0].value\n    first = parseFloat(first)\n    first = Math.abs(450 - first) % 360\n    first = this.roundFloat(first, 3)\n    params[0].value = `${first}deg`\n  }\n\n  /**\n   * Replace `to top left` to `bottom right`\n   */\n  fixDirection(params) {\n    params.splice(0, 2)\n\n    for (let param of params) {\n      if (param.type === 'div') {\n        break\n      }\n      if (param.type === 'word') {\n        param.value = this.revertDirection(param.value)\n      }\n    }\n  }\n\n  /**\n   * Fix radial direction syntax\n   */\n  fixRadial(params) {\n    let first = []\n    let second = []\n    let a, b, c, i, next\n\n    for (i = 0; i < params.length - 2; i++) {\n      a = params[i]\n      b = params[i + 1]\n      c = params[i + 2]\n      if (a.type === 'space' && b.value === 'at' && c.type === 'space') {\n        next = i + 3\n        break\n      } else {\n        first.push(a)\n      }\n    }\n\n    let div\n    for (i = next; i < params.length; i++) {\n      if (params[i].type === 'div') {\n        div = params[i]\n        break\n      } else {\n        second.push(params[i])\n      }\n    }\n\n    params.splice(0, i, ...second, div, ...first)\n  }\n\n  /**\n   * Look for at word\n   */\n  isRadial(params) {\n    let state = 'before'\n    for (let param of params) {\n      if (state === 'before' && param.type === 'space') {\n        state = 'at'\n      } else if (state === 'at' && param.value === 'at') {\n        state = 'after'\n      } else if (state === 'after' && param.type === 'space') {\n        return true\n      } else if (param.type === 'div') {\n        break\n      } else {\n        state = 'before'\n      }\n    }\n    return false\n  }\n\n  /**\n   * Replace old direction to new\n   */\n  newDirection(params) {\n    if (params[0].value === 'to') {\n      return params\n    }\n    IS_DIRECTION.lastIndex = 0 // reset search index of global regexp\n    if (!IS_DIRECTION.test(params[0].value)) {\n      return params\n    }\n\n    params.unshift(\n      {\n        type: 'word',\n        value: 'to'\n      },\n      {\n        type: 'space',\n        value: ' '\n      }\n    )\n\n    for (let i = 2; i < params.length; i++) {\n      if (params[i].type === 'div') {\n        break\n      }\n      if (params[i].type === 'word') {\n        params[i].value = this.revertDirection(params[i].value)\n      }\n    }\n\n    return params\n  }\n\n  /**\n   * Normalize angle\n   */\n  normalize(nodes, gradientName) {\n    if (!nodes[0]) return nodes\n\n    if (/-?\\d+(.\\d+)?grad/.test(nodes[0].value)) {\n      nodes[0].value = this.normalizeUnit(nodes[0].value, 400)\n    } else if (/-?\\d+(.\\d+)?rad/.test(nodes[0].value)) {\n      nodes[0].value = this.normalizeUnit(nodes[0].value, 2 * Math.PI)\n    } else if (/-?\\d+(.\\d+)?turn/.test(nodes[0].value)) {\n      nodes[0].value = this.normalizeUnit(nodes[0].value, 1)\n    } else if (nodes[0].value.includes('deg')) {\n      let num = parseFloat(nodes[0].value)\n      num = (num % 360 + 360) % 360\n      nodes[0].value = `${num}deg`\n    }\n\n    if (\n      gradientName === 'linear-gradient' ||\n      gradientName === 'repeating-linear-gradient'\n    ) {\n      let direction = nodes[0].value\n\n      // Unitless zero for `<angle>` values are allowed in CSS gradients and transforms.\n      // Spec: https://github.com/w3c/csswg-drafts/commit/602789171429b2231223ab1e5acf8f7f11652eb3\n      if (direction === '0deg' || direction === '0') {\n        nodes = this.replaceFirst(nodes, 'to', ' ', 'top')\n      } else if (direction === '90deg') {\n        nodes = this.replaceFirst(nodes, 'to', ' ', 'right')\n      } else if (direction === '180deg') {\n        nodes = this.replaceFirst(nodes, 'to', ' ', 'bottom') // default value\n      } else if (direction === '270deg') {\n        nodes = this.replaceFirst(nodes, 'to', ' ', 'left')\n      }\n    }\n\n    return nodes\n  }\n\n  /**\n   * Convert angle unit to deg\n   */\n  normalizeUnit(str, full) {\n    let num = parseFloat(str)\n    let deg = (num / full) * 360\n    return `${deg}deg`\n  }\n\n  /**\n   * Remove old WebKit gradient too\n   */\n  old(prefix) {\n    if (prefix === '-webkit-') {\n      let type\n      if (this.name === 'linear-gradient') {\n        type = 'linear'\n      } else if (this.name === 'repeating-linear-gradient') {\n        type = 'repeating-linear'\n      } else if (this.name === 'repeating-radial-gradient') {\n        type = 'repeating-radial'\n      } else {\n        type = 'radial'\n      }\n      let string = '-gradient'\n      let regexp = utils.regexp(\n        `-webkit-(${type}-gradient|gradient\\\\(\\\\s*${type})`,\n        false\n      )\n\n      return new OldValue(this.name, prefix + this.name, string, regexp)\n    } else {\n      return super.old(prefix)\n    }\n  }\n\n  /**\n   * Change direction syntax to old webkit\n   */\n  oldDirection(params) {\n    let div = this.cloneDiv(params[0])\n\n    if (params[0][0].value !== 'to') {\n      return params.unshift([\n        { type: 'word', value: Gradient.oldDirections.bottom },\n        div\n      ])\n    } else {\n      let words = []\n      for (let node of params[0].slice(2)) {\n        if (node.type === 'word') {\n          words.push(node.value.toLowerCase())\n        }\n      }\n\n      words = words.join(' ')\n      let old = Gradient.oldDirections[words] || words\n\n      params[0] = [{ type: 'word', value: old }, div]\n      return params[0]\n    }\n  }\n\n  /**\n   * Convert to old webkit syntax\n   */\n  oldWebkit(node) {\n    let { nodes } = node\n    let string = parser.stringify(node.nodes)\n\n    if (this.name !== 'linear-gradient') {\n      return false\n    }\n    if (nodes[0] && nodes[0].value.includes('deg')) {\n      return false\n    }\n    if (\n      string.includes('px') ||\n      string.includes('-corner') ||\n      string.includes('-side')\n    ) {\n      return false\n    }\n    if (string.includes('var(')) {\n      return false\n    }\n\n    let params = [[]]\n    for (let i of nodes) {\n      params[params.length - 1].push(i)\n      if (i.type === 'div' && i.value === ',') {\n        params.push([])\n      }\n    }\n\n    this.oldDirection(params)\n    this.colorStops(params)\n\n    node.nodes = []\n    for (let param of params) {\n      node.nodes.push(...param)\n    }\n\n    node.nodes.unshift(\n      { type: 'word', value: 'linear' },\n      this.cloneDiv(node.nodes)\n    )\n    node.value = '-webkit-gradient'\n\n    return true\n  }\n\n  /**\n   * Change degrees for webkit prefix\n   */\n  replace(string, prefix) {\n    let ast = parser(string)\n    for (let node of ast.nodes) {\n      let gradientName = this.name // gradient name\n      if (node.type === 'function' && node.value === gradientName) {\n        node.nodes = this.newDirection(node.nodes)\n        node.nodes = this.normalize(node.nodes, gradientName)\n        if (prefix === '-webkit- old') {\n          let changes = this.oldWebkit(node)\n          if (!changes) {\n            return false\n          }\n        } else {\n          node.nodes = this.convertDirection(node.nodes)\n          node.value = prefix + node.value\n        }\n      }\n    }\n    return ast.toString()\n  }\n\n  /**\n   * Replace first token\n   */\n  replaceFirst(params, ...words) {\n    let prefix = words.map(i => {\n      if (i === ' ') {\n        return { type: 'space', value: i }\n      }\n      return { type: 'word', value: i }\n    })\n    return prefix.concat(params.slice(1))\n  }\n\n  revertDirection(word) {\n    return Gradient.directions[word.toLowerCase()] || word\n  }\n\n  /**\n   * Round float and save digits under dot\n   */\n  roundFloat(float, digits) {\n    return parseFloat(float.toFixed(digits))\n  }\n}\n\nGradient.names = [\n  'linear-gradient',\n  'repeating-linear-gradient',\n  'radial-gradient',\n  'repeating-radial-gradient'\n]\n\nGradient.directions = {\n  bottom: 'top',\n  left: 'right',\n  right: 'left',\n  top: 'bottom' // default value\n}\n\n// Direction to replace\nGradient.oldDirections = {\n  'bottom': 'left top, left bottom',\n  'bottom left': 'right top, left bottom',\n  'bottom right': 'left top, right bottom',\n  'left': 'right top, left top',\n\n  'left bottom': 'right top, left bottom',\n  'left top': 'right bottom, left top',\n  'right': 'left top, right top',\n  'right bottom': 'left top, right bottom',\n  'right top': 'left bottom, right top',\n  'top': 'left bottom, left top',\n  'top left': 'right bottom, left top',\n  'top right': 'left bottom, right top'\n}\n\nmodule.exports = Gradient\n"
  },
  {
    "path": "lib/hacks/grid-area.js",
    "content": "let Declaration = require('../declaration')\nlet utils = require('./grid-utils')\n\nclass GridArea extends Declaration {\n  /**\n   * Translate grid-area to separate -ms- prefixed properties\n   */\n  insert(decl, prefix, prefixes, result) {\n    if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)\n\n    let values = utils.parse(decl)\n\n    let [rowStart, rowSpan] = utils.translate(values, 0, 2)\n    let [columnStart, columnSpan] = utils.translate(values, 1, 3)\n\n    ;[\n      ['grid-row', rowStart],\n      ['grid-row-span', rowSpan],\n      ['grid-column', columnStart],\n      ['grid-column-span', columnSpan]\n    ].forEach(([prop, value]) => {\n      utils.insertDecl(decl, prop, value)\n    })\n\n    utils.warnTemplateSelectorNotFound(decl, result)\n    utils.warnIfGridRowColumnExists(decl, result)\n\n    return undefined\n  }\n}\n\nGridArea.names = ['grid-area']\n\nmodule.exports = GridArea\n"
  },
  {
    "path": "lib/hacks/grid-column-align.js",
    "content": "let Declaration = require('../declaration')\n\nclass GridColumnAlign extends Declaration {\n  /**\n   * Do not prefix flexbox values\n   */\n  check(decl) {\n    return !decl.value.includes('flex-') && decl.value !== 'baseline'\n  }\n\n  /**\n   * Change IE property back\n   */\n  normalize() {\n    return 'justify-self'\n  }\n\n  /**\n   * Change property name for IE\n   */\n  prefixed(prop, prefix) {\n    return prefix + 'grid-column-align'\n  }\n}\n\nGridColumnAlign.names = ['grid-column-align']\n\nmodule.exports = GridColumnAlign\n"
  },
  {
    "path": "lib/hacks/grid-end.js",
    "content": "let Declaration = require('../declaration')\nlet { isPureNumber } = require('../utils')\n\nclass GridEnd extends Declaration {\n  /**\n   * Change repeating syntax for IE\n   */\n  insert(decl, prefix, prefixes, result) {\n    if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)\n\n    let clonedDecl = this.clone(decl)\n\n    let startProp = decl.prop.replace(/end$/, 'start')\n    let spanProp = prefix + decl.prop.replace(/end$/, 'span')\n\n    if (decl.parent.some(i => i.prop === spanProp)) {\n      return undefined\n    }\n\n    clonedDecl.prop = spanProp\n\n    if (decl.value.includes('span')) {\n      clonedDecl.value = decl.value.replace(/span\\s/i, '')\n    } else {\n      let startDecl\n      decl.parent.walkDecls(startProp, d => {\n        startDecl = d\n      })\n      if (startDecl) {\n        if (isPureNumber(startDecl.value)) {\n          let value = Number(decl.value) - Number(startDecl.value) + ''\n          clonedDecl.value = value\n        } else {\n          return undefined\n        }\n      } else {\n        decl.warn(\n          result,\n          `Can not prefix ${decl.prop} (${startProp} is not found)`\n        )\n      }\n    }\n\n    decl.cloneBefore(clonedDecl)\n\n    return undefined\n  }\n}\n\nGridEnd.names = ['grid-row-end', 'grid-column-end']\n\nmodule.exports = GridEnd\n"
  },
  {
    "path": "lib/hacks/grid-row-align.js",
    "content": "let Declaration = require('../declaration')\n\nclass GridRowAlign extends Declaration {\n  /**\n   * Do not prefix flexbox values\n   */\n  check(decl) {\n    return !decl.value.includes('flex-') && decl.value !== 'baseline'\n  }\n\n  /**\n   * Change IE property back\n   */\n  normalize() {\n    return 'align-self'\n  }\n\n  /**\n   * Change property name for IE\n   */\n  prefixed(prop, prefix) {\n    return prefix + 'grid-row-align'\n  }\n}\n\nGridRowAlign.names = ['grid-row-align']\n\nmodule.exports = GridRowAlign\n"
  },
  {
    "path": "lib/hacks/grid-row-column.js",
    "content": "let Declaration = require('../declaration')\nlet utils = require('./grid-utils')\n\nclass GridRowColumn extends Declaration {\n  /**\n   * Translate grid-row / grid-column to separate -ms- prefixed properties\n   */\n  insert(decl, prefix, prefixes) {\n    if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)\n\n    let values = utils.parse(decl)\n    let [start, span] = utils.translate(values, 0, 1)\n\n    let hasStartValueSpan = values[0] && values[0].includes('span')\n\n    if (hasStartValueSpan) {\n      span = values[0].join('').replace(/\\D/g, '')\n    }\n\n    ;[\n      [decl.prop, start],\n      [`${decl.prop}-span`, span]\n    ].forEach(([prop, value]) => {\n      utils.insertDecl(decl, prop, value)\n    })\n\n    return undefined\n  }\n}\n\nGridRowColumn.names = ['grid-row', 'grid-column']\n\nmodule.exports = GridRowColumn\n"
  },
  {
    "path": "lib/hacks/grid-rows-columns.js",
    "content": "let Declaration = require('../declaration')\nlet Processor = require('../processor')\nlet {\n  autoplaceGridItems,\n  getGridGap,\n  inheritGridGap,\n  prefixTrackProp,\n  prefixTrackValue\n} = require('./grid-utils')\n\nclass GridRowsColumns extends Declaration {\n  insert(decl, prefix, prefixes, result) {\n    if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)\n\n    let { parent, prop, value } = decl\n    let isRowProp = prop.includes('rows')\n    let isColumnProp = prop.includes('columns')\n\n    let hasGridTemplate = parent.some(\n      i => i.prop === 'grid-template' || i.prop === 'grid-template-areas'\n    )\n\n    /**\n     * Not to prefix rows declaration if grid-template(-areas) is present\n     */\n    if (hasGridTemplate && isRowProp) {\n      return false\n    }\n\n    let processor = new Processor({ options: {} })\n    let status = processor.gridStatus(parent, result)\n    let gap = getGridGap(decl)\n    gap = inheritGridGap(decl, gap) || gap\n\n    let gapValue = isRowProp ? gap.row : gap.column\n\n    if ((status === 'no-autoplace' || status === true) && !hasGridTemplate) {\n      gapValue = null\n    }\n\n    let prefixValue = prefixTrackValue({\n      gap: gapValue,\n      value\n    })\n\n    /**\n     * Insert prefixes\n     */\n    decl.cloneBefore({\n      prop: prefixTrackProp({ prefix, prop }),\n      value: prefixValue\n    })\n\n    let autoflow = parent.nodes.find(i => i.prop === 'grid-auto-flow')\n    let autoflowValue = 'row'\n\n    if (autoflow && !processor.disabled(autoflow, result)) {\n      autoflowValue = autoflow.value.trim()\n    }\n    if (status === 'autoplace') {\n      /**\n       * Show warning if grid-template-rows decl is not found\n       */\n      let rowDecl = parent.nodes.find(i => i.prop === 'grid-template-rows')\n\n      if (!rowDecl && hasGridTemplate) {\n        return undefined\n      } else if (!rowDecl && !hasGridTemplate) {\n        decl.warn(\n          result,\n          'Autoplacement does not work without grid-template-rows property'\n        )\n        return undefined\n      }\n\n      /**\n       * Show warning if grid-template-columns decl is not found\n       */\n      let columnDecl = parent.nodes.find(i => {\n        return i.prop === 'grid-template-columns'\n      })\n      if (!columnDecl && !hasGridTemplate) {\n        decl.warn(\n          result,\n          'Autoplacement does not work without grid-template-columns property'\n        )\n      }\n\n      /**\n       * Autoplace grid items\n       */\n      if (isColumnProp && !hasGridTemplate) {\n        autoplaceGridItems(decl, result, gap, autoflowValue)\n      }\n    }\n\n    return undefined\n  }\n\n  /**\n   * Change IE property back\n   */\n  normalize(prop) {\n    return prop.replace(/^grid-(rows|columns)/, 'grid-template-$1')\n  }\n\n  /**\n   * Change property name for IE\n   */\n  prefixed(prop, prefix) {\n    if (prefix === '-ms-') {\n      return prefixTrackProp({ prefix, prop })\n    }\n    return super.prefixed(prop, prefix)\n  }\n}\n\nGridRowsColumns.names = [\n  'grid-template-rows',\n  'grid-template-columns',\n  'grid-rows',\n  'grid-columns'\n]\n\nmodule.exports = GridRowsColumns\n"
  },
  {
    "path": "lib/hacks/grid-start.js",
    "content": "let Declaration = require('../declaration')\n\nclass GridStart extends Declaration {\n  /**\n   * Do not add prefix for unsupported value in IE\n   */\n  check(decl) {\n    let value = decl.value\n    return !value.includes('/') && !value.includes('span')\n  }\n\n  /**\n   * Return a final spec property\n   */\n  normalize(prop) {\n    return prop.replace('-start', '')\n  }\n\n  /**\n   * Change property name for IE\n   */\n  prefixed(prop, prefix) {\n    let result = super.prefixed(prop, prefix)\n    if (prefix === '-ms-') {\n      result = result.replace('-start', '')\n    }\n    return result\n  }\n}\n\nGridStart.names = ['grid-row-start', 'grid-column-start']\n\nmodule.exports = GridStart\n"
  },
  {
    "path": "lib/hacks/grid-template-areas.js",
    "content": "let Declaration = require('../declaration')\nlet {\n  getGridGap,\n  inheritGridGap,\n  parseGridAreas,\n  prefixTrackProp,\n  prefixTrackValue,\n  warnGridGap,\n  warnMissedAreas\n} = require('./grid-utils')\n\nfunction getGridRows(tpl) {\n  return tpl\n    .trim()\n    .slice(1, -1)\n    .split(/[\"']\\s*[\"']?/g)\n}\n\nclass GridTemplateAreas extends Declaration {\n  /**\n   * Translate grid-template-areas to separate -ms- prefixed properties\n   */\n  insert(decl, prefix, prefixes, result) {\n    if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)\n\n    let hasColumns = false\n    let hasRows = false\n    let parent = decl.parent\n    let gap = getGridGap(decl)\n    gap = inheritGridGap(decl, gap) || gap\n\n    // remove already prefixed rows\n    // to prevent doubling prefixes\n    parent.walkDecls(/-ms-grid-rows/, i => i.remove())\n\n    // add empty tracks to rows\n    parent.walkDecls(/grid-template-(rows|columns)/, trackDecl => {\n      if (trackDecl.prop === 'grid-template-rows') {\n        hasRows = true\n        let { prop, value } = trackDecl\n        trackDecl.cloneBefore({\n          prop: prefixTrackProp({ prefix, prop }),\n          value: prefixTrackValue({ gap: gap.row, value })\n        })\n      } else {\n        hasColumns = true\n      }\n    })\n\n    let gridRows = getGridRows(decl.value)\n\n    if (hasColumns && !hasRows && gap.row && gridRows.length > 1) {\n      decl.cloneBefore({\n        prop: '-ms-grid-rows',\n        raws: {},\n        value: prefixTrackValue({\n          gap: gap.row,\n          value: `repeat(${gridRows.length}, auto)`\n        })\n      })\n    }\n\n    // warnings\n    warnGridGap({\n      decl,\n      gap,\n      hasColumns,\n      result\n    })\n\n    let areas = parseGridAreas({\n      gap,\n      rows: gridRows\n    })\n\n    warnMissedAreas(areas, decl, result)\n\n    return decl\n  }\n}\n\nGridTemplateAreas.names = ['grid-template-areas']\n\nmodule.exports = GridTemplateAreas\n"
  },
  {
    "path": "lib/hacks/grid-template.js",
    "content": "let Declaration = require('../declaration')\nlet {\n  getGridGap,\n  inheritGridGap,\n  parseTemplate,\n  warnGridGap,\n  warnMissedAreas\n} = require('./grid-utils')\n\nclass GridTemplate extends Declaration {\n  /**\n   * Translate grid-template to separate -ms- prefixed properties\n   */\n  insert(decl, prefix, prefixes, result) {\n    if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)\n\n    if (decl.parent.some(i => i.prop === '-ms-grid-rows')) {\n      return undefined\n    }\n\n    let gap = getGridGap(decl)\n\n    /**\n     * we must insert inherited gap values in some cases:\n     * if we are inside media query && if we have no grid-gap value\n     */\n    let inheritedGap = inheritGridGap(decl, gap)\n\n    let { areas, columns, rows } = parseTemplate({\n      decl,\n      gap: inheritedGap || gap\n    })\n\n    let hasAreas = Object.keys(areas).length > 0\n    let hasRows = Boolean(rows)\n    let hasColumns = Boolean(columns)\n\n    warnGridGap({\n      decl,\n      gap,\n      hasColumns,\n      result\n    })\n\n    warnMissedAreas(areas, decl, result)\n\n    if ((hasRows && hasColumns) || hasAreas) {\n      decl.cloneBefore({\n        prop: '-ms-grid-rows',\n        raws: {},\n        value: rows\n      })\n    }\n\n    if (hasColumns) {\n      decl.cloneBefore({\n        prop: '-ms-grid-columns',\n        raws: {},\n        value: columns\n      })\n    }\n\n    return decl\n  }\n}\n\nGridTemplate.names = ['grid-template']\n\nmodule.exports = GridTemplate\n"
  },
  {
    "path": "lib/hacks/grid-utils.js",
    "content": "let parser = require('postcss-value-parser')\nlet list = require('postcss').list\n\nlet uniq = require('../utils').uniq\nlet escapeRegexp = require('../utils').escapeRegexp\nlet splitSelector = require('../utils').splitSelector\n\nfunction convert(value) {\n  if (\n    value &&\n    value.length === 2 &&\n    value[0] === 'span' &&\n    parseInt(value[1], 10) > 0\n  ) {\n    return [false, parseInt(value[1], 10)]\n  }\n\n  if (value && value.length === 1 && parseInt(value[0], 10) > 0) {\n    return [parseInt(value[0], 10), false]\n  }\n\n  return [false, false]\n}\n\nexports.translate = translate\n\nfunction translate(values, startIndex, endIndex) {\n  let startValue = values[startIndex]\n  let endValue = values[endIndex]\n\n  if (!startValue) {\n    return [false, false]\n  }\n\n  let [start, spanStart] = convert(startValue)\n  let [end, spanEnd] = convert(endValue)\n\n  if (start && !endValue) {\n    return [start, false]\n  }\n\n  if (spanStart && end) {\n    return [end - spanStart, spanStart]\n  }\n\n  if (start && spanEnd) {\n    return [start, spanEnd]\n  }\n\n  if (start && end) {\n    return [start, end - start]\n  }\n\n  return [false, false]\n}\n\nexports.parse = parse\n\nfunction parse(decl) {\n  let node = parser(decl.value)\n\n  let values = []\n  let current = 0\n  values[current] = []\n\n  for (let i of node.nodes) {\n    if (i.type === 'div') {\n      current += 1\n      values[current] = []\n    } else if (i.type === 'word') {\n      values[current].push(i.value)\n    }\n  }\n\n  return values\n}\n\nexports.insertDecl = insertDecl\n\nfunction insertDecl(decl, prop, value) {\n  if (value && !decl.parent.some(i => i.prop === `-ms-${prop}`)) {\n    decl.cloneBefore({\n      prop: `-ms-${prop}`,\n      value: value.toString()\n    })\n  }\n}\n\n// Track transforms\n\nexports.prefixTrackProp = prefixTrackProp\n\nfunction prefixTrackProp({ prefix, prop }) {\n  return prefix + prop.replace('template-', '')\n}\n\nfunction transformRepeat({ nodes }, { gap }) {\n  let { count, size } = nodes.reduce(\n    (result, node) => {\n      if (node.type === 'div' && node.value === ',') {\n        result.key = 'size'\n      } else {\n        result[result.key].push(parser.stringify(node))\n      }\n      return result\n    },\n    {\n      count: [],\n      key: 'count',\n      size: []\n    }\n  )\n\n  // insert gap values\n  if (gap) {\n    size = size.filter(i => i.trim())\n    let val = []\n    for (let i = 1; i <= count; i++) {\n      size.forEach((item, index) => {\n        if (index > 0 || i > 1) {\n          val.push(gap)\n        }\n        val.push(item)\n      })\n    }\n\n    return val.join(' ')\n  }\n\n  return `(${size.join('')})[${count.join('')}]`\n}\n\nexports.prefixTrackValue = prefixTrackValue\n\nfunction prefixTrackValue({ gap, value }) {\n  let result = parser(value).nodes.reduce((nodes, node) => {\n    if (node.type === 'function' && node.value === 'repeat') {\n      nodes.push({\n        type: 'word',\n        value: transformRepeat(node, { gap })\n      })\n      return nodes\n    }\n    if (gap && node.type === 'space') {\n      nodes.push(\n        {\n          type: 'space',\n          value: ' '\n        },\n        {\n          type: 'word',\n          value: gap\n        },\n        node\n      )\n      return nodes\n    }\n    nodes.push(node)\n    return nodes\n  }, [])\n\n  return parser.stringify(result)\n}\n\n// Parse grid-template-areas\n\nlet DOTS = /^\\.+$/\n\nfunction track(start, end) {\n  return { end, span: end - start, start }\n}\n\nfunction getColumns(line) {\n  return line.trim().split(/\\s+/g)\n}\n\nexports.parseGridAreas = parseGridAreas\n\nfunction parseGridAreas({ gap, rows }) {\n  return rows.reduce((areas, line, rowIndex) => {\n    if (gap.row) rowIndex *= 2\n\n    if (line.trim() === '') return areas\n\n    getColumns(line).forEach((area, columnIndex) => {\n      if (DOTS.test(area)) return\n\n      if (gap.column) columnIndex *= 2\n\n      if (typeof areas[area] === 'undefined') {\n        areas[area] = {\n          column: track(columnIndex + 1, columnIndex + 2),\n          row: track(rowIndex + 1, rowIndex + 2)\n        }\n      } else {\n        let { column, row } = areas[area]\n\n        column.start = Math.min(column.start, columnIndex + 1)\n        column.end = Math.max(column.end, columnIndex + 2)\n        column.span = column.end - column.start\n\n        row.start = Math.min(row.start, rowIndex + 1)\n        row.end = Math.max(row.end, rowIndex + 2)\n        row.span = row.end - row.start\n      }\n    })\n\n    return areas\n  }, {})\n}\n\n// Parse grid-template\n\nfunction testTrack(node) {\n  return node.type === 'word' && /^\\[.+]$/.test(node.value)\n}\n\nfunction verifyRowSize(result) {\n  if (result.areas.length > result.rows.length) {\n    result.rows.push('auto')\n  }\n  return result\n}\n\nexports.parseTemplate = parseTemplate\n\nfunction parseTemplate({ decl, gap }) {\n  let gridTemplate = parser(decl.value).nodes.reduce(\n    (result, node) => {\n      let { type, value } = node\n\n      if (testTrack(node) || type === 'space') return result\n\n      // area\n      if (type === 'string') {\n        result = verifyRowSize(result)\n        result.areas.push(value)\n      }\n\n      // values and function\n      if (type === 'word' || type === 'function') {\n        result[result.key].push(parser.stringify(node))\n      }\n\n      // divider(/)\n      if (type === 'div' && value === '/') {\n        result.key = 'columns'\n        result = verifyRowSize(result)\n      }\n\n      return result\n    },\n    {\n      areas: [],\n      columns: [],\n      key: 'rows',\n      rows: []\n    }\n  )\n\n  return {\n    areas: parseGridAreas({\n      gap,\n      rows: gridTemplate.areas\n    }),\n    columns: prefixTrackValue({\n      gap: gap.column,\n      value: gridTemplate.columns.join(' ')\n    }),\n    rows: prefixTrackValue({\n      gap: gap.row,\n      value: gridTemplate.rows.join(' ')\n    })\n  }\n}\n\n// Insert parsed grid areas\n\n/**\n * Get an array of -ms- prefixed props and values\n * @param  {Object} [area] area object with column and row data\n * @param  {Boolean} [addRowSpan] should we add grid-column-row value?\n * @param  {Boolean} [addColumnSpan] should we add grid-column-span value?\n * @return {Array<Object>}\n */\nfunction getMSDecls(area, addRowSpan = false, addColumnSpan = false) {\n  let result = [\n    {\n      prop: '-ms-grid-row',\n      value: String(area.row.start)\n    }\n  ]\n  if (area.row.span > 1 || addRowSpan) {\n    result.push({\n      prop: '-ms-grid-row-span',\n      value: String(area.row.span)\n    })\n  }\n  result.push({\n    prop: '-ms-grid-column',\n    value: String(area.column.start)\n  })\n  if (area.column.span > 1 || addColumnSpan) {\n    result.push({\n      prop: '-ms-grid-column-span',\n      value: String(area.column.span)\n    })\n  }\n  return result\n}\n\nfunction getParentMedia(parent) {\n  if (parent.type === 'atrule' && parent.name === 'media') {\n    return parent\n  }\n  if (!parent.parent) {\n    return false\n  }\n  return getParentMedia(parent.parent)\n}\n\n/**\n * change selectors for rules with duplicate grid-areas.\n * @param  {Array<Rule>} rules\n * @param  {Array<String>} templateSelectors\n * @return {Array<Rule>} rules with changed selectors\n */\nfunction changeDuplicateAreaSelectors(ruleSelectors, templateSelectors) {\n  ruleSelectors = ruleSelectors.map(selector => {\n    let selectorBySpace = list.space(selector)\n    let selectorByComma = list.comma(selector)\n\n    if (selectorBySpace.length > selectorByComma.length) {\n      selector = selectorBySpace.slice(-1).join('')\n    }\n    return selector\n  })\n\n  return ruleSelectors.map(ruleSelector => {\n    let newSelector = templateSelectors.map((tplSelector, index) => {\n      let space = index === 0 ? '' : ' '\n      return `${space}${tplSelector} > ${ruleSelector}`\n    })\n\n    return newSelector\n  })\n}\n\n/**\n * check if selector of rules are equal\n * @param  {Rule} ruleA\n * @param  {Rule} ruleB\n * @return {Boolean}\n */\nfunction selectorsEqual(ruleA, ruleB) {\n  return ruleA.selectors.some(sel => {\n    return ruleB.selectors.includes(sel)\n  })\n}\n\n/**\n * Parse data from all grid-template(-areas) declarations\n * @param  {Root} css css root\n * @return {Object} parsed data\n */\nfunction parseGridTemplatesData(css) {\n  let parsed = []\n\n  // we walk through every grid-template(-areas) declaration and store\n  // data with the same area names inside the item\n  css.walkDecls(/grid-template(-areas)?$/, d => {\n    let rule = d.parent\n    let media = getParentMedia(rule)\n    let gap = getGridGap(d)\n    let inheritedGap = inheritGridGap(d, gap)\n    let { areas } = parseTemplate({ decl: d, gap: inheritedGap || gap })\n    let areaNames = Object.keys(areas)\n\n    // skip node if it doesn't have areas\n    if (areaNames.length === 0) {\n      return true\n    }\n\n    // check parsed array for item that include the same area names\n    // return index of that item\n    let index = parsed.reduce((acc, { allAreas }, idx) => {\n      let hasAreas = allAreas && areaNames.some(area => allAreas.includes(area))\n      return hasAreas ? idx : acc\n    }, null)\n\n    if (index !== null) {\n      // index is found, add the grid-template data to that item\n      let { allAreas, rules } = parsed[index]\n\n      // check if rule has no duplicate area names\n      let hasNoDuplicates = rules.some(r => {\n        return r.hasDuplicates === false && selectorsEqual(r, rule)\n      })\n\n      let duplicatesFound = false\n\n      // check need to gather all duplicate area names\n      let duplicateAreaNames = rules.reduce((acc, r) => {\n        if (!r.params && selectorsEqual(r, rule)) {\n          duplicatesFound = true\n          return r.duplicateAreaNames\n        }\n        if (!duplicatesFound) {\n          areaNames.forEach(name => {\n            if (r.areas[name]) {\n              acc.push(name)\n            }\n          })\n        }\n        return uniq(acc)\n      }, [])\n\n      // update grid-row/column-span values for areas with duplicate\n      // area names. @see #1084 and #1146\n      rules.forEach(r => {\n        areaNames.forEach(name => {\n          let area = r.areas[name]\n          if (area && area.row.span !== areas[name].row.span) {\n            areas[name].row.updateSpan = true\n          }\n\n          if (area && area.column.span !== areas[name].column.span) {\n            areas[name].column.updateSpan = true\n          }\n        })\n      })\n\n      parsed[index].allAreas = uniq([...allAreas, ...areaNames])\n      parsed[index].rules.push({\n        areas,\n        duplicateAreaNames,\n        hasDuplicates: !hasNoDuplicates,\n        node: rule,\n        params: media.params,\n        selectors: rule.selectors\n      })\n    } else {\n      // index is NOT found, push the new item to the parsed array\n      parsed.push({\n        allAreas: areaNames,\n        areasCount: 0,\n        rules: [\n          {\n            areas,\n            duplicateAreaNames: [],\n            duplicateRules: [],\n            hasDuplicates: false,\n            node: rule,\n            params: media.params,\n            selectors: rule.selectors\n          }\n        ]\n      })\n    }\n\n    return undefined\n  })\n\n  return parsed\n}\n\n/**\n * insert prefixed grid-area declarations\n * @param  {Root}  css css root\n * @param  {Function} isDisabled check if the rule is disabled\n * @return {void}\n */\nexports.insertAreas = insertAreas\n\nfunction insertAreas(css, isDisabled) {\n  // parse grid-template declarations\n  let gridTemplatesData = parseGridTemplatesData(css)\n\n  // return undefined if no declarations found\n  if (gridTemplatesData.length === 0) {\n    return undefined\n  }\n\n  // we need to store the rules that we will insert later\n  let rulesToInsert = {}\n\n  css.walkDecls('grid-area', gridArea => {\n    let gridAreaRule = gridArea.parent\n    let hasPrefixedRow = gridAreaRule.first.prop === '-ms-grid-row'\n    let gridAreaMedia = getParentMedia(gridAreaRule)\n\n    if (isDisabled(gridArea)) {\n      return undefined\n    }\n\n    let gridAreaRuleIndex = css.index(gridAreaMedia || gridAreaRule)\n\n    let value = gridArea.value\n    // found the data that matches grid-area identifier\n    let data = gridTemplatesData.filter(d => d.allAreas.includes(value))[0]\n\n    if (!data) {\n      return true\n    }\n\n    let lastArea = data.allAreas[data.allAreas.length - 1]\n    let selectorBySpace = list.space(gridAreaRule.selector)\n    let selectorByComma = list.comma(gridAreaRule.selector)\n    let selectorIsComplex =\n      selectorBySpace.length > 1 &&\n      selectorBySpace.length > selectorByComma.length\n\n    // prevent doubling of prefixes\n    if (hasPrefixedRow) {\n      return false\n    }\n\n    // create the empty object with the key as the last area name\n    // e.g if we have templates with \"a b c\" values, \"c\" will be the last area\n    if (!rulesToInsert[lastArea]) {\n      rulesToInsert[lastArea] = {}\n    }\n\n    let lastRuleIsSet = false\n\n    // walk through every grid-template rule data\n    for (let rule of data.rules) {\n      let area = rule.areas[value]\n      let hasDuplicateName = rule.duplicateAreaNames.includes(value)\n\n      // if we can't find the area name, update lastRule and continue\n      if (!area) {\n        let lastRule = rulesToInsert[lastArea].lastRule\n        let lastRuleIndex\n        if (lastRule) {\n          lastRuleIndex = css.index(lastRule)\n        } else {\n          /* c8 ignore next 2 */\n          lastRuleIndex = -1\n        }\n\n        if (gridAreaRuleIndex > lastRuleIndex) {\n          rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule\n        }\n        continue\n      }\n\n      // for grid-templates inside media rule we need to create empty\n      // array to push prefixed grid-area rules later\n      if (rule.params && !rulesToInsert[lastArea][rule.params]) {\n        rulesToInsert[lastArea][rule.params] = []\n      }\n\n      if ((!rule.hasDuplicates || !hasDuplicateName) && !rule.params) {\n        // grid-template has no duplicates and not inside media rule\n\n        getMSDecls(area, false, false)\n          .reverse()\n          .forEach(i =>\n            gridAreaRule.prepend(\n              Object.assign(i, {\n                raws: {\n                  between: gridArea.raws.between\n                }\n              })\n            )\n          )\n\n        rulesToInsert[lastArea].lastRule = gridAreaRule\n        lastRuleIsSet = true\n      } else if (rule.hasDuplicates && !rule.params && !selectorIsComplex) {\n        // grid-template has duplicates and not inside media rule\n        let cloned = gridAreaRule.clone()\n        cloned.removeAll()\n\n        getMSDecls(area, area.row.updateSpan, area.column.updateSpan)\n          .reverse()\n          .forEach(i =>\n            cloned.prepend(\n              Object.assign(i, {\n                raws: {\n                  between: gridArea.raws.between\n                }\n              })\n            )\n          )\n\n        cloned.selectors = changeDuplicateAreaSelectors(\n          cloned.selectors,\n          rule.selectors\n        )\n\n        if (rulesToInsert[lastArea].lastRule) {\n          rulesToInsert[lastArea].lastRule.after(cloned)\n        }\n        rulesToInsert[lastArea].lastRule = cloned\n        lastRuleIsSet = true\n      } else if (\n        rule.hasDuplicates &&\n        !rule.params &&\n        selectorIsComplex &&\n        gridAreaRule.selector.includes(rule.selectors[0])\n      ) {\n        // grid-template has duplicates and not inside media rule\n        // and the selector is complex\n        gridAreaRule.walkDecls(/-ms-grid-(row|column)/, d => d.remove())\n        getMSDecls(area, area.row.updateSpan, area.column.updateSpan)\n          .reverse()\n          .forEach(i =>\n            gridAreaRule.prepend(\n              Object.assign(i, {\n                raws: {\n                  between: gridArea.raws.between\n                }\n              })\n            )\n          )\n      } else if (rule.params) {\n        // grid-template is inside media rule\n        // if we're inside media rule, we need to store prefixed rules\n        // inside rulesToInsert object to be able to preserve the order of media\n        // rules and merge them easily\n        let cloned = gridAreaRule.clone()\n        cloned.removeAll()\n\n        getMSDecls(area, area.row.updateSpan, area.column.updateSpan)\n          .reverse()\n          .forEach(i =>\n            cloned.prepend(\n              Object.assign(i, {\n                raws: {\n                  between: gridArea.raws.between\n                }\n              })\n            )\n          )\n\n        if (rule.hasDuplicates && hasDuplicateName) {\n          cloned.selectors = changeDuplicateAreaSelectors(\n            cloned.selectors,\n            rule.selectors\n          )\n        }\n\n        cloned.raws = rule.node.raws\n\n        if (css.index(rule.node.parent) > gridAreaRuleIndex) {\n          // append the prefixed rules right inside media rule\n          // with grid-template\n          rule.node.parent.append(cloned)\n        } else {\n          // store the rule to insert later\n          rulesToInsert[lastArea][rule.params].push(cloned)\n        }\n\n        // set new rule as last rule ONLY if we didn't set lastRule for\n        // this grid-area before\n        if (!lastRuleIsSet) {\n          rulesToInsert[lastArea].lastRule = gridAreaMedia || gridAreaRule\n        }\n      }\n    }\n\n    return undefined\n  })\n\n  // append stored rules inside the media rules\n  Object.keys(rulesToInsert).forEach(area => {\n    let data = rulesToInsert[area]\n    let lastRule = data.lastRule\n    Object.keys(data)\n      .reverse()\n      .filter(p => p !== 'lastRule')\n      .forEach(params => {\n        if (data[params].length > 0 && lastRule) {\n          lastRule.after({ name: 'media', params })\n          lastRule.next().append(data[params])\n        }\n      })\n  })\n\n  return undefined\n}\n\n/**\n * Warn user if grid area identifiers are not found\n * @param  {Object} areas\n * @param  {Declaration} decl\n * @param  {Result} result\n * @return {void}\n */\nexports.warnMissedAreas = warnMissedAreas\n\nfunction warnMissedAreas(areas, decl, result) {\n  let missed = Object.keys(areas)\n\n  decl.root().walkDecls('grid-area', gridArea => {\n    missed = missed.filter(e => e !== gridArea.value)\n  })\n\n  if (missed.length > 0) {\n    decl.warn(result, 'Can not find grid areas: ' + missed.join(', '))\n  }\n\n  return undefined\n}\n\n/**\n * compare selectors with grid-area rule and grid-template rule\n * show warning if grid-template selector is not found\n * (this function used for grid-area rule)\n * @param  {Declaration} decl\n * @param  {Result} result\n * @return {void}\n */\nexports.warnTemplateSelectorNotFound = warnTemplateSelectorNotFound\n\nfunction warnTemplateSelectorNotFound(decl, result) {\n  let rule = decl.parent\n  let root = decl.root()\n  let duplicatesFound = false\n\n  // slice selector array. Remove the last part (for comparison)\n  let slicedSelectorArr = list\n    .space(rule.selector)\n    .filter(str => str !== '>')\n    .slice(0, -1)\n\n  // we need to compare only if selector is complex.\n  // e.g '.grid-cell' is simple, but '.parent > .grid-cell' is complex\n  if (slicedSelectorArr.length > 0) {\n    let gridTemplateFound = false\n    let foundAreaSelector = null\n\n    root.walkDecls(/grid-template(-areas)?$/, d => {\n      let parent = d.parent\n      let templateSelectors = parent.selectors\n\n      let { areas } = parseTemplate({ decl: d, gap: getGridGap(d) })\n      let hasArea = areas[decl.value]\n\n      // find the the matching selectors\n      for (let tplSelector of templateSelectors) {\n        if (gridTemplateFound) {\n          break\n        }\n        let tplSelectorArr = list.space(tplSelector).filter(str => str !== '>')\n\n        gridTemplateFound = tplSelectorArr.every(\n          (item, idx) => item === slicedSelectorArr[idx]\n        )\n      }\n\n      if (gridTemplateFound || !hasArea) {\n        return true\n      }\n\n      if (!foundAreaSelector) {\n        foundAreaSelector = parent.selector\n      }\n\n      // if we found the duplicate area with different selector\n      if (foundAreaSelector && foundAreaSelector !== parent.selector) {\n        duplicatesFound = true\n      }\n\n      return undefined\n    })\n\n    // warn user if we didn't find template\n    if (!gridTemplateFound && duplicatesFound) {\n      decl.warn(\n        result,\n        'Autoprefixer cannot find a grid-template ' +\n          `containing the duplicate grid-area \"${decl.value}\" ` +\n          `with full selector matching: ${slicedSelectorArr.join(' ')}`\n      )\n    }\n  }\n}\n\n/**\n * warn user if both grid-area and grid-(row|column)\n * declarations are present in the same rule\n * @param  {Declaration} decl\n * @param  {Result} result\n * @return {void}\n */\nexports.warnIfGridRowColumnExists = warnIfGridRowColumnExists\n\nfunction warnIfGridRowColumnExists(decl, result) {\n  let rule = decl.parent\n  let decls = []\n  rule.walkDecls(/^grid-(row|column)/, d => {\n    if (\n      !d.prop.endsWith('-end') &&\n      !d.value.startsWith('span') &&\n      !d.prop.endsWith('-gap')\n    ) {\n      decls.push(d)\n    }\n  })\n  if (decls.length > 0) {\n    decls.forEach(d => {\n      d.warn(\n        result,\n        'You already have a grid-area declaration present in the rule. ' +\n          `You should use either grid-area or ${d.prop}, not both`\n      )\n    })\n  }\n\n  return undefined\n}\n\n// Gap utils\n\nexports.getGridGap = getGridGap\n\nfunction getGridGap(decl) {\n  let gap = {}\n\n  // try to find gap\n  let testGap = /^(grid-)?((row|column)-)?gap$/\n  decl.parent.walkDecls(testGap, ({ prop, value }) => {\n    if (/^(grid-)?gap$/.test(prop)) {\n      let [row, , column] = parser(value).nodes\n\n      gap.row = row && parser.stringify(row)\n      gap.column = column ? parser.stringify(column) : gap.row\n    }\n    if (/^(grid-)?row-gap$/.test(prop)) gap.row = value\n    if (/^(grid-)?column-gap$/.test(prop)) gap.column = value\n  })\n\n  return gap\n}\n\n/**\n * parse media parameters (for example 'min-width: 500px')\n * @param  {String} params parameter to parse\n * @return {}\n */\nfunction parseMediaParams(params) {\n  if (!params) {\n    return []\n  }\n  let parsed = parser(params)\n  let prop\n  let value\n\n  parsed.walk(node => {\n    if (node.type === 'word' && /min|max/g.test(node.value)) {\n      prop = node.value\n    } else if (node.value.includes('px')) {\n      value = parseInt(node.value.replace(/\\D/g, ''))\n    }\n  })\n\n  return [prop, value]\n}\n\n/**\n * Compare the selectors and decide if we\n * need to inherit gap from compared selector or not.\n * @type {String} selA\n * @type {String} selB\n * @return {Boolean}\n */\nfunction shouldInheritGap(selA, selB) {\n  let result\n\n  // get arrays of selector split in 3-deep array\n  let splitSelectorArrA = splitSelector(selA)\n  let splitSelectorArrB = splitSelector(selB)\n\n  if (splitSelectorArrA[0].length < splitSelectorArrB[0].length) {\n    // abort if selectorA has lower descendant specificity then selectorB\n    // (e.g '.grid' and '.hello .world .grid')\n    return false\n  } else if (splitSelectorArrA[0].length > splitSelectorArrB[0].length) {\n    // if selectorA has higher descendant specificity then selectorB\n    // (e.g '.foo .bar .grid' and '.grid')\n\n    let idx = splitSelectorArrA[0].reduce((res, [item], index) => {\n      let firstSelectorPart = splitSelectorArrB[0][0][0]\n      if (item === firstSelectorPart) {\n        return index\n      }\n      return false\n    }, false)\n\n    if (idx) {\n      result = splitSelectorArrB[0].every((arr, index) => {\n        return arr.every(\n          (part, innerIndex) =>\n            // because selectorA has more space elements, we need to slice\n            // selectorA array by 'idx' number to compare them\n            splitSelectorArrA[0].slice(idx)[index][innerIndex] === part\n        )\n      })\n    }\n  } else {\n    // if selectorA has the same descendant specificity as selectorB\n    // this condition covers cases such as: '.grid.foo.bar' and '.grid'\n    result = splitSelectorArrB.some(byCommaArr => {\n      return byCommaArr.every((bySpaceArr, index) => {\n        return bySpaceArr.every(\n          (part, innerIndex) => splitSelectorArrA[0][index][innerIndex] === part\n        )\n      })\n    })\n  }\n\n  return result\n}\n/**\n * inherit grid gap values from the closest rule above\n * with the same selector\n * @param  {Declaration} decl\n * @param  {Object} gap gap values\n * @return {Object | Boolean} return gap values or false (if not found)\n */\nexports.inheritGridGap = inheritGridGap\n\nfunction inheritGridGap(decl, gap) {\n  let rule = decl.parent\n  let mediaRule = getParentMedia(rule)\n  let root = rule.root()\n\n  // get an array of selector split in 3-deep array\n  let splitSelectorArr = splitSelector(rule.selector)\n\n  // abort if the rule already has gaps\n  if (Object.keys(gap).length > 0) {\n    return false\n  }\n\n  // e.g ['min-width']\n  let [prop] = parseMediaParams(mediaRule.params)\n\n  let lastBySpace = splitSelectorArr[0]\n\n  // get escaped value from the selector\n  // if we have '.grid-2.foo.bar' selector, will be '\\.grid\\-2'\n  let escaped = escapeRegexp(lastBySpace[lastBySpace.length - 1][0])\n\n  let regexp = new RegExp(`(${escaped}$)|(${escaped}[,.])`)\n\n  // find the closest rule with the same selector\n  let closestRuleGap\n  root.walkRules(regexp, r => {\n    let gridGap\n\n    // abort if are checking the same rule\n    if (rule.toString() === r.toString()) {\n      return false\n    }\n\n    // find grid-gap values\n    r.walkDecls('grid-gap', d => (gridGap = getGridGap(d)))\n\n    // skip rule without gaps\n    if (!gridGap || Object.keys(gridGap).length === 0) {\n      return true\n    }\n\n    // skip rules that should not be inherited from\n    if (!shouldInheritGap(rule.selector, r.selector)) {\n      return true\n    }\n\n    let media = getParentMedia(r)\n    if (media) {\n      // if we are inside media, we need to check that media props match\n      // e.g ('min-width' === 'min-width')\n      let propToCompare = parseMediaParams(media.params)[0]\n      if (propToCompare === prop) {\n        closestRuleGap = gridGap\n        return true\n      }\n    } else {\n      closestRuleGap = gridGap\n      return true\n    }\n\n    return undefined\n  })\n\n  // if we find the closest gap object\n  if (closestRuleGap && Object.keys(closestRuleGap).length > 0) {\n    return closestRuleGap\n  }\n  return false\n}\n\nexports.warnGridGap = warnGridGap\n\nfunction warnGridGap({ decl, gap, hasColumns, result }) {\n  let hasBothGaps = gap.row && gap.column\n  if (!hasColumns && (hasBothGaps || (gap.column && !gap.row))) {\n    delete gap.column\n    decl.warn(\n      result,\n      'Can not implement grid-gap without grid-template-columns'\n    )\n  }\n}\n\n/**\n * normalize the grid-template-rows/columns values\n * @param  {String} str grid-template-rows/columns value\n * @return {Array} normalized array with values\n * @example\n * let normalized = normalizeRowColumn('1fr repeat(2, 20px 50px) 1fr')\n * normalized // <= ['1fr', '20px', '50px', '20px', '50px', '1fr']\n */\nfunction normalizeRowColumn(str) {\n  let normalized = parser(str).nodes.reduce((result, node) => {\n    if (node.type === 'function' && node.value === 'repeat') {\n      let key = 'count'\n\n      let [count, value] = node.nodes.reduce(\n        (acc, n) => {\n          if (n.type === 'word' && key === 'count') {\n            acc[0] = Math.abs(parseInt(n.value))\n            return acc\n          }\n          if (n.type === 'div' && n.value === ',') {\n            key = 'value'\n            return acc\n          }\n          if (key === 'value') {\n            acc[1] += parser.stringify(n)\n          }\n          return acc\n        },\n        [0, '']\n      )\n\n      if (count) {\n        for (let i = 0; i < count; i++) {\n          result.push(value)\n        }\n      }\n\n      return result\n    }\n    if (node.type === 'space') {\n      return result\n    }\n    result.push(parser.stringify(node))\n    return result\n  }, [])\n\n  return normalized\n}\n\nexports.autoplaceGridItems = autoplaceGridItems\n\n/**\n * Autoplace grid items\n * @param {Declaration} decl\n * @param {Result} result\n * @param {Object} gap gap values\n * @param {String} autoflowValue grid-auto-flow value\n * @return {void}\n * @see https://github.com/postcss/autoprefixer/issues/1148\n */\nfunction autoplaceGridItems(decl, result, gap, autoflowValue = 'row') {\n  let { parent } = decl\n\n  let rowDecl = parent.nodes.find(i => i.prop === 'grid-template-rows')\n  let rows = normalizeRowColumn(rowDecl.value)\n  let columns = normalizeRowColumn(decl.value)\n\n  // Build array of area names with dummy values. If we have 3 columns and\n  // 2 rows, filledRows will be equal to ['1 2 3', '4 5 6']\n  let filledRows = rows.map((_, rowIndex) => {\n    return Array.from(\n      { length: columns.length },\n      (v, k) => k + rowIndex * columns.length + 1\n    ).join(' ')\n  })\n\n  let areas = parseGridAreas({ gap, rows: filledRows })\n  let keys = Object.keys(areas)\n  let items = keys.map(i => areas[i])\n\n  // Change the order of cells if grid-auto-flow value is 'column'\n  if (autoflowValue.includes('column')) {\n    items = items.sort((a, b) => a.column.start - b.column.start)\n  }\n\n  // Insert new rules\n  items.reverse().forEach((item, index) => {\n    let { column, row } = item\n    let nodeSelector = parent.selectors\n      .map(sel => sel + ` > *:nth-child(${keys.length - index})`)\n      .join(', ')\n\n    // create new rule\n    let node = parent.clone().removeAll()\n\n    // change rule selector\n    node.selector = nodeSelector\n\n    // insert prefixed row/column values\n    node.append({ prop: '-ms-grid-row', value: row.start })\n    node.append({ prop: '-ms-grid-column', value: column.start })\n\n    // insert rule\n    parent.after(node)\n  })\n\n  return undefined\n}\n"
  },
  {
    "path": "lib/hacks/image-rendering.js",
    "content": "let Declaration = require('../declaration')\n\nclass ImageRendering extends Declaration {\n  /**\n   * Add hack only for crisp-edges\n   */\n  check(decl) {\n    return decl.value === 'pixelated'\n  }\n\n  /**\n   * Return property name by spec\n   */\n  normalize() {\n    return 'image-rendering'\n  }\n\n  /**\n   * Change property name for IE\n   */\n  prefixed(prop, prefix) {\n    if (prefix === '-ms-') {\n      return '-ms-interpolation-mode'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Warn on old value\n   */\n  process(node, result) {\n    return super.process(node, result)\n  }\n\n  /**\n   * Change property and value for IE\n   */\n  set(decl, prefix) {\n    if (prefix !== '-ms-') return super.set(decl, prefix)\n    decl.prop = '-ms-interpolation-mode'\n    decl.value = 'nearest-neighbor'\n    return decl\n  }\n}\n\nImageRendering.names = ['image-rendering', 'interpolation-mode']\n\nmodule.exports = ImageRendering\n"
  },
  {
    "path": "lib/hacks/image-set.js",
    "content": "let Value = require('../value')\n\nclass ImageSet extends Value {\n  /**\n   * Use non-standard name for WebKit and Firefox\n   */\n  replace(string, prefix) {\n    let fixed = super.replace(string, prefix)\n    if (prefix === '-webkit-') {\n      fixed = fixed.replace(/(\"[^\"]+\"|'[^']+')(\\s+\\d+\\w)/gi, 'url($1)$2')\n    }\n    return fixed\n  }\n}\n\nImageSet.names = ['image-set']\n\nmodule.exports = ImageSet\n"
  },
  {
    "path": "lib/hacks/inline-logical.js",
    "content": "let Declaration = require('../declaration')\n\nclass InlineLogical extends Declaration {\n  /**\n   * Return property name by spec\n   */\n  normalize(prop) {\n    return prop.replace(/(margin|padding|border)-(start|end)/, '$1-inline-$2')\n  }\n\n  /**\n   * Use old syntax for -moz- and -webkit-\n   */\n  prefixed(prop, prefix) {\n    return prefix + prop.replace('-inline', '')\n  }\n}\n\nInlineLogical.names = [\n  'border-inline-start',\n  'border-inline-end',\n  'margin-inline-start',\n  'margin-inline-end',\n  'padding-inline-start',\n  'padding-inline-end',\n  'border-start',\n  'border-end',\n  'margin-start',\n  'margin-end',\n  'padding-start',\n  'padding-end'\n]\n\nmodule.exports = InlineLogical\n"
  },
  {
    "path": "lib/hacks/intrinsic.js",
    "content": "let OldValue = require('../old-value')\nlet Value = require('../value')\n\nfunction regexp(name) {\n  return new RegExp(`(^|[\\\\s,(])(${name}($|[\\\\s),]))`, 'gi')\n}\n\nclass Intrinsic extends Value {\n  add(decl, prefix) {\n    if (decl.prop.includes('grid') && prefix !== '-webkit-') {\n      return undefined\n    }\n    return super.add(decl, prefix)\n  }\n\n  isStretch() {\n    return (\n      this.name === 'stretch' ||\n      this.name === 'fill' ||\n      this.name === 'fill-available'\n    )\n  }\n\n  old(prefix) {\n    let prefixed = prefix + this.name\n    if (this.isStretch()) {\n      if (prefix === '-moz-') {\n        prefixed = '-moz-available'\n      } else if (prefix === '-webkit-') {\n        prefixed = '-webkit-fill-available'\n      }\n    }\n    return new OldValue(this.name, prefixed, prefixed, regexp(prefixed))\n  }\n\n  regexp() {\n    if (!this.regexpCache) this.regexpCache = regexp(this.name)\n    return this.regexpCache\n  }\n\n  replace(string, prefix) {\n    if (prefix === '-moz-' && this.isStretch()) {\n      return string.replace(this.regexp(), '$1-moz-available$3')\n    }\n    if (prefix === '-webkit-' && this.isStretch()) {\n      return string.replace(this.regexp(), '$1-webkit-fill-available$3')\n    }\n    return super.replace(string, prefix)\n  }\n}\n\nIntrinsic.names = [\n  'max-content',\n  'min-content',\n  'fit-content',\n  'fill',\n  'fill-available',\n  'stretch'\n]\n\nmodule.exports = Intrinsic\n"
  },
  {
    "path": "lib/hacks/justify-content.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass JustifyContent extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'justify-content'\n  }\n\n  /**\n   * Change property name for 2009 and 2012 specs\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2009) {\n      return prefix + 'box-pack'\n    }\n    if (spec === 2012) {\n      return prefix + 'flex-pack'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Change value for 2009 and 2012 specs\n   */\n  set(decl, prefix) {\n    let spec = flexSpec(prefix)[0]\n    if (spec === 2009 || spec === 2012) {\n      let value = JustifyContent.oldValues[decl.value] || decl.value\n      decl.value = value\n      if (spec !== 2009 || value !== 'distribute') {\n        return super.set(decl, prefix)\n      }\n    } else if (spec === 'final') {\n      return super.set(decl, prefix)\n    }\n    return undefined\n  }\n}\n\nJustifyContent.names = ['justify-content', 'flex-pack', 'box-pack']\n\nJustifyContent.oldValues = {\n  'flex-end': 'end',\n  'flex-start': 'start',\n  'space-around': 'distribute',\n  'space-between': 'justify'\n}\n\nmodule.exports = JustifyContent\n"
  },
  {
    "path": "lib/hacks/mask-border.js",
    "content": "let Declaration = require('../declaration')\n\nclass MaskBorder extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return this.name.replace('box-image', 'border')\n  }\n\n  /**\n   * Return flex property for 2012 spec\n   */\n  prefixed(prop, prefix) {\n    let result = super.prefixed(prop, prefix)\n    if (prefix === '-webkit-') {\n      result = result.replace('border', 'box-image')\n    }\n    return result\n  }\n}\n\nMaskBorder.names = [\n  'mask-border',\n  'mask-border-source',\n  'mask-border-slice',\n  'mask-border-width',\n  'mask-border-outset',\n  'mask-border-repeat',\n  'mask-box-image',\n  'mask-box-image-source',\n  'mask-box-image-slice',\n  'mask-box-image-width',\n  'mask-box-image-outset',\n  'mask-box-image-repeat'\n]\n\nmodule.exports = MaskBorder\n"
  },
  {
    "path": "lib/hacks/mask-composite.js",
    "content": "let Declaration = require('../declaration')\n\nclass MaskComposite extends Declaration {\n  /**\n   * Prefix mask-composite for webkit\n   */\n  insert(decl, prefix, prefixes) {\n    let isCompositeProp = decl.prop === 'mask-composite'\n\n    let compositeValues\n\n    if (isCompositeProp) {\n      compositeValues = decl.value.split(',')\n    } else {\n      compositeValues = decl.value.match(MaskComposite.regexp) || []\n    }\n\n    compositeValues = compositeValues.map(el => el.trim()).filter(el => el)\n    let hasCompositeValues = compositeValues.length\n\n    let compositeDecl\n\n    if (hasCompositeValues) {\n      compositeDecl = this.clone(decl)\n      compositeDecl.value = compositeValues\n        .map(value => MaskComposite.oldValues[value] || value)\n        .join(', ')\n\n      if (compositeValues.includes('intersect')) {\n        compositeDecl.value += ', xor'\n      }\n\n      compositeDecl.prop = prefix + 'mask-composite'\n    }\n\n    if (isCompositeProp) {\n      if (!hasCompositeValues) {\n        return undefined\n      }\n\n      if (this.needCascade(decl)) {\n        compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix)\n      }\n\n      return decl.parent.insertBefore(decl, compositeDecl)\n    }\n\n    let cloned = this.clone(decl)\n    cloned.prop = prefix + cloned.prop\n\n    if (hasCompositeValues) {\n      cloned.value = cloned.value.replace(MaskComposite.regexp, '')\n    }\n\n    if (this.needCascade(decl)) {\n      cloned.raws.before = this.calcBefore(prefixes, decl, prefix)\n    }\n\n    decl.parent.insertBefore(decl, cloned)\n\n    if (!hasCompositeValues) {\n      return decl\n    }\n\n    if (this.needCascade(decl)) {\n      compositeDecl.raws.before = this.calcBefore(prefixes, decl, prefix)\n    }\n    return decl.parent.insertBefore(decl, compositeDecl)\n  }\n}\n\nMaskComposite.names = ['mask', 'mask-composite']\n\nMaskComposite.oldValues = {\n  add: 'source-over',\n  exclude: 'xor',\n  intersect: 'source-in',\n  subtract: 'source-out'\n}\n\nMaskComposite.regexp = new RegExp(\n  `\\\\s+(${Object.keys(MaskComposite.oldValues).join(\n    '|'\n  )})\\\\b(?!\\\\))\\\\s*(?=[,])`,\n  'ig'\n)\n\nmodule.exports = MaskComposite\n"
  },
  {
    "path": "lib/hacks/order.js",
    "content": "let Declaration = require('../declaration')\nlet flexSpec = require('./flex-spec')\n\nclass Order extends Declaration {\n  /**\n   * Return property name by final spec\n   */\n  normalize() {\n    return 'order'\n  }\n\n  /**\n   * Change property name for 2009 and 2012 specs\n   */\n  prefixed(prop, prefix) {\n    let spec\n    ;[spec, prefix] = flexSpec(prefix)\n    if (spec === 2009) {\n      return prefix + 'box-ordinal-group'\n    }\n    if (spec === 2012) {\n      return prefix + 'flex-order'\n    }\n    return super.prefixed(prop, prefix)\n  }\n\n  /**\n   * Fix value for 2009 spec\n   */\n  set(decl, prefix) {\n    let spec = flexSpec(prefix)[0]\n    if (spec === 2009 && /\\d/.test(decl.value)) {\n      decl.value = (parseInt(decl.value) + 1).toString()\n      return super.set(decl, prefix)\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nOrder.names = ['order', 'flex-order', 'box-ordinal-group']\n\nmodule.exports = Order\n"
  },
  {
    "path": "lib/hacks/overscroll-behavior.js",
    "content": "let Declaration = require('../declaration')\n\nclass OverscrollBehavior extends Declaration {\n  /**\n   * Return property name by spec\n   */\n  normalize() {\n    return 'overscroll-behavior'\n  }\n\n  /**\n   * Change property name for IE\n   */\n  prefixed(prop, prefix) {\n    return prefix + 'scroll-chaining'\n  }\n\n  /**\n   * Change value for IE\n   */\n  set(decl, prefix) {\n    if (decl.value === 'auto') {\n      decl.value = 'chained'\n    } else if (decl.value === 'none' || decl.value === 'contain') {\n      decl.value = 'none'\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nOverscrollBehavior.names = ['overscroll-behavior', 'scroll-chaining']\n\nmodule.exports = OverscrollBehavior\n"
  },
  {
    "path": "lib/hacks/pixelated.js",
    "content": "let OldValue = require('../old-value')\nlet Value = require('../value')\n\nclass Pixelated extends Value {\n  /**\n   * Different name for WebKit and Firefox\n   */\n  old(prefix) {\n    if (prefix === '-webkit-') {\n      return new OldValue(this.name, '-webkit-optimize-contrast')\n    }\n    if (prefix === '-moz-') {\n      return new OldValue(this.name, '-moz-crisp-edges')\n    }\n    return super.old(prefix)\n  }\n\n  /**\n   * Use non-standard name for WebKit and Firefox\n   */\n  replace(string, prefix) {\n    if (prefix === '-webkit-') {\n      return string.replace(this.regexp(), '$1-webkit-optimize-contrast')\n    }\n    if (prefix === '-moz-') {\n      return string.replace(this.regexp(), '$1-moz-crisp-edges')\n    }\n    return super.replace(string, prefix)\n  }\n}\n\nPixelated.names = ['pixelated']\n\nmodule.exports = Pixelated\n"
  },
  {
    "path": "lib/hacks/place-self.js",
    "content": "let Declaration = require('../declaration')\nlet utils = require('./grid-utils')\n\nclass PlaceSelf extends Declaration {\n  /**\n   * Translate place-self to separate -ms- prefixed properties\n   */\n  insert(decl, prefix, prefixes) {\n    if (prefix !== '-ms-') return super.insert(decl, prefix, prefixes)\n\n    // prevent doubling of prefixes\n    if (decl.parent.some(i => i.prop === '-ms-grid-row-align')) {\n      return undefined\n    }\n\n    let [[first, second]] = utils.parse(decl)\n\n    if (second) {\n      utils.insertDecl(decl, 'grid-row-align', first)\n      utils.insertDecl(decl, 'grid-column-align', second)\n    } else {\n      utils.insertDecl(decl, 'grid-row-align', first)\n      utils.insertDecl(decl, 'grid-column-align', first)\n    }\n\n    return undefined\n  }\n}\n\nPlaceSelf.names = ['place-self']\n\nmodule.exports = PlaceSelf\n"
  },
  {
    "path": "lib/hacks/placeholder-shown.js",
    "content": "let Selector = require('../selector')\n\nclass PlaceholderShown extends Selector {\n  /**\n   * Return different selectors depend on prefix\n   */\n  prefixed(prefix) {\n    if (prefix === '-moz-') {\n      return ':-moz-placeholder'\n    } else if (prefix === '-ms-') {\n      return ':-ms-input-placeholder'\n    }\n    return `:${prefix}placeholder-shown`\n  }\n}\n\nPlaceholderShown.names = [':placeholder-shown']\n\nmodule.exports = PlaceholderShown\n"
  },
  {
    "path": "lib/hacks/placeholder.js",
    "content": "let Selector = require('../selector')\n\nclass Placeholder extends Selector {\n  /**\n   * Add old mozilla to possible prefixes\n   */\n  possible() {\n    return super.possible().concat(['-moz- old', '-ms- old'])\n  }\n\n  /**\n   * Return different selectors depend on prefix\n   */\n  prefixed(prefix) {\n    if (prefix === '-webkit-') {\n      return '::-webkit-input-placeholder'\n    }\n    if (prefix === '-ms-') {\n      return '::-ms-input-placeholder'\n    }\n    if (prefix === '-ms- old') {\n      return ':-ms-input-placeholder'\n    }\n    if (prefix === '-moz- old') {\n      return ':-moz-placeholder'\n    }\n    return `::${prefix}placeholder`\n  }\n}\n\nPlaceholder.names = ['::placeholder']\n\nmodule.exports = Placeholder\n"
  },
  {
    "path": "lib/hacks/print-color-adjust.js",
    "content": "let Declaration = require('../declaration')\n\nclass PrintColorAdjust extends Declaration {\n  /**\n   * Return property name by spec\n   */\n  normalize() {\n    return 'print-color-adjust'\n  }\n\n  /**\n   * Change property name for WebKit-based browsers\n   */\n  prefixed(prop, prefix) {\n    if (prefix === '-moz-') {\n      return 'color-adjust'\n    } else {\n      return prefix + 'print-color-adjust'\n    }\n  }\n}\n\nPrintColorAdjust.names = ['print-color-adjust', 'color-adjust']\n\nmodule.exports = PrintColorAdjust\n"
  },
  {
    "path": "lib/hacks/text-decoration-skip-ink.js",
    "content": "let Declaration = require('../declaration')\n\nclass TextDecorationSkipInk extends Declaration {\n  /**\n   * Change prefix for ink value\n   */\n  set(decl, prefix) {\n    if (decl.prop === 'text-decoration-skip-ink' && decl.value === 'auto') {\n      decl.prop = prefix + 'text-decoration-skip'\n      decl.value = 'ink'\n      return decl\n    } else {\n      return super.set(decl, prefix)\n    }\n  }\n}\n\nTextDecorationSkipInk.names = [\n  'text-decoration-skip-ink',\n  'text-decoration-skip'\n]\n\nmodule.exports = TextDecorationSkipInk\n"
  },
  {
    "path": "lib/hacks/text-decoration.js",
    "content": "let Declaration = require('../declaration')\n\nconst BASIC = [\n  'none',\n  'underline',\n  'overline',\n  'line-through',\n  'blink',\n  'inherit',\n  'initial',\n  'unset'\n]\n\nclass TextDecoration extends Declaration {\n  /**\n   * Do not add prefixes for basic values.\n   */\n  check(decl) {\n    return decl.value.split(/\\s+/).some(i => !BASIC.includes(i))\n  }\n}\n\nTextDecoration.names = ['text-decoration']\n\nmodule.exports = TextDecoration\n"
  },
  {
    "path": "lib/hacks/text-emphasis-position.js",
    "content": "let Declaration = require('../declaration')\n\nclass TextEmphasisPosition extends Declaration {\n  set(decl, prefix) {\n    if (prefix === '-webkit-') {\n      decl.value = decl.value.replace(/\\s*(right|left)\\s*/i, '')\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nTextEmphasisPosition.names = ['text-emphasis-position']\n\nmodule.exports = TextEmphasisPosition\n"
  },
  {
    "path": "lib/hacks/transform-decl.js",
    "content": "let Declaration = require('../declaration')\n\nclass TransformDecl extends Declaration {\n  /**\n   * Is transform contain 3D commands\n   */\n  contain3d(decl) {\n    if (decl.prop === 'transform-origin') {\n      return false\n    }\n\n    for (let func of TransformDecl.functions3d) {\n      if (decl.value.includes(`${func}(`)) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  /**\n   * Don't add prefix for IE in keyframes\n   */\n  insert(decl, prefix, prefixes) {\n    if (prefix === '-ms-') {\n      if (!this.contain3d(decl) && !this.keyframeParents(decl)) {\n        return super.insert(decl, prefix, prefixes)\n      }\n    } else if (prefix === '-o-') {\n      if (!this.contain3d(decl)) {\n        return super.insert(decl, prefix, prefixes)\n      }\n    } else {\n      return super.insert(decl, prefix, prefixes)\n    }\n    return undefined\n  }\n\n  /**\n   * Recursively check all parents for @keyframes\n   */\n  keyframeParents(decl) {\n    let { parent } = decl\n    while (parent) {\n      if (parent.type === 'atrule' && parent.name === 'keyframes') {\n        return true\n      }\n      ;({ parent } = parent)\n    }\n    return false\n  }\n\n  /**\n   * Replace rotateZ to rotate for IE 9\n   */\n  set(decl, prefix) {\n    decl = super.set(decl, prefix)\n    if (prefix === '-ms-') {\n      decl.value = decl.value.replace(/rotatez/gi, 'rotate')\n    }\n    return decl\n  }\n}\n\nTransformDecl.names = ['transform', 'transform-origin']\n\nTransformDecl.functions3d = [\n  'matrix3d',\n  'translate3d',\n  'translateZ',\n  'scale3d',\n  'scaleZ',\n  'rotate3d',\n  'rotateX',\n  'rotateY',\n  'perspective'\n]\n\nmodule.exports = TransformDecl\n"
  },
  {
    "path": "lib/hacks/user-select.js",
    "content": "let Declaration = require('../declaration')\n\nclass UserSelect extends Declaration {\n  /**\n   * Avoid prefixing all in IE\n   */\n  insert(decl, prefix, prefixes) {\n    if (decl.value === 'all' && prefix === '-ms-') {\n      return undefined\n    } else if (\n      decl.value === 'contain' &&\n      (prefix === '-moz-' || prefix === '-webkit-')\n    ) {\n      return undefined\n    } else {\n      return super.insert(decl, prefix, prefixes)\n    }\n  }\n\n  /**\n   * Change prefixed value for IE\n   */\n  set(decl, prefix) {\n    if (prefix === '-ms-' && decl.value === 'contain') {\n      decl.value = 'element'\n    }\n    return super.set(decl, prefix)\n  }\n}\n\nUserSelect.names = ['user-select']\n\nmodule.exports = UserSelect\n"
  },
  {
    "path": "lib/hacks/writing-mode.js",
    "content": "let Declaration = require('../declaration')\n\nclass WritingMode extends Declaration {\n  insert(decl, prefix, prefixes) {\n    if (prefix === '-ms-') {\n      let cloned = this.set(this.clone(decl), prefix)\n\n      if (this.needCascade(decl)) {\n        cloned.raws.before = this.calcBefore(prefixes, decl, prefix)\n      }\n      let direction = 'ltr'\n\n      decl.parent.nodes.forEach(i => {\n        if (i.prop === 'direction') {\n          if (i.value === 'rtl' || i.value === 'ltr') direction = i.value\n        }\n      })\n\n      cloned.value = WritingMode.msValues[direction][decl.value] || decl.value\n      return decl.parent.insertBefore(decl, cloned)\n    }\n\n    return super.insert(decl, prefix, prefixes)\n  }\n}\n\nWritingMode.names = ['writing-mode']\n\nWritingMode.msValues = {\n  ltr: {\n    'horizontal-tb': 'lr-tb',\n    'vertical-lr': 'tb-lr',\n    'vertical-rl': 'tb-rl'\n  },\n  rtl: {\n    'horizontal-tb': 'rl-tb',\n    'vertical-lr': 'bt-lr',\n    'vertical-rl': 'bt-rl'\n  }\n}\n\nmodule.exports = WritingMode\n"
  },
  {
    "path": "lib/info.js",
    "content": "let browserslist = require('browserslist')\n\nfunction capitalize(str) {\n  return str.slice(0, 1).toUpperCase() + str.slice(1)\n}\n\nconst NAMES = {\n  and_chr: 'Chrome for Android',\n  and_ff: 'Firefox for Android',\n  and_qq: 'QQ Browser',\n  and_uc: 'UC for Android',\n  baidu: 'Baidu Browser',\n  ie: 'IE',\n  ie_mob: 'IE Mobile',\n  ios_saf: 'iOS Safari',\n  kaios: 'KaiOS Browser',\n  op_mini: 'Opera Mini',\n  op_mob: 'Opera Mobile',\n  samsung: 'Samsung Internet'\n}\n\nfunction prefix(name, prefixes, note) {\n  let out = `  ${name}`\n  if (note) out += ' *'\n  out += ': '\n  out += prefixes.map(i => i.replace(/^-(.*)-$/g, '$1')).join(', ')\n  out += '\\n'\n  return out\n}\n\nmodule.exports = function (prefixes) {\n  if (prefixes.browsers.selected.length === 0) {\n    return 'No browsers selected'\n  }\n\n  let versions = {}\n  for (let browser of prefixes.browsers.selected) {\n    let parts = browser.split(' ')\n    let name = parts[0]\n    let version = parts[1]\n\n    name = NAMES[name] || capitalize(name)\n    if (versions[name]) {\n      versions[name].push(version)\n    } else {\n      versions[name] = [version]\n    }\n  }\n\n  let out = 'Browsers:\\n'\n  for (let browser in versions) {\n    let list = versions[browser]\n    list = list.sort((a, b) => parseFloat(b) - parseFloat(a))\n    out += `  ${browser}: ${list.join(', ')}\\n`\n  }\n\n  let coverage = browserslist.coverage(prefixes.browsers.selected)\n  let round = Math.round(coverage * 100) / 100.0\n  out += `\\nThese browsers account for ${round}% of all users globally\\n`\n\n  let atrules = []\n  for (let name in prefixes.add) {\n    let data = prefixes.add[name]\n    if (name[0] === '@' && data.prefixes) {\n      atrules.push(prefix(name, data.prefixes))\n    }\n  }\n  if (atrules.length > 0) {\n    out += `\\nAt-Rules:\\n${atrules.sort().join('')}`\n  }\n\n  let selectors = []\n  for (let selector of prefixes.add.selectors) {\n    if (selector.prefixes) {\n      selectors.push(prefix(selector.name, selector.prefixes))\n    }\n  }\n  if (selectors.length > 0) {\n    out += `\\nSelectors:\\n${selectors.sort().join('')}`\n  }\n\n  let values = []\n  let props = []\n  let hadGrid = false\n  for (let name in prefixes.add) {\n    let data = prefixes.add[name]\n    if (name[0] !== '@' && data.prefixes) {\n      let grid = name.indexOf('grid-') === 0\n      if (grid) hadGrid = true\n      props.push(prefix(name, data.prefixes, grid))\n    }\n\n    if (!Array.isArray(data.values)) {\n      continue\n    }\n    for (let value of data.values) {\n      let grid = value.name.includes('grid')\n      if (grid) hadGrid = true\n      let string = prefix(value.name, value.prefixes, grid)\n      if (!values.includes(string)) {\n        values.push(string)\n      }\n    }\n  }\n\n  if (props.length > 0) {\n    out += `\\nProperties:\\n${props.sort().join('')}`\n  }\n  if (values.length > 0) {\n    out += `\\nValues:\\n${values.sort().join('')}`\n  }\n  if (hadGrid) {\n    out += '\\n* - Prefixes will be added only on grid: true option.\\n'\n  }\n\n  if (!atrules.length && !selectors.length && !props.length && !values.length) {\n    out +=\n      \"\\nAwesome! Your browsers don't require any vendor prefixes.\" +\n      '\\nNow you can remove Autoprefixer from build steps.'\n  }\n\n  return out\n}\n"
  },
  {
    "path": "lib/old-selector.js",
    "content": "class OldSelector {\n  constructor(selector, prefix) {\n    this.prefix = prefix\n    this.prefixed = selector.prefixed(this.prefix)\n    this.regexp = selector.regexp(this.prefix)\n\n    this.prefixeds = selector\n      .possible()\n      .map(x => [selector.prefixed(x), selector.regexp(x)])\n\n    this.unprefixed = selector.name\n    this.nameRegexp = selector.regexp()\n  }\n\n  /**\n   * Does rule contain an unnecessary prefixed selector\n   */\n  check(rule) {\n    if (!rule.selector.includes(this.prefixed)) {\n      return false\n    }\n    if (!rule.selector.match(this.regexp)) {\n      return false\n    }\n    if (this.isHack(rule)) {\n      return false\n    }\n    return true\n  }\n\n  /**\n   * Is rule a hack without unprefixed version bottom\n   */\n  isHack(rule) {\n    let index = rule.parent.index(rule) + 1\n    let rules = rule.parent.nodes\n\n    while (index < rules.length) {\n      let before = rules[index].selector\n      if (!before) {\n        return true\n      }\n\n      if (before.includes(this.unprefixed) && before.match(this.nameRegexp)) {\n        return false\n      }\n\n      let some = false\n      for (let [string, regexp] of this.prefixeds) {\n        if (before.includes(string) && before.match(regexp)) {\n          some = true\n          break\n        }\n      }\n\n      if (!some) {\n        return true\n      }\n\n      index += 1\n    }\n\n    return true\n  }\n}\n\nmodule.exports = OldSelector\n"
  },
  {
    "path": "lib/old-value.js",
    "content": "let utils = require('./utils')\n\nclass OldValue {\n  constructor(unprefixed, prefixed, string, regexp) {\n    this.unprefixed = unprefixed\n    this.prefixed = prefixed\n    this.string = string || prefixed\n    this.regexp = regexp || utils.regexp(prefixed)\n  }\n\n  /**\n   * Check, that value contain old value\n   */\n  check(value) {\n    if (value.includes(this.string)) {\n      return !!value.match(this.regexp)\n    }\n    return false\n  }\n}\n\nmodule.exports = OldValue\n"
  },
  {
    "path": "lib/prefixer.js",
    "content": "let Browsers = require('./browsers')\nlet utils = require('./utils')\nlet vendor = require('./vendor')\n\n/**\n * Recursively clone objects\n */\nfunction clone(obj, parent) {\n  let cloned = new obj.constructor()\n\n  for (let i of Object.keys(obj || {})) {\n    let value = obj[i]\n    if (i === 'parent' && typeof value === 'object') {\n      if (parent) {\n        cloned[i] = parent\n      }\n    } else if (i === 'source' || i === null) {\n      cloned[i] = value\n    } else if (Array.isArray(value)) {\n      cloned[i] = value.map(x => clone(x, cloned))\n    } else if (\n      i !== '_autoprefixerPrefix' &&\n      i !== '_autoprefixerValues' &&\n      i !== 'proxyCache'\n    ) {\n      if (typeof value === 'object' && value !== null) {\n        value = clone(value, cloned)\n      }\n      cloned[i] = value\n    }\n  }\n\n  return cloned\n}\n\nclass Prefixer {\n  constructor(name, prefixes, all) {\n    this.prefixes = prefixes\n    this.name = name\n    this.all = all\n  }\n\n  /**\n   * Clone node and clean autprefixer custom caches\n   */\n  static clone(node, overrides) {\n    let cloned = clone(node)\n    for (let name in overrides) {\n      cloned[name] = overrides[name]\n    }\n    return cloned\n  }\n\n  /**\n   * Add hack to selected names\n   */\n  static hack(klass) {\n    if (!this.hacks) {\n      this.hacks = {}\n    }\n    return klass.names.map(name => {\n      this.hacks[name] = klass\n      return this.hacks[name]\n    })\n  }\n\n  /**\n   * Load hacks for some names\n   */\n  static load(name, prefixes, all) {\n    let Klass = this.hacks && this.hacks[name]\n    if (Klass) {\n      return new Klass(name, prefixes, all)\n    } else {\n      return new this(name, prefixes, all)\n    }\n  }\n\n  /**\n   * Shortcut for Prefixer.clone\n   */\n  clone(node, overrides) {\n    return Prefixer.clone(node, overrides)\n  }\n\n  /**\n   * Find prefix in node parents\n   */\n  parentPrefix(node) {\n    let prefix\n\n    if (typeof node._autoprefixerPrefix !== 'undefined') {\n      prefix = node._autoprefixerPrefix\n    } else if (node.type === 'decl' && node.prop[0] === '-') {\n      prefix = vendor.prefix(node.prop)\n    } else if (node.type === 'root') {\n      prefix = false\n    } else if (\n      node.type === 'rule' &&\n      node.selector.includes(':-') &&\n      /:(-\\w+-)/.test(node.selector)\n    ) {\n      prefix = node.selector.match(/:(-\\w+-)/)[1]\n    } else if (node.type === 'atrule' && node.name[0] === '-') {\n      prefix = vendor.prefix(node.name)\n    } else {\n      prefix = this.parentPrefix(node.parent)\n    }\n\n    if (!Browsers.prefixes().includes(prefix)) {\n      prefix = false\n    }\n\n    node._autoprefixerPrefix = prefix\n\n    return node._autoprefixerPrefix\n  }\n\n  /**\n   * Clone node with prefixes\n   */\n  process(node, result) {\n    if (!this.check(node)) {\n      return undefined\n    }\n\n    let parent = this.parentPrefix(node)\n\n    let prefixes = this.prefixes.filter(\n      prefix => !parent || parent === utils.removeNote(prefix)\n    )\n\n    let added = []\n    for (let prefix of prefixes) {\n      if (this.add(node, prefix, added.concat([prefix]), result)) {\n        added.push(prefix)\n      }\n    }\n\n    return added\n  }\n}\n\nmodule.exports = Prefixer\n"
  },
  {
    "path": "lib/prefixes.js",
    "content": "let AtRule = require('./at-rule')\nlet Browsers = require('./browsers')\nlet Declaration = require('./declaration')\nlet hackAlignContent = require('./hacks/align-content')\nlet hackAlignItems = require('./hacks/align-items')\nlet hackAlignSelf = require('./hacks/align-self')\nlet hackAnimation = require('./hacks/animation')\nlet hackAppearance = require('./hacks/appearance')\nlet hackAutofill = require('./hacks/autofill')\nlet hackBackdropFilter = require('./hacks/backdrop-filter')\nlet hackBackgroundClip = require('./hacks/background-clip')\nlet hackBackgroundSize = require('./hacks/background-size')\nlet hackBlockLogical = require('./hacks/block-logical')\nlet hackBorderImage = require('./hacks/border-image')\nlet hackBorderRadius = require('./hacks/border-radius')\nlet hackBreakProps = require('./hacks/break-props')\nlet hackCrossFade = require('./hacks/cross-fade')\nlet hackDisplayFlex = require('./hacks/display-flex')\nlet hackDisplayGrid = require('./hacks/display-grid')\nlet hackFileSelectorButton = require('./hacks/file-selector-button')\nlet hackFilter = require('./hacks/filter')\nlet hackFilterValue = require('./hacks/filter-value')\nlet hackFlex = require('./hacks/flex')\nlet hackFlexBasis = require('./hacks/flex-basis')\nlet hackFlexDirection = require('./hacks/flex-direction')\nlet hackFlexFlow = require('./hacks/flex-flow')\nlet hackFlexGrow = require('./hacks/flex-grow')\nlet hackFlexShrink = require('./hacks/flex-shrink')\nlet hackFlexWrap = require('./hacks/flex-wrap')\nlet hackFullscreen = require('./hacks/fullscreen')\nlet hackGradient = require('./hacks/gradient')\nlet hackGridArea = require('./hacks/grid-area')\nlet hackGridColumnAlign = require('./hacks/grid-column-align')\nlet hackGridEnd = require('./hacks/grid-end')\nlet hackGridRowAlign = require('./hacks/grid-row-align')\nlet hackGridRowColumn = require('./hacks/grid-row-column')\nlet hackGridRowsColumns = require('./hacks/grid-rows-columns')\nlet hackGridStart = require('./hacks/grid-start')\nlet hackGridTemplate = require('./hacks/grid-template')\nlet hackGridTemplateAreas = require('./hacks/grid-template-areas')\nlet hackImageRendering = require('./hacks/image-rendering')\nlet hackImageSet = require('./hacks/image-set')\nlet hackInlineLogical = require('./hacks/inline-logical')\nlet hackIntrinsic = require('./hacks/intrinsic')\nlet hackJustifyContent = require('./hacks/justify-content')\nlet hackMaskBorder = require('./hacks/mask-border')\nlet hackMaskComposite = require('./hacks/mask-composite')\nlet hackOrder = require('./hacks/order')\nlet hackOverscrollBehavior = require('./hacks/overscroll-behavior')\nlet hackPixelated = require('./hacks/pixelated')\nlet hackPlaceSelf = require('./hacks/place-self')\nlet hackPlaceholder = require('./hacks/placeholder')\nlet hackPlaceholderShown = require('./hacks/placeholder-shown')\nlet hackPrintColorAdjust = require('./hacks/print-color-adjust')\nlet hackTextDecoration = require('./hacks/text-decoration')\nlet hackTextDecorationSkipInk = require('./hacks/text-decoration-skip-ink')\nlet hackTextEmphasisPosition = require('./hacks/text-emphasis-position')\nlet hackTransformDecl = require('./hacks/transform-decl')\nlet hackUserSelect = require('./hacks/user-select')\nlet hackWritingMode = require('./hacks/writing-mode')\nlet Processor = require('./processor')\nlet Resolution = require('./resolution')\nlet Selector = require('./selector')\nlet Supports = require('./supports')\nlet Transition = require('./transition')\nlet utils = require('./utils')\nlet Value = require('./value')\nlet vendor = require('./vendor')\n\nSelector.hack(hackAutofill)\nSelector.hack(hackFullscreen)\nSelector.hack(hackPlaceholder)\nSelector.hack(hackPlaceholderShown)\nSelector.hack(hackFileSelectorButton)\nDeclaration.hack(hackFlex)\nDeclaration.hack(hackOrder)\nDeclaration.hack(hackFilter)\nDeclaration.hack(hackGridEnd)\nDeclaration.hack(hackAnimation)\nDeclaration.hack(hackFlexFlow)\nDeclaration.hack(hackFlexGrow)\nDeclaration.hack(hackFlexWrap)\nDeclaration.hack(hackGridArea)\nDeclaration.hack(hackPlaceSelf)\nDeclaration.hack(hackGridStart)\nDeclaration.hack(hackAlignSelf)\nDeclaration.hack(hackAppearance)\nDeclaration.hack(hackFlexBasis)\nDeclaration.hack(hackMaskBorder)\nDeclaration.hack(hackMaskComposite)\nDeclaration.hack(hackAlignItems)\nDeclaration.hack(hackUserSelect)\nDeclaration.hack(hackFlexShrink)\nDeclaration.hack(hackBreakProps)\nDeclaration.hack(hackWritingMode)\nDeclaration.hack(hackBorderImage)\nDeclaration.hack(hackAlignContent)\nDeclaration.hack(hackBorderRadius)\nDeclaration.hack(hackBlockLogical)\nDeclaration.hack(hackGridTemplate)\nDeclaration.hack(hackInlineLogical)\nDeclaration.hack(hackGridRowAlign)\nDeclaration.hack(hackTransformDecl)\nDeclaration.hack(hackFlexDirection)\nDeclaration.hack(hackImageRendering)\nDeclaration.hack(hackBackdropFilter)\nDeclaration.hack(hackBackgroundClip)\nDeclaration.hack(hackTextDecoration)\nDeclaration.hack(hackJustifyContent)\nDeclaration.hack(hackBackgroundSize)\nDeclaration.hack(hackGridRowColumn)\nDeclaration.hack(hackGridRowsColumns)\nDeclaration.hack(hackGridColumnAlign)\nDeclaration.hack(hackOverscrollBehavior)\nDeclaration.hack(hackGridTemplateAreas)\nDeclaration.hack(hackPrintColorAdjust)\nDeclaration.hack(hackTextEmphasisPosition)\nDeclaration.hack(hackTextDecorationSkipInk)\nValue.hack(hackGradient)\nValue.hack(hackIntrinsic)\nValue.hack(hackPixelated)\nValue.hack(hackImageSet)\nValue.hack(hackCrossFade)\nValue.hack(hackDisplayFlex)\nValue.hack(hackDisplayGrid)\nValue.hack(hackFilterValue)\n\nlet declsCache = new Map()\n\nclass Prefixes {\n  constructor(data, browsers, options = {}) {\n    this.data = data\n    this.browsers = browsers\n    this.options = options\n    ;[this.add, this.remove] = this.preprocess(this.select(this.data))\n    this.transition = new Transition(this)\n    this.processor = new Processor(this)\n  }\n\n  /**\n   * Return clone instance to remove all prefixes\n   */\n  cleaner() {\n    if (this.cleanerCache) {\n      return this.cleanerCache\n    }\n\n    if (this.browsers.selected.length) {\n      let empty = new Browsers(this.browsers.data, [])\n      this.cleanerCache = new Prefixes(this.data, empty, this.options)\n    } else {\n      return this\n    }\n\n    return this.cleanerCache\n  }\n\n  /**\n   * Declaration loader with caching\n   */\n  decl(prop) {\n    if (!declsCache.has(prop)) {\n      declsCache.set(prop, Declaration.load(prop))\n    }\n\n    return declsCache.get(prop)\n  }\n\n  /**\n   * Group declaration by unprefixed property to check them\n   */\n  group(decl) {\n    let rule = decl.parent\n    let index = rule.index(decl)\n    let { length } = rule.nodes\n    let unprefixed = this.unprefixed(decl.prop)\n\n    let checker = (step, callback) => {\n      index += step\n      while (index >= 0 && index < length) {\n        let other = rule.nodes[index]\n        if (other.type === 'decl') {\n          if (step === -1 && other.prop === unprefixed) {\n            if (!Browsers.withPrefix(other.value)) {\n              break\n            }\n          }\n\n          if (this.unprefixed(other.prop) !== unprefixed) {\n            break\n          } else if (callback(other) === true) {\n            return true\n          }\n\n          if (step === +1 && other.prop === unprefixed) {\n            if (!Browsers.withPrefix(other.value)) {\n              break\n            }\n          }\n        }\n\n        index += step\n      }\n      return false\n    }\n\n    return {\n      down(callback) {\n        return checker(+1, callback)\n      },\n      up(callback) {\n        return checker(-1, callback)\n      }\n    }\n  }\n\n  /**\n   * Normalize prefix for remover\n   */\n  normalize(prop) {\n    return this.decl(prop).normalize(prop)\n  }\n\n  /**\n   * Return prefixed version of property\n   */\n  prefixed(prop, prefix) {\n    prop = vendor.unprefixed(prop)\n    return this.decl(prop).prefixed(prop, prefix)\n  }\n\n  /**\n   * Cache prefixes data to fast CSS processing\n   */\n  preprocess(selected) {\n    let add = {\n      '@supports': new Supports(Prefixes, this),\n      'selectors': []\n    }\n    for (let name in selected.add) {\n      let prefixes = selected.add[name]\n      if (name === '@keyframes' || name === '@viewport') {\n        add[name] = new AtRule(name, prefixes, this)\n      } else if (name === '@resolution') {\n        add[name] = new Resolution(name, prefixes, this)\n      } else if (this.data[name].selector) {\n        add.selectors.push(Selector.load(name, prefixes, this))\n      } else {\n        let props = this.data[name].props\n\n        if (props) {\n          let value = Value.load(name, prefixes, this)\n          for (let prop of props) {\n            if (!add[prop]) {\n              add[prop] = { values: [] }\n            }\n            add[prop].values.push(value)\n          }\n        } else {\n          let values = (add[name] && add[name].values) || []\n          add[name] = Declaration.load(name, prefixes, this)\n          add[name].values = values\n        }\n      }\n    }\n\n    let remove = { selectors: [] }\n    for (let name in selected.remove) {\n      let prefixes = selected.remove[name]\n      if (this.data[name].selector) {\n        let selector = Selector.load(name, prefixes)\n        for (let prefix of prefixes) {\n          remove.selectors.push(selector.old(prefix))\n        }\n      } else if (name === '@keyframes' || name === '@viewport') {\n        for (let prefix of prefixes) {\n          let prefixed = `@${prefix}${name.slice(1)}`\n          remove[prefixed] = { remove: true }\n        }\n      } else if (name === '@resolution') {\n        remove[name] = new Resolution(name, prefixes, this)\n      } else {\n        let props = this.data[name].props\n        if (props) {\n          let value = Value.load(name, [], this)\n          for (let prefix of prefixes) {\n            let old = value.old(prefix)\n            if (old) {\n              for (let prop of props) {\n                if (!remove[prop]) {\n                  remove[prop] = {}\n                }\n                if (!remove[prop].values) {\n                  remove[prop].values = []\n                }\n                remove[prop].values.push(old)\n              }\n            }\n          }\n        } else {\n          for (let p of prefixes) {\n            let olds = this.decl(name).old(name, p)\n            if (name === 'align-self') {\n              let a = add[name] && add[name].prefixes\n              if (a) {\n                if (p === '-webkit- 2009' && a.includes('-webkit-')) {\n                  continue\n                } else if (p === '-webkit-' && a.includes('-webkit- 2009')) {\n                  continue\n                }\n              }\n            }\n            for (let prefixed of olds) {\n              if (!remove[prefixed]) {\n                remove[prefixed] = {}\n              }\n              remove[prefixed].remove = true\n            }\n          }\n        }\n      }\n    }\n\n    return [add, remove]\n  }\n\n  /**\n   * Select prefixes from data, which is necessary for selected browsers\n   */\n  select(list) {\n    let selected = { add: {}, remove: {} }\n\n    for (let name in list) {\n      let data = list[name]\n      let add = data.browsers.map(i => {\n        let params = i.split(' ')\n        return {\n          browser: `${params[0]} ${params[1]}`,\n          note: params[2]\n        }\n      })\n\n      let notes = add\n        .filter(i => i.note)\n        .map(i => `${this.browsers.prefix(i.browser)} ${i.note}`)\n      notes = utils.uniq(notes)\n\n      add = add\n        .filter(i => this.browsers.isSelected(i.browser))\n        .map(i => {\n          let prefix = this.browsers.prefix(i.browser)\n          if (i.note) {\n            return `${prefix} ${i.note}`\n          } else {\n            return prefix\n          }\n        })\n      add = this.sort(utils.uniq(add))\n\n      if (this.options.flexbox === 'no-2009') {\n        add = add.filter(i => !i.includes('2009'))\n      }\n\n      let all = data.browsers.map(i => this.browsers.prefix(i))\n      if (data.mistakes) {\n        all = all.concat(data.mistakes)\n      }\n      all = all.concat(notes)\n      all = utils.uniq(all)\n\n      if (add.length) {\n        selected.add[name] = add\n        if (add.length < all.length) {\n          selected.remove[name] = all.filter(i => !add.includes(i))\n        }\n      } else {\n        selected.remove[name] = all\n      }\n    }\n\n    return selected\n  }\n\n  /**\n   * Sort vendor prefixes\n   */\n  sort(prefixes) {\n    return prefixes.sort((a, b) => {\n      let aLength = utils.removeNote(a).length\n      let bLength = utils.removeNote(b).length\n\n      if (aLength === bLength) {\n        return b.length - a.length\n      } else {\n        return bLength - aLength\n      }\n    })\n  }\n\n  /**\n   * Return unprefixed version of property\n   */\n  unprefixed(prop) {\n    let value = this.normalize(vendor.unprefixed(prop))\n    if (value === 'flex-direction') {\n      value = 'flex-flow'\n    }\n    return value\n  }\n\n  /**\n   * Return values, which must be prefixed in selected property\n   */\n  values(type, prop) {\n    let data = this[type]\n\n    let global = data['*'] && data['*'].values\n    let values = data[prop] && data[prop].values\n\n    if (global && values) {\n      return utils.uniq(global.concat(values))\n    } else {\n      return global || values || []\n    }\n  }\n}\n\nmodule.exports = Prefixes\n"
  },
  {
    "path": "lib/processor.js",
    "content": "let parser = require('postcss-value-parser')\n\nlet Value = require('./value')\nlet insertAreas = require('./hacks/grid-utils').insertAreas\n\nconst OLD_LINEAR = /(^|[^-])linear-gradient\\(\\s*(top|left|right|bottom)/i\nconst OLD_RADIAL = /(^|[^-])radial-gradient\\(\\s*\\d+(\\w*|%)\\s+\\d+(\\w*|%)\\s*,/i\nconst IGNORE_NEXT = /(!\\s*)?autoprefixer:\\s*ignore\\s+next/i\nconst GRID_REGEX = /(!\\s*)?autoprefixer\\s*grid:\\s*(on|off|(no-)?autoplace)/i\n\nconst SIZES = [\n  'width',\n  'height',\n  'min-width',\n  'max-width',\n  'min-height',\n  'max-height',\n  'inline-size',\n  'min-inline-size',\n  'max-inline-size',\n  'block-size',\n  'min-block-size',\n  'max-block-size'\n]\n\nfunction hasGridTemplate(decl) {\n  return decl.parent.some(\n    i => i.prop === 'grid-template' || i.prop === 'grid-template-areas'\n  )\n}\n\nfunction hasRowsAndColumns(decl) {\n  let hasRows = decl.parent.some(i => i.prop === 'grid-template-rows')\n  let hasColumns = decl.parent.some(i => i.prop === 'grid-template-columns')\n  return hasRows && hasColumns\n}\n\nclass Processor {\n  constructor(prefixes) {\n    this.prefixes = prefixes\n  }\n\n  /**\n   * Add necessary prefixes\n   */\n  add(css, result) {\n    // At-rules\n    let resolution = this.prefixes.add['@resolution']\n    let keyframes = this.prefixes.add['@keyframes']\n    let viewport = this.prefixes.add['@viewport']\n    let supports = this.prefixes.add['@supports']\n\n    css.walkAtRules(rule => {\n      if (rule.name === 'keyframes') {\n        if (!this.disabled(rule, result)) {\n          return keyframes && keyframes.process(rule)\n        }\n      } else if (rule.name === 'viewport') {\n        if (!this.disabled(rule, result)) {\n          return viewport && viewport.process(rule)\n        }\n      } else if (rule.name === 'supports') {\n        if (\n          this.prefixes.options.supports !== false &&\n          !this.disabled(rule, result)\n        ) {\n          return supports.process(rule)\n        }\n      } else if (rule.name === 'media' && rule.params.includes('-resolution')) {\n        if (!this.disabled(rule, result)) {\n          return resolution && resolution.process(rule)\n        }\n      }\n\n      return undefined\n    })\n\n    // Selectors\n    css.walkRules(rule => {\n      if (this.disabled(rule, result)) return undefined\n\n      return this.prefixes.add.selectors.map(selector => {\n        return selector.process(rule, result)\n      })\n    })\n\n    function insideGrid(decl) {\n      return decl.parent.nodes.some(node => {\n        if (node.type !== 'decl') return false\n        let displayGrid =\n          node.prop === 'display' && /(inline-)?grid/.test(node.value)\n        let gridTemplate = node.prop.startsWith('grid-template')\n        let gridGap = /^grid-([A-z]+-)?gap/.test(node.prop)\n        return displayGrid || gridTemplate || gridGap\n      })\n    }\n\n    let gridPrefixes =\n      this.gridStatus(css, result) &&\n      this.prefixes.add['grid-area'] &&\n      this.prefixes.add['grid-area'].prefixes\n\n    css.walkDecls(decl => {\n      if (this.disabledDecl(decl, result)) return undefined\n\n      let parent = decl.parent\n      let prop = decl.prop\n      let value = decl.value\n\n      if (prop === 'color-adjust') {\n        if (parent.every(i => i.prop !== 'print-color-adjust')) {\n          result.warn(\n            'Replace color-adjust to print-color-adjust. ' +\n              'The color-adjust shorthand is currently deprecated.',\n            { node: decl }\n          )\n        }\n      } else if (prop === 'grid-row-span') {\n        result.warn(\n          'grid-row-span is not part of final Grid Layout. Use grid-row.',\n          { node: decl }\n        )\n        return undefined\n      } else if (prop === 'grid-column-span') {\n        result.warn(\n          'grid-column-span is not part of final Grid Layout. Use grid-column.',\n          { node: decl }\n        )\n        return undefined\n      } else if (prop === 'display' && value === 'box') {\n        result.warn(\n          'You should write display: flex by final spec ' +\n            'instead of display: box',\n          { node: decl }\n        )\n        return undefined\n      } else if (prop === 'text-emphasis-position') {\n        if (value === 'under' || value === 'over') {\n          result.warn(\n            'You should use 2 values for text-emphasis-position ' +\n              'For example, `under left` instead of just `under`.',\n            { node: decl }\n          )\n        }\n      } else if (prop === 'text-decoration-skip' && value === 'ink') {\n        result.warn(\n          'Replace text-decoration-skip: ink to ' +\n            'text-decoration-skip-ink: auto, because spec had been changed',\n          { node: decl }\n        )\n      } else {\n        if (gridPrefixes && this.gridStatus(decl, result)) {\n          if (decl.value === 'subgrid') {\n            result.warn('IE does not support subgrid', { node: decl })\n          }\n          if (/^(align|justify|place)-items$/.test(prop) && insideGrid(decl)) {\n            let fixed = prop.replace('-items', '-self')\n            result.warn(\n              `IE does not support ${prop} on grid containers. ` +\n                `Try using ${fixed} on child elements instead: ` +\n                `${decl.parent.selector} > * { ${fixed}: ${decl.value} }`,\n              { node: decl }\n            )\n          } else if (\n            /^(align|justify|place)-content$/.test(prop) &&\n            insideGrid(decl)\n          ) {\n            result.warn(`IE does not support ${decl.prop} on grid containers`, {\n              node: decl\n            })\n          } else if (prop === 'display' && decl.value === 'contents') {\n            result.warn(\n              'Please do not use display: contents; ' +\n                'if you have grid setting enabled',\n              { node: decl }\n            )\n            return undefined\n          } else if (decl.prop === 'grid-gap') {\n            let status = this.gridStatus(decl, result)\n            if (\n              status === 'autoplace' &&\n              !hasRowsAndColumns(decl) &&\n              !hasGridTemplate(decl)\n            ) {\n              result.warn(\n                'grid-gap only works if grid-template(-areas) is being ' +\n                  'used or both rows and columns have been declared ' +\n                  'and cells have not been manually ' +\n                  'placed inside the explicit grid',\n                { node: decl }\n              )\n            } else if (\n              (status === true || status === 'no-autoplace') &&\n              !hasGridTemplate(decl)\n            ) {\n              result.warn(\n                'grid-gap only works if grid-template(-areas) is being used',\n                { node: decl }\n              )\n            }\n          } else if (prop === 'grid-auto-columns') {\n            result.warn('grid-auto-columns is not supported by IE', {\n              node: decl\n            })\n            return undefined\n          } else if (prop === 'grid-auto-rows') {\n            result.warn('grid-auto-rows is not supported by IE', { node: decl })\n            return undefined\n          } else if (prop === 'grid-auto-flow') {\n            let hasRows = parent.some(i => i.prop === 'grid-template-rows')\n            let hasCols = parent.some(i => i.prop === 'grid-template-columns')\n\n            if (hasGridTemplate(decl)) {\n              result.warn('grid-auto-flow is not supported by IE', {\n                node: decl\n              })\n            } else if (value.includes('dense')) {\n              result.warn('grid-auto-flow: dense is not supported by IE', {\n                node: decl\n              })\n            } else if (!hasRows && !hasCols) {\n              result.warn(\n                'grid-auto-flow works only if grid-template-rows and ' +\n                  'grid-template-columns are present in the same rule',\n                { node: decl }\n              )\n            }\n            return undefined\n          } else if (value.includes('auto-fit')) {\n            result.warn('auto-fit value is not supported by IE', {\n              node: decl,\n              word: 'auto-fit'\n            })\n            return undefined\n          } else if (value.includes('auto-fill')) {\n            result.warn('auto-fill value is not supported by IE', {\n              node: decl,\n              word: 'auto-fill'\n            })\n            return undefined\n          } else if (prop.startsWith('grid-template') && value.includes('[')) {\n            result.warn(\n              'Autoprefixer currently does not support line names. ' +\n                'Try using grid-template-areas instead.',\n              { node: decl, word: '[' }\n            )\n          }\n        }\n        if (value.includes('radial-gradient')) {\n          if (OLD_RADIAL.test(decl.value)) {\n            result.warn(\n              'Gradient has outdated direction syntax. ' +\n                'New syntax is like `closest-side at 0 0` ' +\n                'instead of `0 0, closest-side`.',\n              { node: decl }\n            )\n          } else {\n            let ast = parser(value)\n\n            for (let i of ast.nodes) {\n              if (i.type === 'function' && i.value === 'radial-gradient') {\n                for (let word of i.nodes) {\n                  if (word.type === 'word') {\n                    if (word.value === 'cover') {\n                      result.warn(\n                        'Gradient has outdated direction syntax. ' +\n                          'Replace `cover` to `farthest-corner`.',\n                        { node: decl }\n                      )\n                    } else if (word.value === 'contain') {\n                      result.warn(\n                        'Gradient has outdated direction syntax. ' +\n                          'Replace `contain` to `closest-side`.',\n                        { node: decl }\n                      )\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n        if (value.includes('linear-gradient')) {\n          if (OLD_LINEAR.test(value)) {\n            result.warn(\n              'Gradient has outdated direction syntax. ' +\n                'New syntax is like `to left` instead of `right`.',\n              { node: decl }\n            )\n          }\n        }\n      }\n\n      if (SIZES.includes(decl.prop)) {\n        if (!decl.value.includes('-fill-available')) {\n          if (decl.value.includes('fill-available')) {\n            result.warn(\n              'Replace fill-available to stretch, ' +\n                'because spec had been changed',\n              { node: decl }\n            )\n          } else if (decl.value.includes('fill')) {\n            let ast = parser(value)\n            if (ast.nodes.some(i => i.type === 'word' && i.value === 'fill')) {\n              result.warn(\n                'Replace fill to stretch, because spec had been changed',\n                { node: decl }\n              )\n            }\n          }\n        }\n      }\n\n      let prefixer\n\n      if (decl.prop === 'transition' || decl.prop === 'transition-property') {\n        // Transition\n        return this.prefixes.transition.add(decl, result)\n      } else if (decl.prop === 'align-self') {\n        // align-self flexbox or grid\n        let display = this.displayType(decl)\n        if (display !== 'grid' && this.prefixes.options.flexbox !== false) {\n          prefixer = this.prefixes.add['align-self']\n          if (prefixer && prefixer.prefixes) {\n            prefixer.process(decl)\n          }\n        }\n        if (this.gridStatus(decl, result) !== false) {\n          prefixer = this.prefixes.add['grid-row-align']\n          if (prefixer && prefixer.prefixes) {\n            return prefixer.process(decl, result)\n          }\n        }\n      } else if (decl.prop === 'justify-self') {\n        // justify-self flexbox or grid\n        if (this.gridStatus(decl, result) !== false) {\n          prefixer = this.prefixes.add['grid-column-align']\n          if (prefixer && prefixer.prefixes) {\n            return prefixer.process(decl, result)\n          }\n        }\n      } else if (decl.prop === 'place-self') {\n        prefixer = this.prefixes.add['place-self']\n        if (\n          prefixer &&\n          prefixer.prefixes &&\n          this.gridStatus(decl, result) !== false\n        ) {\n          return prefixer.process(decl, result)\n        }\n      } else {\n        // Properties\n        prefixer = this.prefixes.add[decl.prop]\n        if (prefixer && prefixer.prefixes) {\n          return prefixer.process(decl, result)\n        }\n      }\n\n      return undefined\n    })\n\n    // Insert grid-area prefixes. We need to be able to store the different\n    // rules as a data and hack API is not enough for this\n    if (this.gridStatus(css, result)) {\n      insertAreas(css, this.disabled)\n    }\n\n    // Values\n    return css.walkDecls(decl => {\n      if (this.disabledValue(decl, result)) return\n\n      let unprefixed = this.prefixes.unprefixed(decl.prop)\n      let list = this.prefixes.values('add', unprefixed)\n      if (Array.isArray(list)) {\n        for (let value of list) {\n          if (value.process) value.process(decl, result)\n        }\n      }\n      Value.save(this.prefixes, decl)\n    })\n  }\n\n  /**\n   * Check for control comment and global options\n   */\n  disabled(node, result) {\n    if (!node) return false\n\n    if (node._autoprefixerDisabled !== undefined) {\n      return node._autoprefixerDisabled\n    }\n\n    if (node.parent) {\n      let p = node.prev()\n      if (p && p.type === 'comment' && IGNORE_NEXT.test(p.text)) {\n        node._autoprefixerDisabled = true\n        node._autoprefixerSelfDisabled = true\n        return true\n      }\n    }\n\n    let value = null\n    if (node.nodes) {\n      let status\n      node.each(i => {\n        if (i.type !== 'comment') return\n        if (/(!\\s*)?autoprefixer:\\s*(off|on)/i.test(i.text)) {\n          if (typeof status !== 'undefined') {\n            result.warn(\n              'Second Autoprefixer control comment ' +\n                'was ignored. Autoprefixer applies control ' +\n                'comment to whole block, not to next rules.',\n              { node: i }\n            )\n          } else {\n            status = /on/i.test(i.text)\n          }\n        }\n      })\n\n      if (status !== undefined) {\n        value = !status\n      }\n    }\n    if (!node.nodes || value === null) {\n      if (node.parent) {\n        let isParentDisabled = this.disabled(node.parent, result)\n        if (node.parent._autoprefixerSelfDisabled === true) {\n          value = false\n        } else {\n          value = isParentDisabled\n        }\n      } else {\n        value = false\n      }\n    }\n    node._autoprefixerDisabled = value\n    return value\n  }\n\n  /**\n   * Check for grid/flexbox options.\n   */\n  disabledDecl(node, result) {\n    if (node.type === 'decl' && this.gridStatus(node, result) === false) {\n      if (node.prop.includes('grid') || node.prop === 'justify-items') {\n        return true\n      }\n    }\n    if (node.type === 'decl' && this.prefixes.options.flexbox === false) {\n      let other = ['order', 'justify-content', 'align-items', 'align-content']\n      if (node.prop.includes('flex') || other.includes(node.prop)) {\n        return true\n      }\n    }\n\n    return this.disabled(node, result)\n  }\n\n  /**\n   * Check for grid/flexbox options.\n   */\n  disabledValue(node, result) {\n    if (this.gridStatus(node, result) === false && node.type === 'decl') {\n      if (node.prop === 'display' && node.value.includes('grid')) {\n        return true\n      }\n    }\n    if (this.prefixes.options.flexbox === false && node.type === 'decl') {\n      if (node.prop === 'display' && node.value.includes('flex')) {\n        return true\n      }\n    }\n    if (node.type === 'decl' && node.prop === 'content') {\n      return true\n    }\n\n    return this.disabled(node, result)\n  }\n\n  /**\n   * Is it flebox or grid rule\n   */\n  displayType(decl) {\n    for (let i of decl.parent.nodes) {\n      if (i.prop !== 'display') {\n        continue\n      }\n\n      if (i.value.includes('flex')) {\n        return 'flex'\n      }\n\n      if (i.value.includes('grid')) {\n        return 'grid'\n      }\n    }\n\n    return false\n  }\n\n  /**\n   * Set grid option via control comment\n   */\n  gridStatus(node, result) {\n    if (!node) return false\n\n    if (node._autoprefixerGridStatus !== undefined) {\n      return node._autoprefixerGridStatus\n    }\n\n    let value = null\n    if (node.nodes) {\n      let status\n      node.each(i => {\n        if (i.type !== 'comment') return\n        if (GRID_REGEX.test(i.text)) {\n          let hasAutoplace = /:\\s*autoplace/i.test(i.text)\n          let noAutoplace = /no-autoplace/i.test(i.text)\n          if (typeof status !== 'undefined') {\n            result.warn(\n              'Second Autoprefixer grid control comment was ' +\n                'ignored. Autoprefixer applies control comments to the whole ' +\n                'block, not to the next rules.',\n              { node: i }\n            )\n          } else if (hasAutoplace) {\n            status = 'autoplace'\n          } else if (noAutoplace) {\n            status = true\n          } else {\n            status = /on/i.test(i.text)\n          }\n        }\n      })\n\n      if (status !== undefined) {\n        value = status\n      }\n    }\n\n    if (node.type === 'atrule' && node.name === 'supports') {\n      let params = node.params\n      if (params.includes('grid') && params.includes('auto')) {\n        value = false\n      }\n    }\n\n    if (!node.nodes || value === null) {\n      if (node.parent) {\n        let isParentGrid = this.gridStatus(node.parent, result)\n        if (node.parent._autoprefixerSelfDisabled === true) {\n          value = false\n        } else {\n          value = isParentGrid\n        }\n      } else if (typeof this.prefixes.options.grid !== 'undefined') {\n        value = this.prefixes.options.grid\n      } else if (typeof process.env.AUTOPREFIXER_GRID !== 'undefined') {\n        if (process.env.AUTOPREFIXER_GRID === 'autoplace') {\n          value = 'autoplace'\n        } else {\n          value = true\n        }\n      } else {\n        value = false\n      }\n    }\n\n    node._autoprefixerGridStatus = value\n    return value\n  }\n\n  /**\n   * Normalize spaces in cascade declaration group\n   */\n  reduceSpaces(decl) {\n    let stop = false\n    this.prefixes.group(decl).up(() => {\n      stop = true\n      return true\n    })\n    if (stop) {\n      return\n    }\n\n    let parts = decl.raw('before').split('\\n')\n    let prevMin = parts[parts.length - 1].length\n    let diff = false\n\n    this.prefixes.group(decl).down(other => {\n      parts = other.raw('before').split('\\n')\n      let last = parts.length - 1\n\n      if (parts[last].length > prevMin) {\n        if (diff === false) {\n          diff = parts[last].length - prevMin\n        }\n\n        parts[last] = parts[last].slice(0, -diff)\n        other.raws.before = parts.join('\\n')\n      }\n    })\n  }\n\n  /**\n   * Remove unnecessary pefixes\n   */\n  remove(css, result) {\n    // At-rules\n    let resolution = this.prefixes.remove['@resolution']\n\n    css.walkAtRules((rule, i) => {\n      if (this.prefixes.remove[`@${rule.name}`]) {\n        if (!this.disabled(rule, result)) {\n          rule.parent.removeChild(i)\n        }\n      } else if (\n        rule.name === 'media' &&\n        rule.params.includes('-resolution') &&\n        resolution\n      ) {\n        resolution.clean(rule)\n      }\n    })\n\n    // Selectors\n    css.walkRules((rule, i) => {\n      if (this.disabled(rule, result)) return\n\n      for (let checker of this.prefixes.remove.selectors) {\n        if (checker.check(rule)) {\n          rule.parent.removeChild(i)\n          return\n        }\n      }\n    })\n\n    return css.walkDecls((decl, i) => {\n      if (this.disabled(decl, result)) return\n\n      let rule = decl.parent\n      let unprefixed = this.prefixes.unprefixed(decl.prop)\n\n      // Transition\n      if (decl.prop === 'transition' || decl.prop === 'transition-property') {\n        this.prefixes.transition.remove(decl)\n      }\n\n      // Properties\n      if (\n        this.prefixes.remove[decl.prop] &&\n        this.prefixes.remove[decl.prop].remove\n      ) {\n        let notHack = this.prefixes.group(decl).down(other => {\n          return this.prefixes.normalize(other.prop) === unprefixed\n        })\n\n        if (unprefixed === 'flex-flow') {\n          notHack = true\n        }\n\n        if (decl.prop === '-webkit-box-orient') {\n          let hacks = { 'flex-direction': true, 'flex-flow': true }\n          if (!decl.parent.some(j => hacks[j.prop])) return\n        }\n\n        if (notHack && !this.withHackValue(decl)) {\n          if (decl.raw('before').includes('\\n')) {\n            this.reduceSpaces(decl)\n          }\n          rule.removeChild(i)\n          return\n        }\n      }\n\n      // Values\n      for (let checker of this.prefixes.values('remove', unprefixed)) {\n        if (!checker.check) continue\n        if (!checker.check(decl.value)) continue\n\n        unprefixed = checker.unprefixed\n        let notHack = this.prefixes.group(decl).down(other => {\n          return other.value.includes(unprefixed)\n        })\n\n        if (notHack) {\n          rule.removeChild(i)\n          return\n        }\n      }\n    })\n  }\n\n  /**\n   * Some rare old values, which is not in standard\n   */\n  withHackValue(decl) {\n    return (\n      (decl.prop === '-webkit-background-clip' && decl.value === 'text') ||\n      // Do not remove -webkit-box-orient when -webkit-line-clamp is present.\n      // https://github.com/postcss/autoprefixer/issues/1510\n      (decl.prop === '-webkit-box-orient' &&\n        decl.parent.some(d => d.prop === '-webkit-line-clamp'))\n    )\n  }\n}\n\nmodule.exports = Processor\n"
  },
  {
    "path": "lib/resolution.js",
    "content": "let FractionJs = require('fraction.js')\n\nlet Prefixer = require('./prefixer')\nlet utils = require('./utils')\n\nconst REGEXP = /(min|max)-resolution\\s*:\\s*\\d*\\.?\\d+(dppx|dpcm|dpi|x)/gi\nconst SPLIT = /(min|max)-resolution(\\s*:\\s*)(\\d*\\.?\\d+)(dppx|dpcm|dpi|x)/i\n\nclass Resolution extends Prefixer {\n  /**\n   * Remove prefixed queries\n   */\n  clean(rule) {\n    if (!this.bad) {\n      this.bad = []\n      for (let prefix of this.prefixes) {\n        this.bad.push(this.prefixName(prefix, 'min'))\n        this.bad.push(this.prefixName(prefix, 'max'))\n      }\n    }\n\n    rule.params = utils.editList(rule.params, queries => {\n      return queries.filter(query => this.bad.every(i => !query.includes(i)))\n    })\n  }\n\n  /**\n   * Return prefixed query name\n   */\n  prefixName(prefix, name) {\n    if (prefix === '-moz-') {\n      return name + '--moz-device-pixel-ratio'\n    } else {\n      return prefix + name + '-device-pixel-ratio'\n    }\n  }\n\n  /**\n   * Return prefixed query\n   */\n  prefixQuery(prefix, name, colon, value, units) {\n    value = new FractionJs(value)\n\n    // 1dpcm = 2.54dpi\n    // 1dppx = 96dpi\n    if (units === 'dpi') {\n      value = value.div(96)\n    } else if (units === 'dpcm') {\n      value = value.mul(2.54).div(96)\n    }\n    value = value.simplify()\n\n    if (prefix === '-o-') {\n      value = value.n + '/' + value.d\n    }\n    return this.prefixName(prefix, name) + colon + value\n  }\n\n  /**\n   * Add prefixed queries\n   */\n  process(rule) {\n    let parent = this.parentPrefix(rule)\n    let prefixes = parent ? [parent] : this.prefixes\n\n    rule.params = utils.editList(rule.params, (origin, prefixed) => {\n      for (let query of origin) {\n        if (\n          !query.includes('min-resolution') &&\n          !query.includes('max-resolution')\n        ) {\n          prefixed.push(query)\n          continue\n        }\n\n        for (let prefix of prefixes) {\n          let processed = query.replace(REGEXP, str => {\n            let parts = str.match(SPLIT)\n            return this.prefixQuery(\n              prefix,\n              parts[1],\n              parts[2],\n              parts[3],\n              parts[4]\n            )\n          })\n          prefixed.push(processed)\n        }\n        prefixed.push(query)\n      }\n\n      return utils.uniq(prefixed)\n    })\n  }\n}\n\nmodule.exports = Resolution\n"
  },
  {
    "path": "lib/selector.js",
    "content": "let { list } = require('postcss')\n\nlet Browsers = require('./browsers')\nlet OldSelector = require('./old-selector')\nlet Prefixer = require('./prefixer')\nlet utils = require('./utils')\n\nclass Selector extends Prefixer {\n  constructor(name, prefixes, all) {\n    super(name, prefixes, all)\n    this.regexpCache = new Map()\n  }\n\n  /**\n   * Clone and add prefixes for at-rule\n   */\n  add(rule, prefix) {\n    let prefixeds = this.prefixeds(rule)\n\n    if (this.already(rule, prefixeds, prefix)) {\n      return\n    }\n\n    let cloned = this.clone(rule, { selector: prefixeds[this.name][prefix] })\n    rule.parent.insertBefore(rule, cloned)\n  }\n\n  /**\n   * Is rule already prefixed before\n   */\n  already(rule, prefixeds, prefix) {\n    let index = rule.parent.index(rule) - 1\n\n    while (index >= 0) {\n      let before = rule.parent.nodes[index]\n\n      if (before.type !== 'rule') {\n        return false\n      }\n\n      let some = false\n      for (let key in prefixeds[this.name]) {\n        let prefixed = prefixeds[this.name][key]\n        if (before.selector === prefixed) {\n          if (prefix === key) {\n            return true\n          } else {\n            some = true\n            break\n          }\n        }\n      }\n      if (!some) {\n        return false\n      }\n\n      index -= 1\n    }\n\n    return false\n  }\n\n  /**\n   * Is rule selectors need to be prefixed\n   */\n  check(rule) {\n    if (rule.selector.includes(this.name)) {\n      return !!rule.selector.match(this.regexp())\n    }\n\n    return false\n  }\n\n  /**\n   * Return function to fast find prefixed selector\n   */\n  old(prefix) {\n    return new OldSelector(this, prefix)\n  }\n\n  /**\n   * All possible prefixes\n   */\n  possible() {\n    return Browsers.prefixes()\n  }\n\n  /**\n   * Return prefixed version of selector\n   */\n  prefixed(prefix) {\n    return this.name.replace(/^(\\W*)/, `$1${prefix}`)\n  }\n\n  /**\n   * Return all possible selector prefixes\n   */\n  prefixeds(rule) {\n    if (rule._autoprefixerPrefixeds) {\n      if (rule._autoprefixerPrefixeds[this.name]) {\n        return rule._autoprefixerPrefixeds\n      }\n    } else {\n      rule._autoprefixerPrefixeds = {}\n    }\n\n    let prefixeds = {}\n    if (rule.selector.includes(',')) {\n      let ruleParts = list.comma(rule.selector)\n      let toProcess = ruleParts.filter(el => el.includes(this.name))\n\n      for (let prefix of this.possible()) {\n        prefixeds[prefix] = toProcess\n          .map(el => this.replace(el, prefix))\n          .join(', ')\n      }\n    } else {\n      for (let prefix of this.possible()) {\n        prefixeds[prefix] = this.replace(rule.selector, prefix)\n      }\n    }\n\n    rule._autoprefixerPrefixeds[this.name] = prefixeds\n    return rule._autoprefixerPrefixeds\n  }\n\n  /**\n   * Lazy loadRegExp for name\n   */\n  regexp(prefix) {\n    if (!this.regexpCache.has(prefix)) {\n      let name = prefix ? this.prefixed(prefix) : this.name\n      this.regexpCache.set(\n        prefix,\n        new RegExp(`(^|[^:\"'=])${utils.escapeRegexp(name)}`, 'gi')\n      )\n    }\n\n    return this.regexpCache.get(prefix)\n  }\n\n  /**\n   * Replace selectors by prefixed one\n   */\n  replace(selector, prefix) {\n    return selector.replace(this.regexp(), `$1${this.prefixed(prefix)}`)\n  }\n}\n\nmodule.exports = Selector\n"
  },
  {
    "path": "lib/supports.js",
    "content": "let featureQueries = require('caniuse-lite/data/features/css-featurequeries.js')\nlet feature = require('caniuse-lite/dist/unpacker/feature')\nlet { parse } = require('postcss')\n\nlet brackets = require('./brackets')\nlet Browsers = require('./browsers')\nlet utils = require('./utils')\nlet Value = require('./value')\n\nlet data = feature(featureQueries)\n\nlet supported = []\nfor (let browser in data.stats) {\n  let versions = data.stats[browser]\n  for (let version in versions) {\n    let support = versions[version]\n    if (/y/.test(support)) {\n      supported.push(browser + ' ' + version)\n    }\n  }\n}\n\nclass Supports {\n  constructor(Prefixes, all) {\n    this.Prefixes = Prefixes\n    this.all = all\n  }\n\n  /**\n   * Add prefixes\n   */\n  add(nodes, all) {\n    return nodes.map(i => {\n      if (this.isProp(i)) {\n        let prefixed = this.prefixed(i[0])\n        if (prefixed.length > 1) {\n          return this.convert(prefixed)\n        }\n\n        return i\n      }\n\n      if (typeof i === 'object') {\n        return this.add(i, all)\n      }\n\n      return i\n    })\n  }\n\n  /**\n   * Clean brackets with one child\n   */\n  cleanBrackets(nodes) {\n    return nodes.map(i => {\n      if (typeof i !== 'object') {\n        return i\n      }\n\n      if (i.length === 1 && typeof i[0] === 'object') {\n        return this.cleanBrackets(i[0])\n      }\n\n      return this.cleanBrackets(i)\n    })\n  }\n\n  /**\n   * Add \" or \" between properties and convert it to brackets format\n   */\n  convert(progress) {\n    let result = ['']\n    for (let i of progress) {\n      result.push([`${i.prop}: ${i.value}`])\n      result.push(' or ')\n    }\n    result[result.length - 1] = ''\n    return result\n  }\n\n  /**\n   * Check global options\n   */\n  disabled(node) {\n    if (!this.all.options.grid) {\n      if (node.prop === 'display' && node.value.includes('grid')) {\n        return true\n      }\n      if (node.prop.includes('grid') || node.prop === 'justify-items') {\n        return true\n      }\n    }\n\n    if (this.all.options.flexbox === false) {\n      if (node.prop === 'display' && node.value.includes('flex')) {\n        return true\n      }\n      let other = ['order', 'justify-content', 'align-items', 'align-content']\n      if (node.prop.includes('flex') || other.includes(node.prop)) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  /**\n   * Return true if prefixed property has no unprefixed\n   */\n  isHack(all, unprefixed) {\n    let check = new RegExp(`(\\\\(|\\\\s)${utils.escapeRegexp(unprefixed)}:`)\n    return !check.test(all)\n  }\n\n  /**\n   * Return true if brackets node is \"not\" word\n   */\n  isNot(node) {\n    return typeof node === 'string' && /not\\s*/i.test(node)\n  }\n\n  /**\n   * Return true if brackets node is \"or\" word\n   */\n  isOr(node) {\n    return typeof node === 'string' && /\\s*or\\s*/i.test(node)\n  }\n\n  /**\n   * Return true if brackets node is (prop: value)\n   */\n  isProp(node) {\n    return (\n      typeof node === 'object' &&\n      node.length === 1 &&\n      typeof node[0] === 'string'\n    )\n  }\n\n  /**\n   * Compress value functions into a string nodes\n   */\n  normalize(nodes) {\n    if (typeof nodes !== 'object') {\n      return nodes\n    }\n\n    nodes = nodes.filter(i => i !== '')\n\n    if (typeof nodes[0] === 'string') {\n      let firstNode = nodes[0].trim()\n\n      if (\n        firstNode.includes(':') ||\n        firstNode === 'selector' ||\n        firstNode === 'not selector'\n      ) {\n        return [brackets.stringify(nodes)]\n      }\n    }\n    return nodes.map(i => this.normalize(i))\n  }\n\n  /**\n   * Parse string into declaration property and value\n   */\n  parse(str) {\n    let parts = str.split(':')\n    let prop = parts[0]\n    let value = parts[1]\n    if (!value) value = ''\n    return [prop.trim(), value.trim()]\n  }\n\n  /**\n   * Return array of Declaration with all necessary prefixes\n   */\n  prefixed(str) {\n    let rule = this.virtual(str)\n    if (this.disabled(rule.first)) {\n      return rule.nodes\n    }\n\n    let result = { warn: () => null }\n\n    let prefixer = this.prefixer().add[rule.first.prop]\n    prefixer && prefixer.process && prefixer.process(rule.first, result)\n\n    for (let decl of rule.nodes) {\n      for (let value of this.prefixer().values('add', rule.first.prop)) {\n        value.process(decl)\n      }\n      Value.save(this.all, decl)\n    }\n\n    return rule.nodes\n  }\n\n  /**\n   * Return prefixer only with @supports supported browsers\n   */\n  prefixer() {\n    if (this.prefixerCache) {\n      return this.prefixerCache\n    }\n\n    let filtered = this.all.browsers.selected.filter(i => {\n      return supported.includes(i)\n    })\n\n    let browsers = new Browsers(\n      this.all.browsers.data,\n      filtered,\n      this.all.options\n    )\n    this.prefixerCache = new this.Prefixes(\n      this.all.data,\n      browsers,\n      this.all.options\n    )\n    return this.prefixerCache\n  }\n\n  /**\n   * Add prefixed declaration\n   */\n  process(rule) {\n    let ast = brackets.parse(rule.params)\n    ast = this.normalize(ast)\n    ast = this.remove(ast, rule.params)\n    ast = this.add(ast, rule.params)\n    ast = this.cleanBrackets(ast)\n    rule.params = brackets.stringify(ast)\n  }\n\n  /**\n   * Remove all unnecessary prefixes\n   */\n  remove(nodes, all) {\n    let i = 0\n    while (i < nodes.length) {\n      if (\n        !this.isNot(nodes[i - 1]) &&\n        this.isProp(nodes[i]) &&\n        this.isOr(nodes[i + 1])\n      ) {\n        if (this.toRemove(nodes[i][0], all)) {\n          nodes.splice(i, 2)\n          continue\n        }\n\n        i += 2\n        continue\n      }\n\n      if (typeof nodes[i] === 'object') {\n        nodes[i] = this.remove(nodes[i], all)\n      }\n\n      i += 1\n    }\n    return nodes\n  }\n\n  /**\n   * Return true if we need to remove node\n   */\n  toRemove(str, all) {\n    let [prop, value] = this.parse(str)\n    let unprefixed = this.all.unprefixed(prop)\n\n    let cleaner = this.all.cleaner()\n\n    if (\n      cleaner.remove[prop] &&\n      cleaner.remove[prop].remove &&\n      !this.isHack(all, unprefixed)\n    ) {\n      return true\n    }\n\n    for (let checker of cleaner.values('remove', unprefixed)) {\n      if (checker.check(value)) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  /**\n   * Create virtual rule to process it by prefixer\n   */\n  virtual(str) {\n    let [prop, value] = this.parse(str)\n    let rule = parse('a{}').first\n    rule.append({ prop, raws: { before: '' }, value })\n    return rule\n  }\n}\n\nmodule.exports = Supports\n"
  },
  {
    "path": "lib/transition.js",
    "content": "let { list } = require('postcss')\nlet parser = require('postcss-value-parser')\n\nlet Browsers = require('./browsers')\nlet vendor = require('./vendor')\n\nclass Transition {\n  constructor(prefixes) {\n    this.props = ['transition', 'transition-property']\n    this.prefixes = prefixes\n  }\n\n  /**\n   * Process transition and add prefixes for all necessary properties\n   */\n  add(decl, result) {\n    let prefix, prop\n    let add = this.prefixes.add[decl.prop]\n    let vendorPrefixes = this.ruleVendorPrefixes(decl)\n    let declPrefixes = vendorPrefixes || (add && add.prefixes) || []\n\n    let params = this.parse(decl.value)\n    let names = params.map(i => this.findProp(i))\n    let added = []\n\n    if (names.some(i => i[0] === '-')) {\n      return\n    }\n\n    for (let param of params) {\n      prop = this.findProp(param)\n      if (prop[0] === '-') continue\n\n      let prefixer = this.prefixes.add[prop]\n      if (!prefixer || !prefixer.prefixes) continue\n\n      for (prefix of prefixer.prefixes) {\n        if (vendorPrefixes && !vendorPrefixes.some(p => prefix.includes(p))) {\n          continue\n        }\n\n        let prefixed = this.prefixes.prefixed(prop, prefix)\n        if (prefixed !== '-ms-transform' && !names.includes(prefixed)) {\n          if (!this.disabled(prop, prefix)) {\n            added.push(this.clone(prop, prefixed, param))\n          }\n        }\n      }\n    }\n\n    params = params.concat(added)\n    let value = this.stringify(params)\n\n    let webkitClean = this.stringify(\n      this.cleanFromUnprefixed(params, '-webkit-')\n    )\n    if (declPrefixes.includes('-webkit-')) {\n      this.cloneBefore(decl, `-webkit-${decl.prop}`, webkitClean)\n    }\n    this.cloneBefore(decl, decl.prop, webkitClean)\n    if (declPrefixes.includes('-o-')) {\n      let operaClean = this.stringify(this.cleanFromUnprefixed(params, '-o-'))\n      this.cloneBefore(decl, `-o-${decl.prop}`, operaClean)\n    }\n\n    for (prefix of declPrefixes) {\n      if (prefix !== '-webkit-' && prefix !== '-o-') {\n        let prefixValue = this.stringify(\n          this.cleanOtherPrefixes(params, prefix)\n        )\n        this.cloneBefore(decl, prefix + decl.prop, prefixValue)\n      }\n    }\n\n    if (value !== decl.value && !this.already(decl, decl.prop, value)) {\n      this.checkForWarning(result, decl)\n      decl.cloneBefore()\n      decl.value = value\n    }\n  }\n\n  /**\n   * Does we already have this declaration\n   */\n  already(decl, prop, value) {\n    return decl.parent.some(i => i.prop === prop && i.value === value)\n  }\n\n  /**\n   * Show transition-property warning\n   */\n  checkForWarning(result, decl) {\n    if (decl.prop !== 'transition-property') {\n      return\n    }\n\n    let isPrefixed = false\n    let hasAssociatedProp = false\n\n    decl.parent.each(i => {\n      if (i.type !== 'decl') {\n        return undefined\n      }\n      if (i.prop.indexOf('transition-') !== 0) {\n        return undefined\n      }\n      let values = list.comma(i.value)\n      // check if current Rule's transition-property comma separated value list needs prefixes\n      if (i.prop === 'transition-property') {\n        values.forEach(value => {\n          let lookup = this.prefixes.add[value]\n          if (lookup && lookup.prefixes && lookup.prefixes.length > 0) {\n            isPrefixed = true\n          }\n        })\n        return undefined\n      }\n      // check if another transition-* prop in current Rule has comma separated value list\n      hasAssociatedProp = hasAssociatedProp || values.length > 1\n      return false\n    })\n\n    if (isPrefixed && hasAssociatedProp) {\n      decl.warn(\n        result,\n        'Replace transition-property to transition, ' +\n          'because Autoprefixer could not support ' +\n          'any cases of transition-property ' +\n          'and other transition-*'\n      )\n    }\n  }\n\n  /**\n   * Remove all non-webkit prefixes and unprefixed params if we have prefixed\n   */\n  cleanFromUnprefixed(params, prefix) {\n    let remove = params\n      .map(i => this.findProp(i))\n      .filter(i => i.slice(0, prefix.length) === prefix)\n      .map(i => this.prefixes.unprefixed(i))\n\n    let result = []\n    for (let param of params) {\n      let prop = this.findProp(param)\n      let p = vendor.prefix(prop)\n      if (!remove.includes(prop) && (p === prefix || p === '')) {\n        result.push(param)\n      }\n    }\n    return result\n  }\n\n  cleanOtherPrefixes(params, prefix) {\n    return params.filter(param => {\n      let current = vendor.prefix(this.findProp(param))\n      return current === '' || current === prefix\n    })\n  }\n\n  /**\n   * Return new param array with different name\n   */\n  clone(origin, name, param) {\n    let result = []\n    let changed = false\n    for (let i of param) {\n      if (!changed && i.type === 'word' && i.value === origin) {\n        result.push({ type: 'word', value: name })\n        changed = true\n      } else {\n        result.push(i)\n      }\n    }\n    return result\n  }\n\n  /**\n   * Add declaration if it is not exist\n   */\n  cloneBefore(decl, prop, value) {\n    if (!this.already(decl, prop, value)) {\n      decl.cloneBefore({ prop, value })\n    }\n  }\n\n  /**\n   * Check property for disabled by option\n   */\n  disabled(prop, prefix) {\n    let other = ['order', 'justify-content', 'align-self', 'align-content']\n    if (prop.includes('flex') || other.includes(prop)) {\n      if (this.prefixes.options.flexbox === false) {\n        return true\n      }\n\n      if (this.prefixes.options.flexbox === 'no-2009') {\n        return prefix.includes('2009')\n      }\n    }\n    return undefined\n  }\n\n  /**\n   * Find or create separator\n   */\n  div(params) {\n    for (let param of params) {\n      for (let node of param) {\n        if (node.type === 'div' && node.value === ',') {\n          return node\n        }\n      }\n    }\n    return { after: ' ', type: 'div', value: ',' }\n  }\n\n  /**\n   * Find property name\n   */\n  findProp(param) {\n    let prop = param[0].value\n    if (/^\\d/.test(prop)) {\n      for (let [i, token] of param.entries()) {\n        if (i !== 0 && token.type === 'word') {\n          return token.value\n        }\n      }\n    }\n    return prop\n  }\n\n  /**\n   * Parse properties list to array\n   */\n  parse(value) {\n    let ast = parser(value)\n    let result = []\n    let param = []\n    for (let node of ast.nodes) {\n      param.push(node)\n      if (node.type === 'div' && node.value === ',') {\n        result.push(param)\n        param = []\n      }\n    }\n    result.push(param)\n    return result.filter(i => i.length > 0)\n  }\n\n  /**\n   * Process transition and remove all unnecessary properties\n   */\n  remove(decl) {\n    let params = this.parse(decl.value)\n    params = params.filter(i => {\n      let prop = this.prefixes.remove[this.findProp(i)]\n      return !prop || !prop.remove\n    })\n    let value = this.stringify(params)\n\n    if (decl.value === value) {\n      return\n    }\n\n    if (params.length === 0) {\n      decl.remove()\n      return\n    }\n\n    let double = decl.parent.some(i => {\n      return i.prop === decl.prop && i.value === value\n    })\n    let smaller = decl.parent.some(i => {\n      return i !== decl && i.prop === decl.prop && i.value.length > value.length\n    })\n\n    if (double || smaller) {\n      decl.remove()\n      return\n    }\n\n    decl.value = value\n  }\n\n  /**\n   * Check if transition prop is inside vendor specific rule\n   */\n  ruleVendorPrefixes(decl) {\n    let { parent } = decl\n\n    if (parent.type !== 'rule') {\n      return false\n    } else if (!parent.selector.includes(':-')) {\n      return false\n    }\n\n    let selectors = Browsers.prefixes().filter(s =>\n      parent.selector.includes(':' + s)\n    )\n\n    return selectors.length > 0 ? selectors : false\n  }\n\n  /**\n   * Return properties string from array\n   */\n  stringify(params) {\n    if (params.length === 0) {\n      return ''\n    }\n    let nodes = []\n    for (let param of params) {\n      if (param[param.length - 1].type !== 'div') {\n        param.push(this.div(params))\n      }\n      nodes.push(...param)\n    }\n    if (nodes[0].type === 'div') {\n      nodes = nodes.slice(1)\n    }\n    if (nodes[nodes.length - 1].type === 'div') {\n      nodes = nodes.slice(0, +-2 + 1 || undefined)\n    }\n    return parser.stringify({ nodes })\n  }\n}\n\nmodule.exports = Transition\n"
  },
  {
    "path": "lib/utils.js",
    "content": "let { list } = require('postcss')\n\n/**\n * Throw special error, to tell beniary,\n * that this error is from Autoprefixer.\n */\nmodule.exports.error = function (text) {\n  let err = new Error(text)\n  err.autoprefixer = true\n  throw err\n}\n\n/**\n * Return array, that doesn’t contain duplicates.\n */\nmodule.exports.uniq = function (array) {\n  return [...new Set(array)]\n}\n\n/**\n * Return \"-webkit-\" on \"-webkit- old\"\n */\nmodule.exports.removeNote = function (string) {\n  if (!string.includes(' ')) {\n    return string\n  }\n\n  return string.split(' ')[0]\n}\n\n/**\n * Escape RegExp symbols\n */\nmodule.exports.escapeRegexp = function (string) {\n  return string.replace(/[$()*+-.?[\\\\\\]^{|}]/g, '\\\\$&')\n}\n\n/**\n * Return regexp to check, that CSS string contain word\n */\nmodule.exports.regexp = function (word, escape = true) {\n  if (escape) {\n    word = this.escapeRegexp(word)\n  }\n  return new RegExp(`(^|[\\\\s,(])(${word}($|[\\\\s(,]))`, 'gi')\n}\n\n/**\n * Change comma list\n */\nmodule.exports.editList = function (value, callback) {\n  let origin = list.comma(value)\n  let changed = callback(origin, [])\n\n  if (origin === changed) {\n    return value\n  }\n\n  let join = value.match(/,\\s*/)\n  join = join ? join[0] : ', '\n  return changed.join(join)\n}\n\n/**\n * Split the selector into parts.\n * It returns 3 level deep array because selectors can be comma\n * separated (1), space separated (2), and combined (3)\n * @param {String} selector selector string\n * @return {Array<Array<Array>>} 3 level deep array of split selector\n * @see utils.test.js for examples\n */\nmodule.exports.splitSelector = function (selector) {\n  return list.comma(selector).map(i => {\n    return list.space(i).map(k => {\n      return k.split(/(?=\\.|#)/g)\n    })\n  })\n}\n\n/**\n * Return true if a given value only contains numbers.\n * @param {*} value\n * @returns {boolean}\n */\nmodule.exports.isPureNumber = function (value) {\n  if (typeof value === 'number') {\n    return true\n  }\n  if (typeof value === 'string') {\n    return /^[0-9]+$/.test(value)\n  }\n  return false\n}\n"
  },
  {
    "path": "lib/value.js",
    "content": "let OldValue = require('./old-value')\nlet Prefixer = require('./prefixer')\nlet utils = require('./utils')\nlet vendor = require('./vendor')\n\nclass Value extends Prefixer {\n  /**\n   * Clone decl for each prefixed values\n   */\n  static save(prefixes, decl) {\n    let prop = decl.prop\n    let result = []\n\n    for (let prefix in decl._autoprefixerValues) {\n      let value = decl._autoprefixerValues[prefix]\n\n      if (value === decl.value) {\n        continue\n      }\n\n      let item\n      let propPrefix = vendor.prefix(prop)\n\n      if (propPrefix === '-pie-') {\n        continue\n      }\n\n      if (propPrefix === prefix) {\n        item = decl.value = value\n        result.push(item)\n        continue\n      }\n\n      let prefixed = prefixes.prefixed(prop, prefix)\n      let rule = decl.parent\n\n      if (!rule.every(i => i.prop !== prefixed)) {\n        result.push(item)\n        continue\n      }\n\n      let trimmed = value.replace(/\\s+/, ' ')\n      let already = rule.some(\n        i => i.prop === decl.prop && i.value.replace(/\\s+/, ' ') === trimmed\n      )\n\n      if (already) {\n        result.push(item)\n        continue\n      }\n\n      let cloned = this.clone(decl, { value })\n      item = decl.parent.insertBefore(decl, cloned)\n\n      result.push(item)\n    }\n\n    return result\n  }\n\n  /**\n   * Save values with next prefixed token\n   */\n  add(decl, prefix) {\n    if (!decl._autoprefixerValues) {\n      decl._autoprefixerValues = {}\n    }\n    let value = decl._autoprefixerValues[prefix] || this.value(decl)\n\n    let before\n    do {\n      before = value\n      value = this.replace(value, prefix)\n      if (value === false) return\n    } while (value !== before)\n\n    decl._autoprefixerValues[prefix] = value\n  }\n\n  /**\n   * Is declaration need to be prefixed\n   */\n  check(decl) {\n    let value = decl.value\n    if (!value.includes(this.name)) {\n      return false\n    }\n\n    return !!value.match(this.regexp())\n  }\n\n  /**\n   * Return function to fast find prefixed value\n   */\n  old(prefix) {\n    return new OldValue(this.name, prefix + this.name)\n  }\n\n  /**\n   * Lazy regexp loading\n   */\n  regexp() {\n    return this.regexpCache || (this.regexpCache = utils.regexp(this.name))\n  }\n\n  /**\n   * Add prefix to values in string\n   */\n  replace(string, prefix) {\n    return string.replace(this.regexp(), `$1${prefix}$2`)\n  }\n\n  /**\n   * Get value with comments if it was not changed\n   */\n  value(decl) {\n    if (decl.raws.value && decl.raws.value.value === decl.value) {\n      return decl.raws.value.raw\n    } else {\n      return decl.value\n    }\n  }\n}\n\nmodule.exports = Value\n"
  },
  {
    "path": "lib/vendor.js",
    "content": "module.exports = {\n  prefix(prop) {\n    let match = prop.match(/^(-\\w+-)/)\n    if (match) {\n      return match[0]\n    }\n\n    return ''\n  },\n\n  unprefixed(prop) {\n    return prop.replace(/^-\\w+-/, '')\n  }\n}\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"autoprefixer\",\n  \"version\": \"10.4.27\",\n  \"description\": \"Parse CSS and add vendor prefixes to CSS rules using values from the Can I Use website\",\n  \"engines\": {\n    \"node\": \"^10 || ^12 || >=14\"\n  },\n  \"keywords\": [\n    \"autoprefixer\",\n    \"css\",\n    \"prefix\",\n    \"postcss\",\n    \"postcss-plugin\"\n  ],\n  \"scripts\": {\n    \"unit\": \"uvu . '\\\\.test\\\\.js$'\",\n    \"test:coverage\": \"c8 node node_modules/uvu/bin.js . '\\\\.test\\\\.js$'\",\n    \"test:lint\": \"eslint . bin/*\",\n    \"test:size\": \"size-limit\",\n    \"test\": \"pnpm run /^test:/\"\n  },\n  \"main\": \"lib/autoprefixer.js\",\n  \"bin\": \"bin/autoprefixer\",\n  \"types\": \"lib/autoprefixer.d.ts\",\n  \"funding\": [\n    {\n      \"type\": \"opencollective\",\n      \"url\": \"https://opencollective.com/postcss/\"\n    },\n    {\n      \"type\": \"tidelift\",\n      \"url\": \"https://tidelift.com/funding/github/npm/autoprefixer\"\n    },\n    {\n      \"type\": \"github\",\n      \"url\": \"https://github.com/sponsors/ai\"\n    }\n  ],\n  \"author\": \"Andrey Sitnik <andrey@sitnik.ru>\",\n  \"license\": \"MIT\",\n  \"repository\": \"postcss/autoprefixer\",\n  \"bugs\": {\n    \"url\": \"https://github.com/postcss/autoprefixer/issues\"\n  },\n  \"peerDependencies\": {\n    \"postcss\": \"^8.1.0\"\n  },\n  \"dependencies\": {\n    \"browserslist\": \"^4.28.1\",\n    \"caniuse-lite\": \"^1.0.30001774\",\n    \"fraction.js\": \"^5.3.4\",\n    \"picocolors\": \"^1.1.1\",\n    \"postcss-value-parser\": \"^4.2.0\"\n  },\n  \"devDependencies\": {\n    \"@logux/eslint-config\": \"^57.0.2\",\n    \"@size-limit/preset-small-lib\": \"12.0.0\",\n    \"actions-up\": \"^1.12.0\",\n    \"c8\": \"^11.0.0\",\n    \"clean-publish\": \"^6.0.3\",\n    \"eslint\": \"^10.0.2\",\n    \"nanospy\": \"^1.0.0\",\n    \"postcss\": \"^8.5.6\",\n    \"size-limit\": \"^12.0.0\",\n    \"uvu\": \"^0.5.6\"\n  },\n  \"prettier\": {\n    \"arrowParens\": \"avoid\",\n    \"jsxSingleQuote\": false,\n    \"quoteProps\": \"consistent\",\n    \"semi\": false,\n    \"singleQuote\": true,\n    \"trailingComma\": \"none\"\n  },\n  \"size-limit\": [\n    {\n      \"limit\": \"70 KB\"\n    }\n  ],\n  \"c8\": {\n    \"exclude\": [\n      \"test/*\"\n    ],\n    \"lines\": 100,\n    \"check-coverage\": true,\n    \"reporter\": [\n      \"text\",\n      \"lcov\"\n    ],\n    \"skip-full\": true,\n    \"clean\": true\n  },\n  \"clean-publish\": {\n    \"cleanDocs\": true\n  },\n  \"pnpm\": {\n    \"patchedDependencies\": {\n      \"yargs@17.7.2\": \"patches/yargs@17.7.2.patch\"\n    }\n  }\n}\n"
  },
  {
    "path": "patches/yargs@17.7.2.patch",
    "content": "diff --git a/browser.d.ts b/browser.d.ts\ndeleted file mode 100644\nindex 21f3fc69190b574ab8456514d3da1972afa53973..0000000000000000000000000000000000000000\ndiff --git a/package.json b/package.json\nindex 389cc6b064b5f888e7f9d718f5440feabdce57ad..c1ae265542ad386fa2214914b0186ade81dd6ee2 100644\n--- a/package.json\n+++ b/package.json\n@@ -20,13 +20,10 @@\n       \"import\": \"./browser.mjs\",\n       \"types\": \"./browser.d.ts\"\n     },\n-    \"./yargs\": [\n-      {\n-        \"import\": \"./yargs.mjs\",\n-        \"require\": \"./yargs\"\n-      },\n-      \"./yargs\"\n-    ]\n+    \"./yargs\": {\n+      \"require\": \"./index.cjs\",\n+      \"import\": \"./yargs.mjs\"\n+    }\n   },\n   \"type\": \"module\",\n   \"module\": \"./index.mjs\",\n"
  },
  {
    "path": "test/at-rule.test.js",
    "content": "let { parse } = require('postcss')\nlet { test } = require('uvu')\nlet { equal } = require('uvu/assert')\n\nlet AtRule = require('../lib/at-rule')\n\ntest('adds prefixes', () => {\n  let keyframes = new AtRule('@keyframes', ['-moz-', '-ms-'])\n\n  let css = parse(\n    '@-moz-keyframes b {} ' + '@-ms-keyframes a {} ' + '@keyframes a {}'\n  )\n  keyframes.process(css.last)\n  equal(\n    css.toString(),\n    '@-moz-keyframes b {} ' +\n      '@-ms-keyframes a {} ' +\n      '@-moz-keyframes a {} ' +\n      '@keyframes a {}'\n  )\n})\n\ntest.run()\n"
  },
  {
    "path": "test/autoprefixer.test.js",
    "content": "let { readFileSync } = require('fs')\nlet { restoreAll, spyOn } = require('nanospy')\nlet { join } = require('path')\nlet postcss = require('postcss')\nlet { test } = require('uvu')\nlet { equal, match, not, throws, type } = require('uvu/assert')\n\nlet autoprefixer = require('..')\n\nlet grider = autoprefixer({\n  cascade: false,\n  grid: 'autoplace',\n  overrideBrowserslist: ['Chrome 25', 'Edge 12', 'IE 10']\n})\n\nlet cleaner = autoprefixer({\n  overrideBrowserslist: []\n})\nlet compiler = autoprefixer({\n  overrideBrowserslist: ['Chrome 25', 'Opera 12']\n})\nlet filterer = autoprefixer({\n  overrideBrowserslist: ['Chrome 25', 'Safari 9', 'Firefox 39']\n})\nlet borderer = autoprefixer({\n  overrideBrowserslist: ['Safari 4', 'Firefox 3.6']\n})\nlet cascader = autoprefixer({\n  cascade: true,\n  overrideBrowserslist: ['Chrome > 19', 'Firefox 21', 'IE 10']\n})\nlet keyframer = autoprefixer({\n  overrideBrowserslist: ['Chrome > 19', 'Opera 12']\n})\nlet flexboxer = autoprefixer({\n  overrideBrowserslist: ['Chrome > 19', 'Firefox 21', 'IE 10']\n})\nlet without3d = autoprefixer({\n  overrideBrowserslist: ['Opera 12', 'IE > 0']\n})\nlet supporter = autoprefixer({\n  overrideBrowserslist: ['Chrome 25', 'Chrome 28', 'IE > 0']\n})\nlet uncascader = autoprefixer({\n  overrideBrowserslist: ['Firefox 15']\n})\nlet gradienter = autoprefixer({\n  overrideBrowserslist: ['Chrome 25', 'Opera 12', 'Android 2.3']\n})\nlet grouping = autoprefixer({\n  grid: 'autoplace',\n  overrideBrowserslist: ['Chrome 25', 'Firefox > 17', 'IE 10', 'Edge 12']\n})\nlet ffgradienter = autoprefixer({\n  overrideBrowserslist: ['Chrome 25', 'Opera 12', 'Firefox 6']\n})\nlet selectorer = autoprefixer({\n  overrideBrowserslist: ['Chrome 25', 'Firefox > 17', 'IE 10', 'Edge 12']\n})\nlet fileSelectorButtoner = autoprefixer({\n  overrideBrowserslist: ['Chrome > 25', 'Firefox >= 82']\n})\nlet backdroper = autoprefixer({\n  overrideBrowserslist: ['IE >= 11', 'Chrome < 32', 'Safari >= 15.4']\n})\nlet placeholderShowner = autoprefixer({\n  overrideBrowserslist: ['IE >= 10']\n})\nlet transitionSpec = autoprefixer({\n  overrideBrowserslist: ['Chrome > 19', 'Firefox 14', 'IE 10', 'Opera 12']\n})\nlet intrinsicer = autoprefixer({\n  overrideBrowserslist: ['Chrome 25', 'Firefox 22', 'Safari 10']\n})\nlet imagerender = autoprefixer({\n  overrideBrowserslist: ['iOS 8', 'iOS 6.1', 'FF 22', 'IE 11', 'Opera 12']\n})\nlet backgrounder = autoprefixer({\n  overrideBrowserslist: ['Firefox 3.6', 'Android 2.3']\n})\nlet resolutioner = autoprefixer({\n  overrideBrowserslist: ['Safari 7', 'Opera 12', 'Firefox 15']\n})\nlet overscroller = autoprefixer({\n  overrideBrowserslist: ['Edge 17']\n})\nlet clipper = autoprefixer({\n  overrideBrowserslist: ['Safari 7', 'Edge 14']\n})\nlet example = autoprefixer({\n  overrideBrowserslist: ['defaults']\n})\nlet autofiller = autoprefixer({\n  overrideBrowserslist: ['Chrome > 90', 'Firefox >= 82']\n})\nlet textDecorator = autoprefixer({\n  overrideBrowserslist: ['Chrome >= 57', 'Firefox >= 36', 'Safari >= 12.1']\n})\nlet content = autoprefixer({\n  overrideBrowserslist: [\n    '> 2%',\n    'last 2 years',\n    'ie 11',\n    'not ie_mob > 0',\n    'not dead'\n  ]\n})\n\nfunction prefixer(name) {\n  if (\n    name === 'grid' ||\n    name === 'grid-gap' ||\n    name === 'grid-area' ||\n    name === 'grid-template' ||\n    name === 'grid-template-areas'\n  ) {\n    return grider\n  } else if (\n    name === 'filter' ||\n    name === 'advanced-filter' ||\n    name === 'element'\n  ) {\n    return filterer\n  } else if (\n    name === 'vendor-hack' ||\n    name === 'value-hack' ||\n    name === 'mistakes'\n  ) {\n    return cleaner\n  } else if (\n    name === 'flexbox' ||\n    name === 'flex-rewrite' ||\n    name === 'double' ||\n    name === 'viewport' ||\n    name === 'appearance'\n  ) {\n    return flexboxer\n  } else if (\n    name === 'intrinsic' ||\n    name === 'multicolumn' ||\n    name === 'logical' ||\n    name === 'text-decoration' ||\n    name === 'at-rules'\n  ) {\n    return intrinsicer\n  } else if (name === 'text-decoration-shorthand') {\n    return textDecorator\n  } else if (name === 'selectors' || name === 'placeholder') {\n    return selectorer\n  } else if (name === 'selectors' || name === 'file-selector-button') {\n    return fileSelectorButtoner\n  } else if (name === 'selectors' || name === 'backdrop') {\n    return backdroper\n  } else if (\n    name === 'selectors' ||\n    name === 'autofill' ||\n    name === 'print-color-adjust'\n  ) {\n    return autofiller\n  } else if (name === 'placeholder-shown') {\n    return placeholderShowner\n  } else if (name === 'backdrop-filter' || name === 'overscroll-behavior') {\n    return overscroller\n  } else if (name === 'background-clip' || name === 'user-select') {\n    return clipper\n  } else if (name === 'image-rendering' || name === 'writing-mode') {\n    return imagerender\n  } else if (name === 'keyframes') {\n    return keyframer\n  } else if (name === 'border-radius') {\n    return borderer\n  } else if (name === 'gradient') {\n    return gradienter\n  } else if (name === 'gradient-fix') {\n    return ffgradienter\n  } else if (name === 'grouping-rule') {\n    return grouping\n  } else if (name === 'cascade') {\n    return cascader\n  } else if (name === '3d-transform') {\n    return without3d\n  } else if (name === 'background-size') {\n    return backgrounder\n  } else if (name === 'uncascade') {\n    return uncascader\n  } else if (name === 'example') {\n    return example\n  } else if (name === 'resolution') {\n    return resolutioner\n  } else if (name === 'supports') {\n    return supporter\n  } else if (name === 'transition-spec') {\n    return transitionSpec\n  } else if (name === 'content') {\n    return content\n  } else {\n    return compiler\n  }\n}\n\nfunction read(name) {\n  let file = join(__dirname, '/cases/' + name + '.css')\n  return readFileSync(file).toString()\n}\n\nfunction universalizer(string) {\n  return string.replace(/\\r/g, '')\n}\n\nfunction check(from, instance = prefixer(from)) {\n  let input = read(from)\n  let output = read(from + '.out')\n  let result = postcss([instance]).process(input)\n  equal(result.warnings().length, 0)\n  equal(universalizer(result.css), universalizer(output))\n}\n\nconst COMMONS = [\n  'transition',\n  'values',\n  'keyframes',\n  'gradient',\n  'flex-rewrite',\n  'flexbox',\n  'filter',\n  'border-image',\n  'border-radius',\n  'notes',\n  'selectors',\n  'placeholder',\n  'placeholder-shown',\n  'fullscreen',\n  'intrinsic',\n  'mistakes',\n  'custom-prefix',\n  'cascade',\n  'double',\n  'multicolumn',\n  '3d-transform',\n  'background-size',\n  'supports',\n  'viewport',\n  'resolution',\n  'logical',\n  'appearance',\n  'advanced-filter',\n  'element',\n  'image-set',\n  'image-rendering',\n  'mask-border',\n  'writing-mode',\n  'cross-fade',\n  'gradient-fix',\n  'text-emphasis-position',\n  'grid',\n  'grid-area',\n  'grid-template',\n  'grid-template-areas',\n  'grid-gap',\n  'print-color-adjust'\n]\n\ntest.after.each(() => {\n  delete process.env.AUTOPREFIXER_GRID\n  restoreAll()\n})\n\ntest('throws on wrong options', () => {\n  throws(() => {\n    autoprefixer({ browser: ['chrome 25', 'opera 12'] })\n  }, /overrideBrowserslist/)\n  throws(() => {\n    autoprefixer({\n      browserslist: ['chrome 25', 'opera 12']\n    })\n  }, /overrideBrowserslist/)\n})\n\nlet options = {\n  cascade: false,\n  grid: false\n}\n\nlet browsers = ['chrome 25', 'opera 12']\n\ntest('sets options via options object', () => {\n  let allOptions = Object.assign(options, { overrideBrowserslist: browsers })\n  let instance = autoprefixer(allOptions)\n  equal(instance.options, allOptions)\n  equal(instance.browsers, browsers)\n})\n\ntest('sets options via array of browsers as first argument and object', () => {\n  let instance = autoprefixer(browsers, options)\n  equal(instance.options, options)\n  equal(instance.browsers, browsers)\n})\n\ntest('sets options via browsers as arguments and options object', () => {\n  let instance = autoprefixer(...browsers, options)\n  equal(instance.options, options)\n  equal(instance.browsers, browsers)\n})\n\ntest('has default browsers', () => {\n  type(autoprefixer.defaults.length, 'number')\n})\n\ntest('shows warning on browsers option', () => {\n  let consoleWarn = spyOn(console, 'warn', () => {})\n  let instance = autoprefixer({\n    browsers: ['last 1 version']\n  })\n  equal(instance.browsers, ['last 1 version'])\n  equal(consoleWarn.callCount, 1)\n  match(consoleWarn.calls[0][0], 'overrideBrowserslist')\n})\n\ntest('passes statistics to Browserslist', () => {\n  let stats = {\n    chrome: {\n      10: 10,\n      11: 40\n    },\n    ie: {\n      10: 10,\n      11: 40\n    }\n  }\n  match(\n    autoprefixer({\n      overrideBrowserslist: '> 20% in my stats',\n      stats\n    }).info(),\n    /Browsers:\\n\\s\\sChrome: 11\\n\\s\\sIE: 11\\n/\n  )\n})\n\ntest('prefixes values', () => {\n  check('values')\n})\n\ntest('prefixes @keyframes', () => {\n  check('keyframes')\n})\n\ntest('prefixes @viewport', () => {\n  check('viewport')\n})\n\ntest('prefixes selectors', () => {\n  check('selectors')\n})\n\ntest('prefixes resolution query', () => {\n  check('resolution')\n})\n\ntest('removes common mistakes', () => {\n  check('mistakes')\n})\n\ntest('reads notes for prefixes', () => {\n  check('notes')\n})\n\ntest('keeps vendor-specific hacks', () => {\n  check('vendor-hack')\n})\n\ntest('keeps values with vendor hacks', () => {\n  check('value-hack')\n})\n\ntest('works with comments', () => {\n  check('comments')\n})\n\ntest('uses visual cascade', () => {\n  check('cascade')\n})\n\ntest('works with properties near', () => {\n  check('double')\n})\n\ntest('checks prefixed in hacks', () => {\n  check('check-down')\n})\n\ntest('normalize cascade after remove', () => {\n  check('uncascade')\n})\n\ntest('prefix decls in @supports', () => {\n  check('supports')\n})\n\ntest('saves declaration style', () => {\n  check('style')\n})\n\ntest('uses ignore next control comments', () => {\n  check('ignore-next')\n})\n\ntest('uses block control comments', () => {\n  check('disabled')\n})\n\ntest('has actual example in docs', () => {\n  check('example')\n})\n\ntest('process grouping rules correctly', () => {\n  check('grouping-rule')\n})\n\ntest('transition on vendor specific rule', () => {\n  check('transition-spec')\n})\n\ntest('ignore prefix in vendor at rules', () => {\n  check('at-rules')\n})\n\ntest('ignore content property', () => {\n  let input = read('content')\n  let result = postcss([prefixer('scope')]).process(input)\n  equal(result.css, input)\n})\n\ntest('uses control comments to whole scope', () => {\n  let input = read('scope')\n  let output = read('scope.out')\n  let result = postcss([prefixer('scope')]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:5:3: Second Autoprefixer control comment ' +\n        'was ignored. Autoprefixer applies control comment to whole block, ' +\n        'not to next rules.'\n    ]\n  )\n})\n\ntest('sets grid option via comment', () => {\n  let input = read('grid-status')\n  let output = read('grid-status.out')\n  let ap = autoprefixer({ overrideBrowserslist: ['last 2 versions', 'IE 11'] })\n  let result = postcss([ap]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:2:1: Second Autoprefixer grid control ' +\n        'comment was ignored. Autoprefixer applies control comments ' +\n        'to the whole block, not to the next rules.',\n      'autoprefixer: <css input>:20:3: Second Autoprefixer grid control ' +\n        'comment was ignored. Autoprefixer applies control comments ' +\n        'to the whole block, not to the next rules.',\n      'autoprefixer: <css input>:47:3: Second Autoprefixer grid control ' +\n        'comment was ignored. Autoprefixer applies control comments ' +\n        'to the whole block, not to the next rules.'\n    ]\n  )\n})\n\ntest('prefixes transition', () => {\n  let input = read('transition')\n  let output = read('transition.out')\n  let result = postcss([prefixer('transition')]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:23:3: Replace transition-property ' +\n        'to transition, because Autoprefixer could not support any cases ' +\n        'of transition-property and other transition-*'\n    ]\n  )\n})\n\ntest('does not raise unnecessary warnings when prefixing transition', () => {\n  check('transition-no-warning')\n})\n\ntest('works with broken transition', () => {\n  let input = 'a{transition:,,}'\n  let output = 'a{-webkit-transition:;-o-transition:;transition:}'\n  let result = postcss([prefixer('transition')]).process(input)\n  equal(result.css, output)\n})\n\ntest('should ignore spaces inside values', () => {\n  let css = read('trim')\n  equal(postcss([flexboxer]).process(css).css, css)\n})\n\ntest('removes unnecessary prefixes', () => {\n  let processor = postcss([cleaner])\n  for (let i of COMMONS) {\n    if (i === 'gradient-fix') continue\n    if (i === 'cascade') continue\n    if (i === 'mistakes') continue\n    if (i === 'flex-rewrite') continue\n    if (i === 'grid') continue\n    if (i === 'grid-gap') continue\n    if (i === 'grid-area') continue\n    if (i === 'grid-template') continue\n    if (i === 'grid-template-areas') continue\n    let input = read(i + '.out')\n    let output = read(i)\n    equal(processor.process(input).css, output)\n  }\n})\n\ntest('media does not should nested', () => {\n  let processor = postcss([grider])\n  let input = read('grid-media-rules')\n  let output = read('grid-media-rules.out')\n  equal(processor.process(input).css, output)\n})\n\ntest('does not remove unnecessary prefixes on request', () => {\n  for (let i of ['transition', 'values', 'fullscreen']) {\n    let keeper = autoprefixer({ overrideBrowserslist: [], remove: false })\n    let css = read(i + '.out')\n    equal(postcss([keeper]).process(css).css, css)\n  }\n})\n\ntest('does not add prefixes on request', () => {\n  for (let i of ['transition', 'values', 'fullscreen']) {\n    let remover = autoprefixer({\n      add: false,\n      overrideBrowserslist: ['Opera 12']\n    })\n    let unprefixed = read(i)\n    equal(postcss([remover]).process(unprefixed).css, unprefixed)\n  }\n})\n\ntest('prevents doubling prefixes', () => {\n  for (let i of COMMONS) {\n    let processor = postcss([prefixer(i)])\n    let input = read(i)\n    let output = read(i + '.out')\n    let result = processor.process(processor.process(input)).css\n    equal(universalizer(result), universalizer(output))\n  }\n})\n\nfunction isContainerNode(node) {\n  return 'nodes' in node\n}\n\ntest('does not broke AST', () => {\n  function checkParent(node) {\n    node.walk(child => {\n      type(child.parent, 'object')\n      if (isContainerNode(child)) checkParent(child)\n    })\n  }\n  for (let i of COMMONS) {\n    let processor = postcss([prefixer(i)])\n    let input = read(i)\n    checkParent(processor.process(input).root)\n  }\n})\n\ntest('parses difficult files', () => {\n  let input = read('syntax')\n  let result = postcss([cleaner]).process(input)\n  equal(result.css, input)\n})\n\ntest('marks parsing errors', () => {\n  throws(() => {\n    postcss([cleaner]).process('a {').css\n  }, '<css input>:1:1: Unclosed block')\n})\n\ntest('shows file name in parse error', () => {\n  throws(() => {\n    postcss([cleaner]).process('a {', { from: 'a.css' }).css\n  }, /a.css:1:1: /)\n})\n\ntest('uses browserslist config', () => {\n  let from = join(__dirname, 'cases/config/test.css')\n  let input = read('config/test')\n  let output = read('config/test.out')\n  let processor = postcss([autoprefixer])\n  equal(processor.process(input, { from }).css, output)\n})\n\ntest('sets browserslist environment', () => {\n  let from = join(__dirname, 'cases/config/test.css')\n  let input = read('config/test')\n  let output = read('config/test.production')\n  let processor = postcss([autoprefixer({ env: 'development' })])\n  equal(processor.process(input, { from }).css, output)\n})\n\ntest('takes values from other PostCSS plugins', () => {\n  function plugin(root) {\n    root.walkDecls(i => {\n      i.value = 'calc(0)'\n    })\n  }\n  let result = postcss([plugin, compiler]).process('a{width:0/**/0}')\n  equal(result.css, 'a{width:-webkit-calc(0);width:calc(0)}')\n})\n\ntest('has option to disable @supports support', () => {\n  let css = '@supports (cursor: grab) {}'\n  let instance = autoprefixer({\n    overrideBrowserslist: ['Chrome 28'],\n    supports: false\n  })\n  let result = postcss([instance]).process(css)\n  equal(result.css, css)\n})\n\ntest('has disabled grid options by default', () => {\n  let ap = autoprefixer({ overrideBrowserslist: ['Edge 12', 'IE 10'] })\n  let input = read('grid')\n  let output = read('grid.disabled')\n  let result = postcss([ap]).process(input)\n  equal(result.css, output)\n})\n\ntest('has different outputs for different grid options', () => {\n  function ap(gridValue) {\n    return autoprefixer({\n      grid: gridValue,\n      overrideBrowserslist: ['Edge 12', 'IE 10']\n    })\n  }\n  let input = read('grid-options')\n  let outputAutoplace = read('grid-options.autoplace.out')\n  let outputNoAutoplace = read('grid-options.no-autoplace.out')\n  let outputDisabled = read('grid-options.disabled.out')\n\n  let resultAutoplace = postcss([ap('autoplace')]).process(input).css\n  let resultNoAutoplace = postcss([ap('no-autoplace')]).process(input).css\n  let resultEnabled = postcss([ap(true)]).process(input).css\n  let resultDisabled = postcss([ap(false)]).process(input).css\n\n  // output for grid: 'autoplace'\n  equal(resultAutoplace, outputAutoplace)\n  // output for grid: 'no-autoplace'\n  equal(resultNoAutoplace, outputNoAutoplace)\n  // output for grid: true is the same as for 'no-autoplace'\n  equal(resultEnabled, outputNoAutoplace)\n  // output for grid: false\n  equal(resultDisabled, outputDisabled)\n})\n\ntest('has different outputs for different grid environment variables', () => {\n  function ap(gridValue) {\n    process.env.AUTOPREFIXER_GRID = gridValue\n    return autoprefixer({ overrideBrowserslist: ['Edge 12', 'IE 10'] })\n  }\n  let input = read('grid-options')\n  let outputAutoplace = read('grid-options.autoplace.out')\n  let outputNoAutoplace = read('grid-options.no-autoplace.out')\n\n  let resultAutoplace = postcss([ap('autoplace')]).process(input).css\n  equal(resultAutoplace, outputAutoplace)\n\n  let resultNoAutoplace = postcss([ap('no-autoplace')]).process(input).css\n  equal(resultNoAutoplace, outputNoAutoplace)\n})\n\ntest('has option to disable flexbox support', () => {\n  let css = read('flexbox')\n  let instance = autoprefixer({\n    flexbox: false,\n    overrideBrowserslist: ['IE 10']\n  })\n  let result = postcss([instance]).process(css)\n  equal(result.css, css)\n})\n\ntest('has option to disable 2009 flexbox support', () => {\n  let ap = autoprefixer({\n    flexbox: 'no-2009',\n    overrideBrowserslist: ['Chrome > 19']\n  })\n  let css = 'a{flex:1;transition:flex}'\n  let result = postcss([ap]).process(css)\n  equal(\n    result.css,\n    'a{' +\n      '-webkit-flex:1;flex:1;' +\n      '-webkit-transition:-webkit-flex;transition:-webkit-flex;' +\n      'transition:flex;transition:flex, -webkit-flex' +\n      '}'\n  )\n})\n\ntest('returns inspect string', () => {\n  match(\n    autoprefixer({ overrideBrowserslist: ['chrome 25'] }).info(),\n    /Browsers:\\s+Chrome: 25/\n  )\n})\n\ntest('uses browserslist config in inspect', () => {\n  let from = join(__dirname, 'cases/config')\n  match(autoprefixer().info({ from }), /Browsers:\\s+IE: 10/)\n})\n\ntest('ignores unknown versions on request', () => {\n  throws(() => {\n    autoprefixer({ overrideBrowserslist: ['ie 100'] }).info()\n  }, /Unknown version 100 of ie/)\n  not.throws(() => {\n    autoprefixer({\n      ignoreUnknownVersions: true,\n      overrideBrowserslist: ['ie 100']\n    }).info()\n  })\n})\n\ntest('works with CSS Modules', () => {\n  postcss([autoprefixer()]).process(':export { selectors: _1q6ho_2 }').css\n})\n\ntest('ignores prefix IE filter', () => {\n  check('filter')\n})\n\ntest('supports webkit filters', () => {\n  check('advanced-filter')\n})\n\ntest('changes border image syntax', () => {\n  check('border-image')\n})\n\ntest('supports old Mozilla prefixes', () => {\n  check('border-radius')\n})\n\ntest('supports all flexbox syntaxes', () => {\n  check('flexbox')\n})\n\ntest('supports map flexbox props', () => {\n  check('flex-rewrite')\n})\n\ntest('supports all fullscreens', () => {\n  check('fullscreen')\n})\n\ntest('supports file-selector-button', () => {\n  check('file-selector-button')\n})\n\ntest('supports ::backdrop', () => {\n  check('backdrop')\n})\n\ntest('supports custom prefixes', () => {\n  check('custom-prefix')\n})\n\ntest('fixes break properties', () => {\n  check('multicolumn')\n})\n\ntest('ignores some 3D transforms', () => {\n  check('3d-transform')\n})\n\ntest('supports background-size', () => {\n  check('background-size')\n})\n\ntest('supports background-clip', () => {\n  check('background-clip')\n})\n\ntest('supports logical properties', () => {\n  check('logical')\n})\n\ntest('supports appearance', () => {\n  check('appearance')\n})\n\ntest('supports all placeholders', () => {\n  check('placeholder')\n})\n\ntest('supports placeholder-shown', () => {\n  check('placeholder-shown')\n})\n\ntest('supports image-rendering', () => {\n  check('image-rendering')\n})\n\ntest('supports border-box mask', () => {\n  check('mask-border')\n})\n\ntest('supports mask-composite', () => {\n  check('mask-composite')\n})\n\ntest('supports image-set()', () => {\n  check('image-set')\n})\n\ntest('supports writing-mode', () => {\n  check('writing-mode')\n})\n\ntest('supports cross-fade()', () => {\n  check('cross-fade')\n})\n\ntest('ignores modern direction', () => {\n  check('animation')\n})\n\ntest('supports overscroll-behavior', () => {\n  check('overscroll-behavior')\n})\n\ntest('supports print-color-adjust', () => {\n  let input = read('print-color-adjust')\n  let output = read('print-color-adjust.out')\n  let result = postcss([prefixer('print-color-adjust')]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:2:3: Replace color-adjust ' +\n        'to print-color-adjust. The color-adjust shorthand ' +\n        'is currently deprecated.'\n    ]\n  )\n})\n\ntest('supports backdrop-filter', () => {\n  check('backdrop-filter')\n})\n\ntest('supports user-select hack for IE', () => {\n  check('user-select')\n})\n\ntest('supports appearance for IE', () => {\n  let instance = autoprefixer({ overrideBrowserslist: 'Edge 15' })\n  let result = postcss([instance]).process('a { appearance: none }')\n  equal(result.css, 'a { -webkit-appearance: none; appearance: none }')\n})\n\ntest('changes angle in gradient', () => {\n  let input = read('gradient')\n  let output = read('gradient.out')\n  let result = postcss([prefixer('gradient')]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:18:3: Gradient has outdated direction ' +\n        'syntax. New syntax is like `closest-side at 0 0` instead of ' +\n        '`0 0, closest-side`.',\n      'autoprefixer: <css input>:38:3: Gradient has outdated direction ' +\n        'syntax. New syntax is like `to left` instead of `right`.',\n      'autoprefixer: <css input>:100:3: Gradient has outdated ' +\n        'direction syntax. Replace `cover` to `farthest-corner`.',\n      'autoprefixer: <css input>:104:3: Gradient has outdated ' +\n        'direction syntax. Replace `contain` to `closest-side`.'\n    ]\n  )\n\n  check('gradient-fix')\n})\n\ntest('skips old webkit gradient for CSS variables', () => {\n  let input = 'a { background: linear-gradient(var(--direction), red, blue); }'\n  let result = postcss([gradienter]).process(input)\n\n  // Should not generate -webkit-gradient() when CSS variables are present\n  equal(result.css.includes('-webkit-gradient('), false)\n  // Should still generate -webkit-linear-gradient()\n  equal(result.css.includes('-webkit-linear-gradient('), true)\n})\n\ntest('warns on old flexbox display', () => {\n  let result = postcss([flexboxer]).process('a{ display: box; }')\n  equal(result.css, 'a{ display: box; }')\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:1:4: You should write display: flex ' +\n        'by final spec instead of display: box'\n    ]\n  )\n})\n\ntest('supports intrinsic sizing', () => {\n  let input = read('intrinsic')\n  let output = read('intrinsic.out')\n  let result = postcss([prefixer('intrinsic')]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:15:3: Replace fill to stretch, ' +\n        'because spec had been changed',\n      'autoprefixer: <css input>:19:3: Replace fill-available ' +\n        'to stretch, because spec had been changed'\n    ]\n  )\n})\n\ntest('supports text-emphasis', () => {\n  let input = read('text-emphasis-position')\n  let output = read('text-emphasis-position.out')\n  let instance = prefixer('text-emphasis-position')\n  let result = postcss([instance]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:14:3: You should use 2 values ' +\n        'for text-emphasis-position For example, `under left` ' +\n        'instead of just `under`.'\n    ]\n  )\n})\n\ntest('supports grid layout', () => {\n  let input = read('grid')\n  let output = read('grid.out')\n  let instance = prefixer('grid')\n  let result = postcss([instance]).process(input)\n\n  equal(result.css, output)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:3:3: Autoplacement does not work ' +\n        'without grid-template-rows property',\n      'autoprefixer: <css input>:12:3: Autoplacement does not work ' +\n        'without grid-template-columns property',\n      'autoprefixer: <css input>:36:3: Can not prefix grid-column-end ' +\n        '(grid-column-start is not found)',\n      'autoprefixer: <css input>:37:3: IE does not support subgrid',\n      'autoprefixer: <css input>:39:3: Can not implement grid-gap ' +\n        'without grid-template-columns',\n      'autoprefixer: <css input>:39:3: Can not find grid areas: ' +\n        'head, nav, main, foot',\n      'autoprefixer: <css input>:57:3: Can not implement grid-gap ' +\n        'without grid-template-columns',\n      'autoprefixer: <css input>:57:3: Can not find grid areas: a',\n      'autoprefixer: <css input>:65:3: Can not implement grid-gap ' +\n        'without grid-template-columns',\n      'autoprefixer: <css input>:65:3: Can not find grid areas: b',\n      'autoprefixer: <css input>:73:3: Can not find grid areas: c',\n      'autoprefixer: <css input>:81:3: Can not find grid areas: d',\n      'autoprefixer: <css input>:116:3: grid-column-span is not part ' +\n        'of final Grid Layout. Use grid-column.',\n      'autoprefixer: <css input>:117:3: grid-row-span is not part ' +\n        'of final Grid Layout. Use grid-row.',\n      'autoprefixer: <css input>:118:3: grid-auto-columns is not ' +\n        'supported by IE',\n      'autoprefixer: <css input>:119:3: grid-auto-rows is not ' +\n        'supported by IE',\n      'autoprefixer: <css input>:121:33: auto-fill value is not ' +\n        'supported by IE',\n      'autoprefixer: <css input>:122:30: auto-fit value is not ' +\n        'supported by IE',\n      'autoprefixer: <css input>:138:3: Please do not use ' +\n        'display: contents; if you have grid setting enabled',\n      'autoprefixer: <css input>:142:3: IE does not support align-items ' +\n        'on grid containers. Try using align-self on child elements instead: ' +\n        '.warn_ie_align > * { align-self: center }',\n      'autoprefixer: <css input>:147:3: IE does not support justify-items ' +\n        'on grid containers. Try using justify-self on child elements ' +\n        'instead: .warn_ie_justify > * { justify-self: center }',\n      'autoprefixer: <css input>:152:3: IE does not support justify-content ' +\n        'on grid containers',\n      'autoprefixer: <css input>:157:3: IE does not support place-items ' +\n        'on grid containers. Try using place-self on child elements ' +\n        'instead: .warn_place_items > * { place-self: start end }',\n      'autoprefixer: <css input>:181:3: grid-auto-flow is not supported by IE',\n      'autoprefixer: <css input>:203:26: Autoprefixer currently does not ' +\n        'support line names. Try using grid-template-areas instead.'\n    ]\n  )\n\n  let input2 = read('grid-template')\n  let output2 = read('grid-template.out')\n  let instance2 = prefixer('grid-template')\n  let result2 = postcss([instance2]).process(input2)\n  equal(result2.css, output2)\n})\n\ntest('supports grid autoplacement', () => {\n  let input = read('grid-autoplacement')\n  let output = read('grid-autoplacement.out')\n  let instance = prefixer('grid')\n  let result = postcss([instance]).process(input)\n  equal(result.css, output)\n\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:47:3: grid-auto-flow: dense ' +\n        'is not supported by IE',\n      'autoprefixer: <css input>:48:3: Autoplacement does not work ' +\n        'without grid-template-rows property',\n      'autoprefixer: <css input>:53:3: grid-auto-flow works only if grid-temp' +\n        'late-rows and grid-template-columns are present in the same rule',\n      'autoprefixer: <css input>:60:3: grid-gap only works if grid-temp' +\n        'late(-areas) is being used',\n      'autoprefixer: <css input>:64:3: Autoplacement does not work ' +\n        'without grid-template-rows property',\n      'autoprefixer: <css input>:65:3: grid-gap only works if grid-temp' +\n        'late(-areas) is being used or both rows and columns have been ' +\n        'declared and cells have not been ' +\n        'manually placed inside the explicit grid'\n    ]\n  )\n})\n\ntest('shows Grid warnings only for IE', () => {\n  let input = 'a { grid-template-rows: repeat(auto-fit, 1px) }'\n  let instance = autoprefixer({\n    grid: true,\n    overrideBrowserslist: 'chrome 27'\n  })\n  let result = postcss([instance]).process(input)\n  equal(result.warnings().length, 0)\n})\n\ntest('warns if rule has both grid-area and grid-(row|column) decls', () => {\n  let input = read('grid-area')\n  let instance = prefixer('grid-area')\n  let result = postcss([instance]).process(input)\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:28:3: You already have a grid-area ' +\n        'declaration present in the rule. You should use either ' +\n        'grid-area or grid-row, not both',\n      'autoprefixer: <css input>:29:3: You already have a grid-area ' +\n        'declaration present in the rule. You should use either ' +\n        'grid-area or grid-column, not both',\n      'autoprefixer: <css input>:34:3: You already have a grid-area ' +\n        'declaration present in the rule. You should use either ' +\n        'grid-area or grid-column, not both'\n    ]\n  )\n})\n\ntest('warns if rule with grid-area has no parent with grid-template', () => {\n  let input = read('grid-template-areas')\n  let instance = prefixer('grid-area')\n  let result = postcss([instance]).process(input)\n\n  equal(\n    result\n      .warnings()\n      .map(i => i.toString())\n      .filter(str => str.includes('grid-template')),\n    [\n      'autoprefixer: <css input>:144:3: Autoprefixer cannot find ' +\n        'a grid-template containing the duplicate grid-area ' +\n        '\"child\" with full selector matching: .uncle',\n      'autoprefixer: <css input>:149:3: Autoprefixer cannot find ' +\n        'a grid-template containing the duplicate grid-area ' +\n        '\"child\" with full selector matching: .uncle',\n      'autoprefixer: <css input>:154:3: Autoprefixer cannot find ' +\n        'a grid-template containing the duplicate grid-area ' +\n        '\"child\" with full selector matching: .grand-parent .uncle-second',\n      'autoprefixer: <css input>:159:3: Autoprefixer cannot find ' +\n        'a grid-template containing the duplicate grid-area ' +\n        '\"child\" with full selector matching: .grand-parent .uncle-second',\n      'autoprefixer: <css input>:164:3: Autoprefixer cannot find ' +\n        'a grid-template containing the duplicate grid-area ' +\n        '\"child\" with full selector matching: .grand-parent .father.uncle',\n      'autoprefixer: <css input>:169:3: Autoprefixer cannot find ' +\n        'a grid-template containing the duplicate grid-area ' +\n        '\"child\" with full selector matching: .grand-parent.uncle .father'\n    ]\n  )\n})\n\ntest('should preserve @media rules with grid-area', () => {\n  let input = read('grid-area-media-sequence')\n  let output = read('grid-area-media-sequence.out')\n  let instance = prefixer('grid-area')\n  let result = postcss([instance]).process(input)\n  equal(result.css, output)\n})\n\ntest('should merge complex duplicate grid-area rules successfully', () => {\n  let input = read('grid-areas-duplicate-complex')\n  let output = read('grid-areas-duplicate-complex.out')\n  let instance = prefixer('grid-area')\n  let result = postcss([instance]).process(input)\n  equal(result.css, output)\n})\n\ntest('ignores values for CSS3PIE props', () => {\n  let css = read('pie')\n  equal(postcss([compiler]).process(css).css, css)\n})\n\ntest('add prefix for backface-visibility for Safari 9', () => {\n  let input =\n    'a{ ' + 'backface-visibility: hidden; ' + 'transform-style: preserve-3d }'\n  let ap = autoprefixer({\n    flexbox: false,\n    overrideBrowserslist: ['Safari 9']\n  })\n  equal(\n    postcss([ap]).process(input).css,\n    'a{ ' +\n      '-webkit-backface-visibility: hidden; ' +\n      'backface-visibility: hidden; ' +\n      'transform-style: preserve-3d }'\n  )\n})\n\ntest('supports text-decoration', () => {\n  let input = read('text-decoration')\n  let output = read('text-decoration.out')\n  let instance = prefixer('text-decoration')\n  let result = postcss([instance]).process(input)\n\n  equal(universalizer(result.css), universalizer(output))\n  equal(\n    result.warnings().map(i => i.toString()),\n    [\n      'autoprefixer: <css input>:32:3: Replace text-decoration-skip: ink ' +\n        'to text-decoration-skip-ink: auto, because spec had been changed'\n    ]\n  )\n})\n\ntest('supports text-decoration shorthand', () => {\n  let input = read('text-decoration')\n  let output = read('text-decoration.shorthand.out')\n  let instance = prefixer('text-decoration-shorthand')\n  let result = postcss([instance]).process(input)\n\n  equal(universalizer(result.css), universalizer(output))\n})\n\ntest('supports -webkit-line-clamp', () => {\n  let input = read('webkit-line-clamp')\n  let output = read('webkit-line-clamp.out')\n  let result = postcss([cleaner]).process(input)\n\n  equal(universalizer(result.css), universalizer(output))\n  equal(result.warnings().length, 0)\n})\n\ntest('supports latest Firefox stretch', () => {\n  let input = read('intrinsic')\n  let output = read('intrinsic.ff')\n  let result = postcss([\n    autoprefixer({ overrideBrowserslist: 'firefox 90' })\n  ]).process(input)\n  equal(result.css, output)\n  equal(result.warnings().length, 2)\n})\n\ntest.run()\n"
  },
  {
    "path": "test/brackets.test.js",
    "content": "let { test } = require('uvu')\nlet { equal } = require('uvu/assert')\n\nlet brackets = require('../lib/brackets')\n\ntest('parses simple string', () => {\n  equal(brackets.parse('test'), ['test'])\n})\n\ntest('parses brackets', () => {\n  equal(brackets.parse('a (b) a'), ['a ', ['b'], ' a'])\n})\n\ntest('parses many brackets', () => {\n  equal(brackets.parse('a (b ()) a'), ['a ', ['b ', [''], ''], ' a'])\n})\n\ntest('parses errors', () => {\n  equal(brackets.parse('a (b ('), ['a ', ['b ', ['']]])\n})\n\ntest('stringifies simple string', () => {\n  equal(brackets.stringify(['test']), 'test')\n})\n\ntest('stringifies brackets', () => {\n  equal(brackets.stringify(['a ', ['b'], ' a']), 'a (b) a')\n})\n\ntest('stringifies many brackets', () => {\n  equal(brackets.stringify(['a ', ['b ', [''], ''], ' a']), 'a (b ()) a')\n})\n\ntest.run()\n"
  },
  {
    "path": "test/browsers.test.js",
    "content": "let { agents } = require('caniuse-lite/dist/unpacker/agents')\nlet { join } = require('path')\nlet { test } = require('uvu')\nlet { equal, is } = require('uvu/assert')\n\nlet Browsers = require('../lib/browsers')\n\ntest('returns prefixes by default data', () => {\n  equal(Browsers.prefixes(), ['-webkit-', '-moz-', '-ms-', '-o-'])\n})\n\ntest('finds possible prefix', () => {\n  is(Browsers.withPrefix('1 -o-calc(1)'), true)\n  is(Browsers.withPrefix('1 calc(1)'), false)\n})\n\ntest('allows to select no browsers', () => {\n  let browsers = new Browsers(agents, [])\n  equal(browsers.selected.length, 0)\n})\n\ntest('selects by older version', () => {\n  let browsers = new Browsers(agents, ['ie < 7'])\n  equal(browsers.selected, ['ie 6', 'ie 5.5'])\n})\n\ntest('combines requirements', () => {\n  let browsers = new Browsers(agents, ['ie 10', 'ie < 6'])\n  equal(browsers.selected, ['ie 10', 'ie 5.5'])\n})\n\ntest('has aliases', () => {\n  equal(new Browsers(agents, ['fx 10']).selected, ['firefox 10'])\n  equal(new Browsers(agents, ['ff 10']).selected, ['firefox 10'])\n})\n\ntest('ignores case', () => {\n  equal(new Browsers(agents, ['Firefox 10']).selected, ['firefox 10'])\n})\n\ntest('uses browserslist config', () => {\n  let from = join(__dirname, 'cases/config/test.css')\n  equal(new Browsers(agents, undefined, { from }).selected, ['ie 10'])\n})\n\ntest('returns browser prefix', () => {\n  let browsers = new Browsers(agents, ['chrome 30'])\n  equal(browsers.prefix('chrome 30'), '-webkit-')\n})\n\ntest('returns right prefix for Operas', () => {\n  let browsers = new Browsers(agents, ['last 1 opera version'])\n  equal(browsers.prefix('opera 12'), '-o-')\n  equal(browsers.prefix(browsers.selected[0]), '-webkit-')\n  equal(browsers.prefix('op_mob 12'), '-o-')\n  equal(browsers.prefix(browsers.selected[0]), '-webkit-')\n})\n\ntest('return true for selected browsers', () => {\n  let browsers = new Browsers(agents, ['chrome 30', 'chrome 31'])\n  is(browsers.isSelected('chrome 30'), true)\n  is(browsers.isSelected('ie 6'), false)\n})\n\ntest.run()\n"
  },
  {
    "path": "test/cases/3d-transform.css",
    "content": "a {\n  transition: transform 1s;\n  transform: rotateX(45deg);\n}\nb {\n  transform: translateX(45deg);\n  transform-origin: 0 0;\n}\nem {\n  transform: rotateZ(45deg);\n}\n@keyframes anim {\n  from {\n    transform: rotate(90deg);\n  }\n}\n"
  },
  {
    "path": "test/cases/3d-transform.out.css",
    "content": "a {\n  -o-transition: -o-transform 1s;\n  transition: transform 1s;\n  transition: transform 1s, -o-transform 1s;\n  transform: rotateX(45deg);\n}\nb {\n  -ms-transform: translateX(45deg);\n   -o-transform: translateX(45deg);\n      transform: translateX(45deg);\n  -ms-transform-origin: 0 0;\n   -o-transform-origin: 0 0;\n      transform-origin: 0 0;\n}\nem {\n  -ms-transform: rotate(45deg);\n   -o-transform: rotateZ(45deg);\n      transform: rotateZ(45deg);\n}\n@-o-keyframes anim {\n  from {\n    -o-transform: rotate(90deg);\n       transform: rotate(90deg);\n  }\n}\n@keyframes anim {\n  from {\n    -o-transform: rotate(90deg);\n       transform: rotate(90deg);\n  }\n}\n"
  },
  {
    "path": "test/cases/advanced-filter.css",
    "content": "div {\n  backdrop-filter: blur(2px);\n}\n\ndiv {\n  background: filter(url('image.jpg'), blur(2px));\n}\n\ndiv {\n  background: url(image.jpg), filter(url('image.jpg'), blur(2px));\n}\n"
  },
  {
    "path": "test/cases/advanced-filter.out.css",
    "content": "div {\n  -webkit-backdrop-filter: blur(2px);\n          backdrop-filter: blur(2px);\n}\n\ndiv {\n  background: -webkit-filter(url('image.jpg'), blur(2px));\n  background: filter(url('image.jpg'), blur(2px));\n}\n\ndiv {\n  background: url(image.jpg), -webkit-filter(url('image.jpg'), blur(2px));\n  background: url(image.jpg), filter(url('image.jpg'), blur(2px));\n}\n"
  },
  {
    "path": "test/cases/animation.css",
    "content": "a {\n  animation-direction: alternate;\n  animation-direction: reverse;\n  animation-direction: REVERSE;\n  animation-direction: alternate-reverse;\n  animation: rotation-reverse;\n  animation: rotation-reverse reverse;\n}\n"
  },
  {
    "path": "test/cases/animation.out.css",
    "content": "a {\n  -webkit-animation-direction: alternate;\n       -o-animation-direction: alternate;\n          animation-direction: alternate;\n  animation-direction: reverse;\n  animation-direction: REVERSE;\n  animation-direction: alternate-reverse;\n  -webkit-animation: rotation-reverse;\n       -o-animation: rotation-reverse;\n          animation: rotation-reverse;\n  animation: rotation-reverse reverse;\n}\n"
  },
  {
    "path": "test/cases/appearance.css",
    "content": "a {\n  appearance: none;\n}\n\nb {\n  appearance: auto;\n}\n"
  },
  {
    "path": "test/cases/appearance.out.css",
    "content": "a {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n}\n\nb {\n  -webkit-appearance: auto;\n     -moz-appearance: auto;\n          appearance: auto;\n}\n"
  },
  {
    "path": "test/cases/at-rules.css",
    "content": "body {\n  appearance: none;\n}\n\n.block {\n  transform: translate(20px, 30px);\n}\n\n@-webkit-region .region {\n  .block {\n    transform: translate(20px, 30px);\n  }\n\n  .block__button {\n    appearance: none;\n  }\n}\n\n@-moz-document domain('example.com') {\n  body {\n    appearance: none;\n  }\n\n  .block {\n    transform: translate(20px, 30px);\n  }\n}\n"
  },
  {
    "path": "test/cases/at-rules.out.css",
    "content": "body {\n  -webkit-appearance: none;\n     -moz-appearance: none;\n          appearance: none;\n}\n\n.block {\n  -webkit-transform: translate(20px, 30px);\n          transform: translate(20px, 30px);\n}\n\n@-webkit-region .region {\n  .block {\n    -webkit-transform: translate(20px, 30px);\n            transform: translate(20px, 30px);\n  }\n\n  .block__button {\n    -webkit-appearance: none;\n            appearance: none;\n  }\n}\n\n@-moz-document domain('example.com') {\n  body {\n    -moz-appearance: none;\n         appearance: none;\n  }\n\n  .block {\n    transform: translate(20px, 30px);\n  }\n}\n"
  },
  {
    "path": "test/cases/autofill.css",
    "content": "input:autofill {\n  background-color: red;\n}\n"
  },
  {
    "path": "test/cases/autofill.out.css",
    "content": "input:-webkit-autofill {\n  background-color: red;\n}\n\ninput:autofill {\n  background-color: red;\n}\n"
  },
  {
    "path": "test/cases/backdrop-filter.css",
    "content": "a {\n  backdrop-filter: blur(2px);\n}\n"
  },
  {
    "path": "test/cases/backdrop-filter.out.css",
    "content": "a {\n  -webkit-backdrop-filter: blur(2px);\n          backdrop-filter: blur(2px);\n}\n"
  },
  {
    "path": "test/cases/backdrop.css",
    "content": "::backdrop {\n  color: green;\n}\n"
  },
  {
    "path": "test/cases/backdrop.out.css",
    "content": "::-ms-backdrop {\n  color: green;\n}\n::backdrop {\n  color: green;\n}\n"
  },
  {
    "path": "test/cases/background-clip.css",
    "content": "a {\n  background-clip: text;\n}\n\nb {\n  background-clip: content-box;\n}\n"
  },
  {
    "path": "test/cases/background-clip.out.css",
    "content": "a {\n  -webkit-background-clip: text;\n          background-clip: text;\n}\n\nb {\n  background-clip: content-box;\n}\n"
  },
  {
    "path": "test/cases/background-size.css",
    "content": "a {\n  background-size: 20px\n}\n\nb {\n  background-size: contain\n}\n"
  },
  {
    "path": "test/cases/background-size.out.css",
    "content": "a {\n  -webkit-background-size: 20px 20px;\n     -moz-background-size: 20px;\n          background-size: 20px\n}\n\nb {\n  -webkit-background-size: contain;\n     -moz-background-size: contain;\n          background-size: contain\n}\n"
  },
  {
    "path": "test/cases/border-image.css",
    "content": "a {\n  border-image: linear-gradient(black, white) 20% fill stretch stretch;\n}\n"
  },
  {
    "path": "test/cases/border-image.out.css",
    "content": "a {\n  -o-border-image: -o-linear-gradient(black, white) 20% stretch stretch;\n     border-image: -webkit-linear-gradient(black, white) 20% fill stretch stretch;\n     border-image: linear-gradient(black, white) 20% fill stretch stretch;\n}\n"
  },
  {
    "path": "test/cases/border-radius.css",
    "content": "a {\n  border-radius: 5px;\n  border-top-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n"
  },
  {
    "path": "test/cases/border-radius.out.css",
    "content": "a {\n  -webkit-border-radius: 5px;\n     -moz-border-radius: 5px;\n          border-radius: 5px;\n  -webkit-border-top-left-radius: 3px;\n     -moz-border-radius-topleft: 3px;\n          border-top-left-radius: 3px;\n  -webkit-border-bottom-right-radius: 3px;\n     -moz-border-radius-bottomright: 3px;\n          border-bottom-right-radius: 3px;\n}\n"
  },
  {
    "path": "test/cases/cascade.css",
    "content": "a {\n  flex-direction: row;\n  mask: none\n}\n\nb { mask: none }\n"
  },
  {
    "path": "test/cases/cascade.out.css",
    "content": "a {\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: row;\n     -moz-box-orient: horizontal;\n     -moz-box-direction: normal;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  -webkit-mask: none;\n          mask: none\n}\n\nb { -webkit-mask: none; mask: none }\n"
  },
  {
    "path": "test/cases/check-down.css",
    "content": "* {\n  transition: all 1s;\n  -o-transition: all 1s\n}\n"
  },
  {
    "path": "test/cases/check-down.out.css",
    "content": "* {\n  -webkit-transition: all 1s;\n  transition: all 1s;\n  -o-transition: all 1s\n}\n"
  },
  {
    "path": "test/cases/comments.css",
    "content": "a {\n  /* transition */\n  transition: all 1s;\n  height: calc(/* comment before */100% - /* comment inside */ 10px/* comment after */);\n}\n\n/* placeholder */\n::placeholder { }\n"
  },
  {
    "path": "test/cases/comments.out.css",
    "content": "a {\n  /* transition */\n  -webkit-transition: all 1s;\n  -o-transition: all 1s;\n  transition: all 1s;\n  height: -webkit-calc(/* comment before */100% - /* comment inside */ 10px/* comment after */);\n  height: calc(/* comment before */100% - /* comment inside */ 10px/* comment after */);\n}\n\n/* placeholder */\n::-webkit-input-placeholder { }\n::placeholder { }\n"
  },
  {
    "path": "test/cases/config/browserslist",
    "content": "ie 10\n\n[development]\nchrome 25\n"
  },
  {
    "path": "test/cases/config/test.css",
    "content": "a {\n  display: flex;\n}\n"
  },
  {
    "path": "test/cases/config/test.out.css",
    "content": "a {\n  display: -ms-flexbox;\n  display: flex;\n}\n"
  },
  {
    "path": "test/cases/config/test.production.css",
    "content": "a {\n  display: -webkit-flex;\n  display: flex;\n}\n"
  },
  {
    "path": "test/cases/content.css",
    "content": "a {\n  content: \"Element 'div' not allowed as child of element 'span' in this context.\";\n}\n"
  },
  {
    "path": "test/cases/cross-fade.css",
    "content": "a {\n  background-image: cross-fade(20% url(foo.png), url(bar.png));\n}\n\nb {\n  background-image: cross-fade(url(foo.png), url(bar.png));\n}\n\nh1 {\n  background-image: cross-fade(10.823% url(foo.png), url(bar.png));\n}\n\nh2 {\n  background-image: cross-fade(0.59 url(foo.png), url(bar.png));\n}\n\nh3 {\n  background-image: cross-fade(.59 url(foo.png), url(bar.png));\n}\n\n.foo {\n  background-image: cross-fade(.59 linear-gradient(white, black), radial-gradient(circle closest-corner, white, black));\n}\n"
  },
  {
    "path": "test/cases/cross-fade.out.css",
    "content": "a {\n  background-image: -webkit-cross-fade(url(foo.png), url(bar.png), 20%);\n  background-image: cross-fade(20% url(foo.png), url(bar.png));\n}\n\nb {\n  background-image: -webkit-cross-fade(url(foo.png), url(bar.png), 0.5);\n  background-image: cross-fade(url(foo.png), url(bar.png));\n}\n\nh1 {\n  background-image: -webkit-cross-fade(url(foo.png), url(bar.png), 10.823%);\n  background-image: cross-fade(10.823% url(foo.png), url(bar.png));\n}\n\nh2 {\n  background-image: -webkit-cross-fade(url(foo.png), url(bar.png), 0.59);\n  background-image: cross-fade(0.59 url(foo.png), url(bar.png));\n}\n\nh3 {\n  background-image: -webkit-cross-fade(url(foo.png), url(bar.png), .59);\n  background-image: cross-fade(.59 url(foo.png), url(bar.png));\n}\n\n.foo {\n  background-image: -webkit-cross-fade(linear-gradient(white, black), radial-gradient(circle closest-corner, white, black), .59);\n  background-image: cross-fade(.59 linear-gradient(white, black), radial-gradient(circle closest-corner, white, black));\n}\n"
  },
  {
    "path": "test/cases/custom-prefix.css",
    "content": "a {\n  -evil-up: calc(10px + 1);\n}\n"
  },
  {
    "path": "test/cases/custom-prefix.out.css",
    "content": "a {\n  -evil-up: -webkit-calc(10px + 1);\n  -evil-up: calc(10px + 1);\n}\n"
  },
  {
    "path": "test/cases/disabled.css",
    "content": "a {\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  mask: none;\n}\n\nb {\n  /* autoprefixer: off */\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  mask: none;\n}\n\n.loud {\n  /*! autoprefixer: off */\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  mask: none;\n}\n\n.case {\n  /*autoprefixer:OFF*/\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  mask: none;\n}\n\n@support (transition: 1s) {\n  /* autoprefixer: off */\n  :fullscreen {\n    -webkit-border-radius: 4px;\n            border-radius: 4px;\n    mask: none;\n  }\n\n  ::placeholder {\n    /*autoprefixer: on*/\n    -webkit-border-radius: 4px;\n            border-radius: 4px;\n    mask: none;\n  }\n}\n"
  },
  {
    "path": "test/cases/disabled.out.css",
    "content": "a {\n  border-radius: 4px;\n  -webkit-mask: none;\n          mask: none;\n}\n\nb {\n  /* autoprefixer: off */\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  mask: none;\n}\n\n.loud {\n  /*! autoprefixer: off */\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  mask: none;\n}\n\n.case {\n  /*autoprefixer:OFF*/\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  mask: none;\n}\n\n@support (transition: 1s) {\n  /* autoprefixer: off */\n  :fullscreen {\n    -webkit-border-radius: 4px;\n            border-radius: 4px;\n    mask: none;\n  }\n\n  ::-webkit-input-placeholder {\n    /*autoprefixer: on*/\n    border-radius: 4px;\n    -webkit-mask: none;\n            mask: none;\n  }\n\n  ::placeholder {\n    /*autoprefixer: on*/\n    border-radius: 4px;\n    -webkit-mask: none;\n            mask: none;\n  }\n}\n"
  },
  {
    "path": "test/cases/double.css",
    "content": "a {\n  flex-basis: 8.33333%;\n  flex-basis: calc(100% / 12 * 1)\n}\n"
  },
  {
    "path": "test/cases/double.out.css",
    "content": "a {\n  -webkit-flex-basis: 8.33333%;\n      -ms-flex-preferred-size: 8.33333%;\n          flex-basis: 8.33333%;\n  -webkit-flex-basis: -webkit-calc(100% / 12 * 1);\n      -ms-flex-preferred-size: calc(100% / 12 * 1);\n          flex-basis: calc(100% / 12 * 1)\n}\n"
  },
  {
    "path": "test/cases/element.css",
    "content": "div {\n  background: element(#id);\n}\n\ndiv {\n  background: url(image.jpg), element(#id);\n}\n"
  },
  {
    "path": "test/cases/element.out.css",
    "content": "div {\n  background: -moz-element(#id);\n  background: element(#id);\n}\n\ndiv {\n  background: url(image.jpg), -moz-element(#id);\n  background: url(image.jpg), element(#id);\n}\n"
  },
  {
    "path": "test/cases/example.css",
    "content": "::placeholder {\n  color: gray;\n}\n\n.image {\n  width: stretch;\n}\n"
  },
  {
    "path": "test/cases/example.out.css",
    "content": "::-moz-placeholder {\n  color: gray;\n}\n\n::placeholder {\n  color: gray;\n}\n\n.image {\n  width: -webkit-fill-available;\n  width: -moz-available;\n  width: stretch;\n}\n"
  },
  {
    "path": "test/cases/file-selector-button.css",
    "content": "::file-selector-button {\n  background: black\n}\n\ninput::file-selector-button {\n\tcolor: black;\n}\n\ninput:hover::file-selector-button {\n\tcolor: white;\n}\n"
  },
  {
    "path": "test/cases/file-selector-button.out.css",
    "content": "::-webkit-file-upload-button {\n  background: black\n}\n\n::file-selector-button {\n  background: black\n}\n\ninput::-webkit-file-upload-button {\n\tcolor: black;\n}\n\ninput::file-selector-button {\n\tcolor: black;\n}\n\ninput:hover::-webkit-file-upload-button {\n\tcolor: white;\n}\n\ninput:hover::file-selector-button {\n\tcolor: white;\n}\n"
  },
  {
    "path": "test/cases/filter.css",
    "content": "a {\n  filter: blur(10px);\n  transition: filter 2s;\n}\n\ndiv {\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);\n}\n\nb {\n  filter: alpha(opacity=100);\n}\n\nem {\n  filter: Alpha(opacity=100);\n}\n"
  },
  {
    "path": "test/cases/filter.out.css",
    "content": "a {\n  -webkit-filter: blur(10px);\n          filter: blur(10px);\n  -webkit-transition: -webkit-filter 2s;\n  transition: -webkit-filter 2s;\n  transition: filter 2s;\n  transition: filter 2s, -webkit-filter 2s;\n}\n\ndiv {\n  filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);\n}\n\nb {\n  filter: alpha(opacity=100);\n}\n\nem {\n  filter: Alpha(opacity=100);\n}\n"
  },
  {
    "path": "test/cases/flex-rewrite.css",
    "content": ".a {\n  flex-grow: 0;\n}\n"
  },
  {
    "path": "test/cases/flex-rewrite.out.css",
    "content": ".a {\n  -webkit-box-flex: 0;\n  -webkit-flex-grow: 0;\n     -moz-box-flex: 0;\n      -ms-flex-positive: 0;\n          flex-grow: 0;\n}\n"
  },
  {
    "path": "test/cases/flexbox.css",
    "content": "a {\n  -js-display: flex;\n  display: flex;\n  flex-flow: row;\n  order: 0;\n  flex: 0 1 2;\n  transition: flex 200ms;\n}\n.inline {\n  display: inline-flex;\n  align-self: auto;\n  align-content: stretch;\n  flex: auto;\n}\n\n.a {\n  display: flex;\n  flex-direction: row;\n  justify-content: flex-start;\n  align-items: flex-start;\n  flex-wrap: nowrap;\n  align-content: flex-start;\n  align-self: flex-start;\n  flex: none;\n}\n.b {\n  display: flex;\n  flex-direction: row-reverse;\n  justify-content: flex-end;\n  align-items: flex-end;\n  flex-wrap: wrap;\n  align-content: flex-end;\n  align-self: flex-end;\n  flex-shrink: 1;\n}\n.c {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  flex-wrap: reverse-wrap;\n  align-content: center;\n  align-self: center;\n  flex-basis: auto;\n}\n.e {\n  display: flex;\n  flex-direction: column-reverse;\n  justify-content: space-between;\n  align-items: baseline;\n  align-content: space-between;\n  align-self: baseline;\n}\n.f {\n  display: flex;\n  justify-content: space-around;\n  align-items: stretch;\n  align-content: space-around;\n  align-self: stretch;\n}\n.g {\n  display: flex;\n  flex: calc(1em + 1px) 0 0;\n}\n.h {\n  flex-flow: column wrap;\n}\n.i {\n  flex-flow: nowrap;\n}\n.inherit {\n  order: inherit;\n  flex-direction: inherit;\n}\n@supports (display: flex) {\n  .foo {\n    display: flex;\n  }\n}\n@supports (flex: auto) {\n  .foo {\n    flex: auto;\n  }\n}\n"
  },
  {
    "path": "test/cases/flexbox.out.css",
    "content": "a {\n  -js-display: flex;\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-flow: row;\n     -moz-box-orient: horizontal;\n     -moz-box-direction: normal;\n      -ms-flex-flow: row;\n          flex-flow: row;\n  -webkit-box-ordinal-group: 1;\n  -webkit-order: 0;\n     -moz-box-ordinal-group: 1;\n      -ms-flex-order: 0;\n          order: 0;\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 1 2;\n     -moz-box-flex: 0;\n      -ms-flex: 0 1 2;\n          flex: 0 1 2;\n  -webkit-transition: -webkit-box-flex 200ms, -webkit-flex 200ms;\n  transition: -webkit-box-flex 200ms, -webkit-flex 200ms;\n  transition: flex 200ms;\n  transition: flex 200ms, -webkit-box-flex 200ms, -webkit-flex 200ms, -moz-box-flex 200ms, -ms-flex 200ms;\n}\n.inline {\n  display: -webkit-inline-box;\n  display: -webkit-inline-flex;\n  display: -moz-inline-box;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -webkit-align-self: auto;\n      -ms-flex-item-align: auto;\n          align-self: auto;\n  -webkit-align-content: stretch;\n      -ms-flex-line-pack: stretch;\n          align-content: stretch;\n  -webkit-box-flex: 1;\n  -webkit-flex: auto;\n     -moz-box-flex: 1;\n      -ms-flex: auto;\n          flex: auto;\n}\n\n.a {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: row;\n     -moz-box-orient: horizontal;\n     -moz-box-direction: normal;\n      -ms-flex-direction: row;\n          flex-direction: row;\n  -webkit-box-pack: start;\n  -webkit-justify-content: flex-start;\n     -moz-box-pack: start;\n      -ms-flex-pack: start;\n          justify-content: flex-start;\n  -webkit-box-align: start;\n  -webkit-align-items: flex-start;\n     -moz-box-align: start;\n      -ms-flex-align: start;\n          align-items: flex-start;\n  -webkit-flex-wrap: nowrap;\n      -ms-flex-wrap: nowrap;\n          flex-wrap: nowrap;\n  -webkit-align-content: flex-start;\n      -ms-flex-line-pack: start;\n          align-content: flex-start;\n  -webkit-align-self: flex-start;\n      -ms-flex-item-align: start;\n          align-self: flex-start;\n  -webkit-box-flex: 0;\n  -webkit-flex: none;\n     -moz-box-flex: 0;\n      -ms-flex: none;\n          flex: none;\n}\n.b {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: reverse;\n  -webkit-flex-direction: row-reverse;\n     -moz-box-orient: horizontal;\n     -moz-box-direction: reverse;\n      -ms-flex-direction: row-reverse;\n          flex-direction: row-reverse;\n  -webkit-box-pack: end;\n  -webkit-justify-content: flex-end;\n     -moz-box-pack: end;\n      -ms-flex-pack: end;\n          justify-content: flex-end;\n  -webkit-box-align: end;\n  -webkit-align-items: flex-end;\n     -moz-box-align: end;\n      -ms-flex-align: end;\n          align-items: flex-end;\n  -webkit-flex-wrap: wrap;\n      -ms-flex-wrap: wrap;\n          flex-wrap: wrap;\n  -webkit-align-content: flex-end;\n      -ms-flex-line-pack: end;\n          align-content: flex-end;\n  -webkit-align-self: flex-end;\n      -ms-flex-item-align: end;\n          align-self: flex-end;\n  -webkit-flex-shrink: 1;\n      -ms-flex-negative: 1;\n          flex-shrink: 1;\n}\n.c {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-direction: column;\n     -moz-box-orient: vertical;\n     -moz-box-direction: normal;\n      -ms-flex-direction: column;\n          flex-direction: column;\n  -webkit-box-pack: center;\n  -webkit-justify-content: center;\n     -moz-box-pack: center;\n      -ms-flex-pack: center;\n          justify-content: center;\n  -webkit-box-align: center;\n  -webkit-align-items: center;\n     -moz-box-align: center;\n      -ms-flex-align: center;\n          align-items: center;\n  -webkit-flex-wrap: reverse-wrap;\n      -ms-flex-wrap: reverse-wrap;\n          flex-wrap: reverse-wrap;\n  -webkit-align-content: center;\n      -ms-flex-line-pack: center;\n          align-content: center;\n  -webkit-align-self: center;\n      -ms-flex-item-align: center;\n          align-self: center;\n  -webkit-flex-basis: auto;\n      -ms-flex-preferred-size: auto;\n          flex-basis: auto;\n}\n.e {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: reverse;\n  -webkit-flex-direction: column-reverse;\n     -moz-box-orient: vertical;\n     -moz-box-direction: reverse;\n      -ms-flex-direction: column-reverse;\n          flex-direction: column-reverse;\n  -webkit-box-pack: justify;\n  -webkit-justify-content: space-between;\n     -moz-box-pack: justify;\n      -ms-flex-pack: justify;\n          justify-content: space-between;\n  -webkit-box-align: baseline;\n  -webkit-align-items: baseline;\n     -moz-box-align: baseline;\n      -ms-flex-align: baseline;\n          align-items: baseline;\n  -webkit-align-content: space-between;\n      -ms-flex-line-pack: justify;\n          align-content: space-between;\n  -webkit-align-self: baseline;\n      -ms-flex-item-align: baseline;\n          align-self: baseline;\n}\n.f {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-justify-content: space-around;\n      -ms-flex-pack: distribute;\n          justify-content: space-around;\n  -webkit-box-align: stretch;\n  -webkit-align-items: stretch;\n     -moz-box-align: stretch;\n      -ms-flex-align: stretch;\n          align-items: stretch;\n  -webkit-align-content: space-around;\n      -ms-flex-line-pack: distribute;\n          align-content: space-around;\n  -webkit-align-self: stretch;\n      -ms-flex-item-align: stretch;\n          align-self: stretch;\n}\n.g {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: -moz-box;\n  display: -ms-flexbox;\n  display: flex;\n  -webkit-box-flex: -webkit-calc(1em + 1px);\n  -webkit-flex: -webkit-calc(1em + 1px) 0 0;\n     -moz-box-flex: calc(1em + 1px);\n      -ms-flex: calc(1em + 1px) 0 0px;\n          flex: calc(1em + 1px) 0 0;\n}\n.h {\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: normal;\n  -webkit-flex-flow: column wrap;\n     -moz-box-orient: vertical;\n     -moz-box-direction: normal;\n      -ms-flex-flow: column wrap;\n          flex-flow: column wrap;\n}\n.i {\n  -webkit-flex-flow: nowrap;\n      -ms-flex-flow: nowrap;\n          flex-flow: nowrap;\n}\n.inherit {\n  -webkit-box-ordinal-group: inherit;\n  -webkit-order: inherit;\n     -moz-box-ordinal-group: inherit;\n      -ms-flex-order: inherit;\n          order: inherit;\n  -webkit-box-orient: inherit;\n  -webkit-box-direction: inherit;\n  -webkit-flex-direction: inherit;\n     -moz-box-orient: inherit;\n     -moz-box-direction: inherit;\n      -ms-flex-direction: inherit;\n          flex-direction: inherit;\n}\n@supports ((display: -webkit-flex) or (display: flex)) {\n  .foo {\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: -moz-box;\n    display: -ms-flexbox;\n    display: flex;\n  }\n}\n@supports ((-webkit-flex: auto) or (flex: auto)) {\n  .foo {\n    -webkit-box-flex: 1;\n    -webkit-flex: auto;\n       -moz-box-flex: 1;\n        -ms-flex: auto;\n            flex: auto;\n  }\n}\n"
  },
  {
    "path": "test/cases/fullscreen.css",
    "content": ":fullscreen {\n  background: black\n}\n"
  },
  {
    "path": "test/cases/fullscreen.out.css",
    "content": ":-webkit-full-screen {\n  background: black\n}\n:fullscreen {\n  background: black\n}\n"
  },
  {
    "path": "test/cases/gradient-fix.css",
    "content": ".test {\n  background-image: -webkit-linear-gradient(yellow 50%, red 50%);\n  background-image: linear-gradient(to   , red 50%);\n}\n"
  },
  {
    "path": "test/cases/gradient-fix.out.css",
    "content": ".test {\n  background-image: -webkit-linear-gradient(yellow 50%, red 50%);\n  background-image: -webkit-linear-gradient(red 50%);\n  background-image: -moz-linear-gradient(red 50%);\n  background-image: -o-linear-gradient(red 50%);\n  background-image: linear-gradient(to   , red 50%);\n}\n"
  },
  {
    "path": "test/cases/gradient.css",
    "content": "a {\n  background: linear-gradient(350.5deg, white, black), linear-gradient(-130deg, black, white), linear-gradient(45deg, black, white);\n}\n\nb {\n  background-image: linear-gradient(rgba(0,0,0,1), white), linear-gradient(white, black);\n}\n\nstrong {\n  background: linear-gradient(to top, transparent, rgba(0, 0, 0, 0.8) 20px, #000 30px, #000) no-repeat;\n}\n\ndiv {\n  background-image: radial-gradient(to left, white, black), repeating-linear-gradient(to bottom right, black, white), repeating-radial-gradient(to top, aqua, red);\n}\n\n.old-radial {\n  background: radial-gradient(0 50%, ellipse farthest-corner, black, white);\n}\n\n.simple1 {\n  background: linear-gradient(black, white);\n}\n\n.simple2 {\n  background: linear-gradient(to left, black 0%, rgba(0, 0, 0, 0.5)50%, white 100%);\n}\n\n.simple3 {\n  background: linear-gradient(to left, black 50%, white 100%);\n}\n\n.simple4 {\n  background: linear-gradient(to right top, black, white);\n}\n\n.direction {\n  background: linear-gradient(top left, black, rgba(0, 0, 0, 0.5), white);\n}\n\n.silent {\n  background: -webkit-linear-gradient(top left, black, white);\n}\n\n.radial {\n  background: radial-gradient(farthest-side at 0 50%, white, black);\n}\n\n.second {\n  background: red linear-gradient(red, blue);\n  background: url('logo.png'), linear-gradient(#fff, #000);\n}\n\n.px {\n  background: linear-gradient(black 0, white 100px);\n}\n\n.list {\n  list-style-image: linear-gradient(white, black);\n}\n\n.mask {\n  mask: linear-gradient(white, black);\n}\n\n.newline {\n  background-image:\n      linear-gradient( white, black ),\n      linear-gradient( black, white );\n}\n\n.convert {\n  background: linear-gradient(0deg, white, black);\n  background: linear-gradient(90deg, white, black);\n  background: linear-gradient(180deg, white, black);\n  background: linear-gradient(270deg, white, black);\n}\n\n.grad {\n  background: linear-gradient(1grad, white, black);\n}\n\n.rad {\n  background: linear-gradient(1rad, white, black);\n}\n\n.turn {\n  background: linear-gradient(0.3turn, white, black);\n}\n\n.norm {\n  background: linear-gradient(-90deg, white, black);\n}\n\n.mask {\n  mask-image: radial-gradient(circle at 86% 86%, transparent 8px, black 8px);\n}\n\n.cover {\n  background: radial-gradient(ellipse cover at center, white, black);\n}\n\n.contain {\n  background: radial-gradient(contain at center, white, black);\n}\n\n.no-div {\n  background: linear-gradient(black);\n}\n\n.background-shorthand {\n  background: radial-gradient(#FFF, transparent) 0 0 / cover no-repeat #F0F;\n}\n\n.background-advanced {\n  background: radial-gradient(ellipse farthest-corner at 5px 15px, rgba(214, 168, 18, 0.7) 0%, rgba(255, 21, 177, 0.7) 50%, rgba(210, 7, 148, 0.7) 95%),\n              radial-gradient(#FFF, transparent),\n              url(path/to/image.jpg) 50%/cover;\n}\n\n.multiradial {\n  mask-image: radial-gradient(circle closest-corner at 100% 50%, #000, transparent);\n}\n\n.broken {\n  mask-image: radial-gradient(white, black);\n}\n\n.loop {\n  background-image: url(\"https://test.com/lol(test.png\"), radial-gradient(yellow, black, yellow);\n}\n\n.unitless-zero {\n  background-image: linear-gradient(0, green, blue);\n  background: repeating-linear-gradient(0, blue, red 33.3%)\n}\n\n.zero-grad {\n  background: linear-gradient(0grad, green, blue);\n  background-image: repeating-linear-gradient(0grad, blue, red 33.3%)\n}\n\n.zero-rad {\n  background: linear-gradient(0rad, green, blue);\n}\n\n.zero-turn {\n  background: linear-gradient(0turn, green, blue);\n}\n"
  },
  {
    "path": "test/cases/gradient.out.css",
    "content": "a {\n  background: -webkit-linear-gradient(99.5deg, white, black), -webkit-linear-gradient(220deg, black, white), -webkit-linear-gradient(45deg, black, white);\n  background: -o-linear-gradient(99.5deg, white, black), -o-linear-gradient(220deg, black, white), -o-linear-gradient(45deg, black, white);\n  background: linear-gradient(350.5deg, white, black), linear-gradient(-130deg, black, white), linear-gradient(45deg, black, white);\n}\n\nb {\n  background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1)), to(white)), -webkit-gradient(linear, left top, left bottom, from(white), to(black));\n  background-image: -webkit-linear-gradient(rgba(0,0,0,1), white), -webkit-linear-gradient(white, black);\n  background-image: -o-linear-gradient(rgba(0,0,0,1), white), -o-linear-gradient(white, black);\n  background-image: linear-gradient(rgba(0,0,0,1), white), linear-gradient(white, black);\n}\n\nstrong {\n  background: -webkit-linear-gradient(bottom, transparent, rgba(0, 0, 0, 0.8) 20px, #000 30px, #000) no-repeat;\n  background: -o-linear-gradient(bottom, transparent, rgba(0, 0, 0, 0.8) 20px, #000 30px, #000) no-repeat;\n  background: linear-gradient(to top, transparent, rgba(0, 0, 0, 0.8) 20px, #000 30px, #000) no-repeat;\n}\n\ndiv {\n  background-image: -webkit-radial-gradient(right, white, black), -webkit-repeating-linear-gradient(top left, black, white), -webkit-repeating-radial-gradient(bottom, aqua, red);\n  background-image: -o-radial-gradient(right, white, black), -o-repeating-linear-gradient(top left, black, white), -o-repeating-radial-gradient(bottom, aqua, red);\n  background-image: radial-gradient(to left, white, black), repeating-linear-gradient(to bottom right, black, white), repeating-radial-gradient(to top, aqua, red);\n}\n\n.old-radial {\n  background: -webkit-radial-gradient(0 50%, ellipse farthest-corner, black, white);\n  background: -o-radial-gradient(0 50%, ellipse farthest-corner, black, white);\n  background: radial-gradient(0 50%, ellipse farthest-corner, black, white);\n}\n\n.simple1 {\n  background: -webkit-gradient(linear, left top, left bottom, from(black), to(white));\n  background: -webkit-linear-gradient(black, white);\n  background: -o-linear-gradient(black, white);\n  background: linear-gradient(black, white);\n}\n\n.simple2 {\n  background: -webkit-gradient(linear, right top, left top, from(black), color-stop(50%, rgba(0, 0, 0, 0.5)), to(white));\n  background: -webkit-linear-gradient(right, black 0%, rgba(0, 0, 0, 0.5)50%, white 100%);\n  background: -o-linear-gradient(right, black 0%, rgba(0, 0, 0, 0.5)50%, white 100%);\n  background: linear-gradient(to left, black 0%, rgba(0, 0, 0, 0.5)50%, white 100%);\n}\n\n.simple3 {\n  background: -webkit-gradient(linear, right top, left top, color-stop(50%, black), to(white));\n  background: -webkit-linear-gradient(right, black 50%, white 100%);\n  background: -o-linear-gradient(right, black 50%, white 100%);\n  background: linear-gradient(to left, black 50%, white 100%);\n}\n\n.simple4 {\n  background: -webkit-gradient(linear, left bottom, right top, from(black), to(white));\n  background: -webkit-linear-gradient(left bottom, black, white);\n  background: -o-linear-gradient(left bottom, black, white);\n  background: linear-gradient(to right top, black, white);\n}\n\n.direction {\n  background: -webkit-gradient(linear, left top, right bottom, from(black), color-stop(rgba(0, 0, 0, 0.5)), to(white));\n  background: -webkit-linear-gradient(top left, black, rgba(0, 0, 0, 0.5), white);\n  background: -o-linear-gradient(top left, black, rgba(0, 0, 0, 0.5), white);\n  background: linear-gradient(top left, black, rgba(0, 0, 0, 0.5), white);\n}\n\n.silent {\n  background: -webkit-linear-gradient(top left, black, white);\n}\n\n.radial {\n  background: -webkit-radial-gradient(0 50%, farthest-side, white, black);\n  background: -o-radial-gradient(0 50%, farthest-side, white, black);\n  background: radial-gradient(farthest-side at 0 50%, white, black);\n}\n\n.second {\n  background: red -webkit-gradient(linear, left top, left bottom, from(red), to(blue));\n  background: red -webkit-linear-gradient(red, blue);\n  background: red -o-linear-gradient(red, blue);\n  background: red linear-gradient(red, blue);\n  background: url('logo.png'), -webkit-gradient(linear, left top, left bottom, from(#fff), to(#000));\n  background: url('logo.png'), -webkit-linear-gradient(#fff, #000);\n  background: url('logo.png'), -o-linear-gradient(#fff, #000);\n  background: url('logo.png'), linear-gradient(#fff, #000);\n}\n\n.px {\n  background: -webkit-linear-gradient(black 0, white 100px);\n  background: -o-linear-gradient(black 0, white 100px);\n  background: linear-gradient(black 0, white 100px);\n}\n\n.list {\n  list-style-image: -webkit-gradient(linear, left top, left bottom, from(white), to(black));\n  list-style-image: -webkit-linear-gradient(white, black);\n  list-style-image: linear-gradient(white, black);\n}\n\n.mask {\n  -webkit-mask: -webkit-gradient(linear, left top, left bottom, from(white), to(black));\n  -webkit-mask: -webkit-linear-gradient(white, black);\n          mask: -webkit-gradient(linear, left top, left bottom, from(white), to(black));\n          mask: linear-gradient(white, black);\n}\n\n.newline {\n  background-image:\n      -webkit-gradient( linear, left top, left bottom, from(white), to(black) ),\n      -webkit-gradient( linear, left top, left bottom, from(black), to(white) );\n  background-image:\n      -webkit-linear-gradient( white, black ),\n      -webkit-linear-gradient( black, white );\n  background-image:\n      -o-linear-gradient( white, black ),\n      -o-linear-gradient( black, white );\n  background-image:\n      linear-gradient( white, black ),\n      linear-gradient( black, white );\n}\n\n.convert {\n  background: -webkit-gradient(linear, left bottom, left top, from(white), to(black));\n  background: -webkit-linear-gradient(bottom, white, black);\n  background: -o-linear-gradient(bottom, white, black);\n  background: linear-gradient(0deg, white, black);\n  background: -webkit-gradient(linear, left top, right top, from(white), to(black));\n  background: -webkit-linear-gradient(left, white, black);\n  background: -o-linear-gradient(left, white, black);\n  background: linear-gradient(90deg, white, black);\n  background: -webkit-gradient(linear, left top, left bottom, from(white), to(black));\n  background: -webkit-linear-gradient(top, white, black);\n  background: -o-linear-gradient(top, white, black);\n  background: linear-gradient(180deg, white, black);\n  background: -webkit-gradient(linear, right top, left top, from(white), to(black));\n  background: -webkit-linear-gradient(right, white, black);\n  background: -o-linear-gradient(right, white, black);\n  background: linear-gradient(270deg, white, black);\n}\n\n.grad {\n  background: -webkit-linear-gradient(89.1deg, white, black);\n  background: -o-linear-gradient(89.1deg, white, black);\n  background: linear-gradient(1grad, white, black);\n}\n\n.rad {\n  background: -webkit-linear-gradient(32.704deg, white, black);\n  background: -o-linear-gradient(32.704deg, white, black);\n  background: linear-gradient(1rad, white, black);\n}\n\n.turn {\n  background: -webkit-linear-gradient(342deg, white, black);\n  background: -o-linear-gradient(342deg, white, black);\n  background: linear-gradient(0.3turn, white, black);\n}\n\n.norm {\n  background: -webkit-gradient(linear, right top, left top, from(white), to(black));\n  background: -webkit-linear-gradient(right, white, black);\n  background: -o-linear-gradient(right, white, black);\n  background: linear-gradient(-90deg, white, black);\n}\n\n.mask {\n  -webkit-mask-image: -webkit-radial-gradient(86% 86%, circle, transparent 8px, black 8px);\n          mask-image: radial-gradient(circle at 86% 86%, transparent 8px, black 8px);\n}\n\n.cover {\n  background: -webkit-radial-gradient(center, ellipse cover, white, black);\n  background: -o-radial-gradient(center, ellipse cover, white, black);\n  background: radial-gradient(ellipse cover at center, white, black);\n}\n\n.contain {\n  background: -webkit-radial-gradient(center, contain, white, black);\n  background: -o-radial-gradient(center, contain, white, black);\n  background: radial-gradient(contain at center, white, black);\n}\n\n.no-div {\n  background: -webkit-gradient(linear, left top, left bottom, from(black));\n  background: -webkit-linear-gradient(black);\n  background: -o-linear-gradient(black);\n  background: linear-gradient(black);\n}\n\n.background-shorthand {\n  background: -webkit-radial-gradient(#FFF, transparent) 0 0 / cover no-repeat #F0F;\n  background: -o-radial-gradient(#FFF, transparent) 0 0 / cover no-repeat #F0F;\n  background: radial-gradient(#FFF, transparent) 0 0 / cover no-repeat #F0F;\n}\n\n.background-advanced {\n  background: -webkit-radial-gradient(5px 15px, ellipse farthest-corner, rgba(214, 168, 18, 0.7) 0%, rgba(255, 21, 177, 0.7) 50%, rgba(210, 7, 148, 0.7) 95%),\n              -webkit-radial-gradient(#FFF, transparent),\n              url(path/to/image.jpg) 50%/cover;\n  background: -o-radial-gradient(5px 15px, ellipse farthest-corner, rgba(214, 168, 18, 0.7) 0%, rgba(255, 21, 177, 0.7) 50%, rgba(210, 7, 148, 0.7) 95%),\n              -o-radial-gradient(#FFF, transparent),\n              url(path/to/image.jpg) 50%/cover;\n  background: radial-gradient(ellipse farthest-corner at 5px 15px, rgba(214, 168, 18, 0.7) 0%, rgba(255, 21, 177, 0.7) 50%, rgba(210, 7, 148, 0.7) 95%),\n              radial-gradient(#FFF, transparent),\n              url(path/to/image.jpg) 50%/cover;\n}\n\n.multiradial {\n  -webkit-mask-image: -webkit-radial-gradient(100% 50%, circle closest-corner, #000, transparent);\n          mask-image: radial-gradient(circle closest-corner at 100% 50%, #000, transparent);\n}\n\n.broken {\n  -webkit-mask-image: -webkit-radial-gradient(white, black);\n          mask-image: radial-gradient(white, black);\n}\n\n.loop {\n  background-image: url(\"https://test.com/lol(test.png\"), -webkit-radial-gradient(yellow, black, yellow);\n  background-image: url(\"https://test.com/lol(test.png\"), -o-radial-gradient(yellow, black, yellow);\n  background-image: url(\"https://test.com/lol(test.png\"), radial-gradient(yellow, black, yellow);\n}\n\n.unitless-zero {\n  background-image: -webkit-gradient(linear, left bottom, left top, from(green), to(blue));\n  background-image: -webkit-linear-gradient(bottom, green, blue);\n  background-image: -o-linear-gradient(bottom, green, blue);\n  background-image: linear-gradient(0, green, blue);\n  background: -webkit-repeating-linear-gradient(bottom, blue, red 33.3%);\n  background: -o-repeating-linear-gradient(bottom, blue, red 33.3%);\n  background: repeating-linear-gradient(0, blue, red 33.3%)\n}\n\n.zero-grad {\n  background: -webkit-gradient(linear, left bottom, left top, from(green), to(blue));\n  background: -webkit-linear-gradient(bottom, green, blue);\n  background: -o-linear-gradient(bottom, green, blue);\n  background: linear-gradient(0grad, green, blue);\n  background-image: -webkit-repeating-linear-gradient(bottom, blue, red 33.3%);\n  background-image: -o-repeating-linear-gradient(bottom, blue, red 33.3%);\n  background-image: repeating-linear-gradient(0grad, blue, red 33.3%)\n}\n\n.zero-rad {\n  background: -webkit-gradient(linear, left bottom, left top, from(green), to(blue));\n  background: -webkit-linear-gradient(bottom, green, blue);\n  background: -o-linear-gradient(bottom, green, blue);\n  background: linear-gradient(0rad, green, blue);\n}\n\n.zero-turn {\n  background: -webkit-gradient(linear, left bottom, left top, from(green), to(blue));\n  background: -webkit-linear-gradient(bottom, green, blue);\n  background: -o-linear-gradient(bottom, green, blue);\n  background: linear-gradient(0turn, green, blue);\n}\n"
  },
  {
    "path": "test/cases/grid-area-media-sequence.css",
    "content": ".grid-template-sequence {\n  display: grid;\n  grid-template:\n      \"foo foo\"\n      \"bar bar\"\n      \"baz baz\"\n      / 1fr 1fr;\n}\n\n@media (min-width: 300px) {\n  .grid-template-sequence {\n    grid-template:\n      \"foo foo\"\n      \"bar bar\" 20px\n      / 1fr 1fr;\n  }\n}\n\n@media (min-width: 600px) {\n  .grid-template-sequence {\n    grid-template:\n      \"foo foo\"\n      \"bar bar\" 20px\n      / 1fr 1fr;\n  }\n}\n\n@media (min-width: 900px) {\n  .grid-template-sequence {\n    grid-template:\n      \"x x\"\n      \"foo foo\"\n      \"bar bar\" 20px\n      / 1fr 1fr;\n  }\n}\n\n.foo {\n  grid-area: foo;\n}\n\n.bar {\n  grid-area: bar;\n}\n\n.x {\n  grid-area: x;\n}\n\n@media (max-width: 900px) {\n  .grid-2 {\n    grid-template:\n      \"a a\"\n      \"a a\"\n      \"b b\" 20px\n      / 1fr 1fr;\n  }\n}\n\n@media (max-width: 400px) {\n  .grid-2 {\n    grid-template:\n      \"a a\"\n      \"a a\"\n      \"b b\" 20px\n      / 1fr 1fr;\n  }\n}\n"
  },
  {
    "path": "test/cases/grid-area-media-sequence.out.css",
    "content": ".grid-template-sequence {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-rows: auto auto auto;\n  -ms-grid-columns: 1fr 1fr;\n  grid-template:\n      \"foo foo\"\n      \"bar bar\"\n      \"baz baz\"\n      / 1fr 1fr;\n}\n\n@media (min-width: 300px) {\n  .grid-template-sequence {\n    -ms-grid-rows: auto 20px;\n    -ms-grid-columns: 1fr 1fr;\n    grid-template:\n      \"foo foo\"\n      \"bar bar\" 20px\n      / 1fr 1fr;\n  }\n}\n\n@media (min-width: 600px) {\n  .grid-template-sequence {\n    -ms-grid-rows: auto 20px;\n    -ms-grid-columns: 1fr 1fr;\n    grid-template:\n      \"foo foo\"\n      \"bar bar\" 20px\n      / 1fr 1fr;\n  }\n}\n\n@media (min-width: 900px) {\n  .grid-template-sequence {\n    -ms-grid-rows: auto auto 20px;\n    -ms-grid-columns: 1fr 1fr;\n    grid-template:\n      \"x x\"\n      \"foo foo\"\n      \"bar bar\" 20px\n      / 1fr 1fr;\n  }\n}\n\n.foo {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: foo;\n}\n\n.bar {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: bar;\n}\n\n.x {\n  grid-area: x;\n}\n\n@media (min-width: 300px) {\n  .foo {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n  .bar {\n    -ms-grid-row: 2;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n}\n\n@media (min-width: 600px) {\n  .foo {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n  .bar {\n    -ms-grid-row: 2;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n}\n\n@media (min-width: 900px) {\n  .foo {\n    -ms-grid-row: 2;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n  .bar {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n  .x {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n}\n\n@media (max-width: 900px) {\n  .grid-2 {\n    -ms-grid-rows: auto auto 20px;\n    -ms-grid-columns: 1fr 1fr;\n    grid-template:\n      \"a a\"\n      \"a a\"\n      \"b b\" 20px\n      / 1fr 1fr;\n  }\n}\n\n@media (max-width: 400px) {\n  .grid-2 {\n    -ms-grid-rows: auto auto 20px;\n    -ms-grid-columns: 1fr 1fr;\n    grid-template:\n      \"a a\"\n      \"a a\"\n      \"b b\" 20px\n      / 1fr 1fr;\n  }\n}\n"
  },
  {
    "path": "test/cases/grid-area.css",
    "content": ".a {\n  grid-area: 5 / 1 / span 1 / span 5;\n}\n\n.b {\n  grid-area: span 1 / span 3 / 4 / 4;\n}\n\n.c {\n  grid-area: 2 / 2;\n}\n\n.d {\n  grid-area: \"custom-ident\";\n}\n\n.e {\n  grid-area: 2 / 2 / 3 / 8;\n}\n\n.f {\n  grid-area: 2 / 2 / 3;\n}\n\n/* emit warning */\n.g {\n  grid-area: 3 / 1;\n  grid-row: 1;\n  grid-column: 2;\n}\n\n.h {\n  grid-area: 3 / 1;\n  grid-column: 1 / span 4;\n}\n\n/* there should be no warning */\n.i {\n  grid-area: 3 / 1;\n  grid-column-end: span 4;\n}\n\n.j {\n  grid-area: 3 / 1;\n  grid-row-end: span 4;\n}\n"
  },
  {
    "path": "test/cases/grid-area.out.css",
    "content": ".a {\n  -ms-grid-row: 5;\n  -ms-grid-row-span: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 5;\n  grid-area: 5 / 1 / span 1 / span 5;\n}\n\n.b {\n  -ms-grid-row: 3;\n  -ms-grid-row-span: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 3;\n  grid-area: span 1 / span 3 / 4 / 4;\n}\n\n.c {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n  grid-area: 2 / 2;\n}\n\n.d {\n  grid-area: \"custom-ident\";\n}\n\n.e {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 1;\n  -ms-grid-column: 2;\n  -ms-grid-column-span: 6;\n  grid-area: 2 / 2 / 3 / 8;\n}\n\n.f {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 1;\n  -ms-grid-column: 2;\n  grid-area: 2 / 2 / 3;\n}\n\n/* emit warning */\n.g {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n  grid-area: 3 / 1;\n  grid-row: 1;\n  grid-column: 2;\n}\n\n.h {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n  grid-area: 3 / 1;\n  -ms-grid-column-span: 4;\n  grid-column: 1 / span 4;\n}\n\n/* there should be no warning */\n.i {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n  grid-area: 3 / 1;\n  -ms-grid-column-span: 4;\n  grid-column-end: span 4;\n}\n\n.j {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n  grid-area: 3 / 1;\n  -ms-grid-row-span: 4;\n  grid-row-end: span 4;\n}\n"
  },
  {
    "path": "test/cases/grid-areas-duplicate-complex.css",
    "content": "/*******************************\\\n  COMPLEX DUPLICATE AREAS TEST 1\n\\*******************************/\n\n#main > #content {\n  grid-area: content;\n}\n#main > .sidebar {\n  grid-area: first-sb;\n}\n#main > .sidebar.second {\n  grid-area: second-sb;\n}\n@media (min-width: 660px) {\n  #main {\n    display: grid;\n    grid-template: \"..... ... content .....\"/20% 1em 1fr 20%;\n  }\n  #main.has-first-sidebar {\n    grid-template: \"..... ... first-sb .... content .....\"/20% 1em 300px 30px 1fr 20%;\n  }\n  #main.has-second-sidebar {\n    grid-template: \"..... ... content .... second-sb .....\"/20% 1em 1fr 30px 300px 20%;\n  }\n  #main.has-first-sidebar.has-second-sidebar {\n    grid-template: \"..... ... first-sb .... content .... second-sb .....\"/20% 1em 200px 30px 1fr 30px 200px 20%;\n  }\n}\n@media (max-width: 1499px) {\n  #main {\n    grid-template: \"..... ... content .....\"/10% 1em 1fr 10%;\n  }\n  #main.has-first-sidebar {\n    grid-template: \"..... ... first-sb .... content .....\"/10% 1em 250px 30px 1fr 10%;\n  }\n  #main.has-second-sidebar {\n    grid-template: \"..... ... content .... second-sb .....\"/10% 1em 1fr 30px 250px 10%;\n  }\n  #main.has-first-sidebar.has-second-sidebar {\n    grid-template: \"..... ... first-sb .... content .... second-sb .....\"/10% 1em 200px 30px 1fr 30px 200px 10%;\n  }\n}\n@media (max-width: 959px) {\n  #main {\n    grid-template: \"..... ... content .....\"/2em 1em 1fr 2em;\n  }\n  #main.has-first-sidebar {\n    grid-template: \"..... ... first-sb .... content .....\"/2em 1em 200px 30px 1fr 2em;\n  }\n  #main.has-second-sidebar {\n    grid-template: \"..... ... content .... second-sb .....\"/2em 1em 1fr 30px 200px 2em;\n  }\n  #main.has-first-sidebar.has-second-sidebar {\n    grid-template: \"..... ... first-sb .... content .... second-sb .....\"/2em 1em 150px 30px 1fr 30px 150px 2em;\n  }\n}\n\n/*******************************\\\n  COMPLEX DUPLICATE AREAS TEST 2\n\\*******************************/\n\n#main-second {\n  display: grid;\n  grid-template: \"..... ... content-2 .....\"/20% 1em 1fr 20%;\n}\n#main-second.has-first-sidebar {\n  grid-template: \"..... ... first-sb-2 .... content-2 .....\"/20% 1em 300px 30px 1fr 20%;\n}\n#main-second.has-second-sidebar {\n  grid-template: \"..... ... content-2 .... second-sb-2 .....\"/20% 1em 1fr 30px 300px 20%;\n}\n#main-second.has-first-sidebar.has-second-sidebar {\n  grid-template: \"..... ... first-sb-2 .... content-2 .... second-sb-2 .....\"/20% 1em 200px 30px 1fr 30px 200px 20%;\n}\n\n@media (max-width: 960px) {\n  #main-second {\n    grid-template: \"..... ... content-2 .....\"/2em 1em 1fr 2em;\n  }\n  #main-second.has-first-sidebar {\n    grid-template: \"..... ... first-sb-2 .... content-2 .....\"/2em 1em 200px 30px 1fr 2em;\n  }\n  #main-second.has-second-sidebar {\n    grid-template: \"..... ... content-2 .... second-sb-2 .....\"/2em 1em 1fr 30px 200px 2em;\n  }\n  #main-second.has-first-sidebar.has-second-sidebar {\n    grid-template: \"..... ... first-sb-2 .... content-2 .... second-sb-2 .....\"/2em 1em 150px 30px 1fr 30px 150px 2em;\n  }\n}\n\n.content {\n  grid-area: content-2;\n}\n.sidebar {\n  grid-area: first-sb-2;\n}\n.sidebar.second {\n  grid-area: second-sb-2;\n}\n\n/* rule with not found identifier (should not break the compiler) */\n.hello {\n  grid-area: world;\n}\n"
  },
  {
    "path": "test/cases/grid-areas-duplicate-complex.out.css",
    "content": "/*******************************\\\n  COMPLEX DUPLICATE AREAS TEST 1\n\\*******************************/\n\n#main > #content {\n  grid-area: content;\n}\n#main > .sidebar {\n  grid-area: first-sb;\n}\n#main > .sidebar.second {\n  grid-area: second-sb;\n}\n@media (min-width: 660px) {\n  #main {\n    display: -ms-grid;\n    display: grid;\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 20% 1em 1fr 20%;\n    grid-template: \"..... ... content .....\"/20% 1em 1fr 20%;\n  }\n  #main.has-first-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 20% 1em 300px 30px 1fr 20%;\n    grid-template: \"..... ... first-sb .... content .....\"/20% 1em 300px 30px 1fr 20%;\n  }\n  #main.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 20% 1em 1fr 30px 300px 20%;\n    grid-template: \"..... ... content .... second-sb .....\"/20% 1em 1fr 30px 300px 20%;\n  }\n  #main.has-first-sidebar.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 20% 1em 200px 30px 1fr 30px 200px 20%;\n    grid-template: \"..... ... first-sb .... content .... second-sb .....\"/20% 1em 200px 30px 1fr 30px 200px 20%;\n  }\n  #main > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-second-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar.has-second-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main > .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar.has-second-sidebar > .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main > .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-first-sidebar.has-second-sidebar > .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 7;\n  }\n}\n@media (max-width: 1499px) {\n  #main {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 10% 1em 1fr 10%;\n    grid-template: \"..... ... content .....\"/10% 1em 1fr 10%;\n  }\n  #main.has-first-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 10% 1em 250px 30px 1fr 10%;\n    grid-template: \"..... ... first-sb .... content .....\"/10% 1em 250px 30px 1fr 10%;\n  }\n  #main.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 10% 1em 1fr 30px 250px 10%;\n    grid-template: \"..... ... content .... second-sb .....\"/10% 1em 1fr 30px 250px 10%;\n  }\n  #main.has-first-sidebar.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 10% 1em 200px 30px 1fr 30px 200px 10%;\n    grid-template: \"..... ... first-sb .... content .... second-sb .....\"/10% 1em 200px 30px 1fr 30px 200px 10%;\n  }\n  #main > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-second-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar.has-second-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-first-sidebar > .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar.has-second-sidebar > .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-second-sidebar > .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-first-sidebar.has-second-sidebar > .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 7;\n  }\n}\n@media (max-width: 959px) {\n  #main {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 1fr 2em;\n    grid-template: \"..... ... content .....\"/2em 1em 1fr 2em;\n  }\n  #main.has-first-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 200px 30px 1fr 2em;\n    grid-template: \"..... ... first-sb .... content .....\"/2em 1em 200px 30px 1fr 2em;\n  }\n  #main.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 1fr 30px 200px 2em;\n    grid-template: \"..... ... content .... second-sb .....\"/2em 1em 1fr 30px 200px 2em;\n  }\n  #main.has-first-sidebar.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 150px 30px 1fr 30px 150px 2em;\n    grid-template: \"..... ... first-sb .... content .... second-sb .....\"/2em 1em 150px 30px 1fr 30px 150px 2em;\n  }\n  #main > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-second-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar.has-second-sidebar > #content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-first-sidebar > .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-first-sidebar.has-second-sidebar > .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main.has-second-sidebar > .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main.has-first-sidebar.has-second-sidebar > .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 7;\n  }\n}\n\n/*******************************\\\n  COMPLEX DUPLICATE AREAS TEST 2\n\\*******************************/\n\n#main-second {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-rows: auto;\n  -ms-grid-columns: 20% 1em 1fr 20%;\n  grid-template: \"..... ... content-2 .....\"/20% 1em 1fr 20%;\n}\n#main-second.has-first-sidebar {\n  -ms-grid-rows: auto;\n  -ms-grid-columns: 20% 1em 300px 30px 1fr 20%;\n  grid-template: \"..... ... first-sb-2 .... content-2 .....\"/20% 1em 300px 30px 1fr 20%;\n}\n#main-second.has-second-sidebar {\n  -ms-grid-rows: auto;\n  -ms-grid-columns: 20% 1em 1fr 30px 300px 20%;\n  grid-template: \"..... ... content-2 .... second-sb-2 .....\"/20% 1em 1fr 30px 300px 20%;\n}\n#main-second.has-first-sidebar.has-second-sidebar {\n  -ms-grid-rows: auto;\n  -ms-grid-columns: 20% 1em 200px 30px 1fr 30px 200px 20%;\n  grid-template: \"..... ... first-sb-2 .... content-2 .... second-sb-2 .....\"/20% 1em 200px 30px 1fr 30px 200px 20%;\n}\n\n@media (max-width: 960px) {\n  #main-second {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 1fr 2em;\n    grid-template: \"..... ... content-2 .....\"/2em 1em 1fr 2em;\n  }\n  #main-second.has-first-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 200px 30px 1fr 2em;\n    grid-template: \"..... ... first-sb-2 .... content-2 .....\"/2em 1em 200px 30px 1fr 2em;\n  }\n  #main-second.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 1fr 30px 200px 2em;\n    grid-template: \"..... ... content-2 .... second-sb-2 .....\"/2em 1em 1fr 30px 200px 2em;\n  }\n  #main-second.has-first-sidebar.has-second-sidebar {\n    -ms-grid-rows: auto;\n    -ms-grid-columns: 2em 1em 150px 30px 1fr 30px 150px 2em;\n    grid-template: \"..... ... first-sb-2 .... content-2 .... second-sb-2 .....\"/2em 1em 150px 30px 1fr 30px 150px 2em;\n  }\n}\n\n.content {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n  grid-area: content-2;\n}\n\n#main-second.has-first-sidebar > .content {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n\n#main-second.has-second-sidebar > .content {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n\n#main-second.has-first-sidebar.has-second-sidebar > .content {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n.sidebar {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n  grid-area: first-sb-2;\n}\n#main-second.has-first-sidebar.has-second-sidebar > .sidebar {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n.sidebar.second {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n  grid-area: second-sb-2;\n}\n#main-second.has-first-sidebar.has-second-sidebar > .sidebar.second {\n  -ms-grid-row: 1;\n  -ms-grid-column: 7;\n}\n@media (max-width: 960px) {\n  .content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main-second.has-first-sidebar > .content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main-second.has-second-sidebar > .content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main-second.has-first-sidebar.has-second-sidebar > .content {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  #main-second.has-first-sidebar.has-second-sidebar > .sidebar {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  #main-second.has-first-sidebar.has-second-sidebar > .sidebar.second {\n    -ms-grid-row: 1;\n    -ms-grid-column: 7;\n  }\n}\n\n/* rule with not found identifier (should not break the compiler) */\n.hello {\n  grid-area: world;\n}\n"
  },
  {
    "path": "test/cases/grid-autoplacement.css",
    "content": "\n.grid-basic {\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n/* Must work with repeat function */\n.grid-repeat {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr 2fr);\n  grid-template-rows: repeat(2, auto);\n  grid-gap: 30px;\n}\n\n/* Complex case */\n.grid-complex {\n  display: grid;\n  grid-template-columns: 1fr repeat(2, minmax(100px, 200px)) 1fr;\n  grid-template-rows: 100px repeat(2, auto);\n  grid-gap: 30px 5px;\n}\n\n/* Must work inside media */\n@media (min-width: 400px) {\n  .grid-media {\n    display: grid;\n    grid-template-columns: 1fr 1fr 1fr;\n    grid-template-rows: auto;\n    grid-gap: 30px;\n  }\n}\n\n/* Must consider autoflow value */\n.grid-flow-column {\n  display: grid;\n  grid-auto-flow: column;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto auto;\n  grid-gap: 30px;\n}\n\n/* Show warning if rows are not defined\n   and dense value is used */\n.grid-warning-dense {\n  grid-auto-flow: column dense;\n  grid-template-columns: 1fr 1fr 1fr;\n}\n\n/* Show warning autoflow used without rows/columns */\n.grid-warning-autoflow {\n  grid-auto-flow: column;\n}\n\n.grid-autoplace-disabled {\n  /* autoprefixer grid: no-autoplace */\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n.grid-autoplace-gap-warn {\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-gap: 30px;\n}"
  },
  {
    "path": "test/cases/grid-autoplacement.out.css",
    "content": "\n.grid-basic {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 30px 1fr 30px 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n.grid-basic > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n.grid-basic > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n.grid-basic > *:nth-child(3) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n\n/* Must work with repeat function */\n.grid-repeat {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 30px 2fr 30px 1fr 30px 2fr 30px 1fr 30px 2fr 30px 1fr 30px 2fr;\n  grid-template-columns: repeat(4, 1fr 2fr);\n  -ms-grid-rows: auto 30px auto;\n  grid-template-rows: repeat(2, auto);\n  grid-gap: 30px;\n}\n.grid-repeat > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n.grid-repeat > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n.grid-repeat > *:nth-child(3) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n.grid-repeat > *:nth-child(4) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 7;\n}\n.grid-repeat > *:nth-child(5) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n}\n.grid-repeat > *:nth-child(6) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n}\n.grid-repeat > *:nth-child(7) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 5;\n}\n.grid-repeat > *:nth-child(8) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 7;\n}\n\n/* Complex case */\n.grid-complex {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 5px minmax(100px, 200px) 5px minmax(100px, 200px) 5px 1fr;\n  grid-template-columns: 1fr repeat(2, minmax(100px, 200px)) 1fr;\n  -ms-grid-rows: 100px 30px auto 30px auto;\n  grid-template-rows: 100px repeat(2, auto);\n  grid-gap: 30px 5px;\n}\n.grid-complex > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n.grid-complex > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n.grid-complex > *:nth-child(3) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n.grid-complex > *:nth-child(4) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 7;\n}\n.grid-complex > *:nth-child(5) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n}\n.grid-complex > *:nth-child(6) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n}\n.grid-complex > *:nth-child(7) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 5;\n}\n.grid-complex > *:nth-child(8) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 7;\n}\n.grid-complex > *:nth-child(9) {\n  -ms-grid-row: 5;\n  -ms-grid-column: 1;\n}\n.grid-complex > *:nth-child(10) {\n  -ms-grid-row: 5;\n  -ms-grid-column: 3;\n}\n.grid-complex > *:nth-child(11) {\n  -ms-grid-row: 5;\n  -ms-grid-column: 5;\n}\n.grid-complex > *:nth-child(12) {\n  -ms-grid-row: 5;\n  -ms-grid-column: 7;\n}\n\n/* Must work inside media */\n@media (min-width: 400px) {\n  .grid-media {\n    display: -ms-grid;\n    display: grid;\n    -ms-grid-columns: 1fr 30px 1fr 30px 1fr;\n    grid-template-columns: 1fr 1fr 1fr;\n    -ms-grid-rows: auto;\n    grid-template-rows: auto;\n    grid-gap: 30px;\n  }\n  .grid-media > *:nth-child(1) {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .grid-media > *:nth-child(2) {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  .grid-media > *:nth-child(3) {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n}\n\n/* Must consider autoflow value */\n.grid-flow-column {\n  display: -ms-grid;\n  display: grid;\n  grid-auto-flow: column;\n  -ms-grid-columns: 1fr 30px 1fr 30px 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto 30px auto;\n  grid-template-rows: auto auto;\n  grid-gap: 30px;\n}\n.grid-flow-column > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n.grid-flow-column > *:nth-child(2) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n}\n.grid-flow-column > *:nth-child(3) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n.grid-flow-column > *:nth-child(4) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n}\n.grid-flow-column > *:nth-child(5) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n.grid-flow-column > *:nth-child(6) {\n  -ms-grid-row: 3;\n  -ms-grid-column: 5;\n}\n\n/* Show warning if rows are not defined\n   and dense value is used */\n.grid-warning-dense {\n  grid-auto-flow: column dense;\n  -ms-grid-columns: 1fr 1fr 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n}\n\n/* Show warning autoflow used without rows/columns */\n.grid-warning-autoflow {\n  grid-auto-flow: column;\n}\n\n.grid-autoplace-disabled {\n  /* autoprefixer grid: no-autoplace */\n  -ms-grid-columns: 1fr 1fr 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n.grid-autoplace-gap-warn {\n  -ms-grid-columns: 1fr 30px 1fr 30px 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-gap: 30px;\n}"
  },
  {
    "path": "test/cases/grid-gap.css",
    "content": ".a {\n  grid-gap: 1rem;\n  grid-template-rows: 1fr minmax(100px, 1fr) 2fr;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-areas:\n      \"head head  head\"\n      \"nav  main  main\"\n      \"nav  foot  foot\";\n}\n\n.b {\n  grid-area: head;\n}\n\n.c {\n  grid-area: main;\n}\n\n.d {\n  grid-area: nav;\n}\n\n.e {\n  grid-area: foot;\n}\n\n.f {\n  gap: 10px 20px;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-areas:\n      \"head head head\"\n      \"nav main main\"\n      \"nav foot foot\";\n}\n\n.calc {\n  grid-template: 1fr 1fr / 1fr 1fr;\n  gap: calc(1% + 5px);\n}\n\n.a-shortcut {\n  grid-gap: 1rem 2rem;\n  grid-template:\n      \"head-shortcut head-shortcut  head-shortcut\" 1fr\n      \"nav-shortcut  main-shortcut  main-shortcut\" minmax(100px, 1fr)\n      \"nav-shortcut  foot-shortcut  foot-shortcut\" 2fr /\n      1fr 100px 1fr;\n}\n\n.b-shortcut {\n  grid-area: head-shortcut;\n}\n\n.c-shortcut {\n  grid-area: main-shortcut;\n}\n\n.d-shortcut {\n  grid-area: nav-shortcut;\n}\n\n.e-shortcut {\n  grid-area: foot-shortcut;\n}\n\n.f-shortcut {\n  grid-gap: 10px;\n  grid-template:\n      \"head-shortcut head-shortcut head-shortcut\"\n      \"nav-shortcut main-shortcut main-shortcut\"\n      \"nav-shortcut foot-shortcut foot-shortcut\"\n      / 1fr 1fr 1fr;\n}\n\n.parent .grid {\n  grid-gap: 30px;\n  display: grid;\n  grid-template:\n    \"a   b\" 100px\n    \"c   d\" 100px\n    \"e   f\" 100px /\n    1fr  1fr;\n}\n\n/* must not inherit gap from .parent .grid */\n.grid {\n  display: grid;\n  grid-template:\n    \"a   b\" 100px\n    \"c   d\" 100px\n    \"e   f\" 100px /\n    1fr  1fr;\n}\n\n.grid-2 {\n  display: grid;\n  grid-gap: 50px;\n  grid-template:\n    \"x   x\" 100px\n    \"y   y\" 100px\n    \"z   z\" 100px /\n    1fr  1fr;\n}\n\n.grid-2.modifier-b {\n  grid-gap: 22px;\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  grid-template-columns: repeat(2, 1fr);\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2.modifier-b */\n.grid-2.modifier-b.foo {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  grid-template-columns: repeat(2, 1fr);\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2.modifier-b */\n.grid-2.modifier-b.bar {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  grid-template-columns: repeat(2, 1fr);\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2.modifier-b */\n.parent .grid-2.modifier-b.bar {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  grid-template-columns: repeat(2, 1fr);\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2 */\n.grid-2.modifier {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  grid-template-columns: repeat(2, 1fr);\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2 */\n.parent .grid-2 {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  grid-template-columns: repeat(2, 1fr);\n  grid-template-rows: repeat(3, 100px);\n}\n\n@media (min-width: 600px){\n  .grid {\n    grid-gap: 10px;\n    grid-template-areas:\n      \"a   b   c\"\n      \"d   e   f\";\n    grid-template-columns: repeat(3, 1fr);\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (min-width: 700px){\n  .grid {\n    grid-gap: 20px;\n    grid-template-areas:\n      \"a   b   c\"\n      \"d   e   f\";\n    grid-template-columns: repeat(3, 1fr);\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (min-width: 900px){\n  .grid {\n    grid-template-areas:\n      \"a   b   c   d   e   f\";\n    grid-template-columns: repeat(6, 1fr);\n    grid-template-rows: 100px;\n  }\n}\n\n@media (max-width: 400px){\n  .grid {\n    grid-template-areas:\n      \"a\"\n      \"b\"\n      \"c\"\n      \"d\"\n      \"e\"\n      \"f\";\n    grid-template-columns: 1fr;\n    grid-template-rows: repeat(6, 100px);\n  }\n}\n\n@media (max-width: 1400px){\n  .grid-2 {\n    grid-template:\n      \"x   y   z\" 100px\n      \"x   y   z\" 100px\n      / 1fr 1fr;\n  }\n  /* must inherit gap from .grid-2 */\n  .grid-2.modifier {\n    grid-template-areas:\n      \"x   x\"\n      \"y   y\"\n      \"z   z\";\n    grid-template-columns: repeat(2, 1fr);\n    grid-template-rows: repeat(3, 100px);\n  }\n  /* must inherit gap from .grid-2 */\n  .grid-2.modifier.modifier-c {\n    grid-template-areas:\n      \"x   x\"\n      \"y   y\"\n      \"z   z\";\n    grid-template-columns: repeat(2, 1fr);\n    grid-template-rows: repeat(3, 100px);\n  }\n  /* must inherit gap from .grid-2 */\n  .parent .grid-2 {\n    grid-template-areas:\n      \"x   x\"\n      \"y   y\"\n      \"z   z\";\n    grid-template-columns: repeat(2, 1fr);\n    grid-template-rows: repeat(3, 100px);\n  }\n}\n\n@media (max-width: 1000px){\n  .grid-2 {\n    grid-gap: 20px;\n    grid-template-areas:\n      \"x   y   z\"\n      \"x   y   z\";\n    grid-template-columns: repeat(3, 1fr);\n    grid-template-rows: repeat(2, 100px);\n  }\n  /* must inherit gap from .grid-2 */\n  .grid-2.modifier {\n    grid-template-areas:\n      \"hi   hi   hi\"\n      \"hi   hi   hi\";\n    grid-template-columns: repeat(3, 1fr);\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (max-width: 700px){\n  .grid-2 {\n    grid-template-areas:\n      \"x   x   y   y   z   z\";\n    grid-template-columns: repeat(6, 1fr);\n    grid-template-rows: 100px;\n  }\n  /* must NOT inherit gap from .grid-2 */\n  .grid-2.modifier {\n    grid-gap: 70px;\n    grid-template-areas:\n      \"x   y   z\"\n      \"x   y   z\";\n    grid-template-columns: repeat(3, 1fr);\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (max-width: 400px){\n  .grid-2 {\n    grid-template-areas:\n      \"x\"\n      \"x\"\n      \"y\"\n      \"y\"\n      \"z\"\n      \"z\";\n    grid-template-columns: 1fr;\n    grid-template-rows: repeat(6, 100px);\n  }\n  /* must inherit gap from .grid-2.modifier */\n  .grid-2.modifier {\n    grid-template-areas:\n      \"x   y   z\"\n      \"x   y   z\";\n    grid-template-columns: repeat(3, 1fr);\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n"
  },
  {
    "path": "test/cases/grid-gap.out.css",
    "content": ".a {\n  grid-gap: 1rem;\n  -ms-grid-rows: 1fr 1rem minmax(100px, 1fr) 1rem 2fr;\n  grid-template-rows: 1fr minmax(100px, 1fr) 2fr;\n  -ms-grid-columns: 1fr 1rem 1fr 1rem 1fr;\n  grid-template-columns: repeat(3, 1fr);\n  grid-template-areas:\n      \"head head  head\"\n      \"nav  main  main\"\n      \"nav  foot  foot\";\n}\n\n.b {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 5;\n  grid-area: head;\n}\n\n.f > .b {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 5;\n}\n\n.c {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n  grid-area: main;\n}\n\n.f > .c {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n}\n\n.d {\n  -ms-grid-row: 3;\n  -ms-grid-row-span: 3;\n  -ms-grid-column: 1;\n  grid-area: nav;\n}\n\n.f > .d {\n  -ms-grid-row: 3;\n  -ms-grid-row-span: 3;\n  -ms-grid-column: 1;\n}\n\n.e {\n  -ms-grid-row: 5;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n  grid-area: foot;\n}\n\n.f > .e {\n  -ms-grid-row: 5;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n}\n\n.f {\n  gap: 10px 20px;\n  -ms-grid-columns: 1fr 20px 1fr 20px 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto 10px auto 10px auto;\n  grid-template-areas:\n      \"head head head\"\n      \"nav main main\"\n      \"nav foot foot\";\n}\n\n.calc {\n  -ms-grid-rows: 1fr -webkit-calc(1% + 5px) 1fr;\n  -ms-grid-rows: 1fr calc(1% + 5px) 1fr;\n  -ms-grid-columns: 1fr -webkit-calc(1% + 5px) 1fr;\n  -ms-grid-columns: 1fr calc(1% + 5px) 1fr;\n  grid-template: 1fr 1fr / 1fr 1fr;\n  gap: -webkit-calc(1% + 5px);\n  gap: calc(1% + 5px);\n}\n\n.a-shortcut {\n  grid-gap: 1rem 2rem;\n  -ms-grid-rows: 1fr 1rem minmax(100px, 1fr) 1rem 2fr;\n  -ms-grid-columns: 1fr 2rem 100px 2rem 1fr;\n  grid-template:\n      \"head-shortcut head-shortcut  head-shortcut\" 1fr\n      \"nav-shortcut  main-shortcut  main-shortcut\" minmax(100px, 1fr)\n      \"nav-shortcut  foot-shortcut  foot-shortcut\" 2fr /\n      1fr 100px 1fr;\n}\n\n.b-shortcut {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 5;\n  grid-area: head-shortcut;\n}\n\n.f-shortcut > .b-shortcut {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 5;\n}\n\n.c-shortcut {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n  grid-area: main-shortcut;\n}\n\n.f-shortcut > .c-shortcut {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n}\n\n.d-shortcut {\n  -ms-grid-row: 3;\n  -ms-grid-row-span: 3;\n  -ms-grid-column: 1;\n  grid-area: nav-shortcut;\n}\n\n.f-shortcut > .d-shortcut {\n  -ms-grid-row: 3;\n  -ms-grid-row-span: 3;\n  -ms-grid-column: 1;\n}\n\n.e-shortcut {\n  -ms-grid-row: 5;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n  grid-area: foot-shortcut;\n}\n\n.f-shortcut > .e-shortcut {\n  -ms-grid-row: 5;\n  -ms-grid-column: 3;\n  -ms-grid-column-span: 3;\n}\n\n.f-shortcut {\n  grid-gap: 10px;\n  -ms-grid-rows: auto 10px auto 10px auto;\n  -ms-grid-columns: 1fr 10px 1fr 10px 1fr;\n  grid-template:\n      \"head-shortcut head-shortcut head-shortcut\"\n      \"nav-shortcut main-shortcut main-shortcut\"\n      \"nav-shortcut foot-shortcut foot-shortcut\"\n      / 1fr 1fr 1fr;\n}\n\n.parent .grid {\n  grid-gap: 30px;\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-rows: 100px 30px 100px 30px 100px;\n  -ms-grid-columns: 1fr 30px 1fr;\n  grid-template:\n    \"a   b\" 100px\n    \"c   d\" 100px\n    \"e   f\" 100px /\n    1fr  1fr;\n}\n\n/* must not inherit gap from .parent .grid */\n.grid {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-rows: 100px 100px 100px;\n  -ms-grid-columns: 1fr 1fr;\n  grid-template:\n    \"a   b\" 100px\n    \"c   d\" 100px\n    \"e   f\" 100px /\n    1fr  1fr;\n}\n\n.grid-2 {\n  display: -ms-grid;\n  display: grid;\n  grid-gap: 50px;\n  -ms-grid-rows: 100px 50px 100px 50px 100px;\n  -ms-grid-columns: 1fr 50px 1fr;\n  grid-template:\n    \"x   x\" 100px\n    \"y   y\" 100px\n    \"z   z\" 100px /\n    1fr  1fr;\n}\n\n.grid-2.modifier-b {\n  grid-gap: 22px;\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  -ms-grid-columns: 1fr 22px 1fr;\n  grid-template-columns: repeat(2, 1fr);\n  -ms-grid-rows: 100px 22px 100px 22px 100px;\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2.modifier-b */\n.grid-2.modifier-b.foo {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  -ms-grid-columns: 1fr 22px 1fr;\n  grid-template-columns: repeat(2, 1fr);\n  -ms-grid-rows: 100px 22px 100px 22px 100px;\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2.modifier-b */\n.grid-2.modifier-b.bar {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  -ms-grid-columns: 1fr 22px 1fr;\n  grid-template-columns: repeat(2, 1fr);\n  -ms-grid-rows: 100px 22px 100px 22px 100px;\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2.modifier-b */\n.parent .grid-2.modifier-b.bar {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  -ms-grid-columns: 1fr 22px 1fr;\n  grid-template-columns: repeat(2, 1fr);\n  -ms-grid-rows: 100px 22px 100px 22px 100px;\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2 */\n.grid-2.modifier {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  -ms-grid-columns: 1fr 50px 1fr;\n  grid-template-columns: repeat(2, 1fr);\n  -ms-grid-rows: 100px 50px 100px 50px 100px;\n  grid-template-rows: repeat(3, 100px);\n}\n\n/* must inherit gap from .grid-2 */\n.parent .grid-2 {\n  grid-template-areas:\n    \"x   x\"\n    \"y   y\"\n    \"z   z\";\n  -ms-grid-columns: 1fr 50px 1fr;\n  grid-template-columns: repeat(2, 1fr);\n  -ms-grid-rows: 100px 50px 100px 50px 100px;\n  grid-template-rows: repeat(3, 100px);\n}\n\n@media (min-width: 600px){\n  .grid {\n    grid-gap: 10px;\n    grid-template-areas:\n      \"a   b   c\"\n      \"d   e   f\";\n    -ms-grid-columns: 1fr 10px 1fr 10px 1fr;\n    grid-template-columns: repeat(3, 1fr);\n    -ms-grid-rows: 100px 10px 100px;\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (min-width: 700px){\n  .grid {\n    grid-gap: 20px;\n    grid-template-areas:\n      \"a   b   c\"\n      \"d   e   f\";\n    -ms-grid-columns: 1fr 20px 1fr 20px 1fr;\n    grid-template-columns: repeat(3, 1fr);\n    -ms-grid-rows: 100px 20px 100px;\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (min-width: 900px){\n  .grid {\n    grid-template-areas:\n      \"a   b   c   d   e   f\";\n    -ms-grid-columns: 1fr 20px 1fr 20px 1fr 20px 1fr 20px 1fr 20px 1fr;\n    grid-template-columns: repeat(6, 1fr);\n    -ms-grid-rows: 100px;\n    grid-template-rows: 100px;\n  }\n}\n\n@media (max-width: 400px){\n  .grid {\n    grid-template-areas:\n      \"a\"\n      \"b\"\n      \"c\"\n      \"d\"\n      \"e\"\n      \"f\";\n    -ms-grid-columns: 1fr;\n    grid-template-columns: 1fr;\n    -ms-grid-rows: (100px)[6];\n    grid-template-rows: repeat(6, 100px);\n  }\n}\n\n@media (max-width: 1400px){\n  .grid-2 {\n    -ms-grid-rows: 100px 50px 100px;\n    -ms-grid-columns: 1fr 50px 1fr;\n    grid-template:\n      \"x   y   z\" 100px\n      \"x   y   z\" 100px\n      / 1fr 1fr;\n  }\n  /* must inherit gap from .grid-2 */\n  .grid-2.modifier {\n    grid-template-areas:\n      \"x   x\"\n      \"y   y\"\n      \"z   z\";\n    -ms-grid-columns: 1fr 50px 1fr;\n    grid-template-columns: repeat(2, 1fr);\n    -ms-grid-rows: 100px 50px 100px 50px 100px;\n    grid-template-rows: repeat(3, 100px);\n  }\n  /* must inherit gap from .grid-2 */\n  .grid-2.modifier.modifier-c {\n    grid-template-areas:\n      \"x   x\"\n      \"y   y\"\n      \"z   z\";\n    -ms-grid-columns: 1fr 50px 1fr;\n    grid-template-columns: repeat(2, 1fr);\n    -ms-grid-rows: 100px 50px 100px 50px 100px;\n    grid-template-rows: repeat(3, 100px);\n  }\n  /* must inherit gap from .grid-2 */\n  .parent .grid-2 {\n    grid-template-areas:\n      \"x   x\"\n      \"y   y\"\n      \"z   z\";\n    -ms-grid-columns: 1fr 50px 1fr;\n    grid-template-columns: repeat(2, 1fr);\n    -ms-grid-rows: 100px 50px 100px 50px 100px;\n    grid-template-rows: repeat(3, 100px);\n  }\n}\n\n@media (max-width: 1000px){\n  .grid-2 {\n    grid-gap: 20px;\n    grid-template-areas:\n      \"x   y   z\"\n      \"x   y   z\";\n    -ms-grid-columns: 1fr 20px 1fr 20px 1fr;\n    grid-template-columns: repeat(3, 1fr);\n    -ms-grid-rows: 100px 20px 100px;\n    grid-template-rows: repeat(2, 100px);\n  }\n  /* must inherit gap from .grid-2 */\n  .grid-2.modifier {\n    grid-template-areas:\n      \"hi   hi   hi\"\n      \"hi   hi   hi\";\n    -ms-grid-columns: 1fr 20px 1fr 20px 1fr;\n    grid-template-columns: repeat(3, 1fr);\n    -ms-grid-rows: 100px 20px 100px;\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (max-width: 700px){\n  .grid-2 {\n    grid-template-areas:\n      \"x   x   y   y   z   z\";\n    -ms-grid-columns: 1fr 20px 1fr 20px 1fr 20px 1fr 20px 1fr 20px 1fr;\n    grid-template-columns: repeat(6, 1fr);\n    -ms-grid-rows: 100px;\n    grid-template-rows: 100px;\n  }\n  /* must NOT inherit gap from .grid-2 */\n  .grid-2.modifier {\n    grid-gap: 70px;\n    grid-template-areas:\n      \"x   y   z\"\n      \"x   y   z\";\n    -ms-grid-columns: 1fr 70px 1fr 70px 1fr;\n    grid-template-columns: repeat(3, 1fr);\n    -ms-grid-rows: 100px 70px 100px;\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n\n@media (max-width: 400px){\n  .grid-2 {\n    grid-template-areas:\n      \"x\"\n      \"x\"\n      \"y\"\n      \"y\"\n      \"z\"\n      \"z\";\n    -ms-grid-columns: 1fr;\n    grid-template-columns: 1fr;\n    -ms-grid-rows: 100px 20px 100px 20px 100px 20px 100px 20px 100px 20px 100px;\n    grid-template-rows: repeat(6, 100px);\n  }\n  /* must inherit gap from .grid-2.modifier */\n  .grid-2.modifier {\n    grid-template-areas:\n      \"x   y   z\"\n      \"x   y   z\";\n    -ms-grid-columns: 1fr 70px 1fr 70px 1fr;\n    grid-template-columns: repeat(3, 1fr);\n    -ms-grid-rows: 100px 70px 100px;\n    grid-template-rows: repeat(2, 100px);\n  }\n}\n"
  },
  {
    "path": "test/cases/grid-media-rules.css",
    "content": "@media (min-width: 30em) {\n  .wrapper {\n    display: grid;\n    grid-template-areas: \"a b\";\n  }\n}\n\n@media (min-width: 60em) {\n  .wrapper {\n    grid-template-areas: \"a b\";\n  }\n}\n\n@media (min-width: 30em) {\n  .a {\n    grid-area: a;\n  }\n}\n\n@media (min-width: 30em) {\n  .b {\n    grid-area: b;\n  }\n}\n"
  },
  {
    "path": "test/cases/grid-media-rules.out.css",
    "content": "@media (min-width: 30em) {\n  .wrapper {\n    display: -ms-grid;\n    display: grid;\n    grid-template-areas: \"a b\";\n  }\n}\n\n@media (min-width: 60em) {\n  .wrapper {\n    grid-template-areas: \"a b\";\n  }\n}\n\n@media (min-width: 30em) {\n  .a {\n    grid-area: a;\n  }\n}\n\n@media (min-width: 30em) {\n  .b {\n    grid-area: b;\n  }\n}\n\n@media (min-width: 30em) {\n  .a {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .b {\n    -ms-grid-row: 1;\n    -ms-grid-column: 2;\n  }\n}\n\n@media (min-width: 60em) {\n  .a {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .b {\n    -ms-grid-row: 1;\n    -ms-grid-column: 2;\n  }\n}\n"
  },
  {
    "path": "test/cases/grid-options.autoplace.out.css",
    "content": "/*****************\\\n  AREAS ALGORITHM\n\\*****************/\n\n.grid-template-areas {\n  display: -ms-grid;\n  display: grid;\n      grid-template-areas:\n    \"a-conflict a-conflict\"\n    \"b-conflict b-conflict\";\n}\n\n.grid-template-areas.conflict {\n  display: -ms-grid;\n  display: grid;\n      grid-template-areas:\n    \"a-conflict\"\n    \"b-conflict\";\n}\n\n.a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: a-conflict;\n}\n\n.grid-template-areas.conflict > .a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 1;\n}\n\n.b {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: b-conflict;\n}\n\n.grid-template-areas.conflict > .b {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 1;\n}\n\n.grid-template {\n  -ms-grid-rows: 30px 1fr 30px;\n  -ms-grid-columns: 120px (250px 10px)[4];\n      grid-template:\n      [header-left] \"head head\" 30px [header-right]\n      [main-left]   \"nav  main\" 1fr  [main-right]\n      [footer-left] \"nav  foot\" 30px [footer-right]\n      / 120px repeat(4, 250px 10px);\n}\n\n@media (min-width: 1000px) {\n  .grid-template {\n    -ms-grid-rows: 30px auto 1fr 30px;\n    -ms-grid-columns: 1fr;\n        grid-template:\n        [header-left] \"head\" 30px [header-right]\n        [nav-left]    \"nav\"  auto  [nav-right]\n        [main-left]   \"main\" 1fr  [main-right]\n        [footer-left] \"foot\" 30px [footer-right]\n        / 1fr;\n  }\n}\n\n.grid-template.conflict {\n  -ms-grid-rows: auto 20px auto;\n  -ms-grid-columns: 1fr 1fr;\n      grid-template:\n      \"head head\"\n      \"nav main\" 20px\n      \"nav foot\"\n      / 1fr 1fr;\n}\n\n.head {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: head;\n}\n\n.grid-template.conflict > .head {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n}\n\n.main {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n  grid-area: main;\n}\n\n.grid-template.conflict > .main {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n}\n\n.nav {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 1;\n  grid-area: nav;\n}\n\n.grid-template.conflict > .nav {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 1;\n}\n\n.foot {\n  -ms-grid-row: 3;\n  -ms-grid-column: 2;\n  grid-area: foot;\n}\n\n.grid-template.conflict > .foot {\n  -ms-grid-row: 3;\n  -ms-grid-column: 2;\n}\n\n@media (min-width: 1000px) {\n  .head {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 1;\n  }\n  .main {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n  }\n  .nav {\n    -ms-grid-row: 2;\n    -ms-grid-row-span: 1;\n    -ms-grid-column: 1;\n  }\n  .foot {\n    -ms-grid-row: 4;\n    -ms-grid-column: 1;\n  }\n}\n\n/*********************\\\n  AUTOPLACE ALGORITHM\n\\*********************/\n\n.grid-autoplace {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 30px 1fr 30px 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n.grid-autoplace > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n\n.grid-autoplace > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n\n.grid-autoplace > *:nth-child(3) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n"
  },
  {
    "path": "test/cases/grid-options.css",
    "content": "/*****************\\\n  AREAS ALGORITHM\n\\*****************/\n\n.grid-template-areas {\n  display: grid;\n  grid-template-areas:\n    \"a-conflict a-conflict\"\n    \"b-conflict b-conflict\";\n}\n\n.grid-template-areas.conflict {\n  display: grid;\n  grid-template-areas:\n    \"a-conflict\"\n    \"b-conflict\";\n}\n\n.a {\n  grid-area: a-conflict;\n}\n\n.b {\n  grid-area: b-conflict;\n}\n\n.grid-template {\n  grid-template:\n      [header-left] \"head head\" 30px [header-right]\n      [main-left]   \"nav  main\" 1fr  [main-right]\n      [footer-left] \"nav  foot\" 30px [footer-right]\n      / 120px repeat(4, 250px 10px);\n}\n\n@media (min-width: 1000px) {\n  .grid-template {\n    grid-template:\n        [header-left] \"head\" 30px [header-right]\n        [nav-left]    \"nav\"  auto  [nav-right]\n        [main-left]   \"main\" 1fr  [main-right]\n        [footer-left] \"foot\" 30px [footer-right]\n        / 1fr;\n  }\n}\n\n.grid-template.conflict {\n  grid-template:\n      \"head head\"\n      \"nav main\" 20px\n      \"nav foot\"\n      / 1fr 1fr;\n}\n\n.head {\n  grid-area: head;\n}\n\n.main {\n  grid-area: main;\n}\n\n.nav {\n  grid-area: nav;\n}\n\n.foot {\n  grid-area: foot;\n}\n\n/*********************\\\n  AUTOPLACE ALGORITHM\n\\*********************/\n\n.grid-autoplace {\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n"
  },
  {
    "path": "test/cases/grid-options.disabled.out.css",
    "content": "/*****************\\\n  AREAS ALGORITHM\n\\*****************/\n\n.grid-template-areas {\n  display: grid;\n  grid-template-areas:\n    \"a-conflict a-conflict\"\n    \"b-conflict b-conflict\";\n}\n\n.grid-template-areas.conflict {\n  display: grid;\n  grid-template-areas:\n    \"a-conflict\"\n    \"b-conflict\";\n}\n\n.a {\n  grid-area: a-conflict;\n}\n\n.b {\n  grid-area: b-conflict;\n}\n\n.grid-template {\n  grid-template:\n      [header-left] \"head head\" 30px [header-right]\n      [main-left]   \"nav  main\" 1fr  [main-right]\n      [footer-left] \"nav  foot\" 30px [footer-right]\n      / 120px repeat(4, 250px 10px);\n}\n\n@media (min-width: 1000px) {\n  .grid-template {\n    grid-template:\n        [header-left] \"head\" 30px [header-right]\n        [nav-left]    \"nav\"  auto  [nav-right]\n        [main-left]   \"main\" 1fr  [main-right]\n        [footer-left] \"foot\" 30px [footer-right]\n        / 1fr;\n  }\n}\n\n.grid-template.conflict {\n  grid-template:\n      \"head head\"\n      \"nav main\" 20px\n      \"nav foot\"\n      / 1fr 1fr;\n}\n\n.head {\n  grid-area: head;\n}\n\n.main {\n  grid-area: main;\n}\n\n.nav {\n  grid-area: nav;\n}\n\n.foot {\n  grid-area: foot;\n}\n\n/*********************\\\n  AUTOPLACE ALGORITHM\n\\*********************/\n\n.grid-autoplace {\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n"
  },
  {
    "path": "test/cases/grid-options.no-autoplace.out.css",
    "content": "/*****************\\\n  AREAS ALGORITHM\n\\*****************/\n\n.grid-template-areas {\n  display: -ms-grid;\n  display: grid;\n      grid-template-areas:\n    \"a-conflict a-conflict\"\n    \"b-conflict b-conflict\";\n}\n\n.grid-template-areas.conflict {\n  display: -ms-grid;\n  display: grid;\n      grid-template-areas:\n    \"a-conflict\"\n    \"b-conflict\";\n}\n\n.a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: a-conflict;\n}\n\n.grid-template-areas.conflict > .a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 1;\n}\n\n.b {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: b-conflict;\n}\n\n.grid-template-areas.conflict > .b {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 1;\n}\n\n.grid-template {\n  -ms-grid-rows: 30px 1fr 30px;\n  -ms-grid-columns: 120px (250px 10px)[4];\n      grid-template:\n      [header-left] \"head head\" 30px [header-right]\n      [main-left]   \"nav  main\" 1fr  [main-right]\n      [footer-left] \"nav  foot\" 30px [footer-right]\n      / 120px repeat(4, 250px 10px);\n}\n\n@media (min-width: 1000px) {\n  .grid-template {\n    -ms-grid-rows: 30px auto 1fr 30px;\n    -ms-grid-columns: 1fr;\n        grid-template:\n        [header-left] \"head\" 30px [header-right]\n        [nav-left]    \"nav\"  auto  [nav-right]\n        [main-left]   \"main\" 1fr  [main-right]\n        [footer-left] \"foot\" 30px [footer-right]\n        / 1fr;\n  }\n}\n\n.grid-template.conflict {\n  -ms-grid-rows: auto 20px auto;\n  -ms-grid-columns: 1fr 1fr;\n      grid-template:\n      \"head head\"\n      \"nav main\" 20px\n      \"nav foot\"\n      / 1fr 1fr;\n}\n\n.head {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: head;\n}\n\n.grid-template.conflict > .head {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n}\n\n.main {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n  grid-area: main;\n}\n\n.grid-template.conflict > .main {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n}\n\n.nav {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 1;\n  grid-area: nav;\n}\n\n.grid-template.conflict > .nav {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 1;\n}\n\n.foot {\n  -ms-grid-row: 3;\n  -ms-grid-column: 2;\n  grid-area: foot;\n}\n\n.grid-template.conflict > .foot {\n  -ms-grid-row: 3;\n  -ms-grid-column: 2;\n}\n\n@media (min-width: 1000px) {\n  .head {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 1;\n  }\n  .main {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n  }\n  .nav {\n    -ms-grid-row: 2;\n    -ms-grid-row-span: 1;\n    -ms-grid-column: 1;\n  }\n  .foot {\n    -ms-grid-row: 4;\n    -ms-grid-column: 1;\n  }\n}\n\n/*********************\\\n  AUTOPLACE ALGORITHM\n\\*********************/\n\n.grid-autoplace {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 1fr 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n"
  },
  {
    "path": "test/cases/grid-status.css",
    "content": "/* autoprefixer grid: on */\n/* autoprefixer grid: off */\n\n.grid-disabled {\n  /* autoprefixer: off */\n  display: grid;\n  grid-auto-flow: column;\n}\n\n.grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: 100px 100px;\n  /* autoprefixer: ignore next */\n  grid-auto-flow: column;\n}\n\n.grid-status-off {\n  /* autoprefixer grid: off */\n  /* autoprefixer grid: off */\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: 100px 100px;\n}\n\n.grid-2 {\n  display: grid;\n}\n\n@supports (grid-auto-rows: 100px) {\n  .disabled {\n    display: grid;\n    grid-auto-rows: 100px;\n  }\n}\n\n.grid-autoplace-enabled {\n  /* autoprefixer grid: autoplace */\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n.grid-autoplace-disabled {\n  /* autoprefixer grid: off */\n  /* autoprefixer grid: autoplace */\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n.grid-autoplace-disabled-2 {\n  /* autoprefixer grid: no-autoplace */\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n}\n"
  },
  {
    "path": "test/cases/grid-status.out.css",
    "content": "/* autoprefixer grid: on */\n/* autoprefixer grid: off */\n\n.grid-disabled {\n  /* autoprefixer: off */\n  display: grid;\n  grid-auto-flow: column;\n}\n\n.grid {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 1fr 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: 100px 100px;\n  grid-template-rows: 100px 100px;\n  /* autoprefixer: ignore next */\n  grid-auto-flow: column;\n}\n\n.grid-status-off {\n  /* autoprefixer grid: off */\n  /* autoprefixer grid: off */\n  display: grid;\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: 100px 100px;\n}\n\n.grid-2 {\n  display: -ms-grid;\n  display: grid;\n}\n\n@supports (grid-auto-rows: 100px) {\n  .disabled {\n    display: grid;\n    grid-auto-rows: 100px;\n  }\n}\n\n.grid-autoplace-enabled {\n  /* autoprefixer grid: autoplace */\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 1fr 30px 1fr 30px 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n.grid-autoplace-enabled > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n\n.grid-autoplace-enabled > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n}\n\n.grid-autoplace-enabled > *:nth-child(3) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 5;\n}\n\n.grid-autoplace-disabled {\n  /* autoprefixer grid: off */\n  /* autoprefixer grid: autoplace */\n  grid-template-columns: 1fr 1fr 1fr;\n  grid-template-rows: auto;\n  grid-gap: 30px;\n}\n\n.grid-autoplace-disabled-2 {\n  /* autoprefixer grid: no-autoplace */\n  -ms-grid-columns: 1fr 1fr 1fr;\n  grid-template-columns: 1fr 1fr 1fr;\n  -ms-grid-rows: auto;\n  grid-template-rows: auto;\n}\n"
  },
  {
    "path": "test/cases/grid-template-areas.css",
    "content": ".a {\n  grid-template-areas:\n      \"head head\"\n      \"nav  main\"\n      \"nav  foot\"\n      \"another\";\n}\n\n@media (max-width: 1000px) {\n  .a {\n    grid-template-areas: \"head main\";\n  }\n}\n\n.b {\n  grid-area: head;\n}\n\n.c {\n  grid-area: main;\n}\n\n.d {\n  grid-area: nav;\n}\n\n.e {\n  grid-area: foot;\n}\n\n/****************\\\n  CONFLICT TESTS\n\\****************/\n\n.grid {\n  display: grid;\n  grid-template-areas:\n    \"a-conflict a-conflict\"\n    \"b-conflict b-conflict\";\n}\n\n.grid.conflict {\n  display: grid;\n  grid-template-areas:\n    \"a-conflict\"\n    \"b-conflict\";\n}\n\n.a {\n  grid-area: a-conflict;\n}\n\n.b {\n  grid-area: b-conflict;\n}\n\n/****************\\\n  MQ CONFLICT TEST\n\\****************/\n.grid-mq {\n  display: grid;\n  grid-template-areas: \"a-mq b-mq\";\n}\n\n@media (max-width: 600px) {\n  .grid-mq {\n    grid-template-areas:\n      \"a-mq\"\n      \"b-mq\";\n  }\n}\n\n.grid.conflict {\n  display: grid;\n  grid-template-areas:\n    \"a-mq\"\n    \"b-mq\";\n}\n\n@media (min-width: 601px) {\n  .grid.conflict {\n    grid-template-areas: \"a-mq b-mq\";\n  }\n}\n\n.a {\n  grid-area: a-mq;\n}\n\n.b {\n  grid-area: b-mq;\n}\n\n/*************************\\\n  OVERRIDE CONFLICT TESTS\n\\*************************/\n\n.grid-overide {\n  display: grid;\n  grid-template-areas: \"overide\";\n}\n\n.grid-overide > .cell {\n  grid-area: overide;\n}\n\n.grid-overide .cell {\n  grid-area: overide;\n}\n\n.grand-parent .mother {\n  display: grid;\n  grid-template-areas: \"child\";\n}\n.grand-parent .father {\n  display: grid;\n  grid-template-areas: \"child child\";\n}\n.grand-parent .father-second {\n  display: grid;\n  grid-template-areas: \"child-unique\";\n}\n@media (min-width: 600px) {\n  .grand-parent .father-second {\n    grid-template-areas: \"child-unique child-unique\";\n  }\n}\n.grand-parent .mother .cell {\n  grid-area: child;\n}\n.grand-parent .mother > .cell {\n  grid-area: child;\n}\n\n.grand-parent .father .cell {\n  grid-area: child;\n}\n.grand-parent .father > .cell {\n  grid-area: child;\n}\n\n/* emit warning */\n.uncle .cell {\n  grid-area: child;\n}\n\n/* emit warning */\n.uncle > .cell {\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent .uncle-second .cell {\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent .uncle-second > .cell {\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent .father.uncle .cell {\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent.uncle .father > .cell {\n  grid-area: child;\n}\n\n/* must not emit warning */\n.uncle .cell {\n  grid-area: child-unique;\n}\n\n/* must not emit warning */\n.uncle > .cell {\n  grid-area: child-unique;\n}\n/*************************\\\n  MULTI SELECTOR TEST\n\\*************************/\n\n.grand-parent .uncle,\n.grand-parent .aunt {\n  display: grid;\n  grid-template-areas: \"cousin\";\n}\n.grand-parent .uncle .cousin {\n  grid-area: cousin;\n}\n.grand-parent .uncle > .cousin {\n  grid-area: cousin;\n}\n.grand-parent .aunt .cousin {\n  grid-area: cousin;\n}\n.grand-parent .aunt > .cousin {\n  grid-area: cousin;\n}\n\n/*************************\\\n  CONTROL COMMENTS TEST\n\\*************************/\n\n/* must not add prefixes */\n.uncle .cell {\n  /* autoprefixer: off */\n  grid-area: child;\n}\n\n/* must not add prefixes */\n.uncle .cell {\n  /* autoprefixer: ignore next */\n  grid-area: child;\n}\n\n.grid-example {\n  display: grid;\n}\n\n@media (max-width: 767.98px) {\n  .grid-example {\n    grid-template-areas:\n      'first first'\n      'second third';\n  }\n}\n\n.grid-area-first {\n  grid-area: first;\n}\n  \n.grid-area-second {\n  grid-area: second;\n}\n\n.grid-area-third {\n  grid-area: third;\n}\n"
  },
  {
    "path": "test/cases/grid-template-areas.out.css",
    "content": ".a {\n  grid-template-areas:\n      \"head head\"\n      \"nav  main\"\n      \"nav  foot\"\n      \"another\";\n}\n\n@media (max-width: 1000px) {\n  .a {\n    grid-template-areas: \"head main\";\n  }\n}\n\n.b {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: head;\n}\n\n.c {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n  grid-area: main;\n}\n\n.d {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 1;\n  grid-area: nav;\n}\n\n.e {\n  -ms-grid-row: 3;\n  -ms-grid-column: 2;\n  grid-area: foot;\n}\n\n@media (max-width: 1000px) {\n  .b {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 1;\n  }\n  .c {\n    -ms-grid-row: 1;\n    -ms-grid-column: 2;\n  }\n}\n\n/****************\\\n  CONFLICT TESTS\n\\****************/\n\n.grid {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas:\n    \"a-conflict a-conflict\"\n    \"b-conflict b-conflict\";\n}\n\n.grid.conflict {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas:\n    \"a-conflict\"\n    \"b-conflict\";\n}\n\n.a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: a-conflict;\n}\n\n.grid.conflict > .a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 1;\n}\n\n.b {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: b-conflict;\n}\n\n.grid.conflict > .b {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 1;\n}\n\n/****************\\\n  MQ CONFLICT TEST\n\\****************/\n.grid-mq {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas: \"a-mq b-mq\";\n}\n\n@media (max-width: 600px) {\n  .grid-mq {\n    grid-template-areas:\n      \"a-mq\"\n      \"b-mq\";\n  }\n}\n\n.grid.conflict {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas:\n    \"a-mq\"\n    \"b-mq\";\n}\n\n@media (min-width: 601px) {\n  .grid.conflict {\n    grid-template-areas: \"a-mq b-mq\";\n  }\n}\n\n.a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: a-mq;\n}\n\n.grid.conflict > .a {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n\n.b {\n  -ms-grid-row: 1;\n  -ms-grid-column: 2;\n  grid-area: b-mq;\n}\n\n.grid.conflict > .b {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n}\n\n@media (max-width: 600px) {\n  .a {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .b {\n    -ms-grid-row: 2;\n    -ms-grid-column: 1;\n  }\n}\n\n@media (min-width: 601px) {\n  .grid.conflict > .a {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .grid.conflict > .b {\n    -ms-grid-row: 1;\n    -ms-grid-column: 2;\n  }\n}\n\n/*************************\\\n  OVERRIDE CONFLICT TESTS\n\\*************************/\n\n.grid-overide {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas: \"overide\";\n}\n\n.grid-overide > .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: overide;\n}\n\n.grid-overide .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: overide;\n}\n\n.grand-parent .mother {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas: \"child\";\n}\n.grand-parent .father {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas: \"child child\";\n}\n.grand-parent .father-second {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas: \"child-unique\";\n}\n@media (min-width: 600px) {\n  .grand-parent .father-second {\n    grid-template-areas: \"child-unique child-unique\";\n  }\n}\n.grand-parent .mother .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child;\n}\n.grand-parent .mother > .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child;\n}\n\n.grand-parent .father .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: child;\n}\n.grand-parent .father > .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: child;\n}\n\n/* emit warning */\n.uncle .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child;\n}\n\n/* emit warning */\n.uncle > .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent .uncle-second .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent .uncle-second > .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent .father.uncle .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: child;\n}\n\n/* emit warning */\n.grand-parent.uncle .father > .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child;\n}\n\n/* must not emit warning */\n.uncle .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child-unique;\n}\n\n/* must not emit warning */\n.uncle > .cell {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: child-unique;\n}\n@media (min-width: 600px) {\n  .uncle .cell {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n  .uncle > .cell {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n}\n/*************************\\\n  MULTI SELECTOR TEST\n\\*************************/\n\n.grand-parent .uncle,\n.grand-parent .aunt {\n  display: -ms-grid;\n  display: grid;\n  grid-template-areas: \"cousin\";\n}\n.grand-parent .uncle .cousin {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: cousin;\n}\n.grand-parent .uncle > .cousin {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: cousin;\n}\n.grand-parent .aunt .cousin {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: cousin;\n}\n.grand-parent .aunt > .cousin {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: cousin;\n}\n\n/*************************\\\n  CONTROL COMMENTS TEST\n\\*************************/\n\n/* must not add prefixes */\n.uncle .cell {\n  /* autoprefixer: off */\n  grid-area: child;\n}\n\n/* must not add prefixes */\n.uncle .cell {\n  /* autoprefixer: ignore next */\n  grid-area: child;\n}\n\n.grid-example {\n  display: -ms-grid;\n  display: grid;\n}\n\n@media (max-width: 767.98px) {\n  .grid-example {\n    grid-template-areas:\n      'first first'\n      'second third';\n  }\n}\n\n.grid-area-first {\n  grid-area: first;\n}\n  \n.grid-area-second {\n  grid-area: second;\n}\n\n.grid-area-third {\n  grid-area: third;\n}\n\n@media (max-width: 767.98px) {\n  .grid-area-first {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 2;\n  }\n  .grid-area-second {\n    -ms-grid-row: 2;\n    -ms-grid-column: 1;\n  }\n  .grid-area-third {\n    -ms-grid-row: 2;\n    -ms-grid-column: 2;\n  }\n}\n"
  },
  {
    "path": "test/cases/grid-template.css",
    "content": ".a {\n  grid-template: 10px repeat(4, 250px 10px) 20px / auto 1fr;\n}\n\n.b {\n  grid-template:\n      [header-left] \"head head\" 30px [header-right]\n      [main-left]   \"nav  main\" 1fr  [main-right]\n      [footer-left] \"nav  foot\" 30px [footer-right]\n      / 120px repeat(4, 250px 10px);\n}\n\n@media (min-width: 1000px) {\n  .b {\n    grid-template:\n        [header-left] \"head\" 30px [header-right]\n        [nav-left]    \"nav\"  auto  [nav-right]\n        [main-left]   \"main\" 1fr  [main-right]\n        [footer-left] \"foot\" 30px [footer-right]\n        / 1fr;\n  }\n}\n\n.c {\n  grid-template:\n      \"hd hd hd hd hd hd hd hd hd\" minmax(100px, auto)\n      \"sd sd sd mn mn mn mn mn mn\" minmax(100px, auto)\n      \"ft ft ft ft ft ft ft ft ft\" minmax(100px, auto)\n              / 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;\n}\n\n.d {\n  grid-template: 10px / 200px;\n}\n\n.e {\n  grid-template: 10px;\n}\n\n.f {\n  grid-template:\n      \"head head\"\n      \"nav main\" 20px\n      \"nav foot\"\n      / 1fr 1fr;\n}\n\n.head {\n  grid-area: head;\n}\n\n.nav {\n  grid-area: nav;\n}\n\n.main {\n  grid-area: main;\n}\n\n.foot {\n  grid-area: foot;\n}\n\n.hd {\n  grid-area: hd;\n}\n\n.sd {\n  grid-area: sd;\n}\n\n.mn {\n  grid-area: mn;\n}\n\n.ft {\n  grid-area: ft;\n}\n\n.grid {\n  display: grid;\n  grid-gap: 10px;\n  grid-template:\n      \"a   b\" 100px\n      \"c   d\" 100px\n      \"e   f\" 100px /\n      1fr  1fr;\n}\n\n@media (min-width: 600px){\n  .grid {\n    grid-gap: 10px;\n    grid-template:\n        \"a   b   c\" 100px\n        \"d   e   f\" 100px /\n        1fr 1fr 1fr;\n  }\n}\n\n.cell-A {\n  grid-area: a;\n}\n.cell-B {\n  grid-area: b;\n}\n.cell-C {\n  grid-area: c;\n}\n.cell-D {\n  grid-area: d;\n}\n.cell-E {\n  grid-area: e;\n}\n.cell-F {\n  grid-area: f;\n}\n\n.g {\n  display: grid;\n  grid-gap: 10px;\n  grid-template:\n      \"g   g\" 100px\n      \"g   g\" 100px\n      \"h   h\" 100px /\n      1fr  1fr;\n}\n\n/* Should trigger a warning */\n.g-conflict {\n  display: grid;\n  grid-gap: 10px;\n  grid-template:\n      \"g   g\" 100px\n      \"g   g\" 100px\n      \"h   h\" 100px /\n      1fr  1fr;\n}\n\n@media (min-width: 600px) {\n  /* This should *not* trigger a warning */\n  .g {\n    display: grid;\n    grid-gap: 10px;\n    grid-template:\n        \"g   h\" 100px /\n        1fr  1fr;\n  }\n\n  /* This *should* trigger a warning */\n  .g-conflict-2 {\n    display: grid;\n    grid-gap: 10px;\n    grid-template:\n        \"g   h\" 100px /\n        1fr  1fr;\n  }\n}\n\n/* comma list tests */\n/* None of these should throw any warnings (unless specified) */\n.i, .j {\n  display: grid;\n  grid-gap: 10px;\n  grid-template:\n      \"i    j\" 100px /\n      1fr  1fr;\n}\n\n@media (max-width: 600px) {\n  .i {\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n  .j {\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n\n  /* This one should throw a warning */\n  .k {\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n}\n\n@media (min-width: 900px) {\n  .i, .j {\n    display: grid;\n    grid-gap: 10px;\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n}\n\n/* media query test */\n@media (min-width: 601px) {\n  .l {\n    display: grid;\n    grid-gap: 10px;\n    grid-template:\n        \"l   m\" 100px /\n        1fr  1fr;\n  }\n}\n\n@media (max-width: 600px) {\n  .l {\n    display: grid;\n    grid-gap: 10px;\n    grid-template:\n        \"l   m\" 100px /\n        1fr  1fr;\n  }\n\n  /* this should display a warning */\n  .m {\n    display: grid;\n    grid-gap: 10px;\n    grid-template:\n        \"m   z\" 100px /\n        1fr  1fr;\n  }\n\n  /* this should display a warning */\n  .z, .second-z {\n    display: grid;\n    grid-gap: 10px;\n    grid-template:\n        \".   z\" 100px /\n        1fr  1fr;\n  }\n}\n\n.k-1 {\n  grid-area: g;\n}\n\n.k-2 {\n  grid-area: h;\n}\n\n.k-3 {\n  grid-area: i;\n}\n\n.k-4 {\n  grid-area: j;\n}\n\n.k-5 {\n  grid-area: l;\n}\n\n.k-6, .k-7 {\n  grid-area: m;\n}\n\n.k-8, .k-9 {\n  grid-area: z;\n}\n"
  },
  {
    "path": "test/cases/grid-template.out.css",
    "content": ".a {\n  -ms-grid-rows: 10px (250px 10px)[4] 20px;\n  -ms-grid-columns: auto 1fr;\n  grid-template: 10px repeat(4, 250px 10px) 20px / auto 1fr;\n}\n\n.b {\n  -ms-grid-rows: 30px 1fr 30px;\n  -ms-grid-columns: 120px (250px 10px)[4];\n  grid-template:\n      [header-left] \"head head\" 30px [header-right]\n      [main-left]   \"nav  main\" 1fr  [main-right]\n      [footer-left] \"nav  foot\" 30px [footer-right]\n      / 120px repeat(4, 250px 10px);\n}\n\n@media (min-width: 1000px) {\n  .b {\n    -ms-grid-rows: 30px auto 1fr 30px;\n    -ms-grid-columns: 1fr;\n    grid-template:\n        [header-left] \"head\" 30px [header-right]\n        [nav-left]    \"nav\"  auto  [nav-right]\n        [main-left]   \"main\" 1fr  [main-right]\n        [footer-left] \"foot\" 30px [footer-right]\n        / 1fr;\n  }\n}\n\n.c {\n  -ms-grid-rows: minmax(100px, auto) minmax(100px, auto) minmax(100px, auto);\n  -ms-grid-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;\n  grid-template:\n      \"hd hd hd hd hd hd hd hd hd\" minmax(100px, auto)\n      \"sd sd sd mn mn mn mn mn mn\" minmax(100px, auto)\n      \"ft ft ft ft ft ft ft ft ft\" minmax(100px, auto)\n              / 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;\n}\n\n.d {\n  -ms-grid-rows: 10px;\n  -ms-grid-columns: 200px;\n  grid-template: 10px / 200px;\n}\n\n.e {\n  grid-template: 10px;\n}\n\n.f {\n  -ms-grid-rows: auto 20px auto;\n  -ms-grid-columns: 1fr 1fr;\n  grid-template:\n      \"head head\"\n      \"nav main\" 20px\n      \"nav foot\"\n      / 1fr 1fr;\n}\n\n.head {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-area: head;\n}\n\n.f > .head {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n}\n\n.nav {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 1;\n  grid-area: nav;\n}\n\n.f > .nav {\n  -ms-grid-row: 2;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 1;\n}\n\n.main {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n  grid-area: main;\n}\n\n.f > .main {\n  -ms-grid-row: 2;\n  -ms-grid-column: 2;\n}\n\n.foot {\n  -ms-grid-row: 3;\n  -ms-grid-column: 2;\n  grid-area: foot;\n}\n\n.f > .foot {\n  -ms-grid-row: 3;\n  -ms-grid-column: 2;\n}\n\n@media (min-width: 1000px) {\n  .head {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 1;\n  }\n  .nav {\n    -ms-grid-row: 2;\n    -ms-grid-row-span: 1;\n    -ms-grid-column: 1;\n  }\n  .main {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n  }\n  .foot {\n    -ms-grid-row: 4;\n    -ms-grid-column: 1;\n  }\n}\n\n.hd {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 9;\n  grid-area: hd;\n}\n\n.sd {\n  -ms-grid-row: 2;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 3;\n  grid-area: sd;\n}\n\n.mn {\n  -ms-grid-row: 2;\n  -ms-grid-column: 4;\n  -ms-grid-column-span: 6;\n  grid-area: mn;\n}\n\n.ft {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 9;\n  grid-area: ft;\n}\n\n.grid {\n  display: -ms-grid;\n  display: grid;\n  grid-gap: 10px;\n  -ms-grid-rows: 100px 10px 100px 10px 100px;\n  -ms-grid-columns: 1fr 10px 1fr;\n  grid-template:\n      \"a   b\" 100px\n      \"c   d\" 100px\n      \"e   f\" 100px /\n      1fr  1fr;\n}\n\n@media (min-width: 600px){\n  .grid {\n    grid-gap: 10px;\n    -ms-grid-rows: 100px 10px 100px;\n    -ms-grid-columns: 1fr 10px 1fr 10px 1fr;\n    grid-template:\n        \"a   b   c\" 100px\n        \"d   e   f\" 100px /\n        1fr 1fr 1fr;\n  }\n}\n\n.cell-A {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: a;\n}\n.cell-B {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n  grid-area: b;\n}\n.cell-C {\n  -ms-grid-row: 3;\n  -ms-grid-column: 1;\n  grid-area: c;\n}\n.cell-D {\n  -ms-grid-row: 3;\n  -ms-grid-column: 3;\n  grid-area: d;\n}\n.cell-E {\n  -ms-grid-row: 5;\n  -ms-grid-column: 1;\n  grid-area: e;\n}\n.cell-F {\n  -ms-grid-row: 5;\n  -ms-grid-column: 3;\n  grid-area: f;\n}\n@media (min-width: 600px) {\n  .cell-A {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .cell-B {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  .cell-C {\n    -ms-grid-row: 1;\n    -ms-grid-column: 5;\n  }\n  .cell-D {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n  }\n  .cell-E {\n    -ms-grid-row: 3;\n    -ms-grid-column: 3;\n  }\n  .cell-F {\n    -ms-grid-row: 3;\n    -ms-grid-column: 5;\n  }\n}\n\n.g {\n  display: -ms-grid;\n  display: grid;\n  grid-gap: 10px;\n  -ms-grid-rows: 100px 10px 100px 10px 100px;\n  -ms-grid-columns: 1fr 10px 1fr;\n  grid-template:\n      \"g   g\" 100px\n      \"g   g\" 100px\n      \"h   h\" 100px /\n      1fr  1fr;\n}\n\n/* Should trigger a warning */\n.g-conflict {\n  display: -ms-grid;\n  display: grid;\n  grid-gap: 10px;\n  -ms-grid-rows: 100px 10px 100px 10px 100px;\n  -ms-grid-columns: 1fr 10px 1fr;\n  grid-template:\n      \"g   g\" 100px\n      \"g   g\" 100px\n      \"h   h\" 100px /\n      1fr  1fr;\n}\n\n@media (min-width: 600px) {\n  /* This should *not* trigger a warning */\n  .g {\n    display: -ms-grid;\n    display: grid;\n    grid-gap: 10px;\n    -ms-grid-rows: 100px;\n    -ms-grid-columns: 1fr 10px 1fr;\n    grid-template:\n        \"g   h\" 100px /\n        1fr  1fr;\n  }\n\n  /* This *should* trigger a warning */\n  .g-conflict-2 {\n    display: -ms-grid;\n    display: grid;\n    grid-gap: 10px;\n    -ms-grid-rows: 100px;\n    -ms-grid-columns: 1fr 10px 1fr;\n    grid-template:\n        \"g   h\" 100px /\n        1fr  1fr;\n  }\n}\n\n/* comma list tests */\n/* None of these should throw any warnings (unless specified) */\n.i, .j {\n  display: -ms-grid;\n  display: grid;\n  grid-gap: 10px;\n  -ms-grid-rows: 100px;\n  -ms-grid-columns: 1fr 10px 1fr;\n  grid-template:\n      \"i    j\" 100px /\n      1fr  1fr;\n}\n\n@media (max-width: 600px) {\n  .i {\n    -ms-grid-rows: 100px 10px 100px;\n    -ms-grid-columns: 1fr;\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n  .j {\n    -ms-grid-rows: 100px 10px 100px;\n    -ms-grid-columns: 1fr;\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n\n  /* This one should throw a warning */\n  .k {\n    -ms-grid-rows: 100px 100px;\n    -ms-grid-columns: 1fr;\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n}\n\n@media (min-width: 900px) {\n  .i, .j {\n    display: -ms-grid;\n    display: grid;\n    grid-gap: 10px;\n    -ms-grid-rows: 100px 10px 100px;\n    -ms-grid-columns: 1fr;\n    grid-template:\n      \"i\" 100px\n      \"j\" 100px /\n      1fr;\n  }\n}\n\n/* media query test */\n@media (min-width: 601px) {\n  .l {\n    display: -ms-grid;\n    display: grid;\n    grid-gap: 10px;\n    -ms-grid-rows: 100px;\n    -ms-grid-columns: 1fr 10px 1fr;\n    grid-template:\n        \"l   m\" 100px /\n        1fr  1fr;\n  }\n}\n\n@media (max-width: 600px) {\n  .l {\n    display: -ms-grid;\n    display: grid;\n    grid-gap: 10px;\n    -ms-grid-rows: 100px;\n    -ms-grid-columns: 1fr 10px 1fr;\n    grid-template:\n        \"l   m\" 100px /\n        1fr  1fr;\n  }\n\n  /* this should display a warning */\n  .m {\n    display: -ms-grid;\n    display: grid;\n    grid-gap: 10px;\n    -ms-grid-rows: 100px;\n    -ms-grid-columns: 1fr 10px 1fr;\n    grid-template:\n        \"m   z\" 100px /\n        1fr  1fr;\n  }\n\n  /* this should display a warning */\n  .z, .second-z {\n    display: -ms-grid;\n    display: grid;\n    grid-gap: 10px;\n    -ms-grid-rows: 100px;\n    -ms-grid-columns: 1fr 10px 1fr;\n    grid-template:\n        \".   z\" 100px /\n        1fr  1fr;\n  }\n}\n\n.k-1 {\n  -ms-grid-row: 1;\n  -ms-grid-row-span: 3;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 3;\n  grid-area: g;\n}\n\n.g-conflict > .k-1 {\n  -ms-grid-row: 1;\n  -ms-grid-row-span: 3;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 3;\n}\n\n.k-2 {\n  -ms-grid-row: 5;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 3;\n  grid-area: h;\n}\n\n.g-conflict > .k-2 {\n  -ms-grid-row: 5;\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 3;\n}\n\n@media (min-width: 600px) {\n  .k-1 {\n    -ms-grid-row: 1;\n    -ms-grid-row-span: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 1;\n  }\n  .g-conflict-2 > .k-1 {\n    -ms-grid-row: 1;\n    -ms-grid-row-span: 1;\n    -ms-grid-column: 1;\n    -ms-grid-column-span: 1;\n  }\n  .k-2 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n    -ms-grid-column-span: 1;\n  }\n  .g-conflict-2 > .k-2 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n    -ms-grid-column-span: 1;\n  }\n}\n\n.k-3 {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n  grid-area: i;\n}\n\n.k-4 {\n  -ms-grid-row: 1;\n  -ms-grid-column: 3;\n  grid-area: j;\n}\n\n@media (max-width: 600px) {\n  .k-3 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .k-3 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .k > .k-3 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .k-4 {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n  }\n  .k-4 {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n  }\n  .k > .k-4 {\n    -ms-grid-row: 2;\n    -ms-grid-column: 1;\n  }\n}\n\n@media (min-width: 900px) {\n  .k-3 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .k-4 {\n    -ms-grid-row: 3;\n    -ms-grid-column: 1;\n  }\n}\n\n.k-5 {\n  grid-area: l;\n}\n\n.k-6, .k-7 {\n  grid-area: m;\n}\n\n.k-8, .k-9 {\n  grid-area: z;\n}\n\n@media (min-width: 601px) {\n  .k-5 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .k-6, .k-7 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n}\n\n@media (max-width: 600px) {\n  .k-5 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .k-6, .k-7 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  .m > .k-6, .m > .k-7 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 1;\n  }\n  .k-8, .k-9 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n  .z > .k-8, .second-z > .k-8, .z > .k-9, .second-z > .k-9 {\n    -ms-grid-row: 1;\n    -ms-grid-column: 3;\n  }\n}\n"
  },
  {
    "path": "test/cases/grid.css",
    "content": ".a {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  justify-self: stretch;\n  align-self: stretch;\n  grid-column-start: 1;\n  grid-column-end: span 3;\n}\n\n.b {\n  display: inline-grid;\n  grid-template-rows: 10px repeat(4, 250px 10px) 20px;\n  justify-self: stretch;\n  align-self: stretch;\n  grid-row-start: 1;\n  grid-row-end: span 3;\n}\n\n.c {\n  grid-column: 1 / span 3;\n}\n\n.d {\n  grid-column: 1 / 3;\n  grid-row: span 2 / 5;\n}\n\n.e {\n  grid-column-start: 1;\n  grid-column-end: 3;\n  grid-row-start: 1;\n  grid-row-end: 4;\n}\n\n.warn {\n  grid-column-end: 3;\n  grid: subgrid;\n  grid-gap: 1rem;\n  grid-template-areas: \"head head\"\n                       \"nav  main\"\n                       \"foot ....\";\n}\n\n.no-warn {\n  /* autoprefixer grid: off */\n  grid-column-end: 3;\n  grid: subgrid;\n  grid-gap: 1rem;\n  grid-template-areas: \"head head\"\n                       \"nav  main\"\n                       \"foot ....\";\n}\n\n.warn-gap-rows {\n  grid-gap: 1rem;\n  grid-template-rows: 1fr 1fr;\n  grid-template-areas:\n      \"a a\"\n      \"a a\";\n}\n\n.warn-gap-rows {\n  grid-column-gap: 1rem;\n  grid-template-rows: 1fr 1fr;\n  grid-template-areas:\n      \"b b\"\n      \"b b\";\n}\n\n.warn-gap-columns {\n  grid-gap: 1rem;\n  grid-template-columns: 1fr 1fr;\n  grid-template-areas:\n      \"c c\"\n      \"c c\";\n}\n\n.warn-gap-columns {\n  grid-row-gap: 1rem;\n  grid-template-columns: 1fr 1fr;\n  grid-template-areas:\n      \"d d\"\n      \"d d\";\n}\n\n.unknown {\n  justify-self: start;\n  align-self: start;\n}\n\n.flex {\n  justify-self: flex-end;\n  align-self: flex-end;\n}\n\n/* should add grid prefixes because a flex container can be a grid item */\n.align-justify-grid-flex {\n  display: flex;\n  justify-self: start;\n  align-self: end;\n}\n\n@supports (display: grid) {\n  .foo {\n    display: grid;\n  }\n}\n\n@supports (justify-items: start) {\n  .foo {\n    justify-items: start;\n  }\n}\n\n.warn {\n  grid-column-span: 2;\n  grid-row-span: 2;\n  grid-auto-columns: 100px;\n  grid-auto-rows: 100px;\n  grid-auto-flow: column;\n  grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n  grid-template-rows: repeat(auto-fit, minmax(400px, 1fr));\n}\n\n.baz {\n  grid-column: span 3;\n}\n\n.bar {\n  grid-row: span 3;\n}\n\n.warn-display-contents {\n  display: grid;\n}\n/* Emit warning if grid enabled */\n.warn-display-contents .grid {\n  display: contents;\n}\n\n.warn_ie_align {\n  align-items: center;\n  display: grid;\n}\n\n.warn_ie_justify {\n  justify-items: center;\n  display: grid;\n}\n\n.warn_ie_justify_content {\n  justify-content: center;\n  display: grid;\n}\n\n.warn_place_items {\n  place-items: start end;\n  display: grid;\n}\n\n.place-self-a {\n  place-self: center;\n}\n\n.place-self-b {\n  place-self: start end;\n}\n\n/* must have correct -ms-grid-rows/columns values */\n.grid-correct-rows-columns {\n  display: grid;\n  grid-template-columns: 50px repeat(2, 1fr 2fr) 50px;\n  grid-template-rows: repeat(1, auto 100px);\n  grid-gap: 20px;\n  grid-template-areas:\n    \". . . . . .\"\n    \". . . . . .\";\n}\n\n.warn-auto-flow {\n  grid-auto-flow: column;\n  grid-template-columns: 1fr 1fr;\n  grid-template-areas:\n      \". .\"\n      \". .\";\n}\n\n.center-wrapper {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  grid-template-areas:\n    \". z z .\"\n    \". z z .\";\n}\n.center-item {\n  grid-area: z;\n  align-self: center;\n  justify-self: center;\n}\n\n.named {\n  grid-template-rows: 1fr;\n  grid-template-columns: [content] 1fr;\n}\n\n/** https://github.com/postcss/autoprefixer/issues/1446 */\n.issue-1446 {\n  grid-row-start: span 3;\n  grid-row-end: 5;\n}\n"
  },
  {
    "path": "test/cases/grid.disabled.css",
    "content": ".a {\n  display: grid;\n  grid-template-columns: auto 1fr;\n  justify-self: stretch;\n  align-self: stretch;\n  grid-column-start: 1;\n  grid-column-end: span 3;\n}\n\n.b {\n  display: inline-grid;\n  grid-template-rows: 10px repeat(4, 250px 10px) 20px;\n  justify-self: stretch;\n  align-self: stretch;\n  grid-row-start: 1;\n  grid-row-end: span 3;\n}\n\n.c {\n  grid-column: 1 / span 3;\n}\n\n.d {\n  grid-column: 1 / 3;\n  grid-row: span 2 / 5;\n}\n\n.e {\n  grid-column-start: 1;\n  grid-column-end: 3;\n  grid-row-start: 1;\n  grid-row-end: 4;\n}\n\n.warn {\n  grid-column-end: 3;\n  grid: subgrid;\n  grid-gap: 1rem;\n  grid-template-areas: \"head head\"\n                       \"nav  main\"\n                       \"foot ....\";\n}\n\n.no-warn {\n  /* autoprefixer grid: off */\n  grid-column-end: 3;\n  grid: subgrid;\n  grid-gap: 1rem;\n  grid-template-areas: \"head head\"\n                       \"nav  main\"\n                       \"foot ....\";\n}\n\n.warn-gap-rows {\n  grid-gap: 1rem;\n  grid-template-rows: 1fr 1fr;\n  grid-template-areas:\n      \"a a\"\n      \"a a\";\n}\n\n.warn-gap-rows {\n  grid-column-gap: 1rem;\n  grid-template-rows: 1fr 1fr;\n  grid-template-areas:\n      \"b b\"\n      \"b b\";\n}\n\n.warn-gap-columns {\n  grid-gap: 1rem;\n  grid-template-columns: 1fr 1fr;\n  grid-template-areas:\n      \"c c\"\n      \"c c\";\n}\n\n.warn-gap-columns {\n  grid-row-gap: 1rem;\n  grid-template-columns: 1fr 1fr;\n  grid-template-areas:\n      \"d d\"\n      \"d d\";\n}\n\n.unknown {\n  justify-self: start;\n  -ms-flex-item-align: start;\n      align-self: start;\n}\n\n.flex {\n  justify-self: flex-end;\n  -ms-flex-item-align: end;\n      align-self: flex-end;\n}\n\n/* should add grid prefixes because a flex container can be a grid item */\n.align-justify-grid-flex {\n  display: -ms-flexbox;\n  display: flex;\n  justify-self: start;\n  -ms-flex-item-align: end;\n      align-self: end;\n}\n\n@supports (display: grid) {\n  .foo {\n    display: grid;\n  }\n}\n\n@supports (justify-items: start) {\n  .foo {\n    justify-items: start;\n  }\n}\n\n.warn {\n  grid-column-span: 2;\n  grid-row-span: 2;\n  grid-auto-columns: 100px;\n  grid-auto-rows: 100px;\n  grid-auto-flow: column;\n  grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n  grid-template-rows: repeat(auto-fit, minmax(400px, 1fr));\n}\n\n.baz {\n  grid-column: span 3;\n}\n\n.bar {\n  grid-row: span 3;\n}\n\n.warn-display-contents {\n  display: grid;\n}\n/* Emit warning if grid enabled */\n.warn-display-contents .grid {\n  display: contents;\n}\n\n.warn_ie_align {\n  -ms-flex-align: center;\n      align-items: center;\n  display: grid;\n}\n\n.warn_ie_justify {\n  justify-items: center;\n  display: grid;\n}\n\n.warn_ie_justify_content {\n  -ms-flex-pack: center;\n      justify-content: center;\n  display: grid;\n}\n\n.warn_place_items {\n  place-items: start end;\n  display: grid;\n}\n\n.place-self-a {\n  place-self: center;\n}\n\n.place-self-b {\n  place-self: start end;\n}\n\n/* must have correct -ms-grid-rows/columns values */\n.grid-correct-rows-columns {\n  display: grid;\n  grid-template-columns: 50px repeat(2, 1fr 2fr) 50px;\n  grid-template-rows: repeat(1, auto 100px);\n  grid-gap: 20px;\n  grid-template-areas:\n    \". . . . . .\"\n    \". . . . . .\";\n}\n\n.warn-auto-flow {\n  grid-auto-flow: column;\n  grid-template-columns: 1fr 1fr;\n  grid-template-areas:\n      \". .\"\n      \". .\";\n}\n\n.center-wrapper {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  grid-template-areas:\n    \". z z .\"\n    \". z z .\";\n}\n.center-item {\n  grid-area: z;\n  align-self: center;\n  justify-self: center;\n}\n\n.named {\n  grid-template-rows: 1fr;\n  grid-template-columns: [content] 1fr;\n}\n\n/** https://github.com/postcss/autoprefixer/issues/1446 */\n.issue-1446 {\n  grid-row-start: span 3;\n  grid-row-end: 5;\n}\n"
  },
  {
    "path": "test/cases/grid.out.css",
    "content": ".a {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: auto 1fr;\n  grid-template-columns: auto 1fr;\n  -ms-grid-column-align: stretch;\n  justify-self: stretch;\n  -ms-grid-row-align: stretch;\n  align-self: stretch;\n  -ms-grid-column: 1;\n  grid-column-start: 1;\n  -ms-grid-column-span: 3;\n  grid-column-end: span 3;\n}\n\n.b {\n  display: -ms-inline-grid;\n  display: inline-grid;\n  -ms-grid-rows: 10px (250px 10px)[4] 20px;\n  grid-template-rows: 10px repeat(4, 250px 10px) 20px;\n  -ms-grid-column-align: stretch;\n  justify-self: stretch;\n  -ms-grid-row-align: stretch;\n  align-self: stretch;\n  -ms-grid-row: 1;\n  grid-row-start: 1;\n  -ms-grid-row-span: 3;\n  grid-row-end: span 3;\n}\n\n.c {\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 3;\n  grid-column: 1 / span 3;\n}\n\n.d {\n  -ms-grid-column: 1;\n  -ms-grid-column-span: 2;\n  grid-column: 1 / 3;\n  -ms-grid-row: 3;\n  -ms-grid-row-span: 2;\n  grid-row: span 2 / 5;\n}\n\n.e {\n  -ms-grid-column: 1;\n  grid-column-start: 1;\n  -ms-grid-column-span: 2;\n  grid-column-end: 3;\n  -ms-grid-row: 1;\n  grid-row-start: 1;\n  -ms-grid-row-span: 3;\n  grid-row-end: 4;\n}\n\n.warn {\n  -ms-grid-column-span: 3;\n  grid-column-end: 3;\n  grid: subgrid;\n  grid-gap: 1rem;\n  grid-template-areas: \"head head\"\n                       \"nav  main\"\n                       \"foot ....\";\n}\n\n.no-warn {\n  /* autoprefixer grid: off */\n  grid-column-end: 3;\n  grid: subgrid;\n  grid-gap: 1rem;\n  grid-template-areas: \"head head\"\n                       \"nav  main\"\n                       \"foot ....\";\n}\n\n.warn-gap-rows {\n  grid-gap: 1rem;\n  -ms-grid-rows: 1fr 1rem 1fr;\n  grid-template-rows: 1fr 1fr;\n  grid-template-areas:\n      \"a a\"\n      \"a a\";\n}\n\n.warn-gap-rows {\n  grid-column-gap: 1rem;\n  -ms-grid-rows: 1fr 1fr;\n  grid-template-rows: 1fr 1fr;\n  grid-template-areas:\n      \"b b\"\n      \"b b\";\n}\n\n.warn-gap-columns {\n  grid-gap: 1rem;\n  -ms-grid-columns: 1fr 1rem 1fr;\n  grid-template-columns: 1fr 1fr;\n  -ms-grid-rows: auto 1rem auto;\n  grid-template-areas:\n      \"c c\"\n      \"c c\";\n}\n\n.warn-gap-columns {\n  grid-row-gap: 1rem;\n  -ms-grid-columns: 1fr 1fr;\n  grid-template-columns: 1fr 1fr;\n  -ms-grid-rows: auto 1rem auto;\n  grid-template-areas:\n      \"d d\"\n      \"d d\";\n}\n\n.unknown {\n  -ms-grid-column-align: start;\n  justify-self: start;\n  -webkit-align-self: start;\n  -ms-flex-item-align: start;\n  -ms-grid-row-align: start;\n  align-self: start;\n}\n\n.flex {\n  justify-self: flex-end;\n  -webkit-align-self: flex-end;\n  -ms-flex-item-align: end;\n  align-self: flex-end;\n}\n\n/* should add grid prefixes because a flex container can be a grid item */\n.align-justify-grid-flex {\n  display: -webkit-flex;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-grid-column-align: start;\n  justify-self: start;\n  -webkit-align-self: end;\n  -ms-flex-item-align: end;\n  -ms-grid-row-align: end;\n  align-self: end;\n}\n\n@supports ((display: -ms-grid) or (display: grid)) {\n  .foo {\n    display: -ms-grid;\n    display: grid;\n  }\n}\n\n@supports (justify-items: start) {\n  .foo {\n    justify-items: start;\n  }\n}\n\n.warn {\n  grid-column-span: 2;\n  grid-row-span: 2;\n  grid-auto-columns: 100px;\n  grid-auto-rows: 100px;\n  grid-auto-flow: column;\n  grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));\n  grid-template-rows: repeat(auto-fit, minmax(400px, 1fr));\n}\n\n.baz {\n  -ms-grid-column-span: 3;\n  grid-column: span 3;\n}\n\n.bar {\n  -ms-grid-row-span: 3;\n  grid-row: span 3;\n}\n\n.warn-display-contents {\n  display: -ms-grid;\n  display: grid;\n}\n/* Emit warning if grid enabled */\n.warn-display-contents .grid {\n  display: contents;\n}\n\n.warn_ie_align {\n  -webkit-align-items: center;\n  -ms-flex-align: center;\n  align-items: center;\n  display: -ms-grid;\n  display: grid;\n}\n\n.warn_ie_justify {\n  justify-items: center;\n  display: -ms-grid;\n  display: grid;\n}\n\n.warn_ie_justify_content {\n  -webkit-justify-content: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  display: -ms-grid;\n  display: grid;\n}\n\n.warn_place_items {\n  place-items: start end;\n  display: -ms-grid;\n  display: grid;\n}\n\n.place-self-a {\n  -ms-grid-row-align: center;\n  -ms-grid-column-align: center;\n  place-self: center;\n}\n\n.place-self-b {\n  -ms-grid-row-align: start;\n  -ms-grid-column-align: end;\n  place-self: start end;\n}\n\n/* must have correct -ms-grid-rows/columns values */\n.grid-correct-rows-columns {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: 50px 20px 1fr 20px 2fr 20px 1fr 20px 2fr 20px 50px;\n  grid-template-columns: 50px repeat(2, 1fr 2fr) 50px;\n  -ms-grid-rows: auto 20px 100px;\n  grid-template-rows: repeat(1, auto 100px);\n  grid-gap: 20px;\n  grid-template-areas:\n    \". . . . . .\"\n    \". . . . . .\";\n}\n\n.warn-auto-flow {\n  grid-auto-flow: column;\n  -ms-grid-columns: 1fr 1fr;\n  grid-template-columns: 1fr 1fr;\n  grid-template-areas:\n      \". .\"\n      \". .\";\n}\n\n.center-wrapper {\n  display: -ms-grid;\n  display: grid;\n  -ms-grid-columns: (1fr)[4];\n  grid-template-columns: repeat(4, 1fr);\n  grid-template-areas:\n    \". z z .\"\n    \". z z .\";\n}\n.center-item {\n  -ms-grid-row: 1;\n  -ms-grid-row-span: 2;\n  -ms-grid-column: 2;\n  -ms-grid-column-span: 2;\n  grid-area: z;\n  -ms-grid-row-align: center;\n  align-self: center;\n  -ms-grid-column-align: center;\n  justify-self: center;\n}\n\n.named {\n  -ms-grid-rows: 1fr;\n  grid-template-rows: 1fr;\n  -ms-grid-columns: [content] 1fr;\n  grid-template-columns: [content] 1fr;\n}\n\n.named > *:nth-child(1) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 1;\n}\n\n.named > *:nth-child(2) {\n  -ms-grid-row: 1;\n  -ms-grid-column: 2;\n}\n\n/** https://github.com/postcss/autoprefixer/issues/1446 */\n.issue-1446 {\n  grid-row-start: span 3;\n  grid-row-end: 5;\n}\n"
  },
  {
    "path": "test/cases/grouping-rule.css",
    "content": ".grid {\n  display: grid;\n}\n\n.a,\n.b,\n.c::selection,\n.d:read-only,\n.e::placeholder {\n  color: yellow;\n}\n\n::selection {\n  color: red;\n}\n\n:read-only {\n  color: black;\n}\n\n.f:read-write, .g:read-write {\n  background: #fff;\n}\n"
  },
  {
    "path": "test/cases/grouping-rule.out.css",
    "content": ".grid {\n  display: -ms-grid;\n  display: grid;\n}\n\n.c::-moz-selection {\n  color: yellow;\n}\n\n.e::-webkit-input-placeholder {\n  color: yellow;\n}\n\n.e:-moz-placeholder {\n  color: yellow;\n}\n\n.e::-moz-placeholder {\n  color: yellow;\n}\n\n.e:-ms-input-placeholder {\n  color: yellow;\n}\n\n.e::-ms-input-placeholder {\n  color: yellow;\n}\n\n.d:-moz-read-only {\n  color: yellow;\n}\n\n.a,\n.b,\n.c::selection,\n.d:read-only,\n.e::placeholder {\n  color: yellow;\n}\n\n::-moz-selection {\n  color: red;\n}\n\n::selection {\n  color: red;\n}\n\n:-moz-read-only {\n  color: black;\n}\n\n:read-only {\n  color: black;\n}\n\n.f:-moz-read-write, .g:-moz-read-write {\n  background: #fff;\n}\n\n.f:read-write, .g:read-write {\n  background: #fff;\n}\n"
  },
  {
    "path": "test/cases/ignore-next.css",
    "content": ".ignore-property {\n  /* autoprefixer: ignore next */\n  mask: none;\n  background: linear-gradient(to bottom, white, black);\n}\n\n.ignore-property_nospaces-comment {\n  /* autoprefixer:ignore next */\n  mask: none;\n  background: linear-gradient(to bottom, white, black);\n}\n\n/* autoprefixer: ignore next */\n.ignore-rule::placeholder {\n  mask: none;\n}\n\n/* autoprefixer: ignore next */\n@media (min-resolution: 2dppx) {\n  .ignore-at-rule::placeholder {\n    mask: none;\n  }\n}\n"
  },
  {
    "path": "test/cases/ignore-next.out.css",
    "content": ".ignore-property {\n  /* autoprefixer: ignore next */\n  mask: none;\n  background: -webkit-linear-gradient(top, white, black);\n  background: -o-linear-gradient(top, white, black);\n  background: linear-gradient(to bottom, white, black);\n}\n\n.ignore-property_nospaces-comment {\n  /* autoprefixer:ignore next */\n  mask: none;\n  background: -webkit-linear-gradient(top, white, black);\n  background: -o-linear-gradient(top, white, black);\n  background: linear-gradient(to bottom, white, black);\n}\n\n/* autoprefixer: ignore next */\n.ignore-rule::placeholder {\n  -webkit-mask: none;\n          mask: none;\n}\n\n/* autoprefixer: ignore next */\n@media (min-resolution: 2dppx) {\n  .ignore-at-rule::-webkit-input-placeholder {\n    -webkit-mask: none;\n            mask: none;\n  }\n  .ignore-at-rule::placeholder {\n    -webkit-mask: none;\n            mask: none;\n  }\n}\n"
  },
  {
    "path": "test/cases/image-rendering.css",
    "content": "img {\n  image-rendering: crisp-edges;\n}\n\nimg.other {\n  image-rendering: pixelated;\n}\n\nimg.already {\n  -ms-interpolation-mode: nearest-neighbor;\n  display: block;\n  image-rendering: crisp-edges;\n  image-rendering: pixelated;\n}\n"
  },
  {
    "path": "test/cases/image-rendering.out.css",
    "content": "img {\n  image-rendering: crisp-edges;\n}\n\nimg.other {\n  -ms-interpolation-mode: nearest-neighbor;\n      image-rendering: -webkit-optimize-contrast;\n      image-rendering: -moz-crisp-edges;\n      image-rendering: -o-pixelated;\n      image-rendering: pixelated;\n}\n\nimg.already {\n  -ms-interpolation-mode: nearest-neighbor;\n  display: block;\n  image-rendering: crisp-edges;\n  image-rendering: -webkit-optimize-contrast;\n  image-rendering: -moz-crisp-edges;\n  image-rendering: -o-pixelated;\n  image-rendering: pixelated;\n}\n"
  },
  {
    "path": "test/cases/image-set.css",
    "content": "a {\n  background-image: image-set(url(foo@1x.png) 1x, url(foo@2x.png) 2x);\n}\n\nh1 {\n  background-image: image-set('foo@1x.png' 1x, \"foo@2x.png\" 2x);\n}\n"
  },
  {
    "path": "test/cases/image-set.out.css",
    "content": "a {\n  background-image: -webkit-image-set(url(foo@1x.png) 1x, url(foo@2x.png) 2x);\n  background-image: image-set(url(foo@1x.png) 1x, url(foo@2x.png) 2x);\n}\n\nh1 {\n  background-image: -webkit-image-set(url('foo@1x.png') 1x, url(\"foo@2x.png\") 2x);\n  background-image: image-set('foo@1x.png' 1x, \"foo@2x.png\" 2x);\n}\n"
  },
  {
    "path": "test/cases/intrinsic.css",
    "content": "a {\n  width: stretch;\n}\n\nb {\n  height: max-content;\n}\n\np {\n  block-size: min-content;\n  min-inline-size: fit-content;\n}\n\n.outdated {\n  width: fill;\n}\n\n.old {\n  width: fill-available;\n}\n\n.ok {\n  width: calc(100% - var(--jqx-circular-progress-bar-fill-size));\n}\n\n.grid {\n  grid: min-content max-content / fit-content(500px);\n}\n\n.grid-template {\n  grid-template: min-content / fit-content(10px) max-content;\n  grid-template: max-content 1fr max-content max-content / max-content 1fr;\n}\n\n.grid-template-columns {\n  grid-template-columns: minmax(100px, min-content);\n}\n\n.grid-auto-columns {\n  grid-auto-columns: min-content max-content;\n}\n\n.ignore {\n  width: -webkit-fill-available;\n}\n"
  },
  {
    "path": "test/cases/intrinsic.ff.css",
    "content": "a {\n  width: -moz-available;\n  width: stretch;\n}\n\nb {\n  height: max-content;\n}\n\np {\n  block-size: min-content;\n  min-inline-size: -moz-fit-content;\n  min-inline-size: fit-content;\n}\n\n.outdated {\n  width: fill;\n}\n\n.old {\n  width: fill-available;\n}\n\n.ok {\n  width: calc(100% - var(--jqx-circular-progress-bar-fill-size));\n}\n\n.grid {\n  grid: min-content max-content / fit-content(500px);\n}\n\n.grid-template {\n  grid-template: min-content / fit-content(10px) max-content;\n  grid-template: max-content 1fr max-content max-content / max-content 1fr;\n}\n\n.grid-template-columns {\n  grid-template-columns: minmax(100px, min-content);\n}\n\n.grid-auto-columns {\n  grid-auto-columns: min-content max-content;\n}\n\n.ignore {\n  width: -webkit-fill-available;\n}\n"
  },
  {
    "path": "test/cases/intrinsic.out.css",
    "content": "a {\n  width: -webkit-fill-available;\n  width: -moz-available;\n  width: stretch;\n}\n\nb {\n  height: -webkit-max-content;\n  height: -moz-max-content;\n  height: max-content;\n}\n\np {\n  block-size: -webkit-min-content;\n  block-size: -moz-min-content;\n  block-size: min-content;\n  min-inline-size: -webkit-fit-content;\n  min-inline-size: -moz-fit-content;\n  min-inline-size: fit-content;\n}\n\n.outdated {\n  width: -webkit-fill-available;\n  width: -moz-available;\n  width: fill;\n}\n\n.old {\n  width: -webkit-fill-available;\n  width: -moz-available;\n  width: fill-available;\n}\n\n.ok {\n  width: -webkit-calc(100% - var(--jqx-circular-progress-bar-fill-size));\n  width: calc(100% - var(--jqx-circular-progress-bar-fill-size));\n}\n\n.grid {\n  grid: -webkit-min-content -webkit-max-content / fit-content(500px);\n  grid: min-content max-content / fit-content(500px);\n}\n\n.grid-template {\n  grid-template: -webkit-min-content / fit-content(10px) -webkit-max-content;\n  grid-template: min-content / fit-content(10px) max-content;\n  grid-template: -webkit-max-content 1fr -webkit-max-content -webkit-max-content / -webkit-max-content 1fr;\n  grid-template: max-content 1fr max-content max-content / max-content 1fr;\n}\n\n.grid-template-columns {\n  grid-template-columns: minmax(100px, -webkit-min-content);\n  grid-template-columns: minmax(100px, min-content);\n}\n\n.grid-auto-columns {\n  grid-auto-columns: -webkit-min-content -webkit-max-content;\n  grid-auto-columns: min-content max-content;\n}\n\n.ignore {\n  width: -webkit-fill-available;\n}\n"
  },
  {
    "path": "test/cases/keyframes.css",
    "content": "@keyframes anim {\n  from {\n    top: calc(10% + 10px);\n    transform: rotate(10deg)\n  }\n  50% {\n    top: 0;\n    display: flex\n  }\n  to {\n    top: calc(10%);\n    transform: rotate(0)\n  }\n}\n@media screen {\n  @keyframes inside {}\n}\n@keyframes spaces { from { color: black } to { color: white } }\n"
  },
  {
    "path": "test/cases/keyframes.out.css",
    "content": "@-webkit-keyframes anim {\n  from {\n    top: -webkit-calc(10% + 10px);\n    top: calc(10% + 10px);\n    -webkit-transform: rotate(10deg);\n            transform: rotate(10deg)\n  }\n  50% {\n    top: 0;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: flex\n  }\n  to {\n    top: -webkit-calc(10%);\n    top: calc(10%);\n    -webkit-transform: rotate(0);\n            transform: rotate(0)\n  }\n}\n@-o-keyframes anim {\n  from {\n    top: calc(10% + 10px);\n    -o-transform: rotate(10deg);\n       transform: rotate(10deg)\n  }\n  50% {\n    top: 0;\n    display: flex\n  }\n  to {\n    top: calc(10%);\n    -o-transform: rotate(0);\n       transform: rotate(0)\n  }\n}\n@keyframes anim {\n  from {\n    top: -webkit-calc(10% + 10px);\n    top: calc(10% + 10px);\n    -webkit-transform: rotate(10deg);\n         -o-transform: rotate(10deg);\n            transform: rotate(10deg)\n  }\n  50% {\n    top: 0;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: flex\n  }\n  to {\n    top: -webkit-calc(10%);\n    top: calc(10%);\n    -webkit-transform: rotate(0);\n         -o-transform: rotate(0);\n            transform: rotate(0)\n  }\n}\n@media screen {\n  @-webkit-keyframes inside {}\n  @-o-keyframes inside {}\n  @keyframes inside {}\n}\n@-webkit-keyframes spaces { from { color: black } to { color: white } }\n@-o-keyframes spaces { from { color: black } to { color: white } }\n@keyframes spaces { from { color: black } to { color: white } }\n"
  },
  {
    "path": "test/cases/logical.css",
    "content": "a {\n  margin-block-start: 1px;\n  margin-inline-start: 1px;\n  padding-inline-end: 1px;\n}\n\n.border {\n  border-block-end: 1px;\n  border-inline-end: 1px;\n}\n"
  },
  {
    "path": "test/cases/logical.out.css",
    "content": "a {\n  -webkit-margin-before: 1px;\n          margin-block-start: 1px;\n  -webkit-margin-start: 1px;\n     -moz-margin-start: 1px;\n          margin-inline-start: 1px;\n  -webkit-padding-end: 1px;\n     -moz-padding-end: 1px;\n          padding-inline-end: 1px;\n}\n\n.border {\n  -webkit-border-after: 1px;\n          border-block-end: 1px;\n  -webkit-border-end: 1px;\n     -moz-border-end: 1px;\n          border-inline-end: 1px;\n}\n"
  },
  {
    "path": "test/cases/mask-border.css",
    "content": "a {\n  mask-border-source: url(image.png);\n  mask-border-slice: 50% fill;\n  mask-border-width: auto 1 50%;\n  mask-border-outset: 0 1 2;\n  mask-border-repeat: repeat space;\n  mask-border: url(#foo) 1 fill;\n}\n"
  },
  {
    "path": "test/cases/mask-border.out.css",
    "content": "a {\n  -webkit-mask-box-image-source: url(image.png);\n          mask-border-source: url(image.png);\n  -webkit-mask-box-image-slice: 50% fill;\n          mask-border-slice: 50% fill;\n  -webkit-mask-box-image-width: auto 1 50%;\n          mask-border-width: auto 1 50%;\n  -webkit-mask-box-image-outset: 0 1 2;\n          mask-border-outset: 0 1 2;\n  -webkit-mask-box-image-repeat: repeat space;\n          mask-border-repeat: repeat space;\n  -webkit-mask-box-image: url(#foo) 1 fill;\n          mask-border: url(#foo) 1 fill;\n}\n"
  },
  {
    "path": "test/cases/mask-composite.css",
    "content": "a {\n  mask: url(add.png) add, url(substract.png);\n}\n\na {\n  mask: url(intersect.png) intersect, url(exclude.png);\n}\n\na {\n  mask: url(image.png) intersect, url(image.png) add, url(image.png);\n}\n\na {\n  mask-composite: add;\n}\n\na {\n  mask-composite:;\n}\n\na {\n  mask-composite: add, subtract, exclude;\n}"
  },
  {
    "path": "test/cases/mask-composite.out.css",
    "content": "a {\n  -webkit-mask: url(add.png), url(substract.png);\n  -webkit-mask-composite: source-over;\n          mask: url(add.png) add, url(substract.png);\n}\n\na {\n  -webkit-mask: url(intersect.png), url(exclude.png);\n  -webkit-mask-composite: source-in, xor;\n          mask: url(intersect.png) intersect, url(exclude.png);\n}\n\na {\n  -webkit-mask: url(image.png), url(image.png), url(image.png);\n  -webkit-mask-composite: source-in, source-over, xor;\n          mask: url(image.png) intersect, url(image.png) add, url(image.png);\n}\n\na {\n  -webkit-mask-composite: source-over;\n          mask-composite: add;\n}\n\na {\n  mask-composite:;\n}\n\na {\n  -webkit-mask-composite: source-over, source-out, xor;\n          mask-composite: add, subtract, exclude;\n}"
  },
  {
    "path": "test/cases/mistakes.css",
    "content": "a {\n  -ms-transition: all 1s;\n  transition: all 1s;\n\n  -ms-border-radius: 5px;\n  border-radius: 5px;\n\n  background: -ms-linear-gradient(white, black);\n  background: linear-gradient(white, black);\n}\n"
  },
  {
    "path": "test/cases/mistakes.out.css",
    "content": "a {\n  transition: all 1s;\n  border-radius: 5px;\n  background: linear-gradient(white, black);\n}\n"
  },
  {
    "path": "test/cases/multicolumn.css",
    "content": ".a {\n  break-inside: auto;\n  break-before: auto;\n  break-after: auto;\n}\n\n.b {\n  break-inside: avoid;\n}\n\n.c {\n  break-inside: avoid-column;\n}\n\n.d {\n  break-inside: avoid-page;\n}\n\n.e {\n  break-inside: avoid-region;\n}\n\n.f {\n  break-inside: region;\n}\n"
  },
  {
    "path": "test/cases/multicolumn.out.css",
    "content": ".a {\n  -webkit-column-break-inside: auto;\n          break-inside: auto;\n  -webkit-column-break-before: auto;\n          break-before: auto;\n  -webkit-column-break-after: auto;\n          break-after: auto;\n}\n\n.b {\n  -webkit-column-break-inside: avoid;\n          break-inside: avoid;\n}\n\n.c {\n  -webkit-column-break-inside: avoid;\n          break-inside: avoid-column;\n}\n\n.d {\n  break-inside: avoid-page;\n}\n\n.e {\n  break-inside: avoid-region;\n}\n\n.f {\n  break-inside: region;\n}\n"
  },
  {
    "path": "test/cases/notes.css",
    "content": "a {\n  display: flex;\n}\n"
  },
  {
    "path": "test/cases/notes.out.css",
    "content": "a {\n  display: -webkit-flex;\n  display: flex;\n}\n"
  },
  {
    "path": "test/cases/overscroll-behavior.css",
    "content": ".none {\n  overscroll-behavior: none;\n}\n\n.contain {\n  overscroll-behavior: contain;\n}\n\n.auto {\n  overscroll-behavior: auto;\n}\n\n.inherit {\n  overscroll-behavior: inherit;\n}\n"
  },
  {
    "path": "test/cases/overscroll-behavior.out.css",
    "content": ".none {\n  -ms-scroll-chaining: none;\n      overscroll-behavior: none;\n}\n\n.contain {\n  -ms-scroll-chaining: none;\n      overscroll-behavior: contain;\n}\n\n.auto {\n  -ms-scroll-chaining: chained;\n      overscroll-behavior: auto;\n}\n\n.inherit {\n  -ms-scroll-chaining: inherit;\n      overscroll-behavior: inherit;\n}\n"
  },
  {
    "path": "test/cases/pie.css",
    "content": "a {\n  -pie-background: linear-gradient(white, black)\n}\n"
  },
  {
    "path": "test/cases/placeholder-shown.css",
    "content": ":placeholder-shown {\n  background: #eee\n}\n"
  },
  {
    "path": "test/cases/placeholder-shown.out.css",
    "content": ":-ms-input-placeholder {\n  background: #eee\n}\n:placeholder-shown {\n  background: #eee\n}\n"
  },
  {
    "path": "test/cases/placeholder.css",
    "content": "::placeholder {\n  color: #999\n}\n"
  },
  {
    "path": "test/cases/placeholder.out.css",
    "content": "::-webkit-input-placeholder {\n  color: #999\n}\n:-moz-placeholder {\n  color: #999\n}\n::-moz-placeholder {\n  color: #999\n}\n:-ms-input-placeholder {\n  color: #999\n}\n::-ms-input-placeholder {\n  color: #999\n}\n::placeholder {\n  color: #999\n}\n"
  },
  {
    "path": "test/cases/print-color-adjust.css",
    "content": ".a {\n  color-adjust: economy;\n}\n\n.b {\n  print-color-adjust: exact;\n}\n"
  },
  {
    "path": "test/cases/print-color-adjust.out.css",
    "content": ".a {\n  -webkit-print-color-adjust: economy;\n          color-adjust: economy;\n}\n\n.b {\n  -webkit-print-color-adjust: exact;\n     color-adjust: exact;\n          print-color-adjust: exact;\n}\n"
  },
  {
    "path": "test/cases/resolution.css",
    "content": "@media (min-resolution: 2dppx),\n       (min-resolution: 192dpi) { }\n\n@media (min-resolution: 2.5dppx) { }\n\n@media (min-resolution: 144dpi) { }\n\n@media (min-resolution: 2x) { }\n\n@media (min-resolution: 120dpi) { }\n\n@media (min-resolution: 2dppx) { }\n\n@media only screen and (min-resolution: 124.8dpi) { }\n\n@media (min-resolution: 113.38dpcm) { }\n"
  },
  {
    "path": "test/cases/resolution.out.css",
    "content": "@media (-webkit-min-device-pixel-ratio: 2),\n       (min--moz-device-pixel-ratio: 2),\n       (-o-min-device-pixel-ratio: 2/1),\n       (min-resolution: 2dppx),\n       (min-resolution: 192dpi) { }\n\n@media (-webkit-min-device-pixel-ratio: 2.5), (min--moz-device-pixel-ratio: 2.5), (-o-min-device-pixel-ratio: 5/2), (min-resolution: 2.5dppx) { }\n\n@media (-webkit-min-device-pixel-ratio: 1.5), (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3/2), (min-resolution: 144dpi) { }\n\n@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (-o-min-device-pixel-ratio: 2/1), (min-resolution: 2x) { }\n\n@media (-webkit-min-device-pixel-ratio: 1.25), (min--moz-device-pixel-ratio: 1.25), (-o-min-device-pixel-ratio: 5/4), (min-resolution: 120dpi) { }\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) { }\n\n@media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 13/10), only screen and (min-resolution: 124.8dpi) { }\n\n@media (-webkit-min-device-pixel-ratio: 3), (min--moz-device-pixel-ratio: 3), (-o-min-device-pixel-ratio: 3/1), (min-resolution: 113.38dpcm) { }\n"
  },
  {
    "path": "test/cases/scope.css",
    "content": "a {\n  /* autoprefixer: off */\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  /* autoprefixer: on */\n  mask: none;\n}\n"
  },
  {
    "path": "test/cases/scope.out.css",
    "content": "a {\n  /* autoprefixer: off */\n  -webkit-border-radius: 4px;\n          border-radius: 4px;\n  /* autoprefixer: on */\n  mask: none;\n}\n"
  },
  {
    "path": "test/cases/selectors.css",
    "content": "\n[href=:fullscreen] {}\n\n:fullscreen a {\n  box-sizing: border-box\n}\n\n:fullscreen a {\n  color: black\n}\n\n:-moz-full-screen a {\n  transform: translate3d(0, 0, 0);\n}\n"
  },
  {
    "path": "test/cases/selectors.out.css",
    "content": "\n[href=:fullscreen] {}\n\n:-webkit-full-screen a {\n  box-sizing: border-box\n}\n\n:-moz-full-screen a {\n  -moz-box-sizing: border-box;\n       box-sizing: border-box\n}\n\n:fullscreen a {\n  -moz-box-sizing: border-box;\n       box-sizing: border-box\n}\n\n:-webkit-full-screen a {\n  color: black\n}\n\n:-moz-full-screen a {\n  color: black\n}\n\n:fullscreen a {\n  color: black\n}\n\n:-moz-full-screen a {\n  transform: translate3d(0, 0, 0);\n}\n"
  },
  {
    "path": "test/cases/style.css",
    "content": "a {\n  color : black;\n  display: flex\n}\n"
  },
  {
    "path": "test/cases/style.out.css",
    "content": "a {\n  color : black;\n  display: -webkit-flex;\n  display: flex\n}\n"
  },
  {
    "path": "test/cases/supports.css",
    "content": "@supports\n  (cursor: grab) or\n  not (mask: none) and\n  (color: black) {\n  a {\n    color: black;\n  }\n}\n\n@supports not (display: flex) {\n  a {\n    color: #000;\n  }\n}\n\n@supports ((perspective: 1px) and (not (-webkit-overflow-scrolling: touch))) {\n  a {\n    color: #000;\n  }\n}\n\n@supports (animation-name: test) and ((animation-timing-function: steps(4, end)) or (animation-timing-function: step-end)) {\n  animation-name: test;\n}\n\n@supports (transition: color 1s) {\n  transition: color 1s;\n}\n"
  },
  {
    "path": "test/cases/supports.out.css",
    "content": "@supports\n  ((cursor: -webkit-grab) or (cursor: grab)) or\n  not ((-webkit-mask: none) or (mask: none)) and\n  (color: black) {\n  a {\n    color: black;\n  }\n}\n\n@supports not ((display: -webkit-flex) or (display: flex)) {\n  a {\n    color: #000;\n  }\n}\n\n@supports (((-webkit-perspective: 1px) or (perspective: 1px)) and (not (-webkit-overflow-scrolling: touch))) {\n  a {\n    color: #000;\n  }\n}\n\n@supports ((-webkit-animation-name: test) or (animation-name: test)) and (((-webkit-animation-timing-function: steps(4, end)) or (animation-timing-function: steps(4, end))) or ((-webkit-animation-timing-function: step-end) or (animation-timing-function: step-end))) {\n  -webkit-animation-name: test;\n          animation-name: test;\n}\n\n@supports (transition: color 1s) {\n  -webkit-transition: color 1s;\n  transition: color 1s;\n}\n"
  },
  {
    "path": "test/cases/syntax.css",
    "content": "@page {\n  margin: 0.5cm;\n}\n\n/* comment */\n\n@-moz-document url-prefix() {\n  a {\n    color: black;\n  }\n}\n\na {\n  /* c */\n  color/**/: white;\n  padding: 0 /*{}*/ 1px /*}*/ 2px;\n}\n"
  },
  {
    "path": "test/cases/text-decoration.css",
    "content": ".shorthand {\n  text-decoration: overline double red;\n}\n\n.shorthand-single-value {\n  text-decoration: underline;\n}\n\n.full {\n  text-decoration-color: green;\n  text-decoration-line: line-through;\n  text-decoration-style: double;\n}\n\n.old {\n  text-decoration: underline;\n}\n\n.global {\n  text-decoration: unset;\n}\n\n.skip {\n  text-decoration-skip: spaces;\n}\n\n.ink {\n  text-decoration-skip-ink: auto;\n}\n\n.old-ink {\n  text-decoration-skip: ink;\n}\n"
  },
  {
    "path": "test/cases/text-decoration.out.css",
    "content": ".shorthand {\n  -webkit-text-decoration: overline double red;\n          text-decoration: overline double red;\n}\n\n.shorthand-single-value {\n  text-decoration: underline;\n}\n\n.full {\n  -webkit-text-decoration-color: green;\n     -moz-text-decoration-color: green;\n          text-decoration-color: green;\n  -webkit-text-decoration-line: line-through;\n     -moz-text-decoration-line: line-through;\n          text-decoration-line: line-through;\n  -webkit-text-decoration-style: double;\n     -moz-text-decoration-style: double;\n          text-decoration-style: double;\n}\n\n.old {\n  text-decoration: underline;\n}\n\n.global {\n  text-decoration: unset;\n}\n\n.skip {\n  -webkit-text-decoration-skip: spaces;\n          text-decoration-skip: spaces;\n}\n\n.ink {\n  -webkit-text-decoration-skip: ink;\n          text-decoration-skip-ink: auto;\n}\n\n.old-ink {\n  -webkit-text-decoration-skip: ink;\n          text-decoration-skip: ink;\n}\n"
  },
  {
    "path": "test/cases/text-decoration.shorthand.out.css",
    "content": ".shorthand {\n  -webkit-text-decoration: overline double red;\n          text-decoration: overline double red;\n}\n\n.shorthand-single-value {\n  text-decoration: underline;\n}\n\n.full {\n  text-decoration-color: green;\n  text-decoration-line: line-through;\n  text-decoration-style: double;\n}\n\n.old {\n  text-decoration: underline;\n}\n\n.global {\n  text-decoration: unset;\n}\n\n.skip {\n  text-decoration-skip: spaces;\n}\n\n.ink {\n  text-decoration-skip-ink: auto;\n}\n\n.old-ink {\n  text-decoration-skip: ink;\n}\n"
  },
  {
    "path": "test/cases/text-emphasis-position.css",
    "content": "a {\n  text-emphasis-position: over left;\n}\n\nem {\n  text-emphasis-position: under right;\n}\n\n.reverse {\n  text-emphasis-position: left over;\n}\n\n.wrong {\n  text-emphasis-position: over;\n}\n"
  },
  {
    "path": "test/cases/text-emphasis-position.out.css",
    "content": "a {\n  -webkit-text-emphasis-position: over;\n          text-emphasis-position: over left;\n}\n\nem {\n  -webkit-text-emphasis-position: under;\n          text-emphasis-position: under right;\n}\n\n.reverse {\n  -webkit-text-emphasis-position: over;\n          text-emphasis-position: left over;\n}\n\n.wrong {\n  -webkit-text-emphasis-position: over;\n          text-emphasis-position: over;\n}\n"
  },
  {
    "path": "test/cases/transition-no-warning.css",
    "content": ".no-warn {\n  transition-property: color, opacity;\n  transition-duration: 1s, 2s;\n}\n"
  },
  {
    "path": "test/cases/transition-no-warning.out.css",
    "content": ".no-warn {\n  -webkit-transition-property: color, opacity;\n  -o-transition-property: color, opacity;\n  transition-property: color, opacity;\n  -webkit-transition-duration: 1s, 2s;\n       -o-transition-duration: 1s, 2s;\n          transition-duration: 1s, 2s;\n}\n"
  },
  {
    "path": "test/cases/transition-spec.css",
    "content": "input[type=range]::-moz-range-thumb {\n  transition: color 200ms, transform 200ms;\n  transform: rotate(10deg);\n}\n\ninput[type=range]::-webkit-slider-thumb {\n  transition: none;\n  transition-property: all;\n}\n\nbutton::-moz-submit-invalid {\n  opacity: 1;\n  transform: translateX(45px);\n  transition: opacity 0.5s 2s, transform 0.5s 0.5s;\n}\n\n@supports (transition: opacity 0.5s 2s, transform 0.5s 0.5s) {\n  button::-moz-submit-invalid {\n    opacity: 1;\n    transform: translateX(45px);\n    transition: opacity 0.5s 2s, transform 0.5s 0.5s;\n  }\n\n  button {\n    opacity: 1;\n    transform: translateX(45px);\n    transition: opacity 0.5s 2s, transform 0.5s 0.5s;\n  }\n}\n\nbutton::-webkit-search-cancel-button {\n  display: flex;\n  transition: color 200ms, transform 200ms;\n  transform: rotate(10deg);\n}\n\nbutton::-webkit-search-cancel-button {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-transition: color 200ms, -webkit-transform 200ms;\n  transition: color 200ms, -webkit-transform 200ms;\n  transition: color 200ms, transform 200ms;\n  transition: color 200ms, transform 200ms, -webkit-transform 200ms;\n  -webkit-transform: rotate(10deg);\n          transform: rotate(10deg);\n}\n\n.a::-webkit-search-cancel-button {\n  display: flex;\n  flex-flow: row;\n  order: 0;\n  flex: 0 1 2;\n  transition: flex 200ms;\n}\n"
  },
  {
    "path": "test/cases/transition-spec.out.css",
    "content": "input[type=range]::-moz-range-thumb {\n  -moz-transition: color 200ms, transform 200ms, -moz-transform 200ms;\n  transition: color 200ms, transform 200ms;\n  transition: color 200ms, transform 200ms, -moz-transform 200ms;\n  -moz-transform: rotate(10deg);\n       transform: rotate(10deg);\n}\n\ninput[type=range]::-webkit-slider-thumb {\n  -webkit-transition: none;\n  transition: none;\n  -webkit-transition-property: all;\n  transition-property: all;\n}\n\nbutton::-moz-submit-invalid {\n  opacity: 1;\n  -moz-transform: translateX(45px);\n       transform: translateX(45px);\n  -moz-transition: opacity 0.5s 2s, transform 0.5s 0.5s, -moz-transform 0.5s 0.5s;\n  transition: opacity 0.5s 2s, transform 0.5s 0.5s;\n  transition: opacity 0.5s 2s, transform 0.5s 0.5s, -moz-transform 0.5s 0.5s;\n}\n\n@supports (transition: opacity 0.5s 2s, transform 0.5s 0.5s) {\n  button::-moz-submit-invalid {\n    opacity: 1;\n    -moz-transform: translateX(45px);\n         transform: translateX(45px);\n    -moz-transition: opacity 0.5s 2s, transform 0.5s 0.5s, -moz-transform 0.5s 0.5s;\n    transition: opacity 0.5s 2s, transform 0.5s 0.5s;\n    transition: opacity 0.5s 2s, transform 0.5s 0.5s, -moz-transform 0.5s 0.5s;\n  }\n\n  button {\n    opacity: 1;\n    -webkit-transform: translateX(45px);\n       -moz-transform: translateX(45px);\n         -o-transform: translateX(45px);\n            transform: translateX(45px);\n    -webkit-transition: opacity 0.5s 2s, -webkit-transform 0.5s 0.5s;\n    transition: opacity 0.5s 2s, -webkit-transform 0.5s 0.5s;\n    -o-transition: opacity 0.5s 2s, -o-transform 0.5s 0.5s;\n    -moz-transition: opacity 0.5s 2s, transform 0.5s 0.5s, -moz-transform 0.5s 0.5s;\n    transition: opacity 0.5s 2s, transform 0.5s 0.5s;\n    transition: opacity 0.5s 2s, transform 0.5s 0.5s, -webkit-transform 0.5s 0.5s, -moz-transform 0.5s 0.5s, -o-transform 0.5s 0.5s;\n  }\n}\n\nbutton::-webkit-search-cancel-button {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-transition: color 200ms, -webkit-transform 200ms;\n  transition: color 200ms, -webkit-transform 200ms;\n  transition: color 200ms, transform 200ms;\n  transition: color 200ms, transform 200ms, -webkit-transform 200ms;\n  -webkit-transform: rotate(10deg);\n          transform: rotate(10deg);\n}\n\nbutton::-webkit-search-cancel-button {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-transition: color 200ms, -webkit-transform 200ms;\n  transition: color 200ms, -webkit-transform 200ms;\n  transition: color 200ms, transform 200ms;\n  transition: color 200ms, transform 200ms, -webkit-transform 200ms;\n  -webkit-transform: rotate(10deg);\n          transform: rotate(10deg);\n}\n\n.a::-webkit-search-cancel-button {\n  display: -webkit-box;\n  display: -webkit-flex;\n  display: flex;\n  -webkit-box-orient: horizontal;\n  -webkit-box-direction: normal;\n  -webkit-flex-flow: row;\n          flex-flow: row;\n  -webkit-box-ordinal-group: 1;\n  -webkit-order: 0;\n          order: 0;\n  -webkit-box-flex: 0;\n  -webkit-flex: 0 1 2;\n          flex: 0 1 2;\n  -webkit-transition: -webkit-box-flex 200ms, -webkit-flex 200ms;\n  transition: -webkit-box-flex 200ms, -webkit-flex 200ms;\n  transition: flex 200ms;\n  transition: flex 200ms, -webkit-box-flex 200ms, -webkit-flex 200ms;\n}\n"
  },
  {
    "path": "test/cases/transition.css",
    "content": "a {\n  transition: color 200ms, transform 200ms;\n  transform: rotate(10deg);\n}\n\ndiv {\n  transition-property: filter;\n  animation-name: rotating;\n}\n\n.good {\n  transition-property: filter;\n  transition-duration: 1s;\n}\n\n.good2 {\n  transition-property: color, filter;\n  transition-timing-function: cubic-bezier(0.55, 0, 0.1, 1);\n}\n\n.bad {\n  /* safe with different node types */\n  transition-property: color, filter;\n  transition-duration: 1s, 2s;\n}\n\n.revert {\n  transition: 200ms transform;\n}\n"
  },
  {
    "path": "test/cases/transition.out.css",
    "content": "a {\n  -webkit-transition: color 200ms, -webkit-transform 200ms;\n  transition: color 200ms, -webkit-transform 200ms;\n  -o-transition: color 200ms, -o-transform 200ms;\n  transition: color 200ms, transform 200ms;\n  transition: color 200ms, transform 200ms, -webkit-transform 200ms, -o-transform 200ms;\n  -webkit-transform: rotate(10deg);\n       -o-transform: rotate(10deg);\n          transform: rotate(10deg);\n}\n\ndiv {\n  -webkit-transition-property: -webkit-filter;\n  transition-property: -webkit-filter;\n  -o-transition-property: filter;\n  transition-property: filter;\n  transition-property: filter, -webkit-filter;\n  -webkit-animation-name: rotating;\n       -o-animation-name: rotating;\n          animation-name: rotating;\n}\n\n.good {\n  -webkit-transition-property: -webkit-filter;\n  transition-property: -webkit-filter;\n  -o-transition-property: filter;\n  transition-property: filter;\n  transition-property: filter, -webkit-filter;\n  -webkit-transition-duration: 1s;\n       -o-transition-duration: 1s;\n          transition-duration: 1s;\n}\n\n.good2 {\n  -webkit-transition-property: color, -webkit-filter;\n  transition-property: color, -webkit-filter;\n  -o-transition-property: color, filter;\n  transition-property: color, filter;\n  transition-property: color, filter, -webkit-filter;\n  -webkit-transition-timing-function: cubic-bezier(0.55, 0, 0.1, 1);\n       -o-transition-timing-function: cubic-bezier(0.55, 0, 0.1, 1);\n          transition-timing-function: cubic-bezier(0.55, 0, 0.1, 1);\n}\n\n.bad {\n  /* safe with different node types */\n  -webkit-transition-property: color, -webkit-filter;\n  transition-property: color, -webkit-filter;\n  -o-transition-property: color, filter;\n  transition-property: color, filter;\n  transition-property: color, filter, -webkit-filter;\n  -webkit-transition-duration: 1s, 2s;\n       -o-transition-duration: 1s, 2s;\n          transition-duration: 1s, 2s;\n}\n\n.revert {\n  -webkit-transition: 200ms -webkit-transform;\n  transition: 200ms -webkit-transform;\n  -o-transition: 200ms -o-transform;\n  transition: 200ms transform;\n  transition: 200ms transform, 200ms -webkit-transform, 200ms -o-transform;\n}\n"
  },
  {
    "path": "test/cases/trim.css",
    "content": "a {\n  background: -webkit-linear-gradient(top,       #f00 0%, #fff 100%);\n  background:         linear-gradient(to bottom, #f00 0%, #fff 100%);\n}\n"
  },
  {
    "path": "test/cases/uncascade.css",
    "content": "a {\n  -webkit-transition: 1s;\n  -moz-transition: 1s;\n  transition: 1s\n}\n\na {\n  -moz-transition: 1s;\n    -o-transition: 1s;\n       transition: 1s\n}\n\na {\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px\n}\n"
  },
  {
    "path": "test/cases/uncascade.out.css",
    "content": "a {\n  -moz-transition: 1s;\n  transition: 1s\n}\n\na {\n  -moz-transition: 1s;\n       transition: 1s\n}\n\na {\n  border-radius: 4px\n}\n"
  },
  {
    "path": "test/cases/user-select.css",
    "content": "a {\n  user-select: none;\n}\n\nb {\n  user-select: contain;\n}\n\n.all {\n  user-select: all;\n}\n\n.var {\n  user-select: var(--o-select);\n}\n"
  },
  {
    "path": "test/cases/user-select.out.css",
    "content": "a {\n  -webkit-user-select: none;\n      -ms-user-select: none;\n          user-select: none;\n}\n\nb {\n  -ms-user-select: element;\n      user-select: contain;\n}\n\n.all {\n  -webkit-user-select: all;\n          user-select: all;\n}\n\n.var {\n  -webkit-user-select: var(--o-select);\n      -ms-user-select: var(--o-select);\n          user-select: var(--o-select);\n}\n"
  },
  {
    "path": "test/cases/value-hack.css",
    "content": ".not-hack {\n  width: -webkit-calc(30% + 1px);\n  width: calc(30% + 1px);\n  display: -webkit-box;\n  display: flex;\n  transition: -webkit-filter 1s, filter 1s;\n}\n\n.not-hack2 {\n  transition: -webkit-filter 1s;\n  transition: filter 1s;\n}\n\n.hack {\n  width: -webkit-calc(30% + 1px);\n  display: -webkit-box;\n}\n"
  },
  {
    "path": "test/cases/value-hack.out.css",
    "content": ".not-hack {\n  width: calc(30% + 1px);\n  display: flex;\n  transition: filter 1s;\n}\n\n.not-hack2 {\n  transition: filter 1s;\n}\n\n.hack {\n  width: -webkit-calc(30% + 1px);\n  display: -webkit-box;\n}\n"
  },
  {
    "path": "test/cases/values.css",
    "content": "a {\n  margin: calc(5% + 5px) calc(10% + 10px);\n  background: linear-gradient(black, white), radial-gradient(white, black);\n  content: \" linear-gradient(black, white) \";\n}\n"
  },
  {
    "path": "test/cases/values.out.css",
    "content": "a {\n  margin: -webkit-calc(5% + 5px) -webkit-calc(10% + 10px);\n  margin: calc(5% + 5px) calc(10% + 10px);\n  background: -webkit-linear-gradient(black, white), -webkit-radial-gradient(white, black);\n  background: -o-linear-gradient(black, white), -o-radial-gradient(white, black);\n  background: linear-gradient(black, white), radial-gradient(white, black);\n  content: \" linear-gradient(black, white) \";\n}\n"
  },
  {
    "path": "test/cases/vendor-hack.css",
    "content": ".a {\n  -moz-transform: scale(.9999);\n  transform: scale(.9999);\n}\n\n.b {\n  -moz-transform: scale(.9999);\n}\n\n.c {\n  transform: scale(1);\n  -moz-transform: scale(2);\n}\n"
  },
  {
    "path": "test/cases/vendor-hack.out.css",
    "content": ".a {\n  transform: scale(.9999);\n}\n\n.b {\n  -moz-transform: scale(.9999);\n}\n\n.c {\n  transform: scale(1);\n  -moz-transform: scale(2);\n}\n"
  },
  {
    "path": "test/cases/viewport.css",
    "content": "@viewport {\n  width: device-width;\n}\n"
  },
  {
    "path": "test/cases/viewport.out.css",
    "content": "@-ms-viewport {\n  width: device-width;\n}\n@viewport {\n  width: device-width;\n}\n"
  },
  {
    "path": "test/cases/webkit-line-clamp.css",
    "content": ".limit-text {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n\n.simple-clamp {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-with-flex-direction {\n  flex-direction: column;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-with-flex-direction-and-box-direction {\n  flex-direction: column;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-box-direction: reverse;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-display-webkit-box-only {\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-display-webkit-box-orient-vertical-only {\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n"
  },
  {
    "path": "test/cases/webkit-line-clamp.out.css",
    "content": ".limit-text {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n\n.simple-clamp {\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-with-flex-direction {\n  flex-direction: column;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-with-flex-direction-and-box-direction {\n  flex-direction: column;\n  display: -webkit-box;\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-display-webkit-box-only {\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n}\n\n.clamp-display-webkit-box-orient-vertical-only {\n  -webkit-box-orient: vertical;\n  -webkit-line-clamp: 2;\n}\n"
  },
  {
    "path": "test/cases/writing-mode.css",
    "content": ".one {\n  writing-mode: horizontal-tb;\n}\n.two {\n  writing-mode: vertical-rl;\n}\n.three {\n  writing-mode: vertical-lr;\n}\n.rtl-vertical-rl {\n  writing-mode: vertical-rl;\n  direction: rtl;\n}\n.rtl-vertical-lr {\n  writing-mode: vertical-lr;\n  direction: rtl;\n}\n.rtl-horizontal-tb {\n  writing-mode: horizontal-tb;\n  direction: rtl;\n}\n.rtl-horizontal-tb-override-direction {\n  writing-mode: horizontal-tb;\n  direction: rtl;\n  direction: ltr;\n}\n"
  },
  {
    "path": "test/cases/writing-mode.out.css",
    "content": ".one {\n  -webkit-writing-mode: horizontal-tb;\n      -ms-writing-mode: lr-tb;\n          writing-mode: horizontal-tb;\n}\n.two {\n  -webkit-writing-mode: vertical-rl;\n      -ms-writing-mode: tb-rl;\n          writing-mode: vertical-rl;\n}\n.three {\n  -webkit-writing-mode: vertical-lr;\n      -ms-writing-mode: tb-lr;\n          writing-mode: vertical-lr;\n}\n.rtl-vertical-rl {\n  -webkit-writing-mode: vertical-rl;\n      -ms-writing-mode: bt-rl;\n          writing-mode: vertical-rl;\n  direction: rtl;\n}\n.rtl-vertical-lr {\n  -webkit-writing-mode: vertical-lr;\n      -ms-writing-mode: bt-lr;\n          writing-mode: vertical-lr;\n  direction: rtl;\n}\n.rtl-horizontal-tb {\n  -webkit-writing-mode: horizontal-tb;\n      -ms-writing-mode: rl-tb;\n          writing-mode: horizontal-tb;\n  direction: rtl;\n}\n.rtl-horizontal-tb-override-direction {\n  -webkit-writing-mode: horizontal-tb;\n      -ms-writing-mode: lr-tb;\n          writing-mode: horizontal-tb;\n  direction: rtl;\n  direction: ltr;\n}\n"
  },
  {
    "path": "test/declaration.test.js",
    "content": "let { parse } = require('postcss')\nlet { test } = require('uvu')\nlet { equal, is } = require('uvu/assert')\n\nlet Declaration = require('../lib/declaration')\nlet Prefixes = require('../lib/prefixes')\n\nlet prefixes, tabsize\ntest.before.each(() => {\n  prefixes = new Prefixes({}, {})\n  tabsize = new Declaration('tab-size', ['-moz-', '-ms-'], prefixes)\n})\n\ntest.after.each(() => {\n  delete prefixes.options.cascade\n})\n\ntest('checks values for other prefixes', () => {\n  is(tabsize.otherPrefixes('black', '-moz-'), false)\n  is(tabsize.otherPrefixes('-moz-black', '-moz-'), false)\n  is(tabsize.otherPrefixes('-dev-black', '-moz-'), false)\n  is(tabsize.otherPrefixes('-ms-black', '-moz-'), true)\n})\n\ntest('returns true by default', () => {\n  let css = parse('a {\\n  tab-size: 4 }')\n  is(tabsize.needCascade(css.first.first), true)\n})\n\ntest('return false is disabled', () => {\n  prefixes.options.cascade = false\n  let css = parse('a {\\n  tab-size: 4 }')\n  is(tabsize.needCascade(css.first.first), false)\n})\n\ntest('returns false on declarations in one line', () => {\n  let css = parse('a { tab-size: 4 } a {\\n  tab-size: 4 }')\n  is(tabsize.needCascade(css.first.first), false)\n  is(tabsize.needCascade(css.last.first), true)\n})\n\ntest('returns max prefix length', () => {\n  let decl = parse('a { tab-size: 4 }').first.first\n  let list = ['-webkit-', '-webkit- old', '-moz-']\n  equal(tabsize.maxPrefixed(list, decl), 8)\n})\n\ntest('returns before with cascade', () => {\n  let decl = parse('a { tab-size: 4 }').first.first\n  let list = ['-webkit-', '-moz- old', '-moz-']\n  equal(tabsize.calcBefore(list, decl, '-moz- old'), '    ')\n})\n\ntest('removes cascade', () => {\n  let css = parse('a {\\n' + '  -moz-tab-size: 4;\\n' + '       tab-size: 4 }')\n  let decl = css.first.nodes[1]\n  tabsize.restoreBefore(decl)\n  equal(decl.raws.before, '\\n  ')\n})\n\ntest('returns prefixed property', () => {\n  let css = parse('a { tab-size: 2 }')\n  let decl = css.first.first\n  equal(tabsize.prefixed(decl.prop, '-moz-'), '-moz-tab-size')\n})\n\ntest('returns property name by specification', () => {\n  equal(tabsize.normalize('tab-size'), 'tab-size')\n})\n\ntest('adds prefixes', () => {\n  let css = parse('a { -moz-tab-size: 2; tab-size: 2 }')\n  tabsize.process(css.first.nodes[1])\n  equal(css.toString(), 'a { -moz-tab-size: 2; -ms-tab-size: 2; tab-size: 2 }')\n})\n\ntest('checks parents prefix', () => {\n  let css = parse('::-moz-selection a { tab-size: 2 }')\n  tabsize.process(css.first.first)\n  equal(css.toString(), '::-moz-selection a { -moz-tab-size: 2; tab-size: 2 }')\n})\n\ntest('checks value for prefixes', () => {\n  let css = parse('a { tab-size: -ms-calc(2) }')\n  tabsize.process(css.first.first)\n  equal(\n    css.toString(),\n    'a { -ms-tab-size: -ms-calc(2); tab-size: -ms-calc(2) }'\n  )\n})\n\ntest('returns list of prefixeds', () => {\n  equal(tabsize.old('tab-size', '-moz-'), ['-moz-tab-size'])\n})\n\ntest.run()\n"
  },
  {
    "path": "test/info.test.js",
    "content": "let browserslist = require('browserslist')\nlet { agents } = require('caniuse-lite/dist/unpacker/agents')\nlet { test } = require('uvu')\nlet { equal, match } = require('uvu/assert')\n\nlet Browsers = require('../lib/browsers')\nlet info = require('../lib/info')\nlet Prefixes = require('../lib/prefixes')\n\nlet data = {\n  browsers: agents,\n  prefixes: {\n    '@keyframes': {\n      browsers: ['firefox 21']\n    },\n    'a': {\n      browsers: ['firefox 21', 'firefox 20', 'chrome 30'],\n      transition: true\n    },\n    'b': {\n      browsers: ['ie 6', 'firefox 20'],\n      props: ['a', '*']\n    },\n    'c': {\n      browsers: ['firefox 21'],\n      props: ['c']\n    },\n    'd': {\n      browsers: ['firefox 21'],\n      selector: true\n    },\n    'grid': {\n      browsers: ['ie 6'],\n      props: ['display']\n    },\n    'grid-row': {\n      browsers: ['ie 6']\n    },\n    'transition': {\n      browsers: ['firefox 21']\n    }\n  }\n}\n\ntest('returns selected browsers and prefixes', () => {\n  let browsers = new Browsers(data.browsers, [\n    'chrome 30',\n    'firefox 21',\n    'firefox 20',\n    'ie 6'\n  ])\n  let prefixes = new Prefixes(data.prefixes, browsers)\n\n  let coverage = browserslist.coverage([\n    'chrome 30',\n    'firefox 21',\n    'firefox 20',\n    'ie 6'\n  ])\n  let round = Math.round(coverage * 100) / 100.0\n\n  equal(\n    info(prefixes),\n    'Browsers:\\n' +\n      '  Chrome: 30\\n' +\n      '  Firefox: 21, 20\\n' +\n      '  IE: 6\\n' +\n      '\\n' +\n      `These browsers account for ${round}% ` +\n      'of all users globally\\n' +\n      '\\n' +\n      'At-Rules:\\n' +\n      '  @keyframes: moz\\n' +\n      '\\n' +\n      'Selectors:\\n' +\n      '  d: moz\\n' +\n      '\\n' +\n      'Properties:\\n' +\n      '  a: webkit, moz\\n' +\n      '  grid-row *: ms\\n' +\n      '  transition: moz\\n' +\n      '\\n' +\n      'Values:\\n' +\n      '  b: moz, ms\\n' +\n      '  c: moz\\n' +\n      '  grid *: ms\\n' +\n      '\\n' +\n      '* - Prefixes will be added only on grid: true option.\\n'\n  )\n})\n\ntest('does not show transitions unless they are necessary', () => {\n  let browsers = new Browsers(data.browsers, ['chrome 30', 'firefox 20'])\n  let prefixes = new Prefixes(data.prefixes, browsers)\n\n  let coverage = browserslist.coverage(['chrome 30', 'firefox 20'])\n  let round = Math.round(coverage * 100) / 100.0\n\n  equal(\n    info(prefixes),\n    'Browsers:\\n' +\n      '  Chrome: 30\\n' +\n      '  Firefox: 20\\n' +\n      '\\n' +\n      `These browsers account for ${round}% ` +\n      'of all users globally\\n' +\n      '\\n' +\n      'Properties:\\n' +\n      '  a: webkit, moz\\n' +\n      '\\n' +\n      'Values:\\n' +\n      '  b: moz\\n'\n  )\n})\n\ntest('returns string for empty prefixes', () => {\n  let browsers = new Browsers(data.browsers, ['ie 7'])\n  let prefixes = new Prefixes(data.prefixes, browsers)\n  match(info(prefixes), /remove Autoprefixer/)\n})\n\ntest('returns string for empty browsers', () => {\n  let browsers = new Browsers(data.browsers, [])\n  let prefixes = new Prefixes(data.prefixes, browsers)\n  equal(info(prefixes), 'No browsers selected')\n})\n\ntest.run()\n"
  },
  {
    "path": "test/old-selector.test.js",
    "content": "let { parse } = require('postcss')\nlet { test } = require('uvu')\nlet { is } = require('uvu/assert')\n\nlet Selector = require('../lib/selector')\n\nlet selector = new Selector('::selection', ['-moz-', '-ms-'])\nlet old = selector.old('-moz-')\n\ntest('returns true on last rule', () => {\n  let css = parse('::selection {} ::-moz-selection {}')\n  is(old.isHack(css.last), true)\n})\n\ntest('stops on another type', () => {\n  let css = parse('::-moz-selection {} ' + '@keyframes anim {} ::selection {}')\n  is(old.isHack(css.first), true)\n})\n\ntest('stops on another selector', () => {\n  let css = parse('::-moz-selection {} a {} ::selection {}')\n  is(old.isHack(css.first), true)\n})\n\ntest('finds unprefixed selector', () => {\n  let css = parse('::-moz-selection {} ' + '::-o-selection {} ::selection {}')\n  is(old.isHack(css.first), false)\n})\n\ntest('finds old selector', () => {\n  let css = parse('body::-moz-selection {} body::selection {}')\n  is(old.check(css.first), true)\n})\n\ntest('finds right', () => {\n  let css = parse('body:::-moz-selection {}')\n  is(old.check(css.first), false)\n})\n\ntest.run()\n"
  },
  {
    "path": "test/old-value.test.js",
    "content": "let { test } = require('uvu')\nlet { is } = require('uvu/assert')\n\nlet OldValue = require('../lib/old-value')\n\ntest('checks value in string', () => {\n  let old = new OldValue('calc', '-o-calc')\n  is(old.check('1px -o-calc(1px)'), true)\n  is(old.check('1px calc(1px)'), false)\n})\n\ntest('allows custom checks', () => {\n  let old = new OldValue('calc', '-o-calc', 'calc', /calc/)\n  is(old.check('1px calc(1px)'), true)\n})\n\ntest.run()\n"
  },
  {
    "path": "test/postcss.test.js",
    "content": "let postcss = require('postcss')\nlet { test } = require('uvu')\nlet { equal } = require('uvu/assert')\n\nlet autoprefixer = require('..')\n\ntest('works with other PostCSS plugins', () => {\n  let plugin = () => {\n    return {\n      AtRule: {\n        mixin: (atRule, { Declaration }) => {\n          atRule.replaceWith(\n            new Declaration({ prop: 'user-select', value: 'none' })\n          )\n        }\n      },\n      postcssPlugin: 'test',\n      Rule(rule) {\n        rule.selector = 'b'\n      }\n    }\n  }\n  plugin.postcss = true\n\n  let result = postcss([\n    plugin(),\n    autoprefixer({ overrideBrowserslist: 'chrome 40' })\n  ]).process('a{ @mixin; }', {\n    from: 'a.css'\n  })\n\n  equal(result.css, 'b{ -webkit-user-select: none; user-select: none; }')\n})\n\ntest.run()\n"
  },
  {
    "path": "test/prefixer.test.js",
    "content": "let { parse } = require('postcss')\nlet { test } = require('uvu')\nlet { equal, is, type } = require('uvu/assert')\n\nlet Prefixer = require('../lib/prefixer')\n\nlet css, prefix\ntest.before.each(() => {\n  prefix = new Prefixer()\n  css = parse(\n    '@-ms-keyframes a { to { } } ' +\n      ':-moz-full-screen { } a { } ' +\n      '@-dev-keyframes s { to { } }'\n  )\n})\n\ntest('registers hacks for subclasses', () => {\n  class A extends Prefixer {}\n  class Hack extends A {}\n  Hack.names = ['a', 'b']\n\n  A.hack(Hack)\n\n  equal(A.hacks, { a: Hack, b: Hack })\n  type(Prefixer.hacks, 'undefined')\n})\n\ntest('loads hacks', () => {\n  class A extends Prefixer {\n    constructor() {\n      super()\n      this.klass = 'a'\n    }\n  }\n  class Hack extends A {\n    constructor() {\n      super()\n      this.klass = 'hack'\n    }\n  }\n  A.hacks = { hacked: Hack }\n\n  equal(A.load('hacked').klass, 'hack')\n  equal(A.load('a').klass, 'a')\n})\n\ntest('cleans custom properties', () => {\n  let rule = css.first.first\n  rule._autoprefixerPrefix = '-ms-'\n  rule._autoprefixerValues = { '-ms-': 1 }\n\n  let cloned = Prefixer.clone(rule, { selector: 'from' })\n  equal(cloned.selector, 'from')\n\n  type(cloned._autoprefixerPrefix, 'undefined')\n  type(cloned._autoprefixerValues, 'undefined')\n})\n\ntest('fixed declaration between', () => {\n  let parsed = parse('a { color : black }')\n  let cloned = Prefixer.clone(parsed.first.first)\n  equal(cloned.raws.between, ' : ')\n})\n\ntest('works with root node', () => {\n  is(prefix.parentPrefix(css), false)\n})\n\ntest('finds in at-rules', () => {\n  equal(prefix.parentPrefix(css.first), '-ms-')\n})\n\ntest('finds in selectors', () => {\n  equal(prefix.parentPrefix(css.nodes[1]), '-moz-')\n})\n\ntest('finds in parents', () => {\n  let decl = css.first.first\n  equal(prefix.parentPrefix(decl), '-ms-')\n  is(prefix.parentPrefix(css.nodes[2]), false)\n})\n\ntest('caches prefix', () => {\n  prefix.parentPrefix(css.first)\n  equal(css.first._autoprefixerPrefix, '-ms-')\n\n  css.first._autoprefixerPrefix = false\n  is(prefix.parentPrefix(css.first), false)\n})\n\ntest('finds only browsers prefixes', () => {\n  is(prefix.parentPrefix(css.nodes[2]), false)\n})\n\ntest('works with selector contained --', () => {\n  let parsed = parse(':--a { color: black }')\n  is(prefix.parentPrefix(parsed.first.first), false)\n})\n\ntest.run()\n"
  },
  {
    "path": "test/prefixes.test.js",
    "content": "let { agents } = require('caniuse-lite/dist/unpacker/agents')\nlet { parse } = require('postcss')\nlet { test } = require('uvu')\nlet { equal, is } = require('uvu/assert')\n\nlet Browsers = require('../lib/browsers')\nlet Declaration = require('../lib/declaration')\nlet OldValue = require('../lib/old-value')\nlet Prefixes = require('../lib/prefixes')\nlet Selector = require('../lib/selector')\nlet Supports = require('../lib/supports')\nlet Value = require('../lib/value')\n\nlet data = {\n  browsers: agents,\n  prefixes: {\n    a: {\n      browsers: ['firefox 21', 'firefox 20 old', 'chrome 30', 'ie 6']\n    },\n    b: {\n      browsers: ['ie 7 new', 'firefox 20'],\n      mistakes: ['-webkit-'],\n      props: ['a', '*']\n    },\n    c: {\n      browsers: ['ie 7', 'firefox 20'],\n      selector: true\n    }\n  }\n}\n\nlet empty = new Prefixes({}, new Browsers(data.browsers, []))\nlet fill = new Prefixes(\n  data.prefixes,\n  new Browsers(data.browsers, ['firefox 21', 'ie 7'])\n)\n\nlet cSel = new Selector('c', ['-ms-'], fill)\nlet bVal = new Value('b', ['-ms- new'], fill)\nlet aProp = new Declaration('a', ['-moz-'], fill)\naProp.values = [bVal]\n\nfunction old(prefixed) {\n  let name = prefixed.replace(/-[^-]+-( old)?/, '')\n  return new OldValue(name, prefixed)\n}\n\ntest('selects necessary prefixes', () => {\n  equal(fill.select(data.prefixes), {\n    add: {\n      a: ['-moz-'],\n      b: ['-ms- new'],\n      c: ['-ms-']\n    },\n    remove: {\n      a: ['-webkit-', '-ms-', '-moz- old'],\n      b: ['-ms-', '-moz-', '-webkit-'],\n      c: ['-moz-']\n    }\n  })\n})\n\ntest('preprocesses prefixes add data', () => {\n  equal(fill.add, {\n    '@supports': new Supports(Prefixes, fill),\n    '*': {\n      values: [bVal]\n    },\n    'a': aProp,\n    'selectors': [cSel]\n  })\n})\n\ntest('preprocesses prefixes remove data', () => {\n  equal(\n    JSON.parse(JSON.stringify(fill.remove)),\n    JSON.parse(\n      JSON.stringify({\n        '-moz- olda': {\n          remove: true\n        },\n        '-ms-a': {\n          remove: true\n        },\n        '-webkit-a': {\n          remove: true\n        },\n        '*': {\n          values: [old('-ms-b'), old('-moz-b'), old('-webkit-b')]\n        },\n        'a': {\n          values: [old('-ms-b'), old('-moz-b'), old('-webkit-b')]\n        },\n        'selectors': [cSel.old('-moz-')]\n      })\n    )\n  )\n})\n\ntest('returns itself is no browsers are selected', () => {\n  equal(empty.cleaner(), empty)\n})\n\ntest('returns Prefixes with empty browsers', () => {\n  let cleaner = new Prefixes(data.prefixes, new Browsers(data.browsers, []))\n  equal(Object.keys(fill.cleaner().add).length, 2)\n  equal(fill.cleaner().remove, cleaner.remove)\n})\n\ntest('loads declarations by property', () => {\n  equal(empty.decl('a'), new Declaration('a'))\n})\n\ntest('caches values', () => {\n  equal(empty.decl('a'), empty.decl('a'))\n})\n\ntest('returns unprefixed version', () => {\n  equal(empty.unprefixed('-moz-a'), 'a')\n})\n\ntest('adds prefix', () => {\n  equal(empty.prefixed('a', '-ms-'), '-ms-a')\n})\n\ntest('changes prefix', () => {\n  equal(empty.prefixed('a', '-ms-'), '-ms-a')\n})\n\ntest('returns values for this and all properties', () => {\n  equal(fill.values('add', 'a'), [bVal])\n  equal(fill.values('remove', 'a'), [\n    old('-ms-b'),\n    old('-moz-b'),\n    old('-webkit-b')\n  ])\n})\n\ntest('checks prefix group', () => {\n  let css = parse('a { -ms-a: 1; -o-a: 1; a: 1; b: 2 }')\n  let props = []\n\n  empty.group(css.first.first).down(i => props.push(i.prop))\n  equal(props, ['-o-a', 'a'])\n})\n\ntest('checks prefix groups', () => {\n  let css = parse('a { -ms-a: 1; -o-a: 1; ' + 'a: -o-calc(1); a: 1; a: 2 }')\n  let props = []\n\n  empty.group(css.first.first).down(i => props.push(i.prop))\n  equal(props, ['-o-a', 'a', 'a'])\n})\n\ntest('returns check decls inside group', () => {\n  let css = parse('a { -moz-a: 1; -ms-a: 1; -o-a: 1; a: 1 }')\n  let decl = css.first.first\n\n  is(\n    empty.group(decl).down(i => i.prop === '-o-a'),\n    true\n  )\n  is(\n    empty.group(decl).down(i => i.prop === '-o-b'),\n    false\n  )\n})\n\ntest('checks prefix group', () => {\n  let css = parse('a { b: 2; -ms-a: 1; -o-a: 1; a: 1 }')\n  let props = []\n\n  empty.group(css.first.nodes[3]).up(i => props.push(i.prop))\n  equal(props, ['-o-a', '-ms-a'])\n})\n\ntest('checks prefix groups', () => {\n  let css = parse('a { a: 2; -ms-a: 1; ' + '-o-a: 1; a: -o-calc(1); a: 1  }')\n  let props = []\n\n  empty.group(css.first.nodes[4]).up(i => props.push(i.prop))\n  equal(props, ['a', '-o-a', '-ms-a'])\n})\n\ntest('returns check decls inside group', () => {\n  let css = parse('a { -moz-a: 1; -ms-a: 1; -o-a: 1; a: 1 }')\n  let decl = css.first.nodes[3]\n\n  is(\n    empty.group(decl).up(i => i.prop === '-ms-a'),\n    true\n  )\n  is(\n    empty.group(decl).up(i => i.prop === '-ms-b'),\n    false\n  )\n})\n\ntest.run()\n"
  },
  {
    "path": "test/selector.test.js",
    "content": "let { parse } = require('postcss')\nlet { test } = require('uvu')\nlet { equal, is } = require('uvu/assert')\n\nlet Selector = require('../lib/selector')\n\nlet prefixeds, selector\ntest.before.each(() => {\n  selector = new Selector('::selection', ['-moz-', '-ms-'])\n  prefixeds = selector.prefixeds(parse('::selection {}').first)\n})\n\ntest('adds prefix after non-letters symbols', () => {\n  equal(selector.prefixed('-moz-'), '::-moz-selection')\n})\n\ntest('creates regexp for prefix', () => {\n  let regexp = selector.regexp('-moz-')\n  is(regexp.test('::-moz-selection'), true)\n  is(regexp.test('::selection'), false)\n})\n\ntest('creates regexp without prefix', () => {\n  let regexp = selector.regexp()\n  is(regexp.test('::-moz-selection'), false)\n  is(regexp.test('::selection'), true)\n})\n\ntest('checks rule selectors', () => {\n  let css = parse(\n    'body .selection {}, ' + ':::selection {}, body ::selection {}'\n  )\n  is(selector.check(css.nodes[0]), false)\n  is(selector.check(css.nodes[1]), false)\n  is(selector.check(css.nodes[2]), true)\n})\n\ntest('grouping rule gets correct _autoprefixerPrefixeds property', () => {\n  let css = parse('.c::selection, .d:read-only {}')\n  let rSel = new Selector(':read-only', ['-moz-'])\n  selector.prefixeds(css.first)\n  rSel.prefixeds(css.first)\n  equal(css.first._autoprefixerPrefixeds, {\n    '::selection': {\n      '-moz-': '.c::-moz-selection',\n      '-ms-': '.c::-ms-selection',\n      '-o-': '.c::-o-selection',\n      '-webkit-': '.c::-webkit-selection'\n    },\n    ':read-only': {\n      '-moz-': '.d:-moz-read-only',\n      '-ms-': '.d:-ms-read-only',\n      '-o-': '.d:-o-read-only',\n      '-webkit-': '.d:-webkit-read-only'\n    }\n  })\n})\n\ntest('returns all available prefixed selectors', () => {\n  let css = parse('::selection {}')\n  equal(selector.prefixeds(css.first), {\n    '::selection': {\n      '-moz-': '::-moz-selection',\n      '-ms-': '::-ms-selection',\n      '-o-': '::-o-selection',\n      '-webkit-': '::-webkit-selection'\n    }\n  })\n})\n\ntest('returns false on first element', () => {\n  let css = parse('::selection {}')\n  is(selector.already(css.first, prefixeds, '-moz-'), false)\n})\n\ntest('stops on another type', () => {\n  let css = parse('::-moz-selection {} ' + '@keyframes anim {} ::selection {}')\n  is(selector.already(css.nodes[2], prefixeds, '-moz-'), false)\n})\n\ntest('stops on another selector', () => {\n  let css = parse('::-moz-selection {} a {} ::selection {}')\n  is(selector.already(css.nodes[2], prefixeds, '-moz-'), false)\n})\n\ntest('finds prefixed even if unknown prefix is between', () => {\n  let css = parse('::-moz-selection {} ' + '::-o-selection {} ::selection {}')\n  is(selector.already(css.nodes[2], prefixeds, '-moz-'), true)\n})\n\ntest('adds prefix to selectors', () => {\n  equal(\n    selector.replace('body ::selection, input::selection, a', '-ms-'),\n    'body ::-ms-selection, input::-ms-selection, a'\n  )\n})\n\ntest('adds prefixes', () => {\n  let css = parse('b ::-moz-selection{} b ::selection{}')\n  selector.process(css.nodes[1])\n  equal(\n    css.toString(),\n    'b ::-moz-selection{} b ::-ms-selection{} b ::selection{}'\n  )\n})\n\ntest('checks parents prefix', () => {\n  let css = parse('@-moz-page{ ::selection{} }')\n  selector.process(css.first.first)\n  equal(css.toString(), '@-moz-page{ ::-moz-selection{} ::selection{} }')\n})\n\ntest('returns object to find old selector', () => {\n  let old = selector.old('-moz-')\n  equal(old.unprefixed, '::selection')\n  equal(old.prefix, '-moz-')\n})\n\ntest.run()\n"
  },
  {
    "path": "test/supports.test.js",
    "content": "let { test } = require('uvu')\nlet { equal } = require('uvu/assert')\n\nlet brackets = require('../lib/brackets')\nlet Browsers = require('../lib/browsers')\nlet Prefixes = require('../lib/prefixes')\nlet Supports = require('../lib/supports')\n\nlet browsers = new Browsers(\n  {\n    firefox: {\n      prefix: 'moz',\n      versions: ['firefox 22']\n    }\n  },\n  ['firefox 22', 'firefox 21']\n)\nlet prefixes = new Prefixes(\n  {\n    a: {\n      browsers: ['firefox 22']\n    },\n    b: {\n      browsers: ['firefox 22'],\n      props: 'c'\n    }\n  },\n  browsers\n)\nlet supports = new Supports(Prefixes, prefixes)\n\nfunction rm(str) {\n  let ast = supports.normalize(brackets.parse(str))\n  return brackets.stringify(supports.remove(ast, str))\n}\n\nfunction clean(str) {\n  let ast = supports.normalize(brackets.parse(str))\n  return brackets.stringify(supports.cleanBrackets(ast))\n}\n\ntest('splits property name and value', () => {\n  equal(supports.parse('color:black'), ['color', 'black'])\n})\n\ntest('cleans spaces', () => {\n  equal(supports.parse(' color : black '), ['color', 'black'])\n})\n\ntest('parses everything', () => {\n  equal(supports.parse('color'), ['color', ''])\n})\n\ntest('returns virtual rule', () => {\n  let decl = supports.virtual('color: black')\n  equal(decl.type, 'rule')\n  equal(decl.toString(), 'a{color: black}')\n})\n\ntest('works with broken CSS', () => {\n  let decl = supports.virtual('color black')\n  equal(decl.type, 'rule')\n})\n\ntest('returns decls with prefixed property', () => {\n  let decls = supports.prefixed('a: one')\n\n  equal(decls.length, 2)\n  equal(decls[0].toString(), '-moz-a: one')\n  equal(decls[1].toString(), 'a: one')\n})\n\ntest('returns decls with prefixed value', () => {\n  let decls = supports.prefixed('c: b')\n\n  equal(decls.length, 2)\n  equal(decls[0].toString(), 'c: -moz-b')\n  equal(decls[1].toString(), 'c: b')\n})\n\ntest('reduces empty string', () => {\n  equal(supports.normalize([['', ['a'], '']]), [[['a']]])\n})\n\ntest('reduces declaration to string', () => {\n  equal(supports.normalize(['a: b', ['1']]), ['a: b(1)'])\n})\n\ntest('reduces wrapped declaration to string', () => {\n  equal(supports.normalize(['', ['a: b', ['1']], '']), [['a: b(1)']])\n})\n\ntest('remove prefixed properties', () => {\n  equal(rm('(-moz-a: 1) or (a: 1)'), '(a: 1)')\n})\n\ntest('remove prefixed properties inside', () => {\n  equal(rm('(((-moz-a: 1) or (a: 1)))'), '(((a: 1)))')\n})\n\ntest('remove prefixed values', () => {\n  equal(rm('(c: -moz-b) or (c: -b-)'), '(c: -b-)')\n})\n\ntest('keeps and-conditions', () => {\n  equal(rm('(-moz-a: 1) and (a: 1)'), '(-moz-a: 1) and (a: 1)')\n})\n\ntest('keeps not-conditions', () => {\n  equal(rm('not (-moz-a: 1) or (a: 1)'), 'not (-moz-a: 1) or (a: 1)')\n})\n\ntest('keeps hacks', () => {\n  equal(rm('(-moz-a: 1) or (b: 2)'), '(-moz-a: 1) or (b: 2)')\n})\n\ntest('uses only browsers with @supports support', () => {\n  equal(supports.prefixer().browsers.selected, ['firefox 22'])\n})\n\ntest('normalize brackets', () => {\n  equal(clean('((a: 1))'), '(a: 1)')\n})\n\ntest('normalize brackets recursively', () => {\n  equal(clean('(((a: 1) or ((b: 2))))'), '((a: 1) or (b: 2))')\n})\n\ntest('adds params with prefixed value', () => {\n  let rule = { params: '(c: b)' }\n  supports.process(rule)\n  equal(rule.params, '((c: -moz-b) or (c: b))')\n})\n\ntest('adds params with prefixed function', () => {\n  let rule = { params: '(c: b(1))' }\n  supports.process(rule)\n  equal(rule.params, '((c: -moz-b(1)) or (c: b(1)))')\n})\n\ntest('replaces params with prefixed property', () => {\n  let rule = { params: '(color black) and not (a: 1)' }\n  supports.process(rule)\n  equal(rule.params, '(color black) and not ((-moz-a: 1) or (a: 1))')\n})\n\ntest(\"shouldn't throw errors\", () => {\n  let rule = { params: 'not selector(:is(a, b))' }\n  supports.process(rule)\n  equal(rule.params, 'not selector(:is(a, b))')\n})\n\ntest(\"shouldn't throw errors (2)\", () => {\n  let rule = { params: ' (selector( :nth-child(1n of a, b) )) or (c: b(1)) ' }\n  supports.process(rule)\n  equal(\n    rule.params,\n    ' (selector( :nth-child(1n of a, b) )) or ((c: -moz-b(1)) or (c: b(1))) '\n  )\n})\n\ntest.run()\n"
  },
  {
    "path": "test/utils.test.js",
    "content": "let { test } = require('uvu')\nlet { equal, is, throws } = require('uvu/assert')\n\nlet utils = require('../lib/utils')\n\ntest('raises an error', () => {\n  throws(() => {\n    utils.error('A')\n  }, 'A')\n})\n\ntest('marks an error', () => {\n  let error = null\n  try {\n    utils.error('A')\n  } catch (e) {\n    error = e\n  }\n\n  is(error.autoprefixer, true)\n})\n\ntest('filters doubles in array', () => {\n  equal(utils.uniq(['1', '1', '2', '3', '3']), ['1', '2', '3'])\n})\n\ntest('removes note', () => {\n  equal(utils.removeNote('-webkit- note'), '-webkit-')\n  equal(utils.removeNote('-webkit-'), '-webkit-')\n})\n\ntest('escapes RegExp symbols', () => {\n  equal(utils.escapeRegexp('^[()\\\\]'), '\\\\^\\\\[\\\\(\\\\)\\\\\\\\\\\\]')\n})\n\ntest('generates RegExp that finds tokens in CSS values', () => {\n  let regexp = utils.regexp('foo')\n  function check(string) {\n    return string.match(regexp) !== null\n  }\n\n  is(check('foo'), true)\n  is(check('Foo'), true)\n  is(check('one, foo, two'), true)\n  is(check('one(),foo(),two()'), true)\n\n  equal('foo(), a, foo'.replace(regexp, '$1b$2'), 'bfoo(), a, bfoo')\n\n  is(check('foob'), false)\n  is(check('(foo)'), false)\n  is(check('-a-foo'), false)\n})\n\ntest('escapes string if needed', () => {\n  let regexp = utils.regexp('(a|b)')\n  function check(string) {\n    return string.match(regexp) !== null\n  }\n\n  is(check('a'), false)\n  is(check('(a|b)'), true)\n\n  regexp = utils.regexp('(a|b)', false)\n  is(check('a'), true)\n  is(check('b'), true)\n})\n\ntest('does save without changes', () => {\n  let list = utils.editList('a,\\nb, c', parsed => parsed)\n  equal(list, 'a,\\nb, c')\n})\n\ntest('changes list', () => {\n  let list = utils.editList('a, b', (parsed, edit) => {\n    equal(parsed, ['a', 'b'])\n    equal(edit, [])\n    return ['1', '2']\n  })\n  equal(list, '1, 2')\n})\n\ntest('saves comma', () => {\n  let list = utils.editList('a,\\nb', () => ['1', '2'])\n  equal(list, '1,\\n2')\n})\n\ntest('parse one value', () => {\n  let list = utils.editList('1', parsed => [parsed[0], '2'])\n  equal(list, '1, 2')\n})\n\ntest('splits simple selectors into an array', () => {\n  let arr1 = utils.splitSelector('#foo.bar')\n  let arr2 = utils.splitSelector('.foo, .bar')\n  equal(arr1, [[['#foo', '.bar']]])\n  equal(arr2, [[['.foo']], [['.bar']]])\n})\n\ntest('splits complex selectors into an array', () => {\n  let arr = utils.splitSelector(\n    '#foo.bar .child-one.mod .child-two.mod, .baz, .hello'\n  )\n  equal(arr, [\n    [\n      ['#foo', '.bar'],\n      ['.child-one', '.mod'],\n      ['.child-two', '.mod']\n    ],\n    [['.baz']],\n    [['.hello']]\n  ])\n})\n\ntest('detects numbers', () => {\n  equal(utils.isPureNumber(42), true)\n  equal(utils.isPureNumber('42'), true)\n  equal(utils.isPureNumber('autoprefixer'), false)\n  equal(utils.isPureNumber(''), false)\n  equal(utils.isPureNumber({}), false)\n  equal(utils.isPureNumber(undefined), false)\n  equal(utils.isPureNumber(true), false)\n})\n\ntest.run()\n"
  },
  {
    "path": "test/value.test.js",
    "content": "let { parse } = require('postcss')\nlet { test } = require('uvu')\nlet { equal, is, type } = require('uvu/assert')\n\nlet OldValue = require('../lib/old-value')\nlet Prefixes = require('../lib/prefixes')\nlet Value = require('../lib/value')\n\nlet prefixes = new Prefixes()\n\nlet calc\ntest.before.each(() => {\n  calc = new Value('calc', ['-moz-', '-ms-'])\n})\n\ntest('clones declaration', () => {\n  let css = parse('a { prop: v }')\n  let width = css.first.first\n\n  width._autoprefixerValues = { '-ms-': '-ms-v' }\n  Value.save(prefixes, width)\n\n  equal(css.toString(), 'a { prop: -ms-v; prop: v }')\n})\n\ntest('updates declaration with prefix', () => {\n  let css = parse('a { -ms-prop: v }')\n  let width = css.first.first\n\n  width._autoprefixerValues = { '-ms-': '-ms-v' }\n  Value.save(prefixes, width)\n\n  equal(css.toString(), 'a { -ms-prop: -ms-v }')\n})\n\ntest('ignores on another prefix property', () => {\n  let css = parse('a { -ms-prop: v; prop: v }')\n  let width = css.first.last\n\n  width._autoprefixerValues = { '-ms-': '-ms-v' }\n  Value.save(prefixes, width)\n\n  equal(css.toString(), 'a { -ms-prop: v; prop: v }')\n})\n\ntest('ignores prefixes without changes', () => {\n  let css = parse('a { prop: v }')\n  let width = css.first.first\n\n  width._autoprefixerValues = { '-ms-': 'v' }\n  Value.save(prefixes, width)\n\n  equal(css.toString(), 'a { prop: v }')\n})\n\ntest('checks value in string', () => {\n  let css = parse(\n    'a { 0: calc(1px + 1em); ' +\n      '1: 1px calc(1px + 1em); ' +\n      '2: (calc(1px + 1em)); ' +\n      '3: -ms-calc; ' +\n      '4: calced; }'\n  )\n\n  is(calc.check(css.first.nodes[0]), true)\n  is(calc.check(css.first.nodes[1]), true)\n  is(calc.check(css.first.nodes[2]), true)\n\n  is(calc.check(css.first.nodes[3]), false)\n  is(calc.check(css.first.nodes[4]), false)\n})\n\ntest('check prefixed value', () => {\n  equal(calc.old('-ms-'), new OldValue('calc', '-ms-calc'))\n})\n\ntest('adds prefix to value', () => {\n  equal(calc.replace('1px calc(1em)', '-ms-'), '1px -ms-calc(1em)')\n  equal(calc.replace('1px,calc(1em)', '-ms-'), '1px,-ms-calc(1em)')\n})\n\ntest('adds prefixes', () => {\n  let css = parse('a { width: calc(1em) calc(1%) }')\n  let width = css.first.first\n\n  calc.process(width)\n  equal(width._autoprefixerValues, {\n    '-moz-': '-moz-calc(1em) -moz-calc(1%)',\n    '-ms-': '-ms-calc(1em) -ms-calc(1%)'\n  })\n})\n\ntest('checks parents prefix', () => {\n  let css = parse('::-moz-fullscreen a { width: calc(1%) }')\n  let width = css.first.first\n\n  calc.process(width)\n  equal(width._autoprefixerValues, { '-moz-': '-moz-calc(1%)' })\n})\n\ntest('checks property prefix', () => {\n  let css = parse('a { -moz-width: calc(1%); -o-width: calc(1%) }')\n  let decls = css.first.nodes\n\n  calc.process(decls[0])\n  equal(decls[0]._autoprefixerValues, {\n    '-moz-': '-moz-calc(1%)'\n  })\n\n  calc.process(decls[1])\n  type(decls[1]._autoprefixerValues, 'undefined')\n})\n\ntest.run()\n"
  }
]