

var Cufon = (function() {
	
	var api = function() {	
		return api.replace.apply(null, arguments);
	};
	
	var DOM = api.DOM = {
			
		ready: (function() {
		
			var complete = false, readyStatus = { loaded: 1, complete: 1 };
		
			var queue = [], perform = function() {
				if (complete) return;
				complete = true;
				for (var fn; fn = queue.shift(); fn());
			};
			
			// Gecko, Opera, WebKit r26101+
			
			if (document.addEventListener) {
				document.addEventListener('DOMContentLoaded', perform, false);
				window.addEventListener('pageshow', perform, false); // For cached Gecko pages
			}
			
			// Old WebKit, Internet Explorer
			
			if (!window.opera && document.readyState) (function() {
				readyStatus[document.readyState] ? perform() : setTimeout(arguments.callee, 10);
			})();
			
			// Internet Explorer
			
			if (document.readyState && document.createStyleSheet) (function() {
				try {
					document.body.doScroll('left');
					perform();
				}
				catch (e) {
					setTimeout(arguments.callee, 1);
				}
			})();
			
			addEvent(window, 'load', perform); // Fallback
			
			return function(listener) {
				if (!arguments.length) perform();
				else complete ? listener() : queue.push(listener);
			};
			
		})()
		
	};

	var CSS = api.CSS = {
	
		Size: function(value, base) {
		
			this.value = parseFloat(value);
			this.unit = String(value).match(/[a-z%]*$/)[0] || 'px';
		
			this.convert = function(value) {
				return value / base * this.value;
			};
			
			this.convertFrom = function(value) {
				return value / this.value * base;
			};
			
			this.toString = function() {
				return this.value + this.unit;
			};

		},
	
		getStyle: function(el) {
			var view = document.defaultView;
			if (view && view.getComputedStyle) return new Style(view.getComputedStyle(el, null));
			if (el.currentStyle) return new Style(el.currentStyle);
			return new Style(el.style);
		},
		
		ready: (function() {
			
			var complete = false;
			
			var queue = [], perform = function() {
				complete = true;
				for (var fn; fn = queue.shift(); fn());
			};
			
			// Safari 2 does not include <style> elements in document.styleSheets.
			// Safari 2 also does not support Object.prototype.propertyIsEnumerable.
			
			var styleElements = Object.prototype.propertyIsEnumerable ? elementsByTagName('style') : { length: 0 };
			var linkElements = elementsByTagName('link');
			
			DOM.ready(function() {
				// These checks are actually only needed for WebKit-based browsers, but don't really hurt other browsers.
				var linkStyles = 0, link;
				for (var i = 0, l = linkElements.length; link = linkElements[i], i < l; ++i) {
					// WebKit does not load alternate stylesheets.
					if (!link.disabled && link.rel.toLowerCase() == 'stylesheet') ++linkStyles;
				}
				if (document.styleSheets.length >= styleElements.length + linkStyles) perform();
				else setTimeout(arguments.callee, 10);
			});
			
			return function(listener) {
				if (complete) listener();
				else queue.push(listener);
			};
			
		})(),

		supports: function(property, value) {
			var checker = document.createElement('span').style;
			if (checker[property] === undefined) return false;
			checker[property] = value;
			return checker[property] === value;
		},
		
		textAlign: function(word, style, position, wordCount) {
			if (style.get('textAlign') == 'right') {
				if (position > 0) word = ' ' + word;
			}
			else if (position < wordCount - 1) word += ' ';
			return word;
		},
		
		textDecoration: function(el, style) {
			if (!style) style = this.getStyle(el);
			var types = {
				underline: null,
				overline: null,
				'line-through': null
			};
			for (var search = el; search.parentNode && search.parentNode.nodeType == 1; ) {
				var foundAll = true;
				for (var type in types) {
					if (types[type]) continue;
					if (style.get('textDecoration').indexOf(type) != -1) types[type] = style.get('color');
					foundAll = false;
				}
				if (foundAll) break; // this is rather unlikely to happen
				style = this.getStyle(search = search.parentNode);
			}
			return types;
		},
		
		textShadow: cached(function(value) {
			if (value == 'none') return null;
			var shadows = [], currentShadow = {}, result, offCount = 0;
			var re = /(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;
			while (result = re.exec(value)) {
				if (result[0] == ',') {
					shadows.push(currentShadow);
					currentShadow = {}, offCount = 0;
				}
				else if (result[1]) {
					currentShadow.color = result[1];
				}
				else {
					currentShadow[[ 'offX', 'offY', 'blur' ][offCount++]] = result[2];
				}
			}
			shadows.push(currentShadow);
			return shadows;
		}),
		
		color: cached(function(value) {
			var parsed = {};
			parsed.color = value.replace(/^rgba\((.*?),\s*([\d.]+)\)/, function($0, $1, $2) {
				parsed.opacity = parseFloat($2);
				return 'rgb(' + $1 + ')';
			});
			return parsed;
		}),
		
		textTransform: function(text, style) {
			return text[{
				uppercase: 'toUpperCase',
				lowercase: 'toLowerCase'
			}[style.get('textTransform')] || 'toString']();
		}
		
	};
	
	function Font(data) {
		
		var face = this.face = data.face;
		this.glyphs = data.glyphs;
		this.w = data.w;
		this.baseSize = parseInt(face['units-per-em'], 10);
		
		this.family = face['font-family'].toLowerCase();
		this.weight = face['font-weight'];
		this.style = face['font-style'] || 'normal';
		
		this.viewBox = (function () {
			var parts = face.bbox.split(/\s+/);
			return {
				minX: parseInt(parts[0], 10),
				minY: parseInt(parts[1], 10),
				width: parseInt(parts[2], 10) - parseInt(parts[0], 10),
				height: parseInt(parts[3], 10) - parseInt(parts[1], 10),
				toString: function() {
					return [ this.minX, this.minY, this.width, this.height ].join(' ');
				}
			};
		})();
		
		this.ascent = -parseInt(face.ascent, 10);
		this.descent = -parseInt(face.descent, 10);
		
		this.height = -this.ascent + this.descent;
		
	}
	
	function FontFamily() {

		var styles = {}, mapping = {
			oblique: 'italic',
			italic: 'oblique'
		};
		
		this.add = function(font) {
			(styles[font.style] || (styles[font.style] = {}))[font.weight] = font;
		};
		
		this.get = function(style, weight) {
			var weights = styles[style] || styles[mapping[style]]
				|| styles.normal || styles.italic || styles.oblique;
			if (!weights) return null;
			// we don't have to worry about "bolder" and "lighter"
			// because IE's currentStyle returns a numeric value for it,
			// and other browsers use the computed value anyway
			weight = {
				normal: 400,
				bold: 700
			}[weight] || parseInt(weight, 10);
			if (weights[weight]) return weights[weight];
			// http://www.w3.org/TR/CSS21/fonts.html#propdef-font-weight
			// Gecko uses x99/x01 for lighter/bolder
			var up = {
				1: 1,
				99: 0
			}[weight % 100], alts = [], min, max;
			if (up === undefined) up = weight > 400;
			if (weight == 500) weight = 400;
			for (var alt in weights) {
				alt = parseInt(alt, 10);
				if (!min || alt < min) min = alt;
				if (!max || alt > max) max = alt;
				alts.push(alt);
			}
			if (weight < min) weight = min;
			if (weight > max) weight = max;
			alts.sort(function(a, b) {
				return (up
					? (a > weight && b > weight) ? a < b : a > b
					: (a < weight && b < weight) ? a > b : a < b) ? -1 : 1;
			});
			return weights[alts[0]];
		};
	
	}
	
	function HoverHandler() {
		
		function contains(node, anotherNode) {
			if (node.contains) return node.contains(anotherNode);
			return node.compareDocumentPosition(anotherNode) & 16;
		}
		
		function onOverOut(e) {
			var related = e.relatedTarget;
			if (!related || contains(this, related)) return;
			trigger(this);
		}
		
		function onEnterLeave(e) {
			trigger(this);
		}

		function trigger(el) {
			// A timeout is needed so that the event can actually "happen"
			// before replace is triggered. This ensures that styles are up
			// to date.
			setTimeout(function() {
				api.replace(el, sharedStorage.get(el).options, true);
			}, 10);
		}
		
		this.attach = function(el) {
			if (el.onmouseenter === undefined) {
				addEvent(el, 'mouseover', onOverOut);
				addEvent(el, 'mouseout', onOverOut);
			}
			else {
				addEvent(el, 'mouseenter', onEnterLeave);
				addEvent(el, 'mouseleave', onEnterLeave);
			}
		};
		
	}
	
	function Storage() {
		
		var map = {}, at = 0;
		
		function identify(el) {
			return el.cufid || (el.cufid = ++at);
		}
		
		this.get = function(el) {
			var id = identify(el);
			return map[id] || (map[id] = {});
		};
		
	}
	
	function Style(style) {
		
		var custom = {}, sizes = {};
		
		this.get = function(property) {
			return custom[property] != undefined ? custom[property] : style[property];
		};
		
		this.getSize = function(property, base) {
			return sizes[property] || (sizes[property] = new CSS.Size(this.get(property), base));
		};
		
		this.extend = function(styles) {
			for (var property in styles) custom[property] = styles[property];
			return this;
		};
		
	}
	
	function addEvent(el, type, listener) {
		if (el.addEventListener) {
			el.addEventListener(type, listener, false);
		}
		else if (el.attachEvent) {
			el.attachEvent('on' + type, function() {
				return listener.call(el, window.event);
			});
		}
	}
	
	function attach(el, options) {
		var storage = sharedStorage.get(el);
		if (storage.options) return el;
		if (options.hover && options.hoverables[el.nodeName.toLowerCase()]) {
			hoverHandler.attach(el);
		}
		storage.options = options;
		return el;
	}
	
	function cached(fun) {
		var cache = {};
		return function(key) {
			if (!cache.hasOwnProperty(key)) cache[key] = fun.apply(null, arguments);
			return cache[key];
		};	
	}
	
	function getFont(el, style) {
		if (!style) style = CSS.getStyle(el);
		var families = style.get('fontFamily').split(/\s*,\s*/), family;
		for (var i = 0, l = families.length; i < l; ++i) {
			family = families[i].replace(/^(["'])(.*?)\1$/, '$2').toLowerCase();
			if (fonts[family]) return fonts[family].get(style.get('fontStyle'), style.get('fontWeight'));
		}
		return null;
	}
	
	function elementsByTagName(query) {
		return document.getElementsByTagName(query);
	}
	
	function merge() {
		var merged = {}, key;
		for (var i = 0, l = arguments.length; i < l; ++i) {
			for (key in arguments[i]) merged[key] = arguments[i][key];
		}
		return merged;
	}
	
	function process(font, text, style, options, node, el) {
		var separate = options.separate;
		if (separate == 'none') return engines[options.engine].apply(null, arguments);
		var fragment = document.createDocumentFragment(), processed;
		var parts = text.split(separators[separate]), needsAligning = (separate == 'words');
		if (needsAligning && HAS_BROKEN_REGEXP) {
			// @todo figure out a better way to do this
			if (/^\s/.test(text)) parts.unshift('');
			if (/\s$/.test(text)) parts.push('');
		}
		for (var i = 0, l = parts.length; i < l; ++i) {
			processed = engines[options.engine](font,
				needsAligning ? CSS.textAlign(parts[i], style, i, l) : parts[i],
				style, options, node, el, i < l - 1);
			if (processed) fragment.appendChild(processed);
		}
		return fragment;
	}
	
	function replaceElement(el, options) {
		var font, style, nextNode, redraw;
		for (var node = attach(el, options).firstChild; node; node = nextNode) {
			nextNode = node.nextSibling;
			redraw = false;
			if (node.nodeType == 1) {
				if (!node.firstChild) continue;
				if (!/cufon/.test(node.className)) {
					arguments.callee(node, options);
					continue;
				}
				else redraw = true;
			}
			if (!style) style = CSS.getStyle(el).extend(options);
			if (!font) font = getFont(el, style);
			if (!font) continue;
			if (redraw) {
				engines[options.engine](font, null, style, options, node, el);
				continue;
			}
			var text = node.data;
			if (text === '') continue;
			var processed = process(font, text, style, options, node, el);
			if (processed) node.parentNode.replaceChild(processed, node);
			else node.parentNode.removeChild(node);
		}
	}
	
	var HAS_BROKEN_REGEXP = ' '.split(/\s+/).length == 0;
	
	var sharedStorage = new Storage();
	var hoverHandler = new HoverHandler();
	var replaceHistory = [];
	
	var engines = {}, fonts = {}, defaultOptions = {
		enableTextDecoration: false,
		engine: null,
		//fontScale: 1,
		//fontScaling: false,
		hover: false,
		hoverables: {
			a: true
		},
		printable: true,
		//rotation: 0,
		//selectable: false,
		selector: (
				window.Sizzle
			||	window.jQuery // avoid noConflict issues
			||	(window.dojo && dojo.query)
			||	(window.$$ && function(query) { return $$(query); })
			||	(window.$ && function(query) { return $(query); })
			||	(document.querySelectorAll && function(query) { return document.querySelectorAll(query); })
			||	elementsByTagName
		),
		separate: 'words', // 'none' and 'characters' are also accepted
		textShadow: 'none'
	};
	
	var separators = {
		words: /\s+/,
		characters: ''
	};
	
	api.now = function() {
		DOM.ready();
		return api;
	};
	
	api.refresh = function() {
		var currentHistory = replaceHistory.splice(0, replaceHistory.length);
		for (var i = 0, l = currentHistory.length; i < l; ++i) {
			api.replace.apply(null, currentHistory[i]);
		}
		return api;
	};
	
	api.registerEngine = function(id, engine) {
		if (!engine) return api;
		engines[id] = engine;
		return api.set('engine', id);
	};
	
	api.registerFont = function(data) {
		var font = new Font(data), family = font.family;
		if (!fonts[family]) fonts[family] = new FontFamily();
		fonts[family].add(font);
		return api.set('fontFamily', family);
	};
	
	api.replace = function(elements, options, ignoreHistory) {
		options = merge(defaultOptions, options);
		if (!options.engine) return api; // there's no browser support so we'll just stop here
		if (typeof options.textShadow == 'string')
			options.textShadow = CSS.textShadow(options.textShadow);
		if (!ignoreHistory) replaceHistory.push(arguments);
		if (elements.nodeType || typeof elements == 'string') elements = [ elements ];
		CSS.ready(function() {
			for (var i = 0, l = elements.length; i < l; ++i) {
				var el = elements[i];
				if (typeof el == 'string') api.replace(options.selector(el), options, true);
				else replaceElement(el, options);
			}
		});
		return api;
	};
	
	api.set = function(option, value) {
		defaultOptions[option] = value;
		return api;
	};
	
	return api;
	
})();

Cufon.registerEngine('canvas', (function() {

	// Safari 2 doesn't support .apply() on native methods
	
	var check = document.createElement('canvas');
	if (!check || !check.getContext || !check.getContext.apply) return null;
	check = null;
	
	var HAS_INLINE_BLOCK = Cufon.CSS.supports('display', 'inline-block');
	
	// Firefox 2 w/ non-strict doctype (almost standards mode)
	var HAS_BROKEN_LINEHEIGHT = !HAS_INLINE_BLOCK && (document.compatMode == 'BackCompat' || /frameset|transitional/i.test(document.doctype.publicId));
	
	var styleSheet = document.createElement('style');
	styleSheet.type = 'text/css';
	styleSheet.appendChild(document.createTextNode(
		'@media screen,projection{' +
			'.cufon-canvas{display:inline;display:inline-block;position:relative;vertical-align:middle' + 
			(HAS_BROKEN_LINEHEIGHT
				? ''
				: ';font-size:1px;line-height:1px') +
			'}.cufon-canvas .cufon-alt{display:none}' +
			(HAS_INLINE_BLOCK
				? '.cufon-canvas canvas{position:relative}'
				: '.cufon-canvas canvas{position:absolute}') +
		'}' +
		'@media print{' +
			'.cufon-canvas{padding:0 !important}' +
			'.cufon-canvas canvas{display:none}' +
			'.cufon-canvas .cufon-alt{display:inline}' +
		'}'
	));
	document.getElementsByTagName('head')[0].appendChild(styleSheet);

	function generateFromVML(path, context) {
		var atX = 0, atY = 0;
		var code = [], re = /([mrvxe])([^a-z]*)/g, match;
		generate: for (var i = 0; match = re.exec(path); ++i) {
			var c = match[2].split(',');
			switch (match[1]) {
				case 'v':
					code[i] = { m: 'bezierCurveTo', a: [ atX + ~~c[0], atY + ~~c[1], atX + ~~c[2], atY + ~~c[3], atX += ~~c[4], atY += ~~c[5] ] };
					break;
				case 'r':
					code[i] = { m: 'lineTo', a: [ atX += ~~c[0], atY += ~~c[1] ] };
					break;
				case 'm':
					code[i] = { m: 'moveTo', a: [ atX = ~~c[0], atY = ~~c[1] ] };
					break;
				case 'x':
					code[i] = { m: 'closePath' };
					break;
				case 'e':
					break generate;
			}
			context[code[i].m].apply(context, code[i].a);
		}
		return code;
	}
	
	function interpret(code, context) {
		for (var i = 0, l = code.length; i < l; ++i) {
			var line = code[i];
			context[line.m].apply(context, line.a);
		}
	}
	
	return function(font, text, style, options, node, el) {
		
		var redraw = (text === null);
		
		var viewBox = font.viewBox;
		
		var size = style.getSize('fontSize', font.baseSize);
		
		var letterSpacing = style.get('letterSpacing');
		letterSpacing = (letterSpacing == 'normal') ? 0 : size.convertFrom(parseInt(letterSpacing, 10));
		
		var expandTop = 0, expandRight = 0, expandBottom = 0, expandLeft = 0;
		var shadows = options.textShadow, shadowOffsets = [];
		if (shadows) {
			for (var i = 0, l = shadows.length; i < l; ++i) {
				var shadow = shadows[i];
				var x = size.convertFrom(parseFloat(shadow.offX));
				var y = size.convertFrom(parseFloat(shadow.offY));
				shadowOffsets[i] = [ x, y ];
				if (y < expandTop) expandTop = y;
				if (x > expandRight) expandRight = x;
				if (y > expandBottom) expandBottom = y;
				if (x < expandLeft) expandLeft = x;
			}
		}
		
		var chars = Cufon.CSS.textTransform(redraw ? node.alt : text, style).split('');
		
		var width = 0, lastWidth = null;
		
		for (var i = 0, l = chars.length; i < l; ++i) {
			var glyph = font.glyphs[chars[i]] || font.missingGlyph;
			if (!glyph) continue;
			width += lastWidth = Number(glyph.w || font.w) + letterSpacing;
		}
		
		if (lastWidth === null) return null; // there's nothing to render
		
		expandRight += (viewBox.width - lastWidth);
		expandLeft += viewBox.minX;
		
		var wrapper, canvas;
		
		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('span');
			wrapper.className = 'cufon cufon-canvas';
			wrapper.alt = text;
			
			canvas = document.createElement('canvas');
			wrapper.appendChild(canvas);
			
			if (options.printable) {
				var print = document.createElement('span');
				print.className = 'cufon-alt';
				print.appendChild(document.createTextNode(text));
				wrapper.appendChild(print);
			}
		}
		
		var wStyle = wrapper.style;
		var cStyle = canvas.style;
		
		var height = size.convert(viewBox.height - expandTop + expandBottom);
		var roundedHeight = Math.ceil(height);
		var roundingFactor = roundedHeight / height;
		
		canvas.width = Math.ceil(size.convert(width + expandRight - expandLeft) * roundingFactor);
		canvas.height = roundedHeight;
		
		// minY has no part in canvas.height
		expandTop += viewBox.minY;
		
		cStyle.top = Math.round(size.convert(expandTop - font.ascent)) + 'px';
		cStyle.left = Math.round(size.convert(expandLeft)) + 'px';
		
		var wrapperWidth = Math.ceil(size.convert(width * roundingFactor)) + 'px';
		
		if (HAS_INLINE_BLOCK) {
			wStyle.width = wrapperWidth;
			wStyle.height = size.convert(font.height) + 'px';
		}
		else {
			wStyle.paddingLeft = wrapperWidth;
			wStyle.paddingBottom = 0 + 'px';
			//wStyle.paddingBottom = (size.convert(font.height) - 1) + 'px';
		}
		
		var g = canvas.getContext('2d'), scale = roundedHeight / viewBox.height;
		
		g.scale(scale, scale);
		g.translate(-expandLeft, -expandTop);
		
		g.lineWidth = font.face['underline-thickness'];
		
		g.save();
		
		function line(y, color) {
			g.strokeStyle = color;
			
			g.beginPath();
			
			g.moveTo(0, y);
			g.lineTo(width, y);
			
			g.stroke();
		}
		
		var textDecoration = options.enableTextDecoration ? Cufon.CSS.textDecoration(el, style) : {};
		
		if (textDecoration.underline) line(-font.face['underline-position'], textDecoration.underline);
		if (textDecoration.overline) line(font.ascent, textDecoration.overline);
		
		g.fillStyle = style.get('color');
		
		function renderText() {
			for (var i = 0, l = chars.length; i < l; ++i) {
				var glyph = font.glyphs[chars[i]] || font.missingGlyph;
				if (!glyph) continue;
				g.beginPath();
				if (glyph.d) {
					if (glyph.code) interpret(glyph.code, g);
					else glyph.code = generateFromVML('m' + glyph.d, g);
				}
				g.fill();
				g.translate(Number(glyph.w || font.w) + letterSpacing, 0);
			}
		}
		
		if (shadows) {
			for (var i = 0, l = shadows.length; i < l; ++i) {
				var shadow = shadows[i];
				g.save();
				g.fillStyle = shadow.color;
				g.translate.apply(g, shadowOffsets[i]);
				renderText();
				g.restore();
			}
		}
		
		renderText();
		
		g.restore();
		
		if (textDecoration['line-through']) line(-font.descent, textDecoration['line-through']);
		
		return wrapper;
			
	};
	
})());

Cufon.registerEngine('vml', (function() {

	if (!document.namespaces) return;

	// isn't undocumented stuff great?
	document.write('<!--[if vml]><script type="text/javascript">Cufon.vmlEnabled=true;</script><![endif]-->');
	if (!Cufon.vmlEnabled) return;
	
	if (document.namespaces['cvml'] == null) {
		document.namespaces.add('cvml', 'urn:schemas-microsoft-com:vml');
		document.write('<style type="text/css">' +
			'@media screen{' + 
				'cvml\\:shape,cvml\\:group,cvml\\:shapetype,cvml\\:fill{behavior:url(#default#VML);display:inline-block;antialias:true;position:absolute}' +
				'.cufon-vml{display:inline-block;position:relative;vertical-align:middle}' +
				'.cufon-vml .cufon-alt{display:none}' +
				'a .cufon-vml{cursor:pointer}' +
			'}' +
			'@media print{' + 
				'.cufon-vml *{display:none}' +
				'.cufon-vml .cufon-alt{display:inline}' +
			'}' +
		'</style>');
	}

	var typeIndex = 0; // this is used to reference VML ShapeTypes

	function getFontSizeInPixels(el, value) {
		return getSizeInPixels(el, /(?:em|ex|%)$/i.test(value) ? '1em' : value);
	}
	
	// Original by Dead Edwards.
	// Combined with getFontSizeInPixels it also works with relative units.
	function getSizeInPixels(el, value) {
		if (/px$/i.test(value)) return parseFloat(value);
		var style = el.style.left, runtimeStyle = el.runtimeStyle.left;
		el.runtimeStyle.left = el.currentStyle.left;
		el.style.left = value;
		var result = el.style.pixelLeft;
		el.style.left = style;
		el.runtimeStyle.left = runtimeStyle;
		return result;
	}
	
	function createType(glyph, viewBox) {
		var shapeType = document.createElement('cvml:shapetype');
		shapeType.id = 'cufon-glyph-' + typeIndex++;
		glyph.typeRef = '#' + shapeType.id;
		shapeType.stroked = 'f';
		shapeType.coordsize = viewBox.width + ',' + viewBox.height;
		shapeType.coordorigin = viewBox.minX + ',' + viewBox.minY;
		var ensureSize = 'm' + viewBox.minX + ',' + viewBox.minY + ' r' + viewBox.width + ',' + viewBox.height;
		shapeType.path = (glyph.d ? 'm' + glyph.d + 'x' : '') + ensureSize;
		document.body.insertBefore(shapeType, document.body.firstChild);
	}
	
	return function(font, text, style, options, node, el, hasNext) {
		
		var redraw = (text === null);
		
		if (redraw) text = node.alt;
		
		// @todo word-spacing, text-decoration
	
		var viewBox = font.viewBox;
		
		var size = style.computedFontSize || (style.computedFontSize = new Cufon.CSS.Size(getFontSizeInPixels(el, style.get('fontSize')) + 'px', font.baseSize));
		
		var letterSpacing = style.computedLSpacing;
		
		if (letterSpacing == undefined) {
			letterSpacing = style.get('letterSpacing');
			style.computedLSpacing = letterSpacing = (letterSpacing == 'normal') ? 0 : size.convertFrom(getSizeInPixels(el, letterSpacing));
		}
		
		var wrapper, canvas;
		
		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('span');
			wrapper.className = 'cufon cufon-vml';
			wrapper.alt = text;
			
			canvas = document.createElement('cvml:group');
			wrapper.appendChild(canvas);
			
			if (options.printable) {
				var print = document.createElement('span');
				print.className = 'cufon-alt';
				print.innerText = text;
				wrapper.appendChild(print);
			}
			
			// ie6, for some reason, has trouble rendering the last VML element in the document.
			// we can work around this by injecting a dummy element where needed.
			// @todo find a better solution
			if (!hasNext) wrapper.appendChild(document.createElement('cvml:group'));
		}
		
		var wStyle = wrapper.style;
		var cStyle = canvas.style;
		
		var height = size.convert(viewBox.height);
		
		cStyle.height = Math.ceil(height);
		cStyle.top = Math.round(size.convert(viewBox.minY - font.ascent));
		cStyle.left = Math.round(size.convert(viewBox.minX));
		
		var roundingFactor = parseInt(cStyle.height, 10) / height;
		
		wStyle.height = size.convert(-font.ascent + font.descent) + 'px';
		
		var textDecoration = options.enableTextDecoration ? Cufon.CSS.textDecoration(el, style) : {};
		
		var color = style.get('color');
		var chars = Cufon.CSS.textTransform(text, style).split('');
		
		var width = 0, offsetX = 0, advance = null;
		
		var shadows = options.textShadow;
		
		for (var i = 0, k = -1, l = chars.length; i < l; ++i) {
		
			var glyph = font.glyphs[chars[i]] || font.missingGlyph, shape;
			if (!glyph) continue;
			
			if (!glyph.typeRef) createType(glyph, viewBox);
			
			if (redraw) {
				// some glyphs may be missing so we can't use i
				shape = canvas.childNodes[++k];
			}
			else { 
				shape = document.createElement('cvml:shape');
				canvas.appendChild(shape);
			}
			
			shape.type = glyph.typeRef;
			var sStyle = shape.style;
			sStyle.width = viewBox.width;
			sStyle.height = viewBox.height;
			sStyle.top = 0;
			sStyle.left = offsetX;
			sStyle.zIndex = 1;
			shape.fillcolor = color;
			
			if (shadows) {
				// the VML shadow element is not used because it can only support
				// up to 2 shadows. and it breaks text selection.
				for (var z = 0, p = shadows.length; z < p; ++z) {
					var shadow = shadows[z];
					var shadowColor = Cufon.CSS.color(shadow.color);
					var shadowNode = shape.cloneNode(false), zStyle = shadowNode.runtimeStyle;
					zStyle.top = size.convertFrom(parseFloat(shadow.offY));
					zStyle.left = offsetX + size.convertFrom(parseFloat(shadow.offX));
					zStyle.zIndex = 0;
					shadowNode.fillcolor = shadowColor.color;
					if (shadowColor.opacity) {
						var shadowFill = document.createElement('cvml:fill');
						shadowFill.opacity = shadowColor.opacity;
						shadowNode.appendChild(shadowFill);
					}
					canvas.appendChild(shadowNode);
				}
				
				++k;
			}
			
			advance = Number(glyph.w || font.w) + letterSpacing;
			
			width += advance;
			offsetX += advance;
			
		}
		
		if (advance === null) return null;
		
		var fullWidth = -viewBox.minX + width + (viewBox.width - advance);
		
		canvas.coordsize = fullWidth + ',' + viewBox.height;
		
		cStyle.width = size.convert(fullWidth * roundingFactor);
		
		wStyle.width = Math.max(Math.ceil(size.convert(width * roundingFactor)), 0);
		
		return wrapper;
		
	};
	
})());


Cufon.registerFont({"w":208,"face":{"font-family":"Futura LT Medium","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 5 4 2 0 0 2 0 3","ascent":"288","descent":"-72","x-height":"6","bbox":"-7 -317.176 374 96.8991","underline-thickness":"27","underline-position":"-40.68","unicode-range":"U+0020-U+007E"},"glyphs":{" ":{"w":104},"!":{"d":"42,-271r32,0r0,208r-32,0r0,-208xm37,-15v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-9,21,-21,21v-12,0,-21,-9,-21,-21","w":115},"\"":{"d":"126,-271r-7,118r-22,0r-7,-118r36,0xm68,-271r-7,118r-22,0r-7,-118r36,0","w":158},"#":{"d":"78,-104r45,0r9,-56r-44,0xm106,-258r-13,69r45,0r12,-69r29,0r-13,69r33,0r0,29r-38,0r-10,56r36,0r0,28r-42,0r-14,76r-27,0r13,-76r-44,0r-14,76r-27,0r13,-76r-36,0r0,-28r41,0r10,-56r-38,0r0,-29r43,0r13,-69r28,0"},"$":{"d":"102,-246v-27,1,-47,42,-24,62v7,6,15,10,24,14r0,-76xm69,-152v-54,-28,-30,-127,33,-125r0,-33r18,0r0,33v31,2,49,19,61,42r-28,16v-8,-14,-17,-22,-33,-27r0,85v35,16,70,35,70,83v0,45,-29,76,-70,84r0,34r-18,0r0,-34v-48,-4,-75,-33,-84,-76r32,-7v7,30,19,47,52,51r0,-108v-12,-5,-23,-13,-33,-18xm120,-28v39,-6,52,-71,14,-89v-5,-3,-9,-6,-14,-9r0,98"},"%":{"d":"228,-56v-3,-23,-17,-40,-42,-40v-25,0,-42,16,-42,40v0,25,18,40,42,40v25,0,39,-16,42,-40xm122,-56v0,-38,26,-62,64,-62v37,0,63,25,63,62v0,38,-26,62,-63,62v-37,0,-64,-25,-64,-62xm215,-268r-158,274r-17,-9r159,-274xm69,-175v44,4,57,-63,16,-77v-28,-9,-58,7,-57,37v1,25,18,38,41,40xm6,-215v0,-38,26,-62,63,-62v38,0,64,24,64,62v0,38,-27,61,-64,61v-36,0,-63,-24,-63,-61","w":254},"&":{"d":"179,-221v0,36,-27,52,-49,68r56,68r32,-36r21,22r-33,39r49,60r-42,0r-29,-37v-18,21,-46,41,-82,43v-74,4,-110,-95,-54,-138r36,-26v-13,-15,-30,-34,-30,-60v0,-39,24,-59,62,-59v36,0,63,20,63,56xm116,-251v-35,0,-39,47,-14,63v12,24,33,-9,42,-20v10,-22,-6,-43,-28,-43xm68,-108v-39,32,1,100,51,80v18,-7,31,-20,44,-32r-60,-74v-12,8,-24,17,-35,26","w":249},"'":{"d":"68,-271r-7,118r-22,0r-7,-118r36,0","w":99},"(":{"d":"58,69v-50,-90,-48,-272,0,-360r27,20v-42,81,-41,240,0,321","w":105},")":{"d":"21,50v40,-83,40,-238,0,-321r26,-20v50,91,49,271,0,360","w":105},"*":{"d":"91,-271r0,34r29,-18r13,22r-31,18r31,18r-13,21r-29,-18r0,34r-25,0r0,-35r-31,18r-12,-21r30,-17r-30,-18r11,-21r32,18r0,-35r25,0","w":155},"+":{"d":"120,-184r0,76r76,0r0,31r-76,0r0,77r-31,0r0,-77r-77,0r0,-31r77,0r0,-76r31,0"},",":{"d":"87,-32r-48,96r-20,-8r40,-99","w":104},"-":{"d":"99,-129r0,27r-78,0r0,-27r78,0","w":119},".":{"d":"31,-15v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-9,21,-21,21v-12,0,-21,-9,-21,-21","w":104},"\/":{"d":"187,-301r-150,346r-25,-11r149,-346","w":198},"0":{"d":"166,-136v0,-50,-12,-112,-62,-112v-50,0,-62,62,-62,112v0,53,12,106,62,112v50,-6,62,-59,62,-112xm199,-136v0,73,-24,142,-95,142v-72,0,-95,-70,-95,-142v0,-71,22,-141,95,-141v73,0,95,69,95,141"},"1":{"d":"44,-240r19,-31r61,0r0,271r-33,0r0,-240r-47,0"},"2":{"d":"106,-277v73,-3,109,83,65,137r-89,109r110,0r0,31r-176,0r135,-168v21,-34,-5,-80,-45,-78v-30,1,-49,20,-52,49r-34,0v6,-48,33,-78,86,-80"},"3":{"d":"156,-77v0,-35,-23,-54,-57,-53r0,-28v32,0,53,-11,53,-43v0,-30,-19,-47,-47,-47v-25,0,-42,17,-45,39r-33,0v5,-43,32,-69,79,-68v47,1,79,25,79,73v0,29,-14,50,-35,61v24,11,37,35,39,67v6,89,-130,108,-162,39v-5,-9,-8,-19,-8,-30r33,0v4,27,23,43,52,43v32,0,52,-21,52,-53"},"4":{"d":"136,-181r-77,112r77,0r0,-112xm200,-69r0,29r-31,0r0,40r-33,0r0,-40r-133,0r166,-243r0,214r31,0"},"5":{"d":"162,-92v2,-60,-83,-85,-116,-40r-6,0r41,-139r109,0r0,31r-85,0r-17,55v67,-7,102,33,106,94v6,100,-142,129,-183,49r25,-24v10,22,30,41,60,41v40,0,64,-27,66,-67"},"6":{"d":"47,-82v0,35,23,58,57,58v33,0,58,-22,58,-56v0,-34,-23,-58,-58,-58v-33,0,-57,24,-57,56xm105,6v-64,0,-113,-64,-82,-125v29,-59,76,-105,113,-158r25,16r-72,99v55,-21,107,22,105,78v-1,53,-35,90,-89,90"},"7":{"d":"17,-240r0,-31r195,0r-169,277r-26,-16r140,-230r-140,0"},"8":{"d":"150,-202v0,-27,-18,-46,-46,-46v-28,0,-46,19,-46,46v0,27,19,46,46,46v27,0,46,-19,46,-46xm104,6v-51,0,-85,-30,-85,-82v0,-33,16,-57,43,-65v-61,-29,-37,-144,42,-136v79,-8,103,107,42,136v27,8,43,32,43,65v0,52,-34,82,-85,82xm157,-76v0,-30,-22,-51,-53,-51v-31,0,-53,21,-53,51v0,30,24,48,53,52v29,-4,53,-22,53,-52"},"9":{"d":"51,-190v0,35,25,57,58,57v35,0,57,-23,57,-57v0,-33,-23,-57,-55,-57v-35,0,-60,22,-60,57xm108,-277v85,-4,107,96,61,158r-92,125r-25,-17r72,-98v-57,19,-105,-23,-105,-79v0,-53,36,-87,89,-89"},":":{"d":"31,-153v0,-12,10,-21,21,-21v11,0,21,9,21,21v0,12,-9,21,-21,21v-12,0,-21,-9,-21,-21xm31,-15v0,-12,9,-21,21,-21v12,0,21,9,21,21v0,12,-9,21,-21,21v-12,0,-21,-9,-21,-21","w":104},";":{"d":"48,-153v0,-12,10,-21,21,-21v11,0,21,9,21,21v0,12,-9,21,-21,21v-12,0,-21,-9,-21,-21xm84,-32r-48,96r-19,-8r39,-99","w":104},"<":{"d":"196,-145r-138,53r138,53r0,34r-184,-75r0,-25r184,-74r0,34"},"=":{"d":"196,-77r0,31r-184,0r0,-31r184,0xm196,-139r0,31r-184,0r0,-31r184,0"},">":{"d":"12,-179r184,74r0,25r-184,75r0,-34r138,-53r-138,-53r0,-34"},"?":{"d":"62,-15v0,-11,9,-21,20,-21v12,0,21,9,21,21v0,12,-9,21,-21,21v-11,0,-20,-10,-20,-21xm82,-96v15,-1,26,-12,26,-28r33,0v-3,34,-24,56,-59,58v-56,4,-79,-81,-29,-104v24,-11,62,-12,62,-45v0,-19,-14,-32,-33,-32v-21,0,-37,20,-29,43r-34,0v-5,-45,22,-70,64,-73v70,-4,87,100,24,120v-20,7,-48,9,-50,35v-1,14,12,26,25,26","w":163},"@":{"d":"42,-136v-5,93,104,140,180,96r27,21v-25,15,-54,27,-96,25v-85,-3,-140,-56,-140,-142v0,-85,53,-141,137,-141v73,0,125,44,125,114v0,58,-26,103,-77,108v-12,-1,-18,-11,-20,-23v-33,42,-109,18,-109,-44v0,-70,81,-116,121,-60r5,-22r26,0r-21,112v-1,7,1,11,8,11v25,-8,39,-37,39,-69v0,-60,-36,-98,-98,-98v-66,0,-104,46,-107,112xm144,-180v-51,-3,-68,93,-11,96v43,2,61,-54,41,-84v-6,-9,-18,-12,-30,-12","w":288},"A":{"d":"127,-209r-49,110r97,0xm64,-68r-31,68r-36,0r130,-283r129,283r-36,0r-31,-68r-125,0","w":253,"k":{"y":7,"w":7,"v":7,"Y":36,"W":36,"V":43,"T":29}},"B":{"d":"181,-76v0,77,-78,79,-158,76r0,-271v72,-3,133,6,133,74v0,25,-12,44,-30,52v32,8,55,31,55,69xm147,-78v0,-44,-45,-47,-90,-46r0,94v47,2,90,-2,90,-48xm124,-197v0,-38,-27,-46,-67,-44r0,90v39,1,68,-7,67,-46","w":192},"C":{"d":"45,-135v-5,95,115,142,179,82r0,40v-94,50,-213,-11,-213,-121v0,-111,117,-175,213,-125r0,39v-18,-15,-42,-26,-72,-26v-65,0,-103,45,-107,111","w":237},"D":{"d":"198,-136v0,-80,-58,-106,-141,-104r0,209v83,2,141,-25,141,-105xm231,-137v0,113,-87,145,-208,137r0,-271v120,-8,208,23,208,134","w":239},"E":{"d":"26,-271r146,0r0,31r-112,0r0,75r108,0r0,31r-108,0r0,103r112,0r0,31r-146,0r0,-271","w":187},"F":{"d":"59,-240r0,76r95,0r0,31r-95,0r0,133r-33,0r0,-271r131,0r0,31r-98,0","w":170,"k":{"A":22,".":54,",":54}},"G":{"d":"41,-136v-8,117,180,153,195,30r-70,0r0,-31r107,0v1,88,-45,143,-128,143v-82,0,-137,-57,-137,-141v0,-104,98,-170,201,-129v20,9,37,22,50,39r-24,23v-18,-23,-47,-44,-85,-44v-67,0,-104,45,-109,110","w":280},"H":{"d":"186,-162r0,-109r34,0r0,271r-34,0r0,-130r-129,0r0,130r-34,0r0,-271r34,0r0,109r129,0","w":243},"I":{"d":"59,0r-34,0r0,-271r34,0r0,271","w":83},"J":{"d":"10,-35v39,26,65,-9,65,-64r0,-172r34,0r0,172v9,77,-46,130,-116,93","w":130},"K":{"d":"175,-271r44,0r-122,122r124,149r-45,0r-103,-126r-13,13r0,113r-34,0r0,-271r34,0r0,117","w":216},"L":{"d":"60,-31r82,0r0,31r-116,0r0,-271r34,0r0,240","w":138,"k":{"y":7,"Y":14,"W":11,"V":14,"T":11}},"M":{"d":"153,6r-82,-185r-31,179r-35,0r55,-283r93,214r94,-214r55,283r-35,0r-32,-179","w":306},"N":{"d":"23,-284r203,213r0,-200r34,0r0,282r-203,-213r0,202r-34,0r0,-284","w":282},"O":{"d":"149,-246v-98,-6,-137,122,-76,188v34,37,119,40,152,0v16,-20,34,-43,32,-78v-3,-66,-42,-107,-108,-110xm7,-136v0,-85,58,-141,142,-141v84,0,142,56,142,141v0,86,-56,142,-142,142v-86,0,-142,-56,-142,-142","w":298},"P":{"d":"143,-194v0,-43,-40,-48,-83,-47r0,97v45,1,83,-6,83,-50xm174,-193v0,63,-48,82,-114,79r0,114r-34,0r0,-271v79,-2,148,1,148,78","w":178,"k":{"A":29,".":49,",":49}},"Q":{"d":"149,-246v-98,-6,-138,123,-76,188v27,29,90,43,130,17r-62,-61r42,0r43,42v19,-16,31,-43,31,-76v0,-66,-42,-107,-108,-110xm291,-136v0,43,-18,77,-42,100r42,42r-41,0r-24,-24v-19,14,-48,24,-77,24v-86,0,-142,-56,-142,-142v0,-85,58,-141,142,-141v84,0,142,56,142,141","w":298},"R":{"d":"143,-193v0,-43,-39,-49,-83,-48r0,98v45,1,83,-6,83,-50xm174,-194v0,45,-27,69,-65,76r86,118r-41,0r-80,-115r-14,0r0,115r-34,0r0,-271v80,-5,148,4,148,77","w":195,"k":{"Y":7,"T":7}},"S":{"d":"60,-149v-64,-33,-32,-128,44,-128v34,0,57,18,70,41r-27,16v-16,-44,-107,-26,-86,27v34,44,121,32,121,114v0,91,-129,112,-161,39v-4,-9,-8,-19,-9,-30r34,-7v1,31,21,50,52,51v53,4,67,-77,21,-96v-20,-8,-40,-17,-59,-27","w":193},"T":{"d":"99,0r-34,0r0,-240r-64,0r0,-31r162,0r0,31r-64,0r0,240","w":164,"k":{"y":29,"w":29,"u":36,"s":36,"r":29,"o":36,"i":5,"e":36,"c":36,"a":36,"A":29,";":36,":":36,".":36,",":36}},"U":{"d":"121,6v-65,0,-100,-42,-100,-106r0,-171r34,0v9,94,-35,245,66,245v101,0,55,-152,65,-245r34,0r0,171v-2,64,-35,106,-99,106","w":240},"V":{"d":"116,-71r80,-200r37,0r-117,285r-119,-285r38,0","w":230,"k":{"y":7,"u":22,"r":14,"o":29,"i":7,"e":29,"a":29,"A":36,";":29,":":29,".":43,",":43}},"W":{"d":"108,-77r77,-200r77,200r76,-194r36,0r-112,282r-77,-199r-77,199r-112,-282r36,0","w":369,"k":{"u":14,"r":7,"o":22,"e":22,"a":22,"A":36,";":29,":":29,".":29,",":29}},"X":{"d":"10,-271r39,0r55,99r59,-99r39,0r-78,129r82,142r-38,0r-64,-111r-66,111r-38,0r85,-142","w":206},"Y":{"d":"-2,-271r39,0r66,115r67,-115r39,0r-89,153r0,118r-34,0r0,-118","w":206,"k":{"v":14,"u":22,"q":36,"p":29,"o":36,"i":7,"e":36,"a":36,"A":36,";":36,":":36,".":36,",":36}},"Z":{"d":"196,-31r0,31r-193,0r138,-240r-118,0r0,-31r173,0r-138,240r138,0","w":198},"[":{"d":"55,39r35,0r0,30r-68,0r0,-360r68,0r0,30r-35,0r0,300","w":111},"\\":{"d":"41,-312r146,312r-30,0r-146,-312r30,0","w":198},"]":{"d":"57,-261r-35,0r0,-30r68,0r0,360r-68,0r0,-30r35,0r0,-300","w":111},"^":{"d":"84,-271r40,0r72,160r-34,0r-58,-130r-59,130r-33,0"},"_":{"d":"180,68r-180,0r0,-27r180,0r0,27","w":180},"`":{"d":"57,-264r45,60r-16,9r-59,-53","w":129},"a":{"d":"9,-85v-6,-81,101,-118,139,-55r0,-28r32,0r0,168r-32,0v-1,-8,2,-20,-1,-26v-11,18,-31,32,-57,32v-53,0,-77,-39,-81,-91xm42,-84v0,36,18,61,53,61v36,0,55,-26,55,-61v0,-35,-19,-61,-55,-61v-34,0,-53,25,-53,61","w":200},"b":{"d":"110,6v-27,0,-45,-16,-58,-32r0,26r-32,0r0,-312r32,0r1,172v12,-18,30,-35,59,-34v50,2,79,38,79,89v0,52,-28,89,-81,91xm50,-84v0,35,18,61,54,61v35,0,54,-25,54,-61v0,-36,-19,-61,-54,-61v-35,0,-54,26,-54,61","w":200},"c":{"d":"9,-83v0,-71,76,-111,137,-79r0,41v-32,-41,-104,-20,-104,37v0,60,76,78,104,37r0,42v-62,30,-137,-9,-137,-78","w":158},"d":{"d":"89,-174v29,-1,45,18,59,34r0,-172r32,0r0,312r-32,0v-1,-8,2,-20,-1,-26v-11,18,-31,32,-57,32v-53,0,-81,-39,-81,-91v0,-51,30,-86,80,-89xm42,-84v0,36,18,61,53,61v36,0,55,-26,55,-61v0,-35,-19,-61,-55,-61v-34,0,-53,25,-53,61","w":200},"e":{"d":"138,-103v-1,-37,-50,-56,-79,-31v-9,8,-13,19,-15,31r94,0xm91,-174v54,0,79,38,79,95r-128,0v1,33,19,56,51,56v27,0,38,-16,50,-33r27,16v-14,27,-41,46,-78,46v-54,0,-83,-37,-83,-89v0,-54,27,-91,82,-91","w":175},"f":{"d":"29,-168v-1,-74,-11,-173,77,-144r0,32v-27,-17,-45,3,-45,39r0,73r45,0r0,30r-45,0r0,138r-32,0r0,-138r-15,0r0,-30r15,0","w":99,"k":{"f":-7}},"g":{"d":"88,-174v30,-1,46,16,60,34r0,-28r32,0v-6,118,37,300,-114,259v-30,-8,-48,-33,-49,-71r32,0v0,30,21,47,50,48v49,2,53,-47,48,-94v-11,17,-31,32,-57,32v-53,0,-81,-38,-81,-91v0,-51,29,-87,79,-89xm41,-84v0,35,18,61,54,61v35,0,54,-25,54,-61v0,-36,-19,-61,-54,-61v-35,0,-54,26,-54,61","w":199},"h":{"d":"96,-145v-61,0,-36,87,-41,145r-33,0r0,-312r33,0r0,166v9,-16,29,-27,51,-28v81,-2,56,99,60,174r-32,0v-6,-55,22,-145,-38,-145","w":188},"i":{"d":"23,-246v0,-12,10,-22,23,-22v12,0,22,9,22,22v0,12,-9,23,-22,22v-13,0,-23,-10,-23,-22xm62,0r-32,0r0,-168r32,0r0,168","w":91},"j":{"d":"23,-246v0,-12,10,-22,23,-22v12,0,22,9,22,22v0,12,-9,23,-22,22v-13,0,-23,-10,-23,-22xm62,96r-32,0r0,-264r32,0r0,264","w":91},"k":{"d":"57,-105r63,-63r43,0r-72,69r79,99r-42,0r-60,-77r-11,11r0,66r-33,0r0,-312r33,0r0,207","w":166},"l":{"d":"56,0r-32,0r0,-312r32,0r0,312","w":79},"m":{"d":"91,-145v-57,3,-31,90,-37,145r-33,0r0,-168r33,0r0,21v8,-13,25,-27,45,-27v25,1,38,14,49,30v9,-17,28,-29,51,-30v78,-1,51,102,56,174r-32,0r0,-95v0,-26,-5,-50,-31,-50v-58,0,-33,90,-38,145r-32,0r-1,-107v-1,-20,-9,-39,-30,-38","w":276},"n":{"d":"96,-145v-61,0,-36,87,-41,145r-33,0r0,-168r33,0r0,22v9,-16,29,-27,51,-28v81,-2,56,99,60,174r-32,0v-6,-55,22,-145,-38,-145","w":188},"o":{"d":"155,-84v0,-35,-23,-59,-58,-59v-34,0,-57,23,-57,59v0,36,23,59,57,59v35,0,58,-24,58,-59xm7,-84v0,-55,35,-90,90,-90v54,0,90,35,90,90v0,55,-36,90,-90,90v-54,0,-90,-35,-90,-90","w":194},"p":{"d":"110,6v-27,0,-45,-16,-58,-32r0,122r-32,0r0,-264r32,0v1,9,-2,21,1,28v12,-18,30,-35,59,-34v50,2,79,38,79,89v0,52,-28,89,-81,91xm50,-84v0,35,18,61,54,61v35,0,54,-25,54,-61v0,-36,-19,-61,-54,-61v-35,0,-54,26,-54,61","w":200},"q":{"d":"89,-174v29,-1,45,18,59,34r0,-28r32,0r0,264r-32,0r-1,-122v-11,18,-31,32,-57,32v-53,0,-81,-39,-81,-91v0,-51,30,-86,80,-89xm42,-84v0,36,18,61,53,61v36,0,55,-26,55,-61v0,-35,-19,-61,-55,-61v-34,0,-53,25,-53,61","w":200},"r":{"d":"116,-136v-33,-22,-59,11,-59,53r0,83r-33,0r0,-168r33,0v1,8,-2,21,1,27v8,-27,46,-44,73,-24","w":126,"k":{"y":-14,"x":-14,"w":-14,"v":-14,"t":-7,"q":7,"n":-3,"m":-3,"f":-7,".":36,",":36}},"s":{"d":"53,-82v-48,-14,-37,-95,17,-92v23,1,38,13,46,30r-26,14v-5,-16,-39,-22,-39,2v12,39,78,24,78,78v0,65,-100,73,-116,18r27,-13v5,26,56,31,56,-2v0,-23,-28,-24,-43,-35","w":138},"t":{"d":"59,0r-32,0r0,-138r-18,0r0,-30r18,0r0,-65r32,0r0,65r32,0r0,30r-32,0r0,138","w":86},"u":{"d":"92,6v-85,0,-71,-92,-71,-174r32,0v5,56,-20,144,39,144v59,0,33,-88,39,-144r32,0v0,81,15,174,-71,174","w":184},"v":{"d":"80,-63r49,-105r36,0r-85,174r-85,-174r37,0","w":160,"k":{".":29,",":29}},"w":{"d":"80,-61r50,-117r49,117r49,-107r37,0r-86,174r-49,-113r-50,113r-86,-174r37,0","w":258,"k":{".":22,",":22}},"x":{"d":"10,-168r38,0r40,54r43,-54r40,0r-62,77r72,91r-38,0r-55,-68r-54,68r-39,0r75,-91","w":176},"y":{"d":"-5,-168r38,0r57,106r53,-106r36,0r-136,264r-37,0r66,-125","w":174,"k":{".":29,",":29}},"z":{"d":"173,-30r0,30r-172,0r114,-138r-95,0r0,-30r158,0r-114,138r109,0","w":178},"{":{"d":"103,70v-113,12,-20,-151,-86,-168r0,-26v66,-17,-27,-179,86,-167r0,30v-44,-8,-26,54,-26,89v0,30,-11,50,-27,61v32,18,28,76,27,128v-1,18,6,26,26,23r0,30","w":120},"|":{"d":"118,0r-31,0r0,-312r31,0r0,312","w":205},"}":{"d":"17,-291v113,-13,20,149,86,167r0,26v-65,18,26,180,-86,168r0,-30v63,4,-8,-116,53,-151v-32,-18,-28,-76,-27,-128v0,-18,-6,-25,-26,-22r0,-30","w":120},"~":{"d":"141,-89v18,-3,23,-18,31,-31r24,18v-11,20,-26,44,-55,44v-31,0,-47,-30,-73,-37v-17,2,-23,15,-33,29r-23,-16v14,-18,25,-44,55,-44v34,0,48,30,74,37"},"\u00a0":{"w":104}}});

