�PNG  IHDR��;���IDATx��ܻn�0���K�� �)(�pA��� ���7�LeG{�� �§㻢|��ذaÆ 6lذaÆ 6lذaÆ 6lom��$^�y���ذag�5bÆ 6lذaÆ 6lذa{���� 6lذaÆ �`����}H�Fkm�,�m����Ӫ���ô�ô!� �x�|'ܢ˟;�E:���9�&ᶒ�}�{�v]�n&�6� �h��_��t�ڠ͵-ҫ���Z;��Z$�.�P���k�ž)�!��o���>}l�eQfJ�T��u і���چ��\��X=8��Rن4`Vw�l�>����n�G�^��i�s��"ms�$�u��i��?w�bs[m�6�K4���O���.�4��%����/����b�C%��t ��M�ז� �-l�G6�mrz2���s�%�9��s@���-�k�9�=���)������k�B5����\��+͂�Zsٲ ��Rn��~G���R���C����� �wIcI��n7jJ���hۛNCS|���j0��8y�iHKֶۛ�k�Ɉ+;Sz������L/��F�*\��Ԕ�#"5��m�2��[S��������=�g��n�a�P�e�ғ�L�� lذaÆ 6l�^k��̱aÆ 6lذaÆ 6lذa;���� �_��ذaÆ 6lذaÆ 6lذaÆ ���R���IEND�B` var walk = require('css-tree').walk; var utils = require('./utils'); /* At this step all rules has single simple selector. We try to join by equal declaration blocks to first rule, e.g. .a { color: red } b { ... } .b { color: red } -> .a, .b { color: red } b { ... } */ function processRule(node, item, list) { var selectors = node.prelude.children; var declarations = node.block.children; var nodeCompareMarker = selectors.first().compareMarker; var skippedCompareMarkers = {}; list.nextUntil(item.next, function(next, nextItem) { // skip non-ruleset node if safe if (next.type !== 'Rule') { return utils.unsafeToSkipNode.call(selectors, next); } if (node.pseudoSignature !== next.pseudoSignature) { return true; } var nextFirstSelector = next.prelude.children.head; var nextDeclarations = next.block.children; var nextCompareMarker = nextFirstSelector.data.compareMarker; // if next ruleset has same marked as one of skipped then stop joining if (nextCompareMarker in skippedCompareMarkers) { return true; } // try to join by selectors if (selectors.head === selectors.tail) { if (selectors.first().id === nextFirstSelector.data.id) { declarations.appendList(nextDeclarations); list.remove(nextItem); return; } } // try to join by properties if (utils.isEqualDeclarations(declarations, nextDeclarations)) { var nextStr = nextFirstSelector.data.id; selectors.some(function(data, item) { var curStr = data.id; if (nextStr < curStr) { selectors.insert(nextFirstSelector, item); return true; } if (!item.next) { selectors.insert(nextFirstSelector); return true; } }); list.remove(nextItem); return; } // go to next ruleset if current one can be skipped (has no equal specificity nor element selector) if (nextCompareMarker === nodeCompareMarker) { return true; } skippedCompareMarkers[nextCompareMarker] = true; }); } module.exports = function mergeRule(ast) { walk(ast, { visit: 'Rule', enter: processRule }); };