2019-05-06 16:08:46 +02:00
( function ( ) {
var DataViewer , LuaPlayground , PointCloudViewer ;
DataViewer = class DataViewer {
constructor ( data ) {
this . target = data ;
this . el = ( $ ( "<canvas>" ) ) . attr ( "class" , "viewer" ) [ 0 ] ;
2019-05-06 20:31:20 +02:00
this . offset = 10 ;
this . points = [ ] ;
this . preprocess ( ) ;
2019-05-06 16:08:46 +02:00
this . getBound ( ) ;
this . prepare ( ) ;
this . render ( ) ;
}
canvasPoint ( v ) {
2019-05-06 17:51:57 +02:00
return new paper . Point ( v [ 0 ] / this . target . resolution + this . base . x , - v [ 1 ] / this . target . resolution + this . base . y ) ;
2019-05-06 16:08:46 +02:00
}
2019-05-06 20:31:20 +02:00
preprocess ( ) {
return this . points = this . target . data ;
}
2019-05-06 16:08:46 +02:00
getBound ( ) {
2019-05-06 19:15:23 +02:00
var j , len , peak _rb , peak _tl , ref , start , v , x , y ;
2019-05-06 16:08:46 +02:00
peak _tl = {
x : 0 ,
y : 0
} ;
peak _rb = {
x : 0 ,
y : 0
} ;
start = null ;
2019-05-06 20:31:20 +02:00
ref = this . points ;
2019-05-06 19:15:23 +02:00
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
v = ref [ j ] ;
2019-05-06 16:08:46 +02:00
x = v [ 0 ] / this . target . resolution ;
y = v [ 1 ] / this . target . resolution ;
if ( x < peak _tl . x ) {
peak _tl . x = x ;
}
if ( y < peak _tl . y ) {
peak _tl . y = y ;
}
if ( x > peak _rb . x ) {
peak _rb . x = x ;
}
if ( y > peak _rb . y ) {
peak _rb . y = y ;
}
}
this . bound = [ peak _tl , peak _rb ] ;
this . base = {
x : 0 - this . bound [ 0 ] . x + this . offset ,
2019-05-06 17:51:57 +02:00
y : this . bound [ 1 ] . y + this . offset
2019-05-06 16:08:46 +02:00
} ;
this . width = peak _rb . x - peak _tl . x + 2 * this . offset ;
return this . height = peak _rb . y - peak _tl . y + 2 * this . offset ;
}
2019-05-06 19:15:23 +02:00
drawPoint ( v , color , size ) {
// center
return new paper . Path . Circle ( {
center : this . canvasPoint ( v ) ,
radius : size ,
fillColor : color
} ) ;
}
drawGrid ( size , color ) {
2019-05-06 20:31:20 +02:00
var end , i , path , start , text , wgridsize ;
2019-05-06 19:15:23 +02:00
wgridsize = this . target . resolution * size ;
// draw y line
2019-05-06 20:31:20 +02:00
i = Math . ceil ( this . bound [ 0 ] . x / size ) ;
while ( i * size < this . bound [ 1 ] . x ) {
start = new paper . Point ( i * size + this . base . x , - this . bound [ 0 ] . y + this . base . y ) ;
end = new paper . Point ( i * size + this . base . x , - this . bound [ 1 ] . y + this . base . y ) ;
2019-05-06 19:15:23 +02:00
path = new paper . Path ( ) ;
path . strokeColor = color ;
path . moveTo ( start ) ;
path . lineTo ( end ) ;
i ++ ;
}
// draw x line
2019-05-06 20:31:20 +02:00
i = Math . ceil ( this . bound [ 0 ] . y / size ) ;
while ( i * size < this . bound [ 1 ] . y ) {
start = new paper . Point ( this . bound [ 0 ] . x + this . base . x , - i * size + this . base . y ) ;
end = new paper . Point ( this . bound [ 1 ] . x + this . base . x , - i * size + this . base . y ) ;
2019-05-06 19:15:23 +02:00
path = new paper . Path ( ) ;
path . strokeColor = color ;
path . moveTo ( start ) ;
path . lineTo ( end ) ;
2019-05-06 20:31:20 +02:00
i ++ ;
2019-05-06 19:15:23 +02:00
}
2019-05-06 20:31:20 +02:00
// draw text
text = new paper . PointText ( this . bound [ 0 ] . x + this . base . x , this . base . y - this . bound [ 1 ] . y + this . offset ) ;
text . justification = 'left' ;
text . fillColor = '#494949' ;
return text . content = ` Resolution: ${ this . target . resolution } , grid size: ${ wgridsize } mm ` ;
2019-05-06 19:15:23 +02:00
}
drawAxis ( color ) {
var end , path , start ;
2019-05-06 16:08:46 +02:00
// x axis
path = new paper . Path ( ) ;
2019-05-06 19:15:23 +02:00
path . strokeColor = color ;
2019-05-06 20:31:20 +02:00
start = new paper . Point ( this . bound [ 0 ] . x + this . base . x , this . base . y ) ;
end = new paper . Point ( this . bound [ 1 ] . x + this . base . x , this . base . y ) ;
2019-05-06 16:08:46 +02:00
path . moveTo ( start ) ;
path . lineTo ( end ) ;
// y axis
path = new paper . Path ( ) ;
2019-05-06 19:15:23 +02:00
path . strokeColor = color ;
2019-05-06 20:31:20 +02:00
start = new paper . Point ( this . base . x , - this . bound [ 0 ] . y + this . base . y ) ;
end = new paper . Point ( this . base . x , - this . bound [ 1 ] . y + this . base . y ) ;
2019-05-06 16:08:46 +02:00
path . moveTo ( start ) ;
2019-05-06 19:15:23 +02:00
path . lineTo ( end ) ;
return this . drawPoint ( [ 0 , 0 ] , color , 3 ) ;
}
prepare ( ) {
var ctx ;
ctx = this . el . getContext ( "2d" ) ;
ctx . translate ( this . base . x , this . base . y ) ;
ctx . canvas . width = this . width ;
ctx . canvas . height = this . height ;
return paper . setup ( this . el ) ;
2019-05-06 16:08:46 +02:00
}
2019-05-06 19:15:23 +02:00
//tool = new paper.Tool()
//hitOptions = {
// segments: true,
// stroke: true,
// fill: true,
// tolerance: 5
//}
//tool.onMouseMove = (event) ->
// hitResult = paper.project.hitTest event.point, hitOptions
// return unless hitResult
// console.log hitResult
2019-05-06 16:08:46 +02:00
render ( ) { }
} ;
// sub class responsibility
PointCloudViewer = class PointCloudViewer extends DataViewer {
constructor ( data ) {
super ( data ) ;
}
2019-05-06 20:31:20 +02:00
p2c ( length , angle ) {
var rad ;
rad = angle * Math . PI / 180 ;
return [ length * Math . cos ( rad ) , length * Math . sin ( rad ) ] ;
}
preprocess ( ) {
var i , j , len , ref , results , v ;
if ( this . target . coordinate !== "polar" ) {
return this . points = this . target . data ;
}
this . point = [ ] ;
i = 0 ;
ref = this . target . data ;
results = [ ] ;
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
v = ref [ j ] ;
this . points . push ( this . p2c ( v , this . target . start + i * this . target . angularResolution ) ) ;
results . push ( i = i + 1 ) ;
}
return results ;
}
2019-05-06 16:08:46 +02:00
// point clound render
render ( ) {
2019-05-06 20:31:20 +02:00
var end , j , len , path , ref , start , v ;
2019-05-06 19:15:23 +02:00
this . drawGrid ( 20 , "#DBDBDB" ) ; // 20 px
this . drawAxis ( "#0A84FF" ) ;
2019-05-06 20:31:20 +02:00
ref = this . points ;
2019-05-06 19:15:23 +02:00
for ( j = 0 , len = ref . length ; j < len ; j ++ ) {
v = ref [ j ] ;
2019-05-06 20:31:20 +02:00
if ( this . target . coordinate === "polar" ) {
path = new paper . Path ( ) ;
path . strokeColor = '#c2a10e' ;
start = this . canvasPoint ( [ 0 , 0 ] ) ;
end = this . canvasPoint ( v ) ;
2019-05-06 16:08:46 +02:00
path . moveTo ( start ) ;
2019-05-06 20:31:20 +02:00
path . lineTo ( end ) ;
2019-05-06 16:08:46 +02:00
}
2019-05-06 20:31:20 +02:00
this . drawPoint ( v , "red" , 3 ) ;
2019-05-06 16:08:46 +02:00
}
return paper . view . draw ( ) ;
}
} ;
LuaPlayground = class LuaPlayground extends this . OS . GUI . BaseApplication {
constructor ( args ) {
super ( "LuaPlayground" , args ) ;
}
main ( ) {
var me ;
me = this ;
this . datarea = this . find ( "editorea" ) ;
this . output = this . find ( "output" ) ;
this . editor = ace . edit ( this . datarea ) ;
this . editor . setOptions ( {
enableBasicAutocompletion : true ,
enableLiveAutocompletion : true ,
fontSize : "10pt"
} ) ;
this . editor . getSession ( ) . setUseWrapMode ( true ) ;
this . editor . session . setMode ( "ace/mode/lua" ) ;
this . editor . setTheme ( "ace/theme/monokai" ) ;
this . on ( "vboxchange" , function ( ) {
return me . editor . resize ( ) ;
} ) ;
( this . find ( "log-clear" ) ) . set ( "onbtclick" , function ( e ) {
return me . log ( "clean" ) ;
} ) ;
2019-05-07 14:34:26 +02:00
( this . find ( "code-run" ) ) . set ( "onbtclick" , function ( e ) {
return me . run ( ) ;
} ) ;
( this . find ( "code-stop" ) ) . set ( "onbtclick" , function ( e ) {
if ( me . socket ) {
return me . socket . close ( ) ;
}
} ) ;
2019-05-06 16:08:46 +02:00
this . socket = null ;
return this . bindKey ( "CTRL-R" , function ( ) {
return me . run ( ) ;
} ) ;
}
menu ( ) {
var me , menu ;
me = this ;
menu = [
{
text : "__(Code)" ,
child : [
{
text : "__(Run)" ,
dataid : ` ${ this . name } -Run ` ,
shortcut : "C-R"
}
] ,
onmenuselect : function ( e ) {
return me . run ( ) ;
}
}
] ;
return menu ;
}
log ( t , m ) {
var p ;
if ( t === "clean" ) {
return $ ( this . output ) . empty ( ) ;
}
p = ( $ ( "<p>" ) ) . attr ( "class" , t . toLowerCase ( ) ) [ 0 ] ;
$ ( p ) . html ( ` ${ t } : ${ m . _ _ ( ) } ` ) ;
( $ ( this . output ) ) . append ( p ) ;
return ( $ ( this . output ) ) . scrollTop ( this . output . scrollHeight ) ;
}
run ( ) {
2019-08-30 13:20:10 +02:00
var me , value ;
2019-05-06 16:08:46 +02:00
me = this ;
value = this . editor . getValue ( ) . trim ( ) ;
if ( ! ( value && value !== "" ) ) {
return ;
}
2019-08-30 13:20:10 +02:00
this . socket = this . stream ( ) ;
2019-05-06 16:08:46 +02:00
this . socket . onopen = function ( ) {
//send data to server
return me . socket . send ( JSON . stringify ( {
code : value
} ) ) ;
} ;
this . socket . onmessage = function ( e ) {
var err , obj ;
if ( ! e . data ) {
return ;
}
try {
obj = JSON . parse ( e . data ) ;
if ( ! me . view ( obj ) ) {
return me . log ( "INFO" , e . data ) ;
}
} catch ( error ) {
err = error ;
me . log ( "INFO" , e . data ) ;
return console . log ( err ) ;
}
} ;
return this . socket . onclose = function ( ) {
me . socket = null ;
return console . log ( "socket closed" ) ;
} ;
}
view ( obj ) {
var el , p ;
if ( ! ( obj && obj . type && this [ obj . type ] ) ) {
return false ;
}
el = this [ obj . type ] ( obj ) . el ;
p = ( $ ( "<p>" ) ) . attr ( "class" , "info" ) [ 0 ] ;
$ ( p ) . append ( el ) ;
( $ ( this . output ) ) . append ( p ) ;
( $ ( this . output ) ) . scrollTop ( this . output . scrollHeight ) ;
return true ;
}
pc ( data ) {
return new PointCloudViewer ( data ) ;
}
cleanup ( e ) {
if ( this . socket ) {
return this . socket . close ( ) ;
}
}
} ;
LuaPlayground . dependencies = [ "ace/ace" ] ;
this . OS . register ( "LuaPlayground" , LuaPlayground ) ;
} ) . call ( this ) ;
/ * !
* Paper . js v0 . 12.0 - The Swiss Army Knife of Vector Graphics Scripting .
* http : //paperjs.org/
*
* Copyright ( c ) 2011 - 2016 , Juerg Lehni & Jonathan Puckey
* http : //scratchdisk.com/ & https://puckey.studio/
*
* Distributed under the MIT license . See LICENSE file for details .
*
* All rights reserved .
*
* Date : Mon Dec 3 14 : 19 : 11 2018 + 0100
*
* * *
*
* Straps . js - Class inheritance library with support for bean - style accessors
*
* Copyright ( c ) 2006 - 2016 Juerg Lehni
* http : //scratchdisk.com/
*
* Distributed under the MIT license .
*
* * *
*
* Acorn . js
* https : //marijnhaverbeke.nl/acorn/
*
* Acorn is a tiny , fast JavaScript parser written in JavaScript ,
* created by Marijn Haverbeke and released under an MIT license .
*
* /
var paper = function ( t , e ) { t = t || require ( "./node/self.js" ) ; var i = t . window , n = t . document , r = new function ( ) { function t ( t , e , r , s , a ) { function u ( n , u ) { u = u || ( u = o ( e , n ) ) && ( u . get ? u : u . value ) , "string" == typeof u && "#" === u [ 0 ] && ( u = t [ u . substring ( 1 ) ] || u ) ; var c , f = "function" == typeof u , d = u , _ = a || f && ! u . base ? u && u . get ? n in t : t [ n ] : null ; a && _ || ( f && _ && ( u . base = _ ) , f && s !== ! 1 && ( c = n . match ( /^([gs]et|is)(([A-Z])(.*))$/ ) ) && ( l [ c [ 3 ] . toLowerCase ( ) + c [ 4 ] ] = c [ 2 ] ) , d && ! f && d . get && "function" == typeof d . get && i . isPlainObject ( d ) || ( d = { value : d , writable : ! 0 } ) , ( o ( t , n ) || { configurable : ! 0 } ) . configurable && ( d . configurable = ! 0 , d . enumerable = null != r ? r : ! c ) , h ( t , n , d ) ) } var l = { } ; if ( e ) { for ( var c in e ) e . hasOwnProperty ( c ) && ! n . test ( c ) && u ( c ) ; for ( var c in l ) { var f = l [ c ] , d = t [ "set" + f ] , _ = t [ "get" + f ] || d && t [ "is" + f ] ; ! _ || s !== ! 0 && 0 !== _ . length || u ( c , { get : _ , set : d } ) } } return t } function i ( ) { for ( var t = 0 , e = arguments . length ; t < e ; t ++ ) { var i = arguments [ t ] ; i && c ( this , i ) } return this } var n = /^(statics|enumerable|beans|preserve)$/ , r = [ ] , s = r . slice , a = Object . create , o = Object . getOwnPropertyDescriptor , h = Object . defineProperty , u = r . forEach || function ( t , e ) { for ( var i = 0 , n = this . length ; i < n ; i ++ ) t . call ( e , this [ i ] , i , this ) } , l = function ( t , e ) { for ( var i in this ) this . hasOwnProperty ( i ) && t . call ( e , this [ i ] , i , this ) } , c = Object . assign || function ( t ) { for ( var e = 1 , i = arguments . length ; e < i ; e ++ ) { var n = arguments [ e ] ; for ( var r in n ) n . hasOwnProperty ( r ) && ( t [ r ] = n [ r ] ) } return t } , f = function ( t , e , i ) { if ( t ) { var n = o ( t , "length" ) ; ( n && "number" == typeof n . value ? u : l ) . call ( t , e , i = i || t ) } return i } ; return t ( i , { inject : function ( e ) { if ( e ) { var i = e . statics === ! 0 ? e : e . statics , n = e . beans , r = e . preserve ; i !== e && t ( this . prototype , e , e . enumerable , n , r ) , t ( this , i , null , n , r ) } for ( var s = 1 , a = arguments . length ; s < a ; s ++ ) this . inject ( arguments [ s ] ) ; return this } , extend : function ( ) { for ( var e , i , n , r = this , s = 0 , o = arguments . length ; s < o && ( ! e || ! i ) ; s ++ ) n = arguments [ s ] , e = e || n . initialize , i = i || n . prototype ; return e = e || function ( ) { r . apply ( this , arguments ) } , i = e . prototype = i || a ( this . prototype ) , h ( i , "constructor" , { value : e , writable : ! 0 , configurable : ! 0 } ) , t ( e , this ) , arguments . length && this . inject . apply ( e , arguments ) , e . base = r , e } } ) . inject ( { enumerable : ! 1 , initialize : i , set : i , inject : function ( ) { for ( var e = 0 , i = arguments . length ; e < i ; e ++ ) { var n = arguments [ e ] ; n && t ( this , n , n . enumerable , n . beans , n . preserve ) } return this } , extend : function ( ) { var t = a ( this ) ; return t . inject . apply ( t , arguments ) } , each : function ( t , e ) { return f ( this , t , e ) } , clone : function ( ) { return new this . constructor ( this ) } , statics : { set : c , each : f , create : a , define : h , describe : o , clone : function ( t ) { return c ( new t . constructor , t ) } , isPlainObject : function ( t ) { var e = null != t && t . constructor ; return e && ( e === Object || e === i || "Object" === e . name ) } , pick : function ( t , i ) { return t !== e ? t : i } , slice : function ( t , e , i ) { return s . call ( t , e , i ) } } } ) } ; "undefined" != typeof module && ( module . exports = r ) , r . inject ( { enumerable : ! 1 , toString : function ( ) { return null != this . _id ? ( this . _class || "Object" ) + ( this . _name ? " '" + this . _name + "'" : " @" + this . _id ) : "{ " + r . each ( this , function ( t , e ) { if ( ! /^_/ . test ( e ) ) { var i = typeof t ; this . push ( e + ": " + ( "number" === i ? h . instance . number ( t ) : "string" === i ? "'" + t + "'" : t ) ) } } , [ ] ) . join ( ", " ) + " }" } , getClassName : function ( ) { return this . _class || "" } , importJSON : function ( t ) { return r . importJSON ( t , this ) } , exportJSON : function ( t ) { return r . exportJSON ( this , t ) } , toJSON : function ( ) { return r . serialize ( this ) } , set : function ( t , e ) { return t && r . filter ( this , t , e , this . _prioritize ) , this } } , { beans : ! 1 , statics : { exports : { } , extend : function st ( ) { var t = st . base . apply ( this , arguments ) , e = t . prototype . _class ; return e && ! r . exports [ e ] && ( r . exports [ e ] = t ) , t } , equals : function ( t , e ) { if ( t === e ) return ! 0 ; if ( t && t . equals ) return t . equals ( e ) ; if ( e && e . equals ) return e . equals ( t ) ; if ( t && e && "object" == typeof t && "object" == typeof e ) { if ( Array . isArray ( t ) && Array . isArray ( e ) ) { var i = t . length ; if ( i !== e . length ) return ! 1 ; for ( ; i -- ; ) if ( ! r . equals ( t [ i ] , e [ i ] ) ) return ! 1 } else { var n = Object . keys ( t ) , i = n . length ; if ( i !== Object . keys ( e ) . length ) return ! 1 ; for ( ; i -- ; ) { var s = n [ i ] ; if ( ! e . hasOwnProperty ( s ) || ! r . equals ( t [ s ] , e [ s ] ) ) return ! 1 } } return ! 0 } return ! 1 } , read : function ( t , i , n , s ) { if ( this === r ) { var a = this . peek ( t , i ) ; return t . _ _index ++ , a } var o = this . prototype , h = o . _readIndex , u = i || h && t . _ _index || 0 , l = t . length , c = t [ u ] ; if ( s = s || l - u , c instanceof this || n && n . readNull && null == c && s <= 1 ) return h && ( t . _ _
this } , rotate : function ( t ) { t *= Math . PI / 180 ; var e = c . read ( arguments , 1 ) , i = e . x , n = e . y , r = Math . cos ( t ) , s = Math . sin ( t ) , a = i - i * r + n * s , o = n - i * s - n * r , h = this . _a , u = this . _b , l = this . _c , f = this . _d ; return this . _a = r * h + s * l , this . _b = r * u + s * f , this . _c = - s * h + r * l , this . _d = - s * u + r * f , this . _tx += a * h + o * l , this . _ty += a * u + o * f , this . _changed ( ) , this } , shear : function ( ) { var t = c . read ( arguments ) , e = c . read ( arguments , 0 , { readNull : ! 0 } ) ; e && this . translate ( e ) ; var i = this . _a , n = this . _b ; return this . _a += t . y * this . _c , this . _b += t . y * this . _d , this . _c += t . x * i , this . _d += t . x * n , e && this . translate ( e . negate ( ) ) , this . _changed ( ) , this } , skew : function ( ) { var t = c . read ( arguments ) , e = c . read ( arguments , 0 , { readNull : ! 0 } ) , i = Math . PI / 180 , n = new c ( Math . tan ( t . x * i ) , Math . tan ( t . y * i ) ) ; return this . shear ( n , e ) } , append : function ( t , e ) { if ( t ) { var i = this . _a , n = this . _b , r = this . _c , s = this . _d , a = t . _a , o = t . _c , h = t . _b , u = t . _d , l = t . _tx , c = t . _ty ; this . _a = a * i + h * r , this . _c = o * i + u * r , this . _b = a * n + h * s , this . _d = o * n + u * s , this . _tx += l * i + c * r , this . _ty += l * n + c * s , e || this . _changed ( ) } return this } , prepend : function ( t , e ) { if ( t ) { var i = this . _a , n = this . _b , r = this . _c , s = this . _d , a = this . _tx , o = this . _ty , h = t . _a , u = t . _c , l = t . _b , c = t . _d , f = t . _tx , d = t . _ty ; this . _a = h * i + u * n , this . _c = h * r + u * s , this . _b = l * i + c * n , this . _d = l * r + c * s , this . _tx = h * a + u * o + f , this . _ty = l * a + c * o + d , e || this . _changed ( ) } return this } , appended : function ( t ) { return this . clone ( ) . append ( t ) } , prepended : function ( t ) { return this . clone ( ) . prepend ( t ) } , invert : function ( ) { var t = this . _a , e = this . _b , i = this . _c , n = this . _d , r = this . _tx , s = this . _ty , a = t * n - e * i , o = null ; return a && ! isNaN ( a ) && isFinite ( r ) && isFinite ( s ) && ( this . _a = n / a , this . _b = - e / a , this . _c = - i / a , this . _d = t / a , this . _tx = ( i * s - n * r ) / a , this . _ty = ( e * r - t * s ) / a , o = this ) , o } , inverted : function ( ) { return this . clone ( ) . invert ( ) } , concatenate : "#append" , preConcatenate : "#prepend" , chain : "#appended" , _shiftless : function ( ) { return new p ( this . _a , this . _b , this . _c , this . _d , 0 , 0 ) } , _orNullIfIdentity : function ( ) { return this . isIdentity ( ) ? null : this } , isIdentity : function ( ) { return 1 === this . _a && 0 === this . _b && 0 === this . _c && 1 === this . _d && 0 === this . _tx && 0 === this . _ty } , isInvertible : function ( ) { var t = this . _a * this . _d - this . _c * this . _b ; return t && ! isNaN ( t ) && isFinite ( this . _tx ) && isFinite ( this . _ty ) } , isSingular : function ( ) { return ! this . isInvertible ( ) } , transform : function ( t , e , i ) { return arguments . length < 3 ? this . _transformPoint ( c . read ( arguments ) ) : this . _transformCoordinates ( t , e , i ) } , _transformPoint : function ( t , e , i ) { var n = t . x , r = t . y ; return e || ( e = new c ) , e . _set ( n * this . _a + r * this . _c + this . _tx , n * this . _b + r * this . _d + this . _ty , i ) } , _transformCoordinates : function ( t , e , i ) { for ( var n = 0 , r = 2 * i ; n < r ; n += 2 ) { var s = t [ n ] , a = t [ n + 1 ] ; e [ n ] = s * this . _a + a * this . _c + this . _tx , e [ n + 1 ] = s * this . _b + a * this . _d + this . _ty } return e } , _transformCorners : function ( t ) { var e = t . x , i = t . y , n = e + t . width , r = i + t . height , s = [ e , i , n , i , n , r , e , r ] ; return this . _transformCoordinates ( s , s , 4 ) } , _transformBounds : function ( t , e , i ) { for ( var n = this . _transformCorners ( t ) , r = n . slice ( 0 , 2 ) , s = r . slice ( ) , a = 2 ; a < 8 ; a ++ ) { var o = n [ a ] , h = 1 & a ; o < r [ h ] ? r [ h ] = o : o > s [ h ] && ( s [ h ] = o ) } return e || ( e = new g ) , e . _set ( r [ 0 ] , r [ 1 ] , s [ 0 ] - r [ 0 ] , s [ 1 ] - r [ 1 ] , i ) } , inverseTransform : function ( ) { return this . _inverseTransform ( c . read ( arguments ) ) } , _inverseTransform : function ( t , e , i ) { var n = this . _a , r = this . _b , s = this . _c , a = this . _d , o = this . _tx , h = this . _ty , u = n * a - r * s , l = null ; if ( u && ! isNaN ( u ) && isFinite ( o ) && isFinite ( h ) ) { var f = t . x - this . _tx , d = t . y - this . _ty ; e || ( e = new c ) , l = e . _set ( ( f * a - d * s ) / u , ( d * n - f * r ) / u , i ) } return l } , decompose : function ( ) { var t , e , i , n = this . _a , r = this . _b , s = this . _c , a = this . _d , o = n * a - r * s , h = Math . sqrt , u = Math . atan2 , l = 180 / Math . PI ; if ( 0 !== n || 0 !== r ) { var f = h ( n * n + r * r ) ; t = Math . acos ( n / f ) * ( r > 0 ? 1 : - 1 ) , e = [ f , o / f ] , i = [ u ( n * s + r * a , f * f ) , 0 ] } else if ( 0 !== s || 0 !== a ) { var d = h ( s * s + a * a ) ; t = Math . asin ( s / d ) * ( a > 0 ? 1 : - 1 ) , e = [ o / d , d ] , i = [ 0 , u ( n * s + r * a , d * d ) ] } else t = 0 , i = e = [ 0 , 0 ] ; return { translation : this . getTranslation ( ) , rotation : t * l , scaling : new c ( e ) , skewing : new c ( i [ 0 ] * l , i [ 1 ] * l ) } } , getValues : function ( ) { return [ this . _a , this . _b , this . _c , this . _d , this . _tx , this . _ty ] } , getTranslation : function ( ) { return new c ( this . _tx , this . _ty ) } , getScaling : function ( ) { return this . decompose ( ) . scaling } , getRotation : function ( ) { return this . decompose ( ) . rotation } , applyToContext : function ( t ) { this . isIdentity ( ) || t . transform ( this . _a , this . _b , this . _c , this . _d , this . _tx , this . _ty ) } } , r . each ( [ "a" , "b" , "c" , "d" , "tx" , "ty" ] , function ( t ) { var e = r . capitalize ( t
if ( _ ? ( t . globalAlpha = c , d && ( t . globalCompositeOperation = l ) ) : y && t . translate ( - h . x , - h . y ) , y && ( _ ? s : r ) . applyToContext ( t ) , m && e . clipItem . draw ( t , e . extend ( { clip : ! 0 } ) ) , p ) { t . setTransform ( g , 0 , 0 , g , 0 , 0 ) ; var w = e . offset ; w && t . translate ( - w . x , - w . y ) } this . _draw ( t , e , r , p ) , t . restore ( ) , n . pop ( ) , e . clip && ! e . dontFinish && t . clip ( ) , _ || ( et . process ( l , t , o , c , h . subtract ( u ) . multiply ( g ) ) , tt . release ( t ) , e . offset = u ) } } } , _isUpdated : function ( t ) { var e = this . _parent ; if ( e instanceof N ) return e . _isUpdated ( t ) ; var i = this . _updateVersion === t ; return ! i && e && e . _visible && e . _isUpdated ( t ) && ( this . _updateVersion = t , i = ! 0 ) , i } , _drawSelection : function ( t , e , i , n , r ) { var s = this . _selection , a = 1 & s , o = 2 & s || a && this . _selectBounds , h = 4 & s ; if ( this . _drawSelected || ( a = ! 1 ) , ( a || o || h ) && this . _isUpdated ( r ) ) { var u , l = this . getSelectedColor ( ! 0 ) || ( u = this . getLayer ( ) ) && u . getSelectedColor ( ! 0 ) , c = e . appended ( this . getGlobalMatrix ( ! 0 ) ) , f = i / 2 ; if ( t . strokeStyle = t . fillStyle = l ? l . toCanvasStyle ( t ) : "#009dec" , a && this . _drawSelected ( t , c , n ) , h ) { var d = this . getPosition ( ! 0 ) , _ = this . _parent , g = _ ? _ . localToGlobal ( d ) : d , v = g . x , p = g . y ; t . beginPath ( ) , t . arc ( v , p , f , 0 , 2 * Math . PI , ! 0 ) , t . stroke ( ) ; for ( var m = [ [ 0 , - 1 ] , [ 1 , 0 ] , [ 0 , 1 ] , [ - 1 , 0 ] ] , y = f , w = i + 1 , x = 0 ; x < 4 ; x ++ ) { var b = m [ x ] , S = b [ 0 ] , C = b [ 1 ] ; t . moveTo ( v + S * y , p + C * y ) , t . lineTo ( v + S * w , p + C * w ) , t . stroke ( ) } } if ( o ) { var P = c . _transformCorners ( this . getInternalBounds ( ) ) ; t . beginPath ( ) ; for ( var x = 0 ; x < 8 ; x ++ ) t [ x ? "lineTo" : "moveTo" ] ( P [ x ] , P [ ++ x ] ) ; t . closePath ( ) , t . stroke ( ) ; for ( var x = 0 ; x < 8 ; x ++ ) t . fillRect ( P [ x ] - f , P [ ++ x ] - f , i , i ) } } } , _canComposite : function ( ) { return ! 1 } } , r . each ( [ "down" , "drag" , "up" , "move" ] , function ( t ) { this [ "removeOn" + r . capitalize ( t ) ] = function ( ) { var e = { } ; return e [ t ] = ! 0 , this . removeOn ( e ) } } , { removeOn : function ( t ) { for ( var e in t ) if ( t [ e ] ) { var i = "mouse" + e , n = this . _project , r = n . _removeSets = n . _removeSets || { } ; r [ i ] = r [ i ] || { } , r [ i ] [ this . _id ] = this } return this } } ) , { tween : function ( t , e , i ) { function n ( t ) { o . _handleFrame ( 1e3 * t . time ) , o . running || this . off ( "frame" , n ) } i || ( i = e , e = t , t = null , i || ( i = e , e = null ) ) ; var r = i && i . easing , s = i && i . start , a = null != i && ( "number" == typeof i ? i : i . duration ) , o = new X ( this , t , e , a , r , s ) ; return a && this . on ( "frame" , n ) , o } , tweenTo : function ( t , e ) { return this . tween ( null , t , e ) } , tweenFrom : function ( t , e ) { return this . tween ( t , null , e ) } } ) , x = w . extend ( { _class : "Group" , _selectBounds : ! 1 , _selectChildren : ! 0 , _serializeFields : { children : [ ] } , initialize : function ( t ) { this . _children = [ ] , this . _namedChildren = { } , this . _initialize ( t ) || this . addChildren ( Array . isArray ( t ) ? t : arguments ) } , _changed : function dt ( t ) { dt . base . call ( this , t ) , 2050 & t && ( this . _clipItem = e ) } , _getClipItem : function ( ) { var t = this . _clipItem ; if ( t === e ) { t = null ; for ( var i = this . _children , n = 0 , r = i . length ; n < r ; n ++ ) if ( i [ n ] . _clipMask ) { t = i [ n ] ; break } this . _clipItem = t } return t } , isClipped : function ( ) { return ! ! this . _getClipItem ( ) } , setClipped : function ( t ) { var e = this . getFirstChild ( ) ; e && e . setClipMask ( t ) } , _getBounds : function _t ( t , e ) { var i = this . _getClipItem ( ) ; return i ? i . _getCachedBounds ( t && t . appended ( i . _matrix ) , r . set ( { } , e , { stroke : ! 1 } ) ) : _t . base . call ( this , t , e ) } , _hitTestChildren : function gt ( t , e , i ) { var n = this . _getClipItem ( ) ; return ( ! n || n . contains ( t ) ) && gt . base . call ( this , t , e , i , n ) } , _draw : function ( t , e ) { var i = e . clip , n = ! i && this . _getClipItem ( ) ; e = e . extend ( { clipItem : n , clip : ! 1 } ) , i ? ( t . beginPath ( ) , e . dontStart = e . dontFinish = ! 0 ) : n && n . draw ( t , e . extend ( { clip : ! 0 } ) ) ; for ( var r = this . _children , s = 0 , a = r . length ; s < a ; s ++ ) { var o = r [ s ] ; o !== n && o . draw ( t , e ) } } } ) , b = x . extend ( { _class : "Layer" , initialize : function ( ) { x . apply ( this , arguments ) } , _getOwner : function ( ) { return this . _parent || null != this . _index && this . _project } , isInserted : function vt ( ) { return this . _parent ? vt . base . call ( this ) : null != this . _index } , activate : function ( ) { this . _project . _activeLayer = this } , _hitTestSelf : function ( ) { } } ) , S = w . extend ( { _class : "Shape" , _applyMatrix : ! 1 , _canApplyMatrix : ! 1 , _canScaleStroke : ! 0 , _serializeFields : { type : null , size : null , radius : null } , initialize : function ( t , e ) { this . _initialize ( t , e ) } , _equals : function ( t ) { return this . _type === t . _type && this . _size . equals ( t . _size ) && r . equals ( this . _radius , t . _radius ) } , copyContent : function ( t ) { this . setType ( t . _type ) , this . setSize ( t . _size ) , this . setRadius ( t . _radius ) } , getType : function ( ) { return this . _type } , setType : function ( t ) { this . _type = t } , getShape : "#getType" , setShape : "#setType" , getSize : function ( ) { var t = this . _size ; return ne
return function ( t ) { var e = ( u * t + l ) * t + c , i = ( f * t + d ) * t + _ ; return Math . sqrt ( e * e + i * i ) } } function i ( t , e ) { return Math . max ( 2 , Math . min ( 16 , Math . ceil ( 32 * Math . abs ( e - t ) ) ) ) } function n ( t , e , i , n ) { if ( null == e || e < 0 || e > 1 ) return null ; var r = t [ 0 ] , s = t [ 1 ] , a = t [ 2 ] , o = t [ 3 ] , h = t [ 4 ] , l = t [ 5 ] , f = t [ 6 ] , d = t [ 7 ] , _ = u . isZero ; _ ( a - r ) && _ ( o - s ) && ( a = r , o = s ) , _ ( h - f ) && _ ( l - d ) && ( h = f , l = d ) ; var g , v , p = 3 * ( a - r ) , m = 3 * ( h - a ) - p , y = f - r - p - m , w = 3 * ( o - s ) , x = 3 * ( l - o ) - w , b = d - s - w - x ; if ( 0 === i ) g = 0 === e ? r : 1 === e ? f : ( ( y * e + m ) * e + p ) * e + r , v = 0 === e ? s : 1 === e ? d : ( ( b * e + x ) * e + w ) * e + s ; else { var S = 1e-8 , C = 1 - S ; if ( e < S ? ( g = p , v = w ) : e > C ? ( g = 3 * ( f - h ) , v = 3 * ( d - l ) ) : ( g = ( 3 * y * e + 2 * m ) * e + p , v = ( 3 * b * e + 2 * x ) * e + w ) , n ) { 0 === g && 0 === v && ( e < S || e > C ) && ( g = h - a , v = l - o ) ; var P = Math . sqrt ( g * g + v * v ) ; P && ( g /= P , v /= P ) } if ( 3 === i ) { var h = 6 * y * e + 2 * m , l = 6 * b * e + 2 * x , I = Math . pow ( g * g + v * v , 1.5 ) ; g = 0 !== I ? ( g * l - v * h ) / I : 0 , v = 0 } } return 2 === i ? new c ( v , ( - g ) ) : new c ( g , v ) } return { statics : { classify : function ( t ) { function i ( t , i , n ) { var r = i !== e , s = r && i > 0 && i < 1 , a = r && n > 0 && n < 1 ; return ! r || ( s || a ) && ( "loop" !== t || s && a ) || ( t = "arch" , s = a = ! 1 ) , { type : t , roots : s || a ? s && a ? i < n ? [ i , n ] : [ n , i ] : [ s ? i : n ] : null } } var n = t [ 0 ] , r = t [ 1 ] , s = t [ 2 ] , a = t [ 3 ] , o = t [ 4 ] , h = t [ 5 ] , l = t [ 6 ] , c = t [ 7 ] , f = n * ( c - h ) + r * ( o - l ) + l * h - c * o , d = s * ( r - c ) + a * ( l - n ) + n * c - r * l , _ = o * ( a - r ) + h * ( n - s ) + s * r - a * n , g = 3 * _ , v = g - d , p = v - d + f , m = Math . sqrt ( p * p + v * v + g * g ) , y = 0 !== m ? 1 / m : 0 , w = u . isZero , x = "serpentine" ; if ( p *= y , v *= y , g *= y , w ( p ) ) return w ( v ) ? i ( w ( g ) ? "line" : "quadratic" ) : i ( x , g / ( 3 * v ) ) ; var b = 3 * v * v - 4 * p * g ; if ( w ( b ) ) return i ( "cusp" , v / ( 2 * p ) ) ; var S = b > 0 ? Math . sqrt ( b / 3 ) : Math . sqrt ( - b ) , C = 2 * p ; return i ( b > 0 ? x : "loop" , ( v + S ) / C , ( v - S ) / C ) } , getLength : function ( n , r , s , a ) { if ( r === e && ( r = 0 ) , s === e && ( s = 1 ) , k . isStraight ( n ) ) { var o = n ; s < 1 && ( o = k . subdivide ( o , s ) [ 0 ] , r /= s ) , r > 0 && ( o = k . subdivide ( o , r ) [ 1 ] ) ; var h = o [ 6 ] - o [ 0 ] , l = o [ 7 ] - o [ 1 ] ; return Math . sqrt ( h * h + l * l ) } return u . integrate ( a || t ( n ) , r , s , i ( r , s ) ) } , getTimeAt : function ( n , r , s ) { function a ( t ) { return p += u . integrate ( d , s , t , i ( s , t ) ) , s = t , p - r } if ( s === e && ( s = r < 0 ? 1 : 0 ) , 0 === r ) return s ; var o = Math . abs , h = 1e-12 , l = r > 0 , c = l ? s : 0 , f = l ? 1 : s , d = t ( n ) , _ = k . getLength ( n , c , f , d ) , g = o ( r ) - _ ; if ( o ( g ) < h ) return l ? f : c ; if ( g > h ) return null ; var v = r / _ , p = 0 ; return u . findRoot ( a , d , s + v , c , f , 32 , 1e-12 ) } , getPoint : function ( t , e ) { return n ( t , e , 0 , ! 1 ) } , getTangent : function ( t , e ) { return n ( t , e , 1 , ! 0 ) } , getWeightedTangent : function ( t , e ) { return n ( t , e , 1 , ! 1 ) } , getNormal : function ( t , e ) { return n ( t , e , 2 , ! 0 ) } , getWeightedNormal : function ( t , e ) { return n ( t , e , 2 , ! 1 ) } , getCurvature : function ( t , e ) { return n ( t , e , 3 , ! 1 ) . x } , getPeaks : function ( t ) { var e = t [ 0 ] , i = t [ 1 ] , n = t [ 2 ] , r = t [ 3 ] , s = t [ 4 ] , a = t [ 5 ] , o = t [ 6 ] , h = t [ 7 ] , l = - e + 3 * n - 3 * s + o , c = 3 * e - 6 * n + 3 * s , f = - 3 * e + 3 * n , d = - i + 3 * r - 3 * a + h , _ = 3 * i - 6 * r + 3 * a , g = - 3 * i + 3 * r , v = 1e-8 , p = 1 - v , m = [ ] ; return u . solveCubic ( 9 * ( l * l + d * d ) , 9 * ( l * c + _ * d ) , 2 * ( c * c + _ * _ ) + 3 * ( f * l + g * d ) , f * c + _ * g , m , v , p ) , m . sort ( ) } } } } , new function ( ) { function t ( t , e , i , n , r , s , a ) { var o = ! a && i . getPrevious ( ) === r , h = ! a && i !== r && i . getNext ( ) === r , u = 1e-8 , l = 1 - u ; if ( null !== n && n >= ( o ? u : 0 ) && n <= ( h ? l : 1 ) && null !== s && s >= ( h ? u : 0 ) && s <= ( o ? l : 1 ) ) { var c = new O ( i , n , null , a ) , f = new O ( r , s , null , a ) ; c . _intersection = f , f . _intersection = c , e && ! e ( c ) || O . insert ( t , c , ! 0 ) } } function e ( r , s , a , o , h , u , l , c , f , d , _ , g , v ) { if ( ++ f >= 4096 || ++ c >= 40 ) return f ; var p , y , w = 1e-9 , x = s [ 0 ] , b = s [ 1 ] , S = s [ 6 ] , C = s [ 7 ] , P = m . getSignedDistance , I = P ( x , b , S , C , s [ 2 ] , s [ 3 ] ) , M = P ( x , b , S , C , s [ 4 ] , s [ 5 ] ) , T = I * M > 0 ? . 75 : 4 / 9 , z = T * Math . min ( 0 , I , M ) , O = T * Math . max ( 0 , I , M ) , A = P ( x , b , S , C , r [ 0 ] , r [ 1 ] ) , L = P ( x , b , S , C , r [ 2 ] , r [ 3 ] ) , N = P ( x , b , S , C , r [ 4 ] , r [ 5 ] ) , B = P ( x , b , S , C , r [ 6 ] , r [ 7 ] ) , E = i ( A , L , N , B ) , j = E [ 0 ] , F = E [ 1 ] ; if ( 0 === I && 0 === M && 0 === A && 0 === L && 0 === N && 0 === B || null == ( p = n ( j , F , z , O ) ) || null == ( y = n ( j . reverse ( ) , F . reverse ( ) , z , O ) ) ) return f ; var D = d + ( _ - d ) * p , R = d + ( _ - d ) * y ; if ( Math . max ( v - g , R - D ) < w ) { var q = ( D + R ) / 2 , V = ( g + v ) / 2 ; t ( h , u , l ? o : a , l ? V : q , l ? a : o , l ? q : V ) } else if ( r = k . getPart ( r , p , y ) , y - p > . 8 ) if ( R - D > v - g ) { var H = k . subdivide ( r , . 5 ) , q = ( D + R ) / 2 ; f = e ( s , H [ 0 ] , o , a , h , u , ! l , c , f , g , v , D , q ) , f = e ( s , H [ 1 ] , o , a , h , u , ! l , c , f , g , v , q , R ) } else { var H = k . subdivide ( s , . 5 ) , V = ( g + v ) / 2 ; f = e ( H [ 0 ] , r , o , a , h , u , ! l , c , f , g , V , D , R ) , f = e ( H [ 1 ] , r , o , a , h , u , ! l , c , f , V , v , D , R ) } else f = v - g >= w ? e ( s , r , o , a , h , u , ! l , c , f , g , v , D , R ) : e ( r , s , a , o , h , u , l , c , f , D , R , g , v ) ; return f } function i ( t , e , i , n ) { var r , s = [ 0 , t ] , a = [ 1 / 3 , e ] , o = [ 2 / 3 , i ] , h = [ 1 , n ] , u = e - ( 2 * t + n ) / 3 , l = i - ( t + 2 * n ) / 3 ; if ( u * l < 0 ) r = [ [ s , a , h ] , [ s , o , h ] ] ; else { var c = u / l ; r = [ c >= 2 ? [ s , a , h ] : c <= . 5 ? [ s , o , h ] : [ s , a , o , h ] , [ s , h ] ] } return ( u || l ) < 0 ? r . reverse ( ) : r } function n ( t , e , i , n ) { return t [ 0 ] [ 1 ] < i ? s ( t , ! 0 , i ) : e [ 0 ] [ 1 ] > n ? s ( e , ! 1 , n ) : t [ 0 ] [ 0 ] } function s ( t , e , i ) { for ( var n = t [ 0 ] [ 0 ] , r = t [ 0 ] [ 1 ] , s = 1 , a = t . length ;
this . quadraticCurveTo ( o , i ) } , arcTo : function ( ) { var e , i , n , s , a , o = Math . abs , h = Math . sqrt , l = t ( this ) , f = l . _point , _ = c . read ( arguments ) , g = r . peek ( arguments ) , v = r . pick ( g , ! 0 ) ; if ( "boolean" == typeof v ) var y = f . add ( _ ) . divide ( 2 ) , e = y . add ( y . subtract ( f ) . rotate ( v ? - 90 : 90 ) ) ; else if ( r . remain ( arguments ) <= 2 ) e = _ , _ = c . read ( arguments ) ; else { var w = d . read ( arguments ) , x = u . isZero ; if ( x ( w . width ) || x ( w . height ) ) return this . lineTo ( _ ) ; var b = r . read ( arguments ) , v = ! ! r . read ( arguments ) , S = ! ! r . read ( arguments ) , y = f . add ( _ ) . divide ( 2 ) , C = f . subtract ( y ) . rotate ( - b ) , P = C . x , I = C . y , M = o ( w . width ) , z = o ( w . height ) , k = M * M , O = z * z , A = P * P , L = I * I , N = h ( A / k + L / O ) ; if ( N > 1 && ( M *= N , z *= N , k = M * M , O = z * z ) , N = ( k * O - k * L - O * A ) / ( k * L + O * A ) , o ( N ) < 1e-12 && ( N = 0 ) , N < 0 ) throw new Error ( "Cannot create an arc with the given arguments" ) ; i = new c ( M * I / z , - z * P / M ) . multiply ( ( S === v ? - 1 : 1 ) * h ( N ) ) . rotate ( b ) . add ( y ) , a = ( new p ) . translate ( i ) . rotate ( b ) . scale ( M , z ) , s = a . _inverseTransform ( f ) , n = s . getDirectedAngle ( a . _inverseTransform ( _ ) ) , ! v && n > 0 ? n -= 360 : v && n < 0 && ( n += 360 ) } if ( e ) { var B = new m ( f . add ( e ) . divide ( 2 ) , e . subtract ( f ) . rotate ( 90 ) , ( ! 0 ) ) , E = new m ( e . add ( _ ) . divide ( 2 ) , _ . subtract ( e ) . rotate ( 90 ) , ( ! 0 ) ) , j = new m ( f , _ ) , F = j . getSide ( e ) ; if ( i = B . intersect ( E , ! 0 ) , ! i ) { if ( ! F ) return this . lineTo ( _ ) ; throw new Error ( "Cannot create an arc with the given arguments" ) } s = f . subtract ( i ) , n = s . getDirectedAngle ( _ . subtract ( i ) ) ; var D = j . getSide ( i , ! 0 ) ; 0 === D ? n = F * o ( n ) : F === D && ( n += n < 0 ? 360 : - 360 ) } for ( var R = 1e-7 , q = o ( n ) , V = q >= 360 ? 4 : Math . ceil ( ( q - R ) / 90 ) , H = n / V , Z = H * Math . PI / 360 , U = 4 / 3 * Math . sin ( Z ) / ( 1 + Math . cos ( Z ) ) , W = [ ] , G = 0 ; G <= V ; G ++ ) { var C = _ , J = null ; if ( G < V && ( J = s . rotate ( 90 ) . multiply ( U ) , a ? ( C = a . _transformPoint ( s ) , J = a . _transformPoint ( s . add ( J ) ) . subtract ( C ) ) : C = i . add ( s ) ) , G ) { var $ = s . rotate ( - 90 ) . multiply ( U ) ; a && ( $ = a . _transformPoint ( s . add ( $ ) ) . subtract ( C ) ) , W . push ( new T ( C , $ , J ) ) } else l . setHandleOut ( J ) ; s = s . rotate ( H ) } this . _add ( W ) } , lineBy : function ( ) { var e = c . read ( arguments ) , i = t ( this ) . _point ; this . lineTo ( i . add ( e ) ) } , curveBy : function ( ) { var e = c . read ( arguments ) , i = c . read ( arguments ) , n = r . read ( arguments ) , s = t ( this ) . _point ; this . curveTo ( s . add ( e ) , s . add ( i ) , n ) } , cubicCurveBy : function ( ) { var e = c . read ( arguments ) , i = c . read ( arguments ) , n = c . read ( arguments ) , r = t ( this ) . _point ; this . cubicCurveTo ( r . add ( e ) , r . add ( i ) , r . add ( n ) ) } , quadraticCurveBy : function ( ) { var e = c . read ( arguments ) , i = c . read ( arguments ) , n = t ( this ) . _point ; this . quadraticCurveTo ( n . add ( e ) , n . add ( i ) ) } , arcBy : function ( ) { var e = t ( this ) . _point , i = e . add ( c . read ( arguments ) ) , n = r . pick ( r . peek ( arguments ) , ! 0 ) ; "boolean" == typeof n ? this . arcTo ( i , n ) : this . arcTo ( i , e . add ( c . read ( arguments ) ) ) } , closePath : function ( t ) { this . setClosed ( ! 0 ) , this . join ( this , t ) } } } , { _getBounds : function ( t , e ) { var i = e . handle ? "getHandleBounds" : e . stroke ? "getStrokeBounds" : "getBounds" ; return L [ i ] ( this . _segments , this . _closed , this , t , e ) } , statics : { getBounds : function ( t , e , i , n , r , s ) { function a ( t ) { t . _transformCoordinates ( n , h ) ; for ( var e = 0 ; e < 2 ; e ++ ) k . _addBounds ( u [ e ] , u [ e + 4 ] , h [ e + 2 ] , h [ e ] , e , s ? s [ e ] : 0 , l , c , f ) ; var i = u ; u = h , h = i } var o = t [ 0 ] ; if ( ! o ) return new g ; for ( var h = new Array ( 6 ) , u = o . _transformCoordinates ( n , new Array ( 6 ) ) , l = u . slice ( 0 , 2 ) , c = l . slice ( ) , f = new Array ( 2 ) , d = 1 , _ = t . length ; d < _ ; d ++ ) a ( t [ d ] ) ; return e && a ( o ) , new g ( l [ 0 ] , l [ 1 ] , c [ 0 ] - l [ 0 ] , c [ 1 ] - l [ 1 ] ) } , getStrokeBounds : function ( t , e , i , n , r ) { function s ( t ) { v = v . include ( t ) } function a ( t ) { v = v . unite ( x . setCenter ( t . _point . transform ( n ) ) ) } function o ( t , e ) { "round" === e || t . isSmooth ( ) ? a ( t ) : L . _addBevelJoin ( t , e , p , w , n , f , s ) } function h ( t , e ) { "round" === e ? a ( t ) : L . _addSquareCap ( t , e , p , n , f , s ) } var u = i . getStyle ( ) , l = u . hasStroke ( ) , c = u . getStrokeWidth ( ) , f = l && i . _getStrokeMatrix ( n , r ) , _ = l && L . _getStrokePadding ( c , f ) , v = L . getBounds ( t , e , i , n , r , _ ) ; if ( ! l ) return v ; for ( var p = c / 2 , m = u . getStrokeJoin ( ) , y = u . getStrokeCap ( ) , w = u . getMiterLimit ( ) , x = new g ( new d ( _ ) ) , b = t . length - ( e ? 0 : 1 ) , S = 1 ; S < b ; S ++ ) o ( t [ S ] , m ) ; return e ? o ( t [ 0 ] , m ) : b > 0 && ( h ( t [ 0 ] , y ) , h ( t [ t . length - 1 ] , y ) ) , v } , _getStrokePadding : function ( t , e ) { if ( ! e ) return [ t , t ] ; var i = new c ( t , 0 ) . transform ( e ) , n = new c ( 0 , t ) . transform ( e ) , r = i . getAngleInRadians ( ) , s = i . getLength ( ) , a = n . getLength ( ) , o = Math . sin ( r ) , h = Math . cos ( r ) , u = Math . tan ( r ) , l = Math . atan2 ( a * u , s ) , f = Math . atan2 ( a , u * s ) ; return [ Math . abs ( s * Math . cos ( l ) * h + a * Math . sin ( l ) * o ) , Math . abs ( a * Math . sin ( f ) * h + s * Math . cos ( f ) * o ) ] } , _addBevelJoin : function ( t , e , i , n , r , s , a , o ) { var h = t . getCurve ( ) , u = h . getPrevious ( ) , l = h . getPoint1 ( ) . transform ( r ) , f = u . getNormalAtTime
} var f = h || a ; i = t . createRadialGradient ( f . x , f . y , 0 , a . x , a . y , l ) } else i = t . createLinearGradient ( a . x , a . y , o . x , o . y ) ; for ( var d = 0 , _ = s . length ; d < _ ; d ++ ) { var g = s [ d ] , v = g . _offset ; i . addColorStop ( null == v ? d / ( _ - 1 ) : v , g . _color . toCanvasStyle ( ) ) } return this . _canvasStyle = i } , transform : function ( t ) { if ( "gradient" === this . _type ) { for ( var e = this . _components , i = 1 , n = e . length ; i < n ; i ++ ) { var r = e [ i ] ; t . _transformPoint ( r , r , ! 0 ) } this . _changed ( ) } } , statics : { _types : n , random : function ( ) { var t = Math . random ; return new D ( t ( ) , t ( ) , t ( ) ) } } } ) } , new function ( ) { var t = { add : function ( t , e ) { return t + e } , subtract : function ( t , e ) { return t - e } , multiply : function ( t , e ) { return t * e } , divide : function ( t , e ) { return t / e } } ; return r . each ( t , function ( t , e ) { this [ e ] = function ( e ) { e = D . read ( arguments ) ; for ( var i = this . _type , n = this . _components , r = e . _convert ( i ) , s = 0 , a = n . length ; s < a ; s ++ ) r [ s ] = t ( n [ s ] , r [ s ] ) ; return new D ( i , r , null != this . _alpha ? t ( this . _alpha , e . getAlpha ( ) ) : null ) } } , { } ) } ) , R = r . extend ( { _class : "Gradient" , initialize : function ( t , e ) { this . _id = l . get ( ) , t && r . isPlainObject ( t ) && ( this . set ( t ) , t = e = null ) , null == this . _stops && this . setStops ( t || [ "white" , "black" ] ) , null == this . _radial && this . setRadial ( "string" == typeof e && "radial" === e || e || ! 1 ) } , _serialize : function ( t , e ) { return e . add ( this , function ( ) { return r . serialize ( [ this . _stops , this . _radial ] , t , ! 0 , e ) } ) } , _changed : function ( ) { for ( var t = 0 , e = this . _owners && this . _owners . length ; t < e ; t ++ ) this . _owners [ t ] . _changed ( ) } , _addOwner : function ( t ) { this . _owners || ( this . _owners = [ ] ) , this . _owners . push ( t ) } , _removeOwner : function ( t ) { var i = this . _owners ? this . _owners . indexOf ( t ) : - 1 ; i != - 1 && ( this . _owners . splice ( i , 1 ) , this . _owners . length || ( this . _owners = e ) ) } , clone : function ( ) { for ( var t = [ ] , e = 0 , i = this . _stops . length ; e < i ; e ++ ) t [ e ] = this . _stops [ e ] . clone ( ) ; return new R ( t , this . _radial ) } , getStops : function ( ) { return this . _stops } , setStops : function ( t ) { if ( t . length < 2 ) throw new Error ( "Gradient stop list needs to contain at least two stops." ) ; var i = this . _stops ; if ( i ) for ( var n = 0 , r = i . length ; n < r ; n ++ ) i [ n ] . _owner = e ; i = this . _stops = q . readList ( t , 0 , { clone : ! 0 } ) ; for ( var n = 0 , r = i . length ; n < r ; n ++ ) i [ n ] . _owner = this ; this . _changed ( ) } , getRadial : function ( ) { return this . _radial } , setRadial : function ( t ) { this . _radial = t , this . _changed ( ) } , equals : function ( t ) { if ( t === this ) return ! 0 ; if ( t && this . _class === t . _class ) { var e = this . _stops , i = t . _stops , n = e . length ; if ( n === i . length ) { for ( var r = 0 ; r < n ; r ++ ) if ( ! e [ r ] . equals ( i [ r ] ) ) return ! 1 ; return ! 0 } } return ! 1 } } ) , q = r . extend ( { _class : "GradientStop" , initialize : function ( t , i ) { var n = t , r = i ; "object" == typeof t && i === e && ( Array . isArray ( t ) && "number" != typeof t [ 0 ] ? ( n = t [ 0 ] , r = t [ 1 ] ) : ( "color" in t || "offset" in t || "rampPoint" in t ) && ( n = t . color , r = t . offset || t . rampPoint || 0 ) ) , this . setColor ( n ) , this . setOffset ( r ) } , clone : function ( ) { return new q ( this . _color . clone ( ) , this . _offset ) } , _serialize : function ( t , e ) { var i = this . _color , n = this . _offset ; return r . serialize ( null == n ? [ i ] : [ i , n ] , t , ! 0 , e ) } , _changed : function ( ) { this . _owner && this . _owner . _changed ( 129 ) } , getOffset : function ( ) { return this . _offset } , setOffset : function ( t ) { this . _offset = t , this . _changed ( ) } , getRampPoint : "#getOffset" , setRampPoint : "#setOffset" , getColor : function ( ) { return this . _color } , setColor : function ( ) { var t = D . read ( arguments , 0 , { clone : ! 0 } ) ; t && ( t . _owner = this ) , this . _color = t , this . _changed ( ) } , equals : function ( t ) { return t === this || t && this . _class === t . _class && this . _color . equals ( t . _color ) && this . _offset == t . _offset || ! 1 } } ) , V = r . extend ( new function ( ) { var t = { fillColor : null , fillRule : "nonzero" , strokeColor : null , strokeWidth : 1 , strokeCap : "butt" , strokeJoin : "miter" , strokeScaling : ! 0 , miterLimit : 10 , dashOffset : 0 , dashArray : [ ] , shadowColor : null , shadowBlur : 0 , shadowOffset : new c , selectedColor : null } , i = r . set ( { } , t , { fontFamily : "sans-serif" , fontWeight : "normal" , fontSize : 12 , leading : null , justification : "left" } ) , n = r . set ( { } , i , { fillColor : new D } ) , s = { strokeWidth : 193 , strokeCap : 193 , strokeJoin : 193 , strokeScaling : 201 , miterLimit : 193 , fontFamily : 9 , fontWeight : 9 , fontSize : 9 , font : 9 , leading : 9 , justification : 9 } , a = { beans : ! 0 } , o = { _class : "Style" , beans : ! 0 , initialize : function ( e , r , s ) { this . _values = { } , this . _owner = r , this . _project = r && r . _project || s || rt . project , this . _defaults = ! r || r instanceof x ? i : r instanceof j ? n : t , e && this . set ( e ) } } ; return r . each ( i , function ( t , i ) { var n = /Color$/ . test ( i ) , h = "shadowOffset" === i , u = r . capitalize ( i ) , l =
} i . putImageData ( x , r . x , r . y ) } } } , it = new function ( ) { function t ( t , e , s ) { return i ( n . createElementNS ( r , t ) , e , s ) } function e ( t , e ) { var i = o [ e ] , n = i ? t . getAttributeNS ( i , e ) : t . getAttribute ( e ) ; return "null" === n ? null : n } function i ( t , e , i ) { for ( var n in e ) { var r = e [ n ] , s = o [ n ] ; "number" == typeof r && i && ( r = i . number ( r ) ) , s ? t . setAttributeNS ( s , n , r ) : t . setAttribute ( n , r ) } return t } var r = "http://www.w3.org/2000/svg" , s = "http://www.w3.org/2000/xmlns" , a = "http://www.w3.org/1999/xlink" , o = { href : a , xlink : s , xmlns : s + "/" , "xmlns:xlink" : s + "/" } ; return { svg : r , xmlns : s , xlink : a , create : t , get : e , set : i } } , nt = r . each ( { fillColor : [ "fill" , "color" ] , fillRule : [ "fill-rule" , "string" ] , strokeColor : [ "stroke" , "color" ] , strokeWidth : [ "stroke-width" , "number" ] , strokeCap : [ "stroke-linecap" , "string" ] , strokeJoin : [ "stroke-linejoin" , "string" ] , strokeScaling : [ "vector-effect" , "lookup" , { "true" : "none" , "false" : "non-scaling-stroke" } , function ( t , e ) { return ! e && ( t instanceof A || t instanceof S || t instanceof j ) } ] , miterLimit : [ "stroke-miterlimit" , "number" ] , dashArray : [ "stroke-dasharray" , "array" ] , dashOffset : [ "stroke-dashoffset" , "number" ] , fontFamily : [ "font-family" , "string" ] , fontWeight : [ "font-weight" , "string" ] , fontSize : [ "font-size" , "number" ] , justification : [ "text-anchor" , "lookup" , { left : "start" , center : "middle" , right : "end" } ] , opacity : [ "opacity" , "number" ] , blendMode : [ "mix-blend-mode" , "style" ] } , function ( t , e ) { var i = r . capitalize ( e ) , n = t [ 2 ] ; this [ e ] = { type : t [ 1 ] , property : e , attribute : t [ 0 ] , toSVG : n , fromSVG : n && r . each ( n , function ( t , e ) { this [ t ] = e } , { } ) , exportFilter : t [ 3 ] , get : "get" + i , set : "set" + i } } , { } ) ; new function ( ) { function e ( t , e , i ) { var n = new r , s = t . getTranslation ( ) ; if ( e ) { t = t . _shiftless ( ) ; var a = t . _inverseTransform ( s ) ; n [ i ? "cx" : "x" ] = a . x , n [ i ? "cy" : "y" ] = a . y , s = null } if ( ! t . isIdentity ( ) ) { var o = t . decompose ( ) ; if ( o ) { var h = [ ] , l = o . rotation , c = o . scaling , f = o . skewing ; s && ! s . isZero ( ) && h . push ( "translate(" + C . point ( s ) + ")" ) , l && h . push ( "rotate(" + C . number ( l ) + ")" ) , u . isZero ( c . x - 1 ) && u . isZero ( c . y - 1 ) || h . push ( "scale(" + C . point ( c ) + ")" ) , f . x && h . push ( "skewX(" + C . number ( f . x ) + ")" ) , f . y && h . push ( "skewY(" + C . number ( f . y ) + ")" ) , n . transform = h . join ( " " ) } else n . transform = "matrix(" + t . getValues ( ) . join ( "," ) + ")" } return n } function i ( t , i ) { for ( var n = e ( t . _matrix ) , r = t . _children , s = it . create ( "g" , n , C ) , a = 0 , o = r . length ; a < o ; a ++ ) { var h = r [ a ] , u = b ( h , i ) ; if ( u ) if ( h . isClipMask ( ) ) { var l = it . create ( "clipPath" ) ; l . appendChild ( u ) , m ( h , l , "clip" ) , it . set ( s , { "clip-path" : "url(#" + l . id + ")" } ) } else s . appendChild ( u ) } return s } function n ( t , i ) { var n = e ( t . _matrix , ! 0 ) , r = t . getSize ( ) , s = t . getImage ( ) ; return n . x -= r . width / 2 , n . y -= r . height / 2 , n . width = r . width , n . height = r . height , n . href = 0 == i . embedImages && s && s . src || t . toDataURL ( ) , it . create ( "image" , n , C ) } function s ( t , i ) { var n = i . matchShapes ; if ( n ) { var r = t . toShape ( ! 1 ) ; if ( r ) return a ( r , i ) } var s , o = t . _segments , h = o . length , u = e ( t . _matrix ) ; if ( n && h >= 2 && ! t . hasHandles ( ) ) if ( h > 2 ) { s = t . _closed ? "polygon" : "polyline" ; for ( var l = [ ] , c = 0 ; c < h ; c ++ ) l . push ( C . point ( o [ c ] . _point ) ) ; u . points = l . join ( " " ) } else { s = "line" ; var f = o [ 0 ] . _point , d = o [ 1 ] . _point ; u . set ( { x1 : f . x , y1 : f . y , x2 : d . x , y2 : d . y } ) } else s = "path" , u . d = t . getPathData ( null , i . precision ) ; return it . create ( s , u , C ) } function a ( t ) { var i = t . _type , n = t . _radius , r = e ( t . _matrix , ! 0 , "rectangle" !== i ) ; if ( "rectangle" === i ) { i = "rect" ; var s = t . _size , a = s . width , o = s . height ; r . x -= a / 2 , r . y -= o / 2 , r . width = a , r . height = o , n . isZero ( ) && ( n = null ) } return n && ( "circle" === i ? r . r = n : ( r . rx = n . width , r . ry = n . height ) ) , it . create ( i , r , C ) } function o ( t , i ) { var n = e ( t . _matrix ) , r = t . getPathData ( null , i . precision ) ; return r && ( n . d = r ) , it . create ( "path" , n , C ) } function c ( t , i ) { var n = e ( t . _matrix , ! 0 ) , r = t . _definition , s = v ( r , "symbol" ) , a = r . _item , o = a . getBounds ( ) ; return s || ( s = it . create ( "symbol" , { viewBox : C . rectangle ( o ) } ) , s . appendChild ( b ( a , i ) ) , m ( r , s , "symbol" ) ) , n . href = "#" + s . id , n . x += o . x , n . y += o . y , n . width = o . width , n . height = o . height , n . overflow = "visible" , it . create ( "use" , n , C ) } function f ( t ) { var e = v ( t , "color" ) ; if ( ! e ) { var i , n = t . getGradient ( ) , r = n . _radial , s = t . getOrigin ( ) , a = t . getDestination ( ) ; if ( r ) { i = { cx : s . x , cy : s . y , r : s . getDistance ( a ) } ; var o = t . getHighlight ( ) ; o && ( i . fx = o . x , i . fy = o . y ) } else i = { x1 : s . x , y1 : s . y , x2 : a . x , y2 : a . y } ; i . gradientUnits = "userSpaceOnUse" , e = it . create ( ( r ? "radial" : "linear" ) + "Gradient" , i , C ) ; for ( var h = n . _stops , u = 0 , l = h . length ; u < l ; u ++ ) { var c = h [ u ] , f = c . _color , d = f . getAlpha ( ) , _ = c . _offset ; i = { offset : nu