2014-05-12 02:56:55 +00:00
/ *
A class to parse color values
@ author Stoyan Stefanov < sstoo @ gmail . com >
@ link http : //www.phpied.com/rgb-color-parser-in-javascript/
Use it if you like it
canvg . js - Javascript SVG parser and renderer on Canvas
MIT Licensed
Gabe Lerner ( gabelerner @ gmail . com )
http : //code.google.com/p/canvg/
Requires : rgbcolor . js - http : //www.phpied.com/rgb-color-parser-in-javascript/
2015-01-22 04:07:31 +00:00
Highstock JS v2 . 0.4 ( 2014 - 09 - 02 )
2014-05-12 02:56:55 +00:00
CanVGRenderer Extension module
( c ) 2011 - 2012 Torstein Honsi , Erik Olsson
License : www . highcharts . com / license
* /
function RGBColor ( m ) { this . ok = ! 1 ; m . charAt ( 0 ) == "#" && ( m = m . substr ( 1 , 6 ) ) ; var m = m . replace ( / /g , "" ) , m = m . toLowerCase ( ) , a = { aliceblue : "f0f8ff" , antiquewhite : "faebd7" , aqua : "00ffff" , aquamarine : "7fffd4" , azure : "f0ffff" , beige : "f5f5dc" , bisque : "ffe4c4" , black : "000000" , blanchedalmond : "ffebcd" , blue : "0000ff" , blueviolet : "8a2be2" , brown : "a52a2a" , burlywood : "deb887" , cadetblue : "5f9ea0" , chartreuse : "7fff00" , chocolate : "d2691e" , coral : "ff7f50" , cornflowerblue : "6495ed" , cornsilk : "fff8dc" , crimson : "dc143c" , cyan : "00ffff" , darkblue : "00008b" ,
darkcyan : "008b8b" , darkgoldenrod : "b8860b" , darkgray : "a9a9a9" , darkgreen : "006400" , darkkhaki : "bdb76b" , darkmagenta : "8b008b" , darkolivegreen : "556b2f" , darkorange : "ff8c00" , darkorchid : "9932cc" , darkred : "8b0000" , darksalmon : "e9967a" , darkseagreen : "8fbc8f" , darkslateblue : "483d8b" , darkslategray : "2f4f4f" , darkturquoise : "00ced1" , darkviolet : "9400d3" , deeppink : "ff1493" , deepskyblue : "00bfff" , dimgray : "696969" , dodgerblue : "1e90ff" , feldspar : "d19275" , firebrick : "b22222" , floralwhite : "fffaf0" , forestgreen : "228b22" , fuchsia : "ff00ff" ,
gainsboro : "dcdcdc" , ghostwhite : "f8f8ff" , gold : "ffd700" , goldenrod : "daa520" , gray : "808080" , green : "008000" , greenyellow : "adff2f" , honeydew : "f0fff0" , hotpink : "ff69b4" , indianred : "cd5c5c" , indigo : "4b0082" , ivory : "fffff0" , khaki : "f0e68c" , lavender : "e6e6fa" , lavenderblush : "fff0f5" , lawngreen : "7cfc00" , lemonchiffon : "fffacd" , lightblue : "add8e6" , lightcoral : "f08080" , lightcyan : "e0ffff" , lightgoldenrodyellow : "fafad2" , lightgrey : "d3d3d3" , lightgreen : "90ee90" , lightpink : "ffb6c1" , lightsalmon : "ffa07a" , lightseagreen : "20b2aa" , lightskyblue : "87cefa" ,
lightslateblue : "8470ff" , lightslategray : "778899" , lightsteelblue : "b0c4de" , lightyellow : "ffffe0" , lime : "00ff00" , limegreen : "32cd32" , linen : "faf0e6" , magenta : "ff00ff" , maroon : "800000" , mediumaquamarine : "66cdaa" , mediumblue : "0000cd" , mediumorchid : "ba55d3" , mediumpurple : "9370d8" , mediumseagreen : "3cb371" , mediumslateblue : "7b68ee" , mediumspringgreen : "00fa9a" , mediumturquoise : "48d1cc" , mediumvioletred : "c71585" , midnightblue : "191970" , mintcream : "f5fffa" , mistyrose : "ffe4e1" , moccasin : "ffe4b5" , navajowhite : "ffdead" , navy : "000080" ,
oldlace : "fdf5e6" , olive : "808000" , olivedrab : "6b8e23" , orange : "ffa500" , orangered : "ff4500" , orchid : "da70d6" , palegoldenrod : "eee8aa" , palegreen : "98fb98" , paleturquoise : "afeeee" , palevioletred : "d87093" , papayawhip : "ffefd5" , peachpuff : "ffdab9" , peru : "cd853f" , pink : "ffc0cb" , plum : "dda0dd" , powderblue : "b0e0e6" , purple : "800080" , red : "ff0000" , rosybrown : "bc8f8f" , royalblue : "4169e1" , saddlebrown : "8b4513" , salmon : "fa8072" , sandybrown : "f4a460" , seagreen : "2e8b57" , seashell : "fff5ee" , sienna : "a0522d" , silver : "c0c0c0" , skyblue : "87ceeb" , slateblue : "6a5acd" ,
slategray : "708090" , snow : "fffafa" , springgreen : "00ff7f" , steelblue : "4682b4" , tan : "d2b48c" , teal : "008080" , thistle : "d8bfd8" , tomato : "ff6347" , turquoise : "40e0d0" , violet : "ee82ee" , violetred : "d02090" , wheat : "f5deb3" , white : "ffffff" , whitesmoke : "f5f5f5" , yellow : "ffff00" , yellowgreen : "9acd32" } , c ; for ( c in a ) m == c && ( m = a [ c ] ) ; var d = [ { re : /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/ , example : [ "rgb(123, 234, 45)" , "rgb(255,234,245)" ] , process : function ( b ) { return [ parseInt ( b [ 1 ] ) , parseInt ( b [ 2 ] ) , parseInt ( b [ 3 ] ) ] } } , { re : /^(\w{2})(\w{2})(\w{2})$/ ,
example : [ "#00ff00" , "336699" ] , process : function ( b ) { return [ parseInt ( b [ 1 ] , 16 ) , parseInt ( b [ 2 ] , 16 ) , parseInt ( b [ 3 ] , 16 ) ] } } , { re : /^(\w{1})(\w{1})(\w{1})$/ , example : [ "#fb0" , "f0f" ] , process : function ( b ) { return [ parseInt ( b [ 1 ] + b [ 1 ] , 16 ) , parseInt ( b [ 2 ] + b [ 2 ] , 16 ) , parseInt ( b [ 3 ] + b [ 3 ] , 16 ) ] } } ] ; for ( c = 0 ; c < d . length ; c ++ ) { var b = d [ c ] . process , k = d [ c ] . re . exec ( m ) ; if ( k ) channels = b ( k ) , this . r = channels [ 0 ] , this . g = channels [ 1 ] , this . b = channels [ 2 ] , this . ok = ! 0 } this . r = this . r < 0 || isNaN ( this . r ) ? 0 : this . r > 255 ? 255 : this . r ; this . g = this . g < 0 || isNaN ( this . g ) ? 0 :
this . g > 255 ? 255 : this . g ; this . b = this . b < 0 || isNaN ( this . b ) ? 0 : this . b > 255 ? 255 : this . b ; this . toRGB = function ( ) { return "rgb(" + this . r + ", " + this . g + ", " + this . b + ")" } ; this . toHex = function ( ) { var b = this . r . toString ( 16 ) , a = this . g . toString ( 16 ) , d = this . b . toString ( 16 ) ; b . length == 1 && ( b = "0" + b ) ; a . length == 1 && ( a = "0" + a ) ; d . length == 1 && ( d = "0" + d ) ; return "#" + b + a + d } ; this . getHelpXML = function ( ) { for ( var b = [ ] , k = 0 ; k < d . length ; k ++ ) for ( var c = d [ k ] . example , j = 0 ; j < c . length ; j ++ ) b [ b . length ] = c [ j ] ; for ( var h in a ) b [ b . length ] = h ; c = document . createElement ( "ul" ) ;
c . setAttribute ( "id" , "rgbcolor-examples" ) ; for ( k = 0 ; k < b . length ; k ++ ) try { var l = document . createElement ( "li" ) , o = new RGBColor ( b [ k ] ) , n = document . createElement ( "div" ) ; n . style . cssText = "margin: 3px; border: 1px solid black; background:" + o . toHex ( ) + "; color:" + o . toHex ( ) ; n . appendChild ( document . createTextNode ( "test" ) ) ; var q = document . createTextNode ( " " + b [ k ] + " -> " + o . toRGB ( ) + " -> " + o . toHex ( ) ) ; l . appendChild ( n ) ; l . appendChild ( q ) ; c . appendChild ( l ) } catch ( p ) { } return c } }
if ( ! window . console ) window . console = { } , window . console . log = function ( ) { } , window . console . dir = function ( ) { } ; if ( ! Array . prototype . indexOf ) Array . prototype . indexOf = function ( m ) { for ( var a = 0 ; a < this . length ; a ++ ) if ( this [ a ] == m ) return a ; return - 1 } ;
( function ( ) { function m ( ) { var a = { FRAMERATE : 30 , MAX _VIRTUAL _PIXELS : 3E4 } ; a . init = function ( c ) { a . Definitions = { } ; a . Styles = { } ; a . Animations = [ ] ; a . Images = [ ] ; a . ctx = c ; a . ViewPort = new function ( ) { this . viewPorts = [ ] ; this . Clear = function ( ) { this . viewPorts = [ ] } ; this . SetCurrent = function ( a , b ) { this . viewPorts . push ( { width : a , height : b } ) } ; this . RemoveCurrent = function ( ) { this . viewPorts . pop ( ) } ; this . Current = function ( ) { return this . viewPorts [ this . viewPorts . length - 1 ] } ; this . width = function ( ) { return this . Current ( ) . width } ; this . height = function ( ) { return this . Current ( ) . height } ;
this . ComputeSize = function ( a ) { return a != null && typeof a == "number" ? a : a == "x" ? this . width ( ) : a == "y" ? this . height ( ) : Math . sqrt ( Math . pow ( this . width ( ) , 2 ) + Math . pow ( this . height ( ) , 2 ) ) / Math . sqrt ( 2 ) } } } ; a . init ( ) ; a . ImagesLoaded = function ( ) { for ( var c = 0 ; c < a . Images . length ; c ++ ) if ( ! a . Images [ c ] . loaded ) return ! 1 ; return ! 0 } ; a . trim = function ( a ) { return a . replace ( /^\s+|\s+$/g , "" ) } ; a . compressSpaces = function ( a ) { return a . replace ( /[\s\r\t\n]+/gm , " " ) } ; a . ajax = function ( a ) { var d ; return ( d = window . XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject ( "Microsoft.XMLHTTP" ) ) ?
( d . open ( "GET" , a , ! 1 ) , d . send ( null ) , d . responseText ) : null } ; a . parseXml = function ( a ) { if ( window . DOMParser ) return ( new DOMParser ) . parseFromString ( a , "text/xml" ) ; else { var a = a . replace ( /<!DOCTYPE svg[^>]*>/ , "" ) , d = new ActiveXObject ( "Microsoft.XMLDOM" ) ; d . async = "false" ; d . loadXML ( a ) ; return d } } ; a . Property = function ( c , d ) { this . name = c ; this . value = d ; this . hasValue = function ( ) { return this . value != null && this . value !== "" } ; this . numValue = function ( ) { if ( ! this . hasValue ( ) ) return 0 ; var b = parseFloat ( this . value ) ; ( this . value + "" ) . match ( /%$/ ) &&
( b /= 100 ) ; return b } ; this . valueOrDefault = function ( b ) { return this . hasValue ( ) ? this . value : b } ; this . numValueOrDefault = function ( b ) { return this . hasValue ( ) ? this . numValue ( ) : b } ; var b = this ; this . Color = { addOpacity : function ( d ) { var c = b . value ; if ( d != null && d != "" ) { var f = new RGBColor ( b . value ) ; f . ok && ( c = "rgba(" + f . r + ", " + f . g + ", " + f . b + ", " + d + ")" ) } return new a . Property ( b . name , c ) } } ; this . Definition = { getDefinition : function ( ) { var d = b . value . replace ( /^(url\()?#([^\)]+)\)?$/ , "$2" ) ; return a . Definitions [ d ] } , isUrl : function ( ) { return b . value . indexOf ( "url(" ) ==
0 } , getFillStyle : function ( b ) { var d = this . getDefinition ( ) ; return d != null && d . createGradient ? d . createGradient ( a . ctx , b ) : d != null && d . createPattern ? d . createPattern ( a . ctx , b ) : null } } ; this . Length = { DPI : function ( ) { return 96 } , EM : function ( b ) { var d = 12 , c = new a . Property ( "fontSize" , a . Font . Parse ( a . ctx . font ) . fontSize ) ; c . hasValue ( ) && ( d = c . Length . toPixels ( b ) ) ; return d } , toPixels : function ( d ) { if ( ! b . hasValue ( ) ) return 0 ; var c = b . value + "" ; return c . match ( /em$/ ) ? b . numValue ( ) * this . EM ( d ) : c . match ( /ex$/ ) ? b . numValue ( ) * this . EM ( d ) / 2 : c . match ( /px$/ ) ?
b . numValue ( ) : c . match ( /pt$/ ) ? b . numValue ( ) * 1.25 : c . match ( /pc$/ ) ? b . numValue ( ) * 15 : c . match ( /cm$/ ) ? b . numValue ( ) * this . DPI ( d ) / 2.54 : c . match ( /mm$/ ) ? b . numValue ( ) * this . DPI ( d ) / 25.4 : c . match ( /in$/ ) ? b . numValue ( ) * this . DPI ( d ) : c . match ( /%$/ ) ? b . numValue ( ) * a . ViewPort . ComputeSize ( d ) : b . numValue ( ) } } ; this . Time = { toMilliseconds : function ( ) { if ( ! b . hasValue ( ) ) return 0 ; var a = b . value + "" ; if ( a . match ( /s$/ ) ) return b . numValue ( ) * 1E3 ; a . match ( /ms$/ ) ; return b . numValue ( ) } } ; this . Angle = { toRadians : function ( ) { if ( ! b . hasValue ( ) ) return 0 ; var a = b . value +
"" ; return a . match ( /deg$/ ) ? b . numValue ( ) * ( Math . PI / 180 ) : a . match ( /grad$/ ) ? b . numValue ( ) * ( Math . PI / 200 ) : a . match ( /rad$/ ) ? b . numValue ( ) : b . numValue ( ) * ( Math . PI / 180 ) } } } ; a . Font = new function ( ) { this . Styles = [ "normal" , "italic" , "oblique" , "inherit" ] ; this . Variants = [ "normal" , "small-caps" , "inherit" ] ; this . Weights = "normal,bold,bolder,lighter,100,200,300,400,500,600,700,800,900,inherit" . split ( "," ) ; this . CreateFont = function ( d , b , c , e , f , g ) { g = g != null ? this . Parse ( g ) : this . CreateFont ( "" , "" , "" , "" , "" , a . ctx . font ) ; return { fontFamily : f ||
g . fontFamily , fontSize : e || g . fontSize , fontStyle : d || g . fontStyle , fontWeight : c || g . fontWeight , fontVariant : b || g . fontVariant , toString : function ( ) { return [ this . fontStyle , this . fontVariant , this . fontWeight , this . fontSize , this . fontFamily ] . join ( " " ) } } } ; var c = this ; this . Parse = function ( d ) { for ( var b = { } , d = a . trim ( a . compressSpaces ( d || "" ) ) . split ( " " ) , k = ! 1 , e = ! 1 , f = ! 1 , g = ! 1 , j = "" , h = 0 ; h < d . length ; h ++ ) if ( ! e && c . Styles . indexOf ( d [ h ] ) != - 1 ) { if ( d [ h ] != "inherit" ) b . fontStyle = d [ h ] ; e = ! 0 } else if ( ! g && c . Variants . indexOf ( d [ h ] ) != - 1 ) { if ( d [ h ] != "inherit" ) b . fontVariant =
d [ h ] ; e = g = ! 0 } else if ( ! f && c . Weights . indexOf ( d [ h ] ) != - 1 ) { if ( d [ h ] != "inherit" ) b . fontWeight = d [ h ] ; e = g = f = ! 0 } else if ( k ) d [ h ] != "inherit" && ( j += d [ h ] ) ; else { if ( d [ h ] != "inherit" ) b . fontSize = d [ h ] . split ( "/" ) [ 0 ] ; e = g = f = k = ! 0 } if ( j != "" ) b . fontFamily = j ; return b } } ; a . ToNumberArray = function ( c ) { for ( var c = a . trim ( a . compressSpaces ( ( c || "" ) . replace ( /,/g , " " ) ) ) . split ( " " ) , d = 0 ; d < c . length ; d ++ ) c [ d ] = parseFloat ( c [ d ] ) ; return c } ; a . Point = function ( a , d ) { this . x = a ; this . y = d ; this . angleTo = function ( b ) { return Math . atan2 ( b . y - this . y , b . x - this . x ) } ; this . applyTransform =
function ( b ) { var a = this . x * b [ 1 ] + this . y * b [ 3 ] + b [ 5 ] ; this . x = this . x * b [ 0 ] + this . y * b [ 2 ] + b [ 4 ] ; this . y = a } } ; a . CreatePoint = function ( c ) { c = a . ToNumberArray ( c ) ; return new a . Point ( c [ 0 ] , c [ 1 ] ) } ; a . CreatePath = function ( c ) { for ( var c = a . ToNumberArray ( c ) , d = [ ] , b = 0 ; b < c . length ; b += 2 ) d . push ( new a . Point ( c [ b ] , c [ b + 1 ] ) ) ; return d } ; a . BoundingBox = function ( a , d , b , k ) { this . y2 = this . x2 = this . y1 = this . x1 = Number . NaN ; this . x = function ( ) { return this . x1 } ; this . y = function ( ) { return this . y1 } ; this . width = function ( ) { return this . x2 - this . x1 } ; this . height = function ( ) { return this . y2 -
this . y1 } ; this . addPoint = function ( b , a ) { if ( b != null ) { if ( isNaN ( this . x1 ) || isNaN ( this . x2 ) ) this . x2 = this . x1 = b ; if ( b < this . x1 ) this . x1 = b ; if ( b > this . x2 ) this . x2 = b } if ( a != null ) { if ( isNaN ( this . y1 ) || isNaN ( this . y2 ) ) this . y2 = this . y1 = a ; if ( a < this . y1 ) this . y1 = a ; if ( a > this . y2 ) this . y2 = a } } ; this . addX = function ( b ) { this . addPoint ( b , null ) } ; this . addY = function ( b ) { this . addPoint ( null , b ) } ; this . addBoundingBox = function ( b ) { this . addPoint ( b . x1 , b . y1 ) ; this . addPoint ( b . x2 , b . y2 ) } ; this . addQuadraticCurve = function ( b , a , d , c , k , l ) { d = b + 2 / 3 * ( d - b ) ; c = a + 2 / 3 * ( c -
a ) ; this . addBezierCurve ( b , a , d , d + 1 / 3 * ( k - b ) , c , c + 1 / 3 * ( l - a ) , k , l ) } ; this . addBezierCurve = function ( b , a , d , c , k , l , o , n ) { var q = [ b , a ] , p = [ d , c ] , t = [ k , l ] , m = [ o , n ] ; this . addPoint ( q [ 0 ] , q [ 1 ] ) ; this . addPoint ( m [ 0 ] , m [ 1 ] ) ; for ( i = 0 ; i <= 1 ; i ++ ) b = function ( b ) { return Math . pow ( 1 - b , 3 ) * q [ i ] + 3 * Math . pow ( 1 - b , 2 ) * b * p [ i ] + 3 * ( 1 - b ) * Math . pow ( b , 2 ) * t [ i ] + Math . pow ( b , 3 ) * m [ i ] } , a = 6 * q [ i ] - 12 * p [ i ] + 6 * t [ i ] , d = - 3 * q [ i ] + 9 * p [ i ] - 9 * t [ i ] + 3 * m [ i ] , c = 3 * p [ i ] - 3 * q [ i ] , d == 0 ? a != 0 && ( a = - c / a , 0 < a && a < 1 && ( i == 0 && this . addX ( b ( a ) ) , i == 1 && this . addY ( b ( a ) ) ) ) : ( c = Math . pow ( a , 2 ) - 4 * c * d , c < 0 || ( k =
( - a + Math . sqrt ( c ) ) / ( 2 * d ) , 0 < k && k < 1 && ( i == 0 && this . addX ( b ( k ) ) , i == 1 && this . addY ( b ( k ) ) ) , a = ( - a - Math . sqrt ( c ) ) / ( 2 * d ) , 0 < a && a < 1 && ( i == 0 && this . addX ( b ( a ) ) , i == 1 && this . addY ( b ( a ) ) ) ) ) } ; this . isPointInBox = function ( b , a ) { return this . x1 <= b && b <= this . x2 && this . y1 <= a && a <= this . y2 } ; this . addPoint ( a , d ) ; this . addPoint ( b , k ) } ; a . Transform = function ( c ) { var d = this ; this . Type = { } ; this . Type . translate = function ( b ) { this . p = a . CreatePoint ( b ) ; this . apply = function ( b ) { b . translate ( this . p . x || 0 , this . p . y || 0 ) } ; this . applyToPoint = function ( b ) { b . applyTransform ( [ 1 ,
0 , 0 , 1 , this . p . x || 0 , this . p . y || 0 ] ) } } ; this . Type . rotate = function ( b ) { b = a . ToNumberArray ( b ) ; this . angle = new a . Property ( "angle" , b [ 0 ] ) ; this . cx = b [ 1 ] || 0 ; this . cy = b [ 2 ] || 0 ; this . apply = function ( b ) { b . translate ( this . cx , this . cy ) ; b . rotate ( this . angle . Angle . toRadians ( ) ) ; b . translate ( - this . cx , - this . cy ) } ; this . applyToPoint = function ( b ) { var a = this . angle . Angle . toRadians ( ) ; b . applyTransform ( [ 1 , 0 , 0 , 1 , this . p . x || 0 , this . p . y || 0 ] ) ; b . applyTransform ( [ Math . cos ( a ) , Math . sin ( a ) , - Math . sin ( a ) , Math . cos ( a ) , 0 , 0 ] ) ; b . applyTransform ( [ 1 , 0 , 0 , 1 , - this . p . x ||
0 , - this . p . y || 0 ] ) } } ; this . Type . scale = function ( b ) { this . p = a . CreatePoint ( b ) ; this . apply = function ( b ) { b . scale ( this . p . x || 1 , this . p . y || this . p . x || 1 ) } ; this . applyToPoint = function ( b ) { b . applyTransform ( [ this . p . x || 0 , 0 , 0 , this . p . y || 0 , 0 , 0 ] ) } } ; this . Type . matrix = function ( b ) { this . m = a . ToNumberArray ( b ) ; this . apply = function ( b ) { b . transform ( this . m [ 0 ] , this . m [ 1 ] , this . m [ 2 ] , this . m [ 3 ] , this . m [ 4 ] , this . m [ 5 ] ) } ; this . applyToPoint = function ( b ) { b . applyTransform ( this . m ) } } ; this . Type . SkewBase = function ( b ) { this . base = d . Type . matrix ; this . base ( b ) ; this . angle =
new a . Property ( "angle" , b ) } ; this . Type . SkewBase . prototype = new this . Type . matrix ; this . Type . skewX = function ( b ) { this . base = d . Type . SkewBase ; this . base ( b ) ; this . m = [ 1 , 0 , Math . tan ( this . angle . Angle . toRadians ( ) ) , 1 , 0 , 0 ] } ; this . Type . skewX . prototype = new this . Type . SkewBase ; this . Type . skewY = function ( b ) { this . base = d . Type . SkewBase ; this . base ( b ) ; this . m = [ 1 , Math . tan ( this . angle . Angle . toRadians ( ) ) , 0 , 1 , 0 , 0 ] } ; this . Type . skewY . prototype = new this . Type . SkewBase ; this . transforms = [ ] ; this . apply = function ( b ) { for ( var a = 0 ; a < this . transforms . length ; a ++ ) this . transforms [ a ] . apply ( b ) } ;
this . applyToPoint = function ( b ) { for ( var a = 0 ; a < this . transforms . length ; a ++ ) this . transforms [ a ] . applyToPoint ( b ) } ; for ( var c = a . trim ( a . compressSpaces ( c ) ) . split ( /\s(?=[a-z])/ ) , b = 0 ; b < c . length ; b ++ ) { var k = c [ b ] . split ( "(" ) [ 0 ] , e = c [ b ] . split ( "(" ) [ 1 ] . replace ( ")" , "" ) ; this . transforms . push ( new this . Type [ k ] ( e ) ) } } ; a . AspectRatio = function ( c , d , b , k , e , f , g , j , h , l ) { var d = a . compressSpaces ( d ) , d = d . replace ( /^defer\s/ , "" ) , o = d . split ( " " ) [ 0 ] || "xMidYMid" , d = d . split ( " " ) [ 1 ] || "meet" , n = b / k , q = e / f , p = Math . min ( n , q ) , m = Math . max ( n , q ) ; d == "meet" && ( k *=
p , f *= p ) ; d == "slice" && ( k *= m , f *= m ) ; h = new a . Property ( "refX" , h ) ; l = new a . Property ( "refY" , l ) ; h . hasValue ( ) && l . hasValue ( ) ? c . translate ( - p * h . Length . toPixels ( "x" ) , - p * l . Length . toPixels ( "y" ) ) : ( o . match ( /^xMid/ ) && ( d == "meet" && p == q || d == "slice" && m == q ) && c . translate ( b / 2 - k / 2 , 0 ) , o . match ( /YMid$/ ) && ( d == "meet" && p == n || d == "slice" && m == n ) && c . translate ( 0 , e / 2 - f / 2 ) , o . match ( /^xMax/ ) && ( d == "meet" && p == q || d == "slice" && m == q ) && c . translate ( b - k , 0 ) , o . match ( /YMax$/ ) && ( d == "meet" && p == n || d == "slice" && m == n ) && c . translate ( 0 , e - f ) ) ; o == "none" ? c . scale ( n ,
q ) : d == "meet" ? c . scale ( p , p ) : d == "slice" && c . scale ( m , m ) ; c . translate ( g == null ? 0 : - g , j == null ? 0 : - j ) } ; a . Element = { } ; a . Element . ElementBase = function ( c ) { this . attributes = { } ; this . styles = { } ; this . children = [ ] ; this . attribute = function ( b , d ) { var c = this . attributes [ b ] ; if ( c != null ) return c ; c = new a . Property ( b , "" ) ; d == ! 0 && ( this . attributes [ b ] = c ) ; return c } ; this . style = function ( b , d ) { var c = this . styles [ b ] ; if ( c != null ) return c ; c = this . attribute ( b ) ; if ( c != null && c . hasValue ( ) ) return c ; c = this . parent ; if ( c != null && ( c = c . style ( b ) , c != null && c . hasValue ( ) ) ) return c ;
c = new a . Property ( b , "" ) ; d == ! 0 && ( this . styles [ b ] = c ) ; return c } ; this . render = function ( b ) { if ( this . style ( "display" ) . value != "none" && this . attribute ( "visibility" ) . value != "hidden" ) { b . save ( ) ; this . setContext ( b ) ; if ( this . attribute ( "mask" ) . hasValue ( ) ) { var a = this . attribute ( "mask" ) . Definition . getDefinition ( ) ; a != null && a . apply ( b , this ) } else this . style ( "filter" ) . hasValue ( ) ? ( a = this . style ( "filter" ) . Definition . getDefinition ( ) , a != null && a . apply ( b , this ) ) : this . renderChildren ( b ) ; this . clearContext ( b ) ; b . restore ( ) } } ; this . setContext =
function ( ) { } ; this . clearContext = function ( ) { } ; this . renderChildren = function ( b ) { for ( var a = 0 ; a < this . children . length ; a ++ ) this . children [ a ] . render ( b ) } ; this . addChild = function ( b , d ) { var c = b ; d && ( c = a . CreateElement ( b ) ) ; c . parent = this ; this . children . push ( c ) } ; if ( c != null && c . nodeType == 1 ) { for ( var d = 0 ; d < c . childNodes . length ; d ++ ) { var b = c . childNodes [ d ] ; b . nodeType == 1 && this . addChild ( b , ! 0 ) } for ( d = 0 ; d < c . attributes . length ; d ++ ) b = c . attributes [ d ] , this . attributes [ b . nodeName ] = new a . Property ( b . nodeName , b . nodeValue ) ; b = a . Styles [ c . nodeName ] ;
if ( b != null ) for ( var k in b ) this . styles [ k ] = b [ k ] ; if ( this . attribute ( "class" ) . hasValue ( ) ) for ( var d = a . compressSpaces ( this . attribute ( "class" ) . value ) . split ( " " ) , e = 0 ; e < d . length ; e ++ ) { b = a . Styles [ "." + d [ e ] ] ; if ( b != null ) for ( k in b ) this . styles [ k ] = b [ k ] ; b = a . Styles [ c . nodeName + "." + d [ e ] ] ; if ( b != null ) for ( k in b ) this . styles [ k ] = b [ k ] } if ( this . attribute ( "style" ) . hasValue ( ) ) { b = this . attribute ( "style" ) . value . split ( ";" ) ; for ( d = 0 ; d < b . length ; d ++ ) a . trim ( b [ d ] ) != "" && ( c = b [ d ] . split ( ":" ) , k = a . trim ( c [ 0 ] ) , c = a . trim ( c [ 1 ] ) , this . styles [ k ] = new a . Property ( k ,
c ) ) } this . attribute ( "id" ) . hasValue ( ) && a . Definitions [ this . attribute ( "id" ) . value ] == null && ( a . Definitions [ this . attribute ( "id" ) . value ] = this ) } } ; a . Element . RenderedElementBase = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . setContext = function ( d ) { if ( this . style ( "fill" ) . Definition . isUrl ( ) ) { var b = this . style ( "fill" ) . Definition . getFillStyle ( this ) ; if ( b != null ) d . fillStyle = b } else if ( this . style ( "fill" ) . hasValue ( ) ) b = this . style ( "fill" ) , this . style ( "fill-opacity" ) . hasValue ( ) && ( b = b . Color . addOpacity ( this . style ( "fill-opacity" ) . value ) ) ,
d . fillStyle = b . value == "none" ? "rgba(0,0,0,0)" : b . value ; if ( this . style ( "stroke" ) . Definition . isUrl ( ) ) { if ( b = this . style ( "stroke" ) . Definition . getFillStyle ( this ) , b != null ) d . strokeStyle = b } else if ( this . style ( "stroke" ) . hasValue ( ) ) b = this . style ( "stroke" ) , this . style ( "stroke-opacity" ) . hasValue ( ) && ( b = b . Color . addOpacity ( this . style ( "stroke-opacity" ) . value ) ) , d . strokeStyle = b . value == "none" ? "rgba(0,0,0,0)" : b . value ; if ( this . style ( "stroke-width" ) . hasValue ( ) ) d . lineWidth = this . style ( "stroke-width" ) . Length . toPixels ( ) ; if ( this . style ( "stroke-linecap" ) . hasValue ( ) ) d . lineCap =
this . style ( "stroke-linecap" ) . value ; if ( this . style ( "stroke-linejoin" ) . hasValue ( ) ) d . lineJoin = this . style ( "stroke-linejoin" ) . value ; if ( this . style ( "stroke-miterlimit" ) . hasValue ( ) ) d . miterLimit = this . style ( "stroke-miterlimit" ) . value ; if ( typeof d . font != "undefined" ) d . font = a . Font . CreateFont ( this . style ( "font-style" ) . value , this . style ( "font-variant" ) . value , this . style ( "font-weight" ) . value , this . style ( "font-size" ) . hasValue ( ) ? this . style ( "font-size" ) . Length . toPixels ( ) + "px" : "" , this . style ( "font-family" ) . value ) . toString ( ) ;
this . attribute ( "transform" ) . hasValue ( ) && ( new a . Transform ( this . attribute ( "transform" ) . value ) ) . apply ( d ) ; this . attribute ( "clip-path" ) . hasValue ( ) && ( b = this . attribute ( "clip-path" ) . Definition . getDefinition ( ) , b != null && b . apply ( d ) ) ; if ( this . style ( "opacity" ) . hasValue ( ) ) d . globalAlpha = this . style ( "opacity" ) . numValue ( ) } } ; a . Element . RenderedElementBase . prototype = new a . Element . ElementBase ; a . Element . PathElementBase = function ( c ) { this . base = a . Element . RenderedElementBase ; this . base ( c ) ; this . path = function ( d ) { d != null && d . beginPath ( ) ;
return new a . BoundingBox } ; this . renderChildren = function ( d ) { this . path ( d ) ; a . Mouse . checkPath ( this , d ) ; d . fillStyle != "" && d . fill ( ) ; d . strokeStyle != "" && d . stroke ( ) ; var b = this . getMarkers ( ) ; if ( b != null ) { if ( this . style ( "marker-start" ) . Definition . isUrl ( ) ) { var c = this . style ( "marker-start" ) . Definition . getDefinition ( ) ; c . render ( d , b [ 0 ] [ 0 ] , b [ 0 ] [ 1 ] ) } if ( this . style ( "marker-mid" ) . Definition . isUrl ( ) ) for ( var c = this . style ( "marker-mid" ) . Definition . getDefinition ( ) , e = 1 ; e < b . length - 1 ; e ++ ) c . render ( d , b [ e ] [ 0 ] , b [ e ] [ 1 ] ) ; this . style ( "marker-end" ) . Definition . isUrl ( ) &&
( c = this . style ( "marker-end" ) . Definition . getDefinition ( ) , c . render ( d , b [ b . length - 1 ] [ 0 ] , b [ b . length - 1 ] [ 1 ] ) ) } } ; this . getBoundingBox = function ( ) { return this . path ( ) } ; this . getMarkers = function ( ) { return null } } ; a . Element . PathElementBase . prototype = new a . Element . RenderedElementBase ; a . Element . svg = function ( c ) { this . base = a . Element . RenderedElementBase ; this . base ( c ) ; this . baseClearContext = this . clearContext ; this . clearContext = function ( d ) { this . baseClearContext ( d ) ; a . ViewPort . RemoveCurrent ( ) } ; this . baseSetContext = this . setContext ;
this . setContext = function ( d ) { d . strokeStyle = "rgba(0,0,0,0)" ; d . lineCap = "butt" ; d . lineJoin = "miter" ; d . miterLimit = 4 ; this . baseSetContext ( d ) ; this . attribute ( "x" ) . hasValue ( ) && this . attribute ( "y" ) . hasValue ( ) && d . translate ( this . attribute ( "x" ) . Length . toPixels ( "x" ) , this . attribute ( "y" ) . Length . toPixels ( "y" ) ) ; var b = a . ViewPort . width ( ) , c = a . ViewPort . height ( ) ; if ( typeof this . root == "undefined" && this . attribute ( "width" ) . hasValue ( ) && this . attribute ( "height" ) . hasValue ( ) ) { var b = this . attribute ( "width" ) . Length . toPixels ( "x" ) , c = this . attribute ( "height" ) . Length . toPixels ( "y" ) ,
e = 0 , f = 0 ; this . attribute ( "refX" ) . hasValue ( ) && this . attribute ( "refY" ) . hasValue ( ) && ( e = - this . attribute ( "refX" ) . Length . toPixels ( "x" ) , f = - this . attribute ( "refY" ) . Length . toPixels ( "y" ) ) ; d . beginPath ( ) ; d . moveTo ( e , f ) ; d . lineTo ( b , f ) ; d . lineTo ( b , c ) ; d . lineTo ( e , c ) ; d . closePath ( ) ; d . clip ( ) } a . ViewPort . SetCurrent ( b , c ) ; if ( this . attribute ( "viewBox" ) . hasValue ( ) ) { var e = a . ToNumberArray ( this . attribute ( "viewBox" ) . value ) , f = e [ 0 ] , g = e [ 1 ] , b = e [ 2 ] , c = e [ 3 ] ; a . AspectRatio ( d , this . attribute ( "preserveAspectRatio" ) . value , a . ViewPort . width ( ) , b , a . ViewPort . height ( ) ,
c , f , g , this . attribute ( "refX" ) . value , this . attribute ( "refY" ) . value ) ; a . ViewPort . RemoveCurrent ( ) ; a . ViewPort . SetCurrent ( e [ 2 ] , e [ 3 ] ) } } } ; a . Element . svg . prototype = new a . Element . RenderedElementBase ; a . Element . rect = function ( c ) { this . base = a . Element . PathElementBase ; this . base ( c ) ; this . path = function ( d ) { var b = this . attribute ( "x" ) . Length . toPixels ( "x" ) , c = this . attribute ( "y" ) . Length . toPixels ( "y" ) , e = this . attribute ( "width" ) . Length . toPixels ( "x" ) , f = this . attribute ( "height" ) . Length . toPixels ( "y" ) , g = this . attribute ( "rx" ) . Length . toPixels ( "x" ) ,
j = this . attribute ( "ry" ) . Length . toPixels ( "y" ) ; this . attribute ( "rx" ) . hasValue ( ) && ! this . attribute ( "ry" ) . hasValue ( ) && ( j = g ) ; this . attribute ( "ry" ) . hasValue ( ) && ! this . attribute ( "rx" ) . hasValue ( ) && ( g = j ) ; d != null && ( d . beginPath ( ) , d . moveTo ( b + g , c ) , d . lineTo ( b + e - g , c ) , d . quadraticCurveTo ( b + e , c , b + e , c + j ) , d . lineTo ( b + e , c + f - j ) , d . quadraticCurveTo ( b + e , c + f , b + e - g , c + f ) , d . lineTo ( b + g , c + f ) , d . quadraticCurveTo ( b , c + f , b , c + f - j ) , d . lineTo ( b , c + j ) , d . quadraticCurveTo ( b , c , b + g , c ) , d . closePath ( ) ) ; return new a . BoundingBox ( b , c , b + e , c + f ) } } ; a . Element . rect . prototype =
new a . Element . PathElementBase ; a . Element . circle = function ( c ) { this . base = a . Element . PathElementBase ; this . base ( c ) ; this . path = function ( d ) { var b = this . attribute ( "cx" ) . Length . toPixels ( "x" ) , c = this . attribute ( "cy" ) . Length . toPixels ( "y" ) , e = this . attribute ( "r" ) . Length . toPixels ( ) ; d != null && ( d . beginPath ( ) , d . arc ( b , c , e , 0 , Math . PI * 2 , ! 0 ) , d . closePath ( ) ) ; return new a . BoundingBox ( b - e , c - e , b + e , c + e ) } } ; a . Element . circle . prototype = new a . Element . PathElementBase ; a . Element . ellipse = function ( c ) { this . base = a . Element . PathElementBase ; this . base ( c ) ;
this . path = function ( d ) { var b = 4 * ( ( Math . sqrt ( 2 ) - 1 ) / 3 ) , c = this . attribute ( "rx" ) . Length . toPixels ( "x" ) , e = this . attribute ( "ry" ) . Length . toPixels ( "y" ) , f = this . attribute ( "cx" ) . Length . toPixels ( "x" ) , g = this . attribute ( "cy" ) . Length . toPixels ( "y" ) ; d != null && ( d . beginPath ( ) , d . moveTo ( f , g - e ) , d . bezierCurveTo ( f + b * c , g - e , f + c , g - b * e , f + c , g ) , d . bezierCurveTo ( f + c , g + b * e , f + b * c , g + e , f , g + e ) , d . bezierCurveTo ( f - b * c , g + e , f - c , g + b * e , f - c , g ) , d . bezierCurveTo ( f - c , g - b * e , f - b * c , g - e , f , g - e ) , d . closePath ( ) ) ; return new a . BoundingBox ( f - c , g - e , f + c , g + e ) } } ; a . Element . ellipse . prototype =
new a . Element . PathElementBase ; a . Element . line = function ( c ) { this . base = a . Element . PathElementBase ; this . base ( c ) ; this . getPoints = function ( ) { return [ new a . Point ( this . attribute ( "x1" ) . Length . toPixels ( "x" ) , this . attribute ( "y1" ) . Length . toPixels ( "y" ) ) , new a . Point ( this . attribute ( "x2" ) . Length . toPixels ( "x" ) , this . attribute ( "y2" ) . Length . toPixels ( "y" ) ) ] } ; this . path = function ( d ) { var b = this . getPoints ( ) ; d != null && ( d . beginPath ( ) , d . moveTo ( b [ 0 ] . x , b [ 0 ] . y ) , d . lineTo ( b [ 1 ] . x , b [ 1 ] . y ) ) ; return new a . BoundingBox ( b [ 0 ] . x , b [ 0 ] . y , b [ 1 ] . x , b [ 1 ] . y ) } ;
this . getMarkers = function ( ) { var a = this . getPoints ( ) , b = a [ 0 ] . angleTo ( a [ 1 ] ) ; return [ [ a [ 0 ] , b ] , [ a [ 1 ] , b ] ] } } ; a . Element . line . prototype = new a . Element . PathElementBase ; a . Element . polyline = function ( c ) { this . base = a . Element . PathElementBase ; this . base ( c ) ; this . points = a . CreatePath ( this . attribute ( "points" ) . value ) ; this . path = function ( d ) { var b = new a . BoundingBox ( this . points [ 0 ] . x , this . points [ 0 ] . y ) ; d != null && ( d . beginPath ( ) , d . moveTo ( this . points [ 0 ] . x , this . points [ 0 ] . y ) ) ; for ( var c = 1 ; c < this . points . length ; c ++ ) b . addPoint ( this . points [ c ] . x ,
this . points [ c ] . y ) , d != null && d . lineTo ( this . points [ c ] . x , this . points [ c ] . y ) ; return b } ; this . getMarkers = function ( ) { for ( var a = [ ] , b = 0 ; b < this . points . length - 1 ; b ++ ) a . push ( [ this . points [ b ] , this . points [ b ] . angleTo ( this . points [ b + 1 ] ) ] ) ; a . push ( [ this . points [ this . points . length - 1 ] , a [ a . length - 1 ] [ 1 ] ] ) ; return a } } ; a . Element . polyline . prototype = new a . Element . PathElementBase ; a . Element . polygon = function ( c ) { this . base = a . Element . polyline ; this . base ( c ) ; this . basePath = this . path ; this . path = function ( a ) { var b = this . basePath ( a ) ; a != null && ( a . lineTo ( this . points [ 0 ] . x ,
this . points [ 0 ] . y ) , a . closePath ( ) ) ; return b } } ; a . Element . polygon . prototype = new a . Element . polyline ; a . Element . path = function ( c ) { this . base = a . Element . PathElementBase ; this . base ( c ) ; c = this . attribute ( "d" ) . value ; c = c . replace ( /,/gm , " " ) ; c = c . replace ( /([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm , "$1 $2" ) ; c = c . replace ( /([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm , "$1 $2" ) ; c = c . replace ( /([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm , "$1 $2" ) ; c = c . replace ( /([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm , "$1 $2" ) ; c = c . replace ( /([0-9])([+\-])/gm ,
"$1 $2" ) ; c = c . replace ( /(\.[0-9]*)(\.)/gm , "$1 $2" ) ; c = c . replace ( /([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm , "$1 $3 $4 " ) ; c = a . compressSpaces ( c ) ; c = a . trim ( c ) ; this . PathParser = new function ( d ) { this . tokens = d . split ( " " ) ; this . reset = function ( ) { this . i = - 1 ; this . previousCommand = this . command = "" ; this . start = new a . Point ( 0 , 0 ) ; this . control = new a . Point ( 0 , 0 ) ; this . current = new a . Point ( 0 , 0 ) ; this . points = [ ] ; this . angles = [ ] } ; this . isEnd = function ( ) { return this . i >= this . tokens . length - 1 } ; this . isCommandOrEnd = function ( ) { return this . isEnd ( ) ?
! 0 : this . tokens [ this . i + 1 ] . match ( /^[A-Za-z]$/ ) != null } ; this . isRelativeCommand = function ( ) { return this . command == this . command . toLowerCase ( ) } ; this . getToken = function ( ) { this . i += 1 ; return this . tokens [ this . i ] } ; this . getScalar = function ( ) { return parseFloat ( this . getToken ( ) ) } ; this . nextCommand = function ( ) { this . previousCommand = this . command ; this . command = this . getToken ( ) } ; this . getPoint = function ( ) { return this . makeAbsolute ( new a . Point ( this . getScalar ( ) , this . getScalar ( ) ) ) } ; this . getAsControlPoint = function ( ) { var b = this . getPoint ( ) ;
return this . control = b } ; this . getAsCurrentPoint = function ( ) { var b = this . getPoint ( ) ; return this . current = b } ; this . getReflectedControlPoint = function ( ) { return this . previousCommand . toLowerCase ( ) != "c" && this . previousCommand . toLowerCase ( ) != "s" ? this . current : new a . Point ( 2 * this . current . x - this . control . x , 2 * this . current . y - this . control . y ) } ; this . makeAbsolute = function ( b ) { if ( this . isRelativeCommand ( ) ) b . x = this . current . x + b . x , b . y = this . current . y + b . y ; return b } ; this . addMarker = function ( b , a , d ) { d != null && this . angles . length > 0 && this . angles [ this . angles . length -
1 ] == null && ( this . angles [ this . angles . length - 1 ] = this . points [ this . points . length - 1 ] . angleTo ( d ) ) ; this . addMarkerAngle ( b , a == null ? null : a . angleTo ( b ) ) } ; this . addMarkerAngle = function ( b , a ) { this . points . push ( b ) ; this . angles . push ( a ) } ; this . getMarkerPoints = function ( ) { return this . points } ; this . getMarkerAngles = function ( ) { for ( var b = 0 ; b < this . angles . length ; b ++ ) if ( this . angles [ b ] == null ) for ( var a = b + 1 ; a < this . angles . length ; a ++ ) if ( this . angles [ a ] != null ) { this . angles [ b ] = this . angles [ a ] ; break } return this . angles } } ( c ) ; this . path = function ( d ) { var b =
this . PathParser ; b . reset ( ) ; var c = new a . BoundingBox ; for ( d != null && d . beginPath ( ) ; ! b . isEnd ( ) ; ) switch ( b . nextCommand ( ) , b . command . toUpperCase ( ) ) { case "M" : var e = b . getAsCurrentPoint ( ) ; b . addMarker ( e ) ; c . addPoint ( e . x , e . y ) ; d != null && d . moveTo ( e . x , e . y ) ; for ( b . start = b . current ; ! b . isCommandOrEnd ( ) ; ) e = b . getAsCurrentPoint ( ) , b . addMarker ( e , b . start ) , c . addPoint ( e . x , e . y ) , d != null && d . lineTo ( e . x , e . y ) ; break ; case "L" : for ( ; ! b . isCommandOrEnd ( ) ; ) { var f = b . current , e = b . getAsCurrentPoint ( ) ; b . addMarker ( e , f ) ; c . addPoint ( e . x , e . y ) ; d != null &&
d . lineTo ( e . x , e . y ) } break ; case "H" : for ( ; ! b . isCommandOrEnd ( ) ; ) e = new a . Point ( ( b . isRelativeCommand ( ) ? b . current . x : 0 ) + b . getScalar ( ) , b . current . y ) , b . addMarker ( e , b . current ) , b . current = e , c . addPoint ( b . current . x , b . current . y ) , d != null && d . lineTo ( b . current . x , b . current . y ) ; break ; case "V" : for ( ; ! b . isCommandOrEnd ( ) ; ) e = new a . Point ( b . current . x , ( b . isRelativeCommand ( ) ? b . current . y : 0 ) + b . getScalar ( ) ) , b . addMarker ( e , b . current ) , b . current = e , c . addPoint ( b . current . x , b . current . y ) , d != null && d . lineTo ( b . current . x , b . current . y ) ; break ; case "C" : for ( ; ! b . isCommandOrEnd ( ) ; ) { var g =
b . current , f = b . getPoint ( ) , j = b . getAsControlPoint ( ) , e = b . getAsCurrentPoint ( ) ; b . addMarker ( e , j , f ) ; c . addBezierCurve ( g . x , g . y , f . x , f . y , j . x , j . y , e . x , e . y ) ; d != null && d . bezierCurveTo ( f . x , f . y , j . x , j . y , e . x , e . y ) } break ; case "S" : for ( ; ! b . isCommandOrEnd ( ) ; ) g = b . current , f = b . getReflectedControlPoint ( ) , j = b . getAsControlPoint ( ) , e = b . getAsCurrentPoint ( ) , b . addMarker ( e , j , f ) , c . addBezierCurve ( g . x , g . y , f . x , f . y , j . x , j . y , e . x , e . y ) , d != null && d . bezierCurveTo ( f . x , f . y , j . x , j . y , e . x , e . y ) ; break ; case "Q" : for ( ; ! b . isCommandOrEnd ( ) ; ) g = b . current , j = b . getAsControlPoint ( ) ,
e = b . getAsCurrentPoint ( ) , b . addMarker ( e , j , j ) , c . addQuadraticCurve ( g . x , g . y , j . x , j . y , e . x , e . y ) , d != null && d . quadraticCurveTo ( j . x , j . y , e . x , e . y ) ; break ; case "T" : for ( ; ! b . isCommandOrEnd ( ) ; ) g = b . current , j = b . getReflectedControlPoint ( ) , b . control = j , e = b . getAsCurrentPoint ( ) , b . addMarker ( e , j , j ) , c . addQuadraticCurve ( g . x , g . y , j . x , j . y , e . x , e . y ) , d != null && d . quadraticCurveTo ( j . x , j . y , e . x , e . y ) ; break ; case "A" : for ( ; ! b . isCommandOrEnd ( ) ; ) { var g = b . current , h = b . getScalar ( ) , l = b . getScalar ( ) , f = b . getScalar ( ) * ( Math . PI / 180 ) , o = b . getScalar ( ) , j = b . getScalar ( ) ,
e = b . getAsCurrentPoint ( ) , n = new a . Point ( Math . cos ( f ) * ( g . x - e . x ) / 2 + Math . sin ( f ) * ( g . y - e . y ) / 2 , - Math . sin ( f ) * ( g . x - e . x ) / 2 + Math . cos ( f ) * ( g . y - e . y ) / 2 ) , q = Math . pow ( n . x , 2 ) / Math . pow ( h , 2 ) + Math . pow ( n . y , 2 ) / Math . pow ( l , 2 ) ; q > 1 && ( h *= Math . sqrt ( q ) , l *= Math . sqrt ( q ) ) ; o = ( o == j ? - 1 : 1 ) * Math . sqrt ( ( Math . pow ( h , 2 ) * Math . pow ( l , 2 ) - Math . pow ( h , 2 ) * Math . pow ( n . y , 2 ) - Math . pow ( l , 2 ) * Math . pow ( n . x , 2 ) ) / ( Math . pow ( h , 2 ) * Math . pow ( n . y , 2 ) + Math . pow ( l , 2 ) * Math . pow ( n . x , 2 ) ) ) ; isNaN ( o ) && ( o = 0 ) ; var p = new a . Point ( o * h * n . y / l , o * - l * n . x / h ) , g = new a . Point ( ( g . x + e . x ) / 2 + Math . cos ( f ) *
p . x - Math . sin ( f ) * p . y , ( g . y + e . y ) / 2 + Math . sin ( f ) * p . x + Math . cos ( f ) * p . y ) , m = function ( b , a ) { return ( b [ 0 ] * a [ 0 ] + b [ 1 ] * a [ 1 ] ) / ( Math . sqrt ( Math . pow ( b [ 0 ] , 2 ) + Math . pow ( b [ 1 ] , 2 ) ) * Math . sqrt ( Math . pow ( a [ 0 ] , 2 ) + Math . pow ( a [ 1 ] , 2 ) ) ) } , s = function ( b , a ) { return ( b [ 0 ] * a [ 1 ] < b [ 1 ] * a [ 0 ] ? - 1 : 1 ) * Math . acos ( m ( b , a ) ) } , o = s ( [ 1 , 0 ] , [ ( n . x - p . x ) / h , ( n . y - p . y ) / l ] ) , q = [ ( n . x - p . x ) / h , ( n . y - p . y ) / l ] , p = [ ( - n . x - p . x ) / h , ( - n . y - p . y ) / l ] , n = s ( q , p ) ; if ( m ( q , p ) <= - 1 ) n = Math . PI ; m ( q , p ) >= 1 && ( n = 0 ) ; j == 0 && n > 0 && ( n -= 2 * Math . PI ) ; j == 1 && n < 0 && ( n += 2 * Math . PI ) ; q = new a . Point ( g . x - h * Math . cos ( ( o + n ) /
2 ) , g . y - l * Math . sin ( ( o + n ) / 2 ) ) ; b . addMarkerAngle ( q , ( o + n ) / 2 + ( j == 0 ? 1 : - 1 ) * Math . PI / 2 ) ; b . addMarkerAngle ( e , n + ( j == 0 ? 1 : - 1 ) * Math . PI / 2 ) ; c . addPoint ( e . x , e . y ) ; d != null && ( m = h > l ? h : l , e = h > l ? 1 : h / l , h = h > l ? l / h : 1 , d . translate ( g . x , g . y ) , d . rotate ( f ) , d . scale ( e , h ) , d . arc ( 0 , 0 , m , o , o + n , 1 - j ) , d . scale ( 1 / e , 1 / h ) , d . rotate ( - f ) , d . translate ( - g . x , - g . y ) ) } break ; case "Z" : d != null && d . closePath ( ) , b . current = b . start } return c } ; this . getMarkers = function ( ) { for ( var a = this . PathParser . getMarkerPoints ( ) , b = this . PathParser . getMarkerAngles ( ) , c = [ ] , e = 0 ; e < a . length ; e ++ ) c . push ( [ a [ e ] ,
b [ e ] ] ) ; return c } } ; a . Element . path . prototype = new a . Element . PathElementBase ; a . Element . pattern = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . createPattern = function ( d ) { var b = new a . Element . svg ; b . attributes . viewBox = new a . Property ( "viewBox" , this . attribute ( "viewBox" ) . value ) ; b . attributes . x = new a . Property ( "x" , this . attribute ( "x" ) . value ) ; b . attributes . y = new a . Property ( "y" , this . attribute ( "y" ) . value ) ; b . attributes . width = new a . Property ( "width" , this . attribute ( "width" ) . value ) ; b . attributes . height = new a . Property ( "height" ,
this . attribute ( "height" ) . value ) ; b . children = this . children ; var c = document . createElement ( "canvas" ) ; c . width = this . attribute ( "width" ) . Length . toPixels ( "x" ) ; c . height = this . attribute ( "height" ) . Length . toPixels ( "y" ) ; b . render ( c . getContext ( "2d" ) ) ; return d . createPattern ( c , "repeat" ) } } ; a . Element . pattern . prototype = new a . Element . ElementBase ; a . Element . marker = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . baseRender = this . render ; this . render = function ( d , b , c ) { d . translate ( b . x , b . y ) ; this . attribute ( "orient" ) . valueOrDefault ( "auto" ) ==
"auto" && d . rotate ( c ) ; this . attribute ( "markerUnits" ) . valueOrDefault ( "strokeWidth" ) == "strokeWidth" && d . scale ( d . lineWidth , d . lineWidth ) ; d . save ( ) ; var e = new a . Element . svg ; e . attributes . viewBox = new a . Property ( "viewBox" , this . attribute ( "viewBox" ) . value ) ; e . attributes . refX = new a . Property ( "refX" , this . attribute ( "refX" ) . value ) ; e . attributes . refY = new a . Property ( "refY" , this . attribute ( "refY" ) . value ) ; e . attributes . width = new a . Property ( "width" , this . attribute ( "markerWidth" ) . value ) ; e . attributes . height = new a . Property ( "height" ,
this . attribute ( "markerHeight" ) . value ) ; e . attributes . fill = new a . Property ( "fill" , this . attribute ( "fill" ) . valueOrDefault ( "black" ) ) ; e . attributes . stroke = new a . Property ( "stroke" , this . attribute ( "stroke" ) . valueOrDefault ( "none" ) ) ; e . children = this . children ; e . render ( d ) ; d . restore ( ) ; this . attribute ( "markerUnits" ) . valueOrDefault ( "strokeWidth" ) == "strokeWidth" && d . scale ( 1 / d . lineWidth , 1 / d . lineWidth ) ; this . attribute ( "orient" ) . valueOrDefault ( "auto" ) == "auto" && d . rotate ( - c ) ; d . translate ( - b . x , - b . y ) } } ; a . Element . marker . prototype =
new a . Element . ElementBase ; a . Element . defs = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . render = function ( ) { } } ; a . Element . defs . prototype = new a . Element . ElementBase ; a . Element . GradientBase = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . gradientUnits = this . attribute ( "gradientUnits" ) . valueOrDefault ( "objectBoundingBox" ) ; this . stops = [ ] ; for ( c = 0 ; c < this . children . length ; c ++ ) this . stops . push ( this . children [ c ] ) ; this . getGradient = function ( ) { } ; this . createGradient = function ( d , b ) { var c = this ; this . attribute ( "xlink:href" ) . hasValue ( ) &&
( c = this . attribute ( "xlink:href" ) . Definition . getDefinition ( ) ) ; for ( var e = this . getGradient ( d , b ) , f = 0 ; f < c . stops . length ; f ++ ) e . addColorStop ( c . stops [ f ] . offset , c . stops [ f ] . color ) ; if ( this . attribute ( "gradientTransform" ) . hasValue ( ) ) { c = a . ViewPort . viewPorts [ 0 ] ; f = new a . Element . rect ; f . attributes . x = new a . Property ( "x" , - a . MAX _VIRTUAL _PIXELS / 3 ) ; f . attributes . y = new a . Property ( "y" , - a . MAX _VIRTUAL _PIXELS / 3 ) ; f . attributes . width = new a . Property ( "width" , a . MAX _VIRTUAL _PIXELS ) ; f . attributes . height = new a . Property ( "height" , a . MAX _VIRTUAL _PIXELS ) ;
var g = new a . Element . g ; g . attributes . transform = new a . Property ( "transform" , this . attribute ( "gradientTransform" ) . value ) ; g . children = [ f ] ; f = new a . Element . svg ; f . attributes . x = new a . Property ( "x" , 0 ) ; f . attributes . y = new a . Property ( "y" , 0 ) ; f . attributes . width = new a . Property ( "width" , c . width ) ; f . attributes . height = new a . Property ( "height" , c . height ) ; f . children = [ g ] ; g = document . createElement ( "canvas" ) ; g . width = c . width ; g . height = c . height ; c = g . getContext ( "2d" ) ; c . fillStyle = e ; f . render ( c ) ; return c . createPattern ( g , "no-repeat" ) } return e } } ;
a . Element . GradientBase . prototype = new a . Element . ElementBase ; a . Element . linearGradient = function ( c ) { this . base = a . Element . GradientBase ; this . base ( c ) ; this . getGradient = function ( a , b ) { var c = b . getBoundingBox ( ) , e = this . gradientUnits == "objectBoundingBox" ? c . x ( ) + c . width ( ) * this . attribute ( "x1" ) . numValue ( ) : this . attribute ( "x1" ) . Length . toPixels ( "x" ) , f = this . gradientUnits == "objectBoundingBox" ? c . y ( ) + c . height ( ) * this . attribute ( "y1" ) . numValue ( ) : this . attribute ( "y1" ) . Length . toPixels ( "y" ) , g = this . gradientUnits == "objectBoundingBox" ?
c . x ( ) + c . width ( ) * this . attribute ( "x2" ) . numValue ( ) : this . attribute ( "x2" ) . Length . toPixels ( "x" ) , c = this . gradientUnits == "objectBoundingBox" ? c . y ( ) + c . height ( ) * this . attribute ( "y2" ) . numValue ( ) : this . attribute ( "y2" ) . Length . toPixels ( "y" ) ; return a . createLinearGradient ( e , f , g , c ) } } ; a . Element . linearGradient . prototype = new a . Element . GradientBase ; a . Element . radialGradient = function ( c ) { this . base = a . Element . GradientBase ; this . base ( c ) ; this . getGradient = function ( a , b ) { var c = b . getBoundingBox ( ) , e = this . gradientUnits == "objectBoundingBox" ?
c . x ( ) + c . width ( ) * this . attribute ( "cx" ) . numValue ( ) : this . attribute ( "cx" ) . Length . toPixels ( "x" ) , f = this . gradientUnits == "objectBoundingBox" ? c . y ( ) + c . height ( ) * this . attribute ( "cy" ) . numValue ( ) : this . attribute ( "cy" ) . Length . toPixels ( "y" ) , g = e , j = f ; this . attribute ( "fx" ) . hasValue ( ) && ( g = this . gradientUnits == "objectBoundingBox" ? c . x ( ) + c . width ( ) * this . attribute ( "fx" ) . numValue ( ) : this . attribute ( "fx" ) . Length . toPixels ( "x" ) ) ; this . attribute ( "fy" ) . hasValue ( ) && ( j = this . gradientUnits == "objectBoundingBox" ? c . y ( ) + c . height ( ) * this . attribute ( "fy" ) . numValue ( ) :
this . attribute ( "fy" ) . Length . toPixels ( "y" ) ) ; c = this . gradientUnits == "objectBoundingBox" ? ( c . width ( ) + c . height ( ) ) / 2 * this . attribute ( "r" ) . numValue ( ) : this . attribute ( "r" ) . Length . toPixels ( ) ; return a . createRadialGradient ( g , j , 0 , e , f , c ) } } ; a . Element . radialGradient . prototype = new a . Element . GradientBase ; a . Element . stop = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . offset = this . attribute ( "offset" ) . numValue ( ) ; c = this . style ( "stop-color" ) ; this . style ( "stop-opacity" ) . hasValue ( ) && ( c = c . Color . addOpacity ( this . style ( "stop-opacity" ) . value ) ) ;
this . color = c . value } ; a . Element . stop . prototype = new a . Element . ElementBase ; a . Element . AnimateBase = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; a . Animations . push ( this ) ; this . duration = 0 ; this . begin = this . attribute ( "begin" ) . Time . toMilliseconds ( ) ; this . maxDuration = this . begin + this . attribute ( "dur" ) . Time . toMilliseconds ( ) ; this . getProperty = function ( ) { var a = this . attribute ( "attributeType" ) . value , b = this . attribute ( "attributeName" ) . value ; return a == "CSS" ? this . parent . style ( b , ! 0 ) : this . parent . attribute ( b , ! 0 ) } ; this . initialValue =
null ; this . removed = ! 1 ; this . calcValue = function ( ) { return "" } ; this . update = function ( a ) { if ( this . initialValue == null ) this . initialValue = this . getProperty ( ) . value ; if ( this . duration > this . maxDuration ) if ( this . attribute ( "repeatCount" ) . value == "indefinite" ) this . duration = 0 ; else return this . attribute ( "fill" ) . valueOrDefault ( "remove" ) == "remove" && ! this . removed ? ( this . removed = ! 0 , this . getProperty ( ) . value = this . initialValue , ! 0 ) : ! 1 ; this . duration += a ; a = ! 1 ; if ( this . begin < this . duration ) a = this . calcValue ( ) , this . attribute ( "type" ) . hasValue ( ) &&
( a = this . attribute ( "type" ) . value + "(" + a + ")" ) , this . getProperty ( ) . value = a , a = ! 0 ; return a } ; this . progress = function ( ) { return ( this . duration - this . begin ) / ( this . maxDuration - this . begin ) } } ; a . Element . AnimateBase . prototype = new a . Element . ElementBase ; a . Element . animate = function ( c ) { this . base = a . Element . AnimateBase ; this . base ( c ) ; this . calcValue = function ( ) { var a = this . attribute ( "from" ) . numValue ( ) , b = this . attribute ( "to" ) . numValue ( ) ; return a + ( b - a ) * this . progress ( ) } } ; a . Element . animate . prototype = new a . Element . AnimateBase ; a . Element . animateColor =
function ( c ) { this . base = a . Element . AnimateBase ; this . base ( c ) ; this . calcValue = function ( ) { var a = new RGBColor ( this . attribute ( "from" ) . value ) , b = new RGBColor ( this . attribute ( "to" ) . value ) ; if ( a . ok && b . ok ) { var c = a . r + ( b . r - a . r ) * this . progress ( ) , e = a . g + ( b . g - a . g ) * this . progress ( ) , a = a . b + ( b . b - a . b ) * this . progress ( ) ; return "rgb(" + parseInt ( c , 10 ) + "," + parseInt ( e , 10 ) + "," + parseInt ( a , 10 ) + ")" } return this . attribute ( "from" ) . value } } ; a . Element . animateColor . prototype = new a . Element . AnimateBase ; a . Element . animateTransform = function ( c ) { this . base =
a . Element . animate ; this . base ( c ) } ; a . Element . animateTransform . prototype = new a . Element . animate ; a . Element . font = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . horizAdvX = this . attribute ( "horiz-adv-x" ) . numValue ( ) ; this . isArabic = this . isRTL = ! 1 ; this . missingGlyph = this . fontFace = null ; this . glyphs = [ ] ; for ( c = 0 ; c < this . children . length ; c ++ ) { var d = this . children [ c ] ; if ( d . type == "font-face" ) this . fontFace = d , d . style ( "font-family" ) . hasValue ( ) && ( a . Definitions [ d . style ( "font-family" ) . value ] = this ) ; else if ( d . type == "missing-glyph" ) this . missingGlyph =
d ; else if ( d . type == "glyph" ) d . arabicForm != "" ? ( this . isArabic = this . isRTL = ! 0 , typeof this . glyphs [ d . unicode ] == "undefined" && ( this . glyphs [ d . unicode ] = [ ] ) , this . glyphs [ d . unicode ] [ d . arabicForm ] = d ) : this . glyphs [ d . unicode ] = d } } ; a . Element . font . prototype = new a . Element . ElementBase ; a . Element . fontface = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . ascent = this . attribute ( "ascent" ) . value ; this . descent = this . attribute ( "descent" ) . value ; this . unitsPerEm = this . attribute ( "units-per-em" ) . numValue ( ) } ; a . Element . fontface . prototype =
new a . Element . ElementBase ; a . Element . missingglyph = function ( c ) { this . base = a . Element . path ; this . base ( c ) ; this . horizAdvX = 0 } ; a . Element . missingglyph . prototype = new a . Element . path ; a . Element . glyph = function ( c ) { this . base = a . Element . path ; this . base ( c ) ; this . horizAdvX = this . attribute ( "horiz-adv-x" ) . numValue ( ) ; this . unicode = this . attribute ( "unicode" ) . value ; this . arabicForm = this . attribute ( "arabic-form" ) . value } ; a . Element . glyph . prototype = new a . Element . path ; a . Element . text = function ( c ) { this . base = a . Element . RenderedElementBase ;
this . base ( c ) ; if ( c != null ) { this . children = [ ] ; for ( var d = 0 ; d < c . childNodes . length ; d ++ ) { var b = c . childNodes [ d ] ; b . nodeType == 1 ? this . addChild ( b , ! 0 ) : b . nodeType == 3 && this . addChild ( new a . Element . tspan ( b ) , ! 1 ) } } this . baseSetContext = this . setContext ; this . setContext = function ( b ) { this . baseSetContext ( b ) ; if ( this . style ( "dominant-baseline" ) . hasValue ( ) ) b . textBaseline = this . style ( "dominant-baseline" ) . value ; if ( this . style ( "alignment-baseline" ) . hasValue ( ) ) b . textBaseline = this . style ( "alignment-baseline" ) . value } ; this . renderChildren =
function ( b ) { for ( var a = this . style ( "text-anchor" ) . valueOrDefault ( "start" ) , c = this . attribute ( "x" ) . Length . toPixels ( "x" ) , d = this . attribute ( "y" ) . Length . toPixels ( "y" ) , j = 0 ; j < this . children . length ; j ++ ) { var h = this . children [ j ] ; h . attribute ( "x" ) . hasValue ( ) ? h . x = h . attribute ( "x" ) . Length . toPixels ( "x" ) : ( h . attribute ( "dx" ) . hasValue ( ) && ( c += h . attribute ( "dx" ) . Length . toPixels ( "x" ) ) , h . x = c ) ; c = h . measureText ( b ) ; if ( a != "start" && ( j == 0 || h . attribute ( "x" ) . hasValue ( ) ) ) { for ( var l = c , o = j + 1 ; o < this . children . length ; o ++ ) { var n = this . children [ o ] ;
if ( n . attribute ( "x" ) . hasValue ( ) ) break ; l += n . measureText ( b ) } h . x -= a == "end" ? l : l / 2 } c = h . x + c ; h . attribute ( "y" ) . hasValue ( ) ? h . y = h . attribute ( "y" ) . Length . toPixels ( "y" ) : ( h . attribute ( "dy" ) . hasValue ( ) && ( d += h . attribute ( "dy" ) . Length . toPixels ( "y" ) ) , h . y = d ) ; d = h . y ; h . render ( b ) } } } ; a . Element . text . prototype = new a . Element . RenderedElementBase ; a . Element . TextElementBase = function ( c ) { this . base = a . Element . RenderedElementBase ; this . base ( c ) ; this . getGlyph = function ( a , b , c ) { var e = b [ c ] , f = null ; if ( a . isArabic ) { var g = "isolated" ; if ( ( c == 0 || b [ c -
1 ] == " " ) && c < b . length - 2 && b [ c + 1 ] != " " ) g = "terminal" ; c > 0 && b [ c - 1 ] != " " && c < b . length - 2 && b [ c + 1 ] != " " && ( g = "medial" ) ; if ( c > 0 && b [ c - 1 ] != " " && ( c == b . length - 1 || b [ c + 1 ] == " " ) ) g = "initial" ; typeof a . glyphs [ e ] != "undefined" && ( f = a . glyphs [ e ] [ g ] , f == null && a . glyphs [ e ] . type == "glyph" && ( f = a . glyphs [ e ] ) ) } else f = a . glyphs [ e ] ; if ( f == null ) f = a . missingGlyph ; return f } ; this . renderChildren = function ( c ) { var b = this . parent . style ( "font-family" ) . Definition . getDefinition ( ) ; if ( b != null ) { var k = this . parent . style ( "font-size" ) . numValueOrDefault ( a . Font . Parse ( a . ctx . font ) . fontSize ) ,
e = this . parent . style ( "font-style" ) . valueOrDefault ( a . Font . Parse ( a . ctx . font ) . fontStyle ) , f = this . getText ( ) ; b . isRTL && ( f = f . split ( "" ) . reverse ( ) . join ( "" ) ) ; for ( var g = a . ToNumberArray ( this . parent . attribute ( "dx" ) . value ) , j = 0 ; j < f . length ; j ++ ) { var h = this . getGlyph ( b , f , j ) , l = k / b . fontFace . unitsPerEm ; c . translate ( this . x , this . y ) ; c . scale ( l , - l ) ; var o = c . lineWidth ; c . lineWidth = c . lineWidth * b . fontFace . unitsPerEm / k ; e == "italic" && c . transform ( 1 , 0 , 0.4 , 1 , 0 , 0 ) ; h . render ( c ) ; e == "italic" && c . transform ( 1 , 0 , - 0.4 , 1 , 0 , 0 ) ; c . lineWidth = o ; c . scale ( 1 /
l , - 1 / l ) ; c . translate ( - this . x , - this . y ) ; this . x += k * ( h . horizAdvX || b . horizAdvX ) / b . fontFace . unitsPerEm ; typeof g [ j ] != "undefined" && ! isNaN ( g [ j ] ) && ( this . x += g [ j ] ) } } else c . strokeStyle != "" && c . strokeText ( a . compressSpaces ( this . getText ( ) ) , this . x , this . y ) , c . fillStyle != "" && c . fillText ( a . compressSpaces ( this . getText ( ) ) , this . x , this . y ) } ; this . getText = function ( ) { } ; this . measureText = function ( c ) { var b = this . parent . style ( "font-family" ) . Definition . getDefinition ( ) ; if ( b != null ) { var c = this . parent . style ( "font-size" ) . numValueOrDefault ( a . Font . Parse ( a . ctx . font ) . fontSize ) ,
k = 0 , e = this . getText ( ) ; b . isRTL && ( e = e . split ( "" ) . reverse ( ) . join ( "" ) ) ; for ( var f = a . ToNumberArray ( this . parent . attribute ( "dx" ) . value ) , g = 0 ; g < e . length ; g ++ ) { var j = this . getGlyph ( b , e , g ) ; k += ( j . horizAdvX || b . horizAdvX ) * c / b . fontFace . unitsPerEm ; typeof f [ g ] != "undefined" && ! isNaN ( f [ g ] ) && ( k += f [ g ] ) } return k } b = a . compressSpaces ( this . getText ( ) ) ; if ( ! c . measureText ) return b . length * 10 ; c . save ( ) ; this . setContext ( c ) ; b = c . measureText ( b ) . width ; c . restore ( ) ; return b } } ; a . Element . TextElementBase . prototype = new a . Element . RenderedElementBase ;
a . Element . tspan = function ( c ) { this . base = a . Element . TextElementBase ; this . base ( c ) ; this . text = c . nodeType == 3 ? c . nodeValue : c . childNodes . length > 0 ? c . childNodes [ 0 ] . nodeValue : c . text ; this . getText = function ( ) { return this . text } } ; a . Element . tspan . prototype = new a . Element . TextElementBase ; a . Element . tref = function ( c ) { this . base = a . Element . TextElementBase ; this . base ( c ) ; this . getText = function ( ) { var a = this . attribute ( "xlink:href" ) . Definition . getDefinition ( ) ; if ( a != null ) return a . children [ 0 ] . getText ( ) } } ; a . Element . tref . prototype = new a . Element . TextElementBase ;
a . Element . a = function ( c ) { this . base = a . Element . TextElementBase ; this . base ( c ) ; this . hasText = ! 0 ; for ( var d = 0 ; d < c . childNodes . length ; d ++ ) if ( c . childNodes [ d ] . nodeType != 3 ) this . hasText = ! 1 ; this . text = this . hasText ? c . childNodes [ 0 ] . nodeValue : "" ; this . getText = function ( ) { return this . text } ; this . baseRenderChildren = this . renderChildren ; this . renderChildren = function ( b ) { if ( this . hasText ) { this . baseRenderChildren ( b ) ; var c = new a . Property ( "fontSize" , a . Font . Parse ( a . ctx . font ) . fontSize ) ; a . Mouse . checkBoundingBox ( this , new a . BoundingBox ( this . x ,
this . y - c . Length . toPixels ( "y" ) , this . x + this . measureText ( b ) , this . y ) ) } else c = new a . Element . g , c . children = this . children , c . parent = this , c . render ( b ) } ; this . onclick = function ( ) { window . open ( this . attribute ( "xlink:href" ) . value ) } ; this . onmousemove = function ( ) { a . ctx . canvas . style . cursor = "pointer" } } ; a . Element . a . prototype = new a . Element . TextElementBase ; a . Element . image = function ( c ) { this . base = a . Element . RenderedElementBase ; this . base ( c ) ; a . Images . push ( this ) ; this . img = document . createElement ( "img" ) ; this . loaded = ! 1 ; var d = this ; this . img . onload =
function ( ) { d . loaded = ! 0 } ; this . img . src = this . attribute ( "xlink:href" ) . value ; this . renderChildren = function ( b ) { var c = this . attribute ( "x" ) . Length . toPixels ( "x" ) , d = this . attribute ( "y" ) . Length . toPixels ( "y" ) , f = this . attribute ( "width" ) . Length . toPixels ( "x" ) , g = this . attribute ( "height" ) . Length . toPixels ( "y" ) ; f == 0 || g == 0 || ( b . save ( ) , b . translate ( c , d ) , a . AspectRatio ( b , this . attribute ( "preserveAspectRatio" ) . value , f , this . img . width , g , this . img . height , 0 , 0 ) , b . drawImage ( this . img , 0 , 0 ) , b . restore ( ) ) } } ; a . Element . image . prototype = new a . Element . RenderedElementBase ;
a . Element . g = function ( c ) { this . base = a . Element . RenderedElementBase ; this . base ( c ) ; this . getBoundingBox = function ( ) { for ( var c = new a . BoundingBox , b = 0 ; b < this . children . length ; b ++ ) c . addBoundingBox ( this . children [ b ] . getBoundingBox ( ) ) ; return c } } ; a . Element . g . prototype = new a . Element . RenderedElementBase ; a . Element . symbol = function ( c ) { this . base = a . Element . RenderedElementBase ; this . base ( c ) ; this . baseSetContext = this . setContext ; this . setContext = function ( c ) { this . baseSetContext ( c ) ; if ( this . attribute ( "viewBox" ) . hasValue ( ) ) { var b =
a . ToNumberArray ( this . attribute ( "viewBox" ) . value ) , k = b [ 0 ] , e = b [ 1 ] ; width = b [ 2 ] ; height = b [ 3 ] ; a . AspectRatio ( c , this . attribute ( "preserveAspectRatio" ) . value , this . attribute ( "width" ) . Length . toPixels ( "x" ) , width , this . attribute ( "height" ) . Length . toPixels ( "y" ) , height , k , e ) ; a . ViewPort . SetCurrent ( b [ 2 ] , b [ 3 ] ) } } } ; a . Element . symbol . prototype = new a . Element . RenderedElementBase ; a . Element . style = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; for ( var c = c . childNodes [ 0 ] . nodeValue + ( c . childNodes . length > 1 ? c . childNodes [ 1 ] . nodeValue :
"" ) , c = c . replace ( /(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm , "" ) , c = a . compressSpaces ( c ) , c = c . split ( "}" ) , d = 0 ; d < c . length ; d ++ ) if ( a . trim ( c [ d ] ) != "" ) for ( var b = c [ d ] . split ( "{" ) , k = b [ 0 ] . split ( "," ) , b = b [ 1 ] . split ( ";" ) , e = 0 ; e < k . length ; e ++ ) { var f = a . trim ( k [ e ] ) ; if ( f != "" ) { for ( var g = { } , j = 0 ; j < b . length ; j ++ ) { var h = b [ j ] . indexOf ( ":" ) , l = b [ j ] . substr ( 0 , h ) , h = b [ j ] . substr ( h + 1 , b [ j ] . length - h ) ; l != null && h != null && ( g [ a . trim ( l ) ] = new a . Property ( a . trim ( l ) , a . trim ( h ) ) ) } a . Styles [ f ] = g ; if ( f == "@font-face" ) { f = g [ "font-family" ] . value . replace ( /"/g ,
"" ) ; g = g . src . value . split ( "," ) ; for ( j = 0 ; j < g . length ; j ++ ) if ( g [ j ] . indexOf ( 'format("svg")' ) > 0 ) { l = g [ j ] . indexOf ( "url" ) ; h = g [ j ] . indexOf ( ")" , l ) ; l = g [ j ] . substr ( l + 5 , h - l - 6 ) ; l = a . parseXml ( a . ajax ( l ) ) . getElementsByTagName ( "font" ) ; for ( h = 0 ; h < l . length ; h ++ ) { var o = a . CreateElement ( l [ h ] ) ; a . Definitions [ f ] = o } } } } } } ; a . Element . style . prototype = new a . Element . ElementBase ; a . Element . use = function ( c ) { this . base = a . Element . RenderedElementBase ; this . base ( c ) ; this . baseSetContext = this . setContext ; this . setContext = function ( a ) { this . baseSetContext ( a ) ;
this . attribute ( "x" ) . hasValue ( ) && a . translate ( this . attribute ( "x" ) . Length . toPixels ( "x" ) , 0 ) ; this . attribute ( "y" ) . hasValue ( ) && a . translate ( 0 , this . attribute ( "y" ) . Length . toPixels ( "y" ) ) } ; this . getDefinition = function ( ) { var a = this . attribute ( "xlink:href" ) . Definition . getDefinition ( ) ; if ( this . attribute ( "width" ) . hasValue ( ) ) a . attribute ( "width" , ! 0 ) . value = this . attribute ( "width" ) . value ; if ( this . attribute ( "height" ) . hasValue ( ) ) a . attribute ( "height" , ! 0 ) . value = this . attribute ( "height" ) . value ; return a } ; this . path = function ( a ) { var b =
this . getDefinition ( ) ; b != null && b . path ( a ) } ; this . renderChildren = function ( a ) { var b = this . getDefinition ( ) ; b != null && b . render ( a ) } } ; a . Element . use . prototype = new a . Element . RenderedElementBase ; a . Element . mask = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . apply = function ( a , b ) { var c = this . attribute ( "x" ) . Length . toPixels ( "x" ) , e = this . attribute ( "y" ) . Length . toPixels ( "y" ) , f = this . attribute ( "width" ) . Length . toPixels ( "x" ) , g = this . attribute ( "height" ) . Length . toPixels ( "y" ) , j = b . attribute ( "mask" ) . value ; b . attribute ( "mask" ) . value =
"" ; var h = document . createElement ( "canvas" ) ; h . width = c + f ; h . height = e + g ; var l = h . getContext ( "2d" ) ; this . renderChildren ( l ) ; var o = document . createElement ( "canvas" ) ; o . width = c + f ; o . height = e + g ; var n = o . getContext ( "2d" ) ; b . render ( n ) ; n . globalCompositeOperation = "destination-in" ; n . fillStyle = l . createPattern ( h , "no-repeat" ) ; n . fillRect ( 0 , 0 , c + f , e + g ) ; a . fillStyle = n . createPattern ( o , "no-repeat" ) ; a . fillRect ( 0 , 0 , c + f , e + g ) ; b . attribute ( "mask" ) . value = j } ; this . render = function ( ) { } } ; a . Element . mask . prototype = new a . Element . ElementBase ; a . Element . clipPath =
function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . apply = function ( a ) { for ( var b = 0 ; b < this . children . length ; b ++ ) this . children [ b ] . path && ( this . children [ b ] . path ( a ) , a . clip ( ) ) } ; this . render = function ( ) { } } ; a . Element . clipPath . prototype = new a . Element . ElementBase ; a . Element . filter = function ( c ) { this . base = a . Element . ElementBase ; this . base ( c ) ; this . apply = function ( a , b ) { var c = b . getBoundingBox ( ) , e = this . attribute ( "x" ) . Length . toPixels ( "x" ) , f = this . attribute ( "y" ) . Length . toPixels ( "y" ) ; if ( e == 0 || f == 0 ) e = c . x1 , f = c . y1 ; var g =
this . attribute ( "width" ) . Length . toPixels ( "x" ) , j = this . attribute ( "height" ) . Length . toPixels ( "y" ) ; if ( g == 0 || j == 0 ) g = c . width ( ) , j = c . height ( ) ; c = b . style ( "filter" ) . value ; b . style ( "filter" ) . value = "" ; var h = 0.2 * g , l = 0.2 * j , o = document . createElement ( "canvas" ) ; o . width = g + 2 * h ; o . height = j + 2 * l ; var n = o . getContext ( "2d" ) ; n . translate ( - e + h , - f + l ) ; b . render ( n ) ; for ( var q = 0 ; q < this . children . length ; q ++ ) this . children [ q ] . apply ( n , 0 , 0 , g + 2 * h , j + 2 * l ) ; a . drawImage ( o , 0 , 0 , g + 2 * h , j + 2 * l , e - h , f - l , g + 2 * h , j + 2 * l ) ; b . style ( "filter" , ! 0 ) . value = c } ; this . render =
function ( ) { } } ; a . Element . filter . prototype = new a . Element . ElementBase ; a . Element . feGaussianBlur = function ( c ) { function d ( a , c , d , f , g ) { for ( var j = 0 ; j < g ; j ++ ) for ( var h = 0 ; h < f ; h ++ ) for ( var l = a [ j * f * 4 + h * 4 + 3 ] / 255 , o = 0 ; o < 4 ; o ++ ) { for ( var n = d [ 0 ] * ( l == 0 ? 255 : a [ j * f * 4 + h * 4 + o ] ) * ( l == 0 || o == 3 ? 1 : l ) , q = 1 ; q < d . length ; q ++ ) { var p = Math . max ( h - q , 0 ) , m = a [ j * f * 4 + p * 4 + 3 ] / 255 , p = Math . min ( h + q , f - 1 ) , p = a [ j * f * 4 + p * 4 + 3 ] / 255 , s = d [ q ] , r ; m == 0 ? r = 255 : ( r = Math . max ( h - q , 0 ) , r = a [ j * f * 4 + r * 4 + o ] ) ; m = r * ( m == 0 || o == 3 ? 1 : m ) ; p == 0 ? r = 255 : ( r = Math . min ( h + q , f - 1 ) , r = a [ j * f * 4 + r * 4 + o ] ) ; n +=
s * ( m + r * ( p == 0 || o == 3 ? 1 : p ) ) } c [ h * g * 4 + j * 4 + o ] = n } } this . base = a . Element . ElementBase ; this . base ( c ) ; this . apply = function ( a , c , e , f , g ) { var e = this . attribute ( "stdDeviation" ) . numValue ( ) , c = a . getImageData ( 0 , 0 , f , g ) , e = Math . max ( e , 0.01 ) , j = Math . ceil ( e * 4 ) + 1 ; mask = [ ] ; for ( var h = 0 ; h < j ; h ++ ) mask [ h ] = Math . exp ( - 0.5 * ( h / e ) * ( h / e ) ) ; e = mask ; j = 0 ; for ( h = 1 ; h < e . length ; h ++ ) j += Math . abs ( e [ h ] ) ; j = 2 * j + Math . abs ( e [ 0 ] ) ; for ( h = 0 ; h < e . length ; h ++ ) e [ h ] /= j ; tmp = [ ] ; d ( c . data , tmp , e , f , g ) ; d ( tmp , c . data , e , g , f ) ; a . clearRect ( 0 , 0 , f , g ) ; a . putImageData ( c , 0 , 0 ) } } ; a . Element . filter . prototype =
new a . Element . feGaussianBlur ; a . Element . title = function ( ) { } ; a . Element . title . prototype = new a . Element . ElementBase ; a . Element . desc = function ( ) { } ; a . Element . desc . prototype = new a . Element . ElementBase ; a . Element . MISSING = function ( a ) { console . log ( "ERROR: Element '" + a . nodeName + "' not yet implemented." ) } ; a . Element . MISSING . prototype = new a . Element . ElementBase ; a . CreateElement = function ( c ) { var d = c . nodeName . replace ( /^[^:]+:/ , "" ) , d = d . replace ( /\-/g , "" ) , b = null , b = typeof a . Element [ d ] != "undefined" ? new a . Element [ d ] ( c ) : new a . Element . MISSING ( c ) ;
b . type = c . nodeName ; return b } ; a . load = function ( c , d ) { a . loadXml ( c , a . ajax ( d ) ) } ; a . loadXml = function ( c , d ) { a . loadXmlDoc ( c , a . parseXml ( d ) ) } ; a . loadXmlDoc = function ( c , d ) { a . init ( c ) ; var b = function ( a ) { for ( var b = c . canvas ; b ; ) a . x -= b . offsetLeft , a . y -= b . offsetTop , b = b . offsetParent ; window . scrollX && ( a . x += window . scrollX ) ; window . scrollY && ( a . y += window . scrollY ) ; return a } ; if ( a . opts . ignoreMouse != ! 0 ) c . canvas . onclick = function ( c ) { c = b ( new a . Point ( c != null ? c . clientX : event . clientX , c != null ? c . clientY : event . clientY ) ) ; a . Mouse . onclick ( c . x , c . y ) } ,
c . canvas . onmousemove = function ( c ) { c = b ( new a . Point ( c != null ? c . clientX : event . clientX , c != null ? c . clientY : event . clientY ) ) ; a . Mouse . onmousemove ( c . x , c . y ) } ; var k = a . CreateElement ( d . documentElement ) , e = k . root = ! 0 , f = function ( ) { a . ViewPort . Clear ( ) ; c . canvas . parentNode && a . ViewPort . SetCurrent ( c . canvas . parentNode . clientWidth , c . canvas . parentNode . clientHeight ) ; if ( a . opts . ignoreDimensions != ! 0 ) { if ( k . style ( "width" ) . hasValue ( ) ) c . canvas . width = k . style ( "width" ) . Length . toPixels ( "x" ) , c . canvas . style . width = c . canvas . width + "px" ; if ( k . style ( "height" ) . hasValue ( ) ) c . canvas . height =
k . style ( "height" ) . Length . toPixels ( "y" ) , c . canvas . style . height = c . canvas . height + "px" } var b = c . canvas . clientWidth || c . canvas . width , d = c . canvas . clientHeight || c . canvas . height ; a . ViewPort . SetCurrent ( b , d ) ; if ( a . opts != null && a . opts . offsetX != null ) k . attribute ( "x" , ! 0 ) . value = a . opts . offsetX ; if ( a . opts != null && a . opts . offsetY != null ) k . attribute ( "y" , ! 0 ) . value = a . opts . offsetY ; if ( a . opts != null && a . opts . scaleWidth != null && a . opts . scaleHeight != null ) { var f = 1 , g = 1 ; k . attribute ( "width" ) . hasValue ( ) && ( f = k . attribute ( "width" ) . Length . toPixels ( "x" ) /
a . opts . scaleWidth ) ; k . attribute ( "height" ) . hasValue ( ) && ( g = k . attribute ( "height" ) . Length . toPixels ( "y" ) / a . opts . scaleHeight ) ; k . attribute ( "width" , ! 0 ) . value = a . opts . scaleWidth ; k . attribute ( "height" , ! 0 ) . value = a . opts . scaleHeight ; k . attribute ( "viewBox" , ! 0 ) . value = "0 0 " + b * f + " " + d * g ; k . attribute ( "preserveAspectRatio" , ! 0 ) . value = "none" } a . opts . ignoreClear != ! 0 && c . clearRect ( 0 , 0 , b , d ) ; k . render ( c ) ; e && ( e = ! 1 , a . opts != null && typeof a . opts . renderCallback == "function" && a . opts . renderCallback ( ) ) } , g = ! 0 ; a . ImagesLoaded ( ) && ( g = ! 1 , f ( ) ) ;
a . intervalID = setInterval ( function ( ) { var b = ! 1 ; g && a . ImagesLoaded ( ) && ( g = ! 1 , b = ! 0 ) ; a . opts . ignoreMouse != ! 0 && ( b |= a . Mouse . hasEvents ( ) ) ; if ( a . opts . ignoreAnimation != ! 0 ) for ( var c = 0 ; c < a . Animations . length ; c ++ ) b |= a . Animations [ c ] . update ( 1E3 / a . FRAMERATE ) ; a . opts != null && typeof a . opts . forceRedraw == "function" && a . opts . forceRedraw ( ) == ! 0 && ( b = ! 0 ) ; b && ( f ( ) , a . Mouse . runEvents ( ) ) } , 1E3 / a . FRAMERATE ) } ; a . stop = function ( ) { a . intervalID && clearInterval ( a . intervalID ) } ; a . Mouse = new function ( ) { this . events = [ ] ; this . hasEvents = function ( ) { return this . events . length !=
0 } ; this . onclick = function ( a , d ) { this . events . push ( { type : "onclick" , x : a , y : d , run : function ( a ) { if ( a . onclick ) a . onclick ( ) } } ) } ; this . onmousemove = function ( a , d ) { this . events . push ( { type : "onmousemove" , x : a , y : d , run : function ( a ) { if ( a . onmousemove ) a . onmousemove ( ) } } ) } ; this . eventElements = [ ] ; this . checkPath = function ( a , d ) { for ( var b = 0 ; b < this . events . length ; b ++ ) { var k = this . events [ b ] ; d . isPointInPath && d . isPointInPath ( k . x , k . y ) && ( this . eventElements [ b ] = a ) } } ; this . checkBoundingBox = function ( a , d ) { for ( var b = 0 ; b < this . events . length ; b ++ ) { var k =
this . events [ b ] ; d . isPointInBox ( k . x , k . y ) && ( this . eventElements [ b ] = a ) } } ; this . runEvents = function ( ) { a . ctx . canvas . style . cursor = "" ; for ( var c = 0 ; c < this . events . length ; c ++ ) for ( var d = this . events [ c ] , b = this . eventElements [ c ] ; b ; ) d . run ( b ) , b = b . parent ; this . events = [ ] ; this . eventElements = [ ] } } ; return a } this . canvg = function ( a , c , d ) { if ( a == null && c == null && d == null ) for ( var c = document . getElementsByTagName ( "svg" ) , b = 0 ; b < c . length ; b ++ ) { a = c [ b ] ; d = document . createElement ( "canvas" ) ; d . width = a . clientWidth ; d . height = a . clientHeight ; a . parentNode . insertBefore ( d ,
a ) ; a . parentNode . removeChild ( a ) ; var k = document . createElement ( "div" ) ; k . appendChild ( a ) ; canvg ( d , k . innerHTML ) } else d = d || { } , typeof a == "string" && ( a = document . getElementById ( a ) ) , a . svg == null ? ( b = m ( ) , a . svg = b ) : ( b = a . svg , b . stop ( ) ) , b . opts = d , a = a . getContext ( "2d" ) , typeof c . documentElement != "undefined" ? b . loadXmlDoc ( a , c ) : c . substr ( 0 , 1 ) == "<" ? b . loadXml ( a , c ) : b . load ( a , c ) } } ) ( ) ;
if ( CanvasRenderingContext2D ) CanvasRenderingContext2D . prototype . drawSvg = function ( m , a , c , d , b ) { canvg ( this . canvas , m , { ignoreMouse : ! 0 , ignoreAnimation : ! 0 , ignoreDimensions : ! 0 , ignoreClear : ! 0 , offsetX : a , offsetY : c , scaleWidth : d , scaleHeight : b } ) } ;
( function ( m ) { var a = m . css , c = m . CanVGRenderer , d = m . SVGRenderer , b = m . extend , k = m . merge , e = m . addEvent , f = m . createElement , g = m . discardElement ; b ( c . prototype , d . prototype ) ; b ( c . prototype , { create : function ( a , b , c , d ) { this . setContainer ( b , c , d ) ; this . configure ( a ) } , setContainer : function ( a , b , c ) { var d = a . style , e = a . parentNode , g = d . left , d = d . top , k = a . offsetWidth , m = a . offsetHeight , s = { visibility : "hidden" , position : "absolute" } ; this . init . apply ( this , [ a , b , c ] ) ; this . canvas = f ( "canvas" , { width : k , height : m } , { position : "relative" , left : g , top : d } , a ) ;
this . ttLine = f ( "div" , null , s , e ) ; this . ttDiv = f ( "div" , null , s , e ) ; this . ttTimer = void 0 ; this . hiddenSvg = a = f ( "div" , { width : k , height : m } , { visibility : "hidden" , left : g , top : d } , e ) ; a . appendChild ( this . box ) } , configure : function ( b ) { var c = this , d = b . options . tooltip , f = d . borderWidth , g = c . ttDiv , m = d . style , p = c . ttLine , t = parseInt ( m . padding , 10 ) , m = k ( m , { padding : t + "px" , "background-color" : d . backgroundColor , "border-style" : "solid" , "border-width" : f + "px" , "border-radius" : d . borderRadius + "px" } ) ; d . shadow && ( m = k ( m , { "box-shadow" : "1px 1px 3px gray" ,
"-webkit-box-shadow" : "1px 1px 3px gray" } ) ) ; a ( g , m ) ; a ( p , { "border-left" : "1px solid darkgray" } ) ; e ( b , "tooltipRefresh" , function ( d ) { var e = b . container , f = e . offsetLeft , e = e . offsetTop , k ; g . innerHTML = d . text ; k = b . tooltip . getPosition ( g . offsetWidth , g . offsetHeight , { plotX : d . x , plotY : d . y } ) ; a ( g , { visibility : "visible" , left : k . x + "px" , top : k . y + "px" , "border-color" : d . borderColor } ) ; a ( p , { visibility : "visible" , left : f + d . x + "px" , top : e + b . plotTop + "px" , height : b . plotHeight + "px" } ) ; c . ttTimer !== void 0 && clearTimeout ( c . ttTimer ) ; c . ttTimer = setTimeout ( function ( ) { a ( g ,
{ visibility : "hidden" } ) ; a ( p , { visibility : "hidden" } ) } , 3E3 ) } ) } , destroy : function ( ) { g ( this . canvas ) ; this . ttTimer !== void 0 && clearTimeout ( this . ttTimer ) ; g ( this . ttLine ) ; g ( this . ttDiv ) ; g ( this . hiddenSvg ) ; return d . prototype . destroy . apply ( this ) } , color : function ( a , b , c ) { a && a . linearGradient && ( a = a . stops [ a . stops . length - 1 ] [ 1 ] ) ; return d . prototype . color . call ( this , a , b , c ) } , draw : function ( ) { window . canvg ( this . canvas , this . hiddenSvg . innerHTML ) } } ) } ) ( Highcharts ) ;