/*  Prototype JavaScript framework, version 1.6.0.3
 *  (c) 2005-2008 Sam Stephenson
 *
 *  Prototype is freely distributable under the terms of an MIT-style license.
 *  For details, see the Prototype web site: http://www.prototypejs.org/
 *
 *--------------------------------------------------------------------------*/

var Prototype = {
  Version: '1.6.0.3',

  Browser: {
    IE:     !!(window.attachEvent &&
      navigator.userAgent.indexOf('Opera') === -1),
    Opera:  navigator.userAgent.indexOf('Opera') > -1,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 &&
      navigator.userAgent.indexOf('KHTML') === -1,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  },

  BrowserFeatures: {
    XPath: !!document.evaluate,
    SelectorsAPI: !!document.querySelector,
    ElementExtensions: !!window.HTMLElement,
    SpecificElementExtensions:
      document.createElement('div')['__proto__'] &&
      document.createElement('div')['__proto__'] !==
        document.createElement('form')['__proto__']
  },

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,

  emptyFunction: function() { },
  K: function(x) { return x }
};

if (Prototype.Browser.MobileSafari)
  Prototype.BrowserFeatures.SpecificElementExtensions = false;


/* Based on Alex Arnell's inheritance implementation. */
var Class = {
  create: function() {
    var parent = null, properties = $A(arguments);
    if (Object.isFunction(properties[0]))
      parent = properties.shift();

    function klass() {
      this.initialize.apply(this, arguments);
    }

    Object.extend(klass, Class.Methods);
    klass.superclass = parent;
    klass.subclasses = [];

    if (parent) {
      var subclass = function() { };
      subclass.prototype = parent.prototype;
      klass.prototype = new subclass;
      parent.subclasses.push(klass);
    }

    for (var i = 0; i < properties.length; i++)
      klass.addMethods(properties[i]);

    if (!klass.prototype.initialize)
      klass.prototype.initialize = Prototype.emptyFunction;

    klass.prototype.constructor = klass;

    return klass;
  }
};

Class.Methods = {
  addMethods: function(source) {
    var ancestor   = this.superclass && this.superclass.prototype;
    var properties = Object.keys(source);

    if (!Object.keys({ toString: true }).length)
      properties.push("toString", "valueOf");

    for (var i = 0, length = properties.length; i < length; i++) {
      var property = properties[i], value = source[property];
      if (ancestor && Object.isFunction(value) &&
          value.argumentNames().first() == "$super") {
        var method = value;
        value = (function(m) {
          return function() { return ancestor[m].apply(this, arguments) };
        })(property).wrap(method);

        value.valueOf = method.valueOf.bind(method);
        value.toString = method.toString.bind(method);
      }
      this.prototype[property] = value;
    }

    return this;
  }
};

var Abstract = { };

Object.extend = function(destination, source) {
  for (var property in source)
    destination[property] = source[property];
  return destination;
};

Object.extend(Object, {
  inspect: function(object) {
    try {
      if (Object.isUndefined(object)) return 'undefined';
      if (object === null) return 'null';
      return object.inspect ? object.inspect() : String(object);
    } catch (e) {
      if (e instanceof RangeError) return '...';
      throw e;
    }
  },

  toJSON: function(object) {
    var type = typeof object;
    switch (type) {
      case 'undefined':
      case 'function':
      case 'unknown': return;
      case 'boolean': return object.toString();
    }

    if (object === null) return 'null';
    if (object.toJSON) return object.toJSON();
    if (Object.isElement(object)) return;

    var results = [];
    for (var property in object) {
      var value = Object.toJSON(object[property]);
      if (!Object.isUndefined(value))
        results.push(property.toJSON() + ': ' + value);
    }

    return '{' + results.join(', ') + '}';
  },

  toQueryString: function(object) {
    return $H(object).toQueryString();
  },

  toHTML: function(object) {
    return object && object.toHTML ? object.toHTML() : String.interpret(object);
  },

  keys: function(object) {
    var keys = [];
    for (var property in object)
      keys.push(property);
    return keys;
  },

  values: function(object) {
    var values = [];
    for (var property in object)
      values.push(object[property]);
    return values;
  },

  clone: function(object) {
    return Object.extend({ }, object);
  },

  isElement: function(object) {
    return !!(object && object.nodeType == 1);
  },

  isArray: function(object) {
    return object != null && typeof object == "object" &&
      'splice' in object && 'join' in object;
  },

  isHash: function(object) {
    return object instanceof Hash;
  },

  isFunction: function(object) {
    return typeof object == "function";
  },

  isString: function(object) {
    return typeof object == "string";
  },

  isNumber: function(object) {
    return typeof object == "number";
  },

  isUndefined: function(object) {
    return typeof object == "undefined";
  }
});

Object.extend(Function.prototype, {
  argumentNames: function() {
    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1]
      .replace(/\s+/g, '').split(',');
    return names.length == 1 && !names[0] ? [] : names;
  },

  bind: function() {
    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
    var __method = this, args = $A(arguments), object = args.shift();
    return function() {
      return __method.apply(object, args.concat($A(arguments)));
    }
  },

  bindAsEventListener: function() {
    var __method = this, args = $A(arguments), object = args.shift();
    return function(event) {
      return __method.apply(object, [event || window.event].concat(args));
    }
  },

  curry: function() {
    if (!arguments.length) return this;
    var __method = this, args = $A(arguments);
    return function() {
      return __method.apply(this, args.concat($A(arguments)));
    }
  },

  delay: function() {
    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
    return window.setTimeout(function() {
      return __method.apply(__method, args);
    }, timeout);
  },

  defer: function() {
    var args = [0.01].concat($A(arguments));
    return this.delay.apply(this, args);
  },

  wrap: function(wrapper) {
    var __method = this;
    return function() {
      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
    }
  },

  methodize: function() {
    if (this._methodized) return this._methodized;
    var __method = this;
    return this._methodized = function() {
      return __method.apply(null, [this].concat($A(arguments)));
    };
  }
});

Date.prototype.toJSON = function() {
  return '"' + this.getUTCFullYear() + '-' +
    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
    this.getUTCDate().toPaddedString(2) + 'T' +
    this.getUTCHours().toPaddedString(2) + ':' +
    this.getUTCMinutes().toPaddedString(2) + ':' +
    this.getUTCSeconds().toPaddedString(2) + 'Z"';
};

var Try = {
  these: function() {
    var returnValue;

    for (var i = 0, length = arguments.length; i < length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) { }
    }

    return returnValue;
  }
};

RegExp.prototype.match = RegExp.prototype.test;

RegExp.escape = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create({
  initialize: function(callback, frequency) {
    this.callback = callback;
    this.frequency = frequency;
    this.currentlyExecuting = false;

    this.registerCallback();
  },

  registerCallback: function() {
    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
  },

  execute: function() {
    this.callback(this);
  },

  stop: function() {
    if (!this.timer) return;
    clearInterval(this.timer);
    this.timer = null;
  },

  onTimerEvent: function() {
    if (!this.currentlyExecuting) {
      try {
        this.currentlyExecuting = true;
        this.execute();
      } finally {
        this.currentlyExecuting = false;
      }
    }
  }
});
Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

Object.extend(String.prototype, {
  gsub: function(pattern, replacement) {
    var result = '', source = this, match;
    replacement = arguments.callee.prepareReplacement(replacement);

    while (source.length > 0) {
      if (match = source.match(pattern)) {
        result += source.slice(0, match.index);
        result += String.interpret(replacement(match));
        source  = source.slice(match.index + match[0].length);
      } else {
        result += source, source = '';
      }
    }
    return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = Object.isUndefined(count) ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return String(this);
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = Object.isUndefined(truncation) ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : String(this);
  },

  strip: function() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  },

  stripTags: function() {
    return this.replace(/<\/?[^>]+>/gi, '');
  },

  stripScripts: function() {
    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
  },

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  },

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  },

  escapeHTML: function() {
    var self = arguments.callee;
    self.text.data = this;
    return self.div.innerHTML;
  },

  unescapeHTML: function() {
    var div = new Element('div');
    div.innerHTML = this.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return { };

    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = value;
      }
      return hash;
    });
  },

  toArray: function() {
    return this.split('');
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

  times: function(count) {
    return count < 1 ? '' : new Array(count + 1).join(this);
  },

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'
      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
      : parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function() {
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

  inspect: function(useDoubleQuotes) {
    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
      var character = String.specialChar[match[0]];
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  },

  toJSON: function() {
    return this.inspect(true);
  },

  unfilterJSON: function(filter) {
    return this.sub(filter || Prototype.JSONFilter, '#{1}');
  },

  isJSON: function() {
    var str = this;
    if (str.blank()) return false;
    str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
  },

  evalJSON: function(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  },

  include: function(pattern) {
    return this.indexOf(pattern) > -1;
  },

  startsWith: function(pattern) {
    return this.indexOf(pattern) === 0;
  },

  endsWith: function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },

  empty: function() {
    return this == '';
  },

  blank: function() {
    return /^\s*$/.test(this);
  },

  interpolate: function(object, pattern) {
    return new Template(this, pattern).evaluate(object);
  }
});

if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
  escapeHTML: function() {
    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
  },
  unescapeHTML: function() {
    return this.stripTags().replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
  }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
  if (Object.isFunction(replacement)) return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
};

String.prototype.parseQuery = String.prototype.toQueryParams;

Object.extend(String.prototype.escapeHTML, {
  div:  document.createElement('div'),
  text: document.createTextNode('')
});

String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text);

var Template = Class.create({
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    if (Object.isFunction(object.toTemplateReplacements))
      object = object.toTemplateReplacements();

    return this.template.gsub(this.pattern, function(match) {
      if (object == null) return '';

      var before = match[1] || '';
      if (before == '\\') return match[2];

      var ctx = object, expr = match[3];
      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
      match = pattern.exec(expr);
      if (match == null) return before;

      while (match != null) {
        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
        ctx = ctx[comp];
        if (null == ctx || '' == match[3]) break;
        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
        match = pattern.exec(expr);
      }

      return before + String.interpret(ctx);
    });
  }
});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;

var $break = { };

var Enumerable = {
  each: function(iterator, context) {
    var index = 0;
    try {
      this._each(function(value) {
        iterator.call(context, value, index++);
      });
    } catch (e) {
      if (e != $break) throw e;
    }
    return this;
  },

  eachSlice: function(number, iterator, context) {
    var index = -number, slices = [], array = this.toArray();
    if (number < 1) return array;
    while ((index += number) < array.length)
      slices.push(array.slice(index, index+number));
    return slices.collect(iterator, context);
  },

  all: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = true;
    this.each(function(value, index) {
      result = result && !!iterator.call(context, value, index);
      if (!result) throw $break;
    });
    return result;
  },

  any: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result = false;
    this.each(function(value, index) {
      if (result = !!iterator.call(context, value, index))
        throw $break;
    });
    return result;
  },

  collect: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var results = [];
    this.each(function(value, index) {
      results.push(iterator.call(context, value, index));
    });
    return results;
  },

  detect: function(iterator, context) {
    var result;
    this.each(function(value, index) {
      if (iterator.call(context, value, index)) {
        result = value;
        throw $break;
      }
    });
    return result;
  },

  findAll: function(iterator, context) {
    var results = [];
    this.each(function(value, index) {
      if (iterator.call(context, value, index))
        results.push(value);
    });
    return results;
  },

  grep: function(filter, iterator, context) {
    iterator = iterator || Prototype.K;
    var results = [];

    if (Object.isString(filter))
      filter = new RegExp(filter);

    this.each(function(value, index) {
      if (filter.match(value))
        results.push(iterator.call(context, value, index));
    });
    return results;
  },

  include: function(object) {
    if (Object.isFunction(this.indexOf))
      if (this.indexOf(object) != -1) return true;

    var found = false;
    this.each(function(value) {
      if (value == object) {
        found = true;
        throw $break;
      }
    });
    return found;
  },

  inGroupsOf: function(number, fillWith) {
    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
    return this.eachSlice(number, function(slice) {
      while(slice.length < number) slice.push(fillWith);
      return slice;
    });
  },

  inject: function(memo, iterator, context) {
    this.each(function(value, index) {
      memo = iterator.call(context, memo, value, index);
    });
    return memo;
  },

  invoke: function(method) {
    var args = $A(arguments).slice(1);
    return this.map(function(value) {
      return value[method].apply(value, args);
    });
  },

  max: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator.call(context, value, index);
      if (result == null || value >= result)
        result = value;
    });
    return result;
  },

  min: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var result;
    this.each(function(value, index) {
      value = iterator.call(context, value, index);
      if (result == null || value < result)
        result = value;
    });
    return result;
  },

  partition: function(iterator, context) {
    iterator = iterator || Prototype.K;
    var trues = [], falses = [];
    this.each(function(value, index) {
      (iterator.call(context, value, index) ?
        trues : falses).push(value);
    });
    return [trues, falses];
  },

  pluck: function(property) {
    var results = [];
    this.each(function(value) {
      results.push(value[property]);
    });
    return results;
  },

  reject: function(iterator, context) {
    var results = [];
    this.each(function(value, index) {
      if (!iterator.call(context, value, index))
        results.push(value);
    });
    return results;
  },

  sortBy: function(iterator, context) {
    return this.map(function(value, index) {
      return {
        value: value,
        criteria: iterator.call(context, value, index)
      };
    }).sort(function(left, right) {
      var a = left.criteria, b = right.criteria;
      return a < b ? -1 : a > b ? 1 : 0;
    }).pluck('value');
  },

  toArray: function() {
    return this.map();
  },

  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (Object.isFunction(args.last()))
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },

  size: function() {
    return this.toArray().length;
  },

  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }
};

Object.extend(Enumerable, {
  map:     Enumerable.collect,
  find:    Enumerable.detect,
  select:  Enumerable.findAll,
  filter:  Enumerable.findAll,
  member:  Enumerable.include,
  entries: Enumerable.toArray,
  every:   Enumerable.all,
  some:    Enumerable.any
});
function $A(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) return iterable.toArray();
  var length = iterable.length || 0, results = new Array(length);
  while (length--) results[length] = iterable[length];
  return results;
}

if (Prototype.Browser.WebKit) {
  $A = function(iterable) {
    if (!iterable) return [];
    // In Safari, only use the `toArray` method if it's not a NodeList.
    // A NodeList is a function, has an function `item` property, and a numeric
    // `length` property. Adapted from Google Doctype.
    if (!(typeof iterable === 'function' && typeof iterable.length ===
        'number' && typeof iterable.item === 'function') && iterable.toArray)
      return iterable.toArray();
    var length = iterable.length || 0, results = new Array(length);
    while (length--) results[length] = iterable[length];
    return results;
  };
}

Array.from = $A;

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
  _each: function(iterator) {
    for (var i = 0, length = this.length; i < length; i++)
      iterator(this[i]);
  },

  clear: function() {
    this.length = 0;
    return this;
  },

  first: function() {
    return this[0];
  },

  last: function() {
    return this[this.length - 1];
  },

  compact: function() {
    return this.select(function(value) {
      return value != null;
    });
  },

  flatten: function() {
    return this.inject([], function(array, value) {
      return array.concat(Object.isArray(value) ?
        value.flatten() : [value]);
    });
  },

  without: function() {
    var values = $A(arguments);
    return this.select(function(value) {
      return !values.include(value);
    });
  },

  reverse: function(inline) {
    return (inline !== false ? this : this.toArray())._reverse();
  },

  reduce: function() {
    return this.length > 1 ? this : this[0];
  },

  uniq: function(sorted) {
    return this.inject([], function(array, value, index) {
      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
        array.push(value);
      return array;
    });
  },

  intersect: function(array) {
    return this.uniq().findAll(function(item) {
      return array.detect(function(value) { return item === value });
    });
  },

  clone: function() {
    return [].concat(this);
  },

  size: function() {
    return this.length;
  },

  inspect: function() {
    return '[' + this.map(Object.inspect).join(', ') + ']';
  },

  toJSON: function() {
    var results = [];
    this.each(function(object) {
      var value = Object.toJSON(object);
      if (!Object.isUndefined(value)) results.push(value);
    });
    return '[' + results.join(', ') + ']';
  }
});

// use native browser JS 1.6 implementation if available
if (Object.isFunction(Array.prototype.forEach))
  Array.prototype._each = Array.prototype.forEach;

if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
  i || (i = 0);
  var length = this.length;
  if (i < 0) i = length + i;
  for (; i < length; i++)
    if (this[i] === item) return i;
  return -1;
};

if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
  var n = this.slice(0, i).reverse().indexOf(item);
  return (n < 0) ? n : i - n - 1;
};

Array.prototype.toArray = Array.prototype.clone;

function $w(string) {
  if (!Object.isString(string)) return [];
  string = string.strip();
  return string ? string.split(/\s+/) : [];
}

if (Prototype.Browser.Opera){
  Array.prototype.concat = function() {
    var array = [];
    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
    for (var i = 0, length = arguments.length; i < length; i++) {
      if (Object.isArray(arguments[i])) {
        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
          array.push(arguments[i][j]);
      } else {
        array.push(arguments[i]);
      }
    }
    return array;
  };
}
Object.extend(Number.prototype, {
  toColorPart: function() {
    return this.toPaddedString(2, 16);
  },

  succ: function() {
    return this + 1;
  },

  times: function(iterator, context) {
    $R(0, this, true).each(iterator, context);
    return this;
  },

  toPaddedString: function(length, radix) {
    var string = this.toString(radix || 10);
    return '0'.times(length - string.length) + string;
  },

  toJSON: function() {
    return isFinite(this) ? this.toString() : 'null';
  }
});

$w('abs round ceil floor').each(function(method){
  Number.prototype[method] = Math[method].methodize();
});
function $H(object) {
  return new Hash(object);
};

var Hash = Class.create(Enumerable, (function() {

  function toQueryPair(key, value) {
    if (Object.isUndefined(value)) return key;
    return key + '=' + encodeURIComponent(String.interpret(value));
  }

  return {
    initialize: function(object) {
      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
    },

    _each: function(iterator) {
      for (var key in this._object) {
        var value = this._object[key], pair = [key, value];
        pair.key = key;
        pair.value = value;
        iterator(pair);
      }
    },

    set: function(key, value) {
      return this._object[key] = value;
    },

    get: function(key) {
      // simulating poorly supported hasOwnProperty
      if (this._object[key] !== Object.prototype[key])
        return this._object[key];
    },

    unset: function(key) {
      var value = this._object[key];
      delete this._object[key];
      return value;
    },

    toObject: function() {
      return Object.clone(this._object);
    },

    keys: function() {
      return this.pluck('key');
    },

    values: function() {
      return this.pluck('value');
    },

    index: function(value) {
      var match = this.detect(function(pair) {
        return pair.value === value;
      });
      return match && match.key;
    },

    merge: function(object) {
      return this.clone().update(object);
    },

    update: function(object) {
      return new Hash(object).inject(this, function(result, pair) {
        result.set(pair.key, pair.value);
        return result;
      });
    },

    toQueryString: function() {
      return this.inject([], function(results, pair) {
        var key = encodeURIComponent(pair.key), values = pair.value;

        if (values && typeof values == 'object') {
          if (Object.isArray(values))
            return results.concat(values.map(toQueryPair.curry(key)));
        } else results.push(toQueryPair(key, values));
        return results;
      }).join('&');
    },

    inspect: function() {
      return '#<Hash:{' + this.map(function(pair) {
        return pair.map(Object.inspect).join(': ');
      }).join(', ') + '}>';
    },

    toJSON: function() {
      return Object.toJSON(this.toObject());
    },

    clone: function() {
      return new Hash(this);
    }
  }
})());

Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
Hash.from = $H;
var ObjectRange = Class.create(Enumerable, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    while (this.include(value)) {
      iterator(value);
      value = value.succ();
    }
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

var $R = function(start, end, exclusive) {
  return new ObjectRange(start, end, exclusive);
};

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  },

  activeRequestCount: 0
};

Ajax.Responders = {
  responders: [],

  _each: function(iterator) {
    this.responders._each(iterator);
  },

  register: function(responder) {
    if (!this.include(responder))
      this.responders.push(responder);
  },

  unregister: function(responder) {
    this.responders = this.responders.without(responder);
  },

  dispatch: function(callback, request, transport, json) {
    this.each(function(responder) {
      if (Object.isFunction(responder[callback])) {
        try {
          responder[callback].apply(responder, [request, transport, json]);
        } catch (e) { }
      }
    });
  }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
  onCreate:   function() { Ajax.activeRequestCount++ },
  onComplete: function() { Ajax.activeRequestCount-- }
});

Ajax.Base = Class.create({
  initialize: function(options) {
    this.options = {
      method:       'post',
      asynchronous: true,
      contentType:  'application/x-www-form-urlencoded',
      encoding:     'UTF-8',
      parameters:   '',
      evalJSON:     true,
      evalJS:       true
    };
    Object.extend(this.options, options || { });

    this.options.method = this.options.method.toLowerCase();

    if (Object.isString(this.options.parameters))
      this.options.parameters = this.options.parameters.toQueryParams();
    else if (Object.isHash(this.options.parameters))
      this.options.parameters = this.options.parameters.toObject();
  }
});

Ajax.Request = Class.create(Ajax.Base, {
  _complete: false,

  initialize: function($super, url, options) {
    $super(options);
    this.transport = Ajax.getTransport();
    this.request(url);
  },

  request: function(url) {
    this.url = url;
    this.method = this.options.method;
    var params = Object.clone(this.options.parameters);

    if (!['get', 'post'].include(this.method)) {
      // simulate other verbs over post
      params['_method'] = this.method;
      this.method = 'post';
    }

    this.parameters = params;

    if (params = Object.toQueryString(params)) {
      // when GET, append parameters to URL
      if (this.method == 'get')
        this.url += (this.url.include('?') ? '&' : '?') + params;
      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
        params += '&_=';
    }

    try {
      var response = new Ajax.Response(this);
      if (this.options.onCreate) this.options.onCreate(response);
      Ajax.Responders.dispatch('onCreate', this, response);

      this.transport.open(this.method.toUpperCase(), this.url,
        this.options.asynchronous);

      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);

      this.transport.onreadystatechange = this.onStateChange.bind(this);
      this.setRequestHeaders();

      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
      this.transport.send(this.body);

      /* Force Firefox to handle ready state 4 for synchronous requests */
      if (!this.options.asynchronous && this.transport.overrideMimeType)
        this.onStateChange();

    }
    catch (e) {
      this.dispatchException(e);
    }
  },

  onStateChange: function() {
    var readyState = this.transport.readyState;
    if (readyState > 1 && !((readyState == 4) && this._complete))
      this.respondToReadyState(this.transport.readyState);
  },

  setRequestHeaders: function() {
    var headers = {
      'X-Requested-With': 'XMLHttpRequest',
      'X-Prototype-Version': Prototype.Version,
      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
    };

    if (this.method == 'post') {
      headers['Content-type'] = this.options.contentType +
        (this.options.encoding ? '; charset=' + this.options.encoding : '');

      /* Force "Connection: close" for older Mozilla browsers to work
       * around a bug where XMLHttpRequest sends an incorrect
       * Content-length header. See Mozilla Bugzilla #246651.
       */
      if (this.transport.overrideMimeType &&
          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
            headers['Connection'] = 'close';
    }

    // user-defined headers
    if (typeof this.options.requestHeaders == 'object') {
      var extras = this.options.requestHeaders;

      if (Object.isFunction(extras.push))
        for (var i = 0, length = extras.length; i < length; i += 2)
          headers[extras[i]] = extras[i+1];
      else
        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
    }

    for (var name in headers)
      this.transport.setRequestHeader(name, headers[name]);
  },

  success: function() {
    var status = this.getStatus();
    return !status || (status >= 200 && status < 300);
  },

  getStatus: function() {
    try {
      return this.transport.status || 0;
    } catch (e) { return 0 }
  },

  respondToReadyState: function(readyState) {
    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);

    if (state == 'Complete') {
      try {
        this._complete = true;
        (this.options['on' + response.status]
         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
         || Prototype.emptyFunction)(response, response.headerJSON);
      } catch (e) {
        this.dispatchException(e);
      }

      var contentType = response.getHeader('Content-type');
      if (this.options.evalJS == 'force'
          || (this.options.evalJS && this.isSameOrigin() && contentType
          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
        this.evalResponse();
    }

    try {
      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
    } catch (e) {
      this.dispatchException(e);
    }

    if (state == 'Complete') {
      // avoid memory leak in MSIE: clean up
      this.transport.onreadystatechange = Prototype.emptyFunction;
    }
  },

  isSameOrigin: function() {
    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
      protocol: location.protocol,
      domain: document.domain,
      port: location.port ? ':' + location.port : ''
    }));
  },

  getHeader: function(name) {
    try {
      return this.transport.getResponseHeader(name) || null;
    } catch (e) { return null }
  },

  evalResponse: function() {
    try {
      return eval((this.transport.responseText || '').unfilterJSON());
    } catch (e) {
      this.dispatchException(e);
    }
  },

  dispatchException: function(exception) {
    (this.options.onException || Prototype.emptyFunction)(this, exception);
    Ajax.Responders.dispatch('onException', this, exception);
  }
});

Ajax.Request.Events =
  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Response = Class.create({
  initialize: function(request){
    this.request = request;
    var transport  = this.transport  = request.transport,
        readyState = this.readyState = transport.readyState;

    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
      this.status       = this.getStatus();
      this.statusText   = this.getStatusText();
      this.responseText = String.interpret(transport.responseText);
      this.headerJSON   = this._getHeaderJSON();
    }

    if(readyState == 4) {
      var xml = transport.responseXML;
      this.responseXML  = Object.isUndefined(xml) ? null : xml;
      this.responseJSON = this._getResponseJSON();
    }
  },

  status:      0,
  statusText: '',

  getStatus: Ajax.Request.prototype.getStatus,

  getStatusText: function() {
    try {
      return this.transport.statusText || '';
    } catch (e) { return '' }
  },

  getHeader: Ajax.Request.prototype.getHeader,

  getAllHeaders: function() {
    try {
      return this.getAllResponseHeaders();
    } catch (e) { return null }
  },

  getResponseHeader: function(name) {
    return this.transport.getResponseHeader(name);
  },

  getAllResponseHeaders: function() {
    return this.transport.getAllResponseHeaders();
  },

  _getHeaderJSON: function() {
    var json = this.getHeader('X-JSON');
    if (!json) return null;
    json = decodeURIComponent(escape(json));
    try {
      return json.evalJSON(this.request.options.sanitizeJSON ||
        !this.request.isSameOrigin());
    } catch (e) {
      this.request.dispatchException(e);
    }
  },

  _getResponseJSON: function() {
    var options = this.request.options;
    if (!options.evalJSON || (options.evalJSON != 'force' &&
      !(this.getHeader('Content-type') || '').include('application/json')) ||
        this.responseText.blank())
          return null;
    try {
      return this.responseText.evalJSON(options.sanitizeJSON ||
        !this.request.isSameOrigin());
    } catch (e) {
      this.request.dispatchException(e);
    }
  }
});

Ajax.Updater = Class.create(Ajax.Request, {
  initialize: function($super, container, url, options) {
    this.container = {
      success: (container.success || container),
      failure: (container.failure || (container.success ? null : container))
    };

    options = Object.clone(options);
    var onComplete = options.onComplete;
    options.onComplete = (function(response, json) {
      this.updateContent(response.responseText);
      if (Object.isFunction(onComplete)) onComplete(response, json);
    }).bind(this);

    $super(url, options);
  },

  updateContent: function(responseText) {
    var receiver = this.container[this.success() ? 'success' : 'failure'],
        options = this.options;

    if (!options.evalScripts) responseText = responseText.stripScripts();

    if (receiver = $(receiver)) {
      if (options.insertion) {
        if (Object.isString(options.insertion)) {
          var insertion = { }; insertion[options.insertion] = responseText;
          receiver.insert(insertion);
        }
        else options.insertion(receiver, responseText);
      }
      else receiver.update(responseText);
    }
  }
});

Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
  initialize: function($super, container, url, options) {
    $super(options);
    this.onComplete = this.options.onComplete;

    this.frequency = (this.options.frequency || 2);
    this.decay = (this.options.decay || 1);

    this.updater = { };
    this.container = container;
    this.url = url;

    this.start();
  },

  start: function() {
    this.options.onComplete = this.updateComplete.bind(this);
    this.onTimerEvent();
  },

  stop: function() {
    this.updater.options.onComplete = undefined;
    clearTimeout(this.timer);
    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
  },

  updateComplete: function(response) {
    if (this.options.decay) {
      this.decay = (response.responseText == this.lastText ?
        this.decay * this.options.decay : 1);

      this.lastText = response.responseText;
    }
    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
  },

  onTimerEvent: function() {
    this.updater = new Ajax.Updater(this.container, this.url, this.options);
  }
});
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (Object.isString(element))
    element = document.getElementById(element);
  return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
  document._getElementsByXPath = function(expression, parentElement) {
    var results = [];
    var query = document.evaluate(expression, $(parentElement) || document,
      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, length = query.snapshotLength; i < length; i++)
      results.push(Element.extend(query.snapshotItem(i)));
    return results;
  };
}

/*--------------------------------------------------------------------------*/

if (!window.Node) var Node = { };

if (!Node.ELEMENT_NODE) {
  // DOM level 2 ECMAScript Language Binding
  Object.extend(Node, {
    ELEMENT_NODE: 1,
    ATTRIBUTE_NODE: 2,
    TEXT_NODE: 3,
    CDATA_SECTION_NODE: 4,
    ENTITY_REFERENCE_NODE: 5,
    ENTITY_NODE: 6,
    PROCESSING_INSTRUCTION_NODE: 7,
    COMMENT_NODE: 8,
    DOCUMENT_NODE: 9,
    DOCUMENT_TYPE_NODE: 10,
    DOCUMENT_FRAGMENT_NODE: 11,
    NOTATION_NODE: 12
  });
}

(function() {
  var element = this.Element;
  this.Element = function(tagName, attributes) {
    attributes = attributes || { };
    tagName = tagName.toLowerCase();
    var cache = Element.cache;
    if (Prototype.Browser.IE && attributes.name) {
      tagName = '<' + tagName + ' name="' + attributes.name + '">';
      delete attributes.name;
      return Element.writeAttribute(document.createElement(tagName), attributes);
    }
    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
  };
  Object.extend(this.Element, element || { });
  if (element) this.Element.prototype = element.prototype;
}).call(window);

Element.cache = { };

Element.Methods = {
  visible: function(element) {
    return $(element).style.display != 'none';
  },

  toggle: function(element) {
    element = $(element);
    Element[Element.visible(element) ? 'hide' : 'show'](element);
    return element;
  },

  hide: function(element) {
    element = $(element);
    element.style.display = 'none';
    return element;
  },

  show: function(element) {
    element = $(element);
    element.style.display = '';
    return element;
  },

  remove: function(element) {
    element = $(element);
    element.parentNode.removeChild(element);
    return element;
  },

  update: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);
    content = Object.toHTML(content);
    element.innerHTML = content.stripScripts();
    content.evalScripts.bind(content).defer();
    return element;
  },

  replace: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    else if (!Object.isElement(content)) {
      content = Object.toHTML(content);
      var range = element.ownerDocument.createRange();
      range.selectNode(element);
      content.evalScripts.bind(content).defer();
      content = range.createContextualFragment(content.stripScripts());
    }
    element.parentNode.replaceChild(content, element);
    return element;
  },

  insert: function(element, insertions) {
    element = $(element);

    if (Object.isString(insertions) || Object.isNumber(insertions) ||
        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
          insertions = {bottom:insertions};

    var content, insert, tagName, childNodes;

    for (var position in insertions) {
      content  = insertions[position];
      position = position.toLowerCase();
      insert = Element._insertionTranslations[position];

      if (content && content.toElement) content = content.toElement();
      if (Object.isElement(content)) {
        insert(element, content);
        continue;
      }

      content = Object.toHTML(content);

      tagName = ((position == 'before' || position == 'after')
        ? element.parentNode : element).tagName.toUpperCase();

      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());

      if (position == 'top' || position == 'after') childNodes.reverse();
      childNodes.each(insert.curry(element));

      content.evalScripts.bind(content).defer();
    }

    return element;
  },

  wrap: function(element, wrapper, attributes) {
    element = $(element);
    if (Object.isElement(wrapper))
      $(wrapper).writeAttribute(attributes || { });
    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
    else wrapper = new Element('div', wrapper);
    if (element.parentNode)
      element.parentNode.replaceChild(wrapper, element);
    wrapper.appendChild(element);
    return wrapper;
  },

  inspect: function(element) {
    element = $(element);
    var result = '<' + element.tagName.toLowerCase();
    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
      var property = pair.first(), attribute = pair.last();
      var value = (element[property] || '').toString();
      if (value) result += ' ' + attribute + '=' + value.inspect(true);
    });
    return result + '>';
  },

  recursivelyCollect: function(element, property) {
    element = $(element);
    var elements = [];
    while (element = element[property])
      if (element.nodeType == 1)
        elements.push(Element.extend(element));
    return elements;
  },

  ancestors: function(element) {
    return $(element).recursivelyCollect('parentNode');
  },

  descendants: function(element) {
    return $(element).select("*");
  },

  firstDescendant: function(element) {
    element = $(element).firstChild;
    while (element && element.nodeType != 1) element = element.nextSibling;
    return $(element);
  },

  immediateDescendants: function(element) {
    if (!(element = $(element).firstChild)) return [];
    while (element && element.nodeType != 1) element = element.nextSibling;
    if (element) return [element].concat($(element).nextSiblings());
    return [];
  },

  previousSiblings: function(element) {
    return $(element).recursivelyCollect('previousSibling');
  },

  nextSiblings: function(element) {
    return $(element).recursivelyCollect('nextSibling');
  },

  siblings: function(element) {
    element = $(element);
    return element.previousSiblings().reverse().concat(element.nextSiblings());
  },

  match: function(element, selector) {
    if (Object.isString(selector))
      selector = new Selector(selector);
    return selector.match($(element));
  },

  up: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(element.parentNode);
    var ancestors = element.ancestors();
    return Object.isNumber(expression) ? ancestors[expression] :
      Selector.findElement(ancestors, expression, index);
  },

  down: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return element.firstDescendant();
    return Object.isNumber(expression) ? element.descendants()[expression] :
      Element.select(element, expression)[index || 0];
  },

  previous: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
    var previousSiblings = element.previousSiblings();
    return Object.isNumber(expression) ? previousSiblings[expression] :
      Selector.findElement(previousSiblings, expression, index);
  },

  next: function(element, expression, index) {
    element = $(element);
    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
    var nextSiblings = element.nextSiblings();
    return Object.isNumber(expression) ? nextSiblings[expression] :
      Selector.findElement(nextSiblings, expression, index);
  },

  select: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element, args);
  },

  adjacent: function() {
    var args = $A(arguments), element = $(args.shift());
    return Selector.findChildElements(element.parentNode, args).without(element);
  },

  identify: function(element) {
    element = $(element);
    var id = element.readAttribute('id'), self = arguments.callee;
    if (id) return id;
    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
    element.writeAttribute('id', id);
    return id;
  },

  readAttribute: function(element, name) {
    element = $(element);
    if (Prototype.Browser.IE) {
      var t = Element._attributeTranslations.read;
      if (t.values[name]) return t.values[name](element, name);
      if (t.names[name]) name = t.names[name];
      if (name.include(':')) {
        return (!element.attributes || !element.attributes[name]) ? null :
         element.attributes[name].value;
      }
    }
    return element.getAttribute(name);
  },

  writeAttribute: function(element, name, value) {
    element = $(element);
    var attributes = { }, t = Element._attributeTranslations.write;

    if (typeof name == 'object') attributes = name;
    else attributes[name] = Object.isUndefined(value) ? true : value;

    for (var attr in attributes) {
      name = t.names[attr] || attr;
      value = attributes[attr];
      if (t.values[attr]) name = t.values[attr](element, value);
      if (value === false || value === null)
        element.removeAttribute(name);
      else if (value === true)
        element.setAttribute(name, name);
      else element.setAttribute(name, value);
    }
    return element;
  },

  getHeight: function(element) {
    return $(element).getDimensions().height;
  },

  getWidth: function(element) {
    return $(element).getDimensions().width;
  },

  classNames: function(element) {
    return new Element.ClassNames(element);
  },

  hasClassName: function(element, className) {
    if (!(element = $(element))) return;
    var elementClassName = element.className;
    return (elementClassName.length > 0 && (elementClassName == className ||
      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
  },

  addClassName: function(element, className) {
    if (!(element = $(element))) return;
    if (!element.hasClassName(className))
      element.className += (element.className ? ' ' : '') + className;
    return element;
  },

  removeClassName: function(element, className) {
    if (!(element = $(element))) return;
    element.className = element.className.replace(
      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
    return element;
  },

  toggleClassName: function(element, className) {
    if (!(element = $(element))) return;
    return element[element.hasClassName(className) ?
      'removeClassName' : 'addClassName'](className);
  },

  // removes whitespace-only text node children
  cleanWhitespace: function(element) {
    element = $(element);
    var node = element.firstChild;
    while (node) {
      var nextNode = node.nextSibling;
      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
        element.removeChild(node);
      node = nextNode;
    }
    return element;
  },

  empty: function(element) {
    return $(element).innerHTML.blank();
  },

  descendantOf: function(element, ancestor) {
    element = $(element), ancestor = $(ancestor);

    if (element.compareDocumentPosition)
      return (element.compareDocumentPosition(ancestor) & 8) === 8;

    if (ancestor.contains)
      return ancestor.contains(element) && ancestor !== element;

    while (element = element.parentNode)
      if (element == ancestor) return true;

    return false;
  },

  scrollTo: function(element) {
    element = $(element);
    var pos = element.cumulativeOffset();
    window.scrollTo(pos[0], pos[1]);
    return element;
  },

  getStyle: function(element, style) {
    element = $(element);
    style = style == 'float' ? 'cssFloat' : style.camelize();
    var value = element.style[style];
    if (!value || value == 'auto') {
      var css = document.defaultView.getComputedStyle(element, null);
      value = css ? css[style] : null;
    }
    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
    return value == 'auto' ? null : value;
  },

  getOpacity: function(element) {
    return $(element).getStyle('opacity');
  },

  setStyle: function(element, styles) {
    element = $(element);
    var elementStyle = element.style, match;
    if (Object.isString(styles)) {
      element.style.cssText += ';' + styles;
      return styles.include('opacity') ?
        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
    }
    for (var property in styles)
      if (property == 'opacity') element.setOpacity(styles[property]);
      else
        elementStyle[(property == 'float' || property == 'cssFloat') ?
          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
            property] = styles[property];

    return element;
  },

  setOpacity: function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;
    return element;
  },

  getDimensions: function(element) {
    element = $(element);
    var display = element.getStyle('display');
    if (display != 'none' && display != null) // Safari bug
      return {width: element.offsetWidth, height: element.offsetHeight};

    // All *Width and *Height properties give 0 on elements with display none,
    // so enable the element temporarily
    var els = element.style;
    var originalVisibility = els.visibility;
    var originalPosition = els.position;
    var originalDisplay = els.display;
    els.visibility = 'hidden';
    els.position = 'absolute';
    els.display = 'block';
    var originalWidth = element.clientWidth;
    var originalHeight = element.clientHeight;
    els.display = originalDisplay;
    els.position = originalPosition;
    els.visibility = originalVisibility;
    return {width: originalWidth, height: originalHeight};
  },

  makePositioned: function(element) {
    element = $(element);
    var pos = Element.getStyle(element, 'position');
    if (pos == 'static' || !pos) {
      element._madePositioned = true;
      element.style.position = 'relative';
      // Opera returns the offset relative to the positioning context, when an
      // element is position relative but top and left have not been defined
      if (Prototype.Browser.Opera) {
        element.style.top = 0;
        element.style.left = 0;
      }
    }
    return element;
  },

  undoPositioned: function(element) {
    element = $(element);
    if (element._madePositioned) {
      element._madePositioned = undefined;
      element.style.position =
        element.style.top =
        element.style.left =
        element.style.bottom =
        element.style.right = '';
    }
    return element;
  },

  makeClipping: function(element) {
    element = $(element);
    if (element._overflow) return element;
    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
    if (element._overflow !== 'hidden')
      element.style.overflow = 'hidden';
    return element;
  },

  undoClipping: function(element) {
    element = $(element);
    if (!element._overflow) return element;
    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
    element._overflow = null;
    return element;
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if (element.tagName.toUpperCase() == 'BODY') break;
        var p = Element.getStyle(element, 'position');
        if (p !== 'static') break;
      }
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  absolutize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'absolute') return element;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

    var offsets = element.positionedOffset();
    var top     = offsets[1];
    var left    = offsets[0];
    var width   = element.clientWidth;
    var height  = element.clientHeight;

    element._originalLeft   = left - parseFloat(element.style.left  || 0);
    element._originalTop    = top  - parseFloat(element.style.top || 0);
    element._originalWidth  = element.style.width;
    element._originalHeight = element.style.height;

    element.style.position = 'absolute';
    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.width  = width + 'px';
    element.style.height = height + 'px';
    return element;
  },

  relativize: function(element) {
    element = $(element);
    if (element.getStyle('position') == 'relative') return element;
    // Position.prepare(); // To be done manually by Scripty when it needs it.

    element.style.position = 'relative';
    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

    element.style.top    = top + 'px';
    element.style.left   = left + 'px';
    element.style.height = element._originalHeight;
    element.style.width  = element._originalWidth;
    return element;
  },

  cumulativeScrollOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return Element._returnOffset(valueL, valueT);
  },

  getOffsetParent: function(element) {
    if (element.offsetParent) return $(element.offsetParent);
    if (element == document.body) return $(element);
    if(element.tagName.toUpperCase()=='HTML') //for IE6,7
        return $(document.body);                //

    while ((element = element.parentNode) && element != document.body)
      if (Element.getStyle(element, 'position') != 'static')
        return $(element);

    return $(document.body);
  },

  viewportOffset: function(forElement) {
    var valueT = 0, valueL = 0;

    var element = forElement;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;

      // Safari fix
      if (element.offsetParent == document.body &&
        Element.getStyle(element, 'position') == 'absolute') break;

    } while (element = element.offsetParent);

    element = forElement;
    do {
      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) {
        valueT -= element.scrollTop  || 0;
        valueL -= element.scrollLeft || 0;
      }
    } while (element = element.parentNode);

    return Element._returnOffset(valueL, valueT);
  },

  clonePosition: function(element, source) {
    var options = Object.extend({
      setLeft:    true,
      setTop:     true,
      setWidth:   true,
      setHeight:  true,
      offsetTop:  0,
      offsetLeft: 0
    }, arguments[2] || { });

    // find page position of source
    source = $(source);
    var p = source.viewportOffset();

    // find coordinate system to use
    element = $(element);
    var delta = [0, 0];
    var parent = null;
    // delta [0,0] will do fine with position: fixed elements,
    // position:absolute needs offsetParent deltas
    if (Element.getStyle(element, 'position') == 'absolute') {
      parent = element.getOffsetParent();
      delta = parent.viewportOffset();
    }

    // correct by body offsets (fixes Safari)
    if (parent == document.body) {
      delta[0] -= document.body.offsetLeft;
      delta[1] -= document.body.offsetTop;
    }

    // set position
    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
    return element;
  }
};

Element.Methods.identify.counter = 1;

Object.extend(Element.Methods, {
  getElementsBySelector: Element.Methods.select,
  childElements: Element.Methods.immediateDescendants
});

Element._attributeTranslations = {
  write: {
    names: {
      className: 'class',
      htmlFor:   'for'
    },
    values: { }
  }
};

if (Prototype.Browser.Opera) {
  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
    function(proceed, element, style) {
      switch (style) {
        case 'left': case 'top': case 'right': case 'bottom':
          if (proceed(element, 'position') === 'static') return null;
        case 'height': case 'width':
          // returns '0px' for hidden elements; we want it to return null
          if (!Element.visible(element)) return null;

          // returns the border-box dimensions rather than the content-box
          // dimensions, so we subtract padding and borders from the value
          var dim = parseInt(proceed(element, style), 10);

          if (dim !== element['offset' + style.capitalize()])
            return dim + 'px';

          var properties;
          if (style === 'height') {
            properties = ['border-top-width', 'padding-top',
             'padding-bottom', 'border-bottom-width'];
          }
          else {
            properties = ['border-left-width', 'padding-left',
             'padding-right', 'border-right-width'];
          }
          return properties.inject(dim, function(memo, property) {
            var val = proceed(element, property);
            return val === null ? memo : memo - parseInt(val, 10);
          }) + 'px';
        default: return proceed(element, style);
      }
    }
  );

  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
    function(proceed, element, attribute) {
      if (attribute === 'title') return element.title;
      return proceed(element, attribute);
    }
  );
}

else if (Prototype.Browser.IE) {
  // IE doesn't report offsets correctly for static elements, so we change them
  // to "relative" to get the values, then change them back.
  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
    function(proceed, element) {
      element = $(element);
      // IE throws an error if element is not in document
      try { element.offsetParent }
      catch(e) { return $(document.body) }
      var position = element.getStyle('position');
      if (position !== 'static') return proceed(element);
      element.setStyle({ position: 'relative' });
      var value = proceed(element);
      element.setStyle({ position: position });
      return value;
    }
  );

  $w('positionedOffset viewportOffset').each(function(method) {
    Element.Methods[method] = Element.Methods[method].wrap(
      function(proceed, element) {
        element = $(element);
        try { element.offsetParent }
        catch(e) { return Element._returnOffset(0,0) }
        var position = element.getStyle('position');
        if (position !== 'static') return proceed(element);
        // Trigger hasLayout on the offset parent so that IE6 reports
        // accurate offsetTop and offsetLeft values for position: fixed.
        var offsetParent = element.getOffsetParent();
        if (offsetParent && offsetParent.getStyle('position') === 'fixed')
          offsetParent.setStyle({ zoom: 1 });
        element.setStyle({ position: 'relative' });
        var value = proceed(element);
        element.setStyle({ position: position });
        return value;
      }
    );
  });

  Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(
    function(proceed, element) {
      try { element.offsetParent }
      catch(e) { return Element._returnOffset(0,0) }
      return proceed(element);
    }
  );

  Element.Methods.getStyle = function(element, style) {
    element = $(element);
    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
    var value = element.style[style];
    if (!value && element.currentStyle) value = element.currentStyle[style];

    if (style == 'opacity') {
      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
        if (value[1]) return parseFloat(value[1]) / 100;
      return 1.0;
    }

    if (value == 'auto') {
      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
        return element['offset' + style.capitalize()] + 'px';
      return null;
    }
    return value;
  };

  Element.Methods.setOpacity = function(element, value) {
    function stripAlpha(filter){
      return filter.replace(/alpha\([^\)]*\)/gi,'');
    }
    element = $(element);
    var currentStyle = element.currentStyle;
    if ((currentStyle && !currentStyle.hasLayout) ||
      (!currentStyle && element.style.zoom == 'normal'))
        element.style.zoom = 1;

    var filter = element.getStyle('filter'), style = element.style;
    if (value == 1 || value === '') {
      (filter = stripAlpha(filter)) ?
        style.filter = filter : style.removeAttribute('filter');
      return element;
    } else if (value < 0.00001) value = 0;
    style.filter = stripAlpha(filter) +
      'alpha(opacity=' + (value * 100) + ')';
    return element;
  };

  Element._attributeTranslations = {
    read: {
      names: {
        'class': 'className',
        'for':   'htmlFor'
      },
      values: {
        _getAttr: function(element, attribute) {
          return element.getAttribute(attribute, 2);
        },
        _getAttrNode: function(element, attribute) {
          var node = element.getAttributeNode(attribute);
          return node ? node.value : "";
        },
        _getEv: function(element, attribute) {
          attribute = element.getAttribute(attribute);
          return attribute ? attribute.toString().slice(23, -2) : null;
        },
        _flag: function(element, attribute) {
          return $(element).hasAttribute(attribute) ? attribute : null;
        },
        style: function(element) {
          return element.style.cssText.toLowerCase();
        },
        title: function(element) {
          return element.title;
        }
      }
    }
  };

  Element._attributeTranslations.write = {
    names: Object.extend({
      cellpadding: 'cellPadding',
      cellspacing: 'cellSpacing'
    }, Element._attributeTranslations.read.names),
    values: {
      checked: function(element, value) {
        element.checked = !!value;
      },

      style: function(element, value) {
        element.style.cssText = value ? value : '';
      }
    }
  };

  Element._attributeTranslations.has = {};

  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
      'encType maxLength readOnly longDesc frameBorder').each(function(attr) {
    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
  });

  (function(v) {
    Object.extend(v, {
      href:        v._getAttr,
      src:         v._getAttr,
      type:        v._getAttr,
      action:      v._getAttrNode,
      disabled:    v._flag,
      checked:     v._flag,
      readonly:    v._flag,
      multiple:    v._flag,
      onload:      v._getEv,
      onunload:    v._getEv,
      onclick:     v._getEv,
      ondblclick:  v._getEv,
      onmousedown: v._getEv,
      onmouseup:   v._getEv,
      onmouseover: v._getEv,
      onmousemove: v._getEv,
      onmouseout:  v._getEv,
      onfocus:     v._getEv,
      onblur:      v._getEv,
      onkeypress:  v._getEv,
      onkeydown:   v._getEv,
      onkeyup:     v._getEv,
      onsubmit:    v._getEv,
      onreset:     v._getEv,
      onselect:    v._getEv,
      onchange:    v._getEv
    });
  })(Element._attributeTranslations.read.values);
}

else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1) ? 0.999999 :
      (value === '') ? '' : (value < 0.00001) ? 0 : value;
    return element;
  };
}

else if (Prototype.Browser.WebKit) {
  Element.Methods.setOpacity = function(element, value) {
    element = $(element);
    element.style.opacity = (value == 1 || value === '') ? '' :
      (value < 0.00001) ? 0 : value;

    if (value == 1)
      if(element.tagName.toUpperCase() == 'IMG' && element.width) {
        element.width++; element.width--;
      } else try {
        var n = document.createTextNode(' ');
        element.appendChild(n);
        element.removeChild(n);
      } catch (e) { }

    return element;
  };

  // Safari returns margins on body which is incorrect if the child is absolutely
  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
  // KHTML/WebKit only.
  Element.Methods.cumulativeOffset = function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      if (element.offsetParent == document.body)
        if (Element.getStyle(element, 'position') == 'absolute') break;

      element = element.offsetParent;
    } while (element);

    return Element._returnOffset(valueL, valueT);
  };
}

if (Prototype.Browser.IE || Prototype.Browser.Opera) {
  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
  Element.Methods.update = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);

    content = Object.toHTML(content);
    var tagName = element.tagName.toUpperCase();

    if (tagName in Element._insertionTranslations.tags) {
      $A(element.childNodes).each(function(node) { element.removeChild(node) });
      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
        .each(function(node) { element.appendChild(node) });
    }
    else element.innerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

if ('outerHTML' in document.createElement('div')) {
  Element.Methods.replace = function(element, content) {
    element = $(element);

    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) {
      element.parentNode.replaceChild(content, element);
      return element;
    }

    content = Object.toHTML(content);
    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();

    if (Element._insertionTranslations.tags[tagName]) {
      var nextSibling = element.next();
      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
      parent.removeChild(element);
      if (nextSibling)
        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
      else
        fragments.each(function(node) { parent.appendChild(node) });
    }
    else element.outerHTML = content.stripScripts();

    content.evalScripts.bind(content).defer();
    return element;
  };
}

Element._returnOffset = function(l, t) {
  var result = [l, t];
  result.left = l;
  result.top = t;
  return result;
};

Element._getContentFromAnonymousElement = function(tagName, html) {
  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
  if (t) {
    div.innerHTML = t[0] + html + t[1];
    t[2].times(function() { div = div.firstChild });
  } else div.innerHTML = html;
  return $A(div.childNodes);
};

Element._insertionTranslations = {
  before: function(element, node) {
    element.parentNode.insertBefore(node, element);
  },
  top: function(element, node) {
    element.insertBefore(node, element.firstChild);
  },
  bottom: function(element, node) {
    element.appendChild(node);
  },
  after: function(element, node) {
    element.parentNode.insertBefore(node, element.nextSibling);
  },
  tags: {
    TABLE:  ['<table>',                '</table>',                   1],
    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
    SELECT: ['<select>',               '</select>',                  1]
  }
};

(function() {
  Object.extend(this.tags, {
    THEAD: this.tags.TBODY,
    TFOOT: this.tags.TBODY,
    TH:    this.tags.TD
  });
}).call(Element._insertionTranslations);

Element.Methods.Simulated = {
  hasAttribute: function(element, attribute) {
    attribute = Element._attributeTranslations.has[attribute] || attribute;
    var node = $(element).getAttributeNode(attribute);
    return !!(node && node.specified);
  }
};

Element.Methods.ByTag = { };

Object.extend(Element, Element.Methods);

if (!Prototype.BrowserFeatures.ElementExtensions &&
    document.createElement('div')['__proto__']) {
  window.HTMLElement = { };
  window.HTMLElement.prototype = document.createElement('div')['__proto__'];
  Prototype.BrowserFeatures.ElementExtensions = true;
}

Element.extend = (function() {
  if (Prototype.BrowserFeatures.SpecificElementExtensions)
    return Prototype.K;

  var Methods = { }, ByTag = Element.Methods.ByTag;

  var extend = Object.extend(function(element) {
    if (!element || element._extendedByPrototype ||
        element.nodeType != 1 || element == window) return element;

    var methods = Object.clone(Methods),
      tagName = element.tagName.toUpperCase(), property, value;

    // extend methods for specific tags
    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);

    for (property in methods) {
      value = methods[property];
      if (Object.isFunction(value) && !(property in element))
        element[property] = value.methodize();
    }

    element._extendedByPrototype = Prototype.emptyFunction;
    return element;

  }, {
    refresh: function() {
      // extend methods for all tags (Safari doesn't need this)
      if (!Prototype.BrowserFeatures.ElementExtensions) {
        Object.extend(Methods, Element.Methods);
        Object.extend(Methods, Element.Methods.Simulated);
      }
    }
  });

  extend.refresh();
  return extend;
})();

Element.hasAttribute = function(element, attribute) {
  if (element.hasAttribute) return element.hasAttribute(attribute);
  return Element.Methods.Simulated.hasAttribute(element, attribute);
};

Element.addMethods = function(methods) {
  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;

  if (!methods) {
    Object.extend(Form, Form.Methods);
    Object.extend(Form.Element, Form.Element.Methods);
    Object.extend(Element.Methods.ByTag, {
      "FORM":     Object.clone(Form.Methods),
      "INPUT":    Object.clone(Form.Element.Methods),
      "SELECT":   Object.clone(Form.Element.Methods),
      "TEXTAREA": Object.clone(Form.Element.Methods)
    });
  }

  if (arguments.length == 2) {
    var tagName = methods;
    methods = arguments[1];
  }

  if (!tagName) Object.extend(Element.Methods, methods || { });
  else {
    if (Object.isArray(tagName)) tagName.each(extend);
    else extend(tagName);
  }

  function extend(tagName) {
    tagName = tagName.toUpperCase();
    if (!Element.Methods.ByTag[tagName])
      Element.Methods.ByTag[tagName] = { };
    Object.extend(Element.Methods.ByTag[tagName], methods);
  }

  function copy(methods, destination, onlyIfAbsent) {
    onlyIfAbsent = onlyIfAbsent || false;
    for (var property in methods) {
      var value = methods[property];
      if (!Object.isFunction(value)) continue;
      if (!onlyIfAbsent || !(property in destination))
        destination[property] = value.methodize();
    }
  }

  function findDOMClass(tagName) {
    var klass;
    var trans = {
      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
      "FrameSet", "IFRAME": "IFrame"
    };
    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName + 'Element';
    if (window[klass]) return window[klass];
    klass = 'HTML' + tagName.capitalize() + 'Element';
    if (window[klass]) return window[klass];

    window[klass] = { };
    window[klass].prototype = document.createElement(tagName)['__proto__'];
    return window[klass];
  }

  if (F.ElementExtensions) {
    copy(Element.Methods, HTMLElement.prototype);
    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
  }

  if (F.SpecificElementExtensions) {
    for (var tag in Element.Methods.ByTag) {
      var klass = findDOMClass(tag);
      if (Object.isUndefined(klass)) continue;
      copy(T[tag], klass.prototype);
    }
  }

  Object.extend(Element, Element.Methods);
  delete Element.ByTag;

  if (Element.extend.refresh) Element.extend.refresh();
  Element.cache = { };
};

document.viewport = {
  getDimensions: function() {
    var dimensions = { }, B = Prototype.Browser;
    $w('width height').each(function(d) {
      var D = d.capitalize();
      if (B.WebKit && !document.evaluate) {
        // Safari <3.0 needs self.innerWidth/Height
        dimensions[d] = self['inner' + D];
      } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) {
        // Opera <9.5 needs document.body.clientWidth/Height
        dimensions[d] = document.body['client' + D]
      } else {
        dimensions[d] = document.documentElement['client' + D];
      }
    });
    return dimensions;
  },

  getWidth: function() {
    return this.getDimensions().width;
  },

  getHeight: function() {
    return this.getDimensions().height;
  },

  getScrollOffsets: function() {
    return Element._returnOffset(
      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
  }
};
/* Portions of the Selector class are derived from Jack Slocum's DomQuery,
 * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
 * license.  Please see http://www.yui-ext.com/ for more information. */

var Selector = Class.create({
  initialize: function(expression) {
    this.expression = expression.strip();

    if (this.shouldUseSelectorsAPI()) {
      this.mode = 'selectorsAPI';
    } else if (this.shouldUseXPath()) {
      this.mode = 'xpath';
      this.compileXPathMatcher();
    } else {
      this.mode = "normal";
      this.compileMatcher();
    }

  },

  shouldUseXPath: function() {
    if (!Prototype.BrowserFeatures.XPath) return false;

    var e = this.expression;

    // Safari 3 chokes on :*-of-type and :empty
    if (Prototype.Browser.WebKit &&
     (e.include("-of-type") || e.include(":empty")))
      return false;

    // XPath can't do namespaced attributes, nor can it read
    // the "checked" property from DOM nodes
    if ((/(\[[\w-]*?:|:checked)/).test(e))
      return false;

    return true;
  },

  shouldUseSelectorsAPI: function() {
    if (!Prototype.BrowserFeatures.SelectorsAPI) return false;

    if (!Selector._div) Selector._div = new Element('div');

    // Make sure the browser treats the selector as valid. Test on an
    // isolated element to minimize cost of this check.
    try {
      Selector._div.querySelector(this.expression);
    } catch(e) {
      return false;
    }

    return true;
  },

  compileMatcher: function() {
    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
        c = Selector.criteria, le, p, m;

    if (Selector._cache[e]) {
      this.matcher = Selector._cache[e];
      return;
    }

    this.matcher = ["this.matcher = function(root) {",
                    "var r = root, h = Selector.handlers, c = false, n;"];

    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
            new Template(c[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.matcher.push("return h.unique(n);\n}");
    eval(this.matcher.join('\n'));
    Selector._cache[this.expression] = this.matcher;
  },

  compileXPathMatcher: function() {
    var e = this.expression, ps = Selector.patterns,
        x = Selector.xpath, le, m;

    if (Selector._cache[e]) {
      this.xpath = Selector._cache[e]; return;
    }

    this.matcher = ['.//*'];
    while (e && le != e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        if (m = e.match(ps[i])) {
          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
            new Template(x[i]).evaluate(m));
          e = e.replace(m[0], '');
          break;
        }
      }
    }

    this.xpath = this.matcher.join('');
    Selector._cache[this.expression] = this.xpath;
  },

  findElements: function(root) {
    root = root || document;
    var e = this.expression, results;

    switch (this.mode) {
      case 'selectorsAPI':
        // querySelectorAll queries document-wide, then filters to descendants
        // of the context element. That's not what we want.
        // Add an explicit context to the selector if necessary.
        if (root !== document) {
          var oldId = root.id, id = $(root).identify();
          e = "#" + id + " " + e;
        }

        results = $A(root.querySelectorAll(e)).map(Element.extend);
        root.id = oldId;

        return results;
      case 'xpath':
        return document._getElementsByXPath(this.xpath, root);
      default:
       return this.matcher(root);
    }
  },

  match: function(element) {
    this.tokens = [];

    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
    var le, p, m;

    while (e && le !== e && (/\S/).test(e)) {
      le = e;
      for (var i in ps) {
        p = ps[i];
        if (m = e.match(p)) {
          // use the Selector.assertions methods unless the selector
          // is too complex.
          if (as[i]) {
            this.tokens.push([i, Object.clone(m)]);
            e = e.replace(m[0], '');
          } else {
            // reluctantly do a document-wide search
            // and look for a match in the array
            return this.findElements(document).include(element);
          }
        }
      }
    }

    var match = true, name, matches;
    for (var i = 0, token; token = this.tokens[i]; i++) {
      name = token[0], matches = token[1];
      if (!Selector.assertions[name](element, matches)) {
        match = false; break;
      }
    }

    return match;
  },

  toString: function() {
    return this.expression;
  },

  inspect: function() {
    return "#<Selector:" + this.expression.inspect() + ">";
  }
});

Object.extend(Selector, {
  _cache: { },

  xpath: {
    descendant:   "//*",
    child:        "/*",
    adjacent:     "/following-sibling::*[1]",
    laterSibling: '/following-sibling::*',
    tagName:      function(m) {
      if (m[1] == '*') return '';
      return "[local-name()='" + m[1].toLowerCase() +
             "' or local-name()='" + m[1].toUpperCase() + "']";
    },
    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
    id:           "[@id='#{1}']",
    attrPresence: function(m) {
      m[1] = m[1].toLowerCase();
      return new Template("[@#{1}]").evaluate(m);
    },
    attr: function(m) {
      m[1] = m[1].toLowerCase();
      m[3] = m[5] || m[6];
      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
    },
    pseudo: function(m) {
      var h = Selector.xpath.pseudos[m[1]];
      if (!h) return '';
      if (Object.isFunction(h)) return h(m);
      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
    },
    operators: {
      '=':  "[@#{1}='#{3}']",
      '!=': "[@#{1}!='#{3}']",
      '^=': "[starts-with(@#{1}, '#{3}')]",
      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
      '*=': "[contains(@#{1}, '#{3}')]",
      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
    },
    pseudos: {
      'first-child': '[not(preceding-sibling::*)]',
      'last-child':  '[not(following-sibling::*)]',
      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
      'empty':       "[count(*) = 0 and (count(text()) = 0)]",
      'checked':     "[@checked]",
      'disabled':    "[(@disabled) and (@type!='hidden')]",
      'enabled':     "[not(@disabled) and (@type!='hidden')]",
      'not': function(m) {
        var e = m[6], p = Selector.patterns,
            x = Selector.xpath, le, v;

        var exclusion = [];
        while (e && le != e && (/\S/).test(e)) {
          le = e;
          for (var i in p) {
            if (m = e.match(p[i])) {
              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
              e = e.replace(m[0], '');
              break;
            }
          }
        }
        return "[not(" + exclusion.join(" and ") + ")]";
      },
      'nth-child':      function(m) {
        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
      },
      'nth-last-child': function(m) {
        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
      },
      'nth-of-type':    function(m) {
        return Selector.xpath.pseudos.nth("position() ", m);
      },
      'nth-last-of-type': function(m) {
        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
      },
      'first-of-type':  function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
      },
      'last-of-type':   function(m) {
        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
      },
      'only-of-type':   function(m) {
        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
      },
      nth: function(fragment, m) {
        var mm, formula = m[6], predicate;
        if (formula == 'even') formula = '2n+0';
        if (formula == 'odd')  formula = '2n+1';
        if (mm = formula.match(/^(\d+)$/)) // digit only
          return '[' + fragment + "= " + mm[1] + ']';
        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
          if (mm[1] == "-") mm[1] = -1;
          var a = mm[1] ? Number(mm[1]) : 1;
          var b = mm[2] ? Number(mm[2]) : 0;
          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
          "((#{fragment} - #{b}) div #{a} >= 0)]";
          return new Template(predicate).evaluate({
            fragment: fragment, a: a, b: b });
        }
      }
    }
  },

  criteria: {
    tagName:      'n = h.tagName(n, r, "#{1}", c);      c = false;',
    className:    'n = h.className(n, r, "#{1}", c);    c = false;',
    id:           'n = h.id(n, r, "#{1}", c);           c = false;',
    attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
    attr: function(m) {
      m[3] = (m[5] || m[6]);
      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
    },
    pseudo: function(m) {
      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
    },
    descendant:   'c = "descendant";',
    child:        'c = "child";',
    adjacent:     'c = "adjacent";',
    laterSibling: 'c = "laterSibling";'
  },

  patterns: {
    // combinators must be listed first
    // (and descendant needs to be last combinator)
    laterSibling: /^\s*~\s*/,
    child:        /^\s*>\s*/,
    adjacent:     /^\s*\+\s*/,
    descendant:   /^\s/,

    // selectors follow
    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
    id:           /^#([\w\-\*]+)(\b|$)/,
    className:    /^\.([\w\-\*]+)(\b|$)/,
    pseudo:
/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
    attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/,
    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
  },

  // for Selector.match and Element#match
  assertions: {
    tagName: function(element, matches) {
      return matches[1].toUpperCase() == element.tagName.toUpperCase();
    },

    className: function(element, matches) {
      return Element.hasClassName(element, matches[1]);
    },

    id: function(element, matches) {
      return element.id === matches[1];
    },

    attrPresence: function(element, matches) {
      return Element.hasAttribute(element, matches[1]);
    },

    attr: function(element, matches) {
      var nodeValue = Element.readAttribute(element, matches[1]);
      return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
    }
  },

  handlers: {
    // UTILITY FUNCTIONS
    // joins two collections
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        a.push(node);
      return a;
    },

    // marks an array of nodes for counting
    mark: function(nodes) {
      var _true = Prototype.emptyFunction;
      for (var i = 0, node; node = nodes[i]; i++)
        node._countedByPrototype = _true;
      return nodes;
    },

    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node._countedByPrototype = undefined;
      return nodes;
    },

    // mark each child node with its position (for nth calls)
    // "ofType" flag indicates whether we're indexing for nth-of-type
    // rather than nth-child
    index: function(parentNode, reverse, ofType) {
      parentNode._countedByPrototype = Prototype.emptyFunction;
      if (reverse) {
        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
          var node = nodes[i];
          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
        }
      } else {
        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
      }
    },

    // filters out duplicates and extends all nodes
    unique: function(nodes) {
      if (nodes.length == 0) return nodes;
      var results = [], n;
      for (var i = 0, l = nodes.length; i < l; i++)
        if (!(n = nodes[i])._countedByPrototype) {
          n._countedByPrototype = Prototype.emptyFunction;
          results.push(Element.extend(n));
        }
      return Selector.handlers.unmark(results);
    },

    // COMBINATOR FUNCTIONS
    descendant: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, node.getElementsByTagName('*'));
      return results;
    },

    child: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        for (var j = 0, child; child = node.childNodes[j]; j++)
          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
      }
      return results;
    },

    adjacent: function(nodes) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        var next = this.nextElementSibling(node);
        if (next) results.push(next);
      }
      return results;
    },

    laterSibling: function(nodes) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        h.concat(results, Element.nextSiblings(node));
      return results;
    },

    nextElementSibling: function(node) {
      while (node = node.nextSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    previousElementSibling: function(node) {
      while (node = node.previousSibling)
        if (node.nodeType == 1) return node;
      return null;
    },

    // TOKEN FUNCTIONS
    tagName: function(nodes, root, tagName, combinator) {
      var uTagName = tagName.toUpperCase();
      var results = [], h = Selector.handlers;
      if (nodes) {
        if (combinator) {
          // fastlane for ordinary descendant combinators
          if (combinator == "descendant") {
            for (var i = 0, node; node = nodes[i]; i++)
              h.concat(results, node.getElementsByTagName(tagName));
            return results;
          } else nodes = this[combinator](nodes);
          if (tagName == "*") return nodes;
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.tagName.toUpperCase() === uTagName) results.push(node);
        return results;
      } else return root.getElementsByTagName(tagName);
    },

    id: function(nodes, root, id, combinator) {
      var targetNode = $(id), h = Selector.handlers;
      if (!targetNode) return [];
      if (!nodes && root == document) return [targetNode];
      if (nodes) {
        if (combinator) {
          if (combinator == 'child') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (targetNode.parentNode == node) return [targetNode];
          } else if (combinator == 'descendant') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Element.descendantOf(targetNode, node)) return [targetNode];
          } else if (combinator == 'adjacent') {
            for (var i = 0, node; node = nodes[i]; i++)
              if (Selector.handlers.previousElementSibling(targetNode) == node)
                return [targetNode];
          } else nodes = h[combinator](nodes);
        }
        for (var i = 0, node; node = nodes[i]; i++)
          if (node == targetNode) return [targetNode];
        return [];
      }
      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
    },

    className: function(nodes, root, className, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      return Selector.handlers.byClassName(nodes, root, className);
    },

    byClassName: function(nodes, root, className) {
      if (!nodes) nodes = Selector.handlers.descendant([root]);
      var needle = ' ' + className + ' ';
      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
        nodeClassName = node.className;
        if (nodeClassName.length == 0) continue;
        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
          results.push(node);
      }
      return results;
    },

    attrPresence: function(nodes, root, attr, combinator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      if (nodes && combinator) nodes = this[combinator](nodes);
      var results = [];
      for (var i = 0, node; node = nodes[i]; i++)
        if (Element.hasAttribute(node, attr)) results.push(node);
      return results;
    },

    attr: function(nodes, root, attr, value, operator, combinator) {
      if (!nodes) nodes = root.getElementsByTagName("*");
      if (nodes && combinator) nodes = this[combinator](nodes);
      var handler = Selector.operators[operator], results = [];
      for (var i = 0, node; node = nodes[i]; i++) {
        var nodeValue = Element.readAttribute(node, attr);
        if (nodeValue === null) continue;
        if (handler(nodeValue, value)) results.push(node);
      }
      return results;
    },

    pseudo: function(nodes, name, value, root, combinator) {
      if (nodes && combinator) nodes = this[combinator](nodes);
      if (!nodes) nodes = root.getElementsByTagName("*");
      return Selector.pseudos[name](nodes, value, root);
    }
  },

  pseudos: {
    'first-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.previousElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'last-child': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        if (Selector.handlers.nextElementSibling(node)) continue;
          results.push(node);
      }
      return results;
    },
    'only-child': function(nodes, value, root) {
      var h = Selector.handlers;
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
          results.push(node);
      return results;
    },
    'nth-child':        function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root);
    },
    'nth-last-child':   function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true);
    },
    'nth-of-type':      function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, false, true);
    },
    'nth-last-of-type': function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, formula, root, true, true);
    },
    'first-of-type':    function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, false, true);
    },
    'last-of-type':     function(nodes, formula, root) {
      return Selector.pseudos.nth(nodes, "1", root, true, true);
    },
    'only-of-type':     function(nodes, formula, root) {
      var p = Selector.pseudos;
      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
    },

    // handles the an+b logic
    getIndices: function(a, b, total) {
      if (a == 0) return b > 0 ? [b] : [];
      return $R(1, total).inject([], function(memo, i) {
        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
        return memo;
      });
    },

    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
    nth: function(nodes, formula, root, reverse, ofType) {
      if (nodes.length == 0) return [];
      if (formula == 'even') formula = '2n+0';
      if (formula == 'odd')  formula = '2n+1';
      var h = Selector.handlers, results = [], indexed = [], m;
      h.mark(nodes);
      for (var i = 0, node; node = nodes[i]; i++) {
        if (!node.parentNode._countedByPrototype) {
          h.index(node.parentNode, reverse, ofType);
          indexed.push(node.parentNode);
        }
      }
      if (formula.match(/^\d+$/)) { // just a number
        formula = Number(formula);
        for (var i = 0, node; node = nodes[i]; i++)
          if (node.nodeIndex == formula) results.push(node);
      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
        if (m[1] == "-") m[1] = -1;
        var a = m[1] ? Number(m[1]) : 1;
        var b = m[2] ? Number(m[2]) : 0;
        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
          for (var j = 0; j < l; j++)
            if (node.nodeIndex == indices[j]) results.push(node);
        }
      }
      h.unmark(nodes);
      h.unmark(indexed);
      return results;
    },

    'empty': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++) {
        // IE treats comments as element nodes
        if (node.tagName == '!' || node.firstChild) continue;
        results.push(node);
      }
      return results;
    },

    'not': function(nodes, selector, root) {
      var h = Selector.handlers, selectorType, m;
      var exclusions = new Selector(selector).findElements(root);
      h.mark(exclusions);
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node._countedByPrototype) results.push(node);
      h.unmark(exclusions);
      return results;
    },

    'enabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (!node.disabled && (!node.type || node.type !== 'hidden'))
          results.push(node);
      return results;
    },

    'disabled': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.disabled) results.push(node);
      return results;
    },

    'checked': function(nodes, value, root) {
      for (var i = 0, results = [], node; node = nodes[i]; i++)
        if (node.checked) results.push(node);
      return results;
    }
  },

  operators: {
    '=':  function(nv, v) { return nv == v; },
    '!=': function(nv, v) { return nv != v; },
    '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); },
    '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); },
    '*=': function(nv, v) { return nv == v || nv && nv.include(v); },
    '$=': function(nv, v) { return nv.endsWith(v); },
    '*=': function(nv, v) { return nv.include(v); },
    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
    '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() +
     '-').include('-' + (v || "").toUpperCase() + '-'); }
  },

  split: function(expression) {
    var expressions = [];
    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
      expressions.push(m[1].strip());
    });
    return expressions;
  },

  matchElements: function(elements, expression) {
    var matches = $$(expression), h = Selector.handlers;
    h.mark(matches);
    for (var i = 0, results = [], element; element = elements[i]; i++)
      if (element._countedByPrototype) results.push(element);
    h.unmark(matches);
    return results;
  },

  findElement: function(elements, expression, index) {
    if (Object.isNumber(expression)) {
      index = expression; expression = false;
    }
    return Selector.matchElements(elements, expression || '*')[index || 0];
  },

  findChildElements: function(element, expressions) {
    expressions = Selector.split(expressions.join(','));
    var results = [], h = Selector.handlers;
    for (var i = 0, l = expressions.length, selector; i < l; i++) {
      selector = new Selector(expressions[i].strip());
      h.concat(results, selector.findElements(element));
    }
    return (l > 1) ? h.unique(results) : results;
  }
});

if (Prototype.Browser.IE) {
  Object.extend(Selector.handlers, {
    // IE returns comment nodes on getElementsByTagName("*").
    // Filter them out.
    concat: function(a, b) {
      for (var i = 0, node; node = b[i]; i++)
        if (node.tagName !== "!") a.push(node);
      return a;
    },

    // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
    unmark: function(nodes) {
      for (var i = 0, node; node = nodes[i]; i++)
        node.removeAttribute('_countedByPrototype');
      return nodes;
    }
  });
}

function $$() {
  return Selector.findChildElements(document, $A(arguments));
}
var Form = {
  reset: function(form) {
    $(form).reset();
    return form;
  },

  serializeElements: function(elements, options) {
    if (typeof options != 'object') options = { hash: !!options };
    else if (Object.isUndefined(options.hash)) options.hash = true;
    var key, value, submitted = false, submit = options.submit;

    var data = elements.inject({ }, function(result, element) {
      if (!element.disabled && element.name) {
        key = element.name; value = $(element).getValue();
        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted &&
            submit !== false && (!submit || key == submit) && (submitted = true)))) {
          if (key in result) {
            // a key is already present; construct an array of values
            if (!Object.isArray(result[key])) result[key] = [result[key]];
            result[key].push(value);
          }
          else result[key] = value;
        }
      }
      return result;
    });

    return options.hash ? data : Object.toQueryString(data);
  }
};

Form.Methods = {
  serialize: function(form, options) {
    return Form.serializeElements(Form.getElements(form), options);
  },

  getElements: function(form) {
    return $A($(form).getElementsByTagName('*')).inject([],
      function(elements, child) {
        if (Form.Element.Serializers[child.tagName.toLowerCase()])
          elements.push(Element.extend(child));
        return elements;
      }
    );
  },

  getInputs: function(form, typeName, name) {
    form = $(form);
    var inputs = form.getElementsByTagName('input');

    if (!typeName && !name) return $A(inputs).map(Element.extend);

    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
      var input = inputs[i];
      if ((typeName && input.type != typeName) || (name && input.name != name))
        continue;
      matchingInputs.push(Element.extend(input));
    }

    return matchingInputs;
  },

  disable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('disable');
    return form;
  },

  enable: function(form) {
    form = $(form);
    Form.getElements(form).invoke('enable');
    return form;
  },

  findFirstElement: function(form) {
    var elements = $(form).getElements().findAll(function(element) {
      return 'hidden' != element.type && !element.disabled;
    });
    var firstByIndex = elements.findAll(function(element) {
      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
    }).sortBy(function(element) { return element.tabIndex }).first();

    return firstByIndex ? firstByIndex : elements.find(function(element) {
      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
    });
  },

  focusFirstElement: function(form) {
    form = $(form);
    form.findFirstElement().activate();
    return form;
  },

  request: function(form, options) {
    form = $(form), options = Object.clone(options || { });

    var params = options.parameters, action = form.readAttribute('action') || '';
    if (action.blank()) action = window.location.href;
    options.parameters = form.serialize(true);

    if (params) {
      if (Object.isString(params)) params = params.toQueryParams();
      Object.extend(options.parameters, params);
    }

    if (form.hasAttribute('method') && !options.method)
      options.method = form.method;

    return new Ajax.Request(action, options);
  }
};

/*--------------------------------------------------------------------------*/

Form.Element = {
  focus: function(element) {
    $(element).focus();
    return element;
  },

  select: function(element) {
    $(element).select();
    return element;
  }
};

Form.Element.Methods = {
  serialize: function(element) {
    element = $(element);
    if (!element.disabled && element.name) {
      var value = element.getValue();
      if (value != undefined) {
        var pair = { };
        pair[element.name] = value;
        return Object.toQueryString(pair);
      }
    }
    return '';
  },

  getValue: function(element) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    return Form.Element.Serializers[method](element);
  },

  setValue: function(element, value) {
    element = $(element);
    var method = element.tagName.toLowerCase();
    Form.Element.Serializers[method](element, value);
    return element;
  },

  clear: function(element) {
    $(element).value = '';
    return element;
  },

  present: function(element) {
    return $(element).value != '';
  },

  activate: function(element) {
    element = $(element);
    try {
      element.focus();
      if (element.select && (element.tagName.toLowerCase() != 'input' ||
          !['button', 'reset', 'submit'].include(element.type)))
        element.select();
    } catch (e) { }
    return element;
  },

  disable: function(element) {
    element = $(element);
    element.disabled = true;
    return element;
  },

  enable: function(element) {
    element = $(element);
    element.disabled = false;
    return element;
  }
};

/*--------------------------------------------------------------------------*/

var Field = Form.Element;
var $F = Form.Element.Methods.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
  input: function(element, value) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return Form.Element.Serializers.inputSelector(element, value);
      default:
        return Form.Element.Serializers.textarea(element, value);
    }
  },

  inputSelector: function(element, value) {
    if (Object.isUndefined(value)) return element.checked ? element.value : null;
    else element.checked = !!value;
  },

  textarea: function(element, value) {
    if (Object.isUndefined(value)) return element.value;
    else element.value = value;
  },

  select: function(element, value) {
    if (Object.isUndefined(value))
      return this[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    else {
      var opt, currentValue, single = !Object.isArray(value);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        currentValue = this.optionValue(opt);
        if (single) {
          if (currentValue == value) {
            opt.selected = true;
            return;
          }
        }
        else opt.selected = value.include(currentValue);
      }
    }
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
    // extend element because hasAttribute may not be native
    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
  }
};

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
  initialize: function($super, element, frequency, callback) {
    $super(callback, frequency);
    this.element   = $(element);
    this.lastValue = this.getValue();
  },

  execute: function() {
    var value = this.getValue();
    if (Object.isString(this.lastValue) && Object.isString(value) ?
        this.lastValue != value : String(this.lastValue) != String(value)) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }
});

Form.Element.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.Observer = Class.create(Abstract.TimedObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = Class.create({
  initialize: function(element, callback) {
    this.element  = $(element);
    this.callback = callback;

    this.lastValue = this.getValue();
    if (this.element.tagName.toLowerCase() == 'form')
      this.registerFormCallbacks();
    else
      this.registerCallback(this.element);
  },

  onElementEvent: function() {
    var value = this.getValue();
    if (this.lastValue != value) {
      this.callback(this.element, value);
      this.lastValue = value;
    }
  },

  registerFormCallbacks: function() {
    Form.getElements(this.element).each(this.registerCallback, this);
  },

  registerCallback: function(element) {
    if (element.type) {
      switch (element.type.toLowerCase()) {
        case 'checkbox':
        case 'radio':
          Event.observe(element, 'click', this.onElementEvent.bind(this));
          break;
        default:
          Event.observe(element, 'change', this.onElementEvent.bind(this));
          break;
      }
    }
  }
});

Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
  getValue: function() {
    return Form.Element.getValue(this.element);
  }
});

Form.EventObserver = Class.create(Abstract.EventObserver, {
  getValue: function() {
    return Form.serialize(this.element);
  }
});
if (!window.Event) var Event = { };

Object.extend(Event, {
  KEY_BACKSPACE: 8,
  KEY_TAB:       9,
  KEY_RETURN:   13,
  KEY_ESC:      27,
  KEY_LEFT:     37,
  KEY_UP:       38,
  KEY_RIGHT:    39,
  KEY_DOWN:     40,
  KEY_DELETE:   46,
  KEY_HOME:     36,
  KEY_END:      35,
  KEY_PAGEUP:   33,
  KEY_PAGEDOWN: 34,
  KEY_INSERT:   45,

  cache: { },

  relatedTarget: function(event) {
    var element;
    switch(event.type) {
      case 'mouseover': element = event.fromElement; break;
      case 'mouseout':  element = event.toElement;   break;
      default: return null;
    }
    return Element.extend(element);
  }
});

Event.Methods = (function() {
  var isButton;

  if (Prototype.Browser.IE) {
    var buttonMap = { 0: 1, 1: 4, 2: 2 };
    isButton = function(event, code) {
      return event.button == buttonMap[code];
    };

  } else if (Prototype.Browser.WebKit) {
    isButton = function(event, code) {
      switch (code) {
        case 0: return event.which == 1 && !event.metaKey;
        case 1: return event.which == 1 && event.metaKey;
        default: return false;
      }
    };

  } else {
    isButton = function(event, code) {
      return event.which ? (event.which === code + 1) : (event.button === code);
    };
  }

  return {
    isLeftClick:   function(event) { return isButton(event, 0) },
    isMiddleClick: function(event) { return isButton(event, 1) },
    isRightClick:  function(event) { return isButton(event, 2) },

    element: function(event) {
      event = Event.extend(event);

      var node          = event.target,
          type          = event.type,
          currentTarget = event.currentTarget;

      if (currentTarget && currentTarget.tagName) {
        // Firefox screws up the "click" event when moving between radio buttons
        // via arrow keys. It also screws up the "load" and "error" events on images,
        // reporting the document as the target instead of the original image.
        if (type === 'load' || type === 'error' ||
          (type === 'click' && currentTarget.tagName.toLowerCase() === 'input'
            && currentTarget.type === 'radio'))
              node = currentTarget;
      }
      if (node) {
        if (node.nodeType == Node.TEXT_NODE) node = node.parentNode;
        return Element.extend(node);
      } else return false;
    },

    findElement: function(event, expression) {
      var element = Event.element(event);
      if (!expression) return element;
      var elements = [element].concat(element.ancestors());
      return Selector.findElement(elements, expression, 0);
    },

    pointer: function(event) {
      var docElement = document.documentElement,
      body = document.body || { scrollLeft: 0, scrollTop: 0 };
      return {
        x: event.pageX || (event.clientX +
          (docElement.scrollLeft || body.scrollLeft) -
          (docElement.clientLeft || 0)),
        y: event.pageY || (event.clientY +
          (docElement.scrollTop || body.scrollTop) -
          (docElement.clientTop || 0))
      };
    },

    pointerX: function(event) { return Event.pointer(event).x },
    pointerY: function(event) { return Event.pointer(event).y },

    stop: function(event) {
      Event.extend(event);
      event.preventDefault();
      event.stopPropagation();
      event.stopped = true;
    }
  };
})();

Event.extend = (function() {
  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
    m[name] = Event.Methods[name].methodize();
    return m;
  });

  if (Prototype.Browser.IE) {
    Object.extend(methods, {
      stopPropagation: function() { this.cancelBubble = true },
      preventDefault:  function() { this.returnValue = false },
      inspect: function() { return "[object Event]" }
    });

    return function(event) {
      if (!event) return false;
      if (event._extendedByPrototype) return event;

      event._extendedByPrototype = Prototype.emptyFunction;
      var pointer = Event.pointer(event);
      Object.extend(event, {
        target: event.srcElement,
        relatedTarget: Event.relatedTarget(event),
        pageX:  pointer.x,
        pageY:  pointer.y
      });
      return Object.extend(event, methods);
    };

  } else {
    Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__'];
    Object.extend(Event.prototype, methods);
    return Prototype.K;
  }
})();

Object.extend(Event, (function() {
  var cache = Event.cache;

  function getEventID(element) {
    try {
      if (element._prototypeEventID) return element._prototypeEventID[0];
      arguments.callee.id = arguments.callee.id || 1;
      return element._prototypeEventID = [++arguments.callee.id];
    } catch (error) {
      return false;
    }
  }

  function getDOMEventName(eventName) {
    if (eventName && eventName.include(':')) return "dataavailable";
    return eventName;
  }

  function getCacheForID(id) {
    return cache[id] = cache[id] || { };
  }

  function getWrappersForEventName(id, eventName) {
    var c = getCacheForID(id);
    return c[eventName] = c[eventName] || [];
  }

  function createWrapper(element, eventName, handler) {
    var id = getEventID(element);
    var c = getWrappersForEventName(id, eventName);
    if (c.pluck("handler").include(handler)) return false;

    var wrapper = function(event) {
      if (!Event || !Event.extend ||
        (event.eventName && event.eventName != eventName))
          return false;

      Event.extend(event);
      handler.call(element, event);
    };

    wrapper.handler = handler;
    c.push(wrapper);
    return wrapper;
  }

  function findWrapper(id, eventName, handler) {
    var c = getWrappersForEventName(id, eventName);
    return c.find(function(wrapper) { return wrapper.handler == handler });
  }

  function destroyWrapper(id, eventName, handler) {
    var c = getCacheForID(id);
    if (!c[eventName]) return false;
    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
  }

  function destroyCache() {
    for (var id in cache)
      for (var eventName in cache[id])
        cache[id][eventName] = null;
  }


  // Internet Explorer needs to remove event handlers on page unload
  // in order to avoid memory leaks.
  if (window.attachEvent) {
    window.attachEvent("onunload", destroyCache);
  }

  // Safari has a dummy event handler on page unload so that it won't
  // use its bfcache. Safari <= 3.1 has an issue with restoring the "document"
  // object when page is returned to via the back button using its bfcache.
  if (Prototype.Browser.WebKit) {
    window.addEventListener('unload', Prototype.emptyFunction, false);
  }

  return {
    observe: function(element, eventName, handler) {
      element = $(element);
      var name = getDOMEventName(eventName);

      var wrapper = createWrapper(element, eventName, handler);
      if (!wrapper) return element;

      if (element.addEventListener) {
        element.addEventListener(name, wrapper, false);
      } else {
        element.attachEvent("on" + name, wrapper);
      }

      return element;
    },

    stopObserving: function(element, eventName, handler) {
      element = $(element);
      var id = getEventID(element), name = getDOMEventName(eventName);

      if (!handler && eventName) {
        getWrappersForEventName(id, eventName).each(function(wrapper) {
          element.stopObserving(eventName, wrapper.handler);
        });
        return element;

      } else if (!eventName) {
        Object.keys(getCacheForID(id)).each(function(eventName) {
          element.stopObserving(eventName);
        });
        return element;
      }

      var wrapper = findWrapper(id, eventName, handler);
      if (!wrapper) return element;

      if (element.removeEventListener) {
        element.removeEventListener(name, wrapper, false);
      } else {
        element.detachEvent("on" + name, wrapper);
      }

      destroyWrapper(id, eventName, handler);

      return element;
    },

    fire: function(element, eventName, memo) {
      element = $(element);
      if (element == document && document.createEvent && !element.dispatchEvent)
        element = document.documentElement;

      var event;
      if (document.createEvent) {
        event = document.createEvent("HTMLEvents");
        event.initEvent("dataavailable", true, true);
      } else {
        event = document.createEventObject();
        event.eventType = "ondataavailable";
      }

      event.eventName = eventName;
      event.memo = memo || { };

      if (document.createEvent) {
        element.dispatchEvent(event);
      } else {
        element.fireEvent(event.eventType, event);
      }

      return Event.extend(event);
    }
  };
})());

Object.extend(Event, Event.Methods);

Element.addMethods({
  fire:          Event.fire,
  observe:       Event.observe,
  stopObserving: Event.stopObserving
});

Object.extend(document, {
  fire:          Element.Methods.fire.methodize(),
  observe:       Element.Methods.observe.methodize(),
  stopObserving: Element.Methods.stopObserving.methodize(),
  loaded:        false
});

(function() {
  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
     Matthias Miller, Dean Edwards and John Resig. */

  var timer;

  function fireContentLoadedEvent() {
    if (document.loaded) return;
    if (timer) window.clearInterval(timer);
    document.fire("dom:loaded");
    document.loaded = true;
  }

  if (document.addEventListener) {
    if (Prototype.Browser.WebKit) {
      timer = window.setInterval(function() {
        if (/loaded|complete/.test(document.readyState))
          fireContentLoadedEvent();
      }, 0);

      Event.observe(window, "load", fireContentLoadedEvent);

    } else {
      document.addEventListener("DOMContentLoaded",
        fireContentLoadedEvent, false);
    }

  } else {
    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
    $("__onDOMContentLoaded").onreadystatechange = function() {
      if (this.readyState == "complete") {
        this.onreadystatechange = null;
        fireContentLoadedEvent();
      }
    };
  }
})();
/*------------------------------- DEPRECATED -------------------------------*/

Hash.toQueryString = Object.toQueryString;

var Toggle = { display: Element.toggle };

Element.Methods.childOf = Element.Methods.descendantOf;

var Insertion = {
  Before: function(element, content) {
    return Element.insert(element, {before:content});
  },

  Top: function(element, content) {
    return Element.insert(element, {top:content});
  },

  Bottom: function(element, content) {
    return Element.insert(element, {bottom:content});
  },

  After: function(element, content) {
    return Element.insert(element, {after:content});
  }
};

var $continue = new Error('"throw $continue" is deprecated, use "return" instead');

// This should be moved to script.aculo.us; notice the deprecated methods
// further below, that map to the newer Element methods.
var Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  // caches x/y coordinate pair to use with overlap
  within: function(element, x, y) {
    if (this.includeScrollOffsets)
      return this.withinIncludingScrolloffsets(element, x, y);
    this.xcomp = x;
    this.ycomp = y;
    this.offset = Element.cumulativeOffset(element);

    return (y >= this.offset[1] &&
            y <  this.offset[1] + element.offsetHeight &&
            x >= this.offset[0] &&
            x <  this.offset[0] + element.offsetWidth);
  },

  withinIncludingScrolloffsets: function(element, x, y) {
    var offsetcache = Element.cumulativeScrollOffset(element);

    this.xcomp = x + offsetcache[0] - this.deltaX;
    this.ycomp = y + offsetcache[1] - this.deltaY;
    this.offset = Element.cumulativeOffset(element);

    return (this.ycomp >= this.offset[1] &&
            this.ycomp <  this.offset[1] + element.offsetHeight &&
            this.xcomp >= this.offset[0] &&
            this.xcomp <  this.offset[0] + element.offsetWidth);
  },

  // within must be called directly before
  overlap: function(mode, element) {
    if (!mode) return 0;
    if (mode == 'vertical')
      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
        element.offsetHeight;
    if (mode == 'horizontal')
      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
        element.offsetWidth;
  },

  // Deprecation layer -- use newer Element methods now (1.5.2).

  cumulativeOffset: Element.Methods.cumulativeOffset,

  positionedOffset: Element.Methods.positionedOffset,

  absolutize: function(element) {
    Position.prepare();
    return Element.absolutize(element);
  },

  relativize: function(element) {
    Position.prepare();
    return Element.relativize(element);
  },

  realOffset: Element.Methods.cumulativeScrollOffset,

  offsetParent: Element.Methods.getOffsetParent,

  page: Element.Methods.viewportOffset,

  clone: function(source, target, options) {
    options = options || { };
    return Element.clonePosition(target, source, options);
  }
};

/*--------------------------------------------------------------------------*/

if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
  function iter(name) {
    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
  }

  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
  function(element, className) {
    className = className.toString().strip();
    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
  } : function(element, className) {
    className = className.toString().strip();
    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
    if (!classNames && !className) return elements;

    var nodes = $(element).getElementsByTagName('*');
    className = ' ' + className + ' ';

    for (var i = 0, child, cn; child = nodes[i]; i++) {
      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
          (classNames && classNames.all(function(name) {
            return !name.toString().blank() && cn.include(' ' + name + ' ');
          }))))
        elements.push(Element.extend(child));
    }
    return elements;
  };

  return function(className, parentElement) {
    return $(parentElement || document.body).getElementsByClassName(className);
  };
}(Element.Methods);

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
  initialize: function(element) {
    this.element = $(element);
  },

  _each: function(iterator) {
    this.element.className.split(/\s+/).select(function(name) {
      return name.length > 0;
    })._each(iterator);
  },

  set: function(className) {
    this.element.className = className;
  },

  add: function(classNameToAdd) {
    if (this.include(classNameToAdd)) return;
    this.set($A(this).concat(classNameToAdd).join(' '));
  },

  remove: function(classNameToRemove) {
    if (!this.include(classNameToRemove)) return;
    this.set($A(this).without(classNameToRemove).join(' '));
  },

  toString: function() {
    return $A(this).join(' ');
  }
};

Object.extend(Element.ClassNames.prototype, Enumerable);

/*--------------------------------------------------------------------------*/

Element.addMethods();
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */

var Translate = Class.create();
Translate.prototype = {
    initialize: function(data){
        this.data = $H(data);
    },

    translate : function(){
        var args = arguments;
        var text = arguments[0];

        if(this.data.get(text)){
            return this.data.get(text);
        }
        return text;
    },
    add : function() {
        if (arguments.length > 1) {
            this.data.set(arguments[0], arguments[1]);
        } else if (typeof arguments[0] =='object') {
            $H(arguments[0]).each(function (pair){
                this.data.set(pair.key, pair.value);
            }.bind(this));
        }
    }
}

// Credit Card Validation Javascript
// copyright 12th May 2003, by Stephen Chapman, Felgall Pty Ltd

// You have permission to copy and use this javascript provided that
// the content of the script is not changed in any way.

function validateCreditCard(s) {
    // remove non-numerics
    var v = "0123456789";
    var w = "";
    for (i=0; i < s.length; i++) {
        x = s.charAt(i);
        if (v.indexOf(x,0) != -1)
        w += x;
    }
    // validate number
    j = w.length / 2;
    k = Math.floor(j);
    m = Math.ceil(j) - k;
    c = 0;
    for (i=0; i<k; i++) {
        a = w.charAt(i*2+m) * 2;
        c += a > 9 ? Math.floor(a/10 + a%10) : a;
    }
    for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
    return (c%10 == 0);
}


/*
* Really easy field validation with Prototype
* http://tetlaw.id.au/view/javascript/really-easy-field-validation
* Andrew Tetlaw
* Version 1.5.4.1 (2007-01-05)
*
* Copyright (c) 2007 Andrew Tetlaw
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
*/
var Validator = Class.create();

Validator.prototype = {
    initialize : function(className, error, test, options) {
        if(typeof test == 'function'){
            this.options = $H(options);
            this._test = test;
        } else {
            this.options = $H(test);
            this._test = function(){return true};
        }
        this.error = error || 'Validation failed.';
        this.className = className;
    },
    test : function(v, elm) {
        return (this._test(v,elm) && this.options.all(function(p){
            return Validator.methods[p.key] ? Validator.methods[p.key](v,elm,p.value) : true;
        }));
    }
}
Validator.methods = {
    pattern : function(v,elm,opt) {return Validation.get('IsEmpty').test(v) || opt.test(v)},
    minLength : function(v,elm,opt) {return v.length >= opt},
    maxLength : function(v,elm,opt) {return v.length <= opt},
    min : function(v,elm,opt) {return v >= parseFloat(opt)},
    max : function(v,elm,opt) {return v <= parseFloat(opt)},
    notOneOf : function(v,elm,opt) {return $A(opt).all(function(value) {
        return v != value;
    })},
    oneOf : function(v,elm,opt) {return $A(opt).any(function(value) {
        return v == value;
    })},
    is : function(v,elm,opt) {return v == opt},
    isNot : function(v,elm,opt) {return v != opt},
    equalToField : function(v,elm,opt) {return v == $F(opt)},
    notEqualToField : function(v,elm,opt) {return v != $F(opt)},
    include : function(v,elm,opt) {return $A(opt).all(function(value) {
        return Validation.get(value).test(v,elm);
    })}
}

var Validation = Class.create();
Validation.defaultOptions = {
    onSubmit : true,
    stopOnFirst : false,
    immediate : false,
    focusOnError : true,
    useTitles : false,
    addClassNameToContainer: false,
    containerClassName: '.input-box',
    onFormValidate : function(result, form) {},
    onElementValidate : function(result, elm) {}
};

Validation.prototype = {
    initialize : function(form, options){
        this.form = $(form);
        if (!this.form) {
            return;
        }
        this.options = Object.extend({
            onSubmit : Validation.defaultOptions.onSubmit,
            stopOnFirst : Validation.defaultOptions.stopOnFirst,
            immediate : Validation.defaultOptions.immediate,
            focusOnError : Validation.defaultOptions.focusOnError,
            useTitles : Validation.defaultOptions.useTitles,
            onFormValidate : Validation.defaultOptions.onFormValidate,
            onElementValidate : Validation.defaultOptions.onElementValidate
        }, options || {});
        if(this.options.onSubmit) Event.observe(this.form,'submit',this.onSubmit.bind(this),false);
        if(this.options.immediate) {
            Form.getElements(this.form).each(function(input) { // Thanks Mike!
                if (input.tagName.toLowerCase() == 'select') {
                    Event.observe(input, 'blur', this.onChange.bindAsEventListener(this));
                }
                if (input.type.toLowerCase() == 'radio' || input.type.toLowerCase() == 'checkbox') {
                    Event.observe(input, 'click', this.onChange.bindAsEventListener(this));
                } else {
                    Event.observe(input, 'change', this.onChange.bindAsEventListener(this));
                }
            }, this);
        }
    },
    onChange : function (ev) {
        Validation.isOnChange = true;
        Validation.validate(Event.element(ev),{
                useTitle : this.options.useTitles,
                onElementValidate : this.options.onElementValidate
        });
        Validation.isOnChange = false;
    },
    onSubmit :  function(ev){
        if(!this.validate()) Event.stop(ev);
    },
    validate : function() {
        var result = false;
        var useTitles = this.options.useTitles;
        var callback = this.options.onElementValidate;
        try {
            if(this.options.stopOnFirst) {
                result = Form.getElements(this.form).all(function(elm) {
                    if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) {
                        return true;
                    }
                    return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback});
                }, this);
            } else {
                result = Form.getElements(this.form).collect(function(elm) {
                    if (elm.hasClassName('local-validation') && !this.isElementInForm(elm, this.form)) {
                        return true;
                    }
                    return Validation.validate(elm,{useTitle : useTitles, onElementValidate : callback});
                }, this).all();
            }
        } catch (e) {
        }
        if(!result && this.options.focusOnError) {
            try{
                Form.getElements(this.form).findAll(function(elm){return $(elm).hasClassName('validation-failed')}).first().focus()
            }
            catch(e){
            }
        }
        this.options.onFormValidate(result, this.form);
        return result;
    },
    reset : function() {
        Form.getElements(this.form).each(Validation.reset);
    },
    isElementInForm : function(elm, form) {
        var domForm = elm.up('form');
        if (domForm == form) {
            return true;
        }
        return false;
    }
}

Object.extend(Validation, {
    validate : function(elm, options){
        options = Object.extend({
            useTitle : false,
            onElementValidate : function(result, elm) {}
        }, options || {});
        elm = $(elm);

        var cn = $w(elm.className);
        return result = cn.all(function(value) {
            var test = Validation.test(value,elm,options.useTitle);
            options.onElementValidate(test, elm);
            return test;
        });
    },
    insertAdvice : function(elm, advice){
        var container = $(elm).up('.field-row');
        if(container){
            Element.insert(container, {after: advice});
        } else if (elm.up('td.value')) {
            elm.up('td.value').insert({bottom: advice});
        } else if (elm.advaiceContainer && $(elm.advaiceContainer)) {
            $(elm.advaiceContainer).update(advice);
        }
        else {
            switch (elm.type.toLowerCase()) {
                case 'checkbox':
                case 'radio':
                    var p = elm.parentNode;
                    if(p) {
                        Element.insert(p, {'bottom': advice});
                    } else {
                        Element.insert(elm, {'after': advice});
                    }
                    break;
                default:
                    Element.insert(elm, {'after': advice});
            }
        }
    },
    showAdvice : function(elm, advice, adviceName){
        if(!elm.advices){
            elm.advices = new Hash();
        }
        else{
            elm.advices.each(function(pair){
                if (!advice || pair.value.id != advice.id) {
                    // hide non-current advice after delay
                    this.hideAdvice(elm, pair.value);
                }
            }.bind(this));
        }
        elm.advices.set(adviceName, advice);
        if(typeof Effect == 'undefined') {
            advice.style.display = 'block';
        } else {
            if(!advice._adviceAbsolutize) {
                new Effect.Appear(advice, {duration : 1 });
            } else {
                Position.absolutize(advice);
                advice.show();
                advice.setStyle({
                    'top':advice._adviceTop,
                    'left': advice._adviceLeft,
                    'width': advice._adviceWidth,
                    'z-index': 1000
                });
                advice.addClassName('advice-absolute');
            }
        }
    },
    hideAdvice : function(elm, advice){
        if (advice != null) {
            new Effect.Fade(advice, {duration : 1, afterFinishInternal : function() {advice.hide();}});
        }
    },
    updateCallback : function(elm, status) {
        if (typeof elm.callbackFunction != 'undefined') {
            eval(elm.callbackFunction+'(\''+elm.id+'\',\''+status+'\')');
        }
    },
    ajaxError : function(elm, errorMsg) {
        var name = 'validate-ajax';
        var advice = Validation.getAdvice(name, elm);
        if (advice == null) {
            advice = this.createAdvice(name, elm, false, errorMsg);
        }
        this.showAdvice(elm, advice, 'validate-ajax');
        this.updateCallback(elm, 'failed');

        elm.addClassName('validation-failed');
        elm.addClassName('validate-ajax');
        if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
            var container = elm.up(Validation.defaultOptions.containerClassName);
            if (container && this.allowContainerClassName(elm)) {
                container.removeClassName('validation-passed');
                container.addClassName('validation-error');
            }
        }
    },
    allowContainerClassName: function (elm) {
        if (elm.type == 'radio' || elm.type == 'checkbox') {
            return elm.hasClassName('change-container-classname');
        }

        return true;
    },
    test : function(name, elm, useTitle) {
        var v = Validation.get(name);
        var prop = '__advice'+name.camelize();
        try {
        if(Validation.isVisible(elm) && !v.test($F(elm), elm)) {
            //if(!elm[prop]) {
                var advice = Validation.getAdvice(name, elm);
                if (advice == null) {
                    advice = this.createAdvice(name, elm, useTitle);
                }
                this.showAdvice(elm, advice, name);
                this.updateCallback(elm, 'failed');
            //}
            elm[prop] = 1;
            if (!elm.advaiceContainer) {
                elm.removeClassName('validation-passed');
                elm.addClassName('validation-failed');
            }

           if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
                var container = elm.up(Validation.defaultOptions.containerClassName);
                if (container && this.allowContainerClassName(elm)) {
                    container.removeClassName('validation-passed');
                    container.addClassName('validation-error');
                }
            }
            return false;
        } else {
            var advice = Validation.getAdvice(name, elm);
            this.hideAdvice(elm, advice);
            this.updateCallback(elm, 'passed');
            elm[prop] = '';
            elm.removeClassName('validation-failed');
            elm.addClassName('validation-passed');
            if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
                var container = elm.up(Validation.defaultOptions.containerClassName);
                if (container && !container.down('.validation-failed') && this.allowContainerClassName(elm)) {
                    if (!Validation.get('IsEmpty').test(elm.value) || !this.isVisible(elm)) {
                        container.addClassName('validation-passed');
                    } else {
                        container.removeClassName('validation-passed');
                    }
                    container.removeClassName('validation-error');
                }
            }
            return true;
        }
        } catch(e) {
            throw(e)
        }
    },
    isVisible : function(elm) {
        while(elm.tagName != 'BODY') {
            if(!$(elm).visible()) return false;
            elm = elm.parentNode;
        }
        return true;
    },
    getAdvice : function(name, elm) {
        return $('advice-' + name + '-' + Validation.getElmID(elm)) || $('advice-' + Validation.getElmID(elm));
    },
    createAdvice : function(name, elm, useTitle, customError) {
        var v = Validation.get(name);
        var errorMsg = useTitle ? ((elm && elm.title) ? elm.title : v.error) : v.error;
        if (customError) {
            errorMsg = customError;
        }
        try {
            if (Translator){
                errorMsg = Translator.translate(errorMsg);
            }
        }
        catch(e){}

        advice = '<div class="validation-advice" id="advice-' + name + '-' + Validation.getElmID(elm) +'" style="display:none">' + errorMsg + '</div>'


        Validation.insertAdvice(elm, advice);
        advice = Validation.getAdvice(name, elm);
        if($(elm).hasClassName('absolute-advice')) {
            var dimensions = $(elm).getDimensions();
            var originalPosition = Position.cumulativeOffset(elm);

            advice._adviceTop = (originalPosition[1] + dimensions.height) + 'px';
            advice._adviceLeft = (originalPosition[0])  + 'px';
            advice._adviceWidth = (dimensions.width)  + 'px';
            advice._adviceAbsolutize = true;
        }
        return advice;
    },
    getElmID : function(elm) {
        return elm.id ? elm.id : elm.name;
    },
    reset : function(elm) {
        elm = $(elm);
        var cn = $w(elm.className);
        cn.each(function(value) {
            var prop = '__advice'+value.camelize();
            if(elm[prop]) {
                var advice = Validation.getAdvice(value, elm);
                if (advice) {
                    advice.hide();
                }
                elm[prop] = '';
            }
            elm.removeClassName('validation-failed');
            elm.removeClassName('validation-passed');
            if (Validation.defaultOptions.addClassNameToContainer && Validation.defaultOptions.containerClassName != '') {
                var container = elm.up(Validation.defaultOptions.containerClassName);
                if (container) {
                    container.removeClassName('validation-passed');
                    container.removeClassName('validation-error');
                }
            }
        });
    },
    add : function(className, error, test, options) {
        var nv = {};
        nv[className] = new Validator(className, error, test, options);
        Object.extend(Validation.methods, nv);
    },
    addAllThese : function(validators) {
        var nv = {};
        $A(validators).each(function(value) {
                nv[value[0]] = new Validator(value[0], value[1], value[2], (value.length > 3 ? value[3] : {}));
            });
        Object.extend(Validation.methods, nv);
    },
    get : function(name) {
        return  Validation.methods[name] ? Validation.methods[name] : Validation.methods['_LikeNoIDIEverSaw_'];
    },
    methods : {
        '_LikeNoIDIEverSaw_' : new Validator('_LikeNoIDIEverSaw_','',{})
    }
});

Validation.add('IsEmpty', '', function(v) {
    return  (v == '' || (v == null) || (v.length == 0) || /^\s+$/.test(v)); // || /^\s+$/.test(v));
});

Validation.addAllThese([
    ['validate-select', 'Please select an option.', function(v) {
                return ((v != "none") && (v != null) && (v.length != 0));
            }],
    ['required-entry', 'This is a required field.', function(v) {
                return !Validation.get('IsEmpty').test(v);
            }],
    ['validate-number', 'Please enter a valid number in this field.', function(v) {
                return Validation.get('IsEmpty').test(v) || (!isNaN(parseNumber(v)) && !/^\s+$/.test(parseNumber(v)));
            }],
    ['validate-digits', 'Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.', function(v) {
                return Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
            }],
    ['validate-digits-range', 'The value is not within the specified range.', function(v, elm) {
                var result = Validation.get('IsEmpty').test(v) ||  !/[^\d]/.test(v);
                var reRange = new RegExp(/^digits-range-[0-9]+-[0-9]+$/);
                $w(elm.className).each(function(name, index) {
                    if (name.match(reRange) && result) {
                        var min = parseInt(name.split('-')[2], 10);
                        var max = parseInt(name.split('-')[3], 10);
                        var val = parseInt(v, 10);
                        result = (v >= min) && (v <= max);
                    }
                });
                return result;
            }],
    ['validate-alpha', 'Please use letters only (a-z or A-Z) in this field.', function (v) {
                return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z]+$/.test(v)
            }],
    ['validate-code', 'Please use only letters (a-z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
                return Validation.get('IsEmpty').test(v) ||  /^[a-z]+[a-z0-9_]+$/.test(v)
            }],
    ['validate-alphanum', 'Please use only letters (a-z or A-Z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(v) {
                return Validation.get('IsEmpty').test(v) ||  /^[a-zA-Z0-9]+$/.test(v) /*!/\W/.test(v)*/
            }],
    ['validate-street', 'Please use only letters (a-z or A-Z) or numbers (0-9) or spaces and # only in this field.', function(v) {
                return Validation.get('IsEmpty').test(v) ||  /^[ \w]{3,}([A-Za-z]\.)?([ \w]*\#\d+)?(\r\n| )[ \w]{3,}/.test(v)
            }],
    ['validate-phoneStrict', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
                return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
            }],
    ['validate-phoneLax', 'Please enter a valid phone number. For example (123) 456-7890 or 123-456-7890.', function(v) {
                return Validation.get('IsEmpty').test(v) || /^((\d[-. ]?)?((\(\d{3}\))|\d{3}))?[-. ]?\d{3}[-. ]?\d{4}$/.test(v);
            }],
    ['validate-fax', 'Please enter a valid fax number. For example (123) 456-7890 or 123-456-7890.', function(v) {
                return Validation.get('IsEmpty').test(v) || /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(v);
            }],
    ['validate-date', 'Please enter a valid date.', function(v) {
                var test = new Date(v);
                return Validation.get('IsEmpty').test(v) || !isNaN(test);
            }],
    ['validate-email', 'Please enter a valid email address. For example johndoe@domain.com.', function (v) {
                //return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
                //return Validation.get('IsEmpty').test(v) || /^[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9][\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9\.]{1,30}[\!\#$%\*/?|\^\{\}`~&\'\+\-=_a-z0-9]@([a-z0-9_-]{1,30}\.){1,5}[a-z]{2,4}$/i.test(v)
                return Validation.get('IsEmpty').test(v) || /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i.test(v)
            }],
    ['validate-emailSender', 'Please use only visible characters and spaces.', function (v) {
                return Validation.get('IsEmpty').test(v) ||  /^[\S ]+$/.test(v)
                    }],
    ['validate-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
                var pass=v.strip(); /*strip leading and trailing spaces*/
                return !(pass.length>0 && pass.length < 6);
            }],
    ['validate-admin-password', 'Please enter 7 or more characters. Password should contain both numeric and alphabetic characters.', function(v) {
                var pass=v.strip();
                if (0 == pass.length) {
                    return true;
                }
                if (!(/[a-z]/i.test(v)) || !(/[0-9]/.test(v))) {
                    return false;
                }
                return !(pass.length < 7);
            }],
    ['validate-cpassword', 'Please make sure your passwords match.', function(v) {
                var conf = $('confirmation') ? $('confirmation') : $$('.validate-cpassword')[0];
                var pass = false;
                if ($('password')) {
                    pass = $('password');
                }
                var passwordElements = $$('.validate-password');
                for (var i = 0; i < passwordElements.size(); i++) {
                    var passwordElement = passwordElements[i];
                    if (passwordElement.up('form').id == conf.up('form').id) {
                        pass = passwordElement;
                    }
                }
                if ($$('.validate-admin-password').size()) {
                    pass = $$('.validate-admin-password')[0];
                }
                return (pass.value == conf.value);
            }],
    ['validate-url', 'Please enter a valid URL. Protocol is required (http://, https:// or ftp://)', function (v) {
                return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v)
            }],
    ['validate-clean-url', 'Please enter a valid URL. For example http://www.example.com or www.example.com', function (v) {
                return Validation.get('IsEmpty').test(v) || /^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v) || /^(www)((\.[A-Z0-9][A-Z0-9_-]*)+.(com|org|net|dk|at|us|tv|info|uk|co.uk|biz|se)$)(:(\d+))?\/?/i.test(v)
            }],
    ['validate-identifier', 'Please enter a valid URL Key. For example "example-page", "example-page.html" or "anotherlevel/example-page".', function (v) {
                return Validation.get('IsEmpty').test(v) || /^[a-z0-9][a-z0-9_\/-]+(\.[a-z0-9_-]+)?$/.test(v)
            }],
    ['validate-xml-identifier', 'Please enter a valid XML-identifier. For example something_1, block5, id-4.', function (v) {
                return Validation.get('IsEmpty').test(v) || /^[A-Z][A-Z0-9_\/-]*$/i.test(v)
            }],
    ['validate-ssn', 'Please enter a valid social security number. For example 123-45-6789.', function(v) {
            return Validation.get('IsEmpty').test(v) || /^\d{3}-?\d{2}-?\d{4}$/.test(v);
            }],
    ['validate-zip', 'Please enter a valid zip code. For example 90602 or 90602-1234.', function(v) {
            return Validation.get('IsEmpty').test(v) || /(^\d{5}$)|(^\d{5}-\d{4}$)/.test(v);
            }],
    ['validate-zip-international', 'Please enter a valid zip code.', function(v) {
            //return Validation.get('IsEmpty').test(v) || /(^[A-z0-9]{2,10}([\s]{0,1}|[\-]{0,1})[A-z0-9]{2,10}$)/.test(v);
            return true;
            }],
    ['validate-date-au', 'Please use this date format: dd/mm/yyyy. For example 17/03/2006 for the 17th of March, 2006.', function(v) {
                if(Validation.get('IsEmpty').test(v)) return true;
                var regex = /^(\d{2})\/(\d{2})\/(\d{4})$/;
                if(!regex.test(v)) return false;
                var d = new Date(v.replace(regex, '$2/$1/$3'));
                return ( parseInt(RegExp.$2, 10) == (1+d.getMonth()) ) &&
                            (parseInt(RegExp.$1, 10) == d.getDate()) &&
                            (parseInt(RegExp.$3, 10) == d.getFullYear() );
            }],
    ['validate-currency-dollar', 'Please enter a valid $ amount. For example $100.00.', function(v) {
                // [$]1[##][,###]+[.##]
                // [$]1###+[.##]
                // [$]0.##
                // [$].##
                return Validation.get('IsEmpty').test(v) ||  /^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/.test(v)
            }],
    ['validate-one-required', 'Please select one of the above options.', function (v,elm) {
                var p = elm.parentNode;
                var options = p.getElementsByTagName('INPUT');
                return $A(options).any(function(elm) {
                    return $F(elm);
                });
            }],
    ['validate-one-required-by-name', 'Please select one of the options.', function (v,elm) {
                var inputs = $$('input[name="' + elm.name.replace(/([\\"])/g, '\\$1') + '"]');

                var error = 1;
                for(var i=0;i<inputs.length;i++) {
                    if((inputs[i].type == 'checkbox' || inputs[i].type == 'radio') && inputs[i].checked == true) {
                        error = 0;
                    }

                    if(Validation.isOnChange && (inputs[i].type == 'checkbox' || inputs[i].type == 'radio')) {
                        Validation.reset(inputs[i]);
                    }
                }

                if( error == 0 ) {
                    return true;
                } else {
                    return false;
                }
            }],
    ['validate-not-negative-number', 'Please enter a valid number in this field.', function(v) {
                v = parseNumber(v);
                return (!isNaN(v) && v>=0);
            }],
    ['validate-state', 'Please select State/Province.', function(v) {
                return (v!=0 || v == '');
            }],

    ['validate-new-password', 'Please enter 6 or more characters. Leading or trailing spaces will be ignored.', function(v) {
                if (!Validation.get('validate-password').test(v)) return false;
                if (Validation.get('IsEmpty').test(v) && v != '') return false;
                return true;
            }],
    ['validate-greater-than-zero', 'Please enter a number greater than 0 in this field.', function(v) {
                if(v.length)
                    return parseFloat(v) > 0;
                else
                    return true;
            }],
    ['validate-zero-or-greater', 'Please enter a number 0 or greater in this field.', function(v) {
                if(v.length)
                    return parseFloat(v) >= 0;
                else
                    return true;
            }],
    ['validate-cc-number', 'Please enter a valid credit card number.', function(v, elm) {
                // remove non-numerics
                var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
                if (ccTypeContainer && typeof Validation.creditCartTypes.get(ccTypeContainer.value) != 'undefined'
                        && Validation.creditCartTypes.get(ccTypeContainer.value)[2] == false) {
                    if (!Validation.get('IsEmpty').test(v) && Validation.get('validate-digits').test(v)) {
                        return true;
                    } else {
                        return false;
                    }
                }
                return validateCreditCard(v);
            }],
    ['validate-cc-type', 'Credit card number does not match credit card type.', function(v, elm) {
                // remove credit card number delimiters such as "-" and space
                elm.value = removeDelimiters(elm.value);
                v         = removeDelimiters(v);

                var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_number')) + '_cc_type');
                if (!ccTypeContainer) {
                    return true;
                }
                var ccType = ccTypeContainer.value;

                if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
                    return false;
                }

                // Other card type or switch or solo card
                if (Validation.creditCartTypes.get(ccType)[0]==false) {
                    return true;
                }

                // Matched credit card type
                var ccMatchedType = '';

                Validation.creditCartTypes.each(function (pair) {
                    if (pair.value[0] && v.match(pair.value[0])) {
                        ccMatchedType = pair.key;
                        throw $break;
                    }
                });

                if(ccMatchedType != ccType) {
                    return false;
                }

                if (ccTypeContainer.hasClassName('validation-failed') && Validation.isOnChange) {
                    Validation.validate(ccTypeContainer);
                }

                return true;
            }],
     ['validate-cc-type-select', 'Card type does not match credit card number.', function(v, elm) {
                var ccNumberContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_type')) + '_cc_number');
                if (Validation.isOnChange && Validation.get('IsEmpty').test(ccNumberContainer.value)) {
                    return true;
                }
                if (Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer)) {
                    Validation.validate(ccNumberContainer);
                }
                return Validation.get('validate-cc-type').test(ccNumberContainer.value, ccNumberContainer);
            }],
     ['validate-cc-exp', 'Incorrect credit card expiration date.', function(v, elm) {
                var ccExpMonth   = v;
                var ccExpYear    = $(elm.id.substr(0,elm.id.indexOf('_expiration')) + '_expiration_yr').value;
                var currentTime  = new Date();
                var currentMonth = currentTime.getMonth() + 1;
                var currentYear  = currentTime.getFullYear();
                if (ccExpMonth < currentMonth && ccExpYear == currentYear) {
                    return false;
                }
                return true;
            }],
     ['validate-cc-cvn', 'Please enter a valid credit card verification number.', function(v, elm) {
                var ccTypeContainer = $(elm.id.substr(0,elm.id.indexOf('_cc_cid')) + '_cc_type');
                if (!ccTypeContainer) {
                    return true;
                }
                var ccType = ccTypeContainer.value;

                if (typeof Validation.creditCartTypes.get(ccType) == 'undefined') {
                    return false;
                }

                var re = Validation.creditCartTypes.get(ccType)[1];

                if (v.match(re)) {
                    return true;
                }

                return false;
            }],
     ['validate-ajax', '', function(v, elm) { return true; }],
     ['validate-data', 'Please use only letters (a-z or A-Z), numbers (0-9) or underscore(_) in this field, first character should be a letter.', function (v) {
                if(v != '' && v) {
                    return /^[A-Za-z]+[A-Za-z0-9_]+$/.test(v);
                }
                return true;
            }],
     ['validate-css-length', 'Please input a valid CSS-length. For example 100px or 77pt or 20em or .5ex or 50%.', function (v) {
                if (v != '' && v) {
                    return /^[0-9\.]+(px|pt|em|ex|%)?$/.test(v) && (!(/\..*\./.test(v))) && !(/\.$/.test(v));
                }
                return true;
            }],
     ['validate-length', 'Text length does not satisfy specified text range.', function (v, elm) {
                var reMax = new RegExp(/^maximum-length-[0-9]+$/);
                var reMin = new RegExp(/^minimum-length-[0-9]+$/);
                var result = true;
                $w(elm.className).each(function(name, index) {
                    if (name.match(reMax) && result) {
                       var length = name.split('-')[2];
                       result = (v.length <= length);
                    }
                    if (name.match(reMin) && result && !Validation.get('IsEmpty').test(v)) {
                        var length = name.split('-')[2];
                        result = (v.length >= length);
                    }
                });
                return result;
            }],
     ['validate-percents', 'Please enter a number lower than 100.', {max:100}],
     ['required-file', 'Please select a file', function(v, elm) {
         var result = !Validation.get('IsEmpty').test(v);
         if (result === false) {
             ovId = elm.id + '_value';
             if ($(ovId)) {
                 result = !Validation.get('IsEmpty').test($(ovId).value);
             }
         }
         return result;
     }],
     ['validate-cc-ukss', 'Please enter issue number or start date for switch/solo card type.', function(v,elm) {
         var endposition;

         if (elm.id.match(/(.)+_cc_issue$/)) {
             endposition = elm.id.indexOf('_cc_issue');
         } else if (elm.id.match(/(.)+_start_month$/)) {
             endposition = elm.id.indexOf('_start_month');
         } else {
             endposition = elm.id.indexOf('_start_year');
         }

         var prefix = elm.id.substr(0,endposition);

         var ccTypeContainer = $(prefix + '_cc_type');

         if (!ccTypeContainer) {
               return true;
         }
         var ccType = ccTypeContainer.value;

         if(['SS','SM','SO'].indexOf(ccType) == -1){
             return true;
         }

         $(prefix + '_cc_issue').advaiceContainer
           = $(prefix + '_start_month').advaiceContainer
           = $(prefix + '_start_year').advaiceContainer
           = $(prefix + '_cc_type_ss_div').down('ul li.adv-container');

         var ccIssue   =  $(prefix + '_cc_issue').value;
         var ccSMonth  =  $(prefix + '_start_month').value;
         var ccSYear   =  $(prefix + '_start_year').value;

         var ccStartDatePresent = (ccSMonth && ccSYear) ? true : false;

         if (!ccStartDatePresent && !ccIssue){
             return false;
         }
         return true;
     }]
]);

function removeDelimiters (v) {
    v = v.replace(/\s/g, '');
    v = v.replace(/\-/g, '');
    return v;
}

function parseNumber(v)
{
    if (typeof v != 'string') {
        return parseFloat(v);
    }

    var isDot  = v.indexOf('.');
    var isComa = v.indexOf(',');

    if (isDot != -1 && isComa != -1) {
        if (isComa > isDot) {
            v = v.replace('.', '').replace(',', '.');
        }
        else {
            v = v.replace(',', '');
        }
    }
    else if (isComa != -1) {
        v = v.replace(',', '.');
    }

    return parseFloat(v);
}

/**
 * Hash with credit card types wich can be simply extended in payment modules
 * 0 - regexp for card number
 * 1 - regexp for cvn
 * 2 - check or not credit card number trough Luhn algorithm by
 *     function validateCreditCard wich you can find above in this file
 */
Validation.creditCartTypes = $H({
//    'SS': [new RegExp('^((6759[0-9]{12})|(5018|5020|5038|6304|6759|6761|6763[0-9]{12,19})|(49[013][1356][0-9]{12})|(6333[0-9]{12})|(6334[0-4]\d{11})|(633110[0-9]{10})|(564182[0-9]{10}))([0-9]{2,3})?$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
    'SO': [new RegExp('^(6334[5-9]([0-9]{11}|[0-9]{13,14}))|(6767([0-9]{12}|[0-9]{14,15}))$'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
    'SM': [new RegExp('(^(5[0678])[0-9]{11,18}$)|(^(6[^05])[0-9]{11,18}$)|(^(601)[^1][0-9]{9,16}$)|(^(6011)[0-9]{9,11}$)|(^(6011)[0-9]{13,16}$)|(^(65)[0-9]{11,13}$)|(^(65)[0-9]{15,18}$)|(^(49030)[2-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49033)[5-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49110)[1-2]([0-9]{10}$|[0-9]{12,13}$))|(^(49117)[4-9]([0-9]{10}$|[0-9]{12,13}$))|(^(49118)[0-2]([0-9]{10}$|[0-9]{12,13}$))|(^(4936)([0-9]{12}$|[0-9]{14,15}$))'), new RegExp('^([0-9]{3}|[0-9]{4})?$'), true],
    'VI': [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true],
    'MC': [new RegExp('^5[1-5][0-9]{14}$'), new RegExp('^[0-9]{3}$'), true],
    'AE': [new RegExp('^3[47][0-9]{13}$'), new RegExp('^[0-9]{4}$'), true],
    'DI': [new RegExp('^6011[0-9]{12}$'), new RegExp('^[0-9]{3}$'), true],
    'JCB': [new RegExp('^(3[0-9]{15}|(2131|1800)[0-9]{11})$'), new RegExp('^[0-9]{4}$'), true],
    'OT': [false, new RegExp('^([0-9]{3}|[0-9]{4})?$'), false]
});

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Varien
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
function popWin(url,win,para) {
    var win = window.open(url,win,para);
    win.focus();
}

function setLocation(url){
    window.location.href = url;
}

function setPLocation(url, setFocus){
    if( setFocus ) {
        window.opener.focus();
    }
    window.opener.location.href = url;
}

function setLanguageCode(code, fromCode){
    //TODO: javascript cookies have different domain and path than php cookies
    var href = window.location.href;
    var after = '', dash;
    if (dash = href.match(/\#(.*)$/)) {
        href = href.replace(/\#(.*)$/, '');
        after = dash[0];
    }

    if (href.match(/[?]/)) {
        var re = /([?&]store=)[a-z0-9_]*/;
        if (href.match(re)) {
            href = href.replace(re, '$1'+code);
        } else {
            href += '&store='+code;
        }

        var re = /([?&]from_store=)[a-z0-9_]*/;
        if (href.match(re)) {
            href = href.replace(re, '');
        }
    } else {
        href += '?store='+code;
    }
    if (typeof(fromCode) != 'undefined') {
        href += '&from_store='+fromCode;
    }
    href += after;

    setLocation(href);
}

/**
 * Add classes to specified elements.
 * Supported classes are: 'odd', 'even', 'first', 'last'
 *
 * @param elements - array of elements to be decorated
 * [@param decorateParams] - array of classes to be set. If omitted, all available will be used
 */
function decorateGeneric(elements, decorateParams)
{
    var allSupportedParams = ['odd', 'even', 'first', 'last'];
    var _decorateParams = {};
    var total = elements.length;

    if (total) {
        // determine params called
        if (typeof(decorateParams) == 'undefined') {
            decorateParams = allSupportedParams;
        }
        if (!decorateParams.length) {
            return;
        }
        for (var k in allSupportedParams) {
            _decorateParams[allSupportedParams[k]] = false;
        }
        for (var k in decorateParams) {
            _decorateParams[decorateParams[k]] = true;
        }

        // decorate elements
        // elements[0].addClassName('first'); // will cause bug in IE (#5587)
        if (_decorateParams.first) {
            Element.addClassName(elements[0], 'first');
        }
        if (_decorateParams.last) {
            Element.addClassName(elements[total-1], 'last');
        }
        for (var i = 0; i < total; i++) {
            if ((i + 1) % 2 == 0) {
                if (_decorateParams.even) {
                    Element.addClassName(elements[i], 'even');
                }
            }
            else {
                if (_decorateParams.odd) {
                    Element.addClassName(elements[i], 'odd');
                }
            }
        }
    }
}

/**
 * Decorate table rows and cells, tbody etc
 * @see decorateGeneric()
 */
function decorateTable(table, options) {
    var table = $(table);
    if (table) {
        // set default options
        var _options = {
            'tbody'    : false,
            'tbody tr' : ['odd', 'even', 'first', 'last'],
            'thead tr' : ['first', 'last'],
            'tfoot tr' : ['first', 'last'],
            'tr td'    : ['last']
        };
        // overload options
        if (typeof(options) != 'undefined') {
            for (var k in options) {
                _options[k] = options[k];
            }
        }
        // decorate
        if (_options['tbody']) {
            decorateGeneric(table.select('tbody'), _options['tbody']);
        }
        if (_options['tbody tr']) {
            decorateGeneric(table.select('tbody tr'), _options['tbody tr']);
        }
        if (_options['thead tr']) {
            decorateGeneric(table.select('thead tr'), _options['thead tr']);
        }
        if (_options['tfoot tr']) {
            decorateGeneric(table.select('tfoot tr'), _options['tfoot tr']);
        }
        if (_options['tr td']) {
            var allRows = table.select('tr');
            if (allRows.length) {
                for (var i = 0; i < allRows.length; i++) {
                    decorateGeneric(allRows[i].getElementsByTagName('TD'), _options['tr td']);
                }
            }
        }
    }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateList(list, nonRecursive) {
    if ($(list)) {
        if (typeof(nonRecursive) == 'undefined') {
            var items = $(list).select('li')
        }
        else {
            var items = $(list).childElements();
        }
        decorateGeneric(items, ['odd', 'even', 'last']);
    }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateDataList(list) {
    list = $(list);
    if (list) {
        decorateGeneric(list.select('dt'), ['odd', 'even', 'last']);
        decorateGeneric(list.select('dd'), ['odd', 'even', 'last']);
    }
}

/**
 * Parse SID and produces the correct URL
 */
function parseSidUrl(baseUrl, urlExt) {
    sidPos = baseUrl.indexOf('/?SID=');
    sid = '';
    urlExt = (urlExt != undefined) ? urlExt : '';

    if(sidPos > -1) {
        sid = '?' + baseUrl.substring(sidPos + 2);
        baseUrl = baseUrl.substring(0, sidPos + 1);
    }

    return baseUrl+urlExt+sid;
}

/**
 * Formats currency using patern
 * format - JSON (pattern, decimal, decimalsDelimeter, groupsDelimeter)
 * showPlus - true (always show '+'or '-'),
 *      false (never show '-' even if number is negative)
 *      null (show '-' if number is negative)
 */

function formatCurrency(price, format, showPlus){
    precision = isNaN(format.precision = Math.abs(format.precision)) ? 2 : format.precision;
    requiredPrecision = isNaN(format.requiredPrecision = Math.abs(format.requiredPrecision)) ? 2 : format.requiredPrecision;

    //precision = (precision > requiredPrecision) ? precision : requiredPrecision;
    //for now we don't need this difference so precision is requiredPrecision
    precision = requiredPrecision;

    integerRequired = isNaN(format.integerRequired = Math.abs(format.integerRequired)) ? 1 : format.integerRequired;

    decimalSymbol = format.decimalSymbol == undefined ? "," : format.decimalSymbol;
    groupSymbol = format.groupSymbol == undefined ? "." : format.groupSymbol;
    groupLength = format.groupLength == undefined ? 3 : format.groupLength;

    if (showPlus == undefined || showPlus == true) {
        s = price < 0 ? "-" : ( showPlus ? "+" : "");
    } else if (showPlus == false) {
        s = '';
    }

    i = parseInt(price = Math.abs(+price || 0).toFixed(precision)) + "";
    pad = (i.length < integerRequired) ? (integerRequired - i.length) : 0;
    while (pad) { i = '0' + i; pad--; }

    j = (j = i.length) > groupLength ? j % groupLength : 0;
    re = new RegExp("(\\d{" + groupLength + "})(?=\\d)", "g");

    /**
     * replace(/-/, 0) is only for fixing Safari bug which appears
     * when Math.abs(0).toFixed() executed on "0" number.
     * Result is "0.-0" :(
     */
    r = (j ? i.substr(0, j) + groupSymbol : "") + i.substr(j).replace(re, "$1" + groupSymbol) + (precision ? decimalSymbol + Math.abs(price - i).toFixed(precision).replace(/-/, 0).slice(2) : "")

    if (format.pattern.indexOf('{sign}') == -1) {
        pattern = s + format.pattern;
    } else {
        pattern = format.pattern.replace('{sign}', s);
    }

    return pattern.replace('%s', r).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};

function expandDetails(el, childClass) {
    if (Element.hasClassName(el,'show-details')) {
        $$(childClass).each(function(item){item.hide()});
        Element.removeClassName(el,'show-details');
    }
    else {
        $$(childClass).each(function(item){item.show()});
        Element.addClassName(el,'show-details');
    }
}

// Version 1.0
var isIE = navigator.appVersion.match(/MSIE/) == "MSIE";

if (!window.Varien)
    var Varien = new Object();

Varien.showLoading = function(){
    Element.show('loading-process');
}
Varien.hideLoading = function(){
    Element.hide('loading-process');
}
Varien.GlobalHandlers = {
    onCreate: function() {
        Varien.showLoading();
    },

    onComplete: function() {
        if(Ajax.activeRequestCount == 0) {
            Varien.hideLoading();
        }
    }
};

Ajax.Responders.register(Varien.GlobalHandlers);

/**
 * Quick Search form client model
 */
Varien.searchForm = Class.create();
Varien.searchForm.prototype = {
    initialize : function(form, field, emptyText){
        this.form   = $(form);
        this.field  = $(field);
        this.emptyText = emptyText;

        Event.observe(this.form,  'submit', this.submit.bind(this));
        Event.observe(this.field, 'focus', this.focus.bind(this));
        Event.observe(this.field, 'blur', this.blur.bind(this));
        this.blur();
    },

    submit : function(event){
        if (this.field.value == this.emptyText || this.field.value == ''){
            Event.stop(event);
            return false;
        }
        return true;
    },

    focus : function(event){
        if(this.field.value==this.emptyText){
            this.field.value='';
        }

    },

    blur : function(event){
        if(this.field.value==''){
            this.field.value=this.emptyText;
        }
    },

    initAutocomplete : function(url, destinationElement){
        new Ajax.Autocompleter(
            this.field,
            destinationElement,
            url,
            {
                paramName: this.field.name,
                method: 'get',
                minChars: 2,
                updateElement: this._selectAutocompleteItem.bind(this),
                onShow : function(element, update) {
                    if(!update.style.position || update.style.position=='absolute') {
                        update.style.position = 'absolute';
                        Position.clone(element, update, {
                            setHeight: false,
                            offsetTop: element.offsetHeight
                        });
                    }
                    Effect.Appear(update,{duration:0});
                }

            }
        );
    },

    _selectAutocompleteItem : function(element){
        if(element.title){
            this.field.value = element.title;
        }
        this.form.submit();
    }
}

Varien.Tabs = Class.create();
Varien.Tabs.prototype = {
  initialize: function(selector) {
    var self=this;
    $$(selector+' a').each(this.initTab.bind(this));
  },

  initTab: function(el) {
      el.href = 'javascript:void(0)';
      if ($(el.parentNode).hasClassName('active')) {
        this.showContent(el);
      }
      el.observe('click', this.showContent.bind(this, el));
  },

  showContent: function(a) {
    var li = $(a.parentNode), ul = $(li.parentNode);
    ul.getElementsBySelector('li', 'ol').each(function(el){
      var contents = $(el.id+'_contents');
      if (el==li) {
        el.addClassName('active');
        contents.show();
      } else {
        el.removeClassName('active');
        contents.hide();
      }
    });
  }
}

Varien.DateElement = Class.create();
Varien.DateElement.prototype = {
    initialize: function(type, content, required, format) {
        if (type == 'id') {
            // id prefix
            this.day    = $(content + 'day');
            this.month  = $(content + 'month');
            this.year   = $(content + 'year');
            this.full   = $(content + 'full');
            this.advice = $(content + 'date-advice');
        } else if (type == 'container') {
            // content must be container with data
            this.day    = content.day;
            this.month  = content.month;
            this.year   = content.year;
            this.full   = content.full;
            this.advice = content.advice;
        } else {
            return;
        }

        this.required = required;
        this.format   = format;

        this.day.addClassName('validate-custom');
        this.day.validate = this.validate.bind(this);
        this.month.addClassName('validate-custom');
        this.month.validate = this.validate.bind(this);
        this.year.addClassName('validate-custom');
        this.year.validate = this.validate.bind(this);

        this.setDateRange(false, false);
        this.year.setAttribute('autocomplete','off');

        this.advice.hide();
    },
    validate: function() {
        var error = false, day = parseInt(this.day.value) || 0, month = parseInt(this.month.value) || 0, year = parseInt(this.year.value) || 0;
        if (!day && !month && !year) {
            if (this.required) {
                error = 'This date is a required value.';
            } else {
                this.full.value = '';
            }
        } else if (!day || !month || !year) {
            error = 'Please enter a valid full date.';
        } else {
            var date = new Date, countDaysInMonth = 0, errorType = null;
            date.setYear(year);date.setMonth(month-1);date.setDate(32);
            countDaysInMonth = 32 - date.getDate();
            if(!countDaysInMonth || countDaysInMonth>31) countDaysInMonth = 31;

            if (day<1 || day>countDaysInMonth) {
                errorType = 'day';
                error = 'Please enter a valid day (1-%d).';
            } else if (month<1 || month>12) {
                errorType = 'month';
                error = 'Please enter a valid month (1-12).';
            } else {
                if(day % 10 == day) this.day.value = '0'+day;
                if(month % 10 == month) this.month.value = '0'+month;
                this.full.value = this.format.replace(/%[mb]/i, this.month.value).replace(/%[de]/i, this.day.value).replace(/%y/i, this.year.value);
                var testFull = this.month.value + '/' + this.day.value + '/'+ this.year.value;
                var test = new Date(testFull);
                if (isNaN(test)) {
                    error = 'Please enter a valid date.';
                } else {
                    this.setFullDate(test);
                }
            }
            var valueError = false;
            if (!error && !this.validateData()){//(year<1900 || year>curyear) {
                errorType = this.validateDataErrorType;//'year';
                valueError = this.validateDataErrorText;//'Please enter a valid year (1900-%d).';
                error = valueError;
            }
        }

        if (error !== false) {
            try {
                error = Translator.translate(error);
            }
            catch (e) {}
            if (!valueError) {
                this.advice.innerHTML = error.replace('%d', countDaysInMonth);
            } else {
                this.advice.innerHTML = this.errorTextModifier(error);
            }
            this.advice.show();
            return false;
        }

        // fixing elements class
        this.day.removeClassName('validation-failed');
        this.month.removeClassName('validation-failed');
        this.year.removeClassName('validation-failed');

        this.advice.hide();
        return true;
    },
    validateData: function() {
        var year = this.fullDate.getFullYear();
        var date = new Date;
        this.curyear = date.getFullYear();
        return (year>=1900 && year<=this.curyear);
    },
    validateDataErrorType: 'year',
    validateDataErrorText: 'Please enter a valid year (1900-%d).',
    errorTextModifier: function(text) {
        return text.replace('%d', this.curyear);
    },
    setDateRange: function(minDate, maxDate) {
        this.minDate = minDate;
        this.maxDate = maxDate;
    },
    setFullDate: function(date) {
        this.fullDate = date;
    }
};

Varien.DOB = Class.create();
Varien.DOB.prototype = {
    initialize: function(selector, required, format) {
        var el = $$(selector)[0];
        var container       = {};
        container.day       = Element.select(el, '.dob-day input')[0];
        container.month     = Element.select(el, '.dob-month input')[0];
        container.year      = Element.select(el, '.dob-year input')[0];
        container.full      = Element.select(el, '.dob-full input')[0];
        container.advice    = Element.select(el, '.validation-advice')[0];

        new Varien.DateElement('container', container, required, format);
    }
};

Varien.dateRangeDate = Class.create();
Varien.dateRangeDate.prototype = Object.extend(new Varien.DateElement(), {
    validateData: function() {
        var validate = true;
        if (this.minDate || this.maxValue) {
            if (this.minDate) {
                this.minDate = new Date(this.minDate);
                this.minDate.setHours(0);
                if (isNaN(this.minDate)) {
                    this.minDate = new Date('1/1/1900');
                }
                validate = validate && (this.fullDate >= this.minDate)
            }
            if (this.maxDate) {
                this.maxDate = new Date(this.maxDate)
                this.minDate.setHours(0);
                if (isNaN(this.maxDate)) {
                    this.maxDate = new Date();
                }
                validate = validate && (this.fullDate <= this.maxDate)
            }
            if (this.maxDate && this.minDate) {
                this.validateDataErrorText = 'Please enter a valid date between %s and %s';
            } else if (this.maxDate) {
                this.validateDataErrorText = 'Please enter a valid date less than or equal to %s';
            } else if (this.minDate) {
                this.validateDataErrorText = 'Please enter a valid date equal to or greater than %s';
            } else {
                this.validateDataErrorText = '';
            }
        }
        return validate;
    },
    validateDataErrorText: 'Date should be between %s and %s',
    errorTextModifier: function(text) {
        if (this.minDate) {
            text = text.sub('%s', this.dateFormat(this.minDate));
        }
        if (this.maxDate) {
            text = text.sub('%s', this.dateFormat(this.maxDate));
        }
        return text;
    },
    dateFormat: function(date) {
        return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear();
    }
});

Varien.FileElement = Class.create();
Varien.FileElement.prototype = {
    initialize: function (id) {
        this.fileElement = $(id);
        this.hiddenElement = $(id + '_value');

        this.fileElement.observe('change', this.selectFile.bind(this));
    },
    selectFile: function(event) {
        this.hiddenElement.value = this.fileElement.getValue();
    }
};

Validation.addAllThese([
    ['validate-custom', ' ', function(v,elm) {
        return elm.validate();
    }]
]);

function truncateOptions() {
    $$('.truncated').each(function(element){
        Event.observe(element, 'mouseover', function(){
            if (element.down('div.truncated_full_value')) {
                element.down('div.truncated_full_value').addClassName('show')
            }
        });
        Event.observe(element, 'mouseout', function(){
            if (element.down('div.truncated_full_value')) {
                element.down('div.truncated_full_value').removeClassName('show')
            }
        });

    });
}
Event.observe(window, 'load', function(){
   truncateOptions();
});

Element.addMethods({
    getInnerText: function(element)
    {
        element = $(element);
        if(element.innerText && !Prototype.Browser.Opera) {
            return element.innerText
        }
        return element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g, ' ').strip();
    }
});

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

/**
 * Executes event handler on the element. Works with event handlers attached by Prototype,
 * in a browser-agnostic fashion.
 * @param element The element object
 * @param event Event name, like 'change'
 *
 * @example fireEvent($('my-input', 'click'));
 */
function fireEvent(element, event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

// script.aculo.us builder.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

var Builder = {
  NODEMAP: {
    AREA: 'map',
    CAPTION: 'table',
    COL: 'table',
    COLGROUP: 'table',
    LEGEND: 'fieldset',
    OPTGROUP: 'select',
    OPTION: 'select',
    PARAM: 'object',
    TBODY: 'table',
    TD: 'table',
    TFOOT: 'table',
    TH: 'table',
    THEAD: 'table',
    TR: 'table'
  },
  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
  //       due to a Firefox bug
  node: function(elementName) {
    elementName = elementName.toUpperCase();

    // try innerHTML approach
    var parentTag = this.NODEMAP[elementName] || 'div';
    var parentElement = document.createElement(parentTag);
    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
    } catch(e) {}
    var element = parentElement.firstChild || null;

    // see if browser added wrapping tags
    if(element && (element.tagName.toUpperCase() != elementName))
      element = element.getElementsByTagName(elementName)[0];

    // fallback to createElement approach
    if(!element) element = document.createElement(elementName);

    // abort if nothing could be created
    if(!element) return;

    // attributes (or text)
    if(arguments[1])
      if(this._isStringOrNumber(arguments[1]) ||
        (arguments[1] instanceof Array) ||
        arguments[1].tagName) {
          this._children(element, arguments[1]);
        } else {
          var attrs = this._attributes(arguments[1]);
          if(attrs.length) {
            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
              parentElement.innerHTML = "<" +elementName + " " +
                attrs + "></" + elementName + ">";
            } catch(e) {}
            element = parentElement.firstChild || null;
            // workaround firefox 1.0.X bug
            if(!element) {
              element = document.createElement(elementName);
              for(attr in arguments[1])
                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
            }
            if(element.tagName.toUpperCase() != elementName)
              element = parentElement.getElementsByTagName(elementName)[0];
          }
        }

    // text, or array of children
    if(arguments[2])
      this._children(element, arguments[2]);

     return $(element);
  },
  _text: function(text) {
     return document.createTextNode(text);
  },

  ATTR_MAP: {
    'className': 'class',
    'htmlFor': 'for'
  },

  _attributes: function(attributes) {
    var attrs = [];
    for(attribute in attributes)
      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
          '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
    return attrs.join(" ");
  },
  _children: function(element, children) {
    if(children.tagName) {
      element.appendChild(children);
      return;
    }
    if(typeof children=='object') { // array can hold nodes and text
      children.flatten().each( function(e) {
        if(typeof e=='object')
          element.appendChild(e);
        else
          if(Builder._isStringOrNumber(e))
            element.appendChild(Builder._text(e));
      });
    } else
      if(Builder._isStringOrNumber(children))
        element.appendChild(Builder._text(children));
  },
  _isStringOrNumber: function(param) {
    return(typeof param=='string' || typeof param=='number');
  },
  build: function(html) {
    var element = this.node('div');
    $(element).update(html.strip());
    return element.down();
  },
  dump: function(scope) {
    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope

    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);

    tags.each( function(tag){
      scope[tag] = function() {
        return Builder.node.apply(Builder, [tag].concat($A(arguments)));
      };
    });
  }
};
// script.aculo.us effects.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// converts rgb() and #xxx to #xxxxxx format,
// returns self (or first argument) if not convertable
String.prototype.parseColor = function() {
  var color = '#';
  if (this.slice(0,4) == 'rgb(') {
    var cols = this.slice(4,this.length-1).split(',');
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
  } else {
    if (this.slice(0,1) == '#') {
      if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
      if (this.length==7) color = this.toLowerCase();
    }
  }
  return (color.length==7 ? color : (arguments[0] || this));
};

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) {
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue :
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
};

Element.collectTextNodesIgnoreClass = function(element, className) {
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue :
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
        Element.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
};

Element.setContentZoom = function(element, percent) {
  element = $(element);
  element.setStyle({fontSize: (percent/100) + 'em'});
  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
  return element;
};

Element.getInlineOpacity = function(element){
  return $(element).style.opacity || '';
};

Element.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

/*--------------------------------------------------------------------------*/

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  Transitions: {
    linear: Prototype.K,
    sinoidal: function(pos) {
      return (-Math.cos(pos*Math.PI)/2) + .5;
    },
    reverse: function(pos) {
      return 1-pos;
    },
    flicker: function(pos) {
      var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4;
      return pos > 1 ? 1 : pos;
    },
    wobble: function(pos) {
      return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5;
    },
    pulse: function(pos, pulses) {
      return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5;
    },
    spring: function(pos) {
      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
    },
    none: function(pos) {
      return 0;
    },
    full: function(pos) {
      return 1;
    }
  },
  DefaultOptions: {
    duration:   1.0,   // seconds
    fps:        100,   // 100= assume 66fps max.
    sync:       false, // true for combining
    from:       0.0,
    to:         1.0,
    delay:      0.0,
    queue:      'parallel'
  },
  tagifyText: function(element) {
    var tagifyStyle = 'position:relative';
    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';

    element = $(element);
    $A(element.childNodes).each( function(child) {
      if (child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            new Element('span', {style: tagifyStyle}).update(
              character == ' ' ? String.fromCharCode(160) : character),
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if (((typeof element == 'object') ||
        Object.isFunction(element)) &&
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;

    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || { });
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || { });
    Effect[element.visible() ?
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create(Enumerable, {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();

    var position = Object.isString(effect.options.queue) ?
      effect.options.queue : effect.options.queue.position;

    switch(position) {
      case 'front':
        // move unstarted effects after this effect
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'with-last':
        timestamp = this.effects.pluck('startOn').max() || timestamp;
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }

    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);

    if (!this.interval)
      this.interval = setInterval(this.loop.bind(this), 15);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if (this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    for(var i=0, len=this.effects.length;i<len;i++)
      this.effects[i] && this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if (!Object.isString(queueName)) return queueName;

    return this.instances.get(queueName) ||
      this.instances.set(queueName, new Effect.ScopedQueue());
  }
};
Effect.Queue = Effect.Queues.get('global');

Effect.Base = Class.create({
  position: null,
  start: function(options) {
    function codeForEvent(options,eventName){
      return (
        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
        (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
      );
    }
    if (options && options.transition === false) options.transition = Effect.Transitions.linear;
    this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn+(this.options.duration*1000);
    this.fromToDelta  = this.options.to-this.options.from;
    this.totalTime    = this.finishOn-this.startOn;
    this.totalFrames  = this.options.fps*this.options.duration;

    this.render = (function() {
      function dispatch(effect, eventName) {
        if (effect.options[eventName + 'Internal'])
          effect.options[eventName + 'Internal'](effect);
        if (effect.options[eventName])
          effect.options[eventName](effect);
      }

      return function(pos) {
        if (this.state === "idle") {
          this.state = "running";
          dispatch(this, 'beforeSetup');
          if (this.setup) this.setup();
          dispatch(this, 'afterSetup');
        }
        if (this.state === "running") {
          pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from;
          this.position = pos;
          dispatch(this, 'beforeUpdate');
          if (this.update) this.update(pos);
          dispatch(this, 'afterUpdate');
        }
      };
    })();

    this.event('beforeStart');
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if (timePos >= this.startOn) {
      if (timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if (this.finish) this.finish();
        this.event('afterFinish');
        return;
      }
      var pos   = (timePos - this.startOn) / this.totalTime,
          frame = (pos * this.totalFrames).round();
      if (frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  cancel: function() {
    if (!this.options.sync)
      Effect.Queues.get(Object.isString(this.options.queue) ?
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if (this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    var data = $H();
    for(property in this)
      if (!Object.isFunction(this[property])) data.set(property, this[property]);
    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
});

Effect.Parallel = Class.create(Effect.Base, {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if (effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Tween = Class.create(Effect.Base, {
  initialize: function(object, from, to) {
    object = Object.isString(object) ? $(object) : object;
    var args = $A(arguments), method = args.last(),
      options = args.length == 5 ? args[3] : null;
    this.method = Object.isFunction(method) ? method.bind(object) :
      Object.isFunction(object[method]) ? object[method].bind(object) :
      function(value) { object[method] = value };
    this.start(Object.extend({ from: from, to: to }, options || { }));
  },
  update: function(position) {
    this.method(position);
  }
});

Effect.Event = Class.create(Effect.Base, {
  initialize: function() {
    this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || { });
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if (this.options.mode == 'absolute') {
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: (this.options.x  * position + this.originalLeft).round() + 'px',
      top:  (this.options.y  * position + this.originalTop).round()  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element,
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
};

Effect.Scale = Class.create(Effect.Base, {
  initialize: function(element, percent) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or { } with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || { });
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = this.element.getStyle('position');

    this.originalStyle = { };
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));

    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;

    var fontSize = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].each( function(fontSizeType) {
      if (fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));

    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;

    this.dims = null;
    if (this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if (/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if (!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if (this.options.scaleContent && this.fontSize)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = { };
    if (this.options.scaleX) d.width = width.round() + 'px';
    if (this.options.scaleY) d.height = height.round() + 'px';
    if (this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if (this.elementPositioning == 'absolute') {
        if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if (this.options.scaleY) d.top = -topd + 'px';
        if (this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if (this.element.getStyle('display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = { };
    if (!this.options.keepBackgroundImage) {
      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
      this.element.setStyle({backgroundImage: 'none'});
    }
    if (!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if (!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    // init color calculations
    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = function(element) {
  var options = arguments[1] || { },
  scrollOffsets = document.viewport.getScrollOffsets(),
  elementOffsets = $(element).cumulativeOffset();

  if (options.offset) elementOffsets[1] += options.offset;

  return new Effect.Tween(null,
    scrollOffsets.top,
    elementOffsets[1],
    options,
    function(p){ scrollTo(scrollOffsets.left, p.round()); }
  );
};

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  var options = Object.extend({
    from: element.getOpacity() || 1.0,
    to:   0.0,
    afterFinishInternal: function(effect) {
      if (effect.options.to!=0) return;
      effect.element.hide().setStyle({opacity: oldOpacity});
    }
  }, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Appear = function(element) {
  element = $(element);
  var options = Object.extend({
  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  to:   1.0,
  // force Safari to render floated elements properly
  afterFinishInternal: function(effect) {
    effect.element.forceRerendering();
  },
  beforeSetup: function(effect) {
    effect.element.setOpacity(effect.options.from).show();
  }}, arguments[1] || { });
  return new Effect.Opacity(element,options);
};

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = {
    opacity: element.getInlineOpacity(),
    position: element.getStyle('position'),
    top:  element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height
  };
  return new Effect.Parallel(
   [ new Effect.Scale(element, 200,
      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
     Object.extend({ duration: 1.0,
      beforeSetupInternal: function(effect) {
        Position.absolutize(effect.effects[0].element);
      },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide().setStyle(oldStyle); }
     }, arguments[1] || { })
   );
};

Effect.BlindUp = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false,
      scaleX: false,
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      }
    }, arguments[1] || { })
  );
};

Effect.BlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || { }));
};

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, Object.extend({
    duration: 0.4,
    from: 0,
    transition: Effect.Transitions.flicker,
    afterFinishInternal: function(effect) {
      new Effect.Scale(effect.element, 1, {
        duration: 0.3, scaleFromCenter: true,
        scaleX: false, scaleContent: false, restoreAfterFinish: true,
        beforeSetup: function(effect) {
          effect.element.makePositioned().makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
        }
      });
    }
  }, arguments[1] || { }));
};

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left'),
    opacity: element.getInlineOpacity() };
  return new Effect.Parallel(
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
    Object.extend(
      { duration: 0.5,
        beforeSetup: function(effect) {
          effect.effects[0].element.makePositioned();
        },
        afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
        }
      }, arguments[1] || { }));
};

Effect.Shake = function(element) {
  element = $(element);
  var options = Object.extend({
    distance: 20,
    duration: 0.5
  }, arguments[1] || {});
  var distance = parseFloat(options.distance);
  var split = parseFloat(options.duration) / 10.0;
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element,
      { x:  distance, y: 0, duration: split, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  distance*2, y: 0, duration: split*2,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
        effect.element.undoPositioned().setStyle(oldStyle);
  }}); }}); }}); }}); }}); }});
};

Effect.SlideDown = function(element) {
  element = $(element).cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({
    scaleContent: false,
    scaleX: false,
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().setStyle({height: '0px'}).show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || { })
  );
};

Effect.SlideUp = function(element) {
  element = $(element).cleanWhitespace();
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false,
    scaleX: false,
    scaleMode: 'box',
    scaleFrom: 100,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if (window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().show();
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
    }
   }, arguments[1] || { })
  );
};

// Bug in opera makes the TD containing this element expand for a instance after finish
Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, {
    restoreAfterFinish: true,
    beforeSetup: function(effect) {
      effect.element.makeClipping();
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping();
    }
  });
};

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.full
  }, arguments[1] || { });
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var initialMoveX, initialMoveY;
  var moveX, moveY;

  switch (options.direction) {
    case 'top-left':
      initialMoveX = initialMoveY = moveX = moveY = 0;
      break;
    case 'top-right':
      initialMoveX = dims.width;
      initialMoveY = moveY = 0;
      moveX = -dims.width;
      break;
    case 'bottom-left':
      initialMoveX = moveX = 0;
      initialMoveY = dims.height;
      moveY = -dims.height;
      break;
    case 'bottom-right':
      initialMoveX = dims.width;
      initialMoveY = dims.height;
      moveX = -dims.width;
      moveY = -dims.height;
      break;
    case 'center':
      initialMoveX = dims.width / 2;
      initialMoveY = dims.height / 2;
      moveX = -dims.width / 2;
      moveY = -dims.height / 2;
      break;
  }

  return new Effect.Move(element, {
    x: initialMoveX,
    y: initialMoveY,
    duration: 0.01,
    beforeSetup: function(effect) {
      effect.element.hide().makeClipping().makePositioned();
    },
    afterFinishInternal: function(effect) {
      new Effect.Parallel(
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
          new Effect.Scale(effect.element, 100, {
            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
        ], Object.extend({
             beforeSetup: function(effect) {
               effect.effects[0].element.setStyle({height: '0px'}).show();
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
             }
           }, options)
      );
    }
  });
};

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.none
  }, arguments[1] || { });
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var moveX, moveY;

  switch (options.direction) {
    case 'top-left':
      moveX = moveY = 0;
      break;
    case 'top-right':
      moveX = dims.width;
      moveY = 0;
      break;
    case 'bottom-left':
      moveX = 0;
      moveY = dims.height;
      break;
    case 'bottom-right':
      moveX = dims.width;
      moveY = dims.height;
      break;
    case 'center':
      moveX = dims.width / 2;
      moveY = dims.height / 2;
      break;
  }

  return new Effect.Parallel(
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
    ], Object.extend({
         beforeStartInternal: function(effect) {
           effect.effects[0].element.makePositioned().makeClipping();
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
       }, options)
  );
};

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || { },
    oldOpacity = element.getInlineOpacity(),
    transition = options.transition || Effect.Transitions.linear,
    reverser   = function(pos){
      return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5);
    };

  return new Effect.Opacity(element,
    Object.extend(Object.extend({  duration: 2.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
    }, options), {transition: reverser}));
};

Effect.Fold = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  element.makeClipping();
  return new Effect.Scale(element, 5, Object.extend({
    scaleContent: false,
    scaleX: false,
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 1, {
      scaleContent: false,
      scaleY: false,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping().setStyle(oldStyle);
      } });
  }}, arguments[1] || { }));
};

Effect.Morph = Class.create(Effect.Base, {
  initialize: function(element) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      style: { }
    }, arguments[1] || { });

    if (!Object.isString(options.style)) this.style = $H(options.style);
    else {
      if (options.style.include(':'))
        this.style = options.style.parseStyle();
      else {
        this.element.addClassName(options.style);
        this.style = $H(this.element.getStyles());
        this.element.removeClassName(options.style);
        var css = this.element.getStyles();
        this.style = this.style.reject(function(style) {
          return style.value == css[style.key];
        });
        options.afterFinishInternal = function(effect) {
          effect.element.addClassName(effect.options.style);
          effect.transforms.each(function(transform) {
            effect.element.style[transform.style] = '';
          });
        };
      }
    }
    this.start(options);
  },

  setup: function(){
    function parseColor(color){
      if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
      color = color.parseColor();
      return $R(0,2).map(function(i){
        return parseInt( color.slice(i*2+1,i*2+3), 16 );
      });
    }
    this.transforms = this.style.map(function(pair){
      var property = pair[0], value = pair[1], unit = null;

      if (value.parseColor('#zzzzzz') != '#zzzzzz') {
        value = value.parseColor();
        unit  = 'color';
      } else if (property == 'opacity') {
        value = parseFloat(value);
        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
          this.element.setStyle({zoom: 1});
      } else if (Element.CSS_LENGTH.test(value)) {
          var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
          value = parseFloat(components[1]);
          unit = (components.length == 3) ? components[2] : null;
      }

      var originalValue = this.element.getStyle(property);
      return {
        style: property.camelize(),
        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
        targetValue: unit=='color' ? parseColor(value) : value,
        unit: unit
      };
    }.bind(this)).reject(function(transform){
      return (
        (transform.originalValue == transform.targetValue) ||
        (
          transform.unit != 'color' &&
          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
        )
      );
    });
  },
  update: function(position) {
    var style = { }, transform, i = this.transforms.length;
    while(i--)
      style[(transform = this.transforms[i]).style] =
        transform.unit=='color' ? '#'+
          (Math.round(transform.originalValue[0]+
            (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
          (Math.round(transform.originalValue[1]+
            (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
          (Math.round(transform.originalValue[2]+
            (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
        (transform.originalValue +
          (transform.targetValue - transform.originalValue) * position).toFixed(3) +
            (transform.unit === null ? '' : transform.unit);
    this.element.setStyle(style, true);
  }
});

Effect.Transform = Class.create({
  initialize: function(tracks){
    this.tracks  = [];
    this.options = arguments[1] || { };
    this.addTracks(tracks);
  },
  addTracks: function(tracks){
    tracks.each(function(track){
      track = $H(track);
      var data = track.values().first();
      this.tracks.push($H({
        ids:     track.keys().first(),
        effect:  Effect.Morph,
        options: { style: data }
      }));
    }.bind(this));
    return this;
  },
  play: function(){
    return new Effect.Parallel(
      this.tracks.map(function(track){
        var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
        var elements = [$(ids) || $$(ids)].flatten();
        return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
      }).flatten(),
      this.options
    );
  }
});

Element.CSS_PROPERTIES = $w(
  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
  'fontSize fontWeight height left letterSpacing lineHeight ' +
  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
  'right textIndent top width wordSpacing zIndex');

Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;

String.__parseStyleElement = document.createElement('div');
String.prototype.parseStyle = function(){
  var style, styleRules = $H();
  if (Prototype.Browser.WebKit)
    style = new Element('div',{style:this}).style;
  else {
    String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
    style = String.__parseStyleElement.childNodes[0].style;
  }

  Element.CSS_PROPERTIES.each(function(property){
    if (style[property]) styleRules.set(property, style[property]);
  });

  if (Prototype.Browser.IE && this.include('opacity'))
    styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);

  return styleRules;
};

if (document.defaultView && document.defaultView.getComputedStyle) {
  Element.getStyles = function(element) {
    var css = document.defaultView.getComputedStyle($(element), null);
    return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
      styles[property] = css[property];
      return styles;
    });
  };
} else {
  Element.getStyles = function(element) {
    element = $(element);
    var css = element.currentStyle, styles;
    styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
      results[property] = css[property];
      return results;
    });
    if (!styles.opacity) styles.opacity = element.getOpacity();
    return styles;
  };
}

Effect.Methods = {
  morph: function(element, style) {
    element = $(element);
    new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
    return element;
  },
  visualEffect: function(element, effect, options) {
    element = $(element);
    var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
    new Effect[klass](element, options);
    return element;
  },
  highlight: function(element, options) {
    element = $(element);
    new Effect.Highlight(element, options);
    return element;
  }
};

$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
  'pulsate shake puff squish switchOff dropOut').each(
  function(effect) {
    Effect.Methods[effect] = function(element, options){
      element = $(element);
      Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
      return element;
    };
  }
);

$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
  function(f) { Effect.Methods[f] = Element[f]; }
);

Element.addMethods(Effect.Methods);
// script.aculo.us dragdrop.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if(Object.isUndefined(Effect))
  throw("dragdrop.js requires including script.aculo.us' effects.js library");

var Droppables = {
  drops: [],

  remove: function(element) {
    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
  },

  add: function(element) {
    element = $(element);
    var options = Object.extend({
      greedy:     true,
      hoverclass: null,
      tree:       false
    }, arguments[1] || { });

    // cache containers
    if(options.containment) {
      options._containers = [];
      var containment = options.containment;
      if(Object.isArray(containment)) {
        containment.each( function(c) { options._containers.push($(c)) });
      } else {
        options._containers.push($(containment));
      }
    }

    if(options.accept) options.accept = [options.accept].flatten();

    Element.makePositioned(element); // fix IE
    options.element = element;

    this.drops.push(options);
  },

  findDeepestChild: function(drops) {
    deepest = drops[0];

    for (i = 1; i < drops.length; ++i)
      if (Element.isParent(drops[i].element, deepest.element))
        deepest = drops[i];

    return deepest;
  },

  isContained: function(element, drop) {
    var containmentNode;
    if(drop.tree) {
      containmentNode = element.treeNode;
    } else {
      containmentNode = element.parentNode;
    }
    return drop._containers.detect(function(c) { return containmentNode == c });
  },

  isAffected: function(point, element, drop) {
    return (
      (drop.element!=element) &&
      ((!drop._containers) ||
        this.isContained(element, drop)) &&
      ((!drop.accept) ||
        (Element.classNames(element).detect(
          function(v) { return drop.accept.include(v) } ) )) &&
      Position.within(drop.element, point[0], point[1]) );
  },

  deactivate: function(drop) {
    if(drop.hoverclass)
      Element.removeClassName(drop.element, drop.hoverclass);
    this.last_active = null;
  },

  activate: function(drop) {
    if(drop.hoverclass)
      Element.addClassName(drop.element, drop.hoverclass);
    this.last_active = drop;
  },

  show: function(point, element) {
    if(!this.drops.length) return;
    var drop, affected = [];

    this.drops.each( function(drop) {
      if(Droppables.isAffected(point, element, drop))
        affected.push(drop);
    });

    if(affected.length>0)
      drop = Droppables.findDeepestChild(affected);

    if(this.last_active && this.last_active != drop) this.deactivate(this.last_active);
    if (drop) {
      Position.within(drop.element, point[0], point[1]);
      if(drop.onHover)
        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));

      if (drop != this.last_active) Droppables.activate(drop);
    }
  },

  fire: function(event, element) {
    if(!this.last_active) return;
    Position.prepare();

    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
      if (this.last_active.onDrop) {
        this.last_active.onDrop(element, this.last_active.element, event);
        return true;
      }
  },

  reset: function() {
    if(this.last_active)
      this.deactivate(this.last_active);
  }
};

var Draggables = {
  drags: [],
  observers: [],

  register: function(draggable) {
    if(this.drags.length == 0) {
      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
      this.eventKeypress  = this.keyPress.bindAsEventListener(this);

      Event.observe(document, "mouseup", this.eventMouseUp);
      Event.observe(draggable.element, "mousemove", this.eventMouseMove);
      Event.observe(document, "keypress", this.eventKeypress);
    }
    this.drags.push(draggable);
  },

  unregister: function(draggable) {
    this.drags = this.drags.reject(function(d) { return d==draggable });
    if(this.drags.length == 0) {
      Event.stopObserving(document, "mouseup", this.eventMouseUp);
      Event.stopObserving(draggable.element, "mousemove", this.eventMouseMove);
      Event.stopObserving(document, "keypress", this.eventKeypress);
    }
  },

  activate: function(draggable) {
    if(draggable.options.delay) {
      this._timeout = setTimeout(function() {
        Draggables._timeout = null;
        window.focus();
        Draggables.activeDraggable = draggable;
      }.bind(this), draggable.options.delay);
    } else {
      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
      this.activeDraggable = draggable;
    }
  },

  deactivate: function() {
    this.activeDraggable = null;
  },

  updateDrag: function(event) {
    if(!this.activeDraggable) return;
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    // Mozilla-based browsers fire successive mousemove events with
    // the same coordinates, prevent needless redrawing (moz bug?)
    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
    this._lastPointer = pointer;

    this.activeDraggable.updateDrag(event, pointer);
  },

  endDrag: function(event) {
    if(this._timeout) {
      clearTimeout(this._timeout);
      this._timeout = null;
    }
    if(!this.activeDraggable) return;
    this._lastPointer = null;
    this.activeDraggable.endDrag(event);
    this.activeDraggable = null;
  },

  keyPress: function(event) {
    if(this.activeDraggable)
      this.activeDraggable.keyPress(event);
  },

  addObserver: function(observer) {
    this.observers.push(observer);
    this._cacheObserverCallbacks();
  },

  removeObserver: function(element) {  // element instead of observer fixes mem leaks
    this.observers = this.observers.reject( function(o) { return o.element==element });
    this._cacheObserverCallbacks();
  },

  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
    if(this[eventName+'Count'] > 0)
      this.observers.each( function(o) {
        if(o[eventName]) o[eventName](eventName, draggable, event);
      });
    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
  },

  _cacheObserverCallbacks: function() {
    ['onStart','onEnd','onDrag'].each( function(eventName) {
      Draggables[eventName+'Count'] = Draggables.observers.select(
        function(o) { return o[eventName]; }
      ).length;
    });
  }
};

/*--------------------------------------------------------------------------*/

var Draggable = Class.create({
  initialize: function(element) {
    var defaults = {
      handle: false,
      reverteffect: function(element, top_offset, left_offset) {
        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
          queue: {scope:'_draggable', position:'end'}
        });
      },
      endeffect: function(element) {
        var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
          queue: {scope:'_draggable', position:'end'},
          afterFinish: function(){
            Draggable._dragging[element] = false
          }
        });
      },
      zindex: 1000,
      revert: false,
      quiet: false,
      scroll: false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
      delay: 0
    };

    if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
      Object.extend(defaults, {
        starteffect: function(element) {
          element._opacity = Element.getOpacity(element);
          Draggable._dragging[element] = true;
          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
        }
      });

    var options = Object.extend(defaults, arguments[1] || { });

    this.element = $(element);

    if(options.handle && Object.isString(options.handle))
      this.handle = this.element.down('.'+options.handle, 0);

    if(!this.handle) this.handle = $(options.handle);
    if(!this.handle) this.handle = this.element;

    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
      options.scroll = $(options.scroll);
      this._isScrollChild = Element.childOf(this.element, options.scroll);
    }

    Element.makePositioned(this.element); // fix IE

    this.options  = options;
    this.dragging = false;

    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
    Event.observe(this.handle, "mousedown", this.eventMouseDown);

    Draggables.register(this);
  },

  destroy: function() {
    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
    Draggables.unregister(this);
  },

  currentDelta: function() {
    return([
      parseInt(Element.getStyle(this.element,'left') || '0'),
      parseInt(Element.getStyle(this.element,'top') || '0')]);
  },

  initDrag: function(event) {
    if(!Object.isUndefined(Draggable._dragging[this.element]) &&
      Draggable._dragging[this.element]) return;
    if(Event.isLeftClick(event)) {
      // abort on form elements, fixes a Firefox issue
      var src = Event.element(event);
      if((tag_name = src.tagName.toUpperCase()) && (
        tag_name=='INPUT' ||
        tag_name=='SELECT' ||
        tag_name=='OPTION' ||
        tag_name=='BUTTON' ||
        tag_name=='TEXTAREA')) return;

      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      var pos     = Position.cumulativeOffset(this.element);
      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });

      Draggables.activate(this);
      Event.stop(event);
    }
  },

  startDrag: function(event) {
    this.dragging = true;
    if(!this.delta)
      this.delta = this.currentDelta();

    if(this.options.zindex) {
      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
      this.element.style.zIndex = this.options.zindex;
    }

    if(this.options.ghosting) {
      this._clone = this.element.cloneNode(true);
      this._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
      if (!this._originallyAbsolute)
        Position.absolutize(this.element);
      this.element.parentNode.insertBefore(this._clone, this.element);
    }

    if(this.options.scroll) {
      if (this.options.scroll == window) {
        var where = this._getWindowScroll(this.options.scroll);
        this.originalScrollLeft = where.left;
        this.originalScrollTop = where.top;
      } else {
        this.originalScrollLeft = this.options.scroll.scrollLeft;
        this.originalScrollTop = this.options.scroll.scrollTop;
      }
    }

    Draggables.notify('onStart', this, event);

    if(this.options.starteffect) this.options.starteffect(this.element);
  },

  updateDrag: function(event, pointer) {
    if(!this.dragging) this.startDrag(event);

    if(!this.options.quiet){
      Position.prepare();
      Droppables.show(pointer, this.element);
    }

    Draggables.notify('onDrag', this, event);

    this.draw(pointer);
    if(this.options.change) this.options.change(this);

    if(this.options.scroll) {
      this.stopScrolling();

      var p;
      if (this.options.scroll == window) {
        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
      } else {
        p = Position.page(this.options.scroll);
        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
        p[1] += this.options.scroll.scrollTop + Position.deltaY;
        p.push(p[0]+this.options.scroll.offsetWidth);
        p.push(p[1]+this.options.scroll.offsetHeight);
      }
      var speed = [0,0];
      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
      this.startScrolling(speed);
    }

    // fix AppleWebKit rendering
    if(Prototype.Browser.WebKit) window.scrollBy(0,0);

    Event.stop(event);
  },

  finishDrag: function(event, success) {
    this.dragging = false;

    if(this.options.quiet){
      Position.prepare();
      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      Droppables.show(pointer, this.element);
    }

    if(this.options.ghosting) {
      if (!this._originallyAbsolute)
        Position.relativize(this.element);
      delete this._originallyAbsolute;
      Element.remove(this._clone);
      this._clone = null;
    }

    var dropped = false;
    if(success) {
      dropped = Droppables.fire(event, this.element);
      if (!dropped) dropped = false;
    }
    if(dropped && this.options.onDropped) this.options.onDropped(this.element);
    Draggables.notify('onEnd', this, event);

    var revert = this.options.revert;
    if(revert && Object.isFunction(revert)) revert = revert(this.element);

    var d = this.currentDelta();
    if(revert && this.options.reverteffect) {
      if (dropped == 0 || revert != 'failure')
        this.options.reverteffect(this.element,
          d[1]-this.delta[1], d[0]-this.delta[0]);
    } else {
      this.delta = d;
    }

    if(this.options.zindex)
      this.element.style.zIndex = this.originalZ;

    if(this.options.endeffect)
      this.options.endeffect(this.element);

    Draggables.deactivate(this);
    Droppables.reset();
  },

  keyPress: function(event) {
    if(event.keyCode!=Event.KEY_ESC) return;
    this.finishDrag(event, false);
    Event.stop(event);
  },

  endDrag: function(event) {
    if(!this.dragging) return;
    this.stopScrolling();
    this.finishDrag(event, true);
    Event.stop(event);
  },

  draw: function(point) {
    var pos = Position.cumulativeOffset(this.element);
    if(this.options.ghosting) {
      var r   = Position.realOffset(this.element);
      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
    }

    var d = this.currentDelta();
    pos[0] -= d[0]; pos[1] -= d[1];

    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
    }

    var p = [0,1].map(function(i){
      return (point[i]-pos[i]-this.offset[i])
    }.bind(this));

    if(this.options.snap) {
      if(Object.isFunction(this.options.snap)) {
        p = this.options.snap(p[0],p[1],this);
      } else {
      if(Object.isArray(this.options.snap)) {
        p = p.map( function(v, i) {
          return (v/this.options.snap[i]).round()*this.options.snap[i] }.bind(this));
      } else {
        p = p.map( function(v) {
          return (v/this.options.snap).round()*this.options.snap }.bind(this));
      }
    }}

    var style = this.element.style;
    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
      style.left = p[0] + "px";
    if((!this.options.constraint) || (this.options.constraint=='vertical'))
      style.top  = p[1] + "px";

    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
  },

  stopScrolling: function() {
    if(this.scrollInterval) {
      clearInterval(this.scrollInterval);
      this.scrollInterval = null;
      Draggables._lastScrollPointer = null;
    }
  },

  startScrolling: function(speed) {
    if(!(speed[0] || speed[1])) return;
    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
    this.lastScrolled = new Date();
    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
  },

  scroll: function() {
    var current = new Date();
    var delta = current - this.lastScrolled;
    this.lastScrolled = current;
    if(this.options.scroll == window) {
      with (this._getWindowScroll(this.options.scroll)) {
        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
          var d = delta / 1000;
          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
        }
      }
    } else {
      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
    }

    Position.prepare();
    Droppables.show(Draggables._lastPointer, this.element);
    Draggables.notify('onDrag', this);
    if (this._isScrollChild) {
      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
      if (Draggables._lastScrollPointer[0] < 0)
        Draggables._lastScrollPointer[0] = 0;
      if (Draggables._lastScrollPointer[1] < 0)
        Draggables._lastScrollPointer[1] = 0;
      this.draw(Draggables._lastScrollPointer);
    }

    if(this.options.change) this.options.change(this);
  },

  _getWindowScroll: function(w) {
    var T, L, W, H;
    with (w.document) {
      if (w.document.documentElement && documentElement.scrollTop) {
        T = documentElement.scrollTop;
        L = documentElement.scrollLeft;
      } else if (w.document.body) {
        T = body.scrollTop;
        L = body.scrollLeft;
      }
      if (w.innerWidth) {
        W = w.innerWidth;
        H = w.innerHeight;
      } else if (w.document.documentElement && documentElement.clientWidth) {
        W = documentElement.clientWidth;
        H = documentElement.clientHeight;
      } else {
        W = body.offsetWidth;
        H = body.offsetHeight;
      }
    }
    return { top: T, left: L, width: W, height: H };
  }
});

Draggable._dragging = { };

/*--------------------------------------------------------------------------*/

var SortableObserver = Class.create({
  initialize: function(element, observer) {
    this.element   = $(element);
    this.observer  = observer;
    this.lastValue = Sortable.serialize(this.element);
  },

  onStart: function() {
    this.lastValue = Sortable.serialize(this.element);
  },

  onEnd: function() {
    Sortable.unmark();
    if(this.lastValue != Sortable.serialize(this.element))
      this.observer(this.element)
  }
});

var Sortable = {
  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,

  sortables: { },

  _findRootElement: function(element) {
    while (element.tagName.toUpperCase() != "BODY") {
      if(element.id && Sortable.sortables[element.id]) return element;
      element = element.parentNode;
    }
  },

  options: function(element) {
    element = Sortable._findRootElement($(element));
    if(!element) return;
    return Sortable.sortables[element.id];
  },

  destroy: function(element){
    element = $(element);
    var s = Sortable.sortables[element.id];

    if(s) {
      Draggables.removeObserver(s.element);
      s.droppables.each(function(d){ Droppables.remove(d) });
      s.draggables.invoke('destroy');

      delete Sortable.sortables[s.element.id];
    }
  },

  create: function(element) {
    element = $(element);
    var options = Object.extend({
      element:     element,
      tag:         'li',       // assumes li children, override with tag: 'tagname'
      dropOnEmpty: false,
      tree:        false,
      treeTag:     'ul',
      overlap:     'vertical', // one of 'vertical', 'horizontal'
      constraint:  'vertical', // one of 'vertical', 'horizontal', false
      containment: element,    // also takes array of elements (or id's); or false
      handle:      false,      // or a CSS class
      only:        false,
      delay:       0,
      hoverclass:  null,
      ghosting:    false,
      quiet:       false,
      scroll:      false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      format:      this.SERIALIZE_RULE,

      // these take arrays of elements or ids and can be
      // used for better initialization performance
      elements:    false,
      handles:     false,

      onChange:    Prototype.emptyFunction,
      onUpdate:    Prototype.emptyFunction
    }, arguments[1] || { });

    // clear any old sortable with same element
    this.destroy(element);

    // build options for the draggables
    var options_for_draggable = {
      revert:      true,
      quiet:       options.quiet,
      scroll:      options.scroll,
      scrollSpeed: options.scrollSpeed,
      scrollSensitivity: options.scrollSensitivity,
      delay:       options.delay,
      ghosting:    options.ghosting,
      constraint:  options.constraint,
      handle:      options.handle };

    if(options.starteffect)
      options_for_draggable.starteffect = options.starteffect;

    if(options.reverteffect)
      options_for_draggable.reverteffect = options.reverteffect;
    else
      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
        element.style.top  = 0;
        element.style.left = 0;
      };

    if(options.endeffect)
      options_for_draggable.endeffect = options.endeffect;

    if(options.zindex)
      options_for_draggable.zindex = options.zindex;

    // build options for the droppables
    var options_for_droppable = {
      overlap:     options.overlap,
      containment: options.containment,
      tree:        options.tree,
      hoverclass:  options.hoverclass,
      onHover:     Sortable.onHover
    };

    var options_for_tree = {
      onHover:      Sortable.onEmptyHover,
      overlap:      options.overlap,
      containment:  options.containment,
      hoverclass:   options.hoverclass
    };

    // fix for gecko engine
    Element.cleanWhitespace(element);

    options.draggables = [];
    options.droppables = [];

    // drop on empty handling
    if(options.dropOnEmpty || options.tree) {
      Droppables.add(element, options_for_tree);
      options.droppables.push(element);
    }

    (options.elements || this.findElements(element, options) || []).each( function(e,i) {
      var handle = options.handles ? $(options.handles[i]) :
        (options.handle ? $(e).select('.' + options.handle)[0] : e);
      options.draggables.push(
        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
      Droppables.add(e, options_for_droppable);
      if(options.tree) e.treeNode = element;
      options.droppables.push(e);
    });

    if(options.tree) {
      (Sortable.findTreeElements(element, options) || []).each( function(e) {
        Droppables.add(e, options_for_tree);
        e.treeNode = element;
        options.droppables.push(e);
      });
    }

    // keep reference
    this.sortables[element.id] = options;

    // for onupdate
    Draggables.addObserver(new SortableObserver(element, options.onUpdate));

  },

  // return all suitable-for-sortable elements in a guaranteed order
  findElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.tag);
  },

  findTreeElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.treeTag);
  },

  onHover: function(element, dropon, overlap) {
    if(Element.isParent(dropon, element)) return;

    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
      return;
    } else if(overlap>0.5) {
      Sortable.mark(dropon, 'before');
      if(dropon.previousSibling != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, dropon);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    } else {
      Sortable.mark(dropon, 'after');
      var nextElement = dropon.nextSibling || null;
      if(nextElement != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, nextElement);
        if(dropon.parentNode!=oldParentNode)
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    }
  },

  onEmptyHover: function(element, dropon, overlap) {
    var oldParentNode = element.parentNode;
    var droponOptions = Sortable.options(dropon);

    if(!Element.isParent(dropon, element)) {
      var index;

      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
      var child = null;

      if(children) {
        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);

        for (index = 0; index < children.length; index += 1) {
          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
            offset -= Element.offsetSize (children[index], droponOptions.overlap);
          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
            child = index + 1 < children.length ? children[index + 1] : null;
            break;
          } else {
            child = children[index];
            break;
          }
        }
      }

      dropon.insertBefore(element, child);

      Sortable.options(oldParentNode).onChange(element);
      droponOptions.onChange(element);
    }
  },

  unmark: function() {
    if(Sortable._marker) Sortable._marker.hide();
  },

  mark: function(dropon, position) {
    // mark on ghosting only
    var sortable = Sortable.options(dropon.parentNode);
    if(sortable && !sortable.ghosting) return;

    if(!Sortable._marker) {
      Sortable._marker =
        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
          hide().addClassName('dropmarker').setStyle({position:'absolute'});
      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
    }
    var offsets = Position.cumulativeOffset(dropon);
    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});

    if(position=='after')
      if(sortable.overlap == 'horizontal')
        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
      else
        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});

    Sortable._marker.show();
  },

  _tree: function(element, options, parent) {
    var children = Sortable.findElements(element, options) || [];

    for (var i = 0; i < children.length; ++i) {
      var match = children[i].id.match(options.format);

      if (!match) continue;

      var child = {
        id: encodeURIComponent(match ? match[1] : null),
        element: element,
        parent: parent,
        children: [],
        position: parent.children.length,
        container: $(children[i]).down(options.treeTag)
      };

      /* Get the element containing the children and recurse over it */
      if (child.container)
        this._tree(child.container, options, child);

      parent.children.push (child);
    }

    return parent;
  },

  tree: function(element) {
    element = $(element);
    var sortableOptions = this.options(element);
    var options = Object.extend({
      tag: sortableOptions.tag,
      treeTag: sortableOptions.treeTag,
      only: sortableOptions.only,
      name: element.id,
      format: sortableOptions.format
    }, arguments[1] || { });

    var root = {
      id: null,
      parent: null,
      children: [],
      container: element,
      position: 0
    };

    return Sortable._tree(element, options, root);
  },

  /* Construct a [i] index for a particular node */
  _constructIndex: function(node) {
    var index = '';
    do {
      if (node.id) index = '[' + node.position + ']' + index;
    } while ((node = node.parent) != null);
    return index;
  },

  sequence: function(element) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[1] || { });

    return $(this.findElements(element, options) || []).map( function(item) {
      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
    });
  },

  setSequence: function(element, new_sequence) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[2] || { });

    var nodeMap = { };
    this.findElements(element, options).each( function(n) {
        if (n.id.match(options.format))
            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
        n.parentNode.removeChild(n);
    });

    new_sequence.each(function(ident) {
      var n = nodeMap[ident];
      if (n) {
        n[1].appendChild(n[0]);
        delete nodeMap[ident];
      }
    });
  },

  serialize: function(element) {
    element = $(element);
    var options = Object.extend(Sortable.options(element), arguments[1] || { });
    var name = encodeURIComponent(
      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);

    if (options.tree) {
      return Sortable.tree(element, arguments[1]).children.map( function (item) {
        return [name + Sortable._constructIndex(item) + "[id]=" +
                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
      }).flatten().join('&');
    } else {
      return Sortable.sequence(element, arguments[1]).map( function(item) {
        return name + "[]=" + encodeURIComponent(item);
      }).join('&');
    }
  }
};

// Returns true if child is contained within element
Element.isParent = function(child, element) {
  if (!child.parentNode || child == element) return false;
  if (child.parentNode == element) return true;
  return Element.isParent(child.parentNode, element);
};

Element.findChildren = function(element, only, recursive, tagName) {
  if(!element.hasChildNodes()) return null;
  tagName = tagName.toUpperCase();
  if(only) only = [only].flatten();
  var elements = [];
  $A(element.childNodes).each( function(e) {
    if(e.tagName && e.tagName.toUpperCase()==tagName &&
      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
        elements.push(e);
    if(recursive) {
      var grandchildren = Element.findChildren(e, only, recursive, tagName);
      if(grandchildren) elements.push(grandchildren);
    }
  });

  return (elements.length>0 ? elements.flatten() : []);
};

Element.offsetSize = function (element, type) {
  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
};
// script.aculo.us controls.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005-2008 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
//           (c) 2005-2008 Jon Tirsen (http://www.tirsen.com)
// Contributors:
//  Richard Livsey
//  Rahul Bhargava
//  Rob Wills
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// Autocompleter.Base handles all the autocompletion functionality
// that's independent of the data source for autocompletion. This
// includes drawing the autocompletion menu, observing keyboard
// and mouse events, and similar.
//
// Specific autocompleters need to provide, at the very least,
// a getUpdatedChoices function that will be invoked every time
// the text inside the monitored textbox changes. This method
// should get the text for which to provide autocompletion by
// invoking this.getToken(), NOT by directly accessing
// this.element.value. This is to allow incremental tokenized
// autocompletion. Specific auto-completion logic (AJAX, etc)
// belongs in getUpdatedChoices.
//
// Tokenized incremental autocompletion is enabled automatically
// when an autocompleter is instantiated with the 'tokens' option
// in the options parameter, e.g.:
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
// will incrementally autocomplete with a comma as the token.
// Additionally, ',' in the above example can be replaced with
// a token array, e.g. { tokens: [',', '\n'] } which
// enables autocompletion on multiple tokens. This is most
// useful when one of the tokens is \n (a newline), as it
// allows smart autocompletion after linebreaks.

if(typeof Effect == 'undefined')
  throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = { };
Autocompleter.Base = Class.create({
  baseInitialize: function(element, update, options) {
    element          = $(element);
    this.element     = element;
    this.update      = $(update);
    this.hasFocus    = false;
    this.changed     = false;
    this.active      = false;
    this.index       = 0;
    this.entryCount  = 0;
    this.oldElementValue = this.element.value;

    if(this.setOptions)
      this.setOptions(options);
    else
      this.options = options || { };

    this.options.paramName    = this.options.paramName || this.element.name;
    this.options.tokens       = this.options.tokens || [];
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.minChars     = this.options.minChars || 1;
    this.options.onShow       = this.options.onShow ||
      function(element, update){
        if(!update.style.position || update.style.position=='absolute') {
          update.style.position = 'absolute';
          Position.clone(element, update, {
            setHeight: false,
            offsetTop: element.offsetHeight
          });
        }
        Effect.Appear(update,{duration:0.15});
      };
    this.options.onHide = this.options.onHide ||
      function(element, update){ new Effect.Fade(update,{duration:0.15}) };

    if(typeof(this.options.tokens) == 'string')
      this.options.tokens = new Array(this.options.tokens);
    // Force carriage returns as token delimiters anyway
    if (!this.options.tokens.include('\n'))
      this.options.tokens.push('\n');

    this.observer = null;

    this.element.setAttribute('autocomplete','off');

    Element.hide(this.update);

    Event.observe(this.element, 'blur', this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, 'keydown', this.onKeyPress.bindAsEventListener(this));
  },

  show: function() {
    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix &&
      (Prototype.Browser.IE) &&
      (Element.getStyle(this.update, 'position')=='absolute')) {
      new Insertion.After(this.update,
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $(this.update.id+'_iefix');
    }
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
  },

  fixIEOverlapping: function() {
    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
    this.iefix.style.zIndex = 1;
    this.update.style.zIndex = 2;
    Element.show(this.iefix);
  },

  hide: function() {
    this.stopIndicator();
    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },

  startIndicator: function() {
    if(this.options.indicator) Element.show(this.options.indicator);
  },

  stopIndicator: function() {
    if(this.options.indicator) Element.hide(this.options.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         Event.stop(event);
         return;
      }
     else
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
         (Prototype.Browser.WebKit > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer =
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },

  activate: function() {
    this.changed = false;
    this.hasFocus = true;
    this.getUpdatedChoices();
  },

  onHover: function(event) {
    var element = Event.findElement(event, 'LI');
    if(this.index != element.autocompleteIndex)
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },

  onClick: function(event) {
    var element = Event.findElement(event, 'LI');
    this.index = element.autocompleteIndex;
    this.selectEntry();
    this.hide();
  },

  onBlur: function(event) {
    // needed to make click events working
    setTimeout(this.hide.bind(this), 250);
    this.hasFocus = false;
    this.active = false;
  },

  render: function() {
    if(this.entryCount > 0) {
      for (var i = 0; i < this.entryCount; i++)
        this.index==i ?
          Element.addClassName(this.getEntry(i),"selected") :
          Element.removeClassName(this.getEntry(i),"selected");
      if(this.hasFocus) {
        this.show();
        this.active = true;
      }
    } else {
      this.active = false;
      this.hide();
    }
  },

  markPrevious: function() {
    if(this.index > 0) this.index--;
      else this.index = this.entryCount-1;
    //this.getEntry(this.index).scrollIntoView(true); useless
  },

  markNext: function() {
    if(this.index < this.entryCount-1) this.index++;
      else this.index = 0;
    this.getEntry(this.index).scrollIntoView(false);
  },

  getEntry: function(index) {
    return this.update.firstChild.childNodes[index];
  },

  getCurrentEntry: function() {
    return this.getEntry(this.index);
  },

  selectEntry: function() {
    this.active = false;
    this.updateElement(this.getCurrentEntry());
  },

  updateElement: function(selectedElement) {
    if (this.options.updateElement) {
      this.options.updateElement(selectedElement);
      return;
    }
    var value = '';
    if (this.options.select) {
      var nodes = $(selectedElement).select('.' + this.options.select) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');

    var bounds = this.getTokenBounds();
    if (bounds[0] != -1) {
      var newValue = this.element.value.substr(0, bounds[0]);
      var whitespace = this.element.value.substr(bounds[0]).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value + this.element.value.substr(bounds[1]);
    } else {
      this.element.value = value;
    }
    this.oldElementValue = this.element.value;
    this.element.focus();

    if (this.options.afterUpdateElement)
      this.options.afterUpdateElement(this.element, selectedElement);
  },

  updateChoices: function(choices) {
    if(!this.changed && this.hasFocus) {
      this.update.innerHTML = choices;
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.down());

      if(this.update.firstChild && this.update.down().childNodes) {
        this.entryCount =
          this.update.down().childNodes.length;
        for (var i = 0; i < this.entryCount; i++) {
          var entry = this.getEntry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else {
        this.entryCount = 0;
      }

      this.stopIndicator();
      this.index = 0;

      if(this.entryCount==1 && this.options.autoSelect) {
        this.selectEntry();
        this.hide();
      } else {
        this.render();
      }
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;
    this.tokenBounds = null;
    if(this.getToken().length>=this.options.minChars) {
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
    this.oldElementValue = this.element.value;
  },

  getToken: function() {
    var bounds = this.getTokenBounds();
    return this.element.value.substring(bounds[0], bounds[1]).strip();
  },

  getTokenBounds: function() {
    if (null != this.tokenBounds) return this.tokenBounds;
    var value = this.element.value;
    if (value.strip().empty()) return [-1, 0];
    var diff = arguments.callee.getFirstDifferencePos(value, this.oldElementValue);
    var offset = (diff == this.oldElementValue.length ? 1 : 0);
    var prevTokenPos = -1, nextTokenPos = value.length;
    var tp;
    for (var index = 0, l = this.options.tokens.length; index < l; ++index) {
      tp = value.lastIndexOf(this.options.tokens[index], diff + offset - 1);
      if (tp > prevTokenPos) prevTokenPos = tp;
      tp = value.indexOf(this.options.tokens[index], diff + offset);
      if (-1 != tp && tp < nextTokenPos) nextTokenPos = tp;
    }
    return (this.tokenBounds = [prevTokenPos + 1, nextTokenPos]);
  }
});

Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(newS, oldS) {
  var boundary = Math.min(newS.length, oldS.length);
  for (var index = 0; index < boundary; ++index)
    if (newS[index] != oldS[index])
      return index;
  return boundary;
};

Ajax.Autocompleter = Class.create(Autocompleter.Base, {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },

  getUpdatedChoices: function() {
    this.startIndicator();

    var entry = encodeURIComponent(this.options.paramName) + '=' +
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams)
      this.options.parameters += '&' + this.options.defaultParams;

    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
    this.updateChoices(request.responseText);
  }
});

// The local array autocompleter. Used when you'd prefer to
// inject an array of autocompletion options into the page, rather
// than sending out Ajax queries, which can be quite slow sometimes.
//
// The constructor takes four parameters. The first two are, as usual,
// the id of the monitored textbox, and id of the autocompletion menu.
// The third is the array you want to autocomplete from, and the fourth
// is the options block.
//
// Extra local autocompletion options:
// - choices - How many autocompletion choices to offer
//
// - partialSearch - If false, the autocompleter will match entered
//                    text only at the beginning of strings in the
//                    autocomplete array. Defaults to true, which will
//                    match text at the beginning of any *word* in the
//                    strings in the autocomplete array. If you want to
//                    search anywhere in the string, additionally set
//                    the option fullSearch to true (default: off).
//
// - fullSsearch - Search anywhere in autocomplete array strings.
//
// - partialChars - How many characters to enter before triggering
//                   a partial match (unlike minChars, which defines
//                   how many characters are required to do any match
//                   at all). Defaults to 2.
//
// - ignoreCase - Whether to ignore case when autocompleting.
//                 Defaults to true.
//
// It's possible to pass in a custom function as the 'selector'
// option, if you prefer to write your own autocompletion logic.
// In that case, the other options above will not apply unless
// you support them.

Autocompleter.Local = Class.create(Autocompleter.Base, {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry     = instance.getToken();
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&
          ret.length < instance.options.choices ; i++) {

          var elem = instance.options.array[i];
          var foundPos = instance.options.ignoreCase ?
            elem.toLowerCase().indexOf(entry.toLowerCase()) :
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) {
              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
                elem.substr(entry.length) + "</li>");
              break;
            } else if (entry.length >= instance.options.partialChars &&
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
                  foundPos + entry.length) + "</li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ?
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length));
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || { });
  }
});

// AJAX in-place editor and collection editor
// Full rewrite by Christophe Porteneuve <tdd@tddsworld.com> (April 2007).

// Use this if you notice weird scrolling problems on some browsers,
// the DOM might be a bit confused when this gets called so do this
// waits 1 ms (with setTimeout) until it does the activation
Field.scrollFreeActivate = function(field) {
  setTimeout(function() {
    Field.activate(field);
  }, 1);
};

Ajax.InPlaceEditor = Class.create({
  initialize: function(element, url, options) {
    this.url = url;
    this.element = element = $(element);
    this.prepareOptions();
    this._controls = { };
    arguments.callee.dealWithDeprecatedOptions(options); // DEPRECATION LAYER!!!
    Object.extend(this.options, options || { });
    if (!this.options.formId && this.element.id) {
      this.options.formId = this.element.id + '-inplaceeditor';
      if ($(this.options.formId))
        this.options.formId = '';
    }
    if (this.options.externalControl)
      this.options.externalControl = $(this.options.externalControl);
    if (!this.options.externalControl)
      this.options.externalControlOnly = false;
    this._originalBackground = this.element.getStyle('background-color') || 'transparent';
    this.element.title = this.options.clickToEditText;
    this._boundCancelHandler = this.handleFormCancellation.bind(this);
    this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
    this._boundFailureHandler = this.handleAJAXFailure.bind(this);
    this._boundSubmitHandler = this.handleFormSubmission.bind(this);
    this._boundWrapperHandler = this.wrapUp.bind(this);
    this.registerListeners();
  },
  checkForEscapeOrReturn: function(e) {
    if (!this._editing || e.ctrlKey || e.altKey || e.shiftKey) return;
    if (Event.KEY_ESC == e.keyCode)
      this.handleFormCancellation(e);
    else if (Event.KEY_RETURN == e.keyCode)
      this.handleFormSubmission(e);
  },
  createControl: function(mode, handler, extraClasses) {
    var control = this.options[mode + 'Control'];
    var text = this.options[mode + 'Text'];
    if ('button' == control) {
      var btn = document.createElement('input');
      btn.type = 'submit';
      btn.value = text;
      btn.className = 'editor_' + mode + '_button';
      if ('cancel' == mode)
        btn.onclick = this._boundCancelHandler;
      this._form.appendChild(btn);
      this._controls[mode] = btn;
    } else if ('link' == control) {
      var link = document.createElement('a');
      link.href = '#';
      link.appendChild(document.createTextNode(text));
      link.onclick = 'cancel' == mode ? this._boundCancelHandler : this._boundSubmitHandler;
      link.className = 'editor_' + mode + '_link';
      if (extraClasses)
        link.className += ' ' + extraClasses;
      this._form.appendChild(link);
      this._controls[mode] = link;
    }
  },
  createEditField: function() {
    var text = (this.options.loadTextURL ? this.options.loadingText : this.getText());
    var fld;
    if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
      fld = document.createElement('input');
      fld.type = 'text';
      var size = this.options.size || this.options.cols || 0;
      if (0 < size) fld.size = size;
    } else {
      fld = document.createElement('textarea');
      fld.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
      fld.cols = this.options.cols || 40;
    }
    fld.name = this.options.paramName;
    fld.value = text; // No HTML breaks conversion anymore
    fld.className = 'editor_field';
    if (this.options.submitOnBlur)
      fld.onblur = this._boundSubmitHandler;
    this._controls.editor = fld;
    if (this.options.loadTextURL)
      this.loadExternalText();
    this._form.appendChild(this._controls.editor);
  },
  createForm: function() {
    var ipe = this;
    function addText(mode, condition) {
      var text = ipe.options['text' + mode + 'Controls'];
      if (!text || condition === false) return;
      ipe._form.appendChild(document.createTextNode(text));
    };
    this._form = $(document.createElement('form'));
    this._form.id = this.options.formId;
    this._form.addClassName(this.options.formClassName);
    this._form.onsubmit = this._boundSubmitHandler;
    this.createEditField();
    if ('textarea' == this._controls.editor.tagName.toLowerCase())
      this._form.appendChild(document.createElement('br'));
    if (this.options.onFormCustomization)
      this.options.onFormCustomization(this, this._form);
    addText('Before', this.options.okControl || this.options.cancelControl);
    this.createControl('ok', this._boundSubmitHandler);
    addText('Between', this.options.okControl && this.options.cancelControl);
    this.createControl('cancel', this._boundCancelHandler, 'editor_cancel');
    addText('After', this.options.okControl || this.options.cancelControl);
  },
  destroy: function() {
    if (this._oldInnerHTML)
      this.element.innerHTML = this._oldInnerHTML;
    this.leaveEditMode();
    this.unregisterListeners();
  },
  enterEditMode: function(e) {
    if (this._saving || this._editing) return;
    this._editing = true;
    this.triggerCallback('onEnterEditMode');
    if (this.options.externalControl)
      this.options.externalControl.hide();
    this.element.hide();
    this.createForm();
    this.element.parentNode.insertBefore(this._form, this.element);
    if (!this.options.loadTextURL)
      this.postProcessEditField();
    if (e) Event.stop(e);
  },
  enterHover: function(e) {
    if (this.options.hoverClassName)
      this.element.addClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onEnterHover');
  },
  getText: function() {
    return this.element.innerHTML.unescapeHTML();
  },
  handleAJAXFailure: function(transport) {
    this.triggerCallback('onFailure', transport);
    if (this._oldInnerHTML) {
      this.element.innerHTML = this._oldInnerHTML;
      this._oldInnerHTML = null;
    }
  },
  handleFormCancellation: function(e) {
    this.wrapUp();
    if (e) Event.stop(e);
  },
  handleFormSubmission: function(e) {
    var form = this._form;
    var value = $F(this._controls.editor);
    this.prepareSubmission();
    var params = this.options.callback(form, value) || '';
    if (Object.isString(params))
      params = params.toQueryParams();
    params.editorId = this.element.id;
    if (this.options.htmlResponse) {
      var options = Object.extend({ evalScripts: true }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Updater({ success: this.element }, this.url, options);
    } else {
      var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
      Object.extend(options, {
        parameters: params,
        onComplete: this._boundWrapperHandler,
        onFailure: this._boundFailureHandler
      });
      new Ajax.Request(this.url, options);
    }
    if (e) Event.stop(e);
  },
  leaveEditMode: function() {
    this.element.removeClassName(this.options.savingClassName);
    this.removeForm();
    this.leaveHover();
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
    if (this.options.externalControl)
      this.options.externalControl.show();
    this._saving = false;
    this._editing = false;
    this._oldInnerHTML = null;
    this.triggerCallback('onLeaveEditMode');
  },
  leaveHover: function(e) {
    if (this.options.hoverClassName)
      this.element.removeClassName(this.options.hoverClassName);
    if (this._saving) return;
    this.triggerCallback('onLeaveHover');
  },
  loadExternalText: function() {
    this._form.addClassName(this.options.loadingClassName);
    this._controls.editor.disabled = true;
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._form.removeClassName(this.options.loadingClassName);
        var text = transport.responseText;
        if (this.options.stripLoadedTextTags)
          text = text.stripTags();
        this._controls.editor.value = text;
        this._controls.editor.disabled = false;
        this.postProcessEditField();
      }.bind(this),
      onFailure: this._boundFailureHandler
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },
  postProcessEditField: function() {
    var fpc = this.options.fieldPostCreation;
    if (fpc)
      $(this._controls.editor)['focus' == fpc ? 'focus' : 'activate']();
  },
  prepareOptions: function() {
    this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
    Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
    [this._extraDefaultOptions].flatten().compact().each(function(defs) {
      Object.extend(this.options, defs);
    }.bind(this));
  },
  prepareSubmission: function() {
    this._saving = true;
    this.removeForm();
    this.leaveHover();
    this.showSaving();
  },
  registerListeners: function() {
    this._listeners = { };
    var listener;
    $H(Ajax.InPlaceEditor.Listeners).each(function(pair) {
      listener = this[pair.value].bind(this);
      this._listeners[pair.key] = listener;
      if (!this.options.externalControlOnly)
        this.element.observe(pair.key, listener);
      if (this.options.externalControl)
        this.options.externalControl.observe(pair.key, listener);
    }.bind(this));
  },
  removeForm: function() {
    if (!this._form) return;
    this._form.remove();
    this._form = null;
    this._controls = { };
  },
  showSaving: function() {
    this._oldInnerHTML = this.element.innerHTML;
    this.element.innerHTML = this.options.savingText;
    this.element.addClassName(this.options.savingClassName);
    this.element.style.backgroundColor = this._originalBackground;
    this.element.show();
  },
  triggerCallback: function(cbName, arg) {
    if ('function' == typeof this.options[cbName]) {
      this.options[cbName](this, arg);
    }
  },
  unregisterListeners: function() {
    $H(this._listeners).each(function(pair) {
      if (!this.options.externalControlOnly)
        this.element.stopObserving(pair.key, pair.value);
      if (this.options.externalControl)
        this.options.externalControl.stopObserving(pair.key, pair.value);
    }.bind(this));
  },
  wrapUp: function(transport) {
    this.leaveEditMode();
    // Can't use triggerCallback due to backward compatibility: requires
    // binding + direct element
    this._boundComplete(transport, this.element);
  }
});

Object.extend(Ajax.InPlaceEditor.prototype, {
  dispose: Ajax.InPlaceEditor.prototype.destroy
});

Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
  initialize: function($super, element, url, options) {
    this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
    $super(element, url, options);
  },

  createEditField: function() {
    var list = document.createElement('select');
    list.name = this.options.paramName;
    list.size = 1;
    this._controls.editor = list;
    this._collection = this.options.collection || [];
    if (this.options.loadCollectionURL)
      this.loadCollection();
    else
      this.checkForExternalText();
    this._form.appendChild(this._controls.editor);
  },

  loadCollection: function() {
    this._form.addClassName(this.options.loadingClassName);
    this.showLoadingText(this.options.loadingCollectionText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        var js = transport.responseText.strip();
        if (!/^\[.*\]$/.test(js)) // TODO: improve sanity check
          throw('Server returned an invalid collection representation.');
        this._collection = eval(js);
        this.checkForExternalText();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadCollectionURL, options);
  },

  showLoadingText: function(text) {
    this._controls.editor.disabled = true;
    var tempOption = this._controls.editor.firstChild;
    if (!tempOption) {
      tempOption = document.createElement('option');
      tempOption.value = '';
      this._controls.editor.appendChild(tempOption);
      tempOption.selected = true;
    }
    tempOption.update((text || '').stripScripts().stripTags());
  },

  checkForExternalText: function() {
    this._text = this.getText();
    if (this.options.loadTextURL)
      this.loadExternalText();
    else
      this.buildOptionList();
  },

  loadExternalText: function() {
    this.showLoadingText(this.options.loadingText);
    var options = Object.extend({ method: 'get' }, this.options.ajaxOptions);
    Object.extend(options, {
      parameters: 'editorId=' + encodeURIComponent(this.element.id),
      onComplete: Prototype.emptyFunction,
      onSuccess: function(transport) {
        this._text = transport.responseText.strip();
        this.buildOptionList();
      }.bind(this),
      onFailure: this.onFailure
    });
    new Ajax.Request(this.options.loadTextURL, options);
  },

  buildOptionList: function() {
    this._form.removeClassName(this.options.loadingClassName);
    this._collection = this._collection.map(function(entry) {
      return 2 === entry.length ? entry : [entry, entry].flatten();
    });
    var marker = ('value' in this.options) ? this.options.value : this._text;
    var textFound = this._collection.any(function(entry) {
      return entry[0] == marker;
    }.bind(this));
    this._controls.editor.update('');
    var option;
    this._collection.each(function(entry, index) {
      option = document.createElement('option');
      option.value = entry[0];
      option.selected = textFound ? entry[0] == marker : 0 == index;
      option.appendChild(document.createTextNode(entry[1]));
      this._controls.editor.appendChild(option);
    }.bind(this));
    this._controls.editor.disabled = false;
    Field.scrollFreeActivate(this._controls.editor);
  }
});

//**** DEPRECATION LAYER FOR InPlace[Collection]Editor! ****
//**** This only  exists for a while,  in order to  let ****
//**** users adapt to  the new API.  Read up on the new ****
//**** API and convert your code to it ASAP!            ****

Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(options) {
  if (!options) return;
  function fallback(name, expr) {
    if (name in options || expr === undefined) return;
    options[name] = expr;
  };
  fallback('cancelControl', (options.cancelLink ? 'link' : (options.cancelButton ? 'button' :
    options.cancelLink == options.cancelButton == false ? false : undefined)));
  fallback('okControl', (options.okLink ? 'link' : (options.okButton ? 'button' :
    options.okLink == options.okButton == false ? false : undefined)));
  fallback('highlightColor', options.highlightcolor);
  fallback('highlightEndColor', options.highlightendcolor);
};

Object.extend(Ajax.InPlaceEditor, {
  DefaultOptions: {
    ajaxOptions: { },
    autoRows: 3,                                // Use when multi-line w/ rows == 1
    cancelControl: 'link',                      // 'link'|'button'|false
    cancelText: 'cancel',
    clickToEditText: 'Click to edit',
    externalControl: null,                      // id|elt
    externalControlOnly: false,
    fieldPostCreation: 'activate',              // 'activate'|'focus'|false
    formClassName: 'inplaceeditor-form',
    formId: null,                               // id|elt
    highlightColor: '#ffff99',
    highlightEndColor: '#ffffff',
    hoverClassName: '',
    htmlResponse: true,
    loadingClassName: 'inplaceeditor-loading',
    loadingText: 'Loading...',
    okControl: 'button',                        // 'link'|'button'|false
    okText: 'ok',
    paramName: 'value',
    rows: 1,                                    // If 1 and multi-line, uses autoRows
    savingClassName: 'inplaceeditor-saving',
    savingText: 'Saving...',
    size: 0,
    stripLoadedTextTags: false,
    submitOnBlur: false,
    textAfterControls: '',
    textBeforeControls: '',
    textBetweenControls: ''
  },
  DefaultCallbacks: {
    callback: function(form) {
      return Form.serialize(form);
    },
    onComplete: function(transport, element) {
      // For backward compatibility, this one is bound to the IPE, and passes
      // the element directly.  It was too often customized, so we don't break it.
      new Effect.Highlight(element, {
        startcolor: this.options.highlightColor, keepBackgroundImage: true });
    },
    onEnterEditMode: null,
    onEnterHover: function(ipe) {
      ipe.element.style.backgroundColor = ipe.options.highlightColor;
      if (ipe._effect)
        ipe._effect.cancel();
    },
    onFailure: function(transport, ipe) {
      alert('Error communication with the server: ' + transport.responseText.stripTags());
    },
    onFormCustomization: null, // Takes the IPE and its generated form, after editor, before controls.
    onLeaveEditMode: null,
    onLeaveHover: function(ipe) {
      ipe._effect = new Effect.Highlight(ipe.element, {
        startcolor: ipe.options.highlightColor, endcolor: ipe.options.highlightEndColor,
        restorecolor: ipe._originalBackground, keepBackgroundImage: true
      });
    }
  },
  Listeners: {
    click: 'enterEditMode',
    keydown: 'checkForEscapeOrReturn',
    mouseover: 'enterHover',
    mouseout: 'leaveHover'
  }
});

Ajax.InPlaceCollectionEditor.DefaultOptions = {
  loadingCollectionText: 'Loading options...'
};

// Delayed observer, like Form.Element.Observer,
// but waits for delay after last key input
// Ideal for live-search fields

Form.Element.DelayedObserver = Class.create({
  initialize: function(element, delay, callback) {
    this.delay     = delay || 0.5;
    this.element   = $(element);
    this.callback  = callback;
    this.timer     = null;
    this.lastValue = $F(this.element);
    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
  },
  delayedListener: function(event) {
    if(this.lastValue == $F(this.element)) return;
    if(this.timer) clearTimeout(this.timer);
    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
    this.lastValue = $F(this.element);
  },
  onTimerEvent: function() {
    this.timer = null;
    this.callback(this.element, $F(this.element));
  }
});
// script.aculo.us slider.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008

// Copyright (c) 2005-2008 Marty Haught, Thomas Fuchs
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if (!Control) var Control = { };

// options:
//  axis: 'vertical', or 'horizontal' (default)
//
// callbacks:
//  onChange(value)
//  onSlide(value)
Control.Slider = Class.create({
  initialize: function(handle, track, options) {
    var slider = this;

    if (Object.isArray(handle)) {
      this.handles = handle.collect( function(e) { return $(e) });
    } else {
      this.handles = [$(handle)];
    }

    this.track   = $(track);
    this.options = options || { };

    this.axis      = this.options.axis || 'horizontal';
    this.increment = this.options.increment || 1;
    this.step      = parseInt(this.options.step || '1');
    this.range     = this.options.range || $R(0,1);

    this.value     = 0; // assure backwards compat
    this.values    = this.handles.map( function() { return 0 });
    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
    this.options.startSpan = $(this.options.startSpan || null);
    this.options.endSpan   = $(this.options.endSpan || null);

    this.restricted = this.options.restricted || false;

    this.maximum   = this.options.maximum || this.range.end;
    this.minimum   = this.options.minimum || this.range.start;

    // Will be used to align the handle onto the track, if necessary
    this.alignX = parseInt(this.options.alignX || '0');
    this.alignY = parseInt(this.options.alignY || '0');

    this.trackLength = this.maximumOffset() - this.minimumOffset();

    this.handleLength = this.isVertical() ?
      (this.handles[0].offsetHeight != 0 ?
        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
        this.handles[0].style.width.replace(/px$/,""));

    this.active   = false;
    this.dragging = false;
    this.disabled = false;

    if (this.options.disabled) this.setDisabled();

    // Allowed values array
    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
    if (this.allowedValues) {
      this.minimum = this.allowedValues.min();
      this.maximum = this.allowedValues.max();
    }

    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
    this.eventMouseMove = this.update.bindAsEventListener(this);

    // Initialize handles in reverse (make sure first handle is active)
    this.handles.each( function(h,i) {
      i = slider.handles.length-1-i;
      slider.setValue(parseFloat(
        (Object.isArray(slider.options.sliderValue) ?
          slider.options.sliderValue[i] : slider.options.sliderValue) ||
         slider.range.start), i);
      h.makePositioned().observe("mousedown", slider.eventMouseDown);
    });

    this.track.observe("mousedown", this.eventMouseDown);
    document.observe("mouseup", this.eventMouseUp);
    $(this.track.parentNode.parentNode).observe("mousemove", this.eventMouseMove);


    this.initialized = true;
  },
  dispose: function() {
    var slider = this;
    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
    Event.stopObserving(document, "mouseup", this.eventMouseUp);
    Event.stopObserving(this.track.parentNode.parentNode, "mousemove", this.eventMouseMove);
    this.handles.each( function(h) {
      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
    });
  },
  setDisabled: function(){
    this.disabled = true;
    this.track.parentNode.className = this.track.parentNode.className + ' disabled';
  },
  setEnabled: function(){
    this.disabled = false;
  },
  getNearestValue: function(value){
    if (this.allowedValues){
      if (value >= this.allowedValues.max()) return(this.allowedValues.max());
      if (value <= this.allowedValues.min()) return(this.allowedValues.min());

      var offset = Math.abs(this.allowedValues[0] - value);
      var newValue = this.allowedValues[0];
      this.allowedValues.each( function(v) {
        var currentOffset = Math.abs(v - value);
        if (currentOffset <= offset){
          newValue = v;
          offset = currentOffset;
        }
      });
      return newValue;
    }
    if (value > this.range.end) return this.range.end;
    if (value < this.range.start) return this.range.start;
    return value;
  },
  setValue: function(sliderValue, handleIdx){
    if (!this.active) {
      this.activeHandleIdx = handleIdx || 0;
      this.activeHandle    = this.handles[this.activeHandleIdx];
      this.updateStyles();
    }
    handleIdx = handleIdx || this.activeHandleIdx || 0;
    if (this.initialized && this.restricted) {
      if ((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
        sliderValue = this.values[handleIdx-1];
      if ((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
        sliderValue = this.values[handleIdx+1];
    }
    sliderValue = this.getNearestValue(sliderValue);
    this.values[handleIdx] = sliderValue;
    this.value = this.values[0]; // assure backwards compat

    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
      this.translateToPx(sliderValue);

    this.drawSpans();
    if (!this.dragging || !this.event) this.updateFinished();
  },
  setValueBy: function(delta, handleIdx) {
    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
      handleIdx || this.activeHandleIdx || 0);
  },
  translateToPx: function(value) {
    return Math.round(
      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
      (value - this.range.start)) + "px";
  },
  translateToValue: function(offset) {
    return ((offset/(this.trackLength-this.handleLength) *
      (this.range.end-this.range.start)) + this.range.start);
  },
  getRange: function(range) {
    var v = this.values.sortBy(Prototype.K);
    range = range || 0;
    return $R(v[range],v[range+1]);
  },
  minimumOffset: function(){
    return(this.isVertical() ? this.alignY : this.alignX);
  },
  maximumOffset: function(){
    return(this.isVertical() ?
      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
        this.track.style.height.replace(/px$/,"")) - this.alignY :
      (this.track.offsetWidth != 0 ? this.track.offsetWidth :
        this.track.style.width.replace(/px$/,"")) - this.alignX);
  },
  isVertical:  function(){
    return (this.axis == 'vertical');
  },
  drawSpans: function() {
    var slider = this;
    if (this.spans)
      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
    if (this.options.startSpan)
      this.setSpan(this.options.startSpan,
        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
    if (this.options.endSpan)
      this.setSpan(this.options.endSpan,
        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
  },
  setSpan: function(span, range) {
    if (this.isVertical()) {
      span.style.top = this.translateToPx(range.start);
      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
    } else {
      span.style.left = this.translateToPx(range.start);
      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
    }
  },
  updateStyles: function() {
    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
    Element.addClassName(this.activeHandle, 'selected');
  },
  startDrag: function(event) {
    if (Event.isLeftClick(event)) {
      if (!this.disabled){
        this.active = true;

        var handle = Event.element(event);
        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
        var track = handle;
        if (track==this.track) {
          var offsets  = Position.cumulativeOffset(this.track);
          this.event = event;
          this.setValue(this.translateToValue(
           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
          ));
          var offsets  = Position.cumulativeOffset(this.activeHandle);
          this.offsetX = (pointer[0] - offsets[0]);
          this.offsetY = (pointer[1] - offsets[1]);
        } else {
          // find the handle (prevents issues with Safari)
          while((this.handles.indexOf(handle) == -1) && handle.parentNode)
            handle = handle.parentNode;

          if (this.handles.indexOf(handle)!=-1) {
            this.activeHandle    = handle;
            this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
            this.updateStyles();

            var offsets  = Position.cumulativeOffset(this.activeHandle);
            this.offsetX = (pointer[0] - offsets[0]);
            this.offsetY = (pointer[1] - offsets[1]);
          }
        }
      }
      Event.stop(event);
    }
  },
  update: function(event) {
   if (this.active) {
      if (!this.dragging) this.dragging = true;
      this.draw(event);
      if (Prototype.Browser.WebKit) window.scrollBy(0,0);
      Event.stop(event);
   }
  },
  draw: function(event) {
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    var offsets = Position.cumulativeOffset(this.track);
    pointer[0] -= this.offsetX + offsets[0];
    pointer[1] -= this.offsetY + offsets[1];
    this.event = event;
    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
    if (this.initialized && this.options.onSlide)
      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
  },
  endDrag: function(event) {
    if (this.active && this.dragging) {
      this.finishDrag(event, true);
      Event.stop(event);
    }
    this.active = false;
    this.dragging = false;
  },
  finishDrag: function(event, success) {
    this.active = false;
    this.dragging = false;
    this.updateFinished();
  },
  updateFinished: function() {
    if (this.initialized && this.options.onChange)
      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
    this.event = null;
  }
});
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Varien
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
VarienForm = Class.create();
VarienForm.prototype = {
    initialize: function(formId, firstFieldFocus){
        this.form       = $(formId);
        if (!this.form) {
            return;
        }
        this.cache      = $A();
        this.currLoader = false;
        this.currDataIndex = false;
        this.validator  = new Validation(this.form);
        this.elementFocus   = this.elementOnFocus.bindAsEventListener(this);
        this.elementBlur    = this.elementOnBlur.bindAsEventListener(this);
        this.childLoader    = this.onChangeChildLoad.bindAsEventListener(this);
        this.highlightClass = 'highlight';
        this.extraChildParams = '';
        this.firstFieldFocus= firstFieldFocus || false;
        this.bindElements();
        if(this.firstFieldFocus){
            try{
                Form.Element.focus(Form.findFirstElement(this.form))
            }
            catch(e){}
        }
    },

    submit : function(url){
        if(this.validator && this.validator.validate()){
             this.form.submit();
        }
        return false;
    },

    bindElements:function (){
        var elements = Form.getElements(this.form);
        for (var row in elements) {
            if (elements[row].id) {
                Event.observe(elements[row],'focus',this.elementFocus);
                Event.observe(elements[row],'blur',this.elementBlur);
            }
        }
    },

    elementOnFocus: function(event){
        var element = Event.findElement(event, 'fieldset');
        if(element){
            Element.addClassName(element, this.highlightClass);
        }
    },

    elementOnBlur: function(event){
        var element = Event.findElement(event, 'fieldset');
        if(element){
            Element.removeClassName(element, this.highlightClass);
        }
    },

    setElementsRelation: function(parent, child, dataUrl, first){
        if (parent=$(parent)) {
            // TODO: array of relation and caching
            if (!this.cache[parent.id]){
                this.cache[parent.id] = $A();
                this.cache[parent.id]['child']     = child;
                this.cache[parent.id]['dataUrl']   = dataUrl;
                this.cache[parent.id]['data']      = $A();
                this.cache[parent.id]['first']      = first || false;
            }
            Event.observe(parent,'change',this.childLoader);
        }
    },

    onChangeChildLoad: function(event){
        element = Event.element(event);
        this.elementChildLoad(element);
    },

    elementChildLoad: function(element, callback){
        this.callback = callback || false;
        if (element.value) {
            this.currLoader = element.id;
            this.currDataIndex = element.value;
            if (this.cache[element.id]['data'][element.value]) {
                this.setDataToChild(this.cache[element.id]['data'][element.value]);
            }
            else{
                new Ajax.Request(this.cache[this.currLoader]['dataUrl'],{
                        method: 'post',
                        parameters: {"parent":element.value},
                        onComplete: this.reloadChildren.bind(this)
                });
            }
        }
    },

    reloadChildren: function(transport){
        var data = eval('(' + transport.responseText + ')');
        this.cache[this.currLoader]['data'][this.currDataIndex] = data;
        this.setDataToChild(data);
    },

    setDataToChild: function(data){
        if (data.length) {
            var child = $(this.cache[this.currLoader]['child']);
            if (child){
                var html = '<select name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
                if(this.cache[this.currLoader]['first']){
                    html+= '<option value="">'+this.cache[this.currLoader]['first']+'</option>';
                }
                for (var i in data){
                    if(data[i].value) {
                        html+= '<option value="'+data[i].value+'"';
                        if(child.value && (child.value == data[i].value || child.value == data[i].label)){
                            html+= ' selected';
                        }
                        html+='>'+data[i].label+'</option>';
                    }
                }
                html+= '</select>';
                Element.insert(child, {before: html});
                Element.remove(child);
            }
        }
        else{
            var child = $(this.cache[this.currLoader]['child']);
            if (child){
                var html = '<input type="text" name="'+child.name+'" id="'+child.id+'" class="'+child.className+'" title="'+child.title+'" '+this.extraChildParams+'>';
                Element.insert(child, {before: html});
                Element.remove(child);
            }
        }

        this.bindElements();
        if (this.callback) {
            this.callback();
        }
    }
}

RegionUpdater = Class.create();
RegionUpdater.prototype = {
    initialize: function (countryEl, regionTextEl, regionSelectEl, regions, disableAction, zipEl)
    {
        this.countryEl = $(countryEl);
        this.regionTextEl = $(regionTextEl);
        this.regionSelectEl = $(regionSelectEl);
        this.zipEl = $(zipEl);
        this.regions = regions;

        this.disableAction = (typeof disableAction=='undefined') ? 'hide' : disableAction;
        this.zipOptions = (typeof zipOptions=='undefined') ? false : zipOptions;

        if (this.regionSelectEl.options.length<=1) {
            this.update();
        }

        Event.observe(this.countryEl, 'change', this.update.bind(this));
    },

    update: function()
    {
        if (this.regions[this.countryEl.value]) {
            var i, option, region, def;

            if (this.regionTextEl) {
                def = this.regionTextEl.value.toLowerCase();
                this.regionTextEl.value = '';
            }
            if (!def) {
                def = this.regionSelectEl.getAttribute('defaultValue');
            }

            this.regionSelectEl.options.length = 1;
            for (regionId in this.regions[this.countryEl.value]) {
                region = this.regions[this.countryEl.value][regionId];

                option = document.createElement('OPTION');
                option.value = regionId;
                option.text = region.name;

                if (this.regionSelectEl.options.add) {
                    this.regionSelectEl.options.add(option);
                } else {
                    this.regionSelectEl.appendChild(option);
                }

                if (regionId==def || region.name.toLowerCase()==def || region.code.toLowerCase()==def) {
                    this.regionSelectEl.value = regionId;
                }
            }

            if (this.disableAction=='hide') {
                if (this.regionTextEl) {
                    this.regionTextEl.style.display = 'none';
                }

                this.regionSelectEl.style.display = '';
            } else if (this.disableAction=='disable') {
                if (this.regionTextEl) {
                    this.regionTextEl.disabled = true;
                }
                this.regionSelectEl.disabled = false;
            }
            this.setMarkDisplay(this.regionSelectEl, true);
        } else {
            if (this.disableAction=='hide') {
                if (this.regionTextEl) {
                    this.regionTextEl.style.display = '';
                }
                this.regionSelectEl.style.display = 'none';
                Validation.reset(this.regionSelectEl);
            } else if (this.disableAction=='disable') {
                if (this.regionTextEl) {
                    this.regionTextEl.disabled = false;
                }
                this.regionSelectEl.disabled = true;
            } else if (this.disableAction=='nullify') {
                this.regionSelectEl.options.length = 1;
                this.regionSelectEl.value = '';
                this.regionSelectEl.selectedIndex = 0;
                this.lastCountryId = '';
            }
            this.setMarkDisplay(this.regionSelectEl, false);
        }

        // Make Zip and its label required/optional
        var zipUpdater = new ZipUpdater(this.countryEl.value, this.zipEl);
        zipUpdater.update();
    },

    setMarkDisplay: function(elem, display){
        elem = $(elem);
        var labelElement = elem.up(0).down('label > span.required') ||
                           elem.up(1).down('label > span.required') ||
                           elem.up(0).down('label.required > em') ||
                           elem.up(1).down('label.required > em');
        if(labelElement) {
            inputElement = labelElement.up().next('input');
            if (display) {
                labelElement.show();
                if (inputElement) {
                    inputElement.addClassName('required-entry');
                }
            } else {
                labelElement.hide();
                if (inputElement) {
                    inputElement.removeClassName('required-entry');
                }
            }
        }
    }
}

ZipUpdater = Class.create();
ZipUpdater.prototype = {
    initialize: function(country, zipElement)
    {
        this.country = country;
        this.zipElement = $(zipElement);
    },

    update: function()
    {
        // Country ISO 2-letter codes must be pre-defined
        if (typeof optionalZipCountries == 'undefined') {
            return false;
        }

        // Ajax-request and normal content load compatibility
        if (this.zipElement != undefined) {
            this._setPostcodeOptional();
        } else {
            Event.observe(window, "load", this._setPostcodeOptional.bind(this));
        }
    },

    _setPostcodeOptional: function()
    {
        this.zipElement = $(this.zipElement);
        if (this.zipElement == undefined) {
            return false;
        }

        // find label
        var label = $$('label[for="' + this.zipElement.id + '"]')[0];
        if (label != undefined) {
            var wildCard = label.down('em') || label.down('span.required');
        }

        // Make Zip and its label required/optional
        if (optionalZipCountries.indexOf(this.country) != -1) {
            while (this.zipElement.hasClassName('required-entry')) {
                this.zipElement.removeClassName('required-entry');
            }
            if (wildCard != undefined) {
                wildCard.hide();
            }
        } else {
            this.zipElement.addClassName('required-entry');
            if (wildCard != undefined) {
                wildCard.show();
            }
        }
    }
}

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Varien
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */

/**
 * @classDescription simple Navigation with replacing old handlers
 * @param {String} id id of ul element with navigation lists
 * @param {Object} settings object with settings
 */
var mainNav = function() {

    var main = {
        obj_nav :   $(arguments[0]) || $("nav"),

        settings :  {
            show_delay      :   0,
            hide_delay      :   0,
            _ie6            :   /MSIE 6.+Win/.test(navigator.userAgent),
            _ie7            :   /MSIE 7.+Win/.test(navigator.userAgent)
        },

        init :  function(obj, level) {
            obj.lists = obj.childElements();
            obj.lists.each(function(el,ind){
                main.handlNavElement(el);
                if((main.settings._ie6 || main.settings._ie7) && level){
                    main.ieFixZIndex(el, ind, obj.lists.size());
                }
            });
            if(main.settings._ie6 && !level){
                document.execCommand("BackgroundImageCache", false, true);
            }
        },

        handlNavElement :   function(list) {
            if(list !== undefined){
                list.onmouseover = function(){
                    main.fireNavEvent(this,true);
                };
                list.onmouseout = function(){
                    main.fireNavEvent(this,false);
                };
                if(list.down("ul")){
                    main.init(list.down("ul"), true);
                }
            }
        },

        ieFixZIndex : function(el, i, l) {
            if(el.tagName.toString().toLowerCase().indexOf("iframe") == -1){
                el.style.zIndex = l - i;
            } else {
                el.onmouseover = "null";
                el.onmouseout = "null";
            }
        },

        fireNavEvent :  function(elm,ev) {
            if(ev){
                elm.addClassName("over");
                elm.down("a").addClassName("over");
                if (elm.childElements()[1]) {
                    main.show(elm.childElements()[1]);
                }
            } else {
                elm.removeClassName("over");
                elm.down("a").removeClassName("over");
                if (elm.childElements()[1]) {
                    main.hide(elm.childElements()[1]);
                }
            }
        },

        show : function (sub_elm) {
            if (sub_elm.hide_time_id) {
                clearTimeout(sub_elm.hide_time_id);
            }
            sub_elm.show_time_id = setTimeout(function() {
                if (!sub_elm.hasClassName("shown-sub")) {
                    sub_elm.addClassName("shown-sub");
                }
            }, main.settings.show_delay);
        },

        hide : function (sub_elm) {
            if (sub_elm.show_time_id) {
                clearTimeout(sub_elm.show_time_id);
            }
            sub_elm.hide_time_id = setTimeout(function(){
                if (sub_elm.hasClassName("shown-sub")) {
                    sub_elm.removeClassName("shown-sub");
                }
            }, main.settings.hide_delay);
        }

    };
    if (arguments[1]) {
        main.settings = Object.extend(main.settings, arguments[1]);
    }
    if (main.obj_nav) {
        main.init(main.obj_nav, false);
    }
};

document.observe("dom:loaded", function() {
    //run navigation without delays and with default id="#nav"
    //mainNav();

    //run navigation with delays
    mainNav("nav", {"show_delay":"100","hide_delay":"100"});
});

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@magentocommerce.com so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     js
 * @copyright   Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
 */
// old school cookie functions grabbed off the web

if (!window.Mage) var Mage = {};

Mage.Cookies = {};
Mage.Cookies.expires  = null;
Mage.Cookies.path     = '/';
Mage.Cookies.domain   = null;
Mage.Cookies.secure   = false;
Mage.Cookies.set = function(name, value){
     var argv = arguments;
     var argc = arguments.length;
     var expires = (argc > 2) ? argv[2] : Mage.Cookies.expires;
     var path = (argc > 3) ? argv[3] : Mage.Cookies.path;
     var domain = (argc > 4) ? argv[4] : Mage.Cookies.domain;
     var secure = (argc > 5) ? argv[5] : Mage.Cookies.secure;
     document.cookie = name + "=" + escape (value) +
       ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
       ((path == null) ? "" : ("; path=" + path)) +
       ((domain == null) ? "" : ("; domain=" + domain)) +
       ((secure == true) ? "; secure" : "");
};

Mage.Cookies.get = function(name){
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    var j = 0;
    while(i < clen){
        j = i + alen;
        if (document.cookie.substring(i, j) == arg)
            return Mage.Cookies.getCookieVal(j);
        i = document.cookie.indexOf(" ", i) + 1;
        if(i == 0)
            break;
    }
    return null;
};

Mage.Cookies.clear = function(name) {
  if(Mage.Cookies.get(name)){
    document.cookie = name + "=" +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
};

Mage.Cookies.getCookieVal = function(offset){
   var endstr = document.cookie.indexOf(";", offset);
   if(endstr == -1){
       endstr = document.cookie.length;
   }
   return unescape(document.cookie.substring(offset, endstr));
};

/*!
 * jQuery JavaScript Library v1.5.2
 * http://jquery.com/
 *
 * Copyright 2011, John Resig
 * Dual licensed under the MIT or GPL Version 2 licenses.
 * http://jquery.org/license
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 * Copyright 2011, The Dojo Foundation
 * Released under the MIT, BSD, and GPL Licenses.
 *
 * Date: Thu Mar 31 15:28:23 2011 -0400
 */
(function(a,b){function ci(a){return d.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cf(a){if(!b_[a]){var b=d("<"+a+">").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";b_[a]=c}return b_[a]}function ce(a,b){var c={};d.each(cd.concat.apply([],cd.slice(0,b)),function(){c[this]=a});return c}function b$(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bZ(){try{return new a.XMLHttpRequest}catch(b){}}function bY(){d(a).unload(function(){for(var a in bW)bW[a](0,1)})}function bS(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h==="string"&&(f[h.toLowerCase()]=a.converters[h]);l=k,k=e[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=f[m]||f["* "+k];if(!n){p=b;for(o in f){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=f[j[1]+" "+k];if(p){o=f[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&d.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bR(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bQ(a,b,c,e){if(d.isArray(b)&&b.length)d.each(b,function(b,f){c||bs.test(a)?e(a,f):bQ(a+"["+(typeof f==="object"||d.isArray(f)?b:"")+"]",f,c,e)});else if(c||b==null||typeof b!=="object")e(a,b);else if(d.isArray(b)||d.isEmptyObject(b))e(a,"");else for(var f in b)bQ(a+"["+f+"]",b[f],c,e)}function bP(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bJ,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bP(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bP(a,c,d,e,"*",g));return l}function bO(a){return function(b,c){typeof b!=="string"&&(c=b,b="*");if(d.isFunction(c)){var e=b.toLowerCase().split(bD),f=0,g=e.length,h,i,j;for(;f<g;f++)h=e[f],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bq(a,b,c){var e=b==="width"?bk:bl,f=b==="width"?a.offsetWidth:a.offsetHeight;if(c==="border")return f;d.each(e,function(){c||(f-=parseFloat(d.css(a,"padding"+this))||0),c==="margin"?f+=parseFloat(d.css(a,"margin"+this))||0:f-=parseFloat(d.css(a,"border"+this+"Width"))||0});return f}function bc(a,b){b.src?d.ajax({url:b.src,async:!1,dataType:"script"}):d.globalEval(b.text||b.textContent||b.innerHTML||""),b.parentNode&&b.parentNode.removeChild(b)}function bb(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function ba(a,b){if(b.nodeType===1){var c=b.nodeName.toLowerCase();b.clearAttributes(),b.mergeAttributes(a);if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(d.expando)}}function _(a,b){if(b.nodeType===1&&d.hasData(a)){var c=d.expando,e=d.data(a),f=d.data(b,e);if(e=e[c]){var g=e.events;f=f[c]=d.extend({},e);if(g){delete f.handle,f.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)d.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function $(a,b){return d.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Q(a,b,c){if(d.isFunction(b))return d.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return d.grep(a,function(a,d){return a===b===c});if(typeof b==="string"){var e=d.grep(a,function(a){return a.nodeType===1});if(L.test(b))return d.filter(b,e,!c);b=d.filter(b,e)}return d.grep(a,function(a,e){return d.inArray(a,b)>=0===c})}function P(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function H(a,b){return(a&&a!=="*"?a+".":"")+b.replace(t,"`").replace(u,"&")}function G(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p=[],q=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;i<t.length;i++)g=t[i],g.origType.replace(r,"")===a.type?q.push(g.selector):t.splice(i--,1);f=d(a.target).closest(q,a.currentTarget);for(j=0,k=f.length;j<k;j++){m=f[j];for(i=0;i<t.length;i++){g=t[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,e=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,e=d(a.relatedTarget).closest(g.selector)[0];(!e||e!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){f=p[j];if(c&&f.level>c)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function E(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function y(){return!0}function x(){return!1}function i(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function h(a,c,e){if(e===b&&a.nodeType===1){e=a.getAttribute("data-"+c);if(typeof e==="string"){try{e=e==="true"?!0:e==="false"?!1:e==="null"?null:d.isNaN(e)?g.test(e)?d.parseJSON(e):e:parseFloat(e)}catch(f){}d.data(a,c,e)}else e=b}return e}var c=a.document,d=function(){function G(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(G,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x,y,z=Object.prototype.toString,A=Object.prototype.hasOwnProperty,B=Array.prototype.push,C=Array.prototype.slice,D=String.prototype.trim,E=Array.prototype.indexOf,F={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return C.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?B.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),x.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(C.apply(this,arguments),"slice",C.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:B,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){e=i[c],f=a[c];if(i===f)continue;l&&f&&(d.isPlainObject(f)||(g=d.isArray(f)))?(g?(g=!1,h=e&&d.isArray(e)?e:[]):h=e&&d.isPlainObject(e)?e:{},i[c]=d.extend(l,h,f)):f!==b&&(i[c]=f)}return i},d.extend({noConflict:function(b){a.$=f,b&&(a.jQuery=e);return d},isReady:!1,readyWait:1,ready:function(a){a===!0&&d.readyWait--;if(!d.readyWait||a!==!0&&!d.isReady){if(!c.body)return setTimeout(d.ready,1);d.isReady=!0;if(a!==!0&&--d.readyWait>0)return;x.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=d._Deferred();if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",y,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",y),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&G()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):F[z.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!A.call(a,"constructor")&&!A.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||A.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g<h;)if(c.apply(a[g++],e)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(var j=a[0];g<h&&c.call(j,g,j)!==!1;j=a[++g]){}return a},trim:D?function(a){return a==null?"":D.call(a)}:function(a){return a==null?"":(a+"").replace(j,"").replace(k,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var e=d.type(a);a.length==null||e==="string"||e==="function"||e==="regexp"||d.isWindow(a)?B.call(c,a):d.merge(c,a)}return c},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length==="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,b,c){var d=[],e;for(var f=0,g=a.length;f<g;f++)e=b(a[f],f,c),e!=null&&(d[d.length]=e);return d.concat.apply([],d)},guid:1,proxy:function(a,c,e){arguments.length===2&&(typeof c==="string"?(e=a,a=e[c],c=b):c&&!d.isFunction(c)&&(e=c,c=b)),!c&&a&&(c=function(){return a.apply(e||this,arguments)}),a&&(c.guid=a.guid=a.guid||c.guid||d.guid++);return c},access:function(a,c,e,f,g,h){var i=a.length;if(typeof c==="object"){for(var j in c)d.access(a,j,c[j],f,g,e);return a}if(e!==b){f=!h&&f&&d.isFunction(e);for(var k=0;k<i;k++)g(a[k],c,f?e.call(a[k],k,g(a[k],c)):e,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){F["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),E&&(d.inArray=function(a,b){return E.call(b,a)}),i.test("Â ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?y=function(){c.removeEventListener("DOMContentLoaded",y,!1),d.ready()}:c.attachEvent&&(y=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",y),d.ready())});return d}(),e="then done fail isResolved isRejected promise".split(" "),f=[].slice;d.extend({_Deferred:function(){var a=[],b,c,e,f={done:function(){if(!e){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=d.type(i),j==="array"?f.done.apply(f,i):j==="function"&&a.push(i);k&&f.resolveWith(k[0],k[1])}return this},resolveWith:function(d,f){if(!e&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(d,f)}finally{b=[d,f],c=0}}return this},resolve:function(){f.resolveWith(this,arguments);return this},isResolved:function(){return c||b},cancel:function(){e=1,a=[];return this}};return f},Deferred:function(a){var b=d._Deferred(),c=d._Deferred(),f;d.extend(b,{then:function(a,c){b.done(a).fail(c);return this},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,promise:function(a){if(a==null){if(f)return f;f=a={}}var c=e.length;while(c--)a[e[c]]=b[e[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?f.call(arguments,0):c,--g||h.resolveWith(h,f.call(b,0))}}var b=arguments,c=0,e=b.length,g=e,h=e<=1&&a&&d.isFunction(a.promise)?a:d.Deferred();if(e>1){for(;c<e;c++)b[c]&&d.isFunction(b[c].promise)?b[c].promise().then(i(c),h.reject):--g;g||h.resolveWith(h,b)}else h!==a&&h.resolveWith(h,e?[a]:[]);return h.promise()}}),function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0,reliableMarginRight:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e)}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(a.style.width="1px",a.style.marginRight="0",d.support.reliableMarginRight=(parseInt(c.defaultView.getComputedStyle(a,null).marginRight,10)||0)===0),b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}}();var g=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!i(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,g=b.nodeType,h=g?d.cache:b,j=g?b[d.expando]:d.expando;if(!h[j])return;if(c){var k=e?h[j][f]:h[j];if(k){delete k[c];if(!i(k))return}}if(e){delete h[j][f];if(!i(h[j]))return}var l=h[j][f];d.support.deleteExpando||h!=a?delete h[j]:h[j]=null,l?(h[j]={},g||(h[j].toJSON=d.noop),h[j][f]=l):g&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var f=this[0].attributes,g;for(var i=0,j=f.length;i<j;i++)g=f[i].name,g.indexOf("data-")===0&&(g=g.substr(5),h(this[0],g,e[g]))}}return e}if(typeof a==="object")return this.each(function(){d.data(this,a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(c===b){e=this.triggerHandler("getData"+k[1]+"!",[k[0]]),e===b&&this.length&&(e=d.data(this[0],a),e=h(this[0],a,e));return e===b&&k[1]?this.data(k[0]):e}return this.each(function(){var b=d(this),e=[k[0],c];b.triggerHandler("setData"+k[1]+"!",e),d.data(this,a,c),b.triggerHandler("changeData"+k[1]+"!",e)})},removeData:function(a){return this.each(function(){d.removeData(this,a)})}}),d.extend({queue:function(a,b,c){if(a){b=(b||"fx")+"queue";var e=d._data(a,b);if(!c)return e||[];!e||d.isArray(c)?e=d._data(a,b,d.makeArray(c)):e.push(c);return e}},dequeue:function(a,b){b=b||"fx";var c=d.queue(a,b),e=c.shift();e==="inprogress"&&(e=c.shift()),e&&(b==="fx"&&c.unshift("inprogress"),e.call(a,function(){d.dequeue(a,b)})),c.length||d.removeData(a,b+"queue",!0)}}),d.fn.extend({queue:function(a,c){typeof a!=="string"&&(c=a,a="fx");if(c===b)return d.queue(this[0],a);return this.each(function(b){var e=d.queue(this,a,c);a==="fx"&&e[0]!=="inprogress"&&d.dequeue(this,a)})},dequeue:function(a){return this.each(function(){d.dequeue(this,a)})},delay:function(a,b){a=d.fx?d.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){d.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var j=/[\n\t\r]/g,k=/\s+/,l=/\r/g,m=/^(?:href|src|style)$/,n=/^(?:button|input)$/i,o=/^(?:button|input|object|select|textarea)$/i,p=/^a(?:rea)?$/i,q=/^(?:radio|checkbox)$/i;d.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"},d.fn.extend({attr:function(a,b){return d.access(this,a,b,!0,d.attr)},removeAttr:function(a,b){return this.each(function(){d.attr(this,a,""),this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.addClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"){var b=(a||"").split(k);for(var c=0,e=this.length;c<e;c++){var f=this[c];if(f.nodeType===1)if(f.className){var g=" "+f.className+" ",h=f.className;for(var i=0,j=b.length;i<j;i++)g.indexOf(" "+b[i]+" ")<0&&(h+=" "+b[i]);f.className=d.trim(h)}else f.className=a}}return this},removeClass:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.removeClass(a.call(this,b,c.attr("class")))});if(a&&typeof a==="string"||a===b){var c=(a||"").split(k);for(var e=0,f=this.length;e<f;e++){var g=this[e];if(g.nodeType===1&&g.className)if(a){var h=(" "+g.className+" ").replace(j," ");for(var i=0,l=c.length;i<l;i++)h=h.replace(" "+c[i]+" "," ");g.className=d.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,e=typeof b==="boolean";if(d.isFunction(a))return this.each(function(c){var e=d(this);e.toggleClass(a.call(this,c,e.attr("class"),b),b)});return this.each(function(){if(c==="string"){var f,g=0,h=d(this),i=b,j=a.split(k);while(f=j[g++])i=e?i:!h.hasClass(f),h[i?"addClass":"removeClass"](f)}else if(c==="undefined"||c==="boolean")this.className&&d._data(this,"__className__",this.className),this.className=this.className||a===!1?"":d._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(j," ").indexOf(b)>-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var j=i?f:0,k=i?f+1:h.length;j<k;j++){var m=h[j];if(m.selected&&(d.support.optDisabled?!m.disabled:m.getAttribute("disabled")===null)&&(!m.parentNode.disabled||!d.nodeName(m.parentNode,"optgroup"))){a=d(m).val();if(i)return a;g.push(a)}}if(i&&!g.length&&h.length)return d(h[f]).val();return g}if(q.test(c.type)&&!d.support.checkOn)return c.getAttribute("value")===null?"on":c.value;return(c.value||"").replace(l,"")}return b}var n=d.isFunction(a);return this.each(function(b){var c=d(this),e=a;if(this.nodeType===1){n&&(e=a.call(this,b,c.val())),e==null?e="":typeof e==="number"?e+="":d.isArray(e)&&(e=d.map(e,function(a){return a==null?"":a+""}));if(d.isArray(e)&&q.test(this.type))this.checked=d.inArray(c.val(),e)>=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=m.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&n.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var k=a.getAttributeNode("tabIndex");return k&&k.specified?k.value:o.test(a.nodeName)||p.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var l=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return l===null?b:l}h&&(a[c]=e);return a[c]}});var r=/\.(.*)$/,s=/^(?:textarea|input|select)$/i,t=/\./g,u=/ /g,v=/[^\w\s.|`]/g,w=function(a){return a.replace(v,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=x;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(a){return typeof d!=="undefined"&&d.event.triggered!==a.type?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=x);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),w).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))d.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=d.event.special[h]||{};for(j=f||0;j<p.length;j++){q=p[j];if(e.guid===q.guid){if(l||n.test(q.namespace))f==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(f!=null)break}}if(p.length===0||f!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&d.removeEvent(a,h,s.handle),g=null,delete t[h]}if(d.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,d.isEmptyObject(s)&&d.removeData(a,b,!0)}}},trigger:function(a,c,e){var f=a.type||a,g=arguments[3];if(!g){a=typeof a==="object"?a[d.expando]?a:d.extend(d.Event(f),a):d.Event(f),f.indexOf("!")>=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(r,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=a.type,l[m]())}catch(p){}k&&(l["on"+m]=k),d.event.triggered=b}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l<m;l++){var n=f[l];if(e||h.test(n.namespace)){c.handler=n.handler,c.data=n.data,c.handleObj=n;var o=n.handler.apply(this,k);o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[d.expando])return a;var e=a;a=d.Event(e);for(var f=this.props.length,g;f;)g=this.props[--f],a[g]=e[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=c.documentElement,i=c.body;a.pageX=a.clientX+(h&&h.scrollLeft||i&&i.scrollLeft||0)-(h&&h.clientLeft||i&&i.clientLeft||0),a.pageY=a.clientY+(h&&h.scrollTop||i&&i.scrollTop||0)-(h&&h.clientTop||i&&i.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:d.proxy,special:{ready:{setup:d.bindReady,teardown:d.noop},live:{add:function(a){d.event.add(this,H(a.origType,a.selector),d.extend({},a,{handler:G,guid:a.handler.guid}))},remove:function(a){d.event.remove(this,H(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){d.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},d.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},d.Event=function(a){if(!this.preventDefault)return new d.Event(a);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?y:x):this.type=a,this.timeStamp=d.now(),this[d.expando]=!0},d.Event.prototype={preventDefault:function(){this.isDefaultPrevented=y;var a=this.originalEvent;a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=y;var a=this.originalEvent;a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=y,this.stopPropagation()},isDefaultPrevented:x,isPropagationStopped:x,isImmediatePropagationStopped:x};var z=function(a){var b=a.relatedTarget;try{if(b&&b!==c&&!b.parentNode)return;while(b&&b!==this)b=b.parentNode;b!==this&&(a.type=a.data,d.event.handle.apply(this,arguments))}catch(e){}},A=function(a){a.type=a.data,d.event.handle.apply(this,arguments)};d.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){d.event.special[a]={setup:function(c){d.event.add(this,b,c&&c.selector?A:z,a)},teardown:function(a){d.event.remove(this,b,a&&a.selector?A:z)}}}),d.support.submitBubbles||(d.event.special.submit={setup:function(a,b){if(this.nodeName&&this.nodeName.toLowerCase()!=="form")d.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&d(b).closest("form").length&&E("submit",this,arguments)}),d.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&d(b).closest("form").length&&a.keyCode===13&&E("submit",this,arguments)});else return!1},teardown:function(a){d.event.remove(this,".specialSubmit")}});if(!d.support.changeBubbles){var B,C=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},D=function D(a){var c=a.target,e,f;if(s.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=C(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:D,beforedeactivate:D,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&D.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&D.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",C(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in B)d.event.add(this,c+".specialChange",B[c]);return s.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return s.test(this.nodeName)}},B=d.event.special.change.filters,B.focus=B.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function f(a){var c=d.event.fix(a);c.type=b,c.originalEvent={},d.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var e=0;d.event.special[b]={setup:function(){e++===0&&c.addEventListener(a,f,!0)},teardown:function(){--e===0&&c.removeEventListener(a,f,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i<j;i++)d.event.add(this[i],a,h,e);return this}}),d.fn.extend({unbind:function(a,b){if(typeof a!=="object"||a.preventDefault)for(var e=0,f=this.length;e<f;e++)d.event.remove(this[e],a,b);else for(var c in a)this.unbind(c,a[c]);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){d.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var c=d.Event(a);c.preventDefault(),c.stopPropagation(),d.event.trigger(c,b,this[0]);return c.result}},toggle:function(a){var b=arguments,c=1;while(c<b.length)d.proxy(a,b[c++]);return this.click(d.proxy(a,function(e){var f=(d._data(this,"lastToggle"+a.guid)||0)%c;d._data(this,"lastToggle"+a.guid,f+1),e.preventDefault();return b[f].apply(this,arguments)||!1}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var F={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};d.each(["live","die"],function(a,c){d.fn[c]=function(a,e,f,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:d(this.context);if(typeof a==="object"&&!a.preventDefault){for(var o in a)n[c](o,e,a[o],m);return this}d.isFunction(e)&&(f=e,e=b),a=(a||"").split(" ");while((h=a[i++])!=null){j=r.exec(h),k="",j&&(k=j[0],h=h.replace(r,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,h==="focus"||h==="blur"?(a.push(F[h]+k),h=h+k):h=(F[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)d.event.add(n[p],"live."+H(h,m),{data:e,selector:m,handler:f,origType:h,origHandler:f,preType:l});else n.unbind("live."+H(h,m),f)}return this}}),d.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){d.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!=="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!=="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(f){if(f===!0)continue}else g=o=!0}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b==="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1){}a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=u;typeof b==="string"&&!j.test(b)&&(b=b.toLowerCase(),d=b,g=t),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!=="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!=="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!=="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return"text"===c&&(b===c||b===null)},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(a===b){g=!0;return 0}if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};d.find=k,d.expr=k.selectors,d.expr[":"]=d.expr.filters,d.unique=k.uniqueSort,d.text=k.getText,d.isXMLDoc=k.isXML,d.contains=k.contains}();var I=/Until$/,J=/^(?:parents|prevUntil|prevAll)/,K=/,/,L=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,N=d.expr.match.POS,O={children:!0,contents:!0,next:!0,prev:!0};d.fn.extend({find:function(a){var b=this.pushStack("","find",a),c=0;for(var e=0,f=this.length;e<f;e++){c=b.length,d.find(a,this[e],b);if(e>0)for(var g=c;g<b.length;g++)for(var h=0;h<c;h++)if(b[h]===b[g]){b.splice(g--,1);break}}return b},has:function(a){var b=d(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(d.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(Q(this,a,!1),"not",a)},filter:function(a){return this.pushStack(Q(this,a,!0),"filter",a)},is:function(a){return!!a&&d.filter(a,this).length>0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e<f;e++)i=a[e],j[i]||(j[i]=d.expr.match.POS.test(i)?d(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=N.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e<f;e++){g=this[e];while(g){if(l?l.index(g)>-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(P(c[0])||P(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=M.call(arguments);I.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!O[a]?d.unique(f):f,(this.length>1||K.test(e))&&J.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var R=/ jQuery\d+="(?:\d+|null)"/g,S=/^\s+/,T=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,U=/<([\w:]+)/,V=/<tbody/i,W=/<|&#?\w+;/,X=/<(?:script|object|embed|option|style)/i,Y=/checked\s*(?:[^=]|=\s*.checked.)/i,Z={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};Z.optgroup=Z.option,Z.tbody=Z.tfoot=Z.colgroup=Z.caption=Z.thead,Z.th=Z.td,d.support.htmlSerialize||(Z._default=[1,"div<div>","</div>"]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(R,""):null;if(typeof a!=="string"||X.test(a)||!d.support.leadingWhitespace&&S.test(a)||Z[(U.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(T,"<$1></$2>");try{for(var c=0,e=this.length;c<e;c++)this[c].nodeType===1&&(d.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(f){this.empty().append(a)}}return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(d.isFunction(a))return this.each(function(b){var c=d(this),e=c.html();c.replaceWith(a.call(this,b,e))});typeof a!=="string"&&(a=d(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;d(this).remove(),b?d(b).before(a):d(c).append(a)})}return this.length?this.pushStack(d(d.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,e){var f,g,h,i,j=a[0],k=[];if(!d.support.checkClone&&arguments.length===3&&typeof j==="string"&&Y.test(j))return this.each(function(){d(this).domManip(a,c,e,!0)});if(d.isFunction(j))return this.each(function(f){var g=d(this);a[0]=j.call(this,f,c?g.html():b),g.domManip(a,c,e)});if(this[0]){i=j&&j.parentNode,d.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?f={fragment:i}:f=d.buildFragment(a,this,k),h=f.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&d.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)e.call(c?$(this[l],g):this[l],f.cacheable||m>1&&l<n?d.clone(h,!0,!0):h)}k.length&&d.each(k,bc)}return this}}),d.buildFragment=function(a,b,e){var f,g,h,i=b&&b[0]?b[0].ownerDocument||b[0]:c;a.length===1&&typeof a[0]==="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!X.test(a[0])&&(d.support.checkClone||!Y.test(a[0]))&&(g=!0,h=d.fragments[a[0]],h&&(h!==1&&(f=h))),f||(f=i.createDocumentFragment(),d.clean(a,i,f,e)),g&&(d.fragments[a[0]]=h?f:1);return{fragment:f,cacheable:g}},d.fragments={},d.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){d.fn[a]=function(c){var e=[],f=d(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&f.length===1){f[b](this[0]);return this}for(var h=0,i=f.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){ba(a,e),f=bb(a),g=bb(e);for(h=0;f[h];++h)ba(f[h],g[h])}if(b){_(a,e);if(c){f=bb(a),g=bb(e);for(h=0;f[h];++h)_(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||W.test(i)){if(typeof i==="string"){i=i.replace(T,"<$1></$2>");var j=(U.exec(i)||["",""])[1].toLowerCase(),k=Z[j]||Z._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=V.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]==="<table>"&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&S.test(i)&&m.insertBefore(b.createTextNode(S.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bd=/alpha\([^)]*\)/i,be=/opacity=([^)]*)/,bf=/-([a-z])/ig,bg=/([A-Z]|^ms)/g,bh=/^-?\d+(?:px)?$/i,bi=/^-?\d/,bj={position:"absolute",visibility:"hidden",display:"block"},bk=["Left","Right"],bl=["Top","Bottom"],bm,bn,bo,bp=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bm(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bm)return bm(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bf,bp)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bq(a,b,e):d.swap(a,bj,function(){f=bq(a,b,e)});if(f<=0){f=bm(a,b,b),f==="0px"&&bo&&(f=bo(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bh.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return be.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bd.test(f)?f.replace(bd,e):c.filter+" "+e}}),d(function(){d.support.reliableMarginRight||(d.cssHooks.marginRight={get:function(a,b){var c;d.swap(a,{display:"inline-block"},function(){b?c=bm(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bn=function(a,c,e){var f,g,h;e=e.replace(bg,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bo=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bh.test(d)&&bi.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bm=bn||bo,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var br=/%20/g,bs=/\[\]$/,bt=/\r?\n/g,bu=/#.*$/,bv=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bw=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bx=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,by=/^(?:GET|HEAD)$/,bz=/^\/\//,bA=/\?/,bB=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bC=/^(?:select|textarea)/i,bD=/\s+/,bE=/([?&])_=[^&]*/,bF=/(^|\-)([a-z])/g,bG=function(a,b,c){return b+c.toUpperCase()},bH=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bI=d.fn.load,bJ={},bK={},bL,bM;try{bL=c.location.href}catch(bN){bL=c.createElement("a"),bL.href="",bL=bL.href}bM=bH.exec(bL.toLowerCase())||[],d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bI)return bI.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("<div>").append(c.replace(bB,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bC.test(this.nodeName)||bw.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(bt,"\r\n")}}):{name:b.name,value:c.replace(bt,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bL,isLocal:bx.test(bM[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bO(bJ),ajaxTransport:bO(bK),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bR(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bS(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bF,bG)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bv.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bu,"").replace(bz,bM[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bD),e.crossDomain==null&&(q=bH.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bM[1]||q[2]!=bM[2]||(q[3]||(q[1]==="http:"?80:443))!=(bM[3]||(bM[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bP(bJ,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!by.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(bA.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bE,"$1_="+w);e.url=x+(x===e.url?(bA.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bP(bK,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bQ(g,a[g],c,f);return e.join("&").replace(br,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bT=d.now(),bU=/(\=)\?(&|$)|\?\?/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bT++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bU.test(b.url)||f&&bU.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bU,l),b.url===j&&(f&&(k=k.replace(bU,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bV=d.now(),bW,bX;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bZ()||b$()}:bZ,bX=d.ajaxSettings.xhr(),d.support.ajax=!!bX,d.support.cors=bX&&"withCredentials"in bX,bX=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),!a.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bW[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bW||(bW={},bY()),h=bV++,g.onreadystatechange=bW[h]=c):c()},abort:function(){c&&c(0,1)}}}});var b_={},ca=/^(?:toggle|show|hide)$/,cb=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cc,cd=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(ce("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)e=this[g],f=e.style.display,!d._data(e,"olddisplay")&&f==="none"&&(f=e.style.display=""),f===""&&d.css(e,"display")==="none"&&d._data(e,"olddisplay",cf(e.nodeName));for(g=0;g<h;g++){e=this[g],f=e.style.display;if(f===""||f==="none")e.style.display=d._data(e,"olddisplay")||""}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ce("hide",3),a,b,c);for(var e=0,f=this.length;e<f;e++){var g=d.css(this[e],"display");g!=="none"&&!d._data(this[e],"olddisplay")&&d._data(this[e],"olddisplay",g)}for(e=0;e<f;e++)this[e].style.display="none";return this},_toggle:d.fn.toggle,toggle:function(a,b,c){var e=typeof a==="boolean";d.isFunction(a)&&d.isFunction(b)?this._toggle.apply(this,arguments):a==null||e?this.each(function(){var b=e?a:d(this).is(":hidden");d(this)[b?"show":"hide"]()}):this.animate(ce("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,e){var f=d.speed(b,c,e);if(d.isEmptyObject(a))return this.each(f.complete);return this[f.queue===!1?"each":"queue"](function(){var b=d.extend({},f),c,e=this.nodeType===1,g=e&&d(this).is(":hidden"),h=this;for(c in a){var i=d.camelCase(c);c!==i&&(a[i]=a[c],delete a[c],c=i);if(a[c]==="hide"&&g||a[c]==="show"&&!g)return b.complete.call(this);if(e&&(c==="height"||c==="width")){b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(d.css(this,"display")==="inline"&&d.css(this,"float")==="none")if(d.support.inlineBlockNeedsLayout){var j=cf(this.nodeName);j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)}else this.style.display="inline-block"}d.isArray(a[c])&&((b.specialEasing=b.specialEasing||{})[c]=a[c][1],a[c]=a[c][0])}b.overflow!=null&&(this.style.overflow="hidden"),b.curAnim=d.extend({},a),d.each(a,function(c,e){var f=new d.fx(h,b,c);if(ca.test(e))f[e==="toggle"?g?"show":"hide":e](a);else{var i=cb.exec(e),j=f.cur();if(i){var k=parseFloat(i[2]),l=i[3]||(d.cssNumber[c]?"":"px");l!=="px"&&(d.style(h,c,(k||1)+l),j=(k||1)/f.cur()*j,d.style(h,c,j+l)),i[1]&&(k=(i[1]==="-="?-1:1)*k+j),f.custom(j,k,l)}else f.custom(j,e,"")}});return!0})},stop:function(a,b){var c=d.timers;a&&this.queue([]),this.each(function(){for(var a=c.length-1;a>=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:ce("show",1),slideUp:ce("hide",1),slideToggle:ce("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!cc&&(cc=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||d.fx.stop()},interval:13,stop:function(){clearInterval(cc),cc=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){d.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),d.expr&&d.expr.filters&&(d.expr.filters.animated=function(a){return d.grep(d.timers,function(b){return a===b.elem}).length});var cg=/^t(?:able|d|h)$/i,ch=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?d.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,g=f.documentElement;if(!c||!d.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=f.body,i=ci(f),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||d.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||d.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:d.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){d.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return d.offset.bodyOffset(b);d.offset.initialize();var c,e=b.offsetParent,f=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(d.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===e&&(l+=b.offsetTop,m+=b.offsetLeft,d.offset.doesNotAddBorder&&(!d.offset.doesAddBorderForTableAndCells||!cg.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),f=e,e=b.offsetParent),d.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;d.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},d.offset={initialize:function(){var a=c.body,b=c.createElement("div"),e,f,g,h,i=parseFloat(d.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=(e==="absolute"||e==="fixed")&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=ch.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!ch.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=ci(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=ci(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window);
ï»¿/**
 * CJ Carousel - offering a semantic carousel with a number of options
 *
 * Copyright (c) 2011 Creative Jar & Ben MacGowan (http://www.creative-jar.com)
 *
 * Version: 0.1.0
 *
 * Dependancies:
 * Paul Irish's imagesLoaded jquery plugin - fixes browser inconsistencies of image load callback functions: https://gist.github.com/797120/b7359a8ba0ab5be298875215d07819fe61f87399
 *
 * TO DO:
 * - Fix pager and caption when looping is set to true
 * - Enable choice of transitions
 *
 */

(function ($) {
    $.fn.cjCarousel = function (options) {
        options = $.extend({
            container: "ul", // Item's container
            items: "li", // Items
            visible: 1, // Number of visible items
            speed: 200, // Global animation speed
            btnNextClass: null, // Next button CSS class
            btnPrevClass: null, // Previous button CSS class
            btnDisabledClass: "disabled", // Disabled button CSS class
            pagerClass: null,
            pagerCurrentClass: "current",
            imageCaptionClass: null,
            loop: false, // Loop through items
            resizeHeight: false,  // Animate height of container on change
            scrollTo: null, // Scroll to value on change
            fixedControls: false, // Fix controls
            autoPlaySpeed: false
        }, options || {});

        return this.each(function () {
            var oElement = $(this), // Set main element
            oContainer = $(options.container, oElement), // Set item's container within element
            oItems = $(options.items, oContainer), // Set items collection within container
            oItemsLength = $(oItems).size(), // Get number of items
            oItemsWidth = $(oItems).outerWidth(), // Get width of items
            oContainerWidth = oItemsWidth * oItemsLength,
            oCurrent = 1, // Set current item to 1
            oScrolling = false; // Set carousel currently scrolling to false, will be used later to prevent queuing

            if (oItemsLength > options.visible) { // Check if previous and next controls are needed
                if (options.btnNextClass) { // Check if next button class exists
                    if (oCurrent == oItemsLength && !options.loop) { // Check if at end
                        $(oElement).append("<a class='" + options.btnNextClass + " " + options.btnDisabledClass + "'>Next</a>"); // Append next button with disabled CSS class
                    }
                    else {
                        $(oElement).append("<a class='" + options.btnNextClass + "'>Next</a>"); // Append next button
                    }
                    $("a." + options.btnNextClass, oElement).fadeIn(options.speed).click(function () { // Fade next button in and set click function
                        if (!$(this).hasClass(options.btnDisabledClass)) { // Check if disabled
                            runScroll("-"); // Moving items to left
                        }
                    });
                }
                if (options.btnPrevClass) { // Check if previous button class exists
                    if (oCurrent == "1" && !options.loop) { // Check if at beginning
                        $(oElement).prepend("<a class='" + options.btnPrevClass + " " + options.btnDisabledClass + "'>Previous</a>"); // Append previous button with disabled CSS class
                    }
                    else {
                        $(oElement).prepend("<a class='" + options.btnPrevClass + "'>Previous</a>"); // Append previous button
                    }
                    $("a." + options.btnPrevClass, oElement).fadeIn(options.speed).click(function () { // Fade previous button in and set click function
                        if (!$(this).hasClass(options.btnDisabledClass)) { // Check if disabled
                            runScroll("+"); // Moving items to right
                        }
                    });
                }
            }

            if (options.pagerClass) { // Check if pager class exists
                $(oElement).after("<ul class='" + options.pagerClass + "'></ul>"); // Append pager container to after element
                oSlide = 1; // Set slide to 1
                $(options.items, oContainer).each(function () { // For each item
                    if (oSlide == oCurrent) { // Check if slide is current
                        $("ul." + options.pagerClass).append("<li><a class='" + options.pagerCurrentClass + "'>" + oSlide + "</a></li>"); // Append item to pager with current CSS class
                    } else {
                        $("ul." + options.pagerClass).append("<li><a>" + oSlide + "</a></li>"); // Append item to pager
                    }
                    oSlide++; // Increase slide by 1
                });

                $("ul." + options.pagerClass + " li a").click(function () { // Pager click event
                    if (!$(this).hasClass(options.pagerCurrentClass)) { // Check if item does not have CSS class of current
                        runScroll(null, $(this).html()); // Jump items to selected slide
                    }
                });
            }

            if (options.imageCaptionClass) { // Check if pager class exists
                oImageCaption = $(options.items + ":first-child img", oContainer).attr("alt"); // Get image caption from alt attribute
                $(oElement).after("<p class='" + options.imageCaptionClass + "'>Page <em>" + oCurrent + "</em> of " + oItemsLength + " - <span>" + oImageCaption + "</span></p>"); // Append caption after element
            }

            if (options.resizeHeight) { // Check if resizing height of carousel
                oInitialHeight = $(options.items + ":first-child img", oContainer).height(); // Get height of first item
                (oElement).css({ "height": oInitialHeight + "px" }); // Animate height of element
                if ($(options.items + ":first-child img", oContainer).size() > 0) { // Check if first item has image
                    $(options.items + ":first-child", oContainer).imagesLoaded(function () { // Wait until image has loaded
                        oInitialHeight = $(this).height(); // Get height of first item image
                        $(oElement).css({ "height": oInitialHeight + "px" }); // Animate height of element
                    });
                }
            }

            if (options.fixedControls && oItemsLength > options.visible) { // Check if controls should be fixed
                var oControls = $("a." + options.btnNextClass + ", a." + options.btnPrevClass, oElement), // Set controls
                oControlsTop = $(oControls).offset().top, // Get offset from top of controls
                oElementBottom = $(oElement).offset().top + $(oElement).height() - $(oControls).height(); // Get bottom of element's offset from top
                if (options.resizeHeight) {// Check if resizing height of carousel
                    $(options.items + ":first-child", oContainer).imagesLoaded(function () {// Wait until image has loaded
                        oElementBottom = $(oElement).offset().top + $(oElement).height() - $(oControls).height(); // Get bottom of element's offset from top
                    });
                }
                if (options.btnPrevClass) { // Check if previous button class exists
                    oBtnPrevLeft = $("a." + options.btnPrevClass, oElement).offset().left; // Get left offset of previous button
                }
                if (options.btnNextClass) { // Check if next button class exists
                    oBtnNextLeft = $("a." + options.btnNextClass, oElement).offset().left; // Get left offset of next button
                }

                $(window).scroll(function (event) { // When window scrolls
                    var y = $(window).scrollTop(); // Get scroll position
                    if (y >= oControlsTop && y < oElementBottom) { // If scroll position is greater than top of controls, and less than bottom of element
                        $(oControls).addClass('fixed').removeClass('bottom-fixed'); // Add CSS class of 'fixed' to controls, remove CSS class of 'bottom-fixed'
                        if (options.btnPrevClass) { // Check if previous button class exists
                            $("a." + options.btnPrevClass, oElement).css({ "left": oBtnPrevLeft + "px" }); // Set left offset of previous button
                        }
                        if (options.btnNextClass) { // Check if next button class exists
                            $("a." + options.btnNextClass, oElement).css({ "left": oBtnNextLeft + "px" }); // Set left offset of next button
                        }
                    } else if (y >= oElementBottom) { // If scroll position is great than bottom of element
                        $(oControls).removeClass('fixed').addClass('bottom-fixed').css({ "left": "" }); // Remove CSS class of 'fixed' from controls, add CSS class of 'bottom-fixed'
                    } else {
                        $(oControls).removeClass('fixed bottom-fixed').css({ "left": "" }); // Remove CSS classes from controls corresponding to fixed positions
                    }
                });

                $(window).resize(function (event) { // When window resizes
                    if (options.btnPrevClass) { // Check if previous button class exists
                        oBtnPrevLeft = $(oElement).offset().left; // Get left offset of previous button using left offset of element (will only work if previous button is position to left of element)
                    }
                    if (options.btnNextClass) { // Check if next button class exists
                        oBtnNextLeft = oBtnPrevLeft + $(oElement).width() - $("a." + options.btnNextClass, oElement).width(); // Get left offset of next button using left offset of element, width of element and removing width of next button (will only work if next button is position to right of element)
                    }
                    if ($(oControls).hasClass("fixed")) { // Check if controls has CSS class of 'fixed'
                        $("a." + options.btnPrevClass, oElement).css({ "left": oBtnPrevLeft + "px" }); // Set left offset of previous button
                        $("a." + options.btnNextClass, oElement).css({ "left": oBtnNextLeft + "px" }); // Set left offset of next button
                    }
                });
            }

            if (options.autoPlaySpeed) { // Check if autoplay is enabled
                oTransitionPause = false; // Set transition pause to false
                $(oElement).hover(function () {
                    oTransitionPause = true; // Set transition pause to true if element is being hovered over
                }, function () {
                    oTransitionPause = false; // Reset transition pause to false on mouse out
                });

                $("ul." + options.pagerClass + ", p." + options.imageCaptionClass).hover(function () {
                    oTransitionPause = true; // Set transition pause to true if element is being hovered over
                }, function () {
                    oTransitionPause = false; // Reset transition pause to false on mouse out
                });

                setInterval(function () { // Set repeating function based on autoplay speed variable
                    if (oTransitionPause != true) { // If not paused
                        if (oCurrent == oItemsLength) { // If last item
                            runScroll("-", null, function () { // Move items left, but with callback function
                                $(oContainer).css({ "left": "0px" }); // Set container to beginning
                            });
                        }
                        else {
                            runScroll("-"); // Move items to left
                        }
                    }
                }, options.autoPlaySpeed);

            }

            if (options.autoPlaySpeed && !options.loop) { // Check if autoplay is enabled, and not looped
                oFirstItemDuplicate = $(oItems).first().clone().appendTo(oContainer); // Clone first item and append to end of container
            }

            if (options.loop) { // Check if looping is enabled
                oItemsDuplicateBefore = oItemsDuplicateAfter = $(oItems).clone(); // Get initial items
                oContainer.prepend(oItemsDuplicateBefore).append(oItemsDuplicateAfter).css({ "left": "-" + oContainerWidth + "px" }); // Append, prepend cloned items, set left position
                oCurrent = oItemsLength + 1, // Set current item
                oItems = $(options.items, oContainer), // Set items collection within container (reset)
                oItemsLength = $(oItems).size(); // Get number of items (reset)
            }

            function runScroll(direction, jump, callback) {
                if (!oScrolling) {
                    oScrolling = true; // Set scrolling to true, to prevent queuing
                    if (options.scrollTo != null) { // Check if scrolling to value
                        $("html,body").animate({ scrollTop: options.scrollTo }, options.speed); // Scroll body to value
                    }
                    if (direction && !jump) {
                        oAnimationResult = direction + "=" + oItemsWidth + "px";
                    }
                    else if (!direction && jump) {
                        oAnimationResult = "-" + (jump - 1) * oItemsWidth + "px";
                    }
                    oContainer.animate({ "left": oAnimationResult }, options.speed, function () { // Animate items in correct direction
                        oScrolling = false; // Set scrolling to finished
                        if (direction == "-" && oCurrent == (oItemsLength - (options.visible - 1)) && options.autoPlaySpeed) { // If moving to right, at the end, and autoplay is enabled
                            oCurrent = 1;
                        }
                        else if (direction == "+" && !jump) {
                            oCurrent--; // Decrease current item
                        }
                        else if (direction == "-" && !jump) {
                            oCurrent++; // Increase current item
                        }
                        else if (!direction && jump) {
                            oCurrent = jump; // Set current item after jump
                        }
                        if (!options.loop) { // Check if not looping carousel
                            if (oCurrent == (oItemsLength - (options.visible - 1))) { // Check if current item is at end
                                $("a." + options.btnNextClass, oElement).addClass(options.btnDisabledClass); // Add disabled class to next button
                                $("a." + options.btnPrevClass, oElement).removeClass(options.btnDisabledClass); // Remove disabled class from previous button
                            }
                            else if (oCurrent == 1) { // Check if current item is at beginning
                                $("a." + options.btnPrevClass, oElement).addClass(options.btnDisabledClass); // Add disabled class to previous button
                                $("a." + options.btnNextClass, oElement).removeClass(options.btnDisabledClass); // Remove disabled class from next button
                            }
                            else {
                                $("a." + options.btnNextClass + ", a." + options.btnPrevClass, oElement).removeClass(options.btnDisabledClass); // Remove disabled class from previous and next button
                            }
                        }
                        else { // If looping
                            if (direction == "+") { // If moving to right
                                $(options.items, oContainer).last().clone().prependTo(oContainer); // Clone last item and prepend to beginning
                                $(options.items, oContainer).last().remove(); // Remove last item
                                var oContainerPosition = parseInt($(oContainer).css("left")) - parseInt(oItemsWidth); // Calculate new container position
                            }
                            else if (direction == "-") { // If moving to left
                                $(options.items, oContainer).first().clone().appendTo(oContainer); // Clone first item and append to end
                                $(options.items, oContainer).first().remove(); // Remove first item
                                var oContainerPosition = parseInt($(oContainer).css("left")) + parseInt(oItemsWidth); // Calculate new container position
                            }
                            $(oContainer).css({ "left": oContainerPosition + "px" }); // Set position of container with new position
                        }
                        if (options.pagerClass) { // Check if pager class exists
                            $("ul." + options.pagerClass + " li a").removeClass(options.pagerCurrentClass); // Remove current item CSS class from all items
                            $("ul." + options.pagerClass + "  li:nth-child(" + oCurrent + ") a").addClass(options.pagerCurrentClass); // Add current item CSS class to target item
                        }
                        if (options.imageCaptionClass) { // Check if image caption class exists
                            var oImageCaption = $(options.items + ":nth-child(" + oCurrent + ") img", oContainer).attr("alt"); // Get caption of target image
                            $("p." + options.imageCaptionClass + " em").html(oCurrent); // Set slide number to updated value
                            $("p." + options.imageCaptionClass + " span").html(oImageCaption); // Update caption
                        }
                        if (options.resizeHeight) { // Check if resizing height of carousel
                            var yDimension = $(options.items + ":nth-child(" + oCurrent + ")", oContainer).height(); // Get height of next item
                            $(oElement).animate({ "height": yDimension + "px" }, options.speed, function () { // Animate height of element
                                if (options.fixedControls) { // Check if controls should be fixed
                                    oElementBottom = $(oElement).offset().top + $(oElement).height() - $(oControls).height(); // Update element's bottom value after resize
                                }
                            });
                        }
                        if (typeof callback == "function") {
                            callback.call(this);
                        }
                    });
                }
            }
        });
    };
})(jQuery);
/*
 * Copyright (c) 2009 Simo Kinnunen.
 * Licensed under the MIT license.
 *
 * @version 1.09i
 */
var Cufon=(function(){var m=function(){return m.replace.apply(null,arguments)};var x=m.DOM={ready:(function(){var C=false,E={loaded:1,complete:1};var B=[],D=function(){if(C){return}C=true;for(var F;F=B.shift();F()){}};if(document.addEventListener){document.addEventListener("DOMContentLoaded",D,false);window.addEventListener("pageshow",D,false)}if(!window.opera&&document.readyState){(function(){E[document.readyState]?D():setTimeout(arguments.callee,10)})()}if(document.readyState&&document.createStyleSheet){(function(){try{document.body.doScroll("left");D()}catch(F){setTimeout(arguments.callee,1)}})()}q(window,"load",D);return function(F){if(!arguments.length){D()}else{C?F():B.push(F)}}})(),root:function(){return document.documentElement||document.body}};var n=m.CSS={Size:function(C,B){this.value=parseFloat(C);this.unit=String(C).match(/[a-z%]*$/)[0]||"px";this.convert=function(D){return D/B*this.value};this.convertFrom=function(D){return D/this.value*B};this.toString=function(){return this.value+this.unit}},addClass:function(C,B){var D=C.className;C.className=D+(D&&" ")+B;return C},color:j(function(C){var B={};B.color=C.replace(/^rgba\((.*?),\s*([\d.]+)\)/,function(E,D,F){B.opacity=parseFloat(F);return"rgb("+D+")"});return B}),fontStretch:j(function(B){if(typeof B=="number"){return B}if(/%$/.test(B)){return parseFloat(B)/100}return{"ultra-condensed":0.5,"extra-condensed":0.625,condensed:0.75,"semi-condensed":0.875,"semi-expanded":1.125,expanded:1.25,"extra-expanded":1.5,"ultra-expanded":2}[B]||1}),getStyle:function(C){var B=document.defaultView;if(B&&B.getComputedStyle){return new a(B.getComputedStyle(C,null))}if(C.currentStyle){return new a(C.currentStyle)}return new a(C.style)},gradient:j(function(F){var G={id:F,type:F.match(/^-([a-z]+)-gradient\(/)[1],stops:[]},C=F.substr(F.indexOf("(")).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);for(var E=0,B=C.length,D;E<B;++E){D=C[E].split("=",2).reverse();G.stops.push([D[1]||E/(B-1),D[0]])}return G}),quotedList:j(function(E){var D=[],C=/\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g,B;while(B=C.exec(E)){D.push(B[3]||B[1])}return D}),recognizesMedia:j(function(G){var E=document.createElement("style"),D,C,B;E.type="text/css";E.media=G;try{E.appendChild(document.createTextNode("/**/"))}catch(F){}C=g("head")[0];C.insertBefore(E,C.firstChild);D=(E.sheet||E.styleSheet);B=D&&!D.disabled;C.removeChild(E);return B}),removeClass:function(D,C){var B=RegExp("(?:^|\\s+)"+C+"(?=\\s|$)","g");D.className=D.className.replace(B,"");return D},supports:function(D,C){var B=document.createElement("span").style;if(B[D]===undefined){return false}B[D]=C;return B[D]===C},textAlign:function(E,D,B,C){if(D.get("textAlign")=="right"){if(B>0){E=" "+E}}else{if(B<C-1){E+=" "}}return E},textShadow:j(function(F){if(F=="none"){return null}var E=[],G={},B,C=0;var D=/(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;while(B=D.exec(F)){if(B[0]==","){E.push(G);G={};C=0}else{if(B[1]){G.color=B[1]}else{G[["offX","offY","blur"][C++]]=B[2]}}}E.push(G);return E}),textTransform:(function(){var B={uppercase:function(C){return C.toUpperCase()},lowercase:function(C){return C.toLowerCase()},capitalize:function(C){return C.replace(/\b./g,function(D){return D.toUpperCase()})}};return function(E,D){var C=B[D.get("textTransform")];return C?C(E):E}})(),whiteSpace:(function(){var D={inline:1,"inline-block":1,"run-in":1};var C=/^\s+/,B=/\s+$/;return function(H,F,G,E){if(E){if(E.nodeName.toLowerCase()=="br"){H=H.replace(C,"")}}if(D[F.get("display")]){return H}if(!G.previousSibling){H=H.replace(C,"")}if(!G.nextSibling){H=H.replace(B,"")}return H}})()};n.ready=(function(){var B=!n.recognizesMedia("all"),E=false;var D=[],H=function(){B=true;for(var K;K=D.shift();K()){}};var I=g("link"),J=g("style");function C(K){return K.disabled||G(K.sheet,K.media||"screen")}function G(M,P){if(!n.recognizesMedia(P||"all")){return true}if(!M||M.disabled){return false}try{var Q=M.cssRules,O;if(Q){search:for(var L=0,K=Q.length;O=Q[L],L<K;++L){switch(O.type){case 2:break;case 3:if(!G(O.styleSheet,O.media.mediaText)){return false}break;default:break search}}}}catch(N){}return true}function F(){if(document.createStyleSheet){return true}var L,K;for(K=0;L=I[K];++K){if(L.rel.toLowerCase()=="stylesheet"&&!C(L)){return false}}for(K=0;L=J[K];++K){if(!C(L)){return false}}return true}x.ready(function(){if(!E){E=n.getStyle(document.body).isUsable()}if(B||(E&&F())){H()}else{setTimeout(arguments.callee,10)}});return function(K){if(B){K()}else{D.push(K)}}})();function s(D){var C=this.face=D.face,B={"\u0020":1,"\u00a0":1,"\u3000":1};this.glyphs=D.glyphs;this.w=D.w;this.baseSize=parseInt(C["units-per-em"],10);this.family=C["font-family"].toLowerCase();this.weight=C["font-weight"];this.style=C["font-style"]||"normal";this.viewBox=(function(){var F=C.bbox.split(/\s+/);var E={minX:parseInt(F[0],10),minY:parseInt(F[1],10),maxX:parseInt(F[2],10),maxY:parseInt(F[3],10)};E.width=E.maxX-E.minX;E.height=E.maxY-E.minY;E.toString=function(){return[this.minX,this.minY,this.width,this.height].join(" ")};return E})();this.ascent=-parseInt(C.ascent,10);this.descent=-parseInt(C.descent,10);this.height=-this.ascent+this.descent;this.spacing=function(L,N,E){var O=this.glyphs,M,K,G,P=[],F=0,J=-1,I=-1,H;while(H=L[++J]){M=O[H]||this.missingGlyph;if(!M){continue}if(K){F-=G=K[H]||0;P[I]-=G}F+=P[++I]=~~(M.w||this.w)+N+(B[H]?E:0);K=M.k}P.total=F;return P}}function f(){var C={},B={oblique:"italic",italic:"oblique"};this.add=function(D){(C[D.style]||(C[D.style]={}))[D.weight]=D};this.get=function(H,I){var G=C[H]||C[B[H]]||C.normal||C.italic||C.oblique;if(!G){return null}I={normal:400,bold:700}[I]||parseInt(I,10);if(G[I]){return G[I]}var E={1:1,99:0}[I%100],K=[],F,D;if(E===undefined){E=I>400}if(I==500){I=400}for(var J in G){if(!k(G,J)){continue}J=parseInt(J,10);if(!F||J<F){F=J}if(!D||J>D){D=J}K.push(J)}if(I<F){I=F}if(I>D){I=D}K.sort(function(M,L){return(E?(M>=I&&L>=I)?M<L:M>L:(M<=I&&L<=I)?M>L:M<L)?-1:1});return G[K[0]]}}function r(){function D(F,G){if(F.contains){return F.contains(G)}return F.compareDocumentPosition(G)&16}function B(G){var F=G.relatedTarget;if(!F||D(this,F)){return}C(this,G.type=="mouseover")}function E(F){C(this,F.type=="mouseenter")}function C(F,G){setTimeout(function(){var H=d.get(F).options;m.replace(F,G?h(H,H.hover):H,true)},10)}this.attach=function(F){if(F.onmouseenter===undefined){q(F,"mouseover",B);q(F,"mouseout",B)}else{q(F,"mouseenter",E);q(F,"mouseleave",E)}}}function u(){var C=[],D={};function B(H){var E=[],G;for(var F=0;G=H[F];++F){E[F]=C[D[G]]}return E}this.add=function(F,E){D[F]=C.push(E)-1};this.repeat=function(){var E=arguments.length?B(arguments):C,F;for(var G=0;F=E[G++];){m.replace(F[0],F[1],true)}}}function A(){var D={},B=0;function C(E){return E.cufid||(E.cufid=++B)}this.get=function(E){var F=C(E);return D[F]||(D[F]={})}}function a(B){var D={},C={};this.extend=function(E){for(var F in E){if(k(E,F)){D[F]=E[F]}}return this};this.get=function(E){return D[E]!=undefined?D[E]:B[E]};this.getSize=function(F,E){return C[F]||(C[F]=new n.Size(this.get(F),E))};this.isUsable=function(){return !!B}}function q(C,B,D){if(C.addEventListener){C.addEventListener(B,D,false)}else{if(C.attachEvent){C.attachEvent("on"+B,function(){return D.call(C,window.event)})}}}function v(C,B){var D=d.get(C);if(D.options){return C}if(B.hover&&B.hoverables[C.nodeName.toLowerCase()]){b.attach(C)}D.options=B;return C}function j(B){var C={};return function(D){if(!k(C,D)){C[D]=B.apply(null,arguments)}return C[D]}}function c(F,E){var B=n.quotedList(E.get("fontFamily").toLowerCase()),D;for(var C=0;D=B[C];++C){if(i[D]){return i[D].get(E.get("fontStyle"),E.get("fontWeight"))}}return null}function g(B){return document.getElementsByTagName(B)}function k(C,B){return C.hasOwnProperty(B)}function h(){var C={},B,F;for(var E=0,D=arguments.length;B=arguments[E],E<D;++E){for(F in B){if(k(B,F)){C[F]=B[F]}}}return C}function o(E,M,C,N,F,D){var K=document.createDocumentFragment(),H;if(M===""){return K}var L=N.separate;var I=M.split(p[L]),B=(L=="words");if(B&&t){if(/^\s/.test(M)){I.unshift("")}if(/\s$/.test(M)){I.push("")}}for(var J=0,G=I.length;J<G;++J){H=z[N.engine](E,B?n.textAlign(I[J],C,J,G):I[J],C,N,F,D,J<G-1);if(H){K.appendChild(H)}}return K}function l(D,M){var C=D.nodeName.toLowerCase();if(M.ignore[C]){return}var E=!M.textless[C];var B=n.getStyle(v(D,M)).extend(M);var F=c(D,B),G,K,I,H,L,J;if(!F){return}for(G=D.firstChild;G;G=I){K=G.nodeType;I=G.nextSibling;if(E&&K==3){if(H){H.appendData(G.data);D.removeChild(G)}else{H=G}if(I){continue}}if(H){D.replaceChild(o(F,n.whiteSpace(H.data,B,H,J),B,M,G,D),H);H=null}if(K==1){if(G.firstChild){if(G.nodeName.toLowerCase()=="cufon"){z[M.engine](F,null,B,M,G,D)}else{arguments.callee(G,M)}}J=G}}}var t=" ".split(/\s+/).length==0;var d=new A();var b=new r();var y=new u();var e=false;var z={},i={},w={autoDetect:false,engine:null,forceHitArea:false,hover:false,hoverables:{a:true},ignore:{applet:1,canvas:1,col:1,colgroup:1,head:1,iframe:1,map:1,optgroup:1,option:1,script:1,select:1,style:1,textarea:1,title:1,pre:1},printable:true,selector:(window.Sizzle||(window.jQuery&&function(B){return jQuery(B)})||(window.dojo&&dojo.query)||(window.Ext&&Ext.query)||(window.YAHOO&&YAHOO.util&&YAHOO.util.Selector&&YAHOO.util.Selector.query)||(window.$$&&function(B){return $$(B)})||(window.$&&function(B){return $(B)})||(document.querySelectorAll&&function(B){return document.querySelectorAll(B)})||g),separate:"words",textless:{dl:1,html:1,ol:1,table:1,tbody:1,thead:1,tfoot:1,tr:1,ul:1},textShadow:"none"};var p={words:/\s/.test("\u00a0")?/[^\S\u00a0]+/:/\s+/,characters:"",none:/^/};m.now=function(){x.ready();return m};m.refresh=function(){y.repeat.apply(y,arguments);return m};m.registerEngine=function(C,B){if(!B){return m}z[C]=B;return m.set("engine",C)};m.registerFont=function(D){if(!D){return m}var B=new s(D),C=B.family;if(!i[C]){i[C]=new f()}i[C].add(B);return m.set("fontFamily",'"'+C+'"')};m.replace=function(D,C,B){C=h(w,C);if(!C.engine){return m}if(!e){n.addClass(x.root(),"cufon-active cufon-loading");n.ready(function(){n.addClass(n.removeClass(x.root(),"cufon-loading"),"cufon-ready")});e=true}if(C.hover){C.forceHitArea=true}if(C.autoDetect){delete C.fontFamily}if(typeof C.textShadow=="string"){C.textShadow=n.textShadow(C.textShadow)}if(typeof C.color=="string"&&/^-/.test(C.color)){C.textGradient=n.gradient(C.color)}else{delete C.textGradient}if(!B){y.add(D,arguments)}if(D.nodeType||typeof D=="string"){D=[D]}n.ready(function(){for(var F=0,E=D.length;F<E;++F){var G=D[F];if(typeof G=="string"){m.replace(C.selector(G),C,true)}else{l(G,C)}}});return m};m.set=function(B,C){w[B]=C;return m};return m})();Cufon.registerEngine("vml",(function(){var e=document.namespaces;if(!e){return}e.add("cvml","urn:schemas-microsoft-com:vml");e=null;var b=document.createElement("cvml:shape");b.style.behavior="url(#default#VML)";if(!b.coordsize){return}b=null;var h=(document.documentMode||0)<8;document.write(('<style type="text/css">cufoncanvas{text-indent:0;}@media screen{cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}cufoncanvas{position:absolute;text-align:left;}cufon{display:inline-block;position:relative;vertical-align:'+(h?"middle":"text-bottom")+";}cufon cufontext{position:absolute;left:-10000in;font-size:1px;}a cufon{cursor:pointer}}@media print{cufon cufoncanvas{display:none;}}</style>").replace(/;/g,"!important;"));function c(i,j){return a(i,/(?:em|ex|%)$|^[a-z-]+$/i.test(j)?"1em":j)}function a(l,m){if(m==="0"){return 0}if(/px$/i.test(m)){return parseFloat(m)}var k=l.style.left,j=l.runtimeStyle.left;l.runtimeStyle.left=l.currentStyle.left;l.style.left=m.replace("%","em");var i=l.style.pixelLeft;l.style.left=k;l.runtimeStyle.left=j;return i}function f(l,k,j,n){var i="computed"+n,m=k[i];if(isNaN(m)){m=k.get(n);k[i]=m=(m=="normal")?0:~~j.convertFrom(a(l,m))}return m}var g={};function d(p){var q=p.id;if(!g[q]){var n=p.stops,o=document.createElement("cvml:fill"),i=[];o.type="gradient";o.angle=180;o.focus="0";o.method="sigma";o.color=n[0][1];for(var m=1,l=n.length-1;m<l;++m){i.push(n[m][0]*100+"% "+n[m][1])}o.colors=i.join(",");o.color2=n[l][1];g[q]=o}return g[q]}return function(ac,G,Y,C,K,ad,W){var n=(G===null);if(n){G=K.alt}var I=ac.viewBox;var p=Y.computedFontSize||(Y.computedFontSize=new Cufon.CSS.Size(c(ad,Y.get("fontSize"))+"px",ac.baseSize));var y,q;if(n){y=K;q=K.firstChild}else{y=document.createElement("cufon");y.className="cufon cufon-vml";y.alt=G;q=document.createElement("cufoncanvas");y.appendChild(q);if(C.printable){var Z=document.createElement("cufontext");Z.appendChild(document.createTextNode(G));y.appendChild(Z)}if(!W){y.appendChild(document.createElement("cvml:shape"))}}var ai=y.style;var R=q.style;var l=p.convert(I.height),af=Math.ceil(l);var V=af/l;var P=V*Cufon.CSS.fontStretch(Y.get("fontStretch"));var U=I.minX,T=I.minY;R.height=af;R.top=Math.round(p.convert(T-ac.ascent));R.left=Math.round(p.convert(U));ai.height=p.convert(ac.height)+"px";var F=Y.get("color");var ag=Cufon.CSS.textTransform(G,Y).split("");var L=ac.spacing(ag,f(ad,Y,p,"letterSpacing"),f(ad,Y,p,"wordSpacing"));if(!L.length){return null}var k=L.total;var x=-U+k+(I.width-L[L.length-1]);var ah=p.convert(x*P),X=Math.round(ah);var O=x+","+I.height,m;var J="r"+O+"ns";var u=C.textGradient&&d(C.textGradient);var o=ac.glyphs,S=0;var H=C.textShadow;var ab=-1,aa=0,w;while(w=ag[++ab]){var D=o[ag[ab]]||ac.missingGlyph,v;if(!D){continue}if(n){v=q.childNodes[aa];while(v.firstChild){v.removeChild(v.firstChild)}}else{v=document.createElement("cvml:shape");q.appendChild(v)}v.stroked="f";v.coordsize=O;v.coordorigin=m=(U-S)+","+T;v.path=(D.d?"m"+D.d+"xe":"")+"m"+m+J;v.fillcolor=F;if(u){v.appendChild(u.cloneNode(false))}var ae=v.style;ae.width=X;ae.height=af;if(H){var s=H[0],r=H[1];var B=Cufon.CSS.color(s.color),z;var N=document.createElement("cvml:shadow");N.on="t";N.color=B.color;N.offset=s.offX+","+s.offY;if(r){z=Cufon.CSS.color(r.color);N.type="double";N.color2=z.color;N.offset2=r.offX+","+r.offY}N.opacity=B.opacity||(z&&z.opacity)||1;v.appendChild(N)}S+=L[aa++]}var M=v.nextSibling,t,A;if(C.forceHitArea){if(!M){M=document.createElement("cvml:rect");M.stroked="f";M.className="cufon-vml-cover";t=document.createElement("cvml:fill");t.opacity=0;M.appendChild(t);q.appendChild(M)}A=M.style;A.width=X;A.height=af}else{if(M){q.removeChild(M)}}ai.width=Math.max(Math.ceil(p.convert(k*P)),0);if(h){var Q=Y.computedYAdjust;if(Q===undefined){var E=Y.get("lineHeight");if(E=="normal"){E="1em"}else{if(!isNaN(E)){E+="em"}}Y.computedYAdjust=Q=0.5*(a(ad,E)-parseFloat(ai.height))}if(Q){ai.marginTop=Math.ceil(Q)+"px";ai.marginBottom=Q+"px"}}return y}})());Cufon.registerEngine("canvas",(function(){var b=document.createElement("canvas");if(!b||!b.getContext||!b.getContext.apply){return}b=null;var a=Cufon.CSS.supports("display","inline-block");var e=!a&&(document.compatMode=="BackCompat"||/frameset|transitional/i.test(document.doctype.publicId));var f=document.createElement("style");f.type="text/css";f.appendChild(document.createTextNode(("cufon{text-indent:0;}@media screen,projection{cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;"+(e?"":"font-size:1px;line-height:1px;")+"}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;overflow:hidden;text-indent:-10000in;}"+(a?"cufon canvas{position:relative;}":"cufon canvas{position:absolute;}")+"}@media print{cufon{padding:0;}cufon canvas{display:none;}}").replace(/;/g,"!important;")));document.getElementsByTagName("head")[0].appendChild(f);function d(p,h){var n=0,m=0;var g=[],o=/([mrvxe])([^a-z]*)/g,k;generate:for(var j=0;k=o.exec(p);++j){var l=k[2].split(",");switch(k[1]){case"v":g[j]={m:"bezierCurveTo",a:[n+~~l[0],m+~~l[1],n+~~l[2],m+~~l[3],n+=~~l[4],m+=~~l[5]]};break;case"r":g[j]={m:"lineTo",a:[n+=~~l[0],m+=~~l[1]]};break;case"m":g[j]={m:"moveTo",a:[n=~~l[0],m=~~l[1]]};break;case"x":g[j]={m:"closePath"};break;case"e":break generate}h[g[j].m].apply(h,g[j].a)}return g}function c(m,k){for(var j=0,h=m.length;j<h;++j){var g=m[j];k[g.m].apply(k,g.a)}}return function(V,w,P,t,C,W){var k=(w===null);if(k){w=C.getAttribute("alt")}var A=V.viewBox;var m=P.getSize("fontSize",V.baseSize);var B=0,O=0,N=0,u=0;var z=t.textShadow,L=[];if(z){for(var U=z.length;U--;){var F=z[U];var K=m.convertFrom(parseFloat(F.offX));var I=m.convertFrom(parseFloat(F.offY));L[U]=[K,I];if(I<B){B=I}if(K>O){O=K}if(I>N){N=I}if(K<u){u=K}}}var Z=Cufon.CSS.textTransform(w,P).split("");var E=V.spacing(Z,~~m.convertFrom(parseFloat(P.get("letterSpacing"))||0),~~m.convertFrom(parseFloat(P.get("wordSpacing"))||0));if(!E.length){return null}var h=E.total;O+=A.width-E[E.length-1];u+=A.minX;var s,n;if(k){s=C;n=C.firstChild}else{s=document.createElement("cufon");s.className="cufon cufon-canvas";s.setAttribute("alt",w);n=document.createElement("canvas");s.appendChild(n);if(t.printable){var S=document.createElement("cufontext");S.appendChild(document.createTextNode(w));s.appendChild(S)}}var aa=s.style;var H=n.style;var j=m.convert(A.height);var Y=Math.ceil(j);var M=Y/j;var G=M*Cufon.CSS.fontStretch(P.get("fontStretch"));var J=h*G;var Q=Math.ceil(m.convert(J+O-u));var o=Math.ceil(m.convert(A.height-B+N));n.width=Q;n.height=o;H.width=Q+"px";H.height=o+"px";B+=A.minY;H.top=Math.round(m.convert(B-V.ascent))+"px";H.left=Math.round(m.convert(u))+"px";var r=Math.max(Math.ceil(m.convert(J)),0)+"px";if(a){aa.width=r;aa.height=m.convert(V.height)+"px"}else{aa.paddingLeft=r;aa.paddingBottom=(m.convert(V.height)-1)+"px"}var X=n.getContext("2d"),D=j/A.height;X.scale(D,D*M);X.translate(-u,-B);X.save();function T(){var x=V.glyphs,ab,l=-1,g=-1,y;X.scale(G,1);while(y=Z[++l]){var ab=x[Z[l]]||V.missingGlyph;if(!ab){continue}if(ab.d){X.beginPath();if(ab.code){c(ab.code,X)}else{ab.code=d("m"+ab.d,X)}X.fill()}X.translate(E[++g],0)}X.restore()}if(z){for(var U=z.length;U--;){var F=z[U];X.save();X.fillStyle=F.color;X.translate.apply(X,L[U]);T()}}var q=t.textGradient;if(q){var v=q.stops,p=X.createLinearGradient(0,A.minY,0,A.maxY);for(var U=0,R=v.length;U<R;++U){p.addColorStop.apply(p,v[U])}X.fillStyle=p}else{X.fillStyle=P.get("color")}T();return s}})());
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc /
 * Type Solutions Inc. 1990-91 All Rights Reserved
 * 
 * Trademark:
 * Century Gothic is a trademark of The Monotype Corporation plc.
 * 
 * Description:
 * A design based on Monotype 20th Century, which was drawn by Sol Hess between
 * 1936 and 1947. Century Gothic maintains the basic design of 20th Century but has
 * an enlarged 'x' height and has been modified to ensure satisfactory output from
 * modern digital systems. The design is influenced by the geometric style sans
 * serif faces which were popular during the 1920's and 30's. Useful for headlines
 * and general display work and for small quantities of text, particularly in
 * advertising.
 * 
 * Manufacturer:
 * Monotype Typography, Inc.
 * 
 * Designer:
 * Monotype Type Drawing Office
 * 
 * Vendor URL:
 * http://www.monotype.com/html/mtname/ms_welcome.html
 * 
 * License information:
 * http://www.monotype.com/html/type/license.html
 */
Cufon.registerFont({"w":199,"face":{"font-family":"Century Gothic","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"2 11 5 2 2 2 2 2 2 4","ascent":"288","descent":"-72","x-height":"5","bbox":"-11 -281 329 79.2683","underline-thickness":"20.918","underline-position":"-24.2578","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":99},"!":{"d":"66,-265r0,200r-26,0r0,-200r26,0xm31,-17v0,-27,44,-28,44,0v0,12,-10,22,-22,22v-12,0,-22,-10,-22,-22","w":106},"\"":{"d":"99,-184r-18,0r-4,-81r26,0xm31,-184r-19,0r-4,-81r26,0","w":111},"#":{"d":"217,-106r0,19r-44,0r-13,87r-19,0r12,-87r-58,0r-13,87r-20,0r14,-87r-44,0r0,-19r47,0r9,-59r-45,0r0,-19r47,0r13,-82r18,0r-11,82r58,0r12,-82r20,0r-13,82r40,0r0,19r-42,0r-9,59r41,0xm165,-165r-58,0r-9,59r58,0","w":259},"$":{"d":"29,-197v0,-37,27,-58,64,-62r0,-18r23,0r0,19v26,6,39,15,53,36r-19,15v-9,-14,-20,-22,-34,-25r0,87v48,28,72,32,72,82v0,41,-28,65,-72,69r0,55r-23,0r0,-55v-41,-3,-63,-19,-80,-46r18,-14v16,22,37,34,62,36r0,-109v-40,-20,-64,-24,-64,-70xm93,-234v-31,0,-49,33,-31,58v6,9,17,16,31,22r0,-80xm116,-19v36,-2,62,-41,37,-71v-7,-9,-19,-17,-37,-27r0,98"},"%":{"d":"68,-265v49,9,106,12,154,-5r21,0r-189,288r-23,0r171,-262v-22,6,-52,7,-83,7v29,39,-4,94,-51,94v-33,0,-62,-28,-60,-61v1,-35,25,-60,60,-61xm108,-204v0,-20,-19,-39,-39,-39v-20,0,-39,19,-39,39v0,20,18,38,39,38v21,0,39,-18,39,-38xm149,-53v0,-33,28,-61,61,-61v33,0,61,28,61,61v0,33,-28,61,-61,61v-33,0,-61,-28,-61,-61xm249,-53v1,-20,-18,-39,-39,-39v-21,0,-38,18,-38,39v0,20,18,38,38,38v21,0,39,-18,39,-38","w":278},"&":{"d":"175,-202v-2,32,-19,42,-45,65r66,68v19,-16,19,-16,31,-27r18,19v-11,10,-22,19,-31,26r49,51r-36,0r-33,-35v-37,27,-49,42,-96,42v-37,0,-67,-25,-67,-60v0,-45,26,-56,63,-88v-20,-27,-34,-32,-34,-61v0,-64,118,-61,115,0xm117,-224v-21,0,-38,16,-28,35v6,10,15,21,25,33v18,-14,30,-26,35,-46v0,-14,-15,-22,-32,-22xm57,-55v1,29,39,47,70,32v14,-6,30,-17,49,-30r-65,-69v-31,26,-47,34,-54,67","w":272},"'":{"d":"45,-184r-18,0r-4,-81r26,0","w":71},"(":{"d":"111,-270v-46,84,-50,251,-9,345r-27,0v-39,-94,-36,-257,8,-345r28,0","w":132},")":{"d":"57,-270v41,93,37,257,-7,345r-28,0v45,-87,51,-252,8,-345r27,0","w":132},"*":{"d":"65,-265r23,0r-5,52r43,-31r11,20r-48,22r48,21r-11,20r-43,-30r5,52r-23,0r5,-52r-43,30r-12,-20r50,-21r-50,-22r12,-20r43,31","w":152},"+":{"d":"97,-141r0,-77r24,0r0,77r77,0r0,24r-77,0r0,76r-24,0r0,-76r-77,0r0,-24r77,0","w":218},",":{"d":"52,-47r24,11r-36,66r-18,-7","w":99},"-":{"d":"11,-108r97,0r0,22r-97,0r0,-22","w":119},"\u00ad":{"d":"11,-108r97,0r0,22r-97,0r0,-22","w":119},".":{"d":"33,-17v0,-12,10,-22,21,-22v12,0,22,10,22,22v0,12,-9,23,-22,22v-12,0,-21,-10,-21,-22","w":99},"\/":{"d":"147,-265r-107,300r-27,0r107,-300r27,0","w":157},"0":{"d":"98,7v-66,0,-87,-58,-87,-136v0,-79,19,-136,87,-136v68,0,90,59,90,136v0,77,-23,136,-90,136xm99,-240v-51,6,-63,48,-63,111v0,64,11,112,63,112v52,0,65,-55,65,-112v0,-59,-14,-107,-65,-111"},"1":{"d":"67,-259r50,0r0,259r-25,0r0,-233r-41,0"},"2":{"d":"102,-240v-37,0,-58,25,-60,62r-25,0v0,-50,38,-86,86,-87v60,-2,101,64,69,118v-21,36,-74,87,-105,122r119,0r0,25r-175,0r99,-107v29,-34,45,-39,48,-80v2,-29,-26,-54,-56,-53"},"3":{"d":"97,-240v-29,1,-39,16,-49,41r-27,0v8,-38,34,-64,76,-66v69,-4,103,88,41,120v26,9,48,37,48,68v0,71,-91,109,-144,64v-15,-13,-24,-31,-29,-56r25,0v8,32,25,49,60,50v35,1,62,-24,62,-56v0,-41,-29,-55,-76,-56r0,-24v32,-1,60,-12,60,-43v1,-24,-21,-43,-47,-42"},"4":{"d":"153,-265r6,0r0,180r31,0r0,25r-31,0r0,60r-26,0r0,-60r-124,0xm133,-85r0,-108r-76,108r76,0"},"5":{"d":"157,-85v0,-59,-64,-73,-116,-45r24,-129r112,0r0,25r-92,0r-13,71v61,-20,112,20,112,79v0,102,-158,126,-169,21r26,0v5,28,23,44,54,45v35,1,62,-31,62,-67"},"6":{"d":"103,7v-57,0,-96,-57,-72,-113v24,-55,70,-108,101,-159r21,14r-70,106v53,-20,102,21,101,72v-1,47,-34,80,-81,80xm158,-73v0,-29,-25,-54,-54,-54v-30,0,-55,25,-55,54v0,29,26,54,55,54v28,0,54,-26,54,-54"},"7":{"d":"26,-259r164,0r-138,266r-22,-11r120,-230r-124,0r0,-25"},"8":{"d":"175,-197v0,29,-16,43,-37,55v28,15,48,31,49,68v0,48,-37,81,-88,81v-51,0,-87,-35,-87,-79v0,-36,21,-55,50,-70v-22,-11,-38,-29,-38,-56v0,-39,34,-67,77,-67v42,0,74,28,74,68xm149,-198v0,-23,-20,-42,-49,-42v-26,0,-49,18,-49,43v-1,23,26,46,50,45v26,-2,48,-19,48,-46xm161,-74v0,-29,-29,-55,-60,-55v-34,0,-64,27,-63,58v1,33,27,53,62,53v35,1,61,-24,61,-56"},"9":{"d":"98,-265v82,-2,89,94,49,155r-78,117r-21,-14r70,-106v-53,20,-101,-21,-100,-72v0,-49,34,-79,80,-80xm43,-185v0,28,26,54,54,54v29,0,55,-25,55,-54v0,-29,-26,-55,-55,-55v-29,0,-54,26,-54,55"},":":{"d":"33,-174v0,-12,9,-22,21,-22v12,0,23,9,22,22v0,12,-10,21,-22,21v-12,0,-21,-9,-21,-21xm33,-17v0,-12,10,-22,21,-22v12,0,22,10,22,22v0,12,-9,23,-22,22v-12,0,-21,-10,-21,-22","w":99},";":{"d":"33,-174v0,-12,9,-22,21,-22v12,0,23,9,22,22v0,12,-10,21,-22,21v-12,0,-21,-9,-21,-21xm52,-47r24,11r-36,66r-18,-7","w":99},"\u037e":{"d":"33,-174v0,-12,9,-22,21,-22v12,0,23,9,22,22v0,12,-10,21,-22,21v-12,0,-21,-9,-21,-21xm52,-47r24,11r-36,66r-18,-7","w":99},"<":{"d":"200,-61r0,26r-182,-83r0,-23r182,-82r0,25r-148,69","w":218},"=":{"d":"198,-180r0,24r-178,0r0,-24r178,0xm198,-103r0,24r-178,0r0,-24r178,0","w":218},">":{"d":"18,-61r148,-68r-148,-69r0,-25r182,82r0,23r-182,83r0,-26","w":218},"?":{"d":"107,-240v-31,0,-52,19,-52,52r-25,0v-1,-47,31,-77,77,-77v62,0,97,63,52,102v-19,16,-88,25,-87,56v0,16,18,26,36,26v26,0,35,-13,38,-37r26,0v-2,38,-25,62,-64,62v-34,0,-62,-20,-62,-51v0,-65,106,-45,109,-97v1,-22,-23,-36,-48,-36xm85,-17v0,-12,10,-22,22,-22v11,0,21,10,21,22v0,12,-9,22,-21,22v-12,0,-23,-9,-22,-22","w":212},"@":{"d":"38,-133v-6,114,153,162,216,80r18,0v-29,37,-54,58,-108,58v-82,0,-140,-55,-140,-137v0,-81,56,-137,138,-139v65,-2,126,52,126,113v0,59,-39,99,-90,104v-13,1,-22,-4,-21,-19v-31,38,-101,8,-97,-46v3,-42,30,-85,75,-83v24,1,35,9,46,26r5,-24r19,0r-22,122v0,5,3,10,9,9v34,-6,62,-42,62,-85v0,-58,-53,-102,-113,-101v-74,1,-119,50,-123,122xm157,-183v-56,-3,-75,107,-10,108v50,1,68,-107,10,-108","w":312},"A":{"d":"137,-259r121,259r-28,0r-41,-85r-111,0r-41,85r-28,0r122,-259r6,0xm134,-204r-45,94r89,0","w":266},"B":{"d":"187,-74v0,44,-37,75,-84,74r-71,0r0,-259v69,-3,134,0,134,64v0,26,-14,44,-33,54v32,11,54,28,54,67xm139,-195v1,-39,-40,-40,-82,-38r0,83v47,2,80,-5,82,-45xm160,-74v0,-47,-45,-52,-103,-50r0,99v55,2,103,-1,103,-49","w":206},"C":{"d":"20,-131v0,-99,109,-165,204,-120v19,10,36,23,48,40r-20,16v-20,-26,-51,-45,-93,-45v-65,0,-109,45,-112,112v-4,105,145,149,205,68r20,15v-24,30,-61,52,-113,52v-80,2,-139,-58,-139,-138","w":292},"D":{"d":"249,-126v0,81,-45,128,-135,126r-83,0r0,-259r54,0v111,-3,164,38,164,133xm223,-126v0,-89,-61,-113,-167,-107r0,209v104,5,167,-13,167,-102","w":267},"E":{"d":"32,-259r148,0r0,26r-123,0r0,81r122,0r0,25r-122,0r0,102r122,0r0,25r-147,0r0,-259","w":193},"F":{"d":"31,-259r130,0r0,26r-104,0r0,81r104,0r0,25r-104,0r0,127r-26,0r0,-259","w":174},"G":{"d":"21,-129v-1,-102,103,-162,203,-124v19,8,39,21,57,38r-20,19v-24,-24,-58,-43,-98,-43v-64,0,-111,45,-115,109v-8,122,200,156,219,31r-82,0r0,-25r111,0v1,80,-52,129,-130,131v-80,2,-144,-58,-145,-136","w":313},"H":{"d":"31,-259r26,0r0,109r132,0r0,-109r26,0r0,259r-26,0r0,-125r-132,0r0,125r-26,0r0,-259","w":245},"I":{"d":"28,-259r26,0r0,259r-26,0r0,-259","w":81},"J":{"d":"29,-41v36,34,87,33,87,-44r0,-174r26,0r0,175v15,96,-75,110,-127,63","w":173},"K":{"d":"31,-259r27,0r0,97r103,-97r35,0r-124,116r134,143r-35,0r-113,-121r0,121r-27,0r0,-259","w":212},"L":{"d":"31,-259r26,0r0,234r100,0r0,25r-126,0r0,-259","w":166},"M":{"d":"20,0r36,-259r5,0r105,213r104,-213r4,0r37,259r-25,0r-26,-185r-91,185r-7,0r-92,-186r-25,186r-25,0","w":330},"N":{"d":"32,0r0,-259r5,0r172,198r0,-198r26,0r0,259r-6,0r-171,-195r0,195r-26,0","w":266},"O":{"d":"20,-128v2,-80,56,-135,135,-137v76,-2,137,61,137,136v0,74,-61,136,-135,136v-74,0,-138,-62,-137,-135xm266,-129v0,-65,-47,-111,-110,-111v-63,0,-108,47,-109,112v-1,60,49,111,109,109v65,-1,110,-46,110,-110","w":312},"P":{"d":"193,-190v-4,67,-55,73,-136,70r0,120r-26,0r0,-259r52,0v74,-3,102,12,110,69xm166,-190v0,-49,-56,-44,-109,-43r0,87v52,2,109,7,109,-44","w":213},"Q":{"d":"293,-129v-1,46,-18,76,-45,101r39,48r-32,0r-26,-33v-90,57,-212,-14,-208,-115v3,-80,55,-135,135,-137v75,-2,138,62,137,136xm47,-128v-3,81,92,138,165,94r-57,-73r31,0r46,59v70,-63,23,-196,-75,-192v-64,3,-108,47,-110,112","w":313},"R":{"d":"195,-190v0,50,-35,70,-90,70r93,120r-32,0r-93,-120r-14,0r0,120r-26,0r0,-259v84,-2,162,-5,162,69xm168,-190v0,-49,-56,-44,-109,-43r0,88v53,1,109,5,109,-45","w":218},"S":{"d":"144,-102v44,64,-39,141,-104,96v-13,-8,-24,-22,-35,-42r22,-13v15,28,33,42,53,42v27,0,48,-17,48,-44v0,-62,-107,-74,-107,-141v0,-49,54,-76,97,-52v11,6,22,17,34,33r-21,16v-16,-20,-22,-29,-48,-31v-36,-3,-46,46,-19,66v13,9,74,54,80,70","w":179},"T":{"d":"6,-233r0,-26r142,0r0,26r-58,0r0,233r-26,0r0,-233r-58,0","w":153},"U":{"d":"121,7v-63,0,-89,-33,-89,-109r0,-157r26,0r0,157v-5,59,16,84,61,84v93,0,49,-150,59,-241r26,0v-5,112,31,266,-83,266","w":235},"V":{"d":"12,-259r28,0r86,200r87,-200r28,0r-113,259r-5,0","w":252},"W":{"d":"17,-259r26,0r53,187r74,-187r5,0r74,187r53,-187r27,0r-74,259r-5,0r-77,-196r-78,196r-5,0","w":345},"X":{"d":"18,-259r30,0r62,101r62,-101r30,0r-77,126r82,133r-30,0r-67,-108r-68,108r-30,0r83,-133","w":219},"Y":{"d":"11,-259r30,0r66,107r65,-107r30,0r-82,135r0,124r-25,0r0,-124","w":213},"Z":{"d":"21,-234r0,-25r137,0r-108,234r102,0r0,25r-142,0r109,-234r-98,0","w":172},"[":{"d":"51,-265r59,0r0,25r-34,0r0,286r34,0r0,24r-59,0r0,-335","w":126},"\\":{"d":"39,-265r167,300r-27,0r-167,-300r27,0","w":217},"]":{"d":"75,70r-59,0r0,-25r35,0r0,-286r-35,0r0,-24r59,0r0,335","w":126},"^":{"d":"111,-259r20,0r90,195r-23,0r-78,-168r-76,168r-23,0","w":241},"_":{"d":"-2,27r184,0r0,18r-184,0r0,-18","w":180},"`":{"d":"57,-281r39,54r-25,0r-51,-54r37,0","w":136},"a":{"d":"118,-196v36,1,59,18,76,40r0,-35r24,0r0,191r-24,0r0,-33v-18,23,-42,36,-77,38v-53,1,-98,-48,-98,-101v0,-53,45,-101,99,-100xm195,-95v0,-42,-34,-78,-75,-77v-45,1,-76,32,-76,77v0,43,32,77,75,77v44,0,76,-30,76,-77","w":245},"b":{"d":"129,5v-36,-1,-59,-18,-76,-40r0,35r-24,0r0,-265r24,0r0,107v17,-23,41,-37,77,-38v54,-2,98,48,98,101v0,53,-45,101,-99,100xm52,-97v0,42,34,79,75,78v45,-1,76,-32,76,-77v0,-44,-31,-78,-75,-78v-44,0,-76,30,-76,77","w":245},"c":{"d":"18,-94v0,-102,146,-136,195,-58r-19,13v-40,-61,-151,-34,-151,43v0,78,109,104,151,45r19,13v-17,25,-47,43,-89,43v-57,0,-106,-43,-106,-99","w":232},"d":{"d":"118,-196v36,1,59,17,76,40r0,-109r24,0r0,265r-24,0r0,-33v-18,23,-42,36,-77,38v-53,1,-98,-48,-98,-101v0,-53,45,-101,99,-100xm196,-95v0,-42,-35,-78,-76,-77v-45,1,-76,32,-76,77v0,44,32,77,76,77v44,0,76,-31,76,-77","w":246},"e":{"d":"116,-18v39,-2,56,-16,72,-45r21,10v-17,34,-42,57,-91,58v-58,1,-100,-47,-100,-100v0,-54,43,-101,98,-101v56,0,100,43,100,102r-172,0v-1,42,31,78,72,76xm188,-115v-6,-52,-80,-76,-120,-40v-10,9,-17,22,-22,40r142,0","w":233},"f":{"d":"39,-191v-1,-42,-2,-81,39,-79v8,0,17,2,28,5r0,24v-23,-10,-47,-11,-42,24r0,26r40,0r0,21r-40,0r0,170r-25,0r0,-170r-25,0r0,-21r25,0","w":113},"g":{"d":"18,-97v0,-94,127,-132,174,-61r0,-33r25,0r0,152v24,131,-159,148,-197,54r27,0v31,61,167,48,145,-51v-46,66,-174,33,-174,-61xm193,-97v0,-45,-29,-75,-73,-75v-45,0,-76,32,-78,76v-2,42,33,73,76,73v44,0,75,-30,75,-74","w":242},"h":{"d":"119,-173v-76,1,-68,89,-67,173r-25,0r0,-265r25,0r0,108v17,-22,38,-38,72,-39v87,-1,69,108,70,196r-24,0v-5,-70,22,-174,-51,-173","w":219},"i":{"d":"16,-250v0,-11,9,-20,20,-20v11,0,20,9,20,20v0,11,-9,21,-20,21v-11,0,-20,-10,-20,-21xm24,-191r25,0r0,191r-25,0r0,-191","w":72},"j":{"d":"16,-250v0,-11,10,-20,21,-20v11,0,20,9,20,20v0,11,-9,21,-20,21v-12,0,-21,-9,-21,-21xm-11,47v21,10,35,5,35,-25r0,-213r25,0r0,220v4,42,-26,55,-60,40r0,-22","w":73},"k":{"d":"27,-265r25,0r0,151r88,-77r37,0r-105,91r111,100r-35,0r-96,-86r0,86r-25,0r0,-265","w":180},"l":{"d":"24,-265r24,0r0,265r-24,0r0,-265","w":72},"m":{"d":"113,-172v-73,0,-61,94,-61,172r-25,0r0,-191r25,0r0,33v15,-22,34,-38,65,-38v35,1,51,18,61,46v13,-26,36,-45,70,-46v85,-1,62,111,65,196r-25,0v-7,-66,25,-173,-45,-172v-74,1,-60,94,-61,172r-24,0v-6,-66,23,-172,-45,-172","w":337},"n":{"d":"119,-173v-76,1,-68,89,-67,173r-25,0r0,-191r25,0r0,34v17,-22,38,-38,72,-39v87,-1,69,108,70,196r-24,0v-5,-70,22,-174,-51,-173","w":219},"o":{"d":"18,-95v0,-54,45,-101,100,-101v54,0,99,45,99,101v0,54,-44,100,-99,100v-55,0,-100,-46,-100,-100xm192,-95v2,-40,-35,-77,-74,-77v-39,0,-77,36,-75,77v1,44,31,77,75,77v44,0,72,-33,74,-77","w":235},"p":{"d":"129,5v-35,-2,-59,-16,-77,-38r0,103r-24,0r0,-261r24,0r0,35v17,-23,40,-39,76,-40v54,-1,99,47,99,100v0,53,-45,102,-98,101xm202,-95v0,-45,-31,-76,-76,-77v-41,-1,-76,35,-76,77v0,46,33,77,77,77v43,0,75,-34,75,-77","w":245},"q":{"d":"117,-196v37,1,60,17,77,40r0,-35r24,0r0,261r-24,0r0,-103v-18,23,-42,36,-77,38v-53,1,-98,-47,-98,-101v0,-53,45,-101,98,-100xm195,-95v1,-42,-35,-78,-76,-77v-45,1,-76,33,-76,77v0,42,32,77,76,77v44,0,75,-31,76,-77","w":245},"r":{"d":"43,0r-25,0r0,-191r25,0r0,28v15,-23,40,-43,72,-27r-13,21v-75,-15,-56,95,-59,169","w":108},"s":{"d":"18,-146v4,-55,72,-66,106,-24r-16,16v-21,-26,-62,-26,-68,7v7,45,84,41,84,96v0,59,-86,74,-115,29r16,-18v13,14,26,22,40,22v18,0,35,-14,35,-32v-4,-47,-86,-40,-82,-96","w":139},"t":{"d":"49,-262r25,0r0,71r39,0r0,21r-39,0r0,170r-25,0r0,-170r-34,0r0,-21r34,0r0,-71","w":121},"u":{"d":"108,5v-98,0,-84,-101,-84,-196r25,0v3,75,-18,178,59,172v46,-3,58,-23,58,-83r0,-89r26,0v0,0,14,196,-84,196","w":218},"v":{"d":"9,-191r27,0r63,139r64,-139r26,0r-87,191r-5,0"},"w":{"d":"2,-191r25,0r58,139r62,-139r4,0r61,139r60,-139r26,0r-83,191r-5,0r-61,-137r-61,137r-5,0","w":299},"x":{"d":"6,-191r29,0r51,71r50,-71r30,0r-65,91r73,100r-30,0r-58,-80r-58,80r-29,0r72,-100","w":172},"y":{"d":"7,-191r26,0r66,147r63,-147r27,0r-114,261r-26,0r36,-84","w":193},"z":{"d":"12,-191r140,0r-108,169r105,0r0,22r-147,0r108,-170r-98,0r0,-21","w":152},"{":{"d":"50,-7v0,-44,-2,-64,-37,-68r0,-29v40,-4,37,-33,37,-81v0,-56,12,-76,65,-74r0,28v-29,0,-37,5,-36,36v0,63,1,86,-36,105v29,14,36,33,36,80v0,48,-7,62,36,62r0,27v-59,2,-65,-24,-65,-86","w":126},"|":{"d":"108,-265r25,0r0,335r-25,0r0,-335","w":241},"}":{"d":"77,-172v-1,45,1,64,36,68r0,29v-39,0,-37,40,-36,80v1,55,-12,77,-66,74r0,-27v29,0,37,-5,36,-36v0,-63,1,-87,37,-106v-31,-16,-36,-31,-37,-79v0,-52,6,-60,-36,-62r0,-28v59,-2,67,25,66,87","w":126},"~":{"d":"154,-128v21,-1,21,-7,44,-19r0,28v-20,10,-25,15,-44,17v-22,3,-66,-28,-88,-28v-21,0,-26,7,-46,19r0,-29v20,-10,25,-14,44,-16v22,-2,65,29,90,28","w":218},"\u00a0":{"w":99}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc /
 * Type Solutions Inc. 1990-91 All Rights Reserved
 */
Cufon.registerFont({"w":201,"face":{"font-family":"Century Gothic","font-weight":600,"font-stretch":"normal","units-per-em":"360","panose-1":"2 11 7 2 2 2 2 2 2 4","ascent":"288","descent":"-72","x-height":"5","bbox":"-15 -295 317.934 79.1618","underline-thickness":"32.3438","underline-position":"-16.875","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":100},"!":{"d":"26,-265r49,0r0,189r-49,0r0,-189xm20,-25v0,-15,15,-30,30,-30v16,0,31,14,31,30v0,16,-15,30,-31,30v-15,0,-30,-15,-30,-30","w":100},"\"":{"d":"115,-176r-28,0r-9,-89r47,0xm43,-176r-28,0r-10,-89r47,0","w":129},"#":{"d":"195,-119r0,35r-40,0r-13,84r-35,0r12,-84r-34,0r-12,84r-35,0r12,-84r-39,0r0,-35r45,0r5,-33r-39,0r0,-35r44,0r11,-78r35,0r-11,78r33,0r12,-78r35,0r-11,78r35,0r0,35r-40,0r-5,33r35,0xm129,-152r-34,0r-4,33r33,0","w":216},"$":{"d":"54,-144v-52,-33,-29,-124,39,-121r0,-18r33,0r0,20v27,7,37,15,57,34r-34,33v-16,-16,-31,-24,-46,-24v-45,0,-32,43,6,57v53,19,84,31,84,90v0,45,-24,71,-67,79r0,47r-33,0r0,-46v-38,-5,-59,-21,-81,-44r34,-35v21,23,42,35,62,35v27,1,49,-34,30,-57v-15,-18,-75,-39,-84,-50"},"%":{"d":"67,-265v54,9,126,22,171,-5r35,0r-205,288r-35,0r175,-247v-25,4,-54,6,-81,4v16,44,-18,83,-58,83v-33,1,-62,-29,-62,-61v0,-35,28,-59,60,-62xm99,-203v0,-15,-15,-30,-30,-30v-15,0,-30,15,-30,30v0,15,14,29,30,29v16,0,30,-14,30,-29xm179,-55v0,-33,29,-62,61,-62v33,0,62,29,62,62v0,33,-29,62,-62,62v-33,0,-61,-29,-61,-62xm270,-55v0,-15,-15,-30,-30,-30v-15,0,-30,15,-30,30v0,15,15,30,30,30v15,0,30,-15,30,-30","w":309},"&":{"d":"164,-192v0,36,-16,39,-42,68v20,24,34,39,41,46r29,-24r29,34r-27,24r42,44r-60,0r-17,-18v-54,39,-142,34,-142,-38v0,-38,19,-54,46,-76v-44,-47,-26,-113,38,-116v35,-2,63,26,63,56xm102,-203v-22,3,-19,27,-4,44v13,-11,20,-20,20,-29v0,-8,-7,-16,-16,-15xm63,-58v7,28,39,23,64,6r-38,-44v-17,14,-26,27,-26,38","w":244},"'":{"d":"53,-176r-27,0r-10,-89r47,0","w":79},"(":{"d":"67,75v-66,-86,-69,-261,0,-345r61,0v-39,43,-62,93,-62,171v0,81,21,123,62,174r-61,0","w":136},")":{"d":"70,-270v66,87,68,260,0,345r-61,0v38,-44,63,-91,62,-171v-1,-81,-21,-123,-62,-174r61,0","w":136},"*":{"d":"58,-265r45,0r-14,53r40,-38r20,39r-53,14r53,15r-23,38r-38,-38r13,53r-43,0r14,-53r-39,38r-24,-38r54,-15r-54,-15r24,-39r39,39","w":158},"+":{"d":"86,-151r0,-66r44,0r0,66r66,0r0,44r-66,0r0,66r-44,0r0,-66r-66,0r0,-44r66,0","w":216},",":{"d":"47,-49r35,18r-44,74r-24,-12","w":100},"-":{"d":"31,-118r89,0r0,45r-89,0r0,-45","w":151},".":{"d":"23,-23v0,-15,12,-27,27,-27v16,0,28,11,28,27v0,16,-12,28,-28,28v-16,0,-27,-12,-27,-28","w":100},"\/":{"d":"8,46r116,-312r34,0r-116,312r-34,0","w":165},"0":{"d":"10,-127v0,-83,22,-138,90,-138v71,0,92,60,92,136v-1,80,-19,136,-91,136v-71,0,-91,-53,-91,-134xm101,-39v55,4,48,-125,30,-160v-7,-14,-18,-19,-30,-19v-40,0,-42,42,-42,92v0,51,7,84,42,87"},"1":{"d":"59,-259r74,0r0,259r-49,0r0,-212r-53,0"},"2":{"d":"100,-219v-23,1,-37,19,-37,44r-48,0v-1,-56,37,-89,89,-90v66,-1,100,66,68,126v-14,26,-51,67,-77,93r92,0r0,46r-179,0r0,-24v41,-51,116,-90,128,-161v3,-19,-17,-35,-36,-34"},"3":{"d":"126,-193v2,-36,-53,-29,-58,-2r-47,0v4,-41,38,-70,80,-70v40,0,75,30,75,68v0,26,-17,45,-37,55v93,27,43,154,-41,149v-50,-3,-86,-33,-87,-85r48,0v0,50,83,50,82,1v-1,-26,-27,-44,-60,-42r0,-42v24,-1,44,-10,45,-32"},"4":{"d":"119,-265r49,0r0,166r23,0r0,46r-23,0r0,53r-48,0r0,-53r-113,0r0,-46xm120,-99r0,-86r-59,86r59,0"},"5":{"d":"137,-81v0,-39,-49,-55,-68,-25r-40,-9r31,-144r121,0r0,46r-84,0r-11,47v54,-14,99,30,99,83v0,71,-89,118,-145,71v-16,-13,-27,-30,-32,-52r52,0v13,39,77,28,77,-17"},"6":{"d":"99,7v-57,0,-101,-64,-72,-120r77,-152r42,21r-45,88v45,-2,79,38,79,82v0,43,-38,81,-81,81xm132,-75v0,-19,-14,-35,-34,-35v-18,0,-32,16,-32,35v0,18,15,35,32,35v18,0,35,-16,34,-35"},"7":{"d":"22,-259r169,0r0,26r-116,240r-42,-21r97,-198r-108,0r0,-47"},"8":{"d":"101,-265v71,-6,100,85,53,125v20,13,37,35,37,67v0,50,-35,80,-90,80v-92,0,-116,-109,-54,-147v-47,-39,-18,-133,54,-125xm129,-189v0,-17,-12,-29,-30,-29v-16,0,-27,12,-27,29v0,15,13,29,28,29v17,0,29,-12,29,-29xm142,-76v0,-21,-20,-38,-41,-38v-22,0,-42,16,-42,37v0,21,20,37,42,37v22,0,41,-14,41,-36"},"9":{"d":"102,-265v69,0,96,75,62,141r-67,131r-42,-21r46,-88v-44,1,-79,-38,-79,-82v0,-43,37,-81,80,-81xm70,-184v0,19,13,35,33,35v19,0,33,-17,33,-35v1,-18,-15,-35,-33,-35v-18,0,-33,17,-33,35"},":":{"d":"23,-169v0,-15,12,-27,27,-27v16,0,28,11,28,27v0,15,-12,29,-28,28v-16,0,-27,-12,-27,-28xm23,-23v0,-15,12,-27,27,-27v16,0,28,11,28,27v0,16,-12,28,-28,28v-16,0,-27,-12,-27,-28","w":100},";":{"d":"23,-169v0,-15,12,-27,27,-27v16,0,28,11,28,27v0,16,-12,28,-28,28v-16,0,-27,-12,-27,-28xm48,-49r33,18r-43,74r-24,-12","w":100},"<":{"d":"196,-64r0,44r-176,-90r0,-39r176,-89r0,44r-125,65","w":216},"=":{"d":"20,-189r176,0r0,44r-176,0r0,-44xm20,-114r176,0r0,44r-176,0r0,-44","w":216},">":{"d":"20,-194r0,-44r176,89r0,39r-176,90r0,-44r126,-65","w":216},"?":{"d":"101,-226v-20,1,-38,13,-37,34r-46,0v-1,-47,37,-78,85,-78v49,0,78,27,80,72v2,58,-67,60,-63,123r-47,0v-9,-53,37,-83,58,-110v14,-19,-6,-42,-30,-41xm67,-25v-1,-16,14,-30,30,-30v18,0,31,14,31,30v1,15,-15,30,-30,30v-17,0,-31,-14,-31,-30"},"@":{"d":"27,-134v-6,99,127,148,189,81r33,0v-28,36,-53,58,-109,58v-81,0,-139,-58,-139,-138v0,-80,57,-135,139,-138v65,-2,125,52,125,113v0,59,-40,98,-90,104v-13,2,-22,-5,-22,-18v-34,39,-101,5,-96,-48v-8,-62,80,-116,118,-61r4,-19r35,0r-20,115v0,3,3,6,7,6v24,-6,40,-37,40,-69v-2,-61,-41,-97,-102,-97v-67,0,-108,45,-112,111xm137,-165v-38,-3,-53,72,-7,73v38,2,50,-72,7,-73","w":266},"A":{"d":"108,-259r50,0r100,259r-51,0r-21,-53r-105,0r-21,53r-51,0xm134,-190r-35,89r69,0","w":266},"B":{"d":"191,-75v0,49,-33,75,-89,75r-72,0r0,-259v73,-3,141,1,142,67v0,24,-10,38,-26,50v28,12,45,32,45,67xm125,-185v1,-23,-20,-29,-46,-27r0,55v26,1,46,-5,46,-28xm143,-77v0,-30,-27,-38,-64,-36r0,66v35,0,64,-1,64,-30","w":208},"C":{"d":"17,-130v0,-133,179,-177,250,-83r-34,33v-52,-67,-167,-37,-167,50v0,93,122,115,167,52r33,35v-34,32,-57,49,-112,50v-78,1,-137,-57,-137,-137","w":280},"D":{"d":"235,-126v0,87,-42,132,-146,126r-59,0r0,-259r58,0v96,-4,147,45,147,133xm185,-127v0,-62,-36,-89,-106,-84r0,163v72,6,106,-16,106,-79","w":252},"E":{"d":"30,-259r141,0r0,49r-92,0r0,46r92,0r0,48r-92,0r0,68r92,0r0,48r-141,0r0,-259","w":187},"F":{"d":"30,-259r129,0r0,48r-80,0r0,47r80,0r0,48r-80,0r0,116r-49,0r0,-259","w":172},"G":{"d":"18,-131v-7,-125,176,-181,250,-85r-34,34v-52,-65,-167,-33,-167,52v0,83,131,127,164,45r-75,0r0,-46r130,0v3,80,-48,138,-128,138v-84,0,-135,-56,-140,-138","w":302},"H":{"d":"29,-259r50,0r0,98r87,0r0,-98r50,0r0,259r-50,0r0,-113r-87,0r0,113r-50,0r0,-259","w":244},"I":{"d":"26,-259r49,0r0,259r-49,0r0,-259","w":100},"J":{"d":"78,-42v16,0,16,-14,16,-36r0,-181r49,0r0,172v17,104,-91,118,-136,56r35,-33v12,13,18,22,36,22","w":172},"K":{"d":"30,-259r50,0r0,89r70,-89r59,0r-90,116r99,143r-59,0r-79,-115r0,115r-50,0r0,-259","w":223},"L":{"d":"30,-259r49,0r0,212r71,0r0,47r-120,0r0,-259","w":158},"M":{"d":"54,-259r49,0r59,181r61,-181r48,0r43,259r-47,0r-28,-163r-55,163r-44,0r-54,-163r-28,163r-48,0","w":323},"N":{"d":"30,-259r47,0r111,171r0,-171r49,0r0,259r-47,0r-111,-170r0,170r-49,0r0,-259","w":266},"O":{"d":"17,-129v2,-78,56,-134,135,-136v71,-1,133,63,133,137v0,74,-61,135,-133,135v-74,0,-137,-63,-135,-136xm236,-129v0,-47,-39,-88,-85,-88v-48,0,-85,40,-85,89v0,48,38,87,86,87v46,1,84,-40,84,-88","w":302},"P":{"d":"183,-184v-3,56,-36,77,-104,74r0,110r-50,0r0,-259v82,-3,158,-1,154,75xm135,-184v0,-26,-27,-27,-56,-26r0,52v30,1,56,2,56,-26"},"Q":{"d":"152,-265v110,-5,178,146,99,227r45,58r-58,0r-23,-29v-91,51,-202,-25,-198,-120v2,-79,56,-133,135,-136xm66,-128v0,58,60,105,119,80r-46,-60r58,0r24,30v40,-57,-4,-139,-69,-139v-49,0,-86,40,-86,89","w":302},"R":{"d":"187,-184v-1,38,-20,58,-50,69r62,115r-54,0r-58,-110r-5,0r0,110r-49,0r0,-259v83,-3,155,-1,154,75xm139,-184v-1,-28,-25,-27,-57,-26r0,52v30,0,58,2,57,-26","w":208},"S":{"d":"32,-162v-43,-58,30,-129,95,-94v12,6,24,17,38,33r-36,32v-13,-18,-26,-27,-39,-27v-11,0,-22,7,-22,17v15,47,102,67,102,134v0,62,-77,95,-128,60v-14,-9,-25,-24,-35,-43r42,-25v12,23,26,35,42,35v22,1,40,-23,24,-42v-15,-19,-78,-65,-83,-80","w":187},"T":{"d":"4,-259r143,0r0,49r-47,0r0,210r-50,0r0,-210r-46,0r0,-49","w":151},"U":{"d":"115,7v-63,-6,-87,-35,-87,-111r0,-155r49,0r0,168v0,33,8,50,37,50v32,0,39,-16,39,-56r0,-162r50,0r0,155v4,78,-25,105,-88,111","w":230},"V":{"d":"10,-259r50,0r66,184r65,-184r51,0r-93,259r-48,0","w":252},"W":{"d":"10,-259r48,0r38,165r46,-165r41,0r47,165r36,-165r49,0r-58,259r-47,0r-48,-167r-47,167r-47,0","w":323},"X":{"d":"13,-259r55,0r54,83r55,-83r55,0r-82,126r87,133r-55,0r-60,-91r-59,91r-56,0r88,-133","w":244},"Y":{"d":"11,-259r53,0r48,93r48,-93r52,0r-75,147r0,112r-50,0r0,-112","w":223},"Z":{"d":"16,-259r156,0r-92,212r86,0r0,47r-158,0r92,-210r-84,0r0,-49","w":180},"[":{"d":"30,-265r77,0r0,45r-29,0r0,245r29,0r0,45r-77,0r0,-335","w":115},"\\":{"d":"190,46r-34,0r-116,-312r34,0","w":230},"]":{"d":"85,70r-77,0r0,-45r29,0r0,-245r-29,0r0,-45r77,0r0,335","w":115},"^":{"d":"87,-259r41,0r69,195r-43,0r-46,-132r-46,132r-43,0","w":216},"_":{"d":"-2,27r184,0r0,18r-184,0r0,-18","w":180},"`":{"d":"67,-295r42,69r-34,0r-65,-69r57,0","w":151},"a":{"d":"15,-95v0,-83,98,-134,151,-75r0,-21r47,0r0,191r-47,0r0,-20v-53,58,-151,4,-151,-75xm168,-96v0,-33,-23,-55,-53,-56v-30,0,-52,25,-52,56v0,31,22,57,52,57v31,0,53,-25,53,-57","w":237},"b":{"d":"222,-95v7,79,-97,133,-150,75r0,20r-48,0r0,-265r48,0r0,95v52,-59,160,-8,150,75xm174,-96v0,-31,-22,-57,-52,-56v-30,1,-52,24,-52,56v0,31,22,57,52,57v30,0,52,-26,52,-57","w":237},"c":{"d":"15,-95v-5,-101,147,-135,196,-58r-39,22v-31,-39,-109,-19,-109,37v0,56,80,73,109,33r37,26v-20,27,-48,40,-86,40v-63,0,-105,-44,-108,-100","w":230},"d":{"d":"15,-95v0,-83,98,-134,151,-75r0,-95r47,0r0,265r-47,0r0,-20v-53,58,-151,4,-151,-75xm168,-96v0,-33,-23,-55,-53,-56v-30,0,-52,25,-52,56v0,31,22,57,52,57v31,0,53,-25,53,-57","w":237},"e":{"d":"114,-196v63,1,107,45,102,114r-154,0v2,46,72,60,101,26r40,19v-18,26,-44,42,-86,42v-58,0,-102,-44,-102,-100v0,-56,44,-102,99,-101xm168,-120v-8,-32,-58,-49,-87,-24v-6,4,-11,12,-17,24r104,0","w":230},"f":{"d":"99,-227v-16,-4,-31,-7,-32,12r-1,24r31,0r0,41r-31,0r0,150r-48,0r0,-150r-17,0r0,-41r17,0v-9,-73,26,-89,81,-72r0,36","w":100},"g":{"d":"16,-98v-9,-81,98,-130,150,-72r0,-21r47,0r0,164v19,122,-169,134,-197,41r53,0v17,22,82,23,92,-5v3,-7,5,-18,5,-33v-51,56,-159,4,-150,-74xm168,-98v0,-30,-23,-53,-52,-53v-29,0,-52,23,-52,53v0,35,23,54,53,55v30,1,51,-25,51,-55","w":237},"h":{"d":"114,-152v-60,0,-38,90,-42,152r-48,0r0,-265r48,0r0,93v38,-42,122,-26,122,46r0,126r-47,0v-6,-56,20,-152,-33,-152","w":216},"i":{"d":"15,-239v1,-15,12,-28,28,-28v16,0,28,12,28,28v0,15,-12,28,-28,28v-15,0,-28,-14,-28,-28xm19,-191r48,0r0,191r-48,0r0,-191","w":86},"j":{"d":"19,-239v0,-16,12,-28,28,-28v16,0,28,13,28,28v0,14,-13,28,-28,28v-15,0,-28,-14,-28,-28xm-15,30v17,9,38,7,38,-20r0,-201r48,0r0,197v5,59,-35,82,-86,62r0,-38","w":93},"k":{"d":"25,-265r48,0r0,153r70,-79r60,0r-82,92r92,99r-59,0r-81,-88r0,88r-48,0r0,-265","w":208},"l":{"d":"19,-265r48,0r0,265r-48,0r0,-265","w":86},"m":{"d":"113,-153v-59,0,-37,93,-41,153r-48,0r0,-191r48,0r0,22v24,-35,100,-36,116,7v13,-19,35,-33,64,-34v88,-4,61,112,65,196r-48,0v-7,-54,21,-153,-33,-153v-59,0,-37,93,-41,153r-48,0v-6,-56,20,-153,-34,-153","w":338},"n":{"d":"114,-152v-60,0,-38,91,-42,152r-48,0r0,-191r48,0r0,19v39,-43,122,-26,122,46r0,126r-48,0v-7,-55,21,-152,-32,-152","w":216},"o":{"d":"15,-95v1,-54,40,-101,99,-101v59,0,102,42,102,100v0,58,-42,99,-102,101v-54,1,-100,-47,-99,-100xm167,-96v0,-31,-23,-55,-52,-55v-30,-1,-52,24,-52,55v0,32,21,56,52,56v31,1,52,-25,52,-56","w":230},"p":{"d":"222,-95v7,79,-97,133,-150,75r0,90r-48,0r0,-261r48,0r0,21v52,-59,160,-8,150,75xm174,-96v0,-31,-22,-57,-52,-56v-30,1,-52,24,-52,56v0,31,22,57,52,57v30,0,52,-26,52,-57","w":237},"q":{"d":"15,-95v0,-83,98,-134,151,-75r0,-21r47,0r0,261r-47,0r0,-90v-53,58,-151,4,-151,-75xm168,-96v0,-33,-23,-55,-53,-56v-30,0,-52,25,-52,56v0,31,22,57,52,57v31,0,53,-25,53,-57","w":237},"r":{"d":"101,-150v-37,-16,-40,30,-40,73r0,77r-48,0r0,-191r41,0r0,24v9,-22,35,-37,62,-24","w":115},"s":{"d":"16,-141v-2,-61,97,-72,125,-24r-29,30v-12,-12,-23,-18,-33,-18v-11,0,-22,8,-15,19v30,21,81,31,81,79v0,68,-105,79,-136,27r30,-32v11,16,53,36,61,7v3,-11,-24,-24,-37,-30v-31,-15,-47,-34,-47,-58","w":158},"t":{"d":"30,-262r48,0r0,71r28,0r0,41r-28,0r0,150r-48,0r0,-150r-25,0r0,-41r25,0r0,-71","w":107},"u":{"d":"108,5v-96,6,-84,-98,-84,-196r49,0v6,55,-22,151,35,151v59,0,29,-96,36,-151r48,0r0,81v2,80,-18,111,-84,115","w":216},"v":{"d":"4,-191r49,0r48,113r48,-113r49,0r-82,191r-31,0"},"w":{"d":"3,-191r47,0r38,109r42,-109r29,0r40,107r39,-107r47,0r-70,191r-30,0r-41,-109r-42,109r-30,0","w":287},"x":{"d":"7,-191r56,0r37,52r38,-52r55,0r-65,90r73,101r-55,0r-46,-63r-45,63r-55,0r73,-101"},"y":{"d":"3,-191r49,0r50,120r55,-120r49,0r-120,261r-50,0r40,-84","w":208},"z":{"d":"16,-191r147,0r-86,150r81,0r0,41r-155,0r86,-151r-73,0r0,-40","w":165},"{":{"d":"41,1v0,-46,-2,-67,-39,-70r0,-42v35,-1,39,-23,39,-62v0,-71,17,-87,82,-86r0,43v-49,-10,-33,37,-38,74v-3,27,-12,39,-31,53v33,14,31,61,33,108v1,18,13,17,36,18r0,42v-61,2,-82,-14,-82,-78","w":122},"|":{"d":"94,-265r28,0r0,335r-28,0r0,-335","w":216},"}":{"d":"82,-180v-1,46,0,66,38,69r0,42v-34,2,-39,24,-39,63v0,69,-18,86,-81,85r0,-42v50,9,35,-39,38,-75v3,-27,12,-39,31,-52v-33,-14,-31,-62,-34,-109v-1,-17,-11,-17,-35,-17r0,-43v61,-1,83,15,82,79","w":122},"~":{"d":"199,-103v-63,46,-130,-52,-181,4r0,-56v68,-47,119,53,181,-5r0,57","w":216},"\u00a0":{"w":100}}});

/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright © 2000 Adobe Systems Incorporated. All Rights Reserved.
 * 
 * Trademark:
 * Tekton is a registered trademark of Adobe Systems Incorporated.
 * 
 * Full name:
 * TektonPro-Regular
 * 
 * Designer:
 * David Siegel
 * 
 * Vendor URL:
 * http://www.adobe.com/type
 * 
 * License information:
 * http://www.adobe.com/type/legal.html
 */
Cufon.registerFont({"w":227,"face":{"font-family":"Tekton Pro","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"2 15 4 3 2 2 8 2 9 4","ascent":"245","descent":"-115","x-height":"6","cap-height":"2","bbox":"-40 -270 270 106","underline-thickness":"18","underline-position":"-18","stemh":"15","stemv":"18","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":67},"\u00a0":{"w":67},"!":{"d":"44,-225v2,52,-4,112,3,159v0,5,-7,9,-15,9v-10,0,-11,-14,-6,-19r0,-148v-8,-8,-4,-21,13,-19v11,-2,10,15,5,18xm46,-15v4,18,-23,24,-24,6v-3,-19,26,-37,24,-6","w":70},"\"":{"d":"36,-233v-7,18,-4,49,-3,72v0,5,-2,10,-11,10v-10,2,-11,-12,-5,-16v-1,-21,3,-48,-3,-64v0,-6,4,-11,12,-11v6,0,10,6,10,9xm81,-233v-6,19,-3,49,-2,72v0,5,-3,10,-12,10v-10,0,-9,-13,-4,-16v-1,-21,3,-48,-3,-64v0,-6,4,-11,12,-11v6,0,9,6,9,9","w":92,"k":{"C":3,"G":3,"O":3,"Q":3,"T":-8,"V":-2,"W":-2,"Y":-6,"A":32,"Z":5,"J":45}},"#":{"d":"148,-171r15,-51v-2,-7,0,-13,9,-13v13,-1,14,15,5,17r-13,47v16,4,39,-10,43,6v2,12,-9,15,-15,9r-32,0r-21,74v17,4,43,-10,47,6v0,22,-30,5,-51,10v-4,20,-16,41,-13,61v-1,11,-23,11,-23,-2v10,-16,14,-39,20,-59r-47,0v-4,21,-15,39,-14,61v0,4,-5,8,-11,8v-12,1,-16,-15,-6,-18r16,-51v-18,-4,-43,10,-47,-6v-3,-11,9,-17,16,-10r35,0r21,-74v-19,-5,-47,11,-51,-5v-2,-9,10,-18,16,-10r39,0r14,-51v-2,-7,1,-13,10,-13v12,-1,13,14,5,17r-13,47r46,0xm144,-156r-46,0r-21,74r46,0","w":212},"$":{"d":"152,-189v-17,-8,-11,-22,-53,-21r0,66v34,-12,71,-17,71,44v0,52,-44,83,-71,87v-5,21,13,46,-7,52v-19,-2,-4,-30,-8,-51v-50,-1,-70,-23,-70,-41v0,-6,4,-10,9,-10v5,0,8,3,8,9v0,15,25,27,53,27r0,-94v-27,14,-69,23,-69,-24v0,-44,42,-74,69,-78v3,-14,-9,-31,7,-34v19,1,5,17,8,33v46,0,63,16,63,24v0,8,-5,11,-10,11xm84,-137r0,-71v-21,4,-51,27,-51,61v0,33,31,21,51,10xm99,-127r0,99v21,-4,54,-31,54,-71v-1,-43,-30,-43,-54,-28"},"%":{"d":"146,-237v10,-2,19,15,6,20r-90,206v2,16,-22,20,-22,4v0,-4,6,-6,7,-9r90,-208v0,-7,4,-13,9,-13xm12,-185v0,-30,28,-51,51,-51v18,0,32,11,32,33v0,27,-30,53,-51,53v-16,0,-32,-10,-32,-35xm78,-203v0,-13,-7,-19,-17,-19v-25,-6,-49,57,-16,57v12,0,33,-18,33,-38xm107,-32v0,-40,31,-57,58,-57v14,0,30,13,30,40v0,35,-34,55,-57,55v-16,0,-31,-10,-31,-38xm161,-75v-15,0,-37,11,-37,42v0,19,7,25,17,25v13,0,37,-15,37,-40v0,-17,-9,-27,-17,-27","w":206},"&":{"d":"180,-113v31,10,-4,35,-13,55v4,6,29,40,32,40v3,-3,17,-13,17,0v0,10,-23,31,-28,13r-32,-40v-27,31,-64,52,-94,52v-22,0,-54,-16,-54,-70v0,-52,39,-76,65,-89v-23,-26,-45,-83,18,-85v32,0,56,8,56,29v0,22,-21,47,-48,61r58,76v14,-21,15,-27,15,-35v0,-4,4,-7,8,-7xm130,-206v0,-23,-63,-24,-64,0v0,12,11,32,24,47v24,-11,40,-35,40,-47xm146,-58r-63,-82v-23,12,-57,32,-57,78v0,86,75,54,120,4","w":215},"(":{"d":"85,-238v4,-12,21,-12,23,8v0,6,-7,8,-12,7v-68,44,-69,229,-3,285v5,-4,11,1,11,9v0,21,-15,14,-27,1v-74,-76,-63,-258,8,-310","w":113,"k":{"V":-3,"W":-3,"Y":-8,"j":-48}},")":{"d":"7,-230v1,-20,19,-21,23,-8v34,32,59,73,59,156v0,62,-15,107,-51,154v-7,8,-14,12,-18,12v-3,0,-10,-4,-10,-13v0,-8,6,-13,11,-9v67,-56,67,-240,-2,-285v-5,1,-12,-1,-12,-7","w":113},"*":{"d":"77,-190v12,17,27,21,32,33v-2,14,-17,8,-21,-2r-19,-23v-7,12,-5,38,-19,41v-18,-10,7,-29,10,-43r-34,12v-9,2,-12,-2,-12,-7v2,-15,31,-6,46,-15v-9,-10,-26,-18,-30,-29v0,-4,3,-9,9,-9v12,3,14,20,28,31v3,-14,8,-51,24,-29v-2,10,-12,19,-15,32r32,-13v5,-2,9,1,9,7v0,16,-23,7,-40,14","w":129},"+":{"d":"90,-88v-1,-20,3,-47,-3,-62v0,-4,4,-9,10,-9v10,0,15,10,10,16r0,55v20,-1,48,3,63,-3v6,0,9,4,9,11v0,10,-10,15,-16,9r-56,0v1,21,-4,48,3,63v0,16,-24,10,-23,0v6,-16,2,-42,3,-63v-21,1,-47,-3,-63,3v-6,0,-9,-5,-9,-10v0,-12,9,-14,16,-10r56,0","w":199},",":{"d":"18,34v-19,-13,22,-12,16,-34v-7,7,-17,0,-16,-11v0,-10,4,-20,13,-20v31,7,2,75,-13,65","w":63,"k":{"\"":29,"'":29}},"-":{"d":"96,-92v-17,-7,-54,-3,-69,5v-5,0,-10,-5,-10,-12v-1,-10,11,-14,16,-8v21,-2,45,-1,62,-7v6,0,10,4,10,11v0,6,-4,11,-9,11","w":122},"\u00ad":{"d":"96,-92v-17,-7,-54,-3,-69,5v-5,0,-10,-5,-10,-12v-1,-10,11,-14,16,-8v21,-2,45,-1,62,-7v6,0,10,4,10,11v0,6,-4,11,-9,11","w":122,"k":{"C":-7,"G":-7,"O":-7,"Q":-7,"T":34,"V":5,"W":5,"X":14,"Y":35,"A":14,"Z":17,"J":32}},".":{"d":"30,2v-5,0,-11,-5,-11,-17v0,-9,6,-18,15,-18v7,0,11,5,11,16v0,10,-5,19,-15,19","w":66,"k":{"\"":29,"'":29}},"\/":{"d":"101,-235v14,-1,14,15,5,18r-78,207v5,7,-1,16,-10,16v-13,0,-19,-18,-5,-21r77,-208v0,-8,1,-12,11,-12","w":117},"0":{"d":"14,-77v1,-116,71,-158,121,-158v30,0,78,22,78,84v0,123,-91,156,-125,156v-41,0,-74,-27,-74,-82xm133,-219v-39,0,-101,36,-101,141v0,45,27,68,56,68v32,0,107,-32,107,-139v0,-49,-34,-70,-62,-70","k":{",":1,".":1}},"1":{"d":"129,-210v-25,16,-53,30,-76,48v-14,-1,-10,-20,1,-21v30,-17,56,-37,88,-51v9,0,10,10,5,15r2,213v0,5,-3,8,-13,8v-11,0,-12,-9,-7,-15r0,-197"},"2":{"d":"173,-180v0,-62,-119,-47,-121,10v0,3,-4,9,-12,9v-13,1,-16,-18,-5,-20v18,-41,48,-54,94,-54v35,0,63,25,63,53v0,41,-28,56,-51,70v-28,17,-73,40,-92,96r130,0v0,-11,2,-14,11,-14v6,0,9,5,9,18v0,9,-2,12,-9,12r-145,0v-2,6,-18,5,-18,-2v6,-59,75,-108,105,-123v23,-12,41,-28,41,-55"},"3":{"d":"159,-218r-110,0v-3,18,11,40,-10,41v-12,2,-12,-12,-7,-16v2,-16,-8,-41,12,-40r129,0v15,-1,11,15,3,20r-57,60v42,-17,87,2,88,54v0,75,-60,104,-129,104v-33,0,-57,-17,-57,-57v0,-16,23,-19,23,-5v-15,23,7,47,39,47v59,0,105,-28,105,-85v0,-28,-17,-49,-43,-49v-39,0,-63,26,-74,26v-6,0,-9,-3,-9,-9v0,-12,17,-6,35,-25"},"4":{"d":"143,-78r-124,16v-13,1,-14,-16,-4,-20r125,-143v0,-5,5,-8,12,-8v10,-1,14,11,9,18r0,118v16,-2,37,-2,48,-9v6,0,9,2,9,10v0,12,-7,15,-15,10r-42,5v2,24,-5,56,4,73v0,6,-6,10,-16,10v-9,0,-12,-11,-6,-15r0,-65xm143,-94r0,-112r-109,125"},"5":{"d":"26,-114v8,-19,9,-95,9,-103v0,-7,5,-9,11,-9v43,-5,94,-2,131,-12v7,0,10,5,10,11v1,11,-11,14,-17,8r-118,8v0,7,-2,65,-6,84v40,-33,66,-35,89,-35v39,0,71,19,71,63v1,94,-125,134,-176,77v-12,-3,-11,-23,4,-23v9,0,10,6,10,12v0,4,18,23,46,23v48,0,97,-38,97,-85v0,-34,-20,-52,-56,-52v-59,-1,-80,43,-95,43v-5,0,-10,-4,-10,-10"},"6":{"d":"100,6v-24,0,-50,-13,-68,-37v-5,1,-11,-6,-8,-13v-42,-86,36,-193,115,-195v32,0,60,15,60,37v0,6,-4,10,-11,10v-9,0,-11,-9,-7,-13v-2,-9,-20,-19,-44,-19v-64,3,-127,91,-100,163v28,-44,72,-91,116,-91v46,0,62,33,62,53v0,71,-74,105,-115,105xm100,-9v30,0,96,-29,96,-87v0,-14,-12,-40,-44,-40v-39,0,-82,50,-108,91v12,22,35,36,56,36"},"7":{"d":"211,-234v-13,31,-100,188,-112,224v0,11,-4,15,-13,15v-16,-6,-4,-26,3,-38r95,-186v-42,5,-93,4,-138,7v-3,17,11,35,-11,35v-9,0,-12,-10,-6,-14v3,-15,-8,-36,12,-37r140,-5v16,0,6,-9,20,-9v6,0,10,4,10,8"},"8":{"d":"74,4v-21,0,-64,-18,-64,-54v0,-36,37,-69,56,-80v-11,-3,-26,-11,-26,-38v0,-48,39,-71,81,-71v67,0,62,62,32,85v16,0,62,11,62,50v0,57,-79,108,-141,108xm130,-153v32,-16,46,-73,-13,-72v-30,0,-59,20,-59,55v0,21,12,30,26,30v12,-6,33,-11,46,-13xm196,-102v0,-22,-25,-37,-57,-37v-46,0,-111,44,-111,88v0,23,34,39,47,39v53,0,121,-44,121,-90"},"9":{"d":"27,-147v0,-88,129,-124,168,-50v8,1,11,13,8,21v28,89,-36,182,-112,182v-45,0,-57,-29,-74,-55v0,-9,8,-13,13,-13v10,0,13,10,10,15v8,22,23,38,50,38v68,-1,116,-75,98,-144v-10,27,-55,57,-97,57v-35,0,-64,-34,-64,-51xm183,-176v0,-78,-137,-47,-137,26v0,17,28,39,48,39v41,0,89,-38,89,-65"},":":{"d":"33,-141v17,2,16,38,-3,36v-20,-2,-13,-36,3,-36xm35,-34v19,0,7,39,-6,36v-7,0,-11,-5,-11,-15v0,-13,8,-21,17,-21","w":65},";":{"d":"46,-122v1,18,-26,30,-26,2v0,-9,5,-19,14,-19v8,0,12,5,12,17xm18,34v-19,-13,22,-12,16,-34v-7,7,-17,0,-16,-11v0,-10,4,-20,13,-20v32,7,1,74,-13,65","w":64},"<":{"d":"49,-83r105,66v6,1,9,2,9,6v0,8,-16,22,-19,8r-107,-69v-12,-7,-14,-15,-4,-21v40,-23,85,-40,121,-66v13,2,17,18,3,20","w":199},"=":{"d":"27,-120v42,3,103,5,144,-1v5,0,8,4,8,11v0,10,-9,12,-16,8v-44,2,-96,3,-136,3v-6,0,-8,-4,-8,-9v0,-9,3,-12,8,-12xm27,-61r144,-1v5,0,8,4,8,11v0,10,-9,12,-16,8v-44,2,-96,3,-136,3v-6,0,-8,-4,-8,-9v0,-9,3,-12,8,-12","w":199},">":{"d":"44,-17r105,-66r-108,-56v-7,-1,-9,-4,-9,-10v0,-2,5,-10,12,-10v37,25,81,44,121,66v10,6,8,14,-4,21r-114,75v-8,-1,-21,-20,-3,-20","w":199},"?":{"d":"33,-80v-12,-32,108,-94,99,-120v0,-13,-14,-28,-36,-28v-32,0,-57,28,-65,41v0,17,-20,14,-21,1v0,-5,3,-9,6,-10v10,-11,36,-47,83,-47v32,0,52,22,52,41v0,21,-10,33,-58,72v-36,30,-43,35,-43,49v0,10,8,13,17,13v29,2,17,-17,32,-23v5,0,10,3,10,10v0,12,-12,28,-44,28v-18,0,-32,-6,-32,-27xm66,-32v14,3,14,38,-5,36v-15,-3,-12,-38,5,-36","w":153},"@":{"d":"31,-39v0,81,74,86,119,54v0,-5,4,-7,9,-7v6,0,12,5,12,10v0,6,-6,11,-14,10v-55,34,-142,25,-142,-67v0,-71,74,-160,166,-160v69,0,89,42,89,97v0,78,-39,110,-66,110v-37,0,-21,-42,-19,-72v-14,24,-52,65,-88,65v-14,0,-29,-12,-29,-33v2,-58,66,-140,125,-117v0,-5,2,-8,7,-8v10,0,11,9,8,16r-11,114v-1,8,0,22,10,22v17,0,48,-29,48,-91v0,-52,-15,-90,-74,-90v-84,0,-150,84,-150,147xm102,-14v33,-2,93,-59,88,-111v0,-10,-5,-14,-16,-14v-38,0,-88,61,-88,103v0,14,8,22,16,22","w":285},"A":{"d":"124,-222v9,36,89,189,89,210v3,15,-21,19,-22,6v4,-28,-6,-26,-34,-97r-93,7v-31,75,-35,61,-34,89v0,6,-4,9,-12,9v-8,0,-11,-5,-11,-11v21,-61,73,-152,97,-215v-2,-15,20,-21,22,-7v0,4,-2,5,-2,9xm72,-112r78,-5r-37,-86","w":223,"k":{"\u00ad":15,"\"":34,"'":34,"a":-3,"f":4,"c":1,"d":1,"e":1,"o":1,"q":1,"C":3,"G":3,"O":3,"Q":3,"s":1,"t":5,"T":17,"U":3,"v":3,"w":3,"V":8,"W":8,"X":4,"Y":24}},"B":{"d":"27,-13r0,-196v-7,-9,0,-20,11,-19v6,0,10,7,7,12v28,-12,135,-37,135,9v0,24,-22,44,-57,55v43,-7,85,12,85,43v0,78,-124,113,-173,113v-14,0,-17,-13,-8,-17xm45,-199r0,53v51,-3,117,-25,117,-57v-11,-31,-94,-8,-117,4xm45,-122r0,109v48,-4,144,-34,144,-94v0,-40,-97,-35,-133,-23v-8,2,-11,4,-11,8","w":219,"k":{"\u00ad":-3,"\"":6,"'":6,"a":8,"c":1,"d":1,"e":1,"o":1,"q":1,"T":6,"X":4,"Y":11,"A":10,",":12,".":12,"u":1,"Z":9}},"C":{"d":"181,-55v-11,29,-51,61,-94,61v-44,0,-74,-35,-74,-98v0,-41,30,-145,107,-144v33,0,64,18,64,33v0,15,-19,14,-20,2v-1,-9,-23,-20,-44,-20v-63,0,-89,94,-89,130v0,51,25,82,58,82v26,0,55,-24,70,-42v0,-7,4,-13,12,-13v8,0,10,5,10,9","w":195,"k":{"a":5,"c":5,"d":5,"e":5,"o":5,"q":5,"T":-2,"A":2,"i":3,"m":3,"n":3,"r":3,"u":3,"y":4,"h":1,"k":1,"l":1,"z":3}},"D":{"d":"36,5v-15,0,-18,-12,-9,-17r0,-203v-5,-8,-3,-18,10,-18v8,0,11,8,8,14v22,-9,47,-16,81,-16v42,0,78,39,78,81v0,43,-17,82,-46,109v-39,36,-96,50,-122,50xm45,-202r0,190v23,-1,66,-15,100,-44v51,-43,62,-163,-24,-163v-27,0,-53,6,-76,17","w":217,"k":{"\u00ad":-2,"a":4,"c":5,"d":5,"e":5,"o":5,"q":5,"T":1,"V":-5,"W":-5,"X":3,"Y":3,"A":3,",":10,".":10,"Z":2,"J":3,"g":7}},"E":{"d":"46,-108r0,94v42,-5,92,-2,128,-13v6,0,11,5,11,10v0,9,-6,10,-17,10v-44,0,-95,3,-133,13v-10,2,-14,-14,-7,-20v-2,-33,5,-74,-4,-100v8,-23,2,-60,4,-89v-14,-2,-2,-16,-3,-21v0,-4,4,-8,11,-8v8,0,11,5,10,10v39,-5,86,-2,119,-12v8,0,11,5,11,10v1,11,-12,14,-20,10r-110,7r0,83v33,-5,71,-6,101,-14v6,0,11,5,11,11v1,11,-13,12,-19,8","w":196,"k":{"c":3,"d":3,"e":3,"o":3,"q":3,"C":2,"G":2,"O":2,"Q":2,"s":5,"t":4,"v":3,"w":3,"Y":5,"u":2,"y":4,"g":1,"p":2,"S":3}},"F":{"d":"45,-111v2,34,-5,77,4,104v0,11,-29,12,-26,0v7,-27,2,-68,4,-101v-6,-3,-5,-15,0,-18v-2,-27,5,-63,-5,-82v4,-10,5,-20,18,-21v6,0,9,5,6,11v37,-6,78,-7,112,-16v6,0,13,3,13,9v1,14,-12,13,-21,10r-105,13r0,76r108,-16v12,2,10,23,-3,21v-33,-4,-70,8,-105,10","w":181,"k":{"\u00ad":5,"a":22,"c":23,"d":23,"e":23,"o":23,"q":23,"C":6,"G":6,"O":6,"Q":6,"X":3,"A":26,"i":10,"m":10,"n":10,"r":10,",":45,".":45,"u":14,"y":10,"Z":3,"h":4,"k":4,"l":4,"J":44,"S":2}},"G":{"d":"13,-89v-1,-80,70,-144,137,-150v34,-3,52,16,61,35v0,6,-3,11,-10,11v-6,0,-8,-5,-9,-10v0,-5,-12,-21,-43,-21v-52,0,-117,64,-117,136v0,46,21,79,59,79v59,0,114,-73,113,-109v-10,3,-64,15,-75,15v-5,0,-9,-2,-9,-8v0,-5,4,-9,11,-9v23,0,74,-14,83,-14v6,0,9,4,9,10v0,31,-34,130,-133,130v-51,0,-77,-41,-77,-95","w":236,"k":{"a":3,"c":3,"d":3,"e":3,"o":3,"q":3,"Z":1}},"H":{"d":"46,-112v1,35,-3,74,2,105v0,5,-5,9,-11,9v-13,1,-16,-11,-9,-17r0,-96v-6,-1,-5,-15,0,-16v-1,-31,2,-67,-2,-95v-2,-11,22,-14,23,-1v-7,26,-1,64,-3,95r131,-9v-1,-28,1,-61,-2,-86v-2,-13,22,-10,23,-1v0,3,-1,6,-3,8r0,201v6,8,1,17,-10,17v-11,0,-13,-12,-8,-19r0,-104","w":221},"I":{"d":"45,-212r0,195v7,6,4,19,-9,19v-12,0,-17,-13,-9,-20r0,-195v-8,-9,1,-19,12,-19v12,0,14,14,6,20","w":72},"J":{"d":"66,4v37,0,73,-34,73,-63r0,-150v-9,-5,-2,-24,9,-21v9,-1,14,12,9,20r0,155v0,36,-46,75,-90,75v-42,0,-63,-24,-63,-58v0,-22,23,-22,24,-7v-15,22,5,49,38,49","w":182,"k":{"a":3,"c":2,"d":2,"e":2,"o":2,"q":2,"u":2}},"K":{"d":"46,-130v-1,36,2,87,2,121v0,15,-24,14,-24,0v0,-3,1,-5,3,-8r-2,-204v0,-13,22,-15,23,-1v-6,17,-4,50,-2,71v26,-25,63,-48,92,-71v4,-12,19,-12,21,0v0,5,-4,10,-11,11r-91,69r130,126v5,-1,10,3,10,7v2,11,-21,17,-22,5r-113,-108v-8,-8,-13,-14,-16,-18","w":199,"k":{"\u00ad":32,"\"":8,"'":8,"c":1,"d":1,"e":1,"o":1,"q":1,"C":8,"G":8,"O":8,"Q":8,"T":15,"U":4,"v":8,"w":8,"V":6,"W":6,"Y":12,"A":3,"u":2,"y":8}},"L":{"d":"48,-221v-7,62,0,141,-3,208v32,-5,68,-6,97,-14v5,0,10,2,10,8v0,12,-7,16,-16,11r-101,13v-11,1,-16,-12,-8,-17r-2,-209v0,-14,25,-16,23,0","w":161,"k":{"\u00ad":32,"\"":31,"'":31,"c":4,"d":4,"e":4,"o":4,"q":4,"C":9,"G":9,"O":9,"Q":9,"T":32,"U":6,"v":9,"w":9,"V":16,"W":16,"X":2,"Y":31,"A":1,"u":5,"y":8,"S":3}},"M":{"d":"36,2v-12,0,-13,-10,-9,-18r0,-205v0,-8,4,-10,11,-10v6,0,10,3,10,9v0,41,70,135,85,188v21,-64,94,-125,95,-192v3,-12,26,-7,24,4v-9,61,0,139,-3,206v6,7,2,18,-9,18v-13,0,-13,-10,-8,-16r-1,-166v-18,54,-84,139,-89,172v-2,12,-21,12,-21,-5v0,-29,-55,-122,-77,-168r0,164v7,6,6,19,-8,19","w":277},"N":{"d":"27,-15r-2,-206v0,-6,3,-11,11,-11v8,0,11,3,11,8v14,62,97,138,125,186r0,-181v-5,-5,-2,-19,7,-17v11,-1,16,10,10,17r0,206v5,6,5,16,-8,15v-6,0,-8,-5,-12,-14v-24,-51,-100,-122,-125,-176v0,57,1,115,1,173v6,5,3,19,-8,17v-10,2,-17,-11,-10,-17","w":216},"O":{"d":"126,-243v39,0,76,31,76,112v0,79,-52,137,-116,137v-55,0,-73,-54,-73,-94v0,-72,53,-155,113,-155xm184,-131v0,-65,-26,-96,-60,-96v-46,0,-93,74,-93,137v0,36,17,81,58,81v48,0,95,-51,95,-122","w":215,"k":{"\u00ad":-2,"a":4,"c":5,"d":5,"e":5,"o":5,"q":5,"T":1,"V":-5,"W":-5,"X":3,"Y":3,"A":3,",":10,".":10,"Z":2,"J":3,"g":7}},"P":{"d":"35,2v-11,0,-13,-11,-7,-17r0,-163v-13,0,-10,-15,0,-20v0,-13,-5,-33,10,-32v15,1,7,12,8,25v23,-12,54,-27,95,-27v31,0,48,13,48,31v0,40,-75,83,-143,88v2,34,-4,76,3,105v0,8,-3,10,-14,10xm46,-188r0,59v63,-3,125,-41,125,-68v0,-10,-12,-19,-34,-19v-33,0,-61,12,-91,28","w":194,"k":{"i":14,"\u00ad":37,"\"":-3,"'":-3,"a":39,"c":40,"d":40,"e":40,"o":40,"q":40,"s":27,"t":5,"X":2,"Y":-5,"A":33,"m":14,"n":14,"r":14,",":58,".":58,"u":17,"y":8,"Z":6,"h":5,"k":5,"l":5,"J":57,":":8,";":8}},"Q":{"d":"214,13v-19,-10,-30,-21,-49,-39v-53,42,-151,62,-151,-57v0,-93,71,-158,129,-158v80,0,84,154,34,202v12,13,26,24,38,32v5,0,11,2,11,8v0,7,-6,12,-12,12xm122,-85v17,5,25,19,42,35v39,-41,43,-176,-24,-176v-45,0,-107,56,-107,143v-1,96,78,83,120,45v-12,-13,-28,-26,-39,-32v-4,-5,0,-15,8,-15","w":230,"k":{"a":4,"\u00ad":-2,"c":5,"d":5,"e":5,"o":5,"q":5,"T":1,"V":-5,"W":-5,"X":3,"Y":3,"A":3,",":10,".":10,"Z":2,"J":3,"g":7}},"R":{"d":"48,-9v0,15,-25,14,-24,0v0,-3,2,-6,4,-8r0,-169v-5,3,-8,-2,-8,-8v2,-10,13,-16,6,-30v0,-6,5,-10,11,-10v12,0,8,11,8,23v35,-14,67,-20,95,-20v27,0,48,10,48,33v0,45,-63,67,-132,80r142,102v7,-3,15,2,15,8v-1,13,-18,16,-23,6r-145,-104v2,32,-4,71,3,97xm45,-196r0,67v60,-11,125,-30,125,-67v0,-12,-15,-20,-34,-20v-22,0,-56,5,-91,20","w":209,"k":{"\u00ad":24,"a":-2,"c":-1,"d":-1,"e":-1,"o":-1,"q":-1,"t":3,"T":2,"Y":5,"y":1}},"S":{"d":"155,-128v-46,0,-138,55,-138,-18v0,-40,47,-88,110,-88v31,0,56,20,56,32v0,4,-1,9,-9,9v-8,0,-12,-4,-11,-9v-37,-43,-137,13,-128,55v0,17,10,24,24,24v42,0,150,-52,150,23v0,67,-76,105,-131,105v-46,0,-61,-39,-61,-48v0,-8,4,-14,11,-14v8,0,9,14,14,25v6,12,17,22,37,22v42,-2,111,-34,111,-89v0,-22,-14,-29,-35,-29","w":222,"k":{"a":2,"c":1,"d":1,"e":1,"o":1,"q":1,"T":1,"Y":3,"A":3,"Z":2}},"T":{"d":"94,-208r2,200v0,5,-4,10,-14,10v-8,2,-10,-12,-6,-17r0,-191v-20,4,-44,5,-62,12v-6,0,-10,-3,-10,-9v-1,-9,10,-14,16,-9r146,-24v5,0,10,3,10,10v0,8,-11,13,-17,7","w":171,"k":{"\u00ad":40,"\"":-11,"'":-11,"a":32,"c":27,"d":27,"e":27,"o":27,"q":27,"C":12,"G":12,"O":12,"Q":12,"s":27,"T":7,"v":21,"w":21,"X":3,"A":26,"i":13,"m":13,"n":13,"r":13,",":21,".":21,"u":21,"y":18,"Z":2,"h":10,"k":10,"l":10,"z":19,"J":27,"S":8,")":-14,"]":-14,"}":-14}},"U":{"d":"184,-53v-8,31,-56,59,-102,59v-39,0,-55,-26,-55,-47r0,-174v-5,-6,-1,-15,8,-15v9,0,10,7,10,13r0,179v4,14,13,28,37,28v54,0,84,-35,84,-48r0,-160v-7,-7,-1,-16,10,-16v7,0,13,9,8,14r0,167","w":212,"k":{"\u00ad":3,"a":1,"c":1,"d":1,"e":1,"o":1,"q":1,"A":5,"J":1,"g":2}},"V":{"d":"33,-214v1,28,38,134,47,170v18,-60,69,-124,88,-170v6,-15,19,-19,22,-3v-26,53,-106,168,-101,205v2,19,-23,18,-24,6v11,-47,-53,-167,-52,-215v0,-6,5,-9,11,-9v6,0,9,6,9,16","w":190,"k":{"G":4,"\u00ad":15,"\"":-5,"'":-5,"a":19,"c":20,"d":20,"e":20,"o":20,"q":20,"C":4,"O":4,"Q":4,"t":1,"X":2,"A":15,"i":7,"m":7,"n":7,"r":7,",":24,".":24,"u":9,"y":6,"Z":6,"h":6,"k":6,"l":6,"J":26,"S":3,")":-8,"]":-8,"}":-8}},"W":{"d":"131,-177v-7,44,-50,135,-51,169v0,6,-6,11,-15,11v-7,0,-10,-5,-10,-18v-1,-55,-38,-145,-40,-202v-1,-19,21,-19,20,-4v-5,55,31,131,34,191v9,-42,54,-141,52,-187v0,-8,4,-12,10,-12v8,0,10,3,10,14v0,48,47,136,54,185v15,-71,43,-128,55,-190v-6,-6,-3,-17,10,-17v10,0,12,10,8,18v-13,70,-49,131,-61,208v-3,22,-23,23,-23,1v0,-43,-45,-121,-53,-167","w":278,"k":{"\u00ad":15,"\"":-5,"'":-5,"a":19,"c":20,"d":20,"e":20,"o":20,"q":20,"C":4,"G":4,"O":4,"Q":4,"t":1,"X":2,"A":15,"i":7,"m":7,"n":7,"r":7,",":24,".":24,"u":9,"y":6,"Z":6,"h":6,"k":6,"l":6,"J":26,"S":3,")":-8,"]":-8,"}":-8}},"X":{"d":"101,-121r63,112v0,6,-4,11,-12,11v-8,0,-10,-5,-9,-12v-14,-21,-41,-74,-53,-95v-13,20,-51,82,-56,96v-4,10,-21,17,-25,3v0,-5,3,-10,9,-11v9,-17,49,-81,63,-105v-25,-47,-46,-80,-64,-101v0,-6,3,-9,8,-9v28,6,45,60,67,94v14,-22,47,-69,56,-83v0,-6,4,-10,12,-10v12,0,13,18,3,21v-9,14,-46,64,-62,89","w":179,"k":{"\u00ad":15,"\"":-3,"'":-3,"C":1,"G":1,"O":1,"Q":1,"V":-5,"W":-5,"Y":1,"A":1,"i":1,"m":1,"n":1,"r":1,"S":2,"D":-3,"E":-3,"F":-3,"H":-3,"I":-3,"K":-3,"L":-3,"N":-3,"P":-3,"R":-3}},"Y":{"d":"204,-225v-21,42,-72,69,-93,108v2,35,-4,78,3,108v0,6,-4,11,-14,11v-11,0,-12,-14,-7,-20r0,-99v-25,-38,-68,-71,-93,-107v0,-6,7,-11,13,-11v6,0,10,5,9,11v19,30,60,62,81,90v21,-32,59,-57,79,-90v2,-12,21,-16,22,-1","w":203,"k":{"G":10,"\u00ad":35,"\"":-8,"'":-8,"a":36,"c":36,"d":36,"e":36,"o":36,"q":36,"C":10,"O":10,"Q":10,"t":13,"T":-1,"v":16,"w":16,"X":1,"Y":-1,"A":25,"i":10,"m":10,"n":10,"r":10,",":31,".":31,"u":20,"Z":2,"h":3,"k":3,"l":3,"J":31,"S":5,")":-10,"]":-10,"}":-10}},"Z":{"d":"174,0r-151,3v-26,1,-21,-14,-11,-27r159,-196r-120,5v-1,14,-20,16,-20,3v0,-17,11,-27,20,-19r132,-6v17,4,12,14,-1,30r-157,194r141,-3v0,-9,5,-14,10,-14v5,0,10,6,10,15v0,10,-5,15,-12,15","w":197,"k":{"\u00ad":16,"\"":-7,"'":-7,"v":1,"w":1,"Y":-7}},"[":{"d":"50,64v17,0,45,-1,58,-9v12,3,10,21,-4,20v-20,2,-43,3,-60,8v-8,0,-11,-5,-11,-15r0,-290v-1,-13,12,-15,18,-8v17,-4,36,-7,50,-13v16,0,10,23,1,21v-17,-3,-35,5,-52,7r0,279","w":112,"k":{"V":-3,"W":-3,"Y":-8,"j":-48}},"\\":{"d":"89,-10r-77,-207v-11,-3,-9,-19,5,-18v10,0,11,4,10,12r78,208v14,4,7,21,-5,21v-9,0,-17,-8,-11,-16","w":117},"]":{"d":"64,-223v-17,0,-45,1,-57,9v-12,-3,-10,-21,4,-20v20,-2,43,-3,60,-8v8,0,11,4,11,14r0,292v1,13,-12,14,-18,8v-17,4,-36,6,-50,12v-16,0,-10,-23,-1,-21v16,3,34,-5,51,-7r0,-279","w":112},"^":{"d":"154,-150r-50,-62r-57,63v0,4,-2,10,-8,10v-14,0,-16,-13,-6,-20r63,-71v5,-11,19,-2,20,4v19,26,42,49,58,78v0,4,-3,9,-12,9v-4,0,-8,-3,-8,-11","w":199},"_":{"d":"180,42r-180,0r0,-15r180,0r0,15","w":180},"a":{"d":"130,-101v1,-21,2,-47,-18,-47v-27,0,-52,12,-67,26v1,2,-1,9,-9,9v-5,0,-10,-7,-10,-12v0,-4,5,-10,10,-9v19,-15,47,-28,81,-28v15,0,30,11,30,31v2,41,-5,90,3,125v0,6,-7,8,-14,8v-12,0,-12,-9,-7,-14r0,-34v-25,30,-63,52,-97,52v-14,0,-26,-6,-26,-20v0,-34,52,-79,124,-87xm39,-9v39,0,99,-40,90,-79v-64,7,-105,50,-105,70v0,6,6,9,15,9","w":172},"b":{"d":"45,-228v-7,28,-3,74,-2,106v17,-17,53,-35,85,-35v17,0,30,8,30,28v0,58,-68,134,-125,134v-13,0,-15,-11,-8,-16r0,-209v-8,-9,1,-17,11,-17v5,0,9,3,9,9xm42,-103r0,90v39,-5,98,-60,98,-116v0,-10,-13,-13,-18,-13v-23,0,-61,16,-80,39","w":166,"k":{"a":2,"c":4,"d":4,"e":4,"o":4,"q":4,",":14,".":14,"g":5}},"c":{"d":"13,-49v0,-62,33,-111,91,-111v27,0,43,12,43,24v0,5,-3,10,-13,10v-11,-6,-6,-21,-31,-19v-43,4,-70,38,-73,93v-2,40,49,55,77,29v10,-9,20,-19,25,-29v-1,-14,22,-14,20,-2v-3,18,-47,60,-85,60v-35,0,-54,-27,-54,-55","w":163,"k":{"a":5,"c":1,"d":1,"e":1,"o":1,"q":1,"t":1}},"d":{"d":"141,-139v-2,-28,4,-64,-3,-87v0,-6,5,-10,12,-10v11,0,13,11,9,19r0,204v8,6,3,17,-9,15v-21,-4,-4,-43,-9,-66v-11,21,-61,70,-101,70v-20,0,-33,-13,-33,-34v2,-65,75,-148,134,-111xm44,-10v37,0,96,-52,97,-97v0,-17,-12,-27,-27,-27v-39,0,-89,61,-89,103v0,13,6,21,19,21","w":183,"k":{"v":-1,"w":-1}},"e":{"d":"100,-160v41,0,50,33,50,43v0,10,-13,21,-103,39r-14,3v-10,27,-1,72,30,65v35,0,60,-31,66,-41v-2,-6,3,-12,10,-12v8,0,10,6,10,10v0,5,-33,58,-89,58v-27,0,-48,-13,-48,-50v0,-67,50,-115,88,-115xm100,-145v-24,0,-51,27,-63,55v77,-15,96,-22,96,-26v0,-8,-7,-29,-33,-29","w":161},"f":{"d":"41,-7v6,-36,0,-83,2,-123v-15,-2,-38,19,-41,-4v-1,-7,8,-10,12,-6r29,-5v0,-65,6,-95,43,-95v18,0,43,16,43,27v0,4,-3,10,-9,10v-5,0,-8,-4,-7,-8v-4,-8,-17,-14,-29,-14v-19,0,-24,19,-24,77v19,-5,44,-3,58,-13v6,0,9,4,9,9v1,8,-6,14,-11,9r-56,10v2,41,-5,91,3,127v0,6,-4,8,-11,8v-8,0,-11,-3,-11,-9","w":119,"k":{"\u00ad":4,"\"":-17,"'":-17,"f":1,"c":7,"d":7,"e":7,"o":7,"q":7,"s":5,"t":1,",":22,".":22,"g":8,")":-15,"]":-15,"}":-15}},"g":{"d":"147,-143r0,147v0,52,-45,73,-70,73v-32,0,-53,-15,-53,-23v-1,-13,15,-16,17,-5v29,23,86,18,88,-46r0,-91v-17,59,-60,94,-90,94v-19,0,-30,-13,-30,-36v0,-56,55,-127,125,-127v9,0,13,2,13,14xm41,-9v30,0,88,-71,88,-133v-54,0,-102,62,-102,111v0,15,6,22,14,22","w":169},"h":{"d":"125,-6v7,-31,1,-76,3,-112v0,-16,-2,-21,-12,-21v-13,0,-47,13,-73,45v2,28,-4,64,3,87v0,5,-6,9,-14,9v-11,0,-10,-11,-6,-15r0,-206v-7,-7,-1,-20,10,-18v8,0,13,11,7,17r1,105v26,-27,60,-42,79,-42v18,0,23,10,23,37v0,36,-2,78,2,111v1,11,-22,16,-23,3","w":168},"i":{"d":"37,-219v17,3,6,43,-5,40v-17,-2,-6,-40,5,-40xm35,-158v9,0,13,14,7,20r0,123v11,8,-2,18,-12,17v-10,1,-11,-14,-6,-19v-2,-41,5,-91,-3,-127v0,-7,1,-14,14,-14","w":66,"k":{"v":-1,"w":-1}},"j":{"d":"45,-221v14,3,11,43,-6,43v-15,-3,-12,-46,6,-43xm48,-136r0,171v0,38,-20,55,-46,55v-28,0,-42,-22,-42,-30v0,-6,3,-12,11,-12v4,0,10,2,7,12v18,26,55,18,52,-33v-3,-56,-3,-121,-3,-172v0,-8,4,-13,15,-13v8,0,14,17,6,22","w":72,"k":{",":-2,".":-2,"u":1,")":-5,"]":-5,"}":-5}},"k":{"d":"44,-226v-8,37,-1,90,-3,133v23,-24,49,-47,74,-69v0,-4,3,-8,8,-8v13,-1,16,19,3,19r-70,66r74,71v5,-1,9,3,9,7v2,11,-19,16,-21,4r-77,-72v1,22,-3,49,3,66v0,8,-4,11,-12,11v-8,2,-15,-11,-9,-19r0,-202v-8,-6,-4,-19,10,-18v7,0,11,4,11,11","w":148,"k":{"\u00ad":6,"c":4,"d":4,"e":4,"o":4,"q":4,"g":2}},"l":{"d":"22,-9v6,-63,0,-139,2,-206v-5,-9,-6,-24,11,-21v10,-1,15,15,7,21r0,200v9,6,3,16,-8,17v-6,0,-12,-3,-12,-11","w":66,"k":{"v":-1,"w":-1}},"m":{"d":"42,-100v2,30,-4,67,3,92v0,7,-4,10,-12,10v-12,0,-15,-12,-9,-19v-2,-45,-3,-97,-3,-137v0,-7,5,-10,14,-10v17,0,3,27,7,45v15,-13,57,-45,76,-45v21,0,15,29,16,49v29,-24,67,-49,81,-49v8,0,17,5,17,17v2,45,-5,99,3,139v0,11,-25,17,-23,0v5,-38,0,-86,2,-127v0,-6,-2,-10,-6,-10v-9,0,-41,20,-74,48r0,84v3,18,-21,20,-22,5v0,-3,2,-5,4,-7r0,-120v0,-7,-1,-9,-6,-9v-12,0,-50,27,-68,44","w":255},"n":{"d":"42,-102v1,31,-2,67,2,95v1,11,-22,12,-23,1v5,-24,6,-70,-1,-93v12,-16,-10,-63,15,-65v14,-1,10,10,7,16r0,28v41,-33,69,-44,81,-44v13,0,22,9,22,18r2,138v0,7,-4,10,-12,10v-9,1,-13,-9,-8,-15r0,-126v-19,-19,-33,3,-85,37","w":168},"o":{"d":"159,-93v0,62,-50,99,-100,99v-20,0,-47,-18,-47,-57v0,-64,44,-110,95,-110v42,0,52,42,52,68xm63,-9v45,0,77,-42,78,-84v0,-27,-10,-53,-37,-53v-39,0,-74,42,-74,92v0,24,15,45,33,45","w":171,"k":{"a":2,"c":4,"d":4,"e":4,"o":4,"q":4,",":14,".":14,"g":5}},"p":{"d":"32,-159v24,2,4,32,10,52v24,-33,46,-50,76,-50v28,0,45,17,45,44v0,76,-65,117,-99,117v-9,0,-16,-2,-22,-8v2,33,-4,73,3,100v0,6,-5,9,-14,9v-9,2,-13,-12,-7,-17r0,-229v-7,-6,1,-21,8,-18xm117,-142v-29,0,-61,36,-75,62v0,27,-6,69,21,69v26,0,82,-40,82,-99v0,-20,-11,-32,-28,-32","w":173,"k":{"a":2,"c":4,"d":4,"e":4,"o":4,"q":4,",":14,".":14,"g":5}},"q":{"d":"132,91r0,-173v-13,41,-44,85,-84,85v-4,0,-37,-3,-37,-54v0,-74,58,-106,103,-106v17,0,36,5,36,13r0,228v7,-4,20,-16,26,-24v0,-4,3,-6,6,-6v5,0,8,2,8,8v0,9,-39,44,-46,44v-9,0,-12,-6,-12,-15xm133,-138v-44,-13,-104,9,-104,84v0,34,19,42,22,42v33,0,74,-62,82,-126","w":175,"k":{"}":-5,"]":-5,",":-2,")":-5,".":-2,"u":1}},"r":{"d":"21,-6v6,-40,4,-101,1,-144v0,-4,5,-8,11,-8v19,0,6,20,9,37v24,-19,54,-37,71,-37v9,0,17,12,17,38v0,5,-4,9,-12,9v-11,1,-10,-8,-6,-12v0,-7,-2,-17,-5,-17v-10,0,-41,18,-65,41v2,30,-4,67,3,91v0,7,-3,10,-15,10v-6,0,-9,-3,-9,-8","w":130,"k":{"a":8,"c":8,"d":8,"e":8,"o":8,"q":8,"t":-1,",":26,".":26,"y":-2,"g":13,":":-3,";":-3,"x":-1}},"s":{"d":"146,-71v-11,-48,-70,0,-103,0v-18,0,-28,-10,-28,-27v0,-42,57,-66,96,-66v26,0,49,15,27,24v-21,-22,-105,-1,-105,40v0,10,6,14,15,14v20,0,59,-21,79,-20v18,0,36,8,36,31v0,59,-67,79,-95,79v-27,0,-50,-16,-50,-29v-3,-14,18,-15,19,-6v-7,12,12,21,31,21v25,0,78,-17,78,-61","w":174},"t":{"d":"49,-159v5,-19,-14,-44,10,-46v9,-1,13,7,7,12r0,31v22,-4,48,-5,68,-12v5,0,8,4,8,8v0,8,-5,12,-11,9r-65,9r0,127v0,6,2,9,6,9v11,0,52,-26,70,-50v-1,-6,3,-10,8,-10v8,0,9,4,9,11v0,11,-62,66,-92,66v-13,0,-18,-8,-18,-21r0,-129v-17,-2,-43,20,-48,-1v3,-17,30,-6,48,-13","w":161,"k":{"c":3,"d":3,"e":3,"o":3,"q":3,"t":5,"v":2,"w":2,"y":3,"g":2}},"u":{"d":"44,-149v-8,33,-1,82,-3,121v12,40,70,0,85,-17v-1,-34,3,-74,-2,-104v0,-6,4,-8,10,-8v7,0,12,3,10,13v2,45,-5,99,3,138v0,5,-6,8,-14,8v-18,-1,-4,-15,-7,-28v-17,23,-103,55,-103,2r-1,-124v0,-14,21,-13,22,-1","w":168,"k":{"v":-1,"w":-1}},"v":{"d":"51,-9v-6,-26,-40,-113,-41,-139v0,-4,4,-9,12,-9v11,1,12,9,8,15v1,27,24,83,33,115v16,-43,49,-83,64,-121v5,-13,17,-17,20,-4v-4,24,-72,121,-75,146v-1,12,-21,14,-21,-3","w":146,"k":{"a":5,"c":7,"d":7,"e":7,"o":7,"q":7,"v":-2,"w":-2,",":16,".":16,"y":-3}},"w":{"d":"214,-149v-10,49,-47,94,-57,142v1,6,-1,10,-10,10v-6,0,-8,-4,-10,-10r-32,-110r-42,108v-1,16,-23,17,-22,-1r-28,-139v-2,-15,21,-15,21,-4v-2,40,15,84,20,125r44,-110v-6,-9,-3,-19,9,-19v6,0,9,5,9,20r32,108v5,-36,48,-82,44,-119v-1,-10,22,-13,22,-1","w":216,"k":{"a":5,"c":7,"d":7,"e":7,"o":7,"q":7,"v":-2,"w":-2,",":16,".":16,"y":-3}},"x":{"d":"64,-78v-11,-9,-44,-46,-54,-69v0,-6,7,-10,13,-10v7,0,8,5,8,9v7,20,31,44,44,57r47,-58v0,-4,1,-10,7,-10v10,-1,17,17,6,19r-47,60v29,28,59,66,59,76v0,10,-12,12,-17,3v-8,-16,-32,-47,-53,-65r-49,62v0,4,-1,8,-9,8v-4,0,-10,-3,-10,-11v0,-5,3,-8,6,-8","w":153,"k":{"v":-4,"w":-4}},"y":{"d":"41,73v-26,1,-39,-26,-45,-41v-2,-16,22,-13,22,-3v-8,13,7,28,23,29v20,0,32,-14,46,-56r-82,-149v0,-6,6,-10,11,-10v9,0,11,6,10,12r70,126r45,-128v0,-5,2,-11,10,-11v13,-1,16,13,6,18r-60,165v-14,38,-32,48,-56,48","w":164,"k":{"a":3,"c":5,"d":5,"e":5,"o":5,"q":5,"s":1,"v":-4,"w":-4,",":12,".":12,"g":5}},"z":{"d":"13,-15r109,-123r-91,0v0,9,-3,13,-9,13v-14,-3,-11,-28,6,-28r104,0v5,-8,18,-6,18,4v0,4,-1,7,-5,10r-110,124r97,0v1,-6,4,-11,9,-11v6,0,9,4,9,13v1,16,-11,19,-18,13v-39,2,-85,-3,-118,3v-12,2,-11,-16,-1,-18","w":160,"k":{"y":-3}},"{":{"d":"80,83v-44,1,-31,-53,-31,-92v0,-58,-10,-68,-39,-68v-5,0,-6,-2,-6,-8v0,-6,2,-8,8,-8v34,0,42,-17,42,-86v0,-40,20,-67,48,-67v10,0,11,4,11,9v0,6,-3,9,-13,9v-30,3,-30,44,-29,78v0,37,-10,60,-30,66v29,-1,28,82,22,120v-5,35,25,33,42,26v6,0,8,4,8,10v0,8,-3,11,-33,11","w":113,"k":{"V":-3,"W":-3,"Y":-8,"j":-48}},"|":{"d":"31,81r-1,-342v0,-5,3,-9,12,-9v10,0,13,12,7,17r0,329v7,5,3,14,-7,14v-6,0,-11,-2,-11,-9","w":80},"}":{"d":"33,-246v45,-1,31,54,31,92v0,58,10,68,39,68v5,0,6,2,6,8v0,6,-2,8,-8,8v-34,0,-42,16,-42,85v0,40,-19,68,-47,68v-10,0,-12,-4,-12,-9v0,-6,3,-9,13,-9v30,-3,30,-44,29,-78v0,-37,11,-60,31,-66v-29,1,-30,-81,-23,-120v5,-35,-25,-33,-42,-26v-6,0,-8,-4,-8,-10v0,-8,3,-11,33,-11","w":113},"~":{"d":"135,-69v30,3,17,-39,33,-42v6,0,10,6,10,11v0,19,-15,48,-43,48v-30,0,-39,-35,-63,-37v-24,-2,-29,27,-41,36v-7,0,-14,-2,-14,-8v11,-24,32,-46,58,-46v26,0,37,35,60,38","w":199},"'":{"d":"36,-233v-7,18,-4,49,-3,72v0,5,-2,10,-11,10v-10,2,-11,-12,-5,-16v-1,-21,3,-48,-3,-64v0,-6,4,-11,12,-11v6,0,10,6,10,9","w":47,"k":{"C":3,"G":3,"O":3,"Q":3,"T":-8,"V":-2,"W":-2,"Y":-6,"A":32,"Z":5,"J":45}},"`":{"d":"46,-230v9,15,21,28,31,42v0,6,-5,9,-10,9v-6,0,-9,-6,-9,-10v-9,-14,-20,-28,-30,-41v0,-5,1,-10,10,-10v6,0,8,5,8,10","w":121}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright © 2000 Adobe Systems Incorporated. All Rights Reserved.
 * 
 * Trademark:
 * Tekton is a registered trademark of Adobe Systems Incorporated.
 * 
 * Full name:
 * TektonPro-Bold
 * 
 * Designer:
 * David Siegel
 * 
 * Vendor URL:
 * http://www.adobe.com/type
 * 
 * License information:
 * http://www.adobe.com/type/legal.html
 */
Cufon.registerFont({"w":236,"face":{"font-family":"Tekton Pro","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 15 6 3 2 2 8 2 9 4","ascent":"245","descent":"-115","x-height":"6","cap-height":"2","bbox":"-43 -270.268 279.013 107","underline-thickness":"18","underline-position":"-18","stemh":"28","stemv":"33","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":65},"\u00a0":{"w":65},"!":{"d":"64,-227v-11,37,-3,91,-5,136v11,15,-2,32,-23,31v-18,-1,-17,-21,-11,-31v-2,-44,6,-99,-5,-134v0,-12,6,-18,28,-18v11,0,16,4,16,16xm36,3v-8,0,-15,-8,-15,-17v-3,-24,40,-45,39,-7v0,15,-5,24,-24,24","w":83},"\"":{"d":"36,-242v33,8,-2,43,12,76v0,8,-5,16,-20,16v-17,3,-16,-19,-8,-26v6,-30,-21,-62,16,-66xm95,-242v35,8,-3,43,13,76v0,8,-6,16,-21,16v-18,0,-16,-19,-7,-26v7,-30,-21,-62,15,-66","w":124,"k":{"C":3,"G":3,"O":3,"Q":3,"T":-6,"V":-1,"W":-1,"Y":-4,"A":36,"Z":1,"J":49}},"#":{"d":"150,-176r11,-40v-5,-10,1,-22,18,-22v21,0,23,21,10,27r-9,35v20,1,41,-9,42,14v0,33,-23,10,-48,15r-15,54v21,2,44,-10,45,15v1,19,-13,22,-22,14r-30,0v-3,19,-13,36,-9,56v0,7,-9,13,-20,13v-20,5,-24,-24,-11,-29r10,-40r-36,0v-3,19,-13,36,-9,56v0,7,-9,13,-20,13v-20,0,-24,-24,-11,-29r11,-40v-23,-2,-48,13,-48,-13v0,-34,28,-12,55,-16r14,-54v-22,-3,-48,12,-50,-14v-1,-19,16,-25,25,-15r32,0r10,-40v-5,-10,1,-22,18,-22v21,0,23,21,10,27r-9,35r36,0xm143,-147r-35,0r-14,54r35,0","w":230},"$":{"d":"153,-179v-23,0,-10,-21,-46,-19r0,49v34,-10,69,-12,69,50v0,49,-42,80,-69,86v-1,24,12,52,-13,52v-23,0,-13,-26,-14,-50v-45,-1,-68,-26,-68,-46v-1,-15,27,-20,28,-3v1,12,22,21,40,22r0,-72v-29,12,-67,12,-67,-34v0,-45,41,-73,67,-78v1,-18,-9,-37,13,-37v23,0,13,16,14,34v45,0,62,19,62,28v0,13,-8,18,-16,18xm80,-140r0,-54v-17,3,-35,19,-35,45v0,24,20,16,35,9xm107,-120r0,79v19,-6,37,-31,37,-54v0,-32,-18,-35,-37,-25"},"%":{"d":"159,-237v15,-2,31,21,12,29r-102,193v0,13,-9,18,-19,18v-19,0,-21,-20,-8,-27r103,-196v0,-10,8,-17,14,-17xm67,-236v21,0,38,12,38,36v0,29,-31,56,-57,56v-19,0,-38,-12,-38,-38v0,-30,31,-54,57,-54xm74,-198v0,-8,-3,-14,-10,-14v-18,-3,-33,39,-13,44v10,0,23,-15,23,-30xm112,-35v0,-40,33,-59,64,-59v17,0,34,13,34,43v0,34,-30,57,-63,57v-17,0,-35,-13,-35,-41xm179,-51v0,-12,-4,-18,-11,-18v-13,0,-25,11,-25,33v0,13,4,18,10,18v12,0,26,-12,26,-33","w":220},"&":{"d":"114,-140r44,56v18,-20,3,-31,22,-38v19,-1,32,20,15,27v-3,8,-10,25,-18,35v4,5,19,27,22,27v5,-3,27,-16,27,2v0,14,-35,48,-46,23r-23,-29v-27,30,-55,44,-89,44v-29,0,-60,-18,-60,-69v0,-44,29,-72,59,-87v-27,-30,-42,-87,29,-88v87,-2,68,71,18,97xm96,-162v28,-15,48,-52,1,-51v-35,2,-20,32,-1,51xm139,-60r-54,-66v-22,12,-44,28,-44,62v0,65,67,44,98,4","w":222},"(":{"d":"85,-246v6,0,25,2,25,26v0,10,-9,14,-16,13v-51,45,-52,200,-2,253v7,-4,15,4,15,16v0,31,-28,24,-40,9v-68,-83,-56,-238,4,-304v1,-8,8,-13,14,-13","w":119,"k":{"V":-1,"W":-1,"Y":-5,"j":-46}},")":{"d":"10,-220v3,-32,33,-34,39,-13v60,66,71,221,4,304v-12,15,-40,22,-40,-9v0,-12,8,-20,15,-16v50,-53,49,-208,-1,-253v-7,1,-17,-3,-17,-13","w":119},"*":{"d":"87,-183v12,15,26,19,31,31v0,21,-25,12,-28,1r-15,-19v-7,12,-3,40,-22,38v-24,-3,0,-30,5,-42v-12,6,-44,21,-45,2v-1,-18,32,-11,46,-19v-7,-8,-27,-16,-28,-28v0,-5,3,-12,12,-12v16,1,16,20,27,28v7,-12,1,-34,19,-35v27,6,1,28,-4,41v13,-3,36,-26,40,-2v-2,19,-20,11,-38,16","w":137},"+":{"d":"81,-96v6,-28,-19,-64,13,-64v37,0,14,33,19,64v28,6,65,-19,65,15v0,33,-36,11,-65,16v-5,27,16,63,-13,67v-20,2,-28,-16,-19,-29r0,-38v-25,-5,-62,16,-64,-13v-1,-20,12,-25,25,-18r39,0","w":199},",":{"d":"58,-9v-1,35,-23,49,-40,49v-8,0,-9,-3,-9,-9v2,-15,36,-8,31,-31v-11,9,-23,-3,-23,-16v0,-14,6,-25,20,-25v14,0,21,11,21,32","w":78,"k":{"\"":42,"'":42}},"-":{"d":"108,-97v-4,33,-39,8,-67,18v-9,12,-26,5,-26,-13v0,-18,15,-25,24,-16v28,3,66,-24,69,11","w":123},"\u00ad":{"d":"108,-97v-4,33,-39,8,-67,18v-9,12,-26,5,-26,-13v0,-18,15,-25,24,-16v28,3,66,-24,69,11","w":123,"k":{"C":-6,"G":-6,"O":-6,"Q":-6,"T":30,"V":8,"W":8,"X":12,"Y":37,"A":9,"Z":12,"J":17}},".":{"d":"58,-21v0,12,-6,24,-23,24v-8,0,-17,-7,-17,-22v0,-11,8,-24,22,-24v10,0,18,7,18,22","w":80,"k":{"\"":42,"'":42}},"\/":{"d":"99,-235v23,0,22,21,9,26r-64,191v6,13,-1,25,-18,24v-18,4,-32,-27,-11,-32r65,-191v0,-10,2,-18,19,-18","w":121},"0":{"d":"139,-235v37,0,84,25,84,85v0,123,-97,155,-133,155v-45,0,-78,-27,-78,-82v0,-112,74,-158,127,-158xm138,-205v-39,0,-89,35,-89,126v0,39,19,54,41,54v32,0,98,-29,98,-122v0,-36,-19,-58,-50,-58","k":{",":3,".":3}},"1":{"d":"126,-192r-58,35v-5,16,-29,11,-29,-8v0,-10,8,-17,15,-18v32,-16,61,-39,96,-52v15,-1,19,17,10,25v2,64,3,138,3,197v0,8,-4,15,-23,15v-19,4,-24,-15,-14,-25r0,-169"},"2":{"d":"128,-206v-33,1,-53,10,-58,38v-3,21,-44,14,-41,-6v0,-6,6,-13,11,-13v22,-64,158,-67,159,9v0,45,-28,64,-52,77v-30,16,-60,36,-75,72r100,0v0,-15,3,-21,19,-21v10,-1,15,7,15,30v0,14,-3,20,-14,20v-49,2,-107,-5,-148,5v-35,-6,-4,-45,4,-61v39,-68,115,-51,115,-121v0,-19,-14,-29,-35,-29"},"3":{"d":"147,-204r-84,0v2,18,5,35,-17,35v-32,0,-14,-25,-14,-50v0,-8,6,-14,16,-14r130,0v22,-1,17,21,7,31r-47,48v40,-9,76,9,77,57v0,72,-61,102,-133,102v-32,0,-61,-18,-61,-55v0,-23,40,-30,40,-8v0,9,-5,10,-7,12v4,15,15,22,36,22v51,0,89,-24,89,-69v0,-17,-10,-36,-31,-36v-41,0,-54,20,-68,20v-9,0,-16,-9,-16,-19v0,-17,18,-9,34,-25"},"4":{"d":"136,-70r-113,18v-22,1,-21,-28,-6,-34r115,-134v0,-7,9,-13,21,-13v19,-1,24,16,17,29r0,99v14,-2,29,-6,42,-9v9,0,16,3,16,17v0,19,-13,26,-25,17r-33,4v1,21,-3,47,5,61v0,11,-9,17,-26,17v-17,0,-19,-15,-13,-24r0,-48xm136,-100r0,-83r-81,95"},"5":{"d":"26,-109v7,-18,11,-95,10,-106v0,-8,6,-11,14,-11v43,-5,95,-2,131,-13v12,0,17,9,17,19v1,17,-17,23,-27,14r-103,8v0,5,-3,46,-6,61v36,-26,61,-26,79,-26v34,0,75,14,75,64v-2,100,-130,130,-184,80v-20,-6,-17,-35,8,-36v13,0,15,8,15,16v0,5,14,16,40,16v49,0,85,-33,85,-71v0,-24,-14,-40,-44,-40v-55,0,-73,38,-93,38v-9,0,-17,-4,-17,-13"},"6":{"d":"223,-97v0,99,-130,137,-187,70v-9,1,-19,-12,-14,-25v-33,-86,36,-187,120,-187v36,0,64,16,64,38v0,10,-8,17,-19,17v-15,0,-19,-11,-16,-17v-64,-37,-137,49,-121,119v24,-36,65,-70,106,-70v49,0,67,31,67,55xm61,-54v27,57,120,30,125,-42v0,-11,-9,-27,-32,-27v-35,0,-70,36,-93,69"},"7":{"d":"177,-232v20,0,6,-12,26,-11v22,0,24,20,11,32v-13,21,-88,167,-98,193v0,16,-5,24,-22,24v-25,0,-15,-28,-6,-45r85,-165v-34,4,-75,5,-111,7v2,20,4,35,-19,35v-28,0,-12,-25,-12,-49v0,-9,2,-14,17,-15"},"8":{"d":"75,4v-24,0,-66,-18,-66,-55v-1,-36,33,-66,53,-80v-12,-6,-21,-16,-21,-37v0,-48,40,-71,86,-71v67,0,68,54,41,84v21,0,56,14,56,50v0,59,-89,109,-149,109xm133,-156v20,-16,31,-52,-12,-56v-40,-4,-63,53,-30,66v11,-4,31,-9,42,-10xm188,-103v0,-13,-16,-23,-44,-23v-47,0,-100,34,-100,74v0,15,23,27,33,27v47,0,111,-40,111,-78"},"9":{"d":"26,-148v0,-86,132,-121,176,-53v10,4,15,19,12,30v27,92,-43,177,-118,177v-36,0,-56,-15,-70,-39v-20,-7,-2,-38,11,-34v17,0,22,13,19,21v44,62,147,-17,128,-88v-15,19,-51,41,-87,40v-42,0,-71,-35,-71,-54xm177,-175v-14,-53,-120,-38,-115,23v14,53,119,18,115,-23"},":":{"d":"36,-100v-30,-4,-23,-47,5,-47v25,4,19,49,-5,47xm57,-26v2,29,-38,42,-39,10v-1,-27,35,-42,39,-10","w":78},";":{"d":"35,-100v-8,0,-17,-6,-17,-21v0,-10,8,-24,22,-24v10,0,18,5,18,21v0,12,-7,24,-23,24xm58,-9v-1,35,-23,49,-40,49v-8,0,-9,-3,-9,-9v2,-15,36,-8,31,-31v-11,9,-23,-3,-23,-16v0,-14,6,-25,20,-25v14,0,21,11,21,32","w":78},"<":{"d":"66,-80r79,48v11,1,16,2,16,10v1,15,-27,40,-34,16r-84,-55v-22,-13,-26,-27,-7,-38r90,-47v-1,-7,7,-14,15,-14v25,2,34,34,7,37","w":199},"=":{"d":"33,-136v38,3,92,-1,130,-1v10,0,14,7,14,19v1,17,-12,21,-24,16r-122,2v-10,0,-13,-6,-13,-15v0,-15,6,-21,15,-21xm33,-68v41,1,92,-2,130,-2v10,0,14,7,14,19v1,17,-12,21,-24,16v-40,2,-86,3,-122,3v-10,0,-13,-7,-13,-16v0,-15,6,-20,15,-20","w":199},">":{"d":"51,-32r79,-48r-82,-43v-13,-1,-17,-7,-17,-18v0,-4,9,-19,23,-19v8,0,16,7,15,14r91,47v18,11,14,25,-7,38r-84,55v-1,6,-6,10,-13,10v-10,0,-22,-17,-22,-26v0,-8,6,-9,17,-10","w":199},"?":{"d":"36,-83v-15,-31,98,-89,90,-115v0,-8,-9,-17,-27,-17v-26,0,-42,18,-50,29v1,11,-8,18,-14,18v-19,0,-26,-25,-13,-33v9,-12,33,-42,83,-42v33,0,57,20,57,42v0,21,-9,34,-54,72v-35,29,-41,36,-41,44v0,14,29,5,26,-4v2,-14,31,-14,31,4v0,14,-14,33,-49,33v-26,0,-39,-7,-39,-31xm70,7v-7,0,-17,-7,-17,-19v0,-17,7,-27,23,-27v21,0,21,46,-6,46","w":167},"@":{"d":"37,-39v0,69,65,72,107,50v3,-14,31,-7,30,6v0,9,-9,16,-20,15v-60,28,-144,19,-144,-71v0,-72,77,-160,174,-160v71,0,92,43,92,97v0,77,-40,106,-72,106v-36,-1,-32,-28,-30,-53v-14,19,-45,48,-76,48v-18,0,-32,-12,-32,-35v2,-56,63,-125,121,-113v8,-15,35,-4,25,12r-11,103v-1,8,0,16,9,16v13,0,39,-22,39,-80v0,-45,-11,-79,-65,-79v-85,0,-147,81,-147,138xm99,-45v0,13,4,15,10,15v22,-2,76,-47,73,-85v0,-8,-4,-10,-10,-10v-30,0,-73,46,-73,80","w":289},"A":{"d":"134,-212v9,37,86,171,83,193v4,24,-39,28,-40,7v5,-29,2,-16,-21,-75r-89,6v-23,52,-26,35,-25,68v0,8,-4,15,-21,15v-13,0,-19,-8,-19,-17v20,-60,72,-139,95,-200v-5,-25,37,-32,39,-11v0,6,-2,9,-2,14xm81,-109r63,-5r-30,-66","w":225,"k":{"\u00ad":9,"\"":34,"'":34,"a":-3,"f":1,"c":-2,"d":-2,"e":-2,"o":-2,"q":-2,"t":3,"T":15,"U":1,"v":1,"w":1,"V":6,"W":6,"X":3,"Y":23}},"B":{"d":"25,-26v-2,-61,4,-130,-3,-186v-2,-20,35,-23,37,-6v36,-15,122,-31,127,14v2,22,-15,38,-40,52v38,-7,70,19,69,45v0,77,-129,111,-176,111v-21,0,-27,-22,-14,-30xm59,-189r0,43v40,-2,92,-25,92,-47v0,-7,-5,-13,-26,-13v-18,0,-51,8,-66,17xm179,-103v0,-36,-106,-31,-120,-5r0,79v46,-4,120,-32,120,-74","w":225,"k":{"\u00ad":-2,"\"":6,"'":6,"a":9,"c":4,"d":4,"e":4,"o":4,"q":4,"T":9,"X":1,"Y":15,"A":9,"i":1,"m":1,"n":1,"r":1,",":11,".":11,"u":2,"Z":10}},"C":{"d":"187,-58v0,37,-52,64,-99,64v-44,0,-76,-32,-76,-99v0,-54,43,-143,110,-143v40,0,68,20,68,37v0,12,-8,19,-19,19v-24,0,-11,-27,-47,-27v-45,0,-77,71,-77,116v-2,83,71,78,102,39v1,-9,4,-21,19,-21v13,0,19,9,19,15","w":201,"k":{"a":5,"c":4,"d":4,"e":4,"o":4,"q":4,"C":1,"G":1,"O":1,"Q":1,"T":-1,"A":2,"i":3,"m":3,"n":3,"r":3,"u":3,"y":4,"h":1,"k":1,"l":1,"z":1}},"D":{"d":"40,5v-23,0,-25,-18,-17,-30r-2,-194v0,-6,6,-15,21,-15v13,0,17,8,15,16v22,-11,44,-17,74,-17v45,0,79,42,79,82v0,41,-16,79,-44,106v-36,35,-93,52,-126,52xm57,-28v57,-3,117,-54,117,-122v0,-26,-21,-56,-51,-56v-21,0,-44,7,-66,19r0,159","w":221,"k":{"a":4,"c":5,"d":5,"e":5,"o":5,"q":5,"U":-1,"V":-5,"W":-5,"X":1,"Y":5,"i":1,"m":1,"n":1,"r":1,",":10,".":10,"J":1,"g":8,"p":1}},"E":{"d":"60,-100r0,70v37,-4,81,-1,111,-12v12,0,20,9,20,17v0,15,-10,18,-29,18v-42,0,-86,4,-122,13v-16,4,-24,-21,-15,-34v0,-30,2,-63,-6,-84v7,-20,6,-47,6,-74v-14,-8,0,-25,-4,-34v0,-8,9,-13,20,-13v12,0,19,5,19,13v33,-4,74,-2,99,-13v14,0,20,8,20,17v1,18,-18,26,-33,18r-86,8r0,60v27,-4,59,-4,81,-13v12,0,20,9,20,18v1,16,-17,23,-29,16","w":199,"k":{"c":2,"d":2,"e":2,"o":2,"q":2,"C":2,"G":2,"O":2,"Q":2,"s":3,"t":5,"v":3,"w":3,"Y":6,"u":2,"y":1,"g":2,"p":3,"S":1}},"F":{"d":"59,-101v1,30,-4,65,5,87v0,11,-11,17,-24,17v-24,0,-25,-23,-15,-34v6,-38,-12,-74,0,-99v0,-26,2,-52,-7,-70v0,-7,2,-12,7,-13v-1,-12,12,-18,23,-18v9,0,15,5,12,12v32,-5,67,-8,96,-16v11,0,19,6,19,16v0,24,-18,26,-32,18r-84,13r0,57r93,-16v18,2,17,42,-4,38v-28,-6,-59,6,-89,8","w":182,"k":{"\u00ad":3,"a":19,"c":22,"d":22,"e":22,"o":22,"q":22,"C":1,"G":1,"O":1,"Q":1,"X":1,"A":22,"i":9,"m":9,"n":9,"r":9,",":43,".":43,"u":12,"y":8,"Z":1,"h":2,"k":2,"l":2,"J":36}},"G":{"d":"12,-89v-1,-81,74,-143,144,-150v31,-2,59,19,63,39v0,9,-6,16,-17,16v-23,0,-13,-31,-48,-27v-51,6,-107,52,-107,122v0,83,72,78,114,41v24,-22,35,-45,35,-59v-17,1,-73,28,-73,-3v0,-9,6,-16,17,-16v29,0,67,-13,77,-13v10,0,16,7,16,17v0,32,-35,128,-140,128v-53,0,-81,-38,-81,-95","w":244,"k":{"a":6,"c":5,"d":5,"e":5,"o":5,"q":5,"Z":2}},"H":{"d":"60,-105v1,30,2,64,2,91v0,9,-7,16,-17,16v-24,0,-28,-14,-20,-27v-2,-30,5,-69,-6,-89v0,-9,1,-17,6,-19v-1,-27,3,-61,-3,-83v0,-17,39,-24,41,-1v-5,23,-3,54,-3,81r106,-7v0,-25,2,-54,-3,-74v1,-21,39,-17,41,-1v-8,58,-1,131,-3,194v9,13,-3,26,-18,26v-16,0,-27,-17,-17,-30r0,-84","w":225},"I":{"d":"59,-198r0,170v11,12,2,29,-17,30v-19,1,-28,-19,-17,-32r0,-171v-12,-14,4,-32,21,-31v21,1,24,22,13,34","w":83},"J":{"d":"71,-11v29,0,60,-26,59,-50r0,-134v-14,-12,0,-40,17,-35v15,-2,27,20,18,33r0,142v0,39,-46,75,-92,75v-44,0,-68,-26,-68,-61v0,-32,40,-33,41,-8v-9,19,-6,38,25,38","w":190,"k":{"a":3,"c":2,"d":2,"e":2,"o":2,"q":2,"u":2}},"K":{"d":"60,-122v-1,31,-5,78,3,105v0,27,-42,24,-42,0v0,-5,1,-7,4,-10v-2,-61,-3,-131,-3,-187v0,-25,37,-24,40,-2v-4,17,-4,43,-2,62v19,-23,55,-45,79,-64v6,-18,32,-18,36,3v0,7,-7,17,-16,18r-75,57r104,112v8,0,13,7,13,12v0,8,-10,19,-24,19v-11,0,-16,-5,-16,-11v-32,-37,-74,-73,-101,-114","w":203,"k":{"\u00ad":22,"\"":4,"'":4,"c":1,"d":1,"e":1,"o":1,"q":1,"C":6,"G":6,"O":6,"Q":6,"T":6,"U":1,"v":6,"w":6,"V":3,"W":3,"Y":6,"A":1,"i":1,"m":1,"n":1,"r":1,"u":2,"y":3,"h":1,"k":1,"l":1}},"L":{"d":"59,-203r0,176v27,-5,59,-5,81,-14v6,0,17,4,17,16v-1,19,-11,22,-26,19r-91,11v-19,3,-25,-19,-15,-29v-2,-61,-3,-132,-3,-188v0,-26,40,-29,41,-1v0,4,-3,7,-4,10","w":163,"k":{"\u00ad":18,"\"":34,"'":34,"c":4,"d":4,"e":4,"o":4,"q":4,"C":9,"G":9,"O":9,"Q":9,"T":30,"U":6,"v":8,"w":8,"V":14,"W":14,"X":1,"Y":31,"u":5,"y":6,"S":1}},"M":{"d":"40,2v-18,1,-23,-16,-16,-28r0,-187v0,-13,8,-18,20,-18v11,0,16,6,16,14v2,31,62,107,77,159v16,-63,87,-109,79,-163v11,-25,54,-8,40,17v2,62,3,132,3,189v0,11,-10,17,-21,17v-19,1,-23,-14,-16,-26r1,-124v-22,37,-68,109,-70,135v-2,22,-43,14,-39,-6v-1,-26,-33,-89,-59,-131v3,43,-4,98,5,135v0,9,-7,17,-20,17","w":282},"N":{"d":"62,-219v0,57,77,108,102,150v-1,-46,-1,-93,-1,-141v-9,-10,0,-29,14,-26v16,-2,26,13,18,25r0,191v7,9,6,22,-15,22v-11,0,-17,-10,-21,-20v-21,-44,-83,-101,-103,-140v3,45,-4,104,5,144v0,11,-6,16,-18,16v-18,0,-28,-14,-18,-27v-2,-62,-3,-132,-3,-189v0,-9,6,-18,20,-18v15,0,20,4,20,13","w":220},"O":{"d":"10,-88v0,-72,56,-156,120,-155v41,0,80,31,80,112v0,79,-56,137,-123,137v-58,0,-77,-54,-77,-94xm126,-214v-37,0,-80,66,-80,122v0,33,13,70,48,70v39,0,80,-46,80,-108v0,-56,-18,-84,-48,-84","w":222,"k":{"a":4,"c":5,"d":5,"e":5,"o":5,"q":5,"U":-1,"V":-5,"W":-5,"X":1,"Y":5,"i":1,"m":1,"n":1,"r":1,",":10,".":10,"J":1,"g":8,"p":1}},"P":{"d":"40,2v-18,0,-23,-16,-14,-27r0,-133v-14,-1,-12,-31,0,-34v-3,-19,-3,-38,17,-38v15,0,20,8,17,22v23,-20,137,-46,136,14v0,40,-55,84,-135,97v2,27,-5,62,4,83v0,13,-5,16,-25,16xm61,-176r0,49v63,-9,99,-38,99,-59v0,-8,-9,-15,-26,-15v-23,0,-45,8,-73,25","w":201,"k":{"i":14,"\u00ad":30,"\"":-2,"'":-2,"a":33,"c":35,"d":35,"e":35,"o":35,"q":35,"s":26,"t":6,"Y":-3,"A":31,"m":14,"n":14,"r":14,",":59,".":59,"u":15,"y":7,"Z":2,"h":3,"k":3,"l":3,"J":50,":":2,";":2}},"Q":{"d":"216,17v-21,-7,-30,-21,-50,-38v-57,37,-154,51,-154,-62v0,-94,75,-158,134,-158v88,0,87,147,44,197v10,11,22,22,32,28v7,1,14,4,14,13v0,12,-11,20,-20,20xm122,-99v24,0,25,17,43,32v25,-37,29,-146,-22,-146v-38,0,-95,48,-95,129v0,68,61,74,96,42v-12,-11,-24,-22,-37,-30v-8,-6,0,-27,15,-27","k":{"a":4,"c":5,"d":5,"e":5,"o":5,"q":5,"U":-1,"V":-5,"W":-5,"X":1,"Y":5,"i":1,"m":1,"n":1,"r":1,",":10,".":10,"J":1,"g":8,"p":1}},"R":{"d":"38,2v-18,0,-21,-21,-12,-31r0,-139v-6,4,-11,-3,-11,-13v0,-20,17,-17,8,-38v0,-10,11,-17,21,-17v13,0,20,10,16,25v31,-14,59,-20,88,-20v29,0,50,13,50,37v0,36,-40,65,-113,78r116,85v12,-4,24,5,24,14v0,22,-30,28,-39,12r-126,-93v1,27,-3,59,3,82v0,14,-13,18,-25,18xm60,-184r0,51v56,-12,102,-30,102,-56v0,-9,-9,-14,-23,-14v-20,0,-48,5,-79,19","w":219,"k":{"\u00ad":17,"a":-4,"c":-3,"d":-3,"e":-3,"o":-3,"q":-3,"T":2,"V":1,"W":1,"Y":4}},"S":{"d":"157,-119v-49,0,-143,52,-143,-26v0,-40,52,-89,114,-89v33,0,62,22,62,37v0,8,-4,15,-16,15v-14,0,-21,-6,-21,-13v-33,-29,-103,11,-103,46v0,13,7,18,16,18v46,0,149,-45,149,31v0,70,-79,104,-137,105v-46,0,-63,-33,-63,-45v0,-12,8,-21,20,-21v22,5,14,41,45,38v39,-3,101,-26,99,-75v0,-15,-7,-21,-22,-21","w":227,"k":{"\"":1,"'":1,"a":4,"c":3,"d":3,"e":3,"o":3,"q":3,"T":1,"Y":2,"A":1,"i":1,"m":1,"n":1,"r":1,"u":1,"h":1,"k":1,"l":1,"p":1}},"T":{"d":"106,-198v2,60,3,128,3,183v0,10,-7,17,-24,17v-17,0,-18,-16,-14,-28r0,-166r-53,12v-10,0,-17,-6,-17,-16v-1,-15,15,-24,26,-16r48,-9v5,-6,19,-9,25,-5r66,-12v9,0,16,6,16,17v0,14,-16,22,-27,14","w":177,"k":{"\u00ad":33,"\"":-8,"'":-8,"a":27,"c":25,"d":25,"e":25,"o":25,"q":25,"C":12,"G":12,"O":12,"Q":12,"s":22,"T":3,"v":18,"w":18,"Y":-1,"A":21,"i":12,"m":12,"n":12,"r":12,",":23,".":23,"u":18,"y":13,"h":9,"k":9,"l":9,"z":16,"J":25,"S":9,")":-13,"]":-13,"}":-13}},"U":{"d":"190,-60v-6,34,-59,66,-105,66v-46,0,-61,-30,-61,-52r0,-161v-6,-12,2,-23,16,-23v15,0,17,13,17,20r0,167v3,9,14,18,29,18v48,0,71,-31,71,-40v-2,-50,-3,-107,-3,-152v0,-10,9,-17,22,-17v11,0,20,12,14,23r0,151","w":217,"k":{"\u00ad":5,"a":3,"c":3,"d":3,"e":3,"o":3,"q":3,"A":6,"J":3,"g":3}},"V":{"d":"46,-206v0,13,32,118,38,142v18,-48,52,-108,74,-143v6,-17,13,-21,22,-21v17,-1,21,24,10,37v-48,55,-80,124,-90,170v0,16,-6,24,-24,24v-19,0,-23,-16,-18,-33v2,-36,-50,-143,-48,-183v0,-11,7,-17,20,-17v13,0,16,11,16,24","w":196,"k":{"G":5,"\u00ad":15,"\"":-3,"'":-3,"a":19,"c":20,"d":20,"e":20,"o":20,"q":20,"C":5,"O":5,"Q":5,"A":14,"i":6,"m":6,"n":6,"r":6,",":26,".":26,"u":9,"y":3,"Z":2,"h":3,"k":3,"l":3,"J":27,"S":1,")":-8,"]":-8,"}":-8}},"W":{"d":"136,-153v-9,38,-43,106,-44,140v0,9,-10,16,-24,16v-10,0,-16,-7,-16,-29v-1,-53,-38,-129,-39,-185v-1,-27,37,-27,37,-4v0,54,21,104,26,156v9,-35,45,-111,43,-149v0,-14,6,-20,17,-20v15,0,18,7,18,24v0,34,40,107,47,145v8,-57,39,-107,39,-161v0,-8,5,-17,20,-17v18,0,21,13,18,29v-11,62,-46,121,-56,185v-3,21,-7,29,-20,29v-16,0,-18,-8,-20,-26v-2,-27,-37,-102,-46,-133","w":286,"k":{"\u00ad":15,"\"":-3,"'":-3,"a":19,"c":20,"d":20,"e":20,"o":20,"q":20,"C":5,"G":5,"O":5,"Q":5,"A":14,"i":6,"m":6,"n":6,"r":6,",":26,".":26,"u":9,"y":3,"Z":2,"h":3,"k":3,"l":3,"J":27,"S":1,")":-8,"]":-8,"}":-8}},"X":{"d":"28,-233v37,8,41,44,66,82v16,-23,36,-55,43,-67v3,-19,39,-17,37,4v0,10,-6,16,-11,19v-10,15,-33,43,-53,73v15,25,39,68,55,92v11,11,3,32,-15,32v-13,0,-17,-10,-16,-19v-12,-21,-28,-54,-42,-77v-18,28,-40,68,-46,82v-7,16,-37,20,-39,-1v0,-8,3,-13,10,-16v10,-19,39,-66,58,-94v-20,-38,-45,-63,-61,-93v0,-10,8,-17,14,-17","w":183,"k":{"\u00ad":12,"\"":-1,"'":-1,"C":1,"G":1,"O":1,"Q":1,"V":-4,"W":-4,"i":1,"m":1,"n":1,"r":1,"D":-4,"E":-4,"F":-4,"H":-4,"I":-4,"K":-4,"L":-4,"N":-4,"P":-4,"R":-4}},"Y":{"d":"216,-220v-19,46,-71,68,-92,108v2,32,-5,71,4,96v0,10,-7,18,-24,18v-19,4,-22,-20,-14,-32r0,-83v-19,-35,-56,-54,-79,-88v-19,-8,-10,-36,11,-35v9,0,18,7,17,16v15,25,51,54,69,78v20,-26,52,-48,72,-79v1,-18,37,-20,36,1","w":213,"k":{"G":11,"\u00ad":39,"\"":-6,"'":-6,"a":33,"c":35,"d":35,"e":35,"o":35,"q":35,"C":11,"O":11,"Q":11,"t":11,"T":-1,"v":13,"w":13,"V":-1,"W":-1,"Y":-1,"A":25,"i":10,"m":10,"n":10,"r":10,",":37,".":37,"u":21,"Z":1,"h":2,"k":2,"l":2,"J":31,"S":3,")":-12,"]":-12,"}":-12}},"Z":{"d":"177,0r-146,3v-30,1,-33,-24,-14,-39r141,-170r-100,5v-3,21,-35,24,-35,3v0,-26,18,-47,35,-32r127,-7v26,3,17,24,2,42r-141,169r115,-3v2,-26,35,-32,36,2v0,19,-10,27,-20,27","w":208,"k":{"\u00ad":10,"\"":-3,"'":-3,"v":4,"w":4,"Y":-3}},"[":{"d":"60,48v22,7,59,-23,61,10v-6,26,-49,13,-76,23v-12,0,-18,-6,-18,-20r0,-278v1,-23,19,-25,34,-17v20,-2,56,-21,56,6v0,17,-12,23,-23,17r-34,6r0,253","w":120,"k":{"V":-1,"W":-1,"Y":-5,"j":-46}},"\\":{"d":"78,-18v-25,-67,-43,-142,-73,-204v0,-8,4,-13,17,-13v17,0,20,8,19,18r65,191v7,2,12,6,12,13v2,23,-40,25,-42,6v0,-5,1,-8,2,-11","w":121},"]":{"d":"61,-209v-23,-7,-59,25,-60,-10v5,-27,50,-12,75,-23v12,0,19,7,19,21r0,278v-1,22,-20,24,-34,16v-20,1,-56,21,-56,-6v0,-17,13,-23,22,-16r34,-6r0,-254","w":120},"^":{"d":"137,-150r-34,-42r-40,43v0,8,-4,20,-15,20v-27,-2,-32,-25,-11,-37r52,-59v9,-21,35,-4,37,8v15,23,38,42,48,70v0,7,-4,18,-21,18v-8,0,-17,-7,-16,-21","w":199},"_":{"d":"180,54r-180,0r0,-27r180,0r0,27","w":180},"a":{"d":"120,-104v0,-15,3,-32,-13,-32v-19,0,-37,7,-50,15v1,3,-5,10,-15,10v-21,-2,-18,-33,2,-32v25,-16,106,-39,108,13v2,39,-4,86,3,119v0,11,-13,13,-24,13v-27,0,-6,-20,-13,-36v-26,28,-50,40,-80,40v-18,0,-33,-10,-33,-28v0,-32,39,-73,115,-82xm50,-22v31,0,75,-28,69,-59v-48,6,-81,34,-81,50v0,6,5,9,12,9","w":175,"k":{"c":1}},"b":{"d":"59,-223v-5,25,-4,67,-2,96v18,-15,45,-30,74,-30v21,0,35,11,35,37v0,50,-66,125,-129,125v-20,0,-25,-17,-15,-27r0,-188v-12,-14,3,-29,20,-27v8,0,17,4,17,14xm56,-98r0,70v36,-12,75,-49,75,-90v0,-9,-11,-11,-15,-11v-14,0,-39,10,-60,31","w":173,"k":{"a":5,"c":3,"d":3,"e":3,"o":3,"q":3,"v":-2,"w":-2,",":12,".":12,"g":5}},"c":{"d":"155,-53v-1,16,-48,60,-86,60v-36,0,-57,-24,-57,-58v0,-41,16,-61,37,-83v16,-30,104,-36,104,2v0,10,-7,18,-21,18v-17,0,-6,-20,-28,-18v-33,3,-57,37,-59,75v-2,51,64,37,77,6v2,-10,4,-17,16,-17v14,0,17,10,17,15","w":167,"k":{"a":5,"c":3,"d":3,"e":3,"o":3,"q":3,"t":2}},"d":{"d":"132,-143v-1,-27,3,-58,-5,-78v0,-9,10,-15,22,-15v18,0,17,13,17,29r0,185v9,10,2,24,-18,24v-27,0,-14,-23,-16,-47v-18,27,-56,51,-88,51v-21,0,-39,-14,-39,-42v0,-64,67,-132,127,-107xm131,-98v0,-14,-7,-24,-23,-24v-29,0,-69,49,-69,79v0,11,4,19,17,19v18,0,36,-13,51,-29v14,-14,24,-24,24,-45","w":187,"k":{"v":-3,"w":-3}},"e":{"d":"105,-160v41,0,53,30,53,44v0,16,-11,31,-95,46r-17,3v-6,21,1,45,23,45v25,0,46,-14,52,-24v-1,-8,6,-16,18,-16v13,0,16,9,16,16v0,10,-31,52,-90,52v-31,0,-54,-14,-54,-51v0,-67,47,-115,94,-115xm104,-132v-21,0,-40,16,-51,39v64,-11,73,-16,73,-21v0,-9,-7,-18,-22,-18","w":168},"f":{"d":"35,-13v0,-30,1,-70,2,-103v-17,1,-37,16,-37,-12v0,-20,20,-12,37,-16v0,-64,11,-96,52,-96v20,0,45,18,45,30v0,7,-5,17,-15,17v-18,-2,-12,-20,-32,-19v-11,0,-16,13,-16,62v23,1,59,-23,63,5v2,14,-9,22,-20,16r-43,7v2,36,-4,79,3,110v0,9,-8,14,-19,14v-14,0,-20,-5,-20,-15","w":124,"k":{"\u00ad":1,"\"":-14,"'":-14,"c":5,"d":5,"e":5,"o":5,"q":5,"s":2,",":19,".":19,"g":5,")":-17,"]":-17,"}":-17}},"g":{"d":"153,-138r0,144v0,48,-42,71,-75,71v-30,0,-53,-12,-53,-26v0,-20,25,-26,29,-8v28,15,65,8,66,-40r0,-54v-14,35,-45,57,-72,57v-28,0,-40,-17,-40,-40v0,-57,47,-123,123,-123v14,0,22,6,22,19xm41,-39v0,10,4,16,11,16v24,4,69,-59,68,-107v-43,0,-79,48,-79,91","w":174},"h":{"d":"112,-10v8,-25,3,-64,4,-96v0,-12,-2,-16,-8,-16v-10,0,-32,8,-52,33v1,25,-3,56,3,76v0,9,-12,15,-24,15v-17,0,-17,-16,-12,-24r0,-186v-9,-14,0,-29,19,-29v10,0,23,16,14,27r1,85v23,-21,48,-32,67,-32v19,0,25,12,25,36v0,35,-2,77,3,107v3,16,-39,23,-40,4","w":171,"k":{"c":1,"d":1,"e":1,"o":1,"q":1}},"i":{"d":"22,-194v0,-18,8,-32,22,-32v10,0,16,6,16,16v0,34,-38,47,-38,16xm41,-158v13,0,23,19,14,29v3,37,-6,85,5,113v-1,20,-45,26,-42,1v5,-34,1,-86,1,-122v0,-10,0,-21,22,-21","w":77,"k":{"v":-3,"w":-3}},"j":{"d":"42,-176v-24,-5,-18,-56,10,-53v23,5,18,53,-10,53xm61,-122r0,156v0,39,-25,57,-55,57v-33,0,-49,-27,-49,-36v0,-10,6,-21,18,-21v18,-4,10,29,31,28v14,0,22,-10,22,-36r0,-148v-10,-15,-4,-36,21,-36v16,0,24,25,12,36","w":83,"k":{",":-4,".":-4,"u":2,")":-1,"]":-1,"}":-1}},"k":{"d":"58,-220v0,33,-3,84,-2,120v21,-26,35,-37,56,-58v0,-6,6,-12,14,-12v23,-2,24,30,6,31r-51,53r56,59v7,-1,13,4,13,12v0,15,-30,27,-35,8r-60,-66v-7,31,21,74,-17,75v-13,3,-27,-16,-16,-29r0,-183v-9,-9,-7,-28,17,-27v14,0,19,5,19,17","w":158,"k":{"\u00ad":2,"c":3,"d":3,"e":3,"o":3,"q":3,"g":2}},"l":{"d":"19,-16v0,-56,1,-127,3,-188v-7,-14,-7,-36,18,-32v18,-2,27,21,15,33r0,179v13,10,4,25,-15,26v-11,0,-21,-6,-21,-18","w":77,"k":{"v":-3,"w":-3}},"m":{"d":"55,-92v1,25,-3,57,3,77v0,11,-4,17,-18,17v-19,0,-25,-15,-18,-28v-2,-40,5,-88,-4,-121v0,-12,7,-17,24,-17v23,0,13,21,13,41v21,-17,53,-41,71,-41v21,0,24,20,22,43v31,-26,61,-43,76,-43v12,0,20,7,20,20v2,43,-5,95,4,131v0,18,-42,24,-41,0v9,-28,2,-72,4,-107v0,-4,-2,-8,-6,-8v-9,0,-26,9,-57,36v-5,33,15,94,-23,94v-16,0,-22,-17,-11,-27r0,-94v0,-6,-1,-8,-6,-8v-8,0,-30,14,-53,35","w":266,"k":{"c":1,"d":1,"e":1,"o":1,"q":1}},"n":{"d":"57,-95v1,28,2,59,2,84v0,16,-39,19,-40,1v13,-30,-7,-73,4,-99v2,-27,-13,-55,19,-55v28,0,13,18,15,38v37,-31,52,-38,65,-38v13,0,27,12,27,24v2,42,3,90,3,127v0,11,-8,15,-21,15v-16,1,-22,-12,-15,-23r0,-101v-15,-17,-16,-3,-59,27","w":170,"k":{"c":1,"d":1,"e":1,"o":1,"q":1}},"o":{"d":"165,-93v0,66,-53,99,-105,99v-20,0,-49,-17,-49,-57v0,-64,45,-110,100,-110v44,0,54,42,54,68xm68,-22v34,2,63,-35,63,-69v0,-23,-7,-42,-27,-42v-29,0,-59,36,-59,77v0,21,10,34,23,34","w":177,"k":{"a":5,"c":3,"d":3,"e":3,"o":3,"q":3,"v":-2,"w":-2,",":12,".":12,"g":5}},"p":{"d":"36,-159v32,-1,15,24,20,44v21,-29,41,-43,72,-43v25,0,42,19,42,49v0,79,-64,129,-115,106v2,31,-5,70,4,94v0,10,-7,15,-24,15v-14,4,-20,-16,-13,-26r0,-211v-10,-10,1,-32,14,-28xm118,-129v-22,-1,-51,36,-63,58v-1,22,-3,48,19,48v27,0,62,-38,62,-82v0,-13,-5,-24,-18,-24","w":179,"k":{"a":5,"c":3,"d":3,"e":3,"o":3,"q":3,"v":-2,"w":-2,",":12,".":12,"g":5}},"q":{"d":"158,69v12,-6,17,-24,31,-27v7,0,12,6,12,15v0,13,-47,50,-57,50v-14,0,-19,-7,-19,-21r0,-142v-10,27,-38,59,-73,59v-5,0,-43,-1,-43,-51v0,-71,47,-109,99,-109v33,0,50,9,50,18r0,208xm125,-125v-39,-14,-83,10,-83,68v0,28,14,32,18,32v21,0,53,-38,65,-100","w":181,"k":{"}":-1,"]":-1,",":-4,")":-1,".":-4,"u":2}},"r":{"d":"22,-21v-2,-41,4,-89,-3,-124v0,-7,9,-13,21,-13v25,-1,14,15,16,32v20,-18,40,-32,57,-32v11,0,23,11,23,44v0,10,-6,17,-18,17v-24,0,-11,-18,-19,-27v-6,0,-26,12,-44,34v2,25,-5,58,5,76v0,11,-7,16,-26,16v-17,0,-22,-15,-12,-23","w":136,"k":{"a":7,"c":6,"d":6,"e":6,"o":6,"q":6,"t":-2,",":27,".":27,"y":-1,"g":8,":":-3,";":-3,"x":-3}},"s":{"d":"123,-81v-33,0,-108,39,-108,-17v0,-39,53,-65,96,-65v23,0,42,6,42,20v0,9,-5,14,-14,14v-16,0,-3,-9,-28,-8v-36,0,-63,19,-63,35v0,6,4,9,10,9v37,-6,113,-38,113,21v0,58,-75,76,-103,76v-25,0,-50,-13,-50,-30v-5,-18,30,-26,31,-9v-3,9,9,12,20,12v25,0,69,-15,69,-43v0,-9,-5,-15,-15,-15","w":180},"t":{"d":"46,-157v2,-24,-12,-48,20,-48v24,0,11,20,13,42v23,1,62,-24,65,5v2,15,-9,20,-18,15r-47,8r0,97v0,6,2,10,6,10v7,0,35,-16,50,-34v0,-8,5,-14,14,-14v14,0,18,7,18,17v0,14,-61,64,-93,64v-50,0,-21,-88,-28,-135v-18,1,-45,18,-45,-10v0,-23,27,-10,45,-17","w":169,"k":{"c":4,"d":4,"e":4,"o":4,"q":4,"t":3,"v":2,"w":2,"y":3,"g":2}},"u":{"d":"58,-144v-7,30,-1,71,-3,106v13,26,42,-2,60,-21v-1,-28,-2,-60,-2,-85v0,-9,4,-13,16,-13v12,0,23,2,20,20v2,41,-4,90,3,125v0,8,-8,14,-23,14v-23,0,-14,-13,-13,-28v-15,17,-37,32,-62,32v-54,0,-23,-98,-34,-149v0,-20,37,-22,38,-1","w":170,"k":{"v":-3,"w":-3}},"v":{"d":"41,-17v-3,-26,-33,-102,-34,-124v0,-7,7,-16,21,-16v19,0,22,12,16,24v1,28,14,62,21,88v14,-38,36,-59,49,-97v7,-21,36,-26,38,-3v-6,27,-66,102,-72,134v-4,20,-36,21,-39,-6","w":151,"k":{"a":7,"c":9,"d":9,"e":9,"o":9,"q":9,"s":3,"v":-3,"w":-3,",":20,".":20,"y":-3}},"w":{"d":"220,-145v0,50,-37,89,-48,134v2,9,0,14,-15,14v-12,0,-18,-6,-18,-14r-25,-83r-36,78v-1,14,-8,19,-19,19v-12,0,-14,-6,-17,-20r-32,-126v-2,-24,34,-23,36,-6v0,5,-2,7,-3,10r21,88r36,-78v-8,-13,-4,-28,15,-27v10,0,17,6,17,27r25,76v6,-27,35,-58,26,-90v-1,-17,37,-21,37,-2","w":225,"k":{"a":7,"c":9,"d":9,"e":9,"o":9,"q":9,"s":3,"v":-3,"w":-3,",":20,".":20,"y":-3}},"x":{"d":"56,-77v-10,-10,-39,-37,-48,-62v0,-9,12,-18,22,-18v10,0,12,8,13,14v7,18,22,31,34,42v10,-14,23,-31,36,-46v0,-6,3,-12,13,-12v15,-1,29,23,12,30v-13,16,-27,33,-39,49v27,27,54,57,54,71v0,14,-23,20,-31,5v-9,-19,-27,-38,-43,-53r-40,50v0,5,-1,11,-14,11v-6,0,-18,-6,-18,-19v0,-8,5,-12,9,-12","w":157,"k":{"v":-3,"w":-3}},"y":{"d":"96,25v-23,72,-91,55,-105,5v0,-10,7,-17,17,-17v31,0,5,31,32,32v13,0,23,-14,39,-55r-67,-117v-16,-8,-4,-30,12,-30v14,0,19,9,18,19r52,92r37,-95v0,-8,5,-17,17,-17v20,-1,27,19,12,28","w":169,"k":{"a":7,"c":7,"d":7,"e":7,"o":7,"q":7,"s":3,"v":-5,"w":-5,",":14,".":14,"g":8}},"z":{"d":"14,-24r92,-102r-66,0v2,23,-27,27,-28,3v0,-22,6,-30,21,-30v36,-1,79,4,108,-5v18,0,19,20,7,29r-91,102r69,0v2,-9,6,-17,15,-17v8,0,15,4,15,21v0,24,-16,30,-30,23v-35,1,-76,-2,-106,3v-20,3,-20,-23,-6,-27","w":164,"k":{"y":-2}},"{":{"d":"130,66v1,11,-7,17,-39,17v-51,0,-42,-48,-42,-93v0,-48,-6,-59,-34,-59v-8,0,-11,-5,-11,-15v0,-10,4,-16,15,-16v30,0,35,-14,35,-77v0,-45,22,-69,58,-69v15,0,18,7,18,15v0,12,-6,15,-19,15v-49,0,-1,128,-55,132v32,0,25,79,22,117v-4,44,52,-7,52,33","w":131,"k":{"V":-1,"W":-1,"Y":-5,"j":-46}},"|":{"d":"30,74v6,-100,0,-211,2,-315v-8,-13,-5,-31,19,-29v18,-3,21,20,12,29r0,306v12,9,5,25,-13,25v-12,0,-20,-3,-20,-16","w":95},"}":{"d":"39,-246v51,0,42,48,42,93v0,48,6,59,34,59v8,0,11,5,11,15v0,10,-3,16,-14,16v-30,0,-36,14,-36,77v0,45,-22,69,-58,69v-15,0,-18,-7,-18,-15v0,-12,6,-15,19,-15v27,1,25,-40,24,-70v0,-30,9,-59,32,-63v-33,0,-27,-79,-23,-117v4,-44,-52,8,-52,-32v0,-11,6,-17,39,-17","w":131},"~":{"d":"128,-78v25,5,10,-42,31,-42v9,0,18,7,18,16v0,36,-25,58,-48,58v-24,6,-39,-34,-58,-38v-15,-3,-23,34,-35,37v-10,0,-22,-4,-22,-15v9,-28,37,-57,61,-54v22,-5,37,35,53,38","w":199},"'":{"d":"36,-242v33,8,-2,43,12,76v0,8,-5,16,-20,16v-17,3,-16,-19,-8,-26v6,-30,-21,-62,16,-66","w":64,"k":{"C":3,"G":3,"O":3,"Q":3,"T":-6,"V":-1,"W":-1,"Y":-4,"A":36,"Z":1,"J":49}},"`":{"d":"52,-229v9,14,24,22,32,38v1,17,-29,18,-27,2v-10,-14,-25,-22,-32,-39v0,-6,2,-14,15,-14v8,0,12,6,12,13","w":124}}});

/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (c) 1992-97 Hewlett-Packard. All rights reserved.
 */
Cufon.registerFont({"w":200,"face":{"font-family":"Helvetica","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"2 11 6 4 2 2 2 3 2 4","ascent":"288","descent":"-72","x-height":"5","bbox":"-6 -278 334 90","underline-thickness":"17.9297","underline-position":"-27.0703","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":100},"!":{"d":"41,-61r-8,-118r0,-80r35,0v2,71,-4,134,-9,198r-18,0xm32,-36r36,0r0,36r-36,0r0,-36","w":100},"\"":{"d":"25,-167r0,-91r26,0r0,91r-26,0xm76,-167r0,-91r27,0r0,91r-27,0","w":127},"#":{"d":"95,-248r-10,77r44,0r11,-77r23,0r-11,77r38,0r-3,22r-38,0r-7,51r38,0r-3,23r-38,0r-11,75r-23,0r11,-75r-45,0r-11,75r-23,0r11,-75r-38,0r3,-23r38,0r8,-51r-39,0r4,-22r38,0r11,-77r22,0xm81,-149r-7,51r45,0r7,-51r-45,0"},"$":{"d":"33,-142v-39,-43,-3,-120,58,-116r0,-20r17,0r0,21v43,3,72,27,74,69r-30,0v-2,-25,-19,-40,-44,-43r0,88v44,10,79,23,79,73v0,47,-33,75,-79,77r0,35r-17,0r0,-35v-51,-4,-80,-29,-79,-82r31,0v2,34,15,52,48,54r0,-94v-25,-6,-47,-15,-58,-27xm91,-231v-37,-2,-55,42,-32,68v7,7,18,11,32,15r0,-83xm108,-20v40,3,61,-44,37,-73v-8,-8,-22,-14,-37,-18r0,91"},"%":{"d":"75,-127v-33,0,-61,-29,-61,-62v0,-33,28,-61,61,-61v33,0,62,29,62,61v0,33,-29,62,-62,62xm75,-225v-19,0,-36,17,-36,36v0,19,16,36,36,36v20,0,36,-16,36,-36v0,-20,-17,-36,-36,-36xm77,6r147,-259r19,0r-146,259r-20,0xm245,1v-33,0,-61,-28,-61,-61v0,-33,28,-62,61,-62v33,0,61,29,61,62v0,33,-28,61,-61,61xm245,-97v-20,0,-36,17,-36,37v0,20,17,36,36,36v19,0,36,-17,36,-36v0,-19,-17,-37,-36,-37","w":320},"&":{"d":"74,-144v-13,-13,-27,-35,-28,-55v-1,-36,28,-59,63,-59v33,0,59,22,58,56v-1,27,-26,51,-48,64r48,59v6,-13,10,-29,11,-42r28,0v-2,22,-9,48,-19,66r45,55r-40,0r-23,-28v-36,50,-157,45,-153,-34v1,-44,25,-62,58,-82xm47,-66v-3,56,82,53,103,16r-59,-73v-22,12,-42,31,-44,57xm107,-231v-38,-2,-34,46,-11,63r7,9v30,-11,51,-69,4,-72","w":240},"'":{"d":"21,-167r0,-91r26,0r0,91r-26,0","w":68},"(":{"d":"86,74v-36,-50,-62,-96,-62,-169v0,-73,27,-119,62,-169r22,0v-64,91,-65,247,0,338r-22,0","w":119},")":{"d":"34,-264v35,50,61,95,61,169v0,74,-25,120,-61,169r-22,0v64,-91,64,-247,0,-338r22,0","w":119},"*":{"d":"81,-260r-2,42r39,-14r7,21r-40,11r26,32r-18,13r-24,-34r-23,34r-18,-13r26,-32r-40,-12r7,-20r39,14r-1,-42r22,0","w":140},"+":{"d":"92,-77r-78,0r0,-27r78,0r0,-78r26,0r0,78r78,0r0,27r-78,0r0,78r-26,0r0,-78","w":210},",":{"d":"31,0r0,-38r38,0v1,45,1,86,-38,91r0,-17v14,-2,22,-18,19,-36r-19,0","w":100},"-":{"d":"16,-116r88,0r0,33r-88,0r0,-33","w":119},".":{"d":"31,-38r38,0r0,38r-38,0r0,-38","w":100},"\/":{"d":"106,-265r-88,272r-24,0r88,-272r24,0","w":100},"0":{"d":"100,7v-64,0,-87,-57,-87,-130v0,-72,23,-130,87,-130v64,0,87,58,87,130v0,73,-23,130,-87,130xm100,-22v45,0,53,-46,53,-101v0,-56,-9,-102,-53,-102v-44,0,-53,47,-53,102v0,56,8,101,53,101"},"1":{"d":"36,-205v38,0,58,-17,67,-48r26,0r0,253r-33,0r0,-180r-60,0r0,-25"},"2":{"d":"103,-253v44,0,80,31,80,74v0,84,-119,86,-138,148r138,0r0,31r-174,0v-5,-88,86,-99,131,-148v27,-29,1,-80,-42,-77v-34,2,-50,25,-51,61r-31,0v-1,-56,33,-89,87,-89"},"3":{"d":"81,-145v34,5,65,-7,65,-39v0,-25,-21,-42,-48,-41v-33,1,-47,21,-48,55r-31,0v-1,-52,30,-79,80,-83v73,-6,110,85,49,119v72,29,36,147,-48,141v-57,-4,-85,-28,-88,-83r34,0v3,39,17,54,55,55v29,0,53,-20,53,-48v1,-38,-33,-54,-73,-48r0,-28"},"4":{"d":"9,-61r0,-29r117,-163r26,0r0,165r36,0r0,27r-36,0r0,61r-31,0r0,-61r-112,0xm121,-88r0,-115r-83,115r83,0"},"5":{"d":"53,-148v54,-38,132,-1,132,67v0,77,-93,113,-148,69v-15,-13,-23,-31,-25,-53r32,0v4,27,25,45,56,45v31,1,52,-26,52,-58v0,-58,-79,-74,-103,-33r-27,-2r18,-135r131,0r0,31r-107,0"},"6":{"d":"14,-117v0,-77,25,-135,93,-136v44,-1,73,26,74,68r-31,0v-1,-48,-70,-53,-88,-12v-8,17,-14,38,-15,66v43,-59,140,-24,140,54v0,50,-36,85,-87,84v-63,-1,-86,-54,-86,-124xm102,-133v-30,0,-51,24,-51,56v0,31,21,55,51,55v30,0,51,-24,51,-55v0,-32,-21,-56,-51,-56"},"7":{"d":"188,-220v-52,62,-87,128,-103,220r-35,0v17,-89,52,-158,104,-217r-141,0r0,-31r175,0r0,28"},"8":{"d":"100,-253v72,-9,105,92,44,119v23,10,42,34,42,62v0,49,-37,79,-86,79v-49,0,-86,-30,-86,-79v0,-29,18,-53,42,-62v-61,-27,-30,-128,44,-119xm56,-186v0,24,19,39,44,39v25,0,44,-16,44,-39v0,-23,-20,-39,-44,-39v-25,0,-44,15,-44,39xm153,-70v0,-29,-24,-50,-53,-50v-29,0,-53,21,-53,50v0,28,24,48,53,48v29,0,53,-20,53,-48"},"9":{"d":"185,-142v0,81,-23,147,-92,149v-44,2,-73,-26,-75,-68r31,0v0,50,72,54,88,9v6,-17,13,-36,15,-62v-44,58,-137,22,-137,-55v0,-50,35,-85,85,-84v59,1,85,46,85,111xm98,-114v31,1,50,-24,50,-55v0,-31,-19,-56,-50,-55v-30,0,-49,25,-49,55v0,30,19,55,49,55"},":":{"d":"31,-38r38,0r0,38r-38,0r0,-38xm31,-186r38,0r0,38r-38,0r0,-38","w":100},";":{"d":"31,0r0,-38r38,0v1,45,1,86,-38,91r0,-16v15,-3,20,-15,19,-37r-19,0xm31,-186r38,0r0,38r-38,0r0,-38","w":100},"<":{"d":"17,-77r0,-27r176,-74r0,28r-139,59r139,60r0,28","w":210},"=":{"d":"14,-68r182,0r0,27r-182,0r0,-27xm14,-140r182,0r0,26r-182,0r0,-26","w":210},">":{"d":"193,-77r-176,74r0,-28r139,-60r-139,-59r0,-28r176,74r0,27","w":210},"?":{"d":"144,-193v2,-24,-17,-43,-42,-42v-36,1,-47,20,-51,56r-31,0v2,-51,30,-84,82,-84v43,0,75,28,75,70v0,58,-66,63,-63,126r-31,0v-8,-67,56,-73,61,-126xm81,-37r35,0r0,37r-35,0r0,-37"},"@":{"d":"108,-110v-9,-65,90,-140,123,-66r8,-25r25,0v-10,41,-28,78,-33,123v1,4,3,6,6,6v28,1,53,-48,53,-79v0,-52,-49,-92,-101,-92v-61,0,-110,53,-110,114v0,62,50,114,111,114v37,0,74,-20,91,-42r24,0v-19,34,-63,64,-114,64v-75,0,-138,-61,-138,-136v0,-74,60,-136,135,-136v66,0,125,50,125,114v0,47,-42,102,-86,101v-12,0,-21,-8,-22,-21v-32,39,-103,20,-97,-39xm136,-108v0,35,39,41,59,19v22,-15,42,-89,-4,-91v-32,-1,-55,39,-55,72","w":365},"A":{"d":"103,-258r40,0r92,258r-37,0r-26,-75r-104,0r-27,75r-36,0xm121,-220r-42,114r82,0","w":240},"B":{"d":"178,-139v87,31,46,139,-46,139r-105,0r0,-258v79,2,186,-19,187,61v1,26,-15,49,-36,58xm179,-191v0,-51,-68,-35,-117,-38r0,81v52,-2,117,12,117,-43xm191,-78v0,-56,-75,-39,-129,-42r0,90v57,-2,129,14,129,-48","w":240},"C":{"d":"135,-24v45,0,69,-29,76,-71r34,0v-7,60,-47,102,-112,102v-75,0,-117,-58,-117,-136v0,-79,45,-136,121,-136v58,0,99,33,106,84r-34,0v-6,-34,-32,-54,-72,-53v-56,0,-86,46,-85,105v0,63,24,105,83,105","w":259},"D":{"d":"243,-129v0,74,-40,129,-110,129r-104,0r0,-258r106,0v70,0,108,56,108,129xm207,-129v0,-58,-23,-100,-76,-100r-67,0r0,199r64,0v53,-1,80,-41,79,-99","w":259},"E":{"d":"31,0r0,-258r189,0r0,31r-154,0r0,78r141,0r0,31r-141,0r0,87r156,0r0,31r-191,0","w":240},"F":{"d":"31,0r0,-258r179,0r0,31r-144,0r0,78r126,0r0,31r-126,0r0,118r-35,0","w":219},"G":{"d":"140,-23v47,0,82,-32,81,-84r-81,0r0,-30r113,0r0,137r-21,0r-9,-33v-20,27,-50,40,-86,40v-74,1,-120,-59,-120,-136v0,-108,111,-175,196,-113v21,15,32,36,36,61r-34,0v-6,-35,-35,-53,-77,-53v-53,0,-85,49,-85,106v0,63,28,104,87,105","w":280},"H":{"d":"28,0r0,-258r35,0r0,106r135,0r0,-106r35,0r0,258r-35,0r0,-121r-135,0r0,121r-35,0","w":259},"I":{"d":"33,0r0,-258r35,0r0,258r-35,0","w":100},"J":{"d":"78,-23v28,1,41,-22,41,-50r0,-185r35,0r0,185v1,49,-26,80,-74,80v-54,0,-80,-32,-74,-90r33,0v-3,35,6,60,39,60","w":180},"K":{"d":"27,0r0,-258r35,0r0,125r126,-125r49,0r-110,105r112,153r-46,0r-92,-128r-39,38r0,90r-35,0","w":240},"L":{"d":"27,0r0,-258r35,0r0,227r131,0r0,31r-166,0"},"M":{"d":"77,-258r73,220r74,-220r50,0r0,258r-34,0r0,-219r-73,219r-34,0r-73,-218r0,218r-34,0r0,-258r51,0","w":299},"N":{"d":"61,0r-34,0r0,-258r42,0r130,210r0,-210r34,0r0,258r-39,0r-133,-211r0,211","w":259},"O":{"d":"140,7v-77,0,-126,-58,-126,-136v0,-78,49,-136,126,-136v77,0,126,58,126,136v0,78,-49,136,-126,136xm140,-24v55,0,90,-47,90,-105v0,-60,-35,-105,-90,-105v-55,0,-90,46,-90,105v0,59,35,105,90,105","w":280},"P":{"d":"224,-187v0,48,-31,79,-80,78r-78,0r0,109r-35,0r0,-258r113,0v49,-2,80,25,80,71xm188,-187v0,-55,-69,-40,-122,-42r0,90v56,-1,122,13,122,-48","w":240},"Q":{"d":"140,-265v121,0,163,162,89,237r34,28r-17,20r-38,-31v-89,52,-194,-12,-194,-118v0,-78,49,-136,126,-136xm50,-129v0,73,61,127,130,96r-27,-21r16,-21r33,26v54,-55,28,-189,-62,-185v-55,3,-90,46,-90,105","w":280},"R":{"d":"203,0v-11,-44,11,-111,-53,-111r-83,0r0,111r-35,0r0,-258v88,3,204,-22,204,70v0,29,-13,51,-35,61v33,11,34,53,32,96v-1,20,11,16,13,31r-43,0xm200,-186v0,-62,-78,-39,-133,-43r0,87v55,-4,133,20,133,-44","w":259},"S":{"d":"120,-265v56,0,95,29,97,81r-32,0v-4,-33,-28,-50,-65,-50v-46,0,-77,36,-50,67v48,28,153,14,153,98v0,50,-45,76,-99,76v-62,0,-107,-30,-106,-90r32,0v1,40,30,59,74,59v50,0,84,-37,55,-71v-40,-31,-152,-13,-152,-90v0,-52,39,-80,93,-80","w":240},"T":{"d":"92,0r0,-227r-87,0r0,-31r210,0r0,31r-88,0r0,227r-35,0","w":219},"U":{"d":"130,-24v101,0,58,-143,67,-234r35,0r0,163v1,63,-39,103,-102,102v-67,0,-102,-35,-102,-102r0,-163r35,0v8,92,-33,234,67,234","w":259},"V":{"d":"46,-258r74,220r74,-220r39,0r-94,258r-38,0r-94,-258r39,0","w":240},"W":{"d":"73,0r-67,-258r38,0r48,220r58,-220r39,0r58,220r49,-220r38,0r-68,258r-37,0r-60,-217r-58,217r-38,0","w":339},"X":{"d":"190,0r-70,-104r-71,104r-42,0r92,-129r-86,-129r43,0r63,100r69,-100r42,0r-91,127r94,131r-43,0","w":240},"Y":{"d":"103,-103r-98,-155r41,0r74,125r75,-125r40,0r-97,155r0,103r-35,0r0,-103","w":240},"Z":{"d":"8,-30r160,-197r-147,0r0,-31r190,0r0,30r-159,197r159,0r0,31r-203,0r0,-30","w":219},"[":{"d":"23,71r0,-331r67,0r0,25r-39,0r0,280r39,0r0,26r-67,0","w":100},"\\":{"d":"82,7r-88,-272r24,0r88,272r-24,0","w":100},"]":{"d":"77,71r-67,0r0,-26r39,0r0,-280r-39,0r0,-25r67,0r0,331","w":100},"^":{"d":"97,-248r77,154r-28,0r-62,-124r-61,124r-28,0r77,-154r25,0","w":168},"_":{"d":"0,45r0,-19r200,0r0,19r-200,0"},"`":{"d":"52,-213r-47,-51r39,0r32,51r-24,0","w":119},"a":{"d":"139,-25v-27,43,-126,42,-126,-25v0,-55,54,-58,103,-64v14,-1,23,-7,23,-22v-1,-21,-20,-32,-44,-32v-27,0,-39,12,-43,36r-30,0v4,-43,31,-61,78,-62v43,0,70,18,70,58r0,104v0,10,12,12,21,9r0,23v-23,10,-51,1,-52,-25xm46,-54v0,54,84,32,91,-2v3,-12,2,-25,2,-39v-29,15,-93,1,-93,41"},"b":{"d":"186,-100v-4,59,-26,105,-82,105v-23,0,-41,-11,-53,-28r0,23r-30,0r0,-258r32,0r0,94v43,-64,139,-17,133,64xm53,-85v-1,37,16,63,50,63v37,0,50,-31,50,-74v0,-43,-12,-69,-50,-69v-41,0,-50,32,-50,80"},"c":{"d":"94,-22v28,0,42,-19,47,-46r31,0v-6,45,-32,72,-79,73v-52,1,-82,-43,-82,-99v0,-57,30,-100,85,-100v46,0,73,27,76,70r-31,0v-2,-26,-19,-42,-46,-42v-36,0,-52,33,-51,72v0,43,11,72,50,72","w":180},"d":{"d":"13,-99v0,-83,94,-130,135,-62r0,-97r32,0r0,258r-30,0r0,-26v-11,19,-32,32,-55,31v-54,0,-82,-46,-82,-104xm148,-85v0,-45,-13,-80,-51,-80v-40,0,-51,26,-51,71v-1,41,15,71,51,72v33,1,51,-29,51,-63"},"e":{"d":"182,-58v-9,39,-36,63,-82,63v-56,0,-86,-38,-86,-95v0,-59,33,-104,90,-104v55,1,87,51,81,111r-137,0v2,38,17,60,55,61v24,1,45,-15,48,-36r31,0xm102,-165v-33,0,-51,25,-54,57r105,0v-1,-33,-17,-58,-51,-57"},"f":{"d":"94,-233v-29,-7,-34,16,-31,45r31,0r0,26r-31,0r0,162r-32,0r0,-162r-26,0r0,-26r26,0v-5,-51,8,-81,63,-74r0,29","w":100},"g":{"d":"52,22v3,20,18,31,40,31v41,0,57,-28,56,-73v-51,60,-145,2,-134,-79v-10,-81,95,-131,136,-62r0,-27r30,0v-8,110,38,267,-87,267v-42,0,-69,-20,-74,-57r33,0xm150,-85v-1,-47,-11,-80,-52,-80v-40,0,-51,28,-51,71v0,41,15,72,51,72v32,0,53,-27,52,-63"},"h":{"d":"107,-165v-70,0,-49,97,-52,165r-32,0r0,-258r32,0r0,95v28,-50,122,-38,122,34r0,129r-32,0r0,-121v0,-30,-10,-44,-38,-44"},"i":{"d":"24,0r0,-188r32,0r0,188r-32,0xm24,-258r32,0r0,35r-32,0r0,-35","w":79},"j":{"d":"-6,47v20,0,30,-2,30,-21r0,-214r32,0r0,214v1,38,-23,53,-62,48r0,-27xm24,-258r32,0r0,35r-32,0r0,-35","w":79},"k":{"d":"24,0r0,-258r32,0r0,148r79,-78r40,0r-71,70r76,118r-41,0r-58,-96r-25,25r0,71r-32,0","w":180},"l":{"d":"24,0r0,-258r32,0r0,258r-32,0","w":79},"m":{"d":"103,-165v-64,0,-46,98,-48,165r-32,0r0,-188r30,0r0,28v19,-39,91,-49,108,-3v27,-50,116,-38,116,31r0,132r-32,0r0,-121v0,-26,-10,-44,-34,-44v-65,0,-41,101,-45,165r-32,0r0,-129v0,-23,-9,-36,-31,-36","w":299},"n":{"d":"105,-165v-68,0,-47,97,-50,165r-32,0r0,-188r30,0r0,28v25,-53,124,-43,124,31r0,129r-32,0r0,-118v0,-33,-10,-46,-40,-47"},"o":{"d":"100,5v-54,0,-87,-43,-87,-99v0,-57,34,-100,87,-100v54,0,88,44,88,100v0,56,-34,99,-88,99xm100,-22v36,0,55,-32,55,-72v0,-40,-18,-72,-55,-72v-37,0,-54,32,-54,72v0,40,18,72,54,72"},"p":{"d":"104,5v-21,0,-39,-9,-51,-26r0,95r-32,0r0,-262r30,0r0,27v40,-67,142,-23,135,61v-5,59,-26,105,-82,105xm53,-85v-1,37,16,63,50,63v37,0,50,-31,50,-74v0,-43,-12,-69,-50,-69v-41,0,-50,32,-50,80"},"q":{"d":"146,-22v-48,63,-133,6,-133,-77v0,-52,28,-95,77,-95v25,-1,46,15,58,36r0,-30r30,0r0,262r-32,0r0,-96xm146,-85v1,-44,-13,-80,-50,-80v-39,0,-50,26,-50,71v-1,40,14,71,50,72v32,1,50,-29,50,-63"},"r":{"d":"120,-160v-80,-8,-58,88,-61,160r-31,0r0,-188r30,0r0,32v10,-23,35,-44,62,-36r0,32","w":119},"s":{"d":"88,-194v42,-1,71,22,73,60r-30,0v-2,-20,-19,-33,-43,-32v-30,-5,-52,22,-33,42v35,20,114,11,112,68v-1,40,-32,62,-75,61v-50,-1,-78,-18,-80,-65r30,0v4,27,18,38,50,38v33,0,57,-26,36,-47v-33,-20,-110,-10,-110,-67v0,-38,31,-58,70,-58","w":180},"t":{"d":"63,-38v0,13,14,14,29,13r0,25v-38,6,-61,0,-61,-38r0,-124r-26,0r0,-26r26,0r0,-53r32,0r0,53r29,0r0,26r-29,0r0,124","w":100},"u":{"d":"146,-29v-24,52,-122,45,-122,-30r0,-129r32,0r0,121v0,31,10,45,39,45v66,0,46,-99,49,-166r32,0r0,188r-30,0r0,-29"},"v":{"d":"40,-188r50,154r52,-154r35,0r-70,188r-34,0r-70,-188r37,0","w":180},"w":{"d":"59,0r-54,-188r35,0r36,150r37,-150r35,0r38,151r38,-151r31,0r-53,188r-34,0r-39,-147r-37,147r-33,0","w":259},"x":{"d":"137,0r-47,-72r-46,72r-40,0r67,-97r-63,-91r40,0r44,67r43,-67r39,0r-63,91r65,97r-39,0","w":180},"y":{"d":"40,-188r50,155r51,-155r35,0v-33,79,-58,187,-101,251v-9,13,-34,16,-54,11r0,-29v33,11,44,-13,53,-42r-70,-191r36,0","w":180},"z":{"d":"11,-25r113,-137r-104,0r0,-26r146,0r0,25r-113,137r116,0r0,26r-158,0r0,-25","w":180},"{":{"d":"74,-11v1,30,-9,67,31,58r0,24v-54,8,-59,-31,-59,-85v0,-36,-4,-66,-31,-70r0,-21v67,-8,-18,-170,90,-155r0,24v-40,-9,-30,28,-31,59v-2,49,-2,71,-32,82v29,13,30,34,32,84","w":120},"|":{"d":"34,90r0,-360r26,0r0,360r-26,0","w":93},"}":{"d":"105,-84v-67,8,18,170,-90,155r0,-24v40,9,30,-27,31,-58v2,-49,4,-70,32,-84v-37,-10,-31,-66,-32,-119v0,-22,-8,-23,-31,-22r0,-24v54,-8,59,31,59,85v0,36,4,66,31,70r0,21","w":120},"~":{"d":"65,-91v-15,0,-24,13,-31,26r-12,-20v11,-18,20,-30,45,-31v28,0,51,22,77,25v14,-2,25,-13,32,-26r12,20v-13,17,-20,30,-44,31v-30,1,-47,-25,-79,-25","w":210},"\u00a0":{"w":100}}});
/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Copyright:
 * Copyright (c) 1992-97 Hewlett-Packard. All rights reserved.
 */
Cufon.registerFont({"w":200,"face":{"font-family":"Helvetica","font-weight":700,"font-stretch":"normal","units-per-em":"360","panose-1":"2 11 8 6 3 7 2 4 2 4","ascent":"288","descent":"-72","x-height":"5","bbox":"-12 -280 334 90","underline-thickness":"17.9297","underline-position":"-27.0703","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":100},"!":{"d":"47,-71v-7,-61,-18,-117,-15,-187r56,0v3,70,-8,126,-15,187r-26,0xm33,-51r54,0r0,51r-54,0r0,-51","w":119},"\"":{"d":"35,-161r0,-97r36,0r0,97r-36,0xm100,-161r0,-97r35,0r0,97r-35,0","w":170},"#":{"d":"100,-251r-10,70r35,0r10,-70r35,0r-10,70r34,0r-5,33r-34,0r-6,44r34,0r-5,33r-34,0r-10,71r-35,0r11,-71r-35,0r-10,71r-35,0r10,-71r-33,0r4,-33r34,0r6,-44r-34,0r5,-33r34,0r10,-70r34,0xm86,-148r-7,44r35,0r7,-44r-35,0"},"$":{"d":"16,-180v-2,-44,31,-73,74,-75r0,-25r17,0r0,25v46,1,76,28,76,74r-46,0v0,-23,-8,-36,-30,-37r0,68v46,16,81,27,81,80v0,47,-35,75,-81,77r0,35r-17,0r0,-35v-50,-4,-82,-29,-79,-84r49,0v-2,26,9,42,30,45r0,-75v-44,-15,-72,-26,-74,-73xm90,-217v-26,1,-39,36,-17,52v4,3,10,7,17,10r0,-62xm107,-32v29,0,44,-39,23,-58v-5,-5,-12,-8,-23,-12r0,70"},"%":{"d":"75,-125v-35,0,-65,-28,-65,-64v0,-36,30,-67,65,-67v35,0,66,30,66,67v0,36,-31,64,-66,64xm75,-219v-16,0,-28,14,-28,29v0,16,12,28,28,28v16,0,29,-12,29,-28v0,-16,-13,-29,-29,-29xm75,7r143,-263r27,0r-143,263r-27,0xm245,2v-35,0,-66,-29,-66,-65v0,-36,31,-66,66,-66v35,0,65,30,65,66v0,36,-30,65,-65,65xm245,-92v-16,0,-28,14,-28,29v0,16,12,28,28,28v16,0,28,-12,28,-28v0,-15,-12,-29,-28,-29","w":320},"&":{"d":"74,-145v-39,-37,-22,-113,46,-113v38,0,64,23,63,61v-1,29,-20,46,-43,60r38,47v6,-13,13,-30,14,-44r44,0v-2,27,-15,59,-30,78r46,56r-59,0r-18,-21v-41,48,-161,32,-155,-46v3,-41,23,-58,54,-78xm70,-70v0,42,59,41,78,16r-48,-59v-13,11,-30,24,-30,43xm119,-220v-34,0,-18,45,-2,55v21,-9,37,-54,2,-55","w":259},"'":{"d":"25,-161r0,-97r35,0r0,97r-35,0","w":85},"(":{"d":"78,75v-38,-54,-65,-95,-65,-170v0,-75,27,-117,65,-170r35,0v-63,86,-63,254,0,340r-35,0","w":119},")":{"d":"7,75v63,-86,64,-255,0,-340r34,0v38,54,66,94,66,170v0,75,-28,117,-66,170r-34,0","w":119},"*":{"d":"86,-258r-1,42r38,-14r9,29r-39,12r25,33r-24,18r-23,-34r-23,34r-24,-18r25,-33r-39,-12r9,-29r38,14r-1,-42r30,0","w":140},"+":{"d":"84,-70r-70,0r0,-42r70,0r0,-70r42,0r0,70r70,0r0,42r-70,0r0,69r-42,0r0,-69","w":210},",":{"d":"23,0r0,-52r54,0v4,59,-3,104,-54,113r0,-20v21,-8,27,-16,30,-41r-30,0","w":100},"-":{"d":"10,-125r100,0r0,48r-100,0r0,-48","w":119},".":{"d":"23,-52r54,0r0,52r-54,0r0,-52","w":100},"\/":{"d":"112,-265r-82,272r-42,0r82,-272r42,0","w":100},"0":{"d":"100,7v-69,0,-88,-52,-88,-130v0,-79,17,-133,88,-133v70,0,89,55,89,133v0,78,-19,130,-89,130xm100,-34v36,-5,37,-39,37,-90v0,-53,0,-86,-37,-92v-37,6,-37,41,-37,92v0,51,1,84,37,90"},"1":{"d":"25,-213v35,2,60,-18,70,-43r42,0r0,256r-51,0r0,-177r-61,0r0,-36"},"2":{"d":"98,-256v49,0,86,32,86,80v0,74,-85,89,-112,132r112,0r0,44r-175,0v-2,-80,74,-98,116,-148v20,-24,7,-66,-27,-66v-25,0,-37,21,-36,48r-49,0v-2,-55,31,-90,85,-90"},"3":{"d":"76,-148v30,2,52,-7,52,-34v1,-19,-14,-33,-32,-33v-23,0,-34,16,-35,40r-46,0v0,-52,32,-81,85,-81v68,0,109,87,48,120v24,8,38,30,38,61v0,78,-104,106,-153,60v-15,-15,-23,-36,-23,-63r49,0v0,27,11,45,37,45v50,0,49,-77,4,-78r-24,0r0,-37"},"4":{"d":"10,-56r0,-44r94,-156r57,0r0,159r28,0r0,41r-28,0r0,56r-50,0r0,-56r-101,0xm111,-97r0,-106r-64,106r64,0"},"5":{"d":"63,-154v54,-35,123,4,123,69v0,80,-94,118,-150,72v-15,-13,-24,-32,-26,-55r50,0v3,21,14,35,37,35v23,0,37,-22,37,-47v0,-44,-52,-63,-71,-30r-45,-2r17,-139r140,0r0,43r-104,0"},"6":{"d":"11,-121v0,-80,23,-136,97,-135v41,-1,73,27,74,67r-50,0v1,-35,-52,-35,-61,-5v-6,11,-10,28,-11,50v47,-50,127,-7,127,62v0,51,-36,90,-88,89v-65,-2,-89,-54,-88,-128xm99,-125v-23,0,-38,20,-38,44v0,24,14,48,38,47v27,0,38,-19,38,-47v1,-25,-15,-44,-38,-44"},"7":{"d":"190,-213v-47,50,-85,130,-93,213r-52,0v8,-80,46,-158,91,-207r-127,0r0,-44r181,0r0,38"},"8":{"d":"100,-256v72,-9,112,87,49,120v70,31,39,143,-49,143v-50,0,-88,-31,-88,-80v0,-29,17,-53,40,-63v-62,-29,-25,-131,48,-120xm68,-183v0,19,13,32,32,32v19,0,32,-13,32,-32v0,-19,-13,-33,-32,-33v-19,0,-32,14,-32,33xm137,-73v0,-24,-14,-41,-37,-41v-23,0,-37,17,-37,41v0,23,15,39,37,39v22,0,37,-16,37,-39"},"9":{"d":"188,-129v0,80,-23,136,-97,136v-41,0,-74,-27,-75,-67r50,0v-1,34,53,34,62,4v6,-11,10,-28,11,-50v-47,50,-128,7,-128,-62v0,-50,37,-89,88,-88v66,2,89,54,89,127xm99,-124v23,0,39,-20,39,-45v0,-24,-16,-47,-39,-47v-27,0,-38,19,-38,47v0,24,15,45,38,45"},":":{"d":"33,-52r54,0r0,52r-54,0r0,-52xm33,-185r54,0r0,53r-54,0r0,-53","w":119},";":{"d":"33,0r0,-53r54,0v3,58,-3,105,-53,113r0,-20v19,-7,27,-15,28,-40r-29,0xm33,-185r54,0r0,53r-54,0r0,-53","w":119},"<":{"d":"14,-74r0,-34r183,-78r0,40r-130,55r130,55r0,40","w":210},"=":{"d":"14,-72r182,0r0,41r-182,0r0,-41xm14,-151r182,0r0,40r-182,0r0,-40","w":210},">":{"d":"197,-74r-183,78r0,-40r130,-55r-130,-55r0,-40r183,78r0,34","w":210},"?":{"d":"127,-150v29,-17,24,-70,-16,-70v-29,0,-38,15,-39,44r-50,0v0,-54,35,-87,89,-87v64,0,109,54,78,111v-12,22,-58,34,-55,76r-47,0v1,-40,12,-57,40,-74xm84,-50r53,0r0,50r-53,0r0,-50","w":219},"@":{"d":"100,-116v0,-60,77,-119,118,-64r4,-17r35,0v-7,38,-20,74,-24,113v26,12,46,-35,46,-67v0,-49,-47,-86,-97,-86v-57,0,-104,50,-104,108v0,58,45,108,102,108v34,0,68,-13,83,-31r32,0v-18,33,-65,60,-114,60v-75,1,-138,-62,-138,-137v0,-75,63,-136,138,-136v67,0,127,49,127,114v0,52,-43,103,-92,102v-10,1,-18,-9,-20,-19v-36,43,-96,6,-96,-48xm181,-166v-39,-3,-63,81,-13,81v29,0,55,-42,37,-70v-5,-8,-13,-11,-24,-11","w":351},"A":{"d":"99,-258r62,0r92,258r-58,0r-17,-53r-98,0r-17,53r-56,0xm129,-201r-34,104r69,0","w":259},"B":{"d":"153,-258v77,-12,106,89,47,119v24,8,42,29,41,58v-1,55,-37,82,-96,81r-118,0r0,-258r126,0xm181,-188v-1,-38,-64,-23,-102,-26r0,57v41,-2,103,12,102,-31xm187,-82v-1,-45,-65,-29,-108,-32r0,69v46,-2,109,13,108,-37","w":259},"C":{"d":"135,-40v34,1,54,-20,57,-51r54,0v-5,58,-49,98,-112,98v-75,0,-118,-57,-118,-135v0,-79,43,-137,118,-137v63,0,106,37,112,92r-54,0v-4,-28,-26,-46,-57,-46v-45,1,-64,41,-64,91v0,49,19,88,64,88","w":259},"D":{"d":"247,-136v0,83,-34,135,-113,136r-107,0r0,-258r111,0v75,0,108,46,109,122xm193,-133v-2,-49,-16,-81,-62,-81r-50,0r0,170v74,7,114,-16,112,-89","w":259},"E":{"d":"27,0r0,-258r191,0r0,45r-137,0r0,55r127,0r0,45r-127,0r0,67r143,0r0,46r-197,0","w":240},"F":{"d":"27,0r0,-258r184,0r0,45r-130,0r0,59r114,0r0,45r-114,0r0,109r-54,0","w":219},"G":{"d":"71,-129v0,97,121,124,138,34r-61,0r0,-45r109,0r0,140r-36,0r-6,-34v-16,26,-44,41,-77,41v-77,0,-122,-56,-122,-135v0,-114,118,-175,205,-114v21,15,33,37,36,64r-55,0v-1,-23,-30,-44,-56,-43v-49,1,-75,38,-75,92","w":280},"H":{"d":"25,0r0,-258r54,0r0,96r102,0r0,-96r53,0r0,258r-53,0r0,-117r-102,0r0,117r-54,0","w":259},"I":{"d":"23,0r0,-258r54,0r0,258r-54,0","w":100},"J":{"d":"91,-37v22,-1,29,-13,29,-36r0,-185r54,0r0,185v0,53,-29,80,-83,80v-65,1,-88,-37,-83,-106r51,0v-1,34,1,62,32,62"},"K":{"d":"31,0r0,-258r54,0r0,107r99,-107r69,0r-103,105r110,153r-71,0r-78,-114r-26,27r0,87r-54,0","w":259},"L":{"d":"27,0r0,-258r54,0r0,212r129,0r0,46r-183,0","w":219},"M":{"d":"104,-258r47,204r46,-204r78,0r0,258r-50,0r0,-217r-48,217r-53,0r-49,-222r0,222r-50,0r0,-258r79,0","w":299},"N":{"d":"75,0r-50,0r0,-258r56,0r104,181r0,-181r51,0r0,258r-54,0r-107,-186r0,186","w":259},"O":{"d":"140,7v-78,0,-124,-55,-124,-135v0,-80,46,-137,124,-137v78,0,124,57,124,137v0,80,-46,135,-124,135xm140,-39v48,1,70,-38,70,-89v0,-53,-22,-92,-70,-92v-48,0,-70,39,-70,92v0,51,22,89,70,89","w":280},"P":{"d":"226,-178v2,79,-63,92,-145,86r0,92r-54,0r0,-258r109,0v57,-1,89,26,90,80xm172,-177v0,-43,-48,-37,-91,-37r0,77v44,1,91,5,91,-40","w":240},"Q":{"d":"140,-265v115,0,157,146,97,228r28,27r-27,29r-31,-29v-89,48,-191,-11,-191,-118v0,-80,46,-137,124,-137xm70,-128v0,63,41,105,99,83r-27,-24r28,-29r28,26v27,-54,10,-152,-58,-148v-48,3,-70,39,-70,92","w":280},"R":{"d":"184,0v-12,-40,11,-112,-49,-102r-54,0r0,102r-54,0r0,-258r131,0v47,-1,82,26,82,71v0,32,-15,54,-40,63v32,10,32,49,32,91v0,15,3,22,12,26r0,7r-60,0xm186,-180v0,-46,-61,-32,-105,-34r0,68v44,-2,105,12,105,-34","w":259},"S":{"d":"119,-265v57,0,98,32,101,84r-52,0v1,-46,-98,-58,-99,-6v7,27,26,23,63,33v62,18,94,19,94,82v0,54,-47,80,-106,79v-63,-1,-102,-30,-106,-87r52,0v-4,53,103,58,109,11v-3,-29,-21,-27,-54,-36v-65,-18,-103,-18,-103,-79v0,-52,44,-81,101,-81","w":240},"T":{"d":"83,0r0,-213r-78,0r0,-45r210,0r0,45r-78,0r0,213r-54,0","w":219},"U":{"d":"130,-40v38,0,51,-16,51,-56r0,-162r53,0r0,161v-1,75,-29,104,-104,104v-70,0,-103,-33,-104,-104r0,-161r54,0r0,162v0,37,15,56,50,56","w":259},"V":{"d":"64,-258r57,197r57,-197r55,0r-87,258r-52,0r-87,-258r57,0","w":240},"W":{"d":"78,0r-72,-258r56,0r43,189r37,-189r58,0r37,187r43,-187r54,0r-72,258r-51,0r-41,-203r-41,203r-51,0","w":339},"X":{"d":"171,0r-51,-89r-51,89r-64,0r84,-131r-78,-127r64,0r45,83r47,-83r62,0r-78,123r84,135r-64,0","w":240},"Y":{"d":"96,-97r-91,-161r65,0r53,112r51,-112r61,0r-85,160r0,98r-54,0r0,-97","w":240},"Z":{"d":"9,-45r134,-168r-130,0r0,-45r198,0r0,42r-136,170r136,0r0,46r-202,0r0,-45","w":219},"[":{"d":"23,71r0,-331r88,0r0,34r-43,0r0,263r43,0r0,34r-88,0","w":119},"\\":{"d":"70,7r-82,-272r42,0r82,272r-42,0","w":100},"]":{"d":"97,71r-88,0r0,-34r43,0r0,-263r-43,0r0,-34r88,0r0,331","w":119},"^":{"d":"123,-251r65,134r-40,0r-43,-94r-43,94r-40,0r65,-134r36,0","w":210},"_":{"d":"0,45r0,-18r200,0r0,18r-200,0"},"`":{"d":"45,-218r-53,-52r55,0r34,52r-36,0","w":119},"a":{"d":"179,-33v0,17,1,21,11,26r0,7r-55,0v-2,-8,-3,-16,-4,-23v-31,44,-121,36,-121,-27v0,-62,64,-60,112,-73v18,-15,0,-33,-25,-33v-20,0,-31,9,-32,27r-48,0v3,-47,33,-67,85,-67v42,0,77,17,77,56r0,107xm85,-31v32,0,50,-23,45,-62v-19,13,-68,5,-69,37v0,16,9,24,24,25"},"b":{"d":"208,-99v11,84,-88,141,-137,74r0,25r-49,0r0,-258r50,0r0,92v44,-66,147,-14,136,67xm70,-92v0,31,14,56,43,55v30,0,43,-24,43,-57v0,-33,-14,-59,-43,-59v-30,0,-43,27,-43,61","w":219},"c":{"d":"103,-36v19,0,32,-16,34,-35r52,0v-5,46,-36,76,-86,76v-59,0,-92,-38,-91,-100v0,-59,33,-101,91,-101v48,0,84,31,86,74r-52,0v0,-18,-15,-33,-34,-32v-29,1,-39,26,-39,59v0,33,10,59,39,59"},"d":{"d":"12,-99v-9,-80,91,-133,136,-67r0,-92r50,0r0,258r-49,0r0,-23v-50,65,-147,6,-137,-76xm150,-97v0,-32,-15,-56,-43,-56v-28,0,-43,27,-43,59v0,33,14,57,43,57v30,0,43,-27,43,-60","w":219},"e":{"d":"188,-57v-8,38,-43,62,-89,62v-60,0,-91,-41,-91,-104v0,-60,34,-97,91,-97v64,-1,97,45,90,113r-130,0v-7,50,62,63,78,26r51,0xm98,-155v-23,0,-34,18,-38,40r78,0v-3,-24,-14,-40,-40,-40"},"f":{"d":"114,-220v-24,-2,-36,1,-32,29r32,0r0,35r-32,0r0,156r-51,0r0,-156r-27,0r0,-35r27,0v-6,-56,27,-77,83,-70r0,41","w":119},"g":{"d":"75,21v1,16,16,18,35,19v38,1,42,-29,40,-68v-10,18,-28,29,-52,29v-53,1,-84,-43,-84,-98v0,-55,30,-99,81,-99v26,-1,46,13,57,33r0,-28r47,0r0,181v0,62,-29,88,-92,88v-47,0,-83,-17,-87,-57r55,0xm150,-97v0,-32,-13,-56,-42,-56v-29,0,-42,25,-42,57v0,31,13,56,42,56v29,0,42,-25,42,-57","w":219},"h":{"d":"115,-154v-64,-1,-35,96,-41,154r-51,0r0,-258r51,0r0,91v28,-51,123,-32,123,38r0,129r-51,0r0,-120v-1,-22,-8,-34,-31,-34","w":219},"i":{"d":"25,0r0,-191r51,0r0,191r-51,0xm25,-260r51,0r0,46r-51,0r0,-46","w":100},"j":{"d":"1,37v15,0,23,0,23,-16r0,-212r51,0r0,212v1,48,-24,58,-74,56r0,-40xm24,-260r51,0r0,46r-51,0r0,-46","w":100},"k":{"d":"25,0r0,-258r50,0r0,139r63,-72r62,0r-69,72r71,119r-60,0r-46,-82r-21,22r0,60r-50,0"},"l":{"d":"25,0r0,-258r50,0r0,258r-50,0","w":100},"m":{"d":"105,-154v-22,0,-31,16,-32,37r0,117r-50,0r0,-191r48,0r0,31v12,-45,92,-48,108,-5v24,-53,118,-35,118,38r0,127r-50,0r0,-112v0,-25,-6,-42,-29,-42v-22,-1,-33,15,-32,37r0,117r-51,0r0,-121v0,-21,-9,-33,-30,-33","w":320},"n":{"d":"115,-154v-64,-1,-35,96,-41,154r-51,0r0,-191r48,0r0,28v12,-20,32,-33,61,-33v88,0,61,114,65,196r-51,0r0,-120v-1,-22,-8,-34,-31,-34","w":219},"o":{"d":"110,5v-59,0,-98,-41,-98,-100v0,-60,38,-101,98,-101v60,0,98,40,98,101v0,60,-39,100,-98,100xm110,-37v32,0,46,-23,46,-58v0,-35,-14,-59,-46,-59v-32,0,-46,24,-46,59v0,35,14,58,46,58","w":219},"p":{"d":"208,-99v10,83,-85,140,-135,76r0,98r-51,0r0,-266r48,0r0,28v41,-68,149,-20,138,64xm70,-92v0,30,14,55,43,55v29,0,43,-24,43,-57v0,-33,-14,-59,-43,-59v-29,0,-43,28,-43,61","w":219},"q":{"d":"97,-196v24,-1,45,15,55,36r0,-31r47,0r0,266r-51,0r0,-97v-48,62,-136,9,-136,-71v0,-57,31,-103,85,-103xm151,-97v0,-31,-15,-56,-44,-56v-29,0,-43,27,-43,59v-1,32,14,56,43,57v30,0,44,-27,44,-60","w":219},"r":{"d":"134,-145v-39,-3,-62,10,-61,46r0,99r-50,0r0,-191r48,0r0,34v12,-24,30,-43,63,-39r0,51","w":140},"s":{"d":"95,-196v46,0,86,20,87,62r-50,0v0,-17,-16,-24,-34,-24v-24,0,-44,20,-21,30v42,19,113,13,110,71v-2,41,-38,62,-83,62v-53,0,-91,-18,-93,-66r51,0v-2,31,71,41,74,8v-10,-27,-92,-25,-102,-43v-41,-39,1,-100,61,-100"},"t":{"d":"81,-47v-2,15,15,10,30,11r0,37v-39,3,-81,4,-81,-40r0,-117r-26,0r0,-35r26,0r0,-52r51,0r0,52r30,0r0,35r-30,0r0,109","w":119},"u":{"d":"88,5v-88,0,-60,-114,-64,-196r50,0r0,119v0,22,10,35,31,35v63,-1,35,-96,41,-154r50,0r0,191r-48,0r0,-29v-10,22,-31,34,-60,34","w":219},"v":{"d":"60,-191r41,142r41,-142r53,0r-69,191r-52,0r-69,-191r55,0"},"w":{"d":"59,0r-55,-191r53,0r31,140r28,-140r51,0r28,141r31,-141r51,0r-56,191r-51,0r-29,-142r-30,142r-52,0","w":280},"x":{"d":"133,0r-34,-58r-33,58r-61,0r65,-98r-62,-93r61,0r32,56r32,-56r59,0r-62,94r65,97r-62,0"},"y":{"d":"59,-191r42,142r40,-142r53,0v-31,79,-56,191,-97,256v-8,14,-41,13,-66,11r0,-40v26,3,41,-3,44,-29r-71,-198r55,0"},"z":{"d":"7,-39r98,-112r-91,0r0,-40r154,0r0,41r-95,109r100,0r0,41r-166,0r0,-39","w":180},"{":{"d":"57,-94v80,8,-3,149,74,133r0,32v-51,3,-78,-9,-80,-57v-2,-42,15,-97,-34,-93r0,-32v69,6,6,-108,53,-138v13,-9,33,-13,61,-11r0,32v-53,-13,-32,45,-35,83v-3,31,-15,43,-39,51","w":140},"|":{"d":"30,90r0,-360r40,0r0,360r-40,0","w":100},"}":{"d":"123,-79v-69,-6,-6,108,-53,139v-13,9,-33,13,-61,11r0,-32v78,16,-7,-125,74,-133v-40,-7,-39,-49,-39,-98v0,-34,-1,-38,-35,-36r0,-32v51,-3,78,9,80,57v2,42,-15,96,34,92r0,32","w":140},"~":{"d":"65,-85v-13,1,-26,15,-30,26r-13,-32v7,-17,23,-30,45,-31v28,0,51,21,77,25v17,-1,23,-13,31,-27r13,32v-8,16,-25,31,-45,32v-30,0,-46,-25,-78,-25","w":210},"\u00a0":{"w":100}}});


