text: 'use strict';
  
  /**
   * Module exports.
   */
  
  exports.parse = parse;
  exports.format = format;
  
  /**
   * Parse extensions header value
   */
  
  function parse (value) {
    value = value || '';
  
    var extensions = {};
  
    value.split(',').forEach(function (v) {
      var params = v.split(';');
      var token = params.shift().trim();
      var paramsList = extensions[token] = extensions[token] || [];
      var parsedParams = {};
  
      params.forEach(function (param) {
        var parts = param.trim().split('=');
        var key = parts[0];
        var value = parts[1];
        if (value === undefined) {
          value = true;
        } else {
          // unquote value
          if (value[0] === '"') {
            value = value.slice(1);
          }
          if (value[value.length - 1] === '"') {
            value = value.slice(0, value.length - 1);
          }
        }
        (parsedParams[key] = parsedParams[key] || []).push(value);
      });
  
      paramsList.push(parsedParams);
    });
  
    return extensions;
  }
  
  /**
   * Format extensions header value
   */
  
  function format (value) {
    return Object.keys(value).map(function (token) {
      var paramsList = value[token];
      if (!Array.isArray(paramsList)) {
        paramsList = [paramsList];
      }
      return paramsList.map(function (params) {
        return [token].concat(Object.keys(params).map(function (k) {
          var p = params[k];
          if (!Array.isArray(p)) p = [p];
          return p.map(function (v) {
            return v === true ? k : k + '=' + v;
          }).join('; ');
        })).join('; ');
      }).join(', ');
    }).join(', ');
  }
  