text: (function() {
    var Browsers, Prefixer, clone, utils, vendor,
      hasProp = {}.hasOwnProperty;
  
    Browsers = require('./browsers');
  
    utils = require('./utils');
  
    vendor = require('postcss/lib/vendor');
  
    clone = function(obj, parent) {
      var cloned, i, value;
      cloned = new obj.constructor();
      for (i in obj) {
        if (!hasProp.call(obj, i)) continue;
        value = obj[i];
        if (i === 'parent' && typeof value === 'object') {
          if (parent) {
            cloned[i] = parent;
          }
        } else if (i === 'source') {
          cloned[i] = value;
        } else if (i === null) {
          cloned[i] = value;
        } else if (value instanceof Array) {
          cloned[i] = value.map(function(i) {
            return clone(i, cloned);
          });
        } else if (i !== '_autoprefixerPrefix' && i !== '_autoprefixerValues') {
          if (typeof value === 'object' && value !== null) {
            value = clone(value, cloned);
          }
          cloned[i] = value;
        }
      }
      return cloned;
    };
  
    Prefixer = (function() {
      Prefixer.hack = function(klass) {
        var j, len, name, ref, results;
        this.hacks || (this.hacks = {});
        ref = klass.names;
        results = [];
        for (j = 0, len = ref.length; j < len; j++) {
          name = ref[j];
          results.push(this.hacks[name] = klass);
        }
        return results;
      };
  
      Prefixer.load = function(name, prefixes, all) {
        var klass, ref;
        klass = (ref = this.hacks) != null ? ref[name] : void 0;
        if (klass) {
          return new klass(name, prefixes, all);
        } else {
          return new this(name, prefixes, all);
        }
      };
  
      Prefixer.clone = function(node, overrides) {
        var cloned, name;
        cloned = clone(node);
        for (name in overrides) {
          cloned[name] = overrides[name];
        }
        return cloned;
      };
  
      function Prefixer(name1, prefixes1, all1) {
        this.name = name1;
        this.prefixes = prefixes1;
        this.all = all1;
      }
  
      Prefixer.prototype.parentPrefix = function(node) {
        var prefix;
        prefix = node._autoprefixerPrefix != null ? node._autoprefixerPrefix : node.type === 'decl' && node.prop[0] === '-' ? vendor.prefix(node.prop) : node.type === 'root' ? false : node.type === 'rule' && node.selector.indexOf(':-') !== -1 && /:(-\w+-)/.test(node.selector) ? node.selector.match(/:(-\w+-)/)[1] : node.type === 'atrule' && node.name[0] === '-' ? vendor.prefix(node.name) : this.parentPrefix(node.parent);
        if (Browsers.prefixes().indexOf(prefix) === -1) {
          prefix = false;
        }
        return node._autoprefixerPrefix = prefix;
      };
  
      Prefixer.prototype.process = function(node) {
        var added, j, k, len, len1, parent, prefix, prefixes, ref;
        if (!this.check(node)) {
          return;
        }
        parent = this.parentPrefix(node);
        prefixes = [];
        ref = this.prefixes;
        for (j = 0, len = ref.length; j < len; j++) {
          prefix = ref[j];
          if (parent && parent !== utils.removeNote(prefix)) {
            continue;
          }
          prefixes.push(prefix);
        }
        added = [];
        for (k = 0, len1 = prefixes.length; k < len1; k++) {
          prefix = prefixes[k];
          if (this.add(node, prefix, added.concat([prefix]))) {
            added.push(prefix);
          }
        }
        return added;
      };
  
      Prefixer.prototype.clone = function(node, overrides) {
        return Prefixer.clone(node, overrides);
      };
  
      return Prefixer;
  
    })();
  
    module.exports = Prefixer;
  
  }).call(this);
  