{"version":3,"sources":["webpack://mapping-impactful-media/./node_modules/paper/dist/paper-full.js"],"names":["self","undefined","window","document","Base","hidden","array","_slice","slice","create","Object","describe","getOwnPropertyDescriptor","define","defineProperty","forEach","iter","bind","i","l","this","length","call","forIn","hasOwnProperty","set","assign","dst","arguments","src","key","_each","obj","desc","value","_inject","dest","enumerable","beans","preserve","beansNames","field","name","val","get","substring","bean","isFunc","res","prev","base","match","toLowerCase","isPlainObject","writable","configurable","test","part","inject","statics","prototype","extend","ctor","proto","initialize","apply","each","clone","constructor","pick","a","b","list","begin","end","module","exports","toString","_id","_class","_name","type","push","Formatter","instance","number","join","getClassName","importJSON","json","exportJSON","options","toJSON","serialize","props","exclude","filter","_prioritize","equals","obj1","obj2","Array","isArray","keys","read","start","amount","peek","__index","readIndex","_readIndex","readNull","__read","filtered","__filtered","remain","readList","entry","readNamed","getNamed","hasValue","source","getSource","__unfiltered","readSupported","that","__source","arg","hasNamed","prioritize","processed","handleKey","isPlainValue","asString","compact","dictionary","isRoot","formatter","precision","definitions","references","add","item","id","ref","unshift","_serialize","_compactSerialize","deserialize","_data","_setDictionary","_isRoot","isFirst","hasDictionary","isDictionary","args","JSON","stringify","target","parse","useTarget","Item","Layer","insert","concat","items","itemsLength","startLength","splice","index","remove","append","_index","removed","capitalize","str","replace","toUpperCase","camelize","chr","hyphenate","Emitter","on","func","types","_eventTypes","handlers","_callbacks","indexOf","install","off","uninstall","once","handler","emit","event","setTarget","currentTarget","stop","responds","attach","detach","fire","_installEvents","events","_events","isString","PaperScope","paper","settings","applyMatrix","insertItems","handleSize","hitTolerance","project","projects","tools","_scopes","support","ctx","CanvasProvider","getContext","nativeDash","nativeBlendModes","BlendMode","nativeModes","release","agent","user","navigator","userAgent","os","exec","platform","browser","n","v1","v2","rv","chrome","v","version","versionNumber","parseFloat","trident","jsdom","webkit","atom","getView","_view","getPaper","execute","code","PaperScript","View","updateFocus","scope","setup","element","Project","createCanvas","width","height","getCanvas","activate","clear","handleAttribute","el","attr","getAttribute","hasAttribute","PaperScopeItem","_scope","_list","_reference","isActive","CollisionDetection","findItemBoundsCollisions","items1","items2","tolerance","getBounds","bounds","rect","left","top","right","bottom","bounds1","bounds2","findBoundsCollisions","findCurveBoundsCollisions","curves1","curves2","bothAxis","curves","min","Math","max","hor","ver","boundsA","boundsB","sweepVertical","onlySweepAxisCollisions","allBounds","lengthA","lengthAll","binarySearch","indices","coord","lo","hi","mid","pri0","pri1","sec0","sec1","allIndicesByPri0","sort","i1","i2","activeIndicesByPri1","allCollisions","curIndex","curBounds","origIndex","isCurrentA","isCurrentB","curCollisions","pruneCount","j","activeIndex","curSec1","curSec0","activeBounds","isActiveA","isActiveB","collisions","multiplier","pow","round","pair","val1","val2","separator","point","x","y","size","rectangle","Numerical","abscissas","weights","abs","sqrt","log2","log","LOG2E","EPSILON","MACHINE_EPSILON","clamp","getDiscriminant","c","split","D","E","ad","bd","cd","p","q","getNormalizationFactor","norm","CURVETIME_EPSILON","GEOMETRIC_EPSILON","TRIGONOMETRIC_EPSILON","KAPPA","isZero","isMachineZero","integrate","f","w","A","B","m","sum","Ax","findRoot","df","fx","dx","nx","solveQuadratic","roots","x1","x2","Infinity","Q","R","count","boundless","minB","maxB","isFinite","solveCubic","d","b1","c2","qd","evaluate","x0","tmp","t","r","s","td","rd","UID","_pools","pool","Point","arg0","arg1","reading","hasY","_set","setAngle","angle","getLength","setLength","_angle","cos","sin","scale","getAngle","getAngleInRadians","PI","setAngleInRadians","getAngleInDegrees","setAngleInDegrees","div","NaN","dot","acos","atan2","getQuadrant","getDirectedAngle","cross","getDistance","squared","normalize","current","rotate","center","subtract","transform","matrix","_transformPoint","multiply","divide","modulo","negate","isInside","_Rectangle","contains","isClose","isCollinear","isColinear","isOrthogonal","isNaN","_isNaN","isInQuadrant","point1","point2","random","y1","y2","op","LinkedPoint","owner","setter","_x","_y","_owner","_setter","_dontNotify","getX","setX","getY","setY","isSelected","_selection","_getSelection","setSelected","selected","_changeSelection","Size","hasHeight","_isNaN2","size1","size2","LinkedSize","_width","_height","getWidth","setWidth","getHeight","setHeight","arg2","arg3","from","to","frm","next","rt","getPoint","_dontLink","setPoint","getSize","_fw","_fh","setSize","sx","_sx","sy","_sy","h","getLeft","setLeft","getTop","setTop","getRight","setRight","getBottom","setBottom","getCenterX","setCenterX","getCenterY","setCenterY","getCenter","setCenter","getArea","isEmpty","_containsRectangle","_containsPoint","intersects","epsilon","intersect","unite","include","expand","parts","xFirst","LinkedRectangle","internal","Matrix","ok","_a","_b","_c","_d","_tx","_ty","reset","Error","tx","ty","_changed","getValues","_applyMatrix","mx","recursively","_setApplyMatrix","isIdentity","translate","shear","skew","toRadians","tan","a1","c1","d1","a2","b2","d2","tx2","ty2","prepend","tx1","ty1","appended","prepended","invert","det","inverted","concatenate","preConcatenate","chain","_shiftless","_orNullIfIdentity","isInvertible","isSingular","_transformCoordinates","_transformCorners","coords","_transformBounds","inverseTransform","_inverseTransform","decompose","degrees","asin","translation","getTranslation","rotation","scaling","skewing","getScaling","getRotation","applyToContext","prop","Line","arg4","asVector","_px","_py","_vx","_vy","getVector","line","isInfinite","getSide","getSignedDistance","p1x","p1y","v1x","v1y","p2x","p2y","v2x","v2y","dy","u1","u2","uMin","uMax","px","py","vx","vy","ccw","_children","_namedChildren","_activeLayer","_currentStyle","Style","_selectionItems","_selectionCount","_updateVersion","flags","view","_needsUpdate","_requested","_autoUpdate","requestUpdate","changes","_changes","changesById","_changesById","children","getCurrentStyle","setCurrentStyle","style","getIndex","getOptions","getLayers","getActiveLayer","getSymbolDefinitions","ids","getItems","class","SymbolItem","definition","_definition","getSymbols","getSelectedItems","selectionItems","selection","isInserted","_updateSelection","selectAll","setFullySelected","deselectAll","addLayer","layer","insertLayer","_remove","_setProject","setName","_insertItem","_created","NO_INSERT","insertChild","_getItems","getItem","removeOn","sets","_removeSets","mousedrag","other","draw","pixelRatio","save","param","offset","viewMatrix","matrices","updateMatrix","restore","strokeWidth","_drawSelection","_serializeFields","_canApplyMatrix","_canScaleStroke","_pivot","_visible","_blendMode","_opacity","_locked","_guide","_clipMask","_selectBounds","_selectChildren","pivot","visible","blendMode","opacity","locked","guide","clipMask","data","_countItemEvent","onFrame","_animateItem","onLoad","onError","_itemHandlers","_initialize","hasProps","_matrix","_parent","_style","parent","fields","fontSize","Group","_defaults","symbol","_symbol","cacheParent","_project","_bounds","_position","_decomposed","_globalMatrix","_clearBoundsCache","getId","getName","_removeNamed","_getOwner","namedChildren","getStyle","setStyle","getSelection","setSelection","flag","isFullySelected","isClipMask","setClipMask","setFillColor","setStrokeColor","getData","setData","getPosition","position","_getPositionFromBounds","setPosition","getPivot","setPivot","getStrokeBounds","stroke","getHandleBounds","handle","getInternalBounds","hasMatrix","opts","_boundsOptions","getStrokeScaling","cacheItem","_getCachedBounds","setBounds","_backup","_getBounds","_updateBoundsCache","_getBoundsCacheKey","noInternal","cacheKey","cached","nonscaling","hasStroke","_getStrokeMatrix","_item","getViewMatrix","_boundsCache","cache","_decompose","decomposed","setRotation","setScaling","getMatrix","setMatrix","getGlobalMatrix","_dontClone","parents","getApplyMatrix","setApplyMatrix","getTransformContent","setTransformContent","getProject","installEvents","getLayer","getParent","setParent","addChild","getChildren","setChildren","removeChildren","addChildren","getFirstChild","getLastChild","getNextSibling","getPreviousSibling","_equals","copy","deep","copyAttributes","copyContent","insertAbove","orig","excludeMatrix","rasterize","resolution","raster","Raster","getResolution","topLeft","getTopLeft","floor","bottomRight","getBottomRight","ceil","boundsSize","rasterSize","_contains","_asPathItem","Path","Rectangle","getIntersections","hitTest","_hitTest","HitResult","hitTestAll","all","hitTestChildren","_exclude","child","_hitTestChildren","parentViewMatrix","guides","tolerancePadding","_tolerancePadding","_getStrokePadding","checkSelf","hit","checkPoint","pt","checkPosition","checkCenter","checkBounds","points","_hitTestSelf","fill","hasFill","matches","compare","matchObject","firstOnly","overlapping","inside","recursive","path","childMatrix","insertChildren","inserted","notifySelf","_insertAt","insertBelow","sendToBack","bringToFront","appendTop","appendBottom","moveAbove","moveBelow","addTo","copyTo","reduce","namedArray","notifyParent","_dispose","replaceWith","reverseChildren","reverse","numChildren","isEditable","hasShadow","_getOrder","getList","list1","list2","hasChildren","isAbove","isBelow","isParent","isChild","isDescendant","isAncestor","isSibling","isGroupedWith","_applyRecursively","transformMatrix","fillColor","getFillColor","strokeColor","getStrokeColor","_transformContent","decomp","applyRecursively","globalToLocal","localToGlobal","parentToLocal","localToParent","fitBounds","itemRatio","rectRatio","newBounds","_setStyles","fillStyle","toCanvasStyle","strokeStyle","lineWidth","getStrokeWidth","strokeJoin","getStrokeJoin","strokeCap","getStrokeCap","miterLimit","getMiterLimit","lineJoin","lineCap","dashArray","getDashArray","dashOffset","getDashOffset","setLineDash","lineDashOffset","mozDash","mozDashOffset","blur","getShadowBlur","getShadowOffset","shadowColor","getShadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","parentStrokeMatrix","globalMatrix","mainCtx","itemOffset","prevOffset","normalBlend","nativeBlend","direct","dontStart","clip","_canComposite","pop","strokeMatrix","clipItem","globalAlpha","globalCompositeOperation","setTransform","_draw","dontFinish","getFillRule","process","_isUpdated","updateVersion","CompoundPath","updated","itemSelected","boundsSelected","positionSelected","_drawSelected","color","getSelectedColor","half","pos","beginPath","arc","deltas","delta","moveTo","lineTo","closePath","fillRect","hash","tween","easing","duration","Tween","_handleFrame","time","running","tweenTo","tweenFrom","_clipItem","_getClipItem","isClipped","setClipped","clipped","Shape","radius","_type","_size","_radius","setType","setRadius","getType","getShape","setShape","getRadius","rad","toPath","toShape","dontPaint","untransformed","isCircle","rx","ry","kappa","cx","cy","bezierCurveTo","getCornerCenter","halfSize","dir","corner","quadrant","isOnEllipseStroke","padding","vector","hitStroke","hitFill","strokeRadius","strokePadding","outer","inner","createShape","Circle","Ellipse","ellipse","_readEllipse","crossOrigin","_smoothing","image","object","getElementById","naturalHeight","setImage","setSource","_loaded","_image","canvas","_canvas","_setImage","copyCanvas","drawImage","_crossOrigin","_clear","getElement","getLoaded","u","getPpi","getImage","Event","setTimeout","DomEvent","load","error","complete","naturalWidth","_context","e","setCanvas","_change","setContext","context","toDataURL","Image","getCrossOrigin","setCrossOrigin","getSmoothing","setSmoothing","smoothing","getSubCanvas","getSubRaster","getAverageColor","PathItem","_sampleContext","clearRect","sampleSize","pixels","getImageData","channels","total","alpha","Color","getPixel","setPixel","components","_convert","_alpha","imageData","createImageData","putImageData","setImageData","disabled","DomElement","setPrefixed","setDefinition","SymbolDefinition","getDefinition","getSymbol","setSymbol","dontCenter","setItem","_dontCenter","place","values","segments","handles","ends","Segment","arg5","handleIn","handleOut","SegmentPoint","_point","hasHandles","_handleIn","_handleOut","_path","curve","_curves","_closed","getHandleIn","setHandleIn","getHandleOut","setHandleOut","isSmooth","clearHandles","oldSelection","getPath","getCurve","_segments","getCurves","getLocation","CurveLocation","_segment1","getNext","smooth","_first","_last","factor","getPrevious","p0","p1","p2","k","d1_a","d1_2a","d2_a","d2_2a","N","isLast","reversed","removeSegment","segment","interpolate","handleIn1","handleIn2","handleOut2","handleOut1","change","Curve","arg6","arg7","seg1","seg2","handle1","handle2","segment1","segment2","_segment2","getPoint1","getHandle1","getHandle2","getPoint2","_length","classify","setPoint1","setPoint2","setHandle1","setHandle2","getSegment1","getSegment2","getPoints","getLine","getPart","getPartLength","divideAt","location","divideAtTime","getTimeAt","_setHandles","subdivide","setHandles","splitAt","splitAtTime","getLocationAtTime","isTime","straight","h1","h2","y0","x3","y3","x4","y4","x5","y5","x6","y6","x7","y7","x8","y8","x9","y9","getMonoCurves","io","o0","o1","o2","o3","isStraight","v0","v3","getTimeOf","p3","geomEpsilon","getNearestTime","minDist","minT","refine","dist","step","flip","isFlatEnough","flatness","ux","uy","_addBounds","minPad","maxPad","s1","s2","isLinear","third","hasLength","isHorizontal","getTangentAtTime","isVertical","getLocationAt","_isTime","getParameterAt","getTimesWithTangent","tangent","getOffsetAtTime","getLocationOf","getOffsetOf","loc","getOffset","getParameterOf","getNearestLocation","getNearestPoint","methods","_evaluateMethods","getLengthIntegrand","ax","bx","ay","by","getIterations","normalized","tMin","tMax","len","d3","serpentine","t1","t2","hasRoots","t1Ok","t2Ok","f1","f2","ds","forward","rangeLength","diff","guess","getTangent","getWeightedTangent","getNormal","getWeightedNormal","getCurvature","getPeaks","addLocation","locations","overlap","excludeStart","excludeEnd","loc1","loc2","_intersection","addCurveIntersections","recursion","calls","tMinClip","tMaxClip","q0x","q0y","q3x","q3y","dMin","dMax","dp0","dp1","dp2","dp3","hull","dq0","dq1","dq2","dq3","dist1","dist2","distRatio","getConvexHull","clipConvexHull","tMinNew","tMaxNew","uDiff","hullTop","hullBottom","clipConvexHullPart","threshold","qx","qy","getCurveLineIntersections","addCurveLineIntersections","addLineIntersection","getCurveIntersections","overlaps","getOverlaps","straight1","straight2","before","getSelfIntersection","info","getSquaredLineLength","straightBoth","l1","l2","pairs","matrix1","matrix2","_returnFirst","length1","length2","values1","values2","boundsCollisions","index1","curve1","collisions1","index2","curve2","den","times","t0","_overlap","_distance","_setCurve","_time","getPointAtTime","_next","_previous","_setPath","_version","_curve","_segment","_setSegment","getSegment","getTime","trySegment","_offset","_curveOffset","getParameter","getCurveOffset","getIntersection","getLastSegment","_ignoreOther","isTouching","inter","isCrossing","t1Inside","t2Inside","c4","c3","offsets","addOffsets","isInRange","getPointAt","v4","a3","a4","hasOverlap","merge","search","found","path1","path2","expanded","compound","pathData","first","isClockwise","setClockwise","clockwise","setPathData","previous","control","relative","getCoord","command","lower","move","cubicCurveTo","quadraticCurveTo","arcTo","winding","_getWinding","onPath","windingL","windingR","getCrossings","minLoc","isPath","itemsFrom","itemsTo","setClosed","paths1","paths2","matched","boundsOverlaps","pathBoundsOverlaps","closed","setSegments","_segmentSelection","_area","getSegments","fullySelected","last","_add","getFirstSegment","_countCurves","getFirstCurve","getLastCurve","isClosed","getPathData","_precision","curX","curY","prevX","prevY","inX","inY","outX","outY","addSegment","skipLine","segs","_adjustCurves","insertSegment","addSegments","insertSegments","removeSegments","_includeCurves","area","_selectSegments","newSelection","last1","last2","first2","first1","simplify","flatten","PathFlattener","PathFitter","fit","_default","loop","asymmetric","paddingLeft","paddingRight","knots","n_1","rf","hx","hy","topCenter","seg3","seg4","isArc","pt1","pt2","shape","pos2","end2","pos1","end1","start2","cap","numSegments","hitCurves","isCloseEnough","checkSegmentPoint","seg","anchor","checkSegmentPoints","addToArea","checkSegmentStroke","isJoin","_addBevelJoin","_addSquareCap","getOffsetsWithTangent","curveStart","curveTimes","drawSegments","drawSegment","dashLength","flattener","drawPart","pX","pY","miniSize","miniHalf","drawHandle","hX","hY","drawHandles","getCurrentSegment","moveBy","curveTo","through","extent","middle","large","rxSq","rySq","xSq","ySq","throughSide","centerSide","ext","inc","z","out","_in","lineBy","curveBy","parameter","cubicCurveBy","quadraticCurveBy","arcBy","method","prevCoords","processSegment","joinBounds","addPoint","addRound","addJoin","addCap","phi","isArea","normal1","getNormalAtTime","normal2","normal","joinPadding","joinRadius","SQRT2","paddingX","paddingY","xn","xx","yn","yx","ellipseSegments","createPath","createEllipse","bl","getBottomLeft","tl","tr","getTopRight","br","RoundRectangle","Oval","Arc","RegularPolygon","sides","three","Star","radius1","radius2","paths","getCurrentPath","check","operators","getPaths","preparePath","resolve","resolveCrossings","reorient","createResult","result","filterIntersection","traceBoolean","operation","trace","splitBoolean","_path1","_path2","operator","crossings","divideLocations","collectPaths","_overlapsOnly","curvesValues","curveCollisions","curveCollisionsMap","propagateWinding","_winding","tracePaths","reorientPaths","added","addPath","linkIntersections","clearCurveHandles","lookup","container","sorted","entry1","containerWinding","getInteriorPoint","entry2","clearLater","renormalizeLocs","prevCurve","prevTime","results","clearCurves","clearLookup","origTime","newCurve","getWinding","dontFlip","vPrev","vClose","curvesList","ia","pv","pa","po","qualityEpsilon","paL","paR","pathWindingL","pathWindingR","onAnyPath","quality","addWinding","a0","windingPrev","a3Prev","handleCurve","monoCurves","totalLength","curveLength","operand","SQRT1_2","wind","pathWinding","starts","isValid","_visited","isStart","visitPath","getCrossingSegments","collectStarts","collect","nextInter","inter1","inter2","over1","over2","branch","visited","valid","finished","branches","shift","hasOverlaps","hasCrossings","intersections","nonZero","intercepts","mv","mo0","mo3","maxRecursion","ignoreStraight","minSpan","addCurve","computeParts","halves","tMid","_get","fitCubic","tan1","tan2","uPrime","chordLengthParameterize","maxError","parametersInOrder","generateBezier","findMaxError","reparameterize","tanCenter","C","X","b0","b3","alpha1","alpha2","detC0C1","detC0X","c0","segLength","eps","degree","maxDist","TextItem","content","_content","_lines","setContent","getContent","getCharacterStyle","setCharacterStyle","getParagraphStyle","setParagraphStyle","PointText","lines","leading","getLeading","font","getFontStyle","textAlign","getJustification","fillText","strokeText","numLines","justification","getTextWidth","colorCtx","gray","rgb","hsb","hsl","gradient","componentParsers","namedColors","transparent","fromCSS","string","parseInt","trim","isHSL","component","unit","turn","grad","hsbIndices","converters","g","achromatic","t3s","t3","properties","parser","_components","Gradient","_removeOwner","_addOwner","_properties","argType","converted","parsers","stops","radial","getComponents","_canvasStyle","converter","convert","getAlpha","setAlpha","hasAlpha","col","isGradient","toCSS","hex","canvasGradient","_stops","origin","destination","highlight","inverse","_radial","createRadialGradient","createLinearGradient","addColorStop","_color","_types","_setOwner","components1","components2","setStops","setRadial","_owners","getStops","GradientStop","getRadial","stops1","stops2","rampPoint","setColor","setOffset","getRampPoint","setRampPoint","getColor","itemDefaults","fillRule","strokeScaling","shadowOffset","selectedColor","groupDefaults","fontFamily","fontWeight","textDefaults","_values","isColor","isPoint","applyToChildren","old","_dontMerge","childValue","Font","WindingRule","isStyle","style1","style2","secondary","defaults2","value1","value2","getFontSize","getFontWeight","getFontFamily","getFont","setFont","getPixelSize","handlePrefix","prefixes","suffix","prefix","getStyles","doc","nodeType","ownerDocument","defaultView","getComputedStyle","viewport","body","html","documentElement","getBoundingClientRect","clientLeft","clientTop","pageXOffset","scrollLeft","pageYOffset","scrollTop","getViewportBounds","innerWidth","clientWidth","innerHeight","clientHeight","isInvisible","isInView","getPrefixed","passive","addEventListener","removeEventListener","targetTouches","changedTouches","pageX","clientX","pageY","clientY","getTarget","srcElement","getRelatedTarget","relatedTarget","toElement","requestAnimationFrame","timer","nativeRequest","requested","callbacks","handleCallbacks","functions","callback","setInterval","getCanvasSize","setAttribute","_viewEvents","none","userDrag","userSelect","touchCallout","contentZooming","tapHighlightColor","_windowEvents","resize","setViewSize","Stats","_stats","stats","domElement","appendChild","_element","_pixelRatio","devicePixelRatio","_setElementSize","_viewSize","_views","_viewsById","_focused","_frameItems","_frameItemCount","_itemEvents","native","virtual","node","_animate","play","pause","_count","getAutoUpdate","setAutoUpdate","autoUpdate","update","now","Date","animate","_handleFrameItems","getPixelRatio","getViewSize","isVisible","parentNode","temp","createElement","removeChild","getZoom","setZoom","zoom","scrollBy","projectToView","viewToProject","getEventPoint","CanvasView","prevFocus","tempFocus","mousedown","mousemove","mouseup","dragging","mouseDown","pointerEnabled","msPointerEnabled","viewEvents","docEvents","mouseout","nodeName","handleMouseMove","scroll","_handleMouseEvent","downPoint","lastPoint","downItem","overItem","dragItem","clickItem","clickTime","dblClick","called","prevented","fallbacks","doubleclick","wasInView","itemEventsMap","click","mouseenter","mouseleave","itemEvents","hitItems","nativeMove","tool","inView","hitItem","mouse","substr","emitMouseEvent","drag","emitMouseEvents","down","up","cancelable","preventDefault","_handleKeyEvent","character","keyEvent","KeyEvent","sign","_resetState","prevPoint","stopItem","mouseEvent","stopped","MouseEvent","fallback","HTMLCanvasElement","deviceRatio","backingStoreRatio","firefox","prevFont","measureText","stopPropagation","getTimeStamp","timeStamp","getModifiers","Key","modifiers","metaFixMap","downKey","keyLookup","charLookup","keyMap","charMap","alt","meta","capsLock","space","option","mac","getKey","keyIdentifier","String","fromCharCode","keyCode","keydown","altKey","metaKey","ctrlKey","keypress","charCode","keyup","isDown","ToolEvent","_choosePoint","toolPoint","getLastPoint","_lastPoint","setLastPoint","getDownPoint","_downPoint","setDownPoint","getMiddlePoint","_middlePoint","setMiddlePoint","middlePoint","getDelta","_delta","setDelta","getCount","setCount","Tool","_moveCount","_downCount","getMinDistance","_minDistance","setMinDistance","minDistance","_maxDistance","getMaxDistance","setMaxDistance","maxDistance","getFixedDistance","setFixedDistance","distance","easings","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","isFunction","_then","_startTime","state","_keys","_parsedKeys","_parseKeys","_from","_getState","_to","then","progress","getValue","__add","__subtract","__multiply","_setProperty","onUpdate","startTime","_getProperty","resolved","_resolveValue","_calculate","parsed","calculateBinary","Http","xhr","XMLHttpRequest","open","url","async","mimeType","overrideMimeType","onload","status","responseText","onerror","message","send","canvases","sr","sg","sb","sa","bg","bb","ba","dr","dg","db","getLum","setLum","mn","lmn","ln","mxl","getSat","setSat","md","modes","screen","overlay","darken","lighten","difference","exclusion","hue","saturation","luminosity","average","negation","mode","srcContext","dstContext","srcCanvas","dstData","SvgElement","svg","xmlns","xlink","attributeNamespace","href","attributes","namespace","setAttributeNS","tag","createElementNS","getAttributeNS","SvgStyles","true","false","property","attribute","toSVG","fromSVG","exportFilter","getTransform","coordinates","attrs","trans","exportGroup","childNode","_exportSVG","exportShape","exporters","embedImages","matchShapes","definitionItem","viewBox","overflow","textContent","applyStyle","gradientNode","getGradient","getOrigin","getDestination","getHighlight","fy","gradientUnits","stopColor","exportGradient","visibility","svgs","__id","typeId","exportDefinitions","defs","insertBefore","firstChild","XMLSerializer","serializeToString","exporter","onExport","setOptions","exportSVG","rootSize","allowNull","allowPercent","defaultValue","defaultX","defaultY","convertValue","map","importGroup","nodes","childNodes","isClip","isDefs","currentStyle","applyAttributes","querySelectorAll","importNode","importPoly","importGradient","scaleToBounds","_scaleToBounds","importers","clippath","polygon","polyline","lineargradient","radialgradient","use","circle","text","switch","applyTransform","transforms","applyOpacity","gradientTransform","setVisible","display","percent","styles","group","tagName","isElement","nextSibling","importer","onImport","expandShapes","_importSVG","DOMParser","parseFromString","File","reader","FileReader","readAsText","importSVG","mod","global","acorn","input","inputLen","sourceFile","inpt","initTokenState","program","lastStart","lastEnd","tokPos","lastEndLoc","line_loc_t","inFunction","strict","labels","readToken","startNode","tokType","_eof","stmt","parseStatement","isUseStrict","setStrict","finishNode","parseTopLevel","defaultOptions","ecmaVersion","strictSemicolons","allowTrailingCommas","forbidReserved","allowReturnOutsideFunction","onComment","ranges","directSourceFile","opt","tokStart","tokEnd","tokStartLoc","tokEndLoc","tokVal","tokRegexpAllowed","tokCurLine","tokLineStart","getLineInfo","cur","lineBreak","lastIndex","column","raise","err","SyntaxError","raisedAt","tokenize","getToken","forceRegexp","startLoc","endLoc","jumpTo","reAllowed","skipSpace","empty","_num","_regexp","_string","_break","keyword","_case","beforeExpr","_catch","_continue","_debugger","_do","isLoop","_else","_finally","_for","_function","_if","_return","_switch","_throw","_try","_var","_while","_with","_new","_this","_null","atomValue","_true","_false","binop","keywordTypes","_bracketL","_bracketR","_braceL","_braceR","_parenL","_parenR","_comma","_semi","_colon","_dot","_question","_slash","_eq","isAssign","_assign","_incDec","postfix","isUpdate","_prefix","_logicalOR","_logicalAND","_bitwiseOR","_bitwiseXOR","_bitwiseAND","_equality","_relational","_bitShift","_plusMin","_multiplyModulo","kw","tokTypes","bracketL","bracketR","braceL","braceR","parenL","parenR","comma","semi","colon","question","slash","eq","eof","num","regexp","makePredicate","words","cats","compareTo","arr","cat","Function","containsEsc","isReservedWord3","isReservedWord5","isStrictReservedWord","isStrictBadIdWord","isKeyword","nonASCIIwhitespace","nonASCIIidentifierStartChars","nonASCIIidentifierStart","RegExp","nonASCIIidentifier","newline","isIdentifierStart","isIdentifierChar","finishToken","skipBlockComment","skipLineComment","ch","charCodeAt","getTokenFromCode","readNumber","readToken_dot","readInt","readHexNumber","quote","octal","readHexChar","readString","readRegexp","finishOp","readToken_slash","readToken_pipe_amp","readToken_plus_min","readToken_lt_gt","readToken_eq_excl","readWord","tok","escaped","inClass","charAt","mods","readWord1","radix","startsWithDot","isFloat","word","esc","escStr","strct","lastIndexOf","node_t","node_loc_t","range","startNodeFrom","expression","eat","canInsertSemicolon","semicolon","unexpected","expect","checkLVal","expr","loopLabel","kind","switchLabel","starttype","isBreak","label","parseIdent","lab","parseParenExpression","parseFor","init","parseVar","declarations","parseForIn","parseExpression","parseFunction","consequent","alternate","argument","discriminant","cases","sawDefault","isCase","block","parseBlock","clause","guard","guardedHandlers","finalizer","maybeName","allowStrict","oldStrict","noIn","decl","noComma","parseMaybeAssign","expressions","parseExprOp","parseMaybeUnary","parseExprOps","parseMaybeConditional","minPrec","prec","parseSubscripts","parseExprAtom","noCalls","computed","callee","parseExprList","raw","tokStartLoc1","tokStart1","elements","sawGetSet","parsePropertyName","isGetSet","conflict","parseObj","parseNew","isStatement","params","oldInFunc","oldLabels","close","allowTrailingComma","allowEmpty","elts","liberal","binaryOperators","unaryOperators","__self","__$__","$__","compile","insertions","insertion","getCode","replaceCode","handleOverloading","between","getBetween","parentType","exp","sourceMaps","paperFeatures","offsetCode","lineBreaks","getElementsByTagName","innerHTML","mappings","encodeVLQ","safari","file","names","sourceRoot","sources","sourcesContent","operatorOverloading","moduleExports","walkAST","declaration","specifiers","dec","specifier","handleExports","preserveParens","sourceType","btoa","unescape","encodeURIComponent","toolHandlers","compiled","expose","script","head","createTextNode","__paperscript__","onResize","setOnResize","setOnFrame","loadScript","canvasId","scopeAttribute","baseURI","loadAll","readyState","calculateUnary","Symbol","PlacedSymbol"],"mappings":"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","file":"546dce3a-916c6c3ffb8235997145.js","sourcesContent":["/*!\n * Paper.js v0.12.15 - The Swiss Army Knife of Vector Graphics Scripting.\n * http://paperjs.org/\n *\n * Copyright (c) 2011 - 2020, Jürg Lehni & Jonathan Puckey\n * http://juerglehni.com/ & https://puckey.studio/\n *\n * Distributed under the MIT license. See LICENSE file for details.\n *\n * All rights reserved.\n *\n * Date: Wed Mar 17 10:49:48 2021 +0100\n *\n ***\n *\n * Straps.js - Class inheritance library with support for bean-style accessors\n *\n * Copyright (c) 2006 - 2020 Jürg Lehni\n * http://juerglehni.com/\n *\n * Distributed under the MIT license.\n *\n ***\n *\n * Acorn.js\n * https://marijnhaverbeke.nl/acorn/\n *\n * Acorn is a tiny, fast JavaScript parser written in JavaScript,\n * created by Marijn Haverbeke and released under an MIT license.\n *\n */\nvar paper = function (self, undefined) {\n self = self || require('./node/self.js');\n var window = self.window,\n document = self.document;\n var Base = new function () {\n var hidden = /^(statics|enumerable|beans|preserve)$/,\n array = [],\n _slice = array.slice,\n create = Object.create,\n describe = Object.getOwnPropertyDescriptor,\n define = Object.defineProperty,\n forEach = array.forEach || function (iter, bind) {\n for (var i = 0, l = this.length; i < l; i++) {\n iter.call(bind, this[i], i, this);\n }\n },\n forIn = function forIn(iter, bind) {\n for (var i in this) {\n if (this.hasOwnProperty(i)) iter.call(bind, this[i], i, this);\n }\n },\n set = Object.assign || function (dst) {\n for (var i = 1, l = arguments.length; i < l; i++) {\n var src = arguments[i];\n\n for (var key in src) {\n if (src.hasOwnProperty(key)) dst[key] = src[key];\n }\n }\n\n return dst;\n },\n _each = function each(obj, iter, bind) {\n if (obj) {\n var desc = describe(obj, 'length');\n (desc && typeof desc.value === 'number' ? forEach : forIn).call(obj, iter, bind = bind || obj);\n }\n\n return bind;\n };\n\n function _inject(dest, src, enumerable, beans, preserve) {\n var beansNames = {};\n\n function field(name, val) {\n val = val || (val = describe(src, name)) && (val.get ? val : val.value);\n if (typeof val === 'string' && val[0] === '#') val = dest[val.substring(1)] || val;\n var isFunc = typeof val === 'function',\n res = val,\n prev = preserve || isFunc && !val.base ? val && val.get ? name in dest : dest[name] : null,\n bean;\n\n if (!preserve || !prev) {\n if (isFunc && prev) val.base = prev;\n if (isFunc && beans !== false && (bean = name.match(/^([gs]et|is)(([A-Z])(.*))$/))) beansNames[bean[3].toLowerCase() + bean[4]] = bean[2];\n\n if (!res || isFunc || !res.get || typeof res.get !== 'function' || !Base.isPlainObject(res)) {\n res = {\n value: res,\n writable: true\n };\n }\n\n if ((describe(dest, name) || {\n configurable: true\n }).configurable) {\n res.configurable = true;\n res.enumerable = enumerable != null ? enumerable : !bean;\n }\n\n define(dest, name, res);\n }\n }\n\n if (src) {\n for (var name in src) {\n if (src.hasOwnProperty(name) && !hidden.test(name)) field(name);\n }\n\n for (var name in beansNames) {\n var part = beansNames[name],\n set = dest['set' + part],\n get = dest['get' + part] || set && dest['is' + part];\n if (get && (beans === true || get.length === 0)) field(name, {\n get: get,\n set: set\n });\n }\n }\n\n return dest;\n }\n\n function Base() {\n for (var i = 0, l = arguments.length; i < l; i++) {\n var src = arguments[i];\n if (src) set(this, src);\n }\n\n return this;\n }\n\n return _inject(Base, {\n inject: function inject(src) {\n if (src) {\n var statics = src.statics === true ? src : src.statics,\n beans = src.beans,\n preserve = src.preserve;\n if (statics !== src) _inject(this.prototype, src, src.enumerable, beans, preserve);\n\n _inject(this, statics, null, beans, preserve);\n }\n\n for (var i = 1, l = arguments.length; i < l; i++) {\n this.inject(arguments[i]);\n }\n\n return this;\n },\n extend: function extend() {\n var base = this,\n ctor,\n proto;\n\n for (var i = 0, obj, l = arguments.length; i < l && !(ctor && proto); i++) {\n obj = arguments[i];\n ctor = ctor || obj.initialize;\n proto = proto || obj.prototype;\n }\n\n ctor = ctor || function () {\n base.apply(this, arguments);\n };\n\n proto = ctor.prototype = proto || create(this.prototype);\n define(proto, 'constructor', {\n value: ctor,\n writable: true,\n configurable: true\n });\n\n _inject(ctor, this);\n\n if (arguments.length) this.inject.apply(ctor, arguments);\n ctor.base = base;\n return ctor;\n }\n }).inject({\n enumerable: false,\n initialize: Base,\n set: Base,\n inject: function inject() {\n for (var i = 0, l = arguments.length; i < l; i++) {\n var src = arguments[i];\n\n if (src) {\n _inject(this, src, src.enumerable, src.beans, src.preserve);\n }\n }\n\n return this;\n },\n extend: function extend() {\n var res = create(this);\n return res.inject.apply(res, arguments);\n },\n each: function each(iter, bind) {\n return _each(this, iter, bind);\n },\n clone: function clone() {\n return new this.constructor(this);\n },\n statics: {\n set: set,\n each: _each,\n create: create,\n define: define,\n describe: describe,\n clone: function clone(obj) {\n return set(new obj.constructor(), obj);\n },\n isPlainObject: function isPlainObject(obj) {\n var ctor = obj != null && obj.constructor;\n return ctor && (ctor === Object || ctor === Base || ctor.name === 'Object');\n },\n pick: function pick(a, b) {\n return a !== undefined ? a : b;\n },\n slice: function slice(list, begin, end) {\n return _slice.call(list, begin, end);\n }\n }\n });\n }();\n if (typeof module !== 'undefined') module.exports = Base;\n Base.inject({\n enumerable: false,\n toString: function toString() {\n return this._id != null ? (this._class || 'Object') + (this._name ? \" '\" + this._name + \"'\" : ' @' + this._id) : '{ ' + Base.each(this, function (value, key) {\n if (!/^_/.test(key)) {\n var type = typeof value;\n this.push(key + ': ' + (type === 'number' ? Formatter.instance.number(value) : type === 'string' ? \"'\" + value + \"'\" : value));\n }\n }, []).join(', ') + ' }';\n },\n getClassName: function getClassName() {\n return this._class || '';\n },\n importJSON: function importJSON(json) {\n return Base.importJSON(json, this);\n },\n exportJSON: function exportJSON(options) {\n return Base.exportJSON(this, options);\n },\n toJSON: function toJSON() {\n return Base.serialize(this);\n },\n set: function set(props, exclude) {\n if (props) Base.filter(this, props, exclude, this._prioritize);\n return this;\n }\n }, {\n beans: false,\n statics: {\n exports: {},\n extend: function extend() {\n var res = extend.base.apply(this, arguments),\n name = res.prototype._class;\n if (name && !Base.exports[name]) Base.exports[name] = res;\n return res;\n },\n equals: function equals(obj1, obj2) {\n if (obj1 === obj2) return true;\n if (obj1 && obj1.equals) return obj1.equals(obj2);\n if (obj2 && obj2.equals) return obj2.equals(obj1);\n\n if (obj1 && obj2 && typeof obj1 === 'object' && typeof obj2 === 'object') {\n if (Array.isArray(obj1) && Array.isArray(obj2)) {\n var length = obj1.length;\n if (length !== obj2.length) return false;\n\n while (length--) {\n if (!Base.equals(obj1[length], obj2[length])) return false;\n }\n } else {\n var keys = Object.keys(obj1),\n length = keys.length;\n if (length !== Object.keys(obj2).length) return false;\n\n while (length--) {\n var key = keys[length];\n if (!(obj2.hasOwnProperty(key) && Base.equals(obj1[key], obj2[key]))) return false;\n }\n }\n\n return true;\n }\n\n return false;\n },\n read: function read(list, start, options, amount) {\n if (this === Base) {\n var value = this.peek(list, start);\n list.__index++;\n return value;\n }\n\n var proto = this.prototype,\n readIndex = proto._readIndex,\n begin = start || readIndex && list.__index || 0,\n length = list.length,\n obj = list[begin];\n amount = amount || length - begin;\n\n if (obj instanceof this || options && options.readNull && obj == null && amount <= 1) {\n if (readIndex) list.__index = begin + 1;\n return obj && options && options.clone ? obj.clone() : obj;\n }\n\n obj = Base.create(proto);\n if (readIndex) obj.__read = true;\n obj = obj.initialize.apply(obj, begin > 0 || begin + amount < length ? Base.slice(list, begin, begin + amount) : list) || obj;\n\n if (readIndex) {\n list.__index = begin + obj.__read;\n var filtered = obj.__filtered;\n\n if (filtered) {\n list.__filtered = filtered;\n obj.__filtered = undefined;\n }\n\n obj.__read = undefined;\n }\n\n return obj;\n },\n peek: function peek(list, start) {\n return list[list.__index = start || list.__index || 0];\n },\n remain: function remain(list) {\n return list.length - (list.__index || 0);\n },\n readList: function readList(list, start, options, amount) {\n var res = [],\n entry,\n begin = start || 0,\n end = amount ? begin + amount : list.length;\n\n for (var i = begin; i < end; i++) {\n res.push(Array.isArray(entry = list[i]) ? this.read(entry, 0, options) : this.read(list, i, options, 1));\n }\n\n return res;\n },\n readNamed: function readNamed(list, name, start, options, amount) {\n var value = this.getNamed(list, name),\n hasValue = value !== undefined;\n\n if (hasValue) {\n var filtered = list.__filtered;\n\n if (!filtered) {\n var source = this.getSource(list);\n filtered = list.__filtered = Base.create(source);\n filtered.__unfiltered = source;\n }\n\n filtered[name] = undefined;\n }\n\n return this.read(hasValue ? [value] : list, start, options, amount);\n },\n readSupported: function readSupported(list, dest) {\n var source = this.getSource(list),\n that = this,\n read = false;\n\n if (source) {\n Object.keys(source).forEach(function (key) {\n if (key in dest) {\n var value = that.readNamed(list, key);\n\n if (value !== undefined) {\n dest[key] = value;\n }\n\n read = true;\n }\n });\n }\n\n return read;\n },\n getSource: function getSource(list) {\n var source = list.__source;\n\n if (source === undefined) {\n var arg = list.length === 1 && list[0];\n source = list.__source = arg && Base.isPlainObject(arg) ? arg : null;\n }\n\n return source;\n },\n getNamed: function getNamed(list, name) {\n var source = this.getSource(list);\n\n if (source) {\n return name ? source[name] : list.__filtered || source;\n }\n },\n hasNamed: function hasNamed(list, name) {\n return !!this.getNamed(list, name);\n },\n filter: function filter(dest, source, exclude, prioritize) {\n var processed;\n\n function handleKey(key) {\n if (!(exclude && key in exclude) && !(processed && key in processed)) {\n var value = source[key];\n if (value !== undefined) dest[key] = value;\n }\n }\n\n if (prioritize) {\n var keys = {};\n\n for (var i = 0, key, l = prioritize.length; i < l; i++) {\n if ((key = prioritize[i]) in source) {\n handleKey(key);\n keys[key] = true;\n }\n }\n\n processed = keys;\n }\n\n Object.keys(source.__unfiltered || source).forEach(handleKey);\n return dest;\n },\n isPlainValue: function isPlainValue(obj, asString) {\n return Base.isPlainObject(obj) || Array.isArray(obj) || asString && typeof obj === 'string';\n },\n serialize: function serialize(obj, options, compact, dictionary) {\n options = options || {};\n var isRoot = !dictionary,\n res;\n\n if (isRoot) {\n options.formatter = new Formatter(options.precision);\n dictionary = {\n length: 0,\n definitions: {},\n references: {},\n add: function add(item, create) {\n var id = '#' + item._id,\n ref = this.references[id];\n\n if (!ref) {\n this.length++;\n var res = create.call(item),\n name = item._class;\n if (name && res[0] !== name) res.unshift(name);\n this.definitions[id] = res;\n ref = this.references[id] = [id];\n }\n\n return ref;\n }\n };\n }\n\n if (obj && obj._serialize) {\n res = obj._serialize(options, dictionary);\n var name = obj._class;\n\n if (name && !obj._compactSerialize && (isRoot || !compact) && res[0] !== name) {\n res.unshift(name);\n }\n } else if (Array.isArray(obj)) {\n res = [];\n\n for (var i = 0, l = obj.length; i < l; i++) {\n res[i] = Base.serialize(obj[i], options, compact, dictionary);\n }\n } else if (Base.isPlainObject(obj)) {\n res = {};\n var keys = Object.keys(obj);\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n res[key] = Base.serialize(obj[key], options, compact, dictionary);\n }\n } else if (typeof obj === 'number') {\n res = options.formatter.number(obj, options.precision);\n } else {\n res = obj;\n }\n\n return isRoot && dictionary.length > 0 ? [['dictionary', dictionary.definitions], res] : res;\n },\n deserialize: function deserialize(json, create, _data, _setDictionary, _isRoot) {\n var res = json,\n isFirst = !_data,\n hasDictionary = isFirst && json && json.length && json[0][0] === 'dictionary';\n _data = _data || {};\n\n if (Array.isArray(json)) {\n var type = json[0],\n isDictionary = type === 'dictionary';\n\n if (json.length == 1 && /^#/.test(type)) {\n return _data.dictionary[type];\n }\n\n type = Base.exports[type];\n res = [];\n\n for (var i = type ? 1 : 0, l = json.length; i < l; i++) {\n res.push(Base.deserialize(json[i], create, _data, isDictionary, hasDictionary));\n }\n\n if (type) {\n var args = res;\n\n if (create) {\n res = create(type, args, isFirst || _isRoot);\n } else {\n res = new type(args);\n }\n }\n } else if (Base.isPlainObject(json)) {\n res = {};\n if (_setDictionary) _data.dictionary = res;\n\n for (var key in json) {\n res[key] = Base.deserialize(json[key], create, _data);\n }\n }\n\n return hasDictionary ? res[1] : res;\n },\n exportJSON: function exportJSON(obj, options) {\n var json = Base.serialize(obj, options);\n return options && options.asString == false ? json : JSON.stringify(json);\n },\n importJSON: function importJSON(json, target) {\n return Base.deserialize(typeof json === 'string' ? JSON.parse(json) : json, function (ctor, args, isRoot) {\n var useTarget = isRoot && target && target.constructor === ctor,\n obj = useTarget ? target : Base.create(ctor.prototype);\n\n if (args.length === 1 && obj instanceof Item && (useTarget || !(obj instanceof Layer))) {\n var arg = args[0];\n\n if (Base.isPlainObject(arg)) {\n arg.insert = false;\n\n if (useTarget) {\n args = args.concat([{\n insert: true\n }]);\n }\n }\n }\n\n (useTarget ? obj.set : ctor).apply(obj, args);\n if (useTarget) target = null;\n return obj;\n });\n },\n push: function push(list, items) {\n var itemsLength = items.length;\n\n if (itemsLength < 4096) {\n list.push.apply(list, items);\n } else {\n var startLength = list.length;\n list.length += itemsLength;\n\n for (var i = 0; i < itemsLength; i++) {\n list[startLength + i] = items[i];\n }\n }\n\n return list;\n },\n splice: function splice(list, items, index, remove) {\n var amount = items && items.length,\n append = index === undefined;\n index = append ? list.length : index;\n if (index > list.length) index = list.length;\n\n for (var i = 0; i < amount; i++) {\n items[i]._index = index + i;\n }\n\n if (append) {\n Base.push(list, items);\n return [];\n } else {\n var args = [index, remove];\n if (items) Base.push(args, items);\n var removed = list.splice.apply(list, args);\n\n for (var i = 0, l = removed.length; i < l; i++) {\n removed[i]._index = undefined;\n }\n\n for (var i = index + amount, l = list.length; i < l; i++) {\n list[i]._index = i;\n }\n\n return removed;\n }\n },\n capitalize: function capitalize(str) {\n return str.replace(/\\b[a-z]/g, function (match) {\n return match.toUpperCase();\n });\n },\n camelize: function camelize(str) {\n return str.replace(/-(.)/g, function (match, chr) {\n return chr.toUpperCase();\n });\n },\n hyphenate: function hyphenate(str) {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n }\n }\n });\n var Emitter = {\n on: function on(type, func) {\n if (typeof type !== 'string') {\n Base.each(type, function (value, key) {\n this.on(key, value);\n }, this);\n } else {\n var types = this._eventTypes,\n entry = types && types[type],\n handlers = this._callbacks = this._callbacks || {};\n handlers = handlers[type] = handlers[type] || [];\n\n if (handlers.indexOf(func) === -1) {\n handlers.push(func);\n if (entry && entry.install && handlers.length === 1) entry.install.call(this, type);\n }\n }\n\n return this;\n },\n off: function off(type, func) {\n if (typeof type !== 'string') {\n Base.each(type, function (value, key) {\n this.off(key, value);\n }, this);\n return;\n }\n\n var types = this._eventTypes,\n entry = types && types[type],\n handlers = this._callbacks && this._callbacks[type],\n index;\n\n if (handlers) {\n if (!func || (index = handlers.indexOf(func)) !== -1 && handlers.length === 1) {\n if (entry && entry.uninstall) entry.uninstall.call(this, type);\n delete this._callbacks[type];\n } else if (index !== -1) {\n handlers.splice(index, 1);\n }\n }\n\n return this;\n },\n once: function once(type, func) {\n return this.on(type, function handler() {\n func.apply(this, arguments);\n this.off(type, handler);\n });\n },\n emit: function emit(type, event) {\n var handlers = this._callbacks && this._callbacks[type];\n if (!handlers) return false;\n var args = Base.slice(arguments, 1),\n setTarget = event && event.target && !event.currentTarget;\n handlers = handlers.slice();\n if (setTarget) event.currentTarget = this;\n\n for (var i = 0, l = handlers.length; i < l; i++) {\n if (handlers[i].apply(this, args) == false) {\n if (event && event.stop) event.stop();\n break;\n }\n }\n\n if (setTarget) delete event.currentTarget;\n return true;\n },\n responds: function responds(type) {\n return !!(this._callbacks && this._callbacks[type]);\n },\n attach: '#on',\n detach: '#off',\n fire: '#emit',\n _installEvents: function _installEvents(install) {\n var types = this._eventTypes,\n handlers = this._callbacks,\n key = install ? 'install' : 'uninstall';\n\n if (types) {\n for (var type in handlers) {\n if (handlers[type].length > 0) {\n var entry = types[type],\n func = entry && entry[key];\n if (func) func.call(this, type);\n }\n }\n }\n },\n statics: {\n inject: function inject(src) {\n var events = src._events;\n\n if (events) {\n var types = {};\n Base.each(events, function (entry, key) {\n var isString = typeof entry === 'string',\n name = isString ? entry : key,\n part = Base.capitalize(name),\n type = name.substring(2).toLowerCase();\n types[type] = isString ? {} : entry;\n name = '_' + name;\n\n src['get' + part] = function () {\n return this[name];\n };\n\n src['set' + part] = function (func) {\n var prev = this[name];\n if (prev) this.off(type, prev);\n if (func) this.on(type, func);\n this[name] = func;\n };\n });\n src._eventTypes = types;\n }\n\n return inject.base.apply(this, arguments);\n }\n }\n };\n var PaperScope = Base.extend({\n _class: 'PaperScope',\n initialize: function PaperScope() {\n paper = this;\n this.settings = new Base({\n applyMatrix: true,\n insertItems: true,\n handleSize: 4,\n hitTolerance: 0\n });\n this.project = null;\n this.projects = [];\n this.tools = [];\n this._id = PaperScope._id++;\n PaperScope._scopes[this._id] = this;\n var proto = PaperScope.prototype;\n\n if (!this.support) {\n var ctx = CanvasProvider.getContext(1, 1) || {};\n proto.support = {\n nativeDash: 'setLineDash' in ctx || 'mozDash' in ctx,\n nativeBlendModes: BlendMode.nativeModes\n };\n CanvasProvider.release(ctx);\n }\n\n if (!this.agent) {\n var user = self.navigator.userAgent.toLowerCase(),\n os = (/(darwin|win|mac|linux|freebsd|sunos)/.exec(user) || [])[0],\n platform = os === 'darwin' ? 'mac' : os,\n agent = proto.agent = proto.browser = {\n platform: platform\n };\n if (platform) agent[platform] = true;\n user.replace(/(opera|chrome|safari|webkit|firefox|msie|trident|atom|node|jsdom)\\/?\\s*([.\\d]+)(?:.*version\\/([.\\d]+))?(?:.*rv\\:v?([.\\d]+))?/g, function (match, n, v1, v2, rv) {\n if (!agent.chrome) {\n var v = n === 'opera' ? v2 : /^(node|trident)$/.test(n) ? rv : v1;\n agent.version = v;\n agent.versionNumber = parseFloat(v);\n n = {\n trident: 'msie',\n jsdom: 'node'\n }[n] || n;\n agent.name = n;\n agent[n] = true;\n }\n });\n if (agent.chrome) delete agent.webkit;\n if (agent.atom) delete agent.chrome;\n }\n },\n version: \"0.12.15\",\n getView: function getView() {\n var project = this.project;\n return project && project._view;\n },\n getPaper: function getPaper() {\n return this;\n },\n execute: function execute(code, options) {\n var exports = paper.PaperScript.execute(code, this, options);\n View.updateFocus();\n return exports;\n },\n install: function install(scope) {\n var that = this;\n Base.each(['project', 'view', 'tool'], function (key) {\n Base.define(scope, key, {\n configurable: true,\n get: function get() {\n return that[key];\n }\n });\n });\n\n for (var key in this) {\n if (!/^_/.test(key) && this[key]) scope[key] = this[key];\n }\n },\n setup: function setup(element) {\n paper = this;\n this.project = new Project(element);\n return this;\n },\n createCanvas: function createCanvas(width, height) {\n return CanvasProvider.getCanvas(width, height);\n },\n activate: function activate() {\n paper = this;\n },\n clear: function clear() {\n var projects = this.projects,\n tools = this.tools;\n\n for (var i = projects.length - 1; i >= 0; i--) {\n projects[i].remove();\n }\n\n for (var i = tools.length - 1; i >= 0; i--) {\n tools[i].remove();\n }\n },\n remove: function remove() {\n this.clear();\n delete PaperScope._scopes[this._id];\n },\n statics: new function () {\n function handleAttribute(name) {\n name += 'Attribute';\n return function (el, attr) {\n return el[name](attr) || el[name]('data-paper-' + attr);\n };\n }\n\n return {\n _scopes: {},\n _id: 0,\n get: function get(id) {\n return this._scopes[id] || null;\n },\n getAttribute: handleAttribute('get'),\n hasAttribute: handleAttribute('has')\n };\n }()\n });\n var PaperScopeItem = Base.extend(Emitter, {\n initialize: function initialize(activate) {\n this._scope = paper;\n this._index = this._scope[this._list].push(this) - 1;\n if (activate || !this._scope[this._reference]) this.activate();\n },\n activate: function activate() {\n if (!this._scope) return false;\n var prev = this._scope[this._reference];\n if (prev && prev !== this) prev.emit('deactivate');\n this._scope[this._reference] = this;\n this.emit('activate', prev);\n return true;\n },\n isActive: function isActive() {\n return this._scope[this._reference] === this;\n },\n remove: function remove() {\n if (this._index == null) return false;\n Base.splice(this._scope[this._list], null, this._index, 1);\n if (this._scope[this._reference] == this) this._scope[this._reference] = null;\n this._scope = null;\n return true;\n },\n getView: function getView() {\n return this._scope.getView();\n }\n });\n var CollisionDetection = {\n findItemBoundsCollisions: function findItemBoundsCollisions(items1, items2, tolerance) {\n function getBounds(items) {\n var bounds = new Array(items.length);\n\n for (var i = 0; i < items.length; i++) {\n var rect = items[i].getBounds();\n bounds[i] = [rect.left, rect.top, rect.right, rect.bottom];\n }\n\n return bounds;\n }\n\n var bounds1 = getBounds(items1),\n bounds2 = !items2 || items2 === items1 ? bounds1 : getBounds(items2);\n return this.findBoundsCollisions(bounds1, bounds2, tolerance || 0);\n },\n findCurveBoundsCollisions: function findCurveBoundsCollisions(curves1, curves2, tolerance, bothAxis) {\n function getBounds(curves) {\n var min = Math.min,\n max = Math.max,\n bounds = new Array(curves.length);\n\n for (var i = 0; i < curves.length; i++) {\n var v = curves[i];\n bounds[i] = [min(v[0], v[2], v[4], v[6]), min(v[1], v[3], v[5], v[7]), max(v[0], v[2], v[4], v[6]), max(v[1], v[3], v[5], v[7])];\n }\n\n return bounds;\n }\n\n var bounds1 = getBounds(curves1),\n bounds2 = !curves2 || curves2 === curves1 ? bounds1 : getBounds(curves2);\n\n if (bothAxis) {\n var hor = this.findBoundsCollisions(bounds1, bounds2, tolerance || 0, false, true),\n ver = this.findBoundsCollisions(bounds1, bounds2, tolerance || 0, true, true),\n list = [];\n\n for (var i = 0, l = hor.length; i < l; i++) {\n list[i] = {\n hor: hor[i],\n ver: ver[i]\n };\n }\n\n return list;\n }\n\n return this.findBoundsCollisions(bounds1, bounds2, tolerance || 0);\n },\n findBoundsCollisions: function findBoundsCollisions(boundsA, boundsB, tolerance, sweepVertical, onlySweepAxisCollisions) {\n var self = !boundsB || boundsA === boundsB,\n allBounds = self ? boundsA : boundsA.concat(boundsB),\n lengthA = boundsA.length,\n lengthAll = allBounds.length;\n\n function binarySearch(indices, coord, value) {\n var lo = 0,\n hi = indices.length;\n\n while (lo < hi) {\n var mid = hi + lo >>> 1;\n\n if (allBounds[indices[mid]][coord] < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n return lo - 1;\n }\n\n var pri0 = sweepVertical ? 1 : 0,\n pri1 = pri0 + 2,\n sec0 = sweepVertical ? 0 : 1,\n sec1 = sec0 + 2;\n var allIndicesByPri0 = new Array(lengthAll);\n\n for (var i = 0; i < lengthAll; i++) {\n allIndicesByPri0[i] = i;\n }\n\n allIndicesByPri0.sort(function (i1, i2) {\n return allBounds[i1][pri0] - allBounds[i2][pri0];\n });\n var activeIndicesByPri1 = [],\n allCollisions = new Array(lengthA);\n\n for (var i = 0; i < lengthAll; i++) {\n var curIndex = allIndicesByPri0[i],\n curBounds = allBounds[curIndex],\n origIndex = self ? curIndex : curIndex - lengthA,\n isCurrentA = curIndex < lengthA,\n isCurrentB = self || !isCurrentA,\n curCollisions = isCurrentA ? [] : null;\n\n if (activeIndicesByPri1.length) {\n var pruneCount = binarySearch(activeIndicesByPri1, pri1, curBounds[pri0] - tolerance) + 1;\n activeIndicesByPri1.splice(0, pruneCount);\n\n if (self && onlySweepAxisCollisions) {\n curCollisions = curCollisions.concat(activeIndicesByPri1);\n\n for (var j = 0; j < activeIndicesByPri1.length; j++) {\n var activeIndex = activeIndicesByPri1[j];\n allCollisions[activeIndex].push(origIndex);\n }\n } else {\n var curSec1 = curBounds[sec1],\n curSec0 = curBounds[sec0];\n\n for (var j = 0; j < activeIndicesByPri1.length; j++) {\n var activeIndex = activeIndicesByPri1[j],\n activeBounds = allBounds[activeIndex],\n isActiveA = activeIndex < lengthA,\n isActiveB = self || activeIndex >= lengthA;\n\n if (onlySweepAxisCollisions || (isCurrentA && isActiveB || isCurrentB && isActiveA) && curSec1 >= activeBounds[sec0] - tolerance && curSec0 <= activeBounds[sec1] + tolerance) {\n if (isCurrentA && isActiveB) {\n curCollisions.push(self ? activeIndex : activeIndex - lengthA);\n }\n\n if (isCurrentB && isActiveA) {\n allCollisions[activeIndex].push(origIndex);\n }\n }\n }\n }\n }\n\n if (isCurrentA) {\n if (boundsA === boundsB) {\n curCollisions.push(curIndex);\n }\n\n allCollisions[curIndex] = curCollisions;\n }\n\n if (activeIndicesByPri1.length) {\n var curPri1 = curBounds[pri1],\n index = binarySearch(activeIndicesByPri1, pri1, curPri1);\n activeIndicesByPri1.splice(index + 1, 0, curIndex);\n } else {\n activeIndicesByPri1.push(curIndex);\n }\n }\n\n for (var i = 0; i < allCollisions.length; i++) {\n var collisions = allCollisions[i];\n\n if (collisions) {\n collisions.sort(function (i1, i2) {\n return i1 - i2;\n });\n }\n }\n\n return allCollisions;\n }\n };\n var Formatter = Base.extend({\n initialize: function initialize(precision) {\n this.precision = Base.pick(precision, 5);\n this.multiplier = Math.pow(10, this.precision);\n },\n number: function number(val) {\n return this.precision < 16 ? Math.round(val * this.multiplier) / this.multiplier : val;\n },\n pair: function pair(val1, val2, separator) {\n return this.number(val1) + (separator || ',') + this.number(val2);\n },\n point: function point(val, separator) {\n return this.number(val.x) + (separator || ',') + this.number(val.y);\n },\n size: function size(val, separator) {\n return this.number(val.width) + (separator || ',') + this.number(val.height);\n },\n rectangle: function rectangle(val, separator) {\n return this.point(val, separator) + (separator || ',') + this.size(val, separator);\n }\n });\n Formatter.instance = new Formatter();\n var Numerical = new function () {\n var abscissas = [[0.5773502691896257645091488], [0, 0.7745966692414833770358531], [0.3399810435848562648026658, 0.8611363115940525752239465], [0, 0.5384693101056830910363144, 0.9061798459386639927976269], [0.2386191860831969086305017, 0.6612093864662645136613996, 0.9324695142031520278123016], [0, 0.4058451513773971669066064, 0.7415311855993944398638648, 0.9491079123427585245261897], [0.1834346424956498049394761, 0.5255324099163289858177390, 0.7966664774136267395915539, 0.9602898564975362316835609], [0, 0.3242534234038089290385380, 0.6133714327005903973087020, 0.8360311073266357942994298, 0.9681602395076260898355762], [0.1488743389816312108848260, 0.4333953941292471907992659, 0.6794095682990244062343274, 0.8650633666889845107320967, 0.9739065285171717200779640], [0, 0.2695431559523449723315320, 0.5190961292068118159257257, 0.7301520055740493240934163, 0.8870625997680952990751578, 0.9782286581460569928039380], [0.1252334085114689154724414, 0.3678314989981801937526915, 0.5873179542866174472967024, 0.7699026741943046870368938, 0.9041172563704748566784659, 0.9815606342467192506905491], [0, 0.2304583159551347940655281, 0.4484927510364468528779129, 0.6423493394403402206439846, 0.8015780907333099127942065, 0.9175983992229779652065478, 0.9841830547185881494728294], [0.1080549487073436620662447, 0.3191123689278897604356718, 0.5152486363581540919652907, 0.6872929048116854701480198, 0.8272013150697649931897947, 0.9284348836635735173363911, 0.9862838086968123388415973], [0, 0.2011940939974345223006283, 0.3941513470775633698972074, 0.5709721726085388475372267, 0.7244177313601700474161861, 0.8482065834104272162006483, 0.9372733924007059043077589, 0.9879925180204854284895657], [0.0950125098376374401853193, 0.2816035507792589132304605, 0.4580167776572273863424194, 0.6178762444026437484466718, 0.7554044083550030338951012, 0.8656312023878317438804679, 0.9445750230732325760779884, 0.9894009349916499325961542]];\n var weights = [[1], [0.8888888888888888888888889, 0.5555555555555555555555556], [0.6521451548625461426269361, 0.3478548451374538573730639], [0.5688888888888888888888889, 0.4786286704993664680412915, 0.2369268850561890875142640], [0.4679139345726910473898703, 0.3607615730481386075698335, 0.1713244923791703450402961], [0.4179591836734693877551020, 0.3818300505051189449503698, 0.2797053914892766679014678, 0.1294849661688696932706114], [0.3626837833783619829651504, 0.3137066458778872873379622, 0.2223810344533744705443560, 0.1012285362903762591525314], [0.3302393550012597631645251, 0.3123470770400028400686304, 0.2606106964029354623187429, 0.1806481606948574040584720, 0.0812743883615744119718922], [0.2955242247147528701738930, 0.2692667193099963550912269, 0.2190863625159820439955349, 0.1494513491505805931457763, 0.0666713443086881375935688], [0.2729250867779006307144835, 0.2628045445102466621806889, 0.2331937645919904799185237, 0.1862902109277342514260976, 0.1255803694649046246346943, 0.0556685671161736664827537], [0.2491470458134027850005624, 0.2334925365383548087608499, 0.2031674267230659217490645, 0.1600783285433462263346525, 0.1069393259953184309602547, 0.0471753363865118271946160], [0.2325515532308739101945895, 0.2262831802628972384120902, 0.2078160475368885023125232, 0.1781459807619457382800467, 0.1388735102197872384636018, 0.0921214998377284479144218, 0.0404840047653158795200216], [0.2152638534631577901958764, 0.2051984637212956039659241, 0.1855383974779378137417166, 0.1572031671581935345696019, 0.1215185706879031846894148, 0.0801580871597602098056333, 0.0351194603317518630318329], [0.2025782419255612728806202, 0.1984314853271115764561183, 0.1861610000155622110268006, 0.1662692058169939335532009, 0.1395706779261543144478048, 0.1071592204671719350118695, 0.0703660474881081247092674, 0.0307532419961172683546284], [0.1894506104550684962853967, 0.1826034150449235888667637, 0.1691565193950025381893121, 0.1495959888165767320815017, 0.1246289712555338720524763, 0.0951585116824927848099251, 0.0622535239386478928628438, 0.0271524594117540948517806]];\n\n var abs = Math.abs,\n sqrt = Math.sqrt,\n pow = Math.pow,\n log2 = Math.log2 || function (x) {\n return Math.log(x) * Math.LOG2E;\n },\n EPSILON = 1e-12,\n MACHINE_EPSILON = 1.12e-16;\n\n function clamp(value, min, max) {\n return value < min ? min : value > max ? max : value;\n }\n\n function getDiscriminant(a, b, c) {\n function split(v) {\n var x = v * 134217729,\n y = v - x,\n hi = y + x,\n lo = v - hi;\n return [hi, lo];\n }\n\n var D = b * b - a * c,\n E = b * b + a * c;\n\n if (abs(D) * 3 < E) {\n var ad = split(a),\n bd = split(b),\n cd = split(c),\n p = b * b,\n dp = bd[0] * bd[0] - p + 2 * bd[0] * bd[1] + bd[1] * bd[1],\n q = a * c,\n dq = ad[0] * cd[0] - q + ad[0] * cd[1] + ad[1] * cd[0] + ad[1] * cd[1];\n D = p - q + (dp - dq);\n }\n\n return D;\n }\n\n function getNormalizationFactor() {\n var norm = Math.max.apply(Math, arguments);\n return norm && (norm < 1e-8 || norm > 1e8) ? pow(2, -Math.round(log2(norm))) : 0;\n }\n\n return {\n EPSILON: EPSILON,\n MACHINE_EPSILON: MACHINE_EPSILON,\n CURVETIME_EPSILON: 1e-8,\n GEOMETRIC_EPSILON: 1e-7,\n TRIGONOMETRIC_EPSILON: 1e-8,\n KAPPA: 4 * (sqrt(2) - 1) / 3,\n isZero: function isZero(val) {\n return val >= -EPSILON && val <= EPSILON;\n },\n isMachineZero: function isMachineZero(val) {\n return val >= -MACHINE_EPSILON && val <= MACHINE_EPSILON;\n },\n clamp: clamp,\n integrate: function integrate(f, a, b, n) {\n var x = abscissas[n - 2],\n w = weights[n - 2],\n A = (b - a) * 0.5,\n B = A + a,\n i = 0,\n m = n + 1 >> 1,\n sum = n & 1 ? w[i++] * f(B) : 0;\n\n while (i < m) {\n var Ax = A * x[i];\n sum += w[i++] * (f(B + Ax) + f(B - Ax));\n }\n\n return A * sum;\n },\n findRoot: function findRoot(f, df, x, a, b, n, tolerance) {\n for (var i = 0; i < n; i++) {\n var fx = f(x),\n dx = fx / df(x),\n nx = x - dx;\n\n if (abs(dx) < tolerance) {\n x = nx;\n break;\n }\n\n if (fx > 0) {\n b = x;\n x = nx <= a ? (a + b) * 0.5 : nx;\n } else {\n a = x;\n x = nx >= b ? (a + b) * 0.5 : nx;\n }\n }\n\n return clamp(x, a, b);\n },\n solveQuadratic: function solveQuadratic(a, b, c, roots, min, max) {\n var x1,\n x2 = Infinity;\n\n if (abs(a) < EPSILON) {\n if (abs(b) < EPSILON) return abs(c) < EPSILON ? -1 : 0;\n x1 = -c / b;\n } else {\n b *= -0.5;\n var D = getDiscriminant(a, b, c);\n\n if (D && abs(D) < MACHINE_EPSILON) {\n var f = getNormalizationFactor(abs(a), abs(b), abs(c));\n\n if (f) {\n a *= f;\n b *= f;\n c *= f;\n D = getDiscriminant(a, b, c);\n }\n }\n\n if (D >= -MACHINE_EPSILON) {\n var Q = D < 0 ? 0 : sqrt(D),\n R = b + (b < 0 ? -Q : Q);\n\n if (R === 0) {\n x1 = c / a;\n x2 = -x1;\n } else {\n x1 = R / a;\n x2 = c / R;\n }\n }\n }\n\n var count = 0,\n boundless = min == null,\n minB = min - EPSILON,\n maxB = max + EPSILON;\n if (isFinite(x1) && (boundless || x1 > minB && x1 < maxB)) roots[count++] = boundless ? x1 : clamp(x1, min, max);\n if (x2 !== x1 && isFinite(x2) && (boundless || x2 > minB && x2 < maxB)) roots[count++] = boundless ? x2 : clamp(x2, min, max);\n return count;\n },\n solveCubic: function solveCubic(a, b, c, d, roots, min, max) {\n var f = getNormalizationFactor(abs(a), abs(b), abs(c), abs(d)),\n x,\n b1,\n c2,\n qd,\n q;\n\n if (f) {\n a *= f;\n b *= f;\n c *= f;\n d *= f;\n }\n\n function evaluate(x0) {\n x = x0;\n var tmp = a * x;\n b1 = tmp + b;\n c2 = b1 * x + c;\n qd = (tmp + b1) * x + c2;\n q = c2 * x + d;\n }\n\n if (abs(a) < EPSILON) {\n a = b;\n b1 = c;\n c2 = d;\n x = Infinity;\n } else if (abs(d) < EPSILON) {\n b1 = b;\n c2 = c;\n x = 0;\n } else {\n evaluate(-(b / a) / 3);\n var t = q / a,\n r = pow(abs(t), 1 / 3),\n s = t < 0 ? -1 : 1,\n td = -qd / a,\n rd = td > 0 ? 1.324717957244746 * Math.max(r, sqrt(td)) : r,\n x0 = x - s * rd;\n\n if (x0 !== x) {\n do {\n evaluate(x0);\n x0 = qd === 0 ? x : x - q / qd / (1 + MACHINE_EPSILON);\n } while (s * x0 > s * x);\n\n if (abs(a) * x * x > abs(d / x)) {\n c2 = -d / x;\n b1 = (c2 - c) / x;\n }\n }\n }\n\n var count = Numerical.solveQuadratic(a, b1, c2, roots, min, max),\n boundless = min == null;\n if (isFinite(x) && (count === 0 || count > 0 && x !== roots[0] && x !== roots[1]) && (boundless || x > min - EPSILON && x < max + EPSILON)) roots[count++] = boundless ? x : clamp(x, min, max);\n return count;\n }\n };\n }();\n var UID = {\n _id: 1,\n _pools: {},\n get: function get(name) {\n if (name) {\n var pool = this._pools[name];\n if (!pool) pool = this._pools[name] = {\n _id: 1\n };\n return pool._id++;\n } else {\n return this._id++;\n }\n }\n };\n var Point = Base.extend({\n _class: 'Point',\n _readIndex: true,\n initialize: function Point(arg0, arg1) {\n var type = typeof arg0,\n reading = this.__read,\n read = 0;\n\n if (type === 'number') {\n var hasY = typeof arg1 === 'number';\n\n this._set(arg0, hasY ? arg1 : arg0);\n\n if (reading) read = hasY ? 2 : 1;\n } else if (type === 'undefined' || arg0 === null) {\n this._set(0, 0);\n\n if (reading) read = arg0 === null ? 1 : 0;\n } else {\n var obj = type === 'string' ? arg0.split(/[\\s,]+/) || [] : arg0;\n read = 1;\n\n if (Array.isArray(obj)) {\n this._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0]));\n } else if ('x' in obj) {\n this._set(obj.x || 0, obj.y || 0);\n } else if ('width' in obj) {\n this._set(obj.width || 0, obj.height || 0);\n } else if ('angle' in obj) {\n this._set(obj.length || 0, 0);\n\n this.setAngle(obj.angle || 0);\n } else {\n this._set(0, 0);\n\n read = 0;\n }\n }\n\n if (reading) this.__read = read;\n return this;\n },\n set: '#initialize',\n _set: function _set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n },\n equals: function equals(point) {\n return this === point || point && (this.x === point.x && this.y === point.y || Array.isArray(point) && this.x === point[0] && this.y === point[1]) || false;\n },\n clone: function clone() {\n return new Point(this.x, this.y);\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '{ x: ' + f.number(this.x) + ', y: ' + f.number(this.y) + ' }';\n },\n _serialize: function _serialize(options) {\n var f = options.formatter;\n return [f.number(this.x), f.number(this.y)];\n },\n getLength: function getLength() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n },\n setLength: function setLength(length) {\n if (this.isZero()) {\n var angle = this._angle || 0;\n\n this._set(Math.cos(angle) * length, Math.sin(angle) * length);\n } else {\n var scale = length / this.getLength();\n if (Numerical.isZero(scale)) this.getAngle();\n\n this._set(this.x * scale, this.y * scale);\n }\n },\n getAngle: function getAngle() {\n return this.getAngleInRadians.apply(this, arguments) * 180 / Math.PI;\n },\n setAngle: function setAngle(angle) {\n this.setAngleInRadians.call(this, angle * Math.PI / 180);\n },\n getAngleInDegrees: '#getAngle',\n setAngleInDegrees: '#setAngle',\n getAngleInRadians: function getAngleInRadians() {\n if (!arguments.length) {\n return this.isZero() ? this._angle || 0 : this._angle = Math.atan2(this.y, this.x);\n } else {\n var point = Point.read(arguments),\n div = this.getLength() * point.getLength();\n\n if (Numerical.isZero(div)) {\n return NaN;\n } else {\n var a = this.dot(point) / div;\n return Math.acos(a < -1 ? -1 : a > 1 ? 1 : a);\n }\n }\n },\n setAngleInRadians: function setAngleInRadians(angle) {\n this._angle = angle;\n\n if (!this.isZero()) {\n var length = this.getLength();\n\n this._set(Math.cos(angle) * length, Math.sin(angle) * length);\n }\n },\n getQuadrant: function getQuadrant() {\n return this.x >= 0 ? this.y >= 0 ? 1 : 4 : this.y >= 0 ? 2 : 3;\n }\n }, {\n beans: false,\n getDirectedAngle: function getDirectedAngle() {\n var point = Point.read(arguments);\n return Math.atan2(this.cross(point), this.dot(point)) * 180 / Math.PI;\n },\n getDistance: function getDistance() {\n var args = arguments,\n point = Point.read(args),\n x = point.x - this.x,\n y = point.y - this.y,\n d = x * x + y * y,\n squared = Base.read(args);\n return squared ? d : Math.sqrt(d);\n },\n normalize: function normalize(length) {\n if (length === undefined) length = 1;\n var current = this.getLength(),\n scale = current !== 0 ? length / current : 0,\n point = new Point(this.x * scale, this.y * scale);\n if (scale >= 0) point._angle = this._angle;\n return point;\n },\n rotate: function rotate(angle, center) {\n if (angle === 0) return this.clone();\n angle = angle * Math.PI / 180;\n var point = center ? this.subtract(center) : this,\n sin = Math.sin(angle),\n cos = Math.cos(angle);\n point = new Point(point.x * cos - point.y * sin, point.x * sin + point.y * cos);\n return center ? point.add(center) : point;\n },\n transform: function transform(matrix) {\n return matrix ? matrix._transformPoint(this) : this;\n },\n add: function add() {\n var point = Point.read(arguments);\n return new Point(this.x + point.x, this.y + point.y);\n },\n subtract: function subtract() {\n var point = Point.read(arguments);\n return new Point(this.x - point.x, this.y - point.y);\n },\n multiply: function multiply() {\n var point = Point.read(arguments);\n return new Point(this.x * point.x, this.y * point.y);\n },\n divide: function divide() {\n var point = Point.read(arguments);\n return new Point(this.x / point.x, this.y / point.y);\n },\n modulo: function modulo() {\n var point = Point.read(arguments);\n return new Point(this.x % point.x, this.y % point.y);\n },\n negate: function negate() {\n return new Point(-this.x, -this.y);\n },\n isInside: function isInside() {\n return _Rectangle.read(arguments).contains(this);\n },\n isClose: function isClose() {\n var args = arguments,\n point = Point.read(args),\n tolerance = Base.read(args);\n return this.getDistance(point) <= tolerance;\n },\n isCollinear: function isCollinear() {\n var point = Point.read(arguments);\n return Point.isCollinear(this.x, this.y, point.x, point.y);\n },\n isColinear: '#isCollinear',\n isOrthogonal: function isOrthogonal() {\n var point = Point.read(arguments);\n return Point.isOrthogonal(this.x, this.y, point.x, point.y);\n },\n isZero: function isZero() {\n var isZero = Numerical.isZero;\n return isZero(this.x) && isZero(this.y);\n },\n isNaN: function (_isNaN) {\n function isNaN() {\n return _isNaN.apply(this, arguments);\n }\n\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n\n return isNaN;\n }(function () {\n return isNaN(this.x) || isNaN(this.y);\n }),\n isInQuadrant: function isInQuadrant(q) {\n return this.x * (q > 1 && q < 4 ? -1 : 1) >= 0 && this.y * (q > 2 ? -1 : 1) >= 0;\n },\n dot: function dot() {\n var point = Point.read(arguments);\n return this.x * point.x + this.y * point.y;\n },\n cross: function cross() {\n var point = Point.read(arguments);\n return this.x * point.y - this.y * point.x;\n },\n project: function project() {\n var point = Point.read(arguments),\n scale = point.isZero() ? 0 : this.dot(point) / point.dot(point);\n return new Point(point.x * scale, point.y * scale);\n },\n statics: {\n min: function min() {\n var args = arguments,\n point1 = Point.read(args),\n point2 = Point.read(args);\n return new Point(Math.min(point1.x, point2.x), Math.min(point1.y, point2.y));\n },\n max: function max() {\n var args = arguments,\n point1 = Point.read(args),\n point2 = Point.read(args);\n return new Point(Math.max(point1.x, point2.x), Math.max(point1.y, point2.y));\n },\n random: function random() {\n return new Point(Math.random(), Math.random());\n },\n isCollinear: function isCollinear(x1, y1, x2, y2) {\n return Math.abs(x1 * y2 - y1 * x2) <= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)) * 1e-8;\n },\n isOrthogonal: function isOrthogonal(x1, y1, x2, y2) {\n return Math.abs(x1 * x2 + y1 * y2) <= Math.sqrt((x1 * x1 + y1 * y1) * (x2 * x2 + y2 * y2)) * 1e-8;\n }\n }\n }, Base.each(['round', 'ceil', 'floor', 'abs'], function (key) {\n var op = Math[key];\n\n this[key] = function () {\n return new Point(op(this.x), op(this.y));\n };\n }, {}));\n var LinkedPoint = Point.extend({\n initialize: function Point(x, y, owner, setter) {\n this._x = x;\n this._y = y;\n this._owner = owner;\n this._setter = setter;\n },\n _set: function _set(x, y, _dontNotify) {\n this._x = x;\n this._y = y;\n if (!_dontNotify) this._owner[this._setter](this);\n return this;\n },\n getX: function getX() {\n return this._x;\n },\n setX: function setX(x) {\n this._x = x;\n\n this._owner[this._setter](this);\n },\n getY: function getY() {\n return this._y;\n },\n setY: function setY(y) {\n this._y = y;\n\n this._owner[this._setter](this);\n },\n isSelected: function isSelected() {\n return !!(this._owner._selection & this._getSelection());\n },\n setSelected: function setSelected(selected) {\n this._owner._changeSelection(this._getSelection(), selected);\n },\n _getSelection: function _getSelection() {\n return this._setter === 'setPosition' ? 4 : 0;\n }\n });\n var Size = Base.extend({\n _class: 'Size',\n _readIndex: true,\n initialize: function Size(arg0, arg1) {\n var type = typeof arg0,\n reading = this.__read,\n read = 0;\n\n if (type === 'number') {\n var hasHeight = typeof arg1 === 'number';\n\n this._set(arg0, hasHeight ? arg1 : arg0);\n\n if (reading) read = hasHeight ? 2 : 1;\n } else if (type === 'undefined' || arg0 === null) {\n this._set(0, 0);\n\n if (reading) read = arg0 === null ? 1 : 0;\n } else {\n var obj = type === 'string' ? arg0.split(/[\\s,]+/) || [] : arg0;\n read = 1;\n\n if (Array.isArray(obj)) {\n this._set(+obj[0], +(obj.length > 1 ? obj[1] : obj[0]));\n } else if ('width' in obj) {\n this._set(obj.width || 0, obj.height || 0);\n } else if ('x' in obj) {\n this._set(obj.x || 0, obj.y || 0);\n } else {\n this._set(0, 0);\n\n read = 0;\n }\n }\n\n if (reading) this.__read = read;\n return this;\n },\n set: '#initialize',\n _set: function _set(width, height) {\n this.width = width;\n this.height = height;\n return this;\n },\n equals: function equals(size) {\n return size === this || size && (this.width === size.width && this.height === size.height || Array.isArray(size) && this.width === size[0] && this.height === size[1]) || false;\n },\n clone: function clone() {\n return new Size(this.width, this.height);\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '{ width: ' + f.number(this.width) + ', height: ' + f.number(this.height) + ' }';\n },\n _serialize: function _serialize(options) {\n var f = options.formatter;\n return [f.number(this.width), f.number(this.height)];\n },\n add: function add() {\n var size = Size.read(arguments);\n return new Size(this.width + size.width, this.height + size.height);\n },\n subtract: function subtract() {\n var size = Size.read(arguments);\n return new Size(this.width - size.width, this.height - size.height);\n },\n multiply: function multiply() {\n var size = Size.read(arguments);\n return new Size(this.width * size.width, this.height * size.height);\n },\n divide: function divide() {\n var size = Size.read(arguments);\n return new Size(this.width / size.width, this.height / size.height);\n },\n modulo: function modulo() {\n var size = Size.read(arguments);\n return new Size(this.width % size.width, this.height % size.height);\n },\n negate: function negate() {\n return new Size(-this.width, -this.height);\n },\n isZero: function isZero() {\n var isZero = Numerical.isZero;\n return isZero(this.width) && isZero(this.height);\n },\n isNaN: function (_isNaN2) {\n function isNaN() {\n return _isNaN2.apply(this, arguments);\n }\n\n isNaN.toString = function () {\n return _isNaN2.toString();\n };\n\n return isNaN;\n }(function () {\n return isNaN(this.width) || isNaN(this.height);\n }),\n statics: {\n min: function min(size1, size2) {\n return new Size(Math.min(size1.width, size2.width), Math.min(size1.height, size2.height));\n },\n max: function max(size1, size2) {\n return new Size(Math.max(size1.width, size2.width), Math.max(size1.height, size2.height));\n },\n random: function random() {\n return new Size(Math.random(), Math.random());\n }\n }\n }, Base.each(['round', 'ceil', 'floor', 'abs'], function (key) {\n var op = Math[key];\n\n this[key] = function () {\n return new Size(op(this.width), op(this.height));\n };\n }, {}));\n var LinkedSize = Size.extend({\n initialize: function Size(width, height, owner, setter) {\n this._width = width;\n this._height = height;\n this._owner = owner;\n this._setter = setter;\n },\n _set: function _set(width, height, _dontNotify) {\n this._width = width;\n this._height = height;\n if (!_dontNotify) this._owner[this._setter](this);\n return this;\n },\n getWidth: function getWidth() {\n return this._width;\n },\n setWidth: function setWidth(width) {\n this._width = width;\n\n this._owner[this._setter](this);\n },\n getHeight: function getHeight() {\n return this._height;\n },\n setHeight: function setHeight(height) {\n this._height = height;\n\n this._owner[this._setter](this);\n }\n });\n\n var _Rectangle = Base.extend({\n _class: 'Rectangle',\n _readIndex: true,\n beans: true,\n initialize: function Rectangle(arg0, arg1, arg2, arg3) {\n var args = arguments,\n type = typeof arg0,\n read;\n\n if (type === 'number') {\n this._set(arg0, arg1, arg2, arg3);\n\n read = 4;\n } else if (type === 'undefined' || arg0 === null) {\n this._set(0, 0, 0, 0);\n\n read = arg0 === null ? 1 : 0;\n } else if (args.length === 1) {\n if (Array.isArray(arg0)) {\n this._set.apply(this, arg0);\n\n read = 1;\n } else if (arg0.x !== undefined || arg0.width !== undefined) {\n this._set(arg0.x || 0, arg0.y || 0, arg0.width || 0, arg0.height || 0);\n\n read = 1;\n } else if (arg0.from === undefined && arg0.to === undefined) {\n this._set(0, 0, 0, 0);\n\n if (Base.readSupported(args, this)) {\n read = 1;\n }\n }\n }\n\n if (read === undefined) {\n var frm = Point.readNamed(args, 'from'),\n next = Base.peek(args),\n x = frm.x,\n y = frm.y,\n width,\n height;\n\n if (next && next.x !== undefined || Base.hasNamed(args, 'to')) {\n var to = Point.readNamed(args, 'to');\n width = to.x - x;\n height = to.y - y;\n\n if (width < 0) {\n x = to.x;\n width = -width;\n }\n\n if (height < 0) {\n y = to.y;\n height = -height;\n }\n } else {\n var size = Size.read(args);\n width = size.width;\n height = size.height;\n }\n\n this._set(x, y, width, height);\n\n read = args.__index;\n }\n\n var filtered = args.__filtered;\n if (filtered) this.__filtered = filtered;\n if (this.__read) this.__read = read;\n return this;\n },\n set: '#initialize',\n _set: function _set(x, y, width, height) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n return this;\n },\n clone: function clone() {\n return new _Rectangle(this.x, this.y, this.width, this.height);\n },\n equals: function equals(rect) {\n var rt = Base.isPlainValue(rect) ? _Rectangle.read(arguments) : rect;\n return rt === this || rt && this.x === rt.x && this.y === rt.y && this.width === rt.width && this.height === rt.height || false;\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '{ x: ' + f.number(this.x) + ', y: ' + f.number(this.y) + ', width: ' + f.number(this.width) + ', height: ' + f.number(this.height) + ' }';\n },\n _serialize: function _serialize(options) {\n var f = options.formatter;\n return [f.number(this.x), f.number(this.y), f.number(this.width), f.number(this.height)];\n },\n getPoint: function getPoint(_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n return new ctor(this.x, this.y, this, 'setPoint');\n },\n setPoint: function setPoint() {\n var point = Point.read(arguments);\n this.x = point.x;\n this.y = point.y;\n },\n getSize: function getSize(_dontLink) {\n var ctor = _dontLink ? Size : LinkedSize;\n return new ctor(this.width, this.height, this, 'setSize');\n },\n _fw: 1,\n _fh: 1,\n setSize: function setSize() {\n var size = Size.read(arguments),\n sx = this._sx,\n sy = this._sy,\n w = size.width,\n h = size.height;\n\n if (sx) {\n this.x += (this.width - w) * sx;\n }\n\n if (sy) {\n this.y += (this.height - h) * sy;\n }\n\n this.width = w;\n this.height = h;\n this._fw = this._fh = 1;\n },\n getLeft: function getLeft() {\n return this.x;\n },\n setLeft: function setLeft(left) {\n if (!this._fw) {\n var amount = left - this.x;\n this.width -= this._sx === 0.5 ? amount * 2 : amount;\n }\n\n this.x = left;\n this._sx = this._fw = 0;\n },\n getTop: function getTop() {\n return this.y;\n },\n setTop: function setTop(top) {\n if (!this._fh) {\n var amount = top - this.y;\n this.height -= this._sy === 0.5 ? amount * 2 : amount;\n }\n\n this.y = top;\n this._sy = this._fh = 0;\n },\n getRight: function getRight() {\n return this.x + this.width;\n },\n setRight: function setRight(right) {\n if (!this._fw) {\n var amount = right - this.x;\n this.width = this._sx === 0.5 ? amount * 2 : amount;\n }\n\n this.x = right - this.width;\n this._sx = 1;\n this._fw = 0;\n },\n getBottom: function getBottom() {\n return this.y + this.height;\n },\n setBottom: function setBottom(bottom) {\n if (!this._fh) {\n var amount = bottom - this.y;\n this.height = this._sy === 0.5 ? amount * 2 : amount;\n }\n\n this.y = bottom - this.height;\n this._sy = 1;\n this._fh = 0;\n },\n getCenterX: function getCenterX() {\n return this.x + this.width / 2;\n },\n setCenterX: function setCenterX(x) {\n if (this._fw || this._sx === 0.5) {\n this.x = x - this.width / 2;\n } else {\n if (this._sx) {\n this.x += (x - this.x) * 2 * this._sx;\n }\n\n this.width = (x - this.x) * 2;\n }\n\n this._sx = 0.5;\n this._fw = 0;\n },\n getCenterY: function getCenterY() {\n return this.y + this.height / 2;\n },\n setCenterY: function setCenterY(y) {\n if (this._fh || this._sy === 0.5) {\n this.y = y - this.height / 2;\n } else {\n if (this._sy) {\n this.y += (y - this.y) * 2 * this._sy;\n }\n\n this.height = (y - this.y) * 2;\n }\n\n this._sy = 0.5;\n this._fh = 0;\n },\n getCenter: function getCenter(_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n return new ctor(this.getCenterX(), this.getCenterY(), this, 'setCenter');\n },\n setCenter: function setCenter() {\n var point = Point.read(arguments);\n this.setCenterX(point.x);\n this.setCenterY(point.y);\n return this;\n },\n getArea: function getArea() {\n return this.width * this.height;\n },\n isEmpty: function isEmpty() {\n return this.width === 0 || this.height === 0;\n },\n contains: function contains(arg) {\n return arg && arg.width !== undefined || (Array.isArray(arg) ? arg : arguments).length === 4 ? this._containsRectangle(_Rectangle.read(arguments)) : this._containsPoint(Point.read(arguments));\n },\n _containsPoint: function _containsPoint(point) {\n var x = point.x,\n y = point.y;\n return x >= this.x && y >= this.y && x <= this.x + this.width && y <= this.y + this.height;\n },\n _containsRectangle: function _containsRectangle(rect) {\n var x = rect.x,\n y = rect.y;\n return x >= this.x && y >= this.y && x + rect.width <= this.x + this.width && y + rect.height <= this.y + this.height;\n },\n intersects: function intersects() {\n var rect = _Rectangle.read(arguments),\n epsilon = Base.read(arguments) || 0;\n\n return rect.x + rect.width > this.x - epsilon && rect.y + rect.height > this.y - epsilon && rect.x < this.x + this.width + epsilon && rect.y < this.y + this.height + epsilon;\n },\n intersect: function intersect() {\n var rect = _Rectangle.read(arguments),\n x1 = Math.max(this.x, rect.x),\n y1 = Math.max(this.y, rect.y),\n x2 = Math.min(this.x + this.width, rect.x + rect.width),\n y2 = Math.min(this.y + this.height, rect.y + rect.height);\n\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n },\n unite: function unite() {\n var rect = _Rectangle.read(arguments),\n x1 = Math.min(this.x, rect.x),\n y1 = Math.min(this.y, rect.y),\n x2 = Math.max(this.x + this.width, rect.x + rect.width),\n y2 = Math.max(this.y + this.height, rect.y + rect.height);\n\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n },\n include: function include() {\n var point = Point.read(arguments);\n var x1 = Math.min(this.x, point.x),\n y1 = Math.min(this.y, point.y),\n x2 = Math.max(this.x + this.width, point.x),\n y2 = Math.max(this.y + this.height, point.y);\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n },\n expand: function expand() {\n var amount = Size.read(arguments),\n hor = amount.width,\n ver = amount.height;\n return new _Rectangle(this.x - hor / 2, this.y - ver / 2, this.width + hor, this.height + ver);\n },\n scale: function scale(hor, ver) {\n return this.expand(this.width * hor - this.width, this.height * (ver === undefined ? hor : ver) - this.height);\n }\n }, Base.each([['Top', 'Left'], ['Top', 'Right'], ['Bottom', 'Left'], ['Bottom', 'Right'], ['Left', 'Center'], ['Top', 'Center'], ['Right', 'Center'], ['Bottom', 'Center']], function (parts, index) {\n var part = parts.join(''),\n xFirst = /^[RL]/.test(part);\n if (index >= 4) parts[1] += xFirst ? 'Y' : 'X';\n var x = parts[xFirst ? 0 : 1],\n y = parts[xFirst ? 1 : 0],\n getX = 'get' + x,\n getY = 'get' + y,\n setX = 'set' + x,\n setY = 'set' + y,\n get = 'get' + part,\n set = 'set' + part;\n\n this[get] = function (_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n return new ctor(this[getX](), this[getY](), this, set);\n };\n\n this[set] = function () {\n var point = Point.read(arguments);\n this[setX](point.x);\n this[setY](point.y);\n };\n }, {\n beans: true\n }));\n\n var LinkedRectangle = _Rectangle.extend({\n initialize: function Rectangle(x, y, width, height, owner, setter) {\n this._set(x, y, width, height, true);\n\n this._owner = owner;\n this._setter = setter;\n },\n _set: function _set(x, y, width, height, _dontNotify) {\n this._x = x;\n this._y = y;\n this._width = width;\n this._height = height;\n if (!_dontNotify) this._owner[this._setter](this);\n return this;\n }\n }, new function () {\n var proto = _Rectangle.prototype;\n return Base.each(['x', 'y', 'width', 'height'], function (key) {\n var part = Base.capitalize(key),\n internal = '_' + key;\n\n this['get' + part] = function () {\n return this[internal];\n };\n\n this['set' + part] = function (value) {\n this[internal] = value;\n if (!this._dontNotify) this._owner[this._setter](this);\n };\n }, Base.each(['Point', 'Size', 'Center', 'Left', 'Top', 'Right', 'Bottom', 'CenterX', 'CenterY', 'TopLeft', 'TopRight', 'BottomLeft', 'BottomRight', 'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'], function (key) {\n var name = 'set' + key;\n\n this[name] = function () {\n this._dontNotify = true;\n proto[name].apply(this, arguments);\n this._dontNotify = false;\n\n this._owner[this._setter](this);\n };\n }, {\n isSelected: function isSelected() {\n return !!(this._owner._selection & 2);\n },\n setSelected: function setSelected(selected) {\n var owner = this._owner;\n\n if (owner._changeSelection) {\n owner._changeSelection(2, selected);\n }\n }\n }));\n }());\n\n var Matrix = Base.extend({\n _class: 'Matrix',\n initialize: function Matrix(arg, _dontNotify) {\n var args = arguments,\n count = args.length,\n ok = true;\n\n if (count >= 6) {\n this._set.apply(this, args);\n } else if (count === 1 || count === 2) {\n if (arg instanceof Matrix) {\n this._set(arg._a, arg._b, arg._c, arg._d, arg._tx, arg._ty, _dontNotify);\n } else if (Array.isArray(arg)) {\n this._set.apply(this, _dontNotify ? arg.concat([_dontNotify]) : arg);\n } else {\n ok = false;\n }\n } else if (!count) {\n this.reset();\n } else {\n ok = false;\n }\n\n if (!ok) {\n throw new Error('Unsupported matrix parameters');\n }\n\n return this;\n },\n set: '#initialize',\n _set: function _set(a, b, c, d, tx, ty, _dontNotify) {\n this._a = a;\n this._b = b;\n this._c = c;\n this._d = d;\n this._tx = tx;\n this._ty = ty;\n if (!_dontNotify) this._changed();\n return this;\n },\n _serialize: function _serialize(options, dictionary) {\n return Base.serialize(this.getValues(), options, true, dictionary);\n },\n _changed: function _changed() {\n var owner = this._owner;\n\n if (owner) {\n if (owner._applyMatrix) {\n owner.transform(null, true);\n } else {\n owner._changed(25);\n }\n }\n },\n clone: function clone() {\n return new Matrix(this._a, this._b, this._c, this._d, this._tx, this._ty);\n },\n equals: function equals(mx) {\n return mx === this || mx && this._a === mx._a && this._b === mx._b && this._c === mx._c && this._d === mx._d && this._tx === mx._tx && this._ty === mx._ty;\n },\n toString: function toString() {\n var f = Formatter.instance;\n return '[[' + [f.number(this._a), f.number(this._c), f.number(this._tx)].join(', ') + '], [' + [f.number(this._b), f.number(this._d), f.number(this._ty)].join(', ') + ']]';\n },\n reset: function reset(_dontNotify) {\n this._a = this._d = 1;\n this._b = this._c = this._tx = this._ty = 0;\n if (!_dontNotify) this._changed();\n return this;\n },\n apply: function apply(recursively, _setApplyMatrix) {\n var owner = this._owner;\n\n if (owner) {\n owner.transform(null, Base.pick(recursively, true), _setApplyMatrix);\n return this.isIdentity();\n }\n\n return false;\n },\n translate: function translate() {\n var point = Point.read(arguments),\n x = point.x,\n y = point.y;\n this._tx += x * this._a + y * this._c;\n this._ty += x * this._b + y * this._d;\n\n this._changed();\n\n return this;\n },\n scale: function scale() {\n var args = arguments,\n scale = Point.read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n if (center) this.translate(center);\n this._a *= scale.x;\n this._b *= scale.x;\n this._c *= scale.y;\n this._d *= scale.y;\n if (center) this.translate(center.negate());\n\n this._changed();\n\n return this;\n },\n rotate: function rotate(angle) {\n angle *= Math.PI / 180;\n var center = Point.read(arguments, 1),\n x = center.x,\n y = center.y,\n cos = Math.cos(angle),\n sin = Math.sin(angle),\n tx = x - x * cos + y * sin,\n ty = y - x * sin - y * cos,\n a = this._a,\n b = this._b,\n c = this._c,\n d = this._d;\n this._a = cos * a + sin * c;\n this._b = cos * b + sin * d;\n this._c = -sin * a + cos * c;\n this._d = -sin * b + cos * d;\n this._tx += tx * a + ty * c;\n this._ty += tx * b + ty * d;\n\n this._changed();\n\n return this;\n },\n shear: function shear() {\n var args = arguments,\n shear = Point.read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n if (center) this.translate(center);\n var a = this._a,\n b = this._b;\n this._a += shear.y * this._c;\n this._b += shear.y * this._d;\n this._c += shear.x * a;\n this._d += shear.x * b;\n if (center) this.translate(center.negate());\n\n this._changed();\n\n return this;\n },\n skew: function skew() {\n var args = arguments,\n skew = Point.read(args),\n center = Point.read(args, 0, {\n readNull: true\n }),\n toRadians = Math.PI / 180,\n shear = new Point(Math.tan(skew.x * toRadians), Math.tan(skew.y * toRadians));\n return this.shear(shear, center);\n },\n append: function append(mx, _dontNotify) {\n if (mx) {\n var a1 = this._a,\n b1 = this._b,\n c1 = this._c,\n d1 = this._d,\n a2 = mx._a,\n b2 = mx._c,\n c2 = mx._b,\n d2 = mx._d,\n tx2 = mx._tx,\n ty2 = mx._ty;\n this._a = a2 * a1 + c2 * c1;\n this._c = b2 * a1 + d2 * c1;\n this._b = a2 * b1 + c2 * d1;\n this._d = b2 * b1 + d2 * d1;\n this._tx += tx2 * a1 + ty2 * c1;\n this._ty += tx2 * b1 + ty2 * d1;\n if (!_dontNotify) this._changed();\n }\n\n return this;\n },\n prepend: function prepend(mx, _dontNotify) {\n if (mx) {\n var a1 = this._a,\n b1 = this._b,\n c1 = this._c,\n d1 = this._d,\n tx1 = this._tx,\n ty1 = this._ty,\n a2 = mx._a,\n b2 = mx._c,\n c2 = mx._b,\n d2 = mx._d,\n tx2 = mx._tx,\n ty2 = mx._ty;\n this._a = a2 * a1 + b2 * b1;\n this._c = a2 * c1 + b2 * d1;\n this._b = c2 * a1 + d2 * b1;\n this._d = c2 * c1 + d2 * d1;\n this._tx = a2 * tx1 + b2 * ty1 + tx2;\n this._ty = c2 * tx1 + d2 * ty1 + ty2;\n if (!_dontNotify) this._changed();\n }\n\n return this;\n },\n appended: function appended(mx) {\n return this.clone().append(mx);\n },\n prepended: function prepended(mx) {\n return this.clone().prepend(mx);\n },\n invert: function invert() {\n var a = this._a,\n b = this._b,\n c = this._c,\n d = this._d,\n tx = this._tx,\n ty = this._ty,\n det = a * d - b * c,\n res = null;\n\n if (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) {\n this._a = d / det;\n this._b = -b / det;\n this._c = -c / det;\n this._d = a / det;\n this._tx = (c * ty - d * tx) / det;\n this._ty = (b * tx - a * ty) / det;\n res = this;\n }\n\n return res;\n },\n inverted: function inverted() {\n return this.clone().invert();\n },\n concatenate: '#append',\n preConcatenate: '#prepend',\n chain: '#appended',\n _shiftless: function _shiftless() {\n return new Matrix(this._a, this._b, this._c, this._d, 0, 0);\n },\n _orNullIfIdentity: function _orNullIfIdentity() {\n return this.isIdentity() ? null : this;\n },\n isIdentity: function isIdentity() {\n return this._a === 1 && this._b === 0 && this._c === 0 && this._d === 1 && this._tx === 0 && this._ty === 0;\n },\n isInvertible: function isInvertible() {\n var det = this._a * this._d - this._c * this._b;\n return det && !isNaN(det) && isFinite(this._tx) && isFinite(this._ty);\n },\n isSingular: function isSingular() {\n return !this.isInvertible();\n },\n transform: function transform(src, dst, count) {\n return arguments.length < 3 ? this._transformPoint(Point.read(arguments)) : this._transformCoordinates(src, dst, count);\n },\n _transformPoint: function _transformPoint(point, dest, _dontNotify) {\n var x = point.x,\n y = point.y;\n if (!dest) dest = new Point();\n return dest._set(x * this._a + y * this._c + this._tx, x * this._b + y * this._d + this._ty, _dontNotify);\n },\n _transformCoordinates: function _transformCoordinates(src, dst, count) {\n for (var i = 0, max = 2 * count; i < max; i += 2) {\n var x = src[i],\n y = src[i + 1];\n dst[i] = x * this._a + y * this._c + this._tx;\n dst[i + 1] = x * this._b + y * this._d + this._ty;\n }\n\n return dst;\n },\n _transformCorners: function _transformCorners(rect) {\n var x1 = rect.x,\n y1 = rect.y,\n x2 = x1 + rect.width,\n y2 = y1 + rect.height,\n coords = [x1, y1, x2, y1, x2, y2, x1, y2];\n return this._transformCoordinates(coords, coords, 4);\n },\n _transformBounds: function _transformBounds(bounds, dest, _dontNotify) {\n var coords = this._transformCorners(bounds),\n min = coords.slice(0, 2),\n max = min.slice();\n\n for (var i = 2; i < 8; i++) {\n var val = coords[i],\n j = i & 1;\n\n if (val < min[j]) {\n min[j] = val;\n } else if (val > max[j]) {\n max[j] = val;\n }\n }\n\n if (!dest) dest = new _Rectangle();\n return dest._set(min[0], min[1], max[0] - min[0], max[1] - min[1], _dontNotify);\n },\n inverseTransform: function inverseTransform() {\n return this._inverseTransform(Point.read(arguments));\n },\n _inverseTransform: function _inverseTransform(point, dest, _dontNotify) {\n var a = this._a,\n b = this._b,\n c = this._c,\n d = this._d,\n tx = this._tx,\n ty = this._ty,\n det = a * d - b * c,\n res = null;\n\n if (det && !isNaN(det) && isFinite(tx) && isFinite(ty)) {\n var x = point.x - this._tx,\n y = point.y - this._ty;\n if (!dest) dest = new Point();\n res = dest._set((x * d - y * c) / det, (y * a - x * b) / det, _dontNotify);\n }\n\n return res;\n },\n decompose: function decompose() {\n var a = this._a,\n b = this._b,\n c = this._c,\n d = this._d,\n det = a * d - b * c,\n sqrt = Math.sqrt,\n atan2 = Math.atan2,\n degrees = 180 / Math.PI,\n rotate,\n scale,\n skew;\n\n if (a !== 0 || b !== 0) {\n var r = sqrt(a * a + b * b);\n rotate = Math.acos(a / r) * (b > 0 ? 1 : -1);\n scale = [r, det / r];\n skew = [atan2(a * c + b * d, r * r), 0];\n } else if (c !== 0 || d !== 0) {\n var s = sqrt(c * c + d * d);\n rotate = Math.asin(c / s) * (d > 0 ? 1 : -1);\n scale = [det / s, s];\n skew = [0, atan2(a * c + b * d, s * s)];\n } else {\n rotate = 0;\n skew = scale = [0, 0];\n }\n\n return {\n translation: this.getTranslation(),\n rotation: rotate * degrees,\n scaling: new Point(scale),\n skewing: new Point(skew[0] * degrees, skew[1] * degrees)\n };\n },\n getValues: function getValues() {\n return [this._a, this._b, this._c, this._d, this._tx, this._ty];\n },\n getTranslation: function getTranslation() {\n return new Point(this._tx, this._ty);\n },\n getScaling: function getScaling() {\n return this.decompose().scaling;\n },\n getRotation: function getRotation() {\n return this.decompose().rotation;\n },\n applyToContext: function applyToContext(ctx) {\n if (!this.isIdentity()) {\n ctx.transform(this._a, this._b, this._c, this._d, this._tx, this._ty);\n }\n }\n }, Base.each(['a', 'b', 'c', 'd', 'tx', 'ty'], function (key) {\n var part = Base.capitalize(key),\n prop = '_' + key;\n\n this['get' + part] = function () {\n return this[prop];\n };\n\n this['set' + part] = function (value) {\n this[prop] = value;\n\n this._changed();\n };\n }, {}));\n var Line = Base.extend({\n _class: 'Line',\n initialize: function Line(arg0, arg1, arg2, arg3, arg4) {\n var asVector = false;\n\n if (arguments.length >= 4) {\n this._px = arg0;\n this._py = arg1;\n this._vx = arg2;\n this._vy = arg3;\n asVector = arg4;\n } else {\n this._px = arg0.x;\n this._py = arg0.y;\n this._vx = arg1.x;\n this._vy = arg1.y;\n asVector = arg2;\n }\n\n if (!asVector) {\n this._vx -= this._px;\n this._vy -= this._py;\n }\n },\n getPoint: function getPoint() {\n return new Point(this._px, this._py);\n },\n getVector: function getVector() {\n return new Point(this._vx, this._vy);\n },\n getLength: function getLength() {\n return this.getVector().getLength();\n },\n intersect: function intersect(line, isInfinite) {\n return Line.intersect(this._px, this._py, this._vx, this._vy, line._px, line._py, line._vx, line._vy, true, isInfinite);\n },\n getSide: function getSide(point, isInfinite) {\n return Line.getSide(this._px, this._py, this._vx, this._vy, point.x, point.y, true, isInfinite);\n },\n getDistance: function getDistance(point) {\n return Math.abs(this.getSignedDistance(point));\n },\n getSignedDistance: function getSignedDistance(point) {\n return Line.getSignedDistance(this._px, this._py, this._vx, this._vy, point.x, point.y, true);\n },\n isCollinear: function isCollinear(line) {\n return Point.isCollinear(this._vx, this._vy, line._vx, line._vy);\n },\n isOrthogonal: function isOrthogonal(line) {\n return Point.isOrthogonal(this._vx, this._vy, line._vx, line._vy);\n },\n statics: {\n intersect: function intersect(p1x, p1y, v1x, v1y, p2x, p2y, v2x, v2y, asVector, isInfinite) {\n if (!asVector) {\n v1x -= p1x;\n v1y -= p1y;\n v2x -= p2x;\n v2y -= p2y;\n }\n\n var cross = v1x * v2y - v1y * v2x;\n\n if (!Numerical.isMachineZero(cross)) {\n var dx = p1x - p2x,\n dy = p1y - p2y,\n u1 = (v2x * dy - v2y * dx) / cross,\n u2 = (v1x * dy - v1y * dx) / cross,\n epsilon = 1e-12,\n uMin = -epsilon,\n uMax = 1 + epsilon;\n\n if (isInfinite || uMin < u1 && u1 < uMax && uMin < u2 && u2 < uMax) {\n if (!isInfinite) {\n u1 = u1 <= 0 ? 0 : u1 >= 1 ? 1 : u1;\n }\n\n return new Point(p1x + u1 * v1x, p1y + u1 * v1y);\n }\n }\n },\n getSide: function getSide(px, py, vx, vy, x, y, asVector, isInfinite) {\n if (!asVector) {\n vx -= px;\n vy -= py;\n }\n\n var v2x = x - px,\n v2y = y - py,\n ccw = v2x * vy - v2y * vx;\n\n if (!isInfinite && Numerical.isMachineZero(ccw)) {\n ccw = (v2x * vx + v2x * vx) / (vx * vx + vy * vy);\n if (ccw >= 0 && ccw <= 1) ccw = 0;\n }\n\n return ccw < 0 ? -1 : ccw > 0 ? 1 : 0;\n },\n getSignedDistance: function getSignedDistance(px, py, vx, vy, x, y, asVector) {\n if (!asVector) {\n vx -= px;\n vy -= py;\n }\n\n return vx === 0 ? vy > 0 ? x - px : px - x : vy === 0 ? vx < 0 ? y - py : py - y : ((x - px) * vy - (y - py) * vx) / (vy > vx ? vy * Math.sqrt(1 + vx * vx / (vy * vy)) : vx * Math.sqrt(1 + vy * vy / (vx * vx)));\n },\n getDistance: function getDistance(px, py, vx, vy, x, y, asVector) {\n return Math.abs(Line.getSignedDistance(px, py, vx, vy, x, y, asVector));\n }\n }\n });\n var Project = PaperScopeItem.extend({\n _class: 'Project',\n _list: 'projects',\n _reference: 'project',\n _compactSerialize: true,\n initialize: function Project(element) {\n PaperScopeItem.call(this, true);\n this._children = [];\n this._namedChildren = {};\n this._activeLayer = null;\n this._currentStyle = new Style(null, null, this);\n this._view = View.create(this, element || CanvasProvider.getCanvas(1, 1));\n this._selectionItems = {};\n this._selectionCount = 0;\n this._updateVersion = 0;\n },\n _serialize: function _serialize(options, dictionary) {\n return Base.serialize(this._children, options, true, dictionary);\n },\n _changed: function _changed(flags, item) {\n if (flags & 1) {\n var view = this._view;\n\n if (view) {\n view._needsUpdate = true;\n if (!view._requested && view._autoUpdate) view.requestUpdate();\n }\n }\n\n var changes = this._changes;\n\n if (changes && item) {\n var changesById = this._changesById,\n id = item._id,\n entry = changesById[id];\n\n if (entry) {\n entry.flags |= flags;\n } else {\n changes.push(changesById[id] = {\n item: item,\n flags: flags\n });\n }\n }\n },\n clear: function clear() {\n var children = this._children;\n\n for (var i = children.length - 1; i >= 0; i--) {\n children[i].remove();\n }\n },\n isEmpty: function isEmpty() {\n return !this._children.length;\n },\n remove: function remove() {\n if (!remove.base.call(this)) return false;\n if (this._view) this._view.remove();\n return true;\n },\n getView: function getView() {\n return this._view;\n },\n getCurrentStyle: function getCurrentStyle() {\n return this._currentStyle;\n },\n setCurrentStyle: function setCurrentStyle(style) {\n this._currentStyle.set(style);\n },\n getIndex: function getIndex() {\n return this._index;\n },\n getOptions: function getOptions() {\n return this._scope.settings;\n },\n getLayers: function getLayers() {\n return this._children;\n },\n getActiveLayer: function getActiveLayer() {\n return this._activeLayer || new Layer({\n project: this,\n insert: true\n });\n },\n getSymbolDefinitions: function getSymbolDefinitions() {\n var definitions = [],\n ids = {};\n this.getItems({\n class: SymbolItem,\n match: function match(item) {\n var definition = item._definition,\n id = definition._id;\n\n if (!ids[id]) {\n ids[id] = true;\n definitions.push(definition);\n }\n\n return false;\n }\n });\n return definitions;\n },\n getSymbols: 'getSymbolDefinitions',\n getSelectedItems: function getSelectedItems() {\n var selectionItems = this._selectionItems,\n items = [];\n\n for (var id in selectionItems) {\n var item = selectionItems[id],\n selection = item._selection;\n\n if (selection & 1 && item.isInserted()) {\n items.push(item);\n } else if (!selection) {\n this._updateSelection(item);\n }\n }\n\n return items;\n },\n _updateSelection: function _updateSelection(item) {\n var id = item._id,\n selectionItems = this._selectionItems;\n\n if (item._selection) {\n if (selectionItems[id] !== item) {\n this._selectionCount++;\n selectionItems[id] = item;\n }\n } else if (selectionItems[id] === item) {\n this._selectionCount--;\n delete selectionItems[id];\n }\n },\n selectAll: function selectAll() {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setFullySelected(true);\n }\n },\n deselectAll: function deselectAll() {\n var selectionItems = this._selectionItems;\n\n for (var i in selectionItems) {\n selectionItems[i].setFullySelected(false);\n }\n },\n addLayer: function addLayer(layer) {\n return this.insertLayer(undefined, layer);\n },\n insertLayer: function insertLayer(index, layer) {\n if (layer instanceof Layer) {\n layer._remove(false, true);\n\n Base.splice(this._children, [layer], index, 0);\n\n layer._setProject(this, true);\n\n var name = layer._name;\n if (name) layer.setName(name);\n if (this._changes) layer._changed(5);\n if (!this._activeLayer) this._activeLayer = layer;\n } else {\n layer = null;\n }\n\n return layer;\n },\n _insertItem: function _insertItem(index, item, _created) {\n item = this.insertLayer(index, item) || (this._activeLayer || this._insertItem(undefined, new Layer(Item.NO_INSERT), true)).insertChild(index, item);\n if (_created && item.activate) item.activate();\n return item;\n },\n getItems: function getItems(options) {\n return Item._getItems(this, options);\n },\n getItem: function getItem(options) {\n return Item._getItems(this, options, null, null, true)[0] || null;\n },\n importJSON: function importJSON(json) {\n this.activate();\n var layer = this._activeLayer;\n return Base.importJSON(json, layer && layer.isEmpty() && layer);\n },\n removeOn: function removeOn(type) {\n var sets = this._removeSets;\n\n if (sets) {\n if (type === 'mouseup') sets.mousedrag = null;\n var set = sets[type];\n\n if (set) {\n for (var id in set) {\n var item = set[id];\n\n for (var key in sets) {\n var other = sets[key];\n if (other && other != set) delete other[item._id];\n }\n\n item.remove();\n }\n\n sets[type] = null;\n }\n }\n },\n draw: function draw(ctx, matrix, pixelRatio) {\n this._updateVersion++;\n ctx.save();\n matrix.applyToContext(ctx);\n var children = this._children,\n param = new Base({\n offset: new Point(0, 0),\n pixelRatio: pixelRatio,\n viewMatrix: matrix.isIdentity() ? null : matrix,\n matrices: [new Matrix()],\n updateMatrix: true\n });\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].draw(ctx, param);\n }\n\n ctx.restore();\n\n if (this._selectionCount > 0) {\n ctx.save();\n ctx.strokeWidth = 1;\n var items = this._selectionItems,\n size = this._scope.settings.handleSize,\n version = this._updateVersion;\n\n for (var id in items) {\n items[id]._drawSelection(ctx, matrix, size, items, version);\n }\n\n ctx.restore();\n }\n }\n });\n var Item = Base.extend(Emitter, {\n statics: {\n extend: function extend(src) {\n if (src._serializeFields) src._serializeFields = Base.set({}, this.prototype._serializeFields, src._serializeFields);\n return extend.base.apply(this, arguments);\n },\n NO_INSERT: {\n insert: false\n }\n },\n _class: 'Item',\n _name: null,\n _applyMatrix: true,\n _canApplyMatrix: true,\n _canScaleStroke: false,\n _pivot: null,\n _visible: true,\n _blendMode: 'normal',\n _opacity: 1,\n _locked: false,\n _guide: false,\n _clipMask: false,\n _selection: 0,\n _selectBounds: true,\n _selectChildren: false,\n _serializeFields: {\n name: null,\n applyMatrix: null,\n matrix: new Matrix(),\n pivot: null,\n visible: true,\n blendMode: 'normal',\n opacity: 1,\n locked: false,\n guide: false,\n clipMask: false,\n selected: false,\n data: {}\n },\n _prioritize: ['applyMatrix']\n }, new function () {\n var handlers = ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onClick', 'onDoubleClick', 'onMouseMove', 'onMouseEnter', 'onMouseLeave'];\n return Base.each(handlers, function (name) {\n this._events[name] = {\n install: function install(type) {\n this.getView()._countItemEvent(type, 1);\n },\n uninstall: function uninstall(type) {\n this.getView()._countItemEvent(type, -1);\n }\n };\n }, {\n _events: {\n onFrame: {\n install: function install() {\n this.getView()._animateItem(this, true);\n },\n uninstall: function uninstall() {\n this.getView()._animateItem(this, false);\n }\n },\n onLoad: {},\n onError: {}\n },\n statics: {\n _itemHandlers: handlers\n }\n });\n }(), {\n initialize: function Item() {},\n _initialize: function _initialize(props, point) {\n var hasProps = props && Base.isPlainObject(props),\n internal = hasProps && props.internal === true,\n matrix = this._matrix = new Matrix(),\n project = hasProps && props.project || paper.project,\n settings = paper.settings;\n this._id = internal ? null : UID.get();\n this._parent = this._index = null;\n this._applyMatrix = this._canApplyMatrix && settings.applyMatrix;\n if (point) matrix.translate(point);\n matrix._owner = this;\n this._style = new Style(project._currentStyle, this, project);\n\n if (internal || hasProps && props.insert == false || !settings.insertItems && !(hasProps && props.insert === true)) {\n this._setProject(project);\n } else {\n (hasProps && props.parent || project)._insertItem(undefined, this, true);\n }\n\n if (hasProps && props !== Item.NO_INSERT) {\n this.set(props, {\n internal: true,\n insert: true,\n project: true,\n parent: true\n });\n }\n\n return hasProps;\n },\n _serialize: function _serialize(options, dictionary) {\n var props = {},\n that = this;\n\n function serialize(fields) {\n for (var key in fields) {\n var value = that[key];\n\n if (!Base.equals(value, key === 'leading' ? fields.fontSize * 1.2 : fields[key])) {\n props[key] = Base.serialize(value, options, key !== 'data', dictionary);\n }\n }\n }\n\n serialize(this._serializeFields);\n if (!(this instanceof Group)) serialize(this._style._defaults);\n return [this._class, props];\n },\n _changed: function _changed(flags) {\n var symbol = this._symbol,\n cacheParent = this._parent || symbol,\n project = this._project;\n\n if (flags & 8) {\n this._bounds = this._position = this._decomposed = undefined;\n }\n\n if (flags & 16) {\n this._globalMatrix = undefined;\n }\n\n if (cacheParent && flags & 72) {\n Item._clearBoundsCache(cacheParent);\n }\n\n if (flags & 2) {\n Item._clearBoundsCache(this);\n }\n\n if (project) project._changed(flags, this);\n if (symbol) symbol._changed(flags);\n },\n getId: function getId() {\n return this._id;\n },\n getName: function getName() {\n return this._name;\n },\n setName: function setName(name) {\n if (this._name) this._removeNamed();\n if (name === +name + '') throw new Error('Names consisting only of numbers are not supported.');\n\n var owner = this._getOwner();\n\n if (name && owner) {\n var children = owner._children,\n namedChildren = owner._namedChildren;\n (namedChildren[name] = namedChildren[name] || []).push(this);\n if (!(name in children)) children[name] = this;\n }\n\n this._name = name || undefined;\n\n this._changed(256);\n },\n getStyle: function getStyle() {\n return this._style;\n },\n setStyle: function setStyle(style) {\n this.getStyle().set(style);\n }\n }, Base.each(['locked', 'visible', 'blendMode', 'opacity', 'guide'], function (name) {\n var part = Base.capitalize(name),\n key = '_' + name,\n flags = {\n locked: 256,\n visible: 265\n };\n\n this['get' + part] = function () {\n return this[key];\n };\n\n this['set' + part] = function (value) {\n if (value != this[key]) {\n this[key] = value;\n\n this._changed(flags[name] || 257);\n }\n };\n }, {}), {\n beans: true,\n getSelection: function getSelection() {\n return this._selection;\n },\n setSelection: function setSelection(selection) {\n if (selection !== this._selection) {\n this._selection = selection;\n var project = this._project;\n\n if (project) {\n project._updateSelection(this);\n\n this._changed(257);\n }\n }\n },\n _changeSelection: function _changeSelection(flag, selected) {\n var selection = this._selection;\n this.setSelection(selected ? selection | flag : selection & ~flag);\n },\n isSelected: function isSelected() {\n if (this._selectChildren) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i].isSelected()) return true;\n }\n }\n\n return !!(this._selection & 1);\n },\n setSelected: function setSelected(selected) {\n if (this._selectChildren) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setSelected(selected);\n }\n }\n\n this._changeSelection(1, selected);\n },\n isFullySelected: function isFullySelected() {\n var children = this._children,\n selected = !!(this._selection & 1);\n\n if (children && selected) {\n for (var i = 0, l = children.length; i < l; i++) {\n if (!children[i].isFullySelected()) return false;\n }\n\n return true;\n }\n\n return selected;\n },\n setFullySelected: function setFullySelected(selected) {\n var children = this._children;\n\n if (children) {\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setFullySelected(selected);\n }\n }\n\n this._changeSelection(1, selected);\n },\n isClipMask: function isClipMask() {\n return this._clipMask;\n },\n setClipMask: function setClipMask(clipMask) {\n if (this._clipMask != (clipMask = !!clipMask)) {\n this._clipMask = clipMask;\n\n if (clipMask) {\n this.setFillColor(null);\n this.setStrokeColor(null);\n }\n\n this._changed(257);\n\n if (this._parent) this._parent._changed(2048);\n }\n },\n getData: function getData() {\n if (!this._data) this._data = {};\n return this._data;\n },\n setData: function setData(data) {\n this._data = data;\n },\n getPosition: function getPosition(_dontLink) {\n var ctor = _dontLink ? Point : LinkedPoint;\n\n var position = this._position || (this._position = this._getPositionFromBounds());\n\n return new ctor(position.x, position.y, this, 'setPosition');\n },\n setPosition: function setPosition() {\n this.translate(Point.read(arguments).subtract(this.getPosition(true)));\n },\n _getPositionFromBounds: function _getPositionFromBounds(bounds) {\n return this._pivot ? this._matrix._transformPoint(this._pivot) : (bounds || this.getBounds()).getCenter(true);\n },\n getPivot: function getPivot() {\n var pivot = this._pivot;\n return pivot ? new LinkedPoint(pivot.x, pivot.y, this, 'setPivot') : null;\n },\n setPivot: function setPivot() {\n this._pivot = Point.read(arguments, 0, {\n clone: true,\n readNull: true\n });\n this._position = undefined;\n }\n }, Base.each({\n getStrokeBounds: {\n stroke: true\n },\n getHandleBounds: {\n handle: true\n },\n getInternalBounds: {\n internal: true\n }\n }, function (options, key) {\n this[key] = function (matrix) {\n return this.getBounds(matrix, options);\n };\n }, {\n beans: true,\n getBounds: function getBounds(matrix, options) {\n var hasMatrix = options || matrix instanceof Matrix,\n opts = Base.set({}, hasMatrix ? options : matrix, this._boundsOptions);\n if (!opts.stroke || this.getStrokeScaling()) opts.cacheItem = this;\n\n var rect = this._getCachedBounds(hasMatrix && matrix, opts).rect;\n\n return !arguments.length ? new LinkedRectangle(rect.x, rect.y, rect.width, rect.height, this, 'setBounds') : rect;\n },\n setBounds: function setBounds() {\n var rect = _Rectangle.read(arguments),\n bounds = this.getBounds(),\n _matrix = this._matrix,\n matrix = new Matrix(),\n center = rect.getCenter();\n\n matrix.translate(center);\n\n if (rect.width != bounds.width || rect.height != bounds.height) {\n if (!_matrix.isInvertible()) {\n _matrix.set(_matrix._backup || new Matrix().translate(_matrix.getTranslation()));\n\n bounds = this.getBounds();\n }\n\n matrix.scale(bounds.width !== 0 ? rect.width / bounds.width : 0, bounds.height !== 0 ? rect.height / bounds.height : 0);\n }\n\n center = bounds.getCenter();\n matrix.translate(-center.x, -center.y);\n this.transform(matrix);\n },\n _getBounds: function _getBounds(matrix, options) {\n var children = this._children;\n if (!children || !children.length) return new _Rectangle();\n\n Item._updateBoundsCache(this, options.cacheItem);\n\n return Item._getBounds(children, matrix, options);\n },\n _getBoundsCacheKey: function _getBoundsCacheKey(options, internal) {\n return [options.stroke ? 1 : 0, options.handle ? 1 : 0, internal ? 1 : 0].join('');\n },\n _getCachedBounds: function _getCachedBounds(matrix, options, noInternal) {\n matrix = matrix && matrix._orNullIfIdentity();\n\n var internal = options.internal && !noInternal,\n cacheItem = options.cacheItem,\n _matrix = internal ? null : this._matrix._orNullIfIdentity(),\n cacheKey = cacheItem && (!matrix || matrix.equals(_matrix)) && this._getBoundsCacheKey(options, internal),\n bounds = this._bounds;\n\n Item._updateBoundsCache(this._parent || this._symbol, cacheItem);\n\n if (cacheKey && bounds && cacheKey in bounds) {\n var cached = bounds[cacheKey];\n return {\n rect: cached.rect.clone(),\n nonscaling: cached.nonscaling\n };\n }\n\n var res = this._getBounds(matrix || _matrix, options),\n rect = res.rect || res,\n style = this._style,\n nonscaling = res.nonscaling || style.hasStroke() && !style.getStrokeScaling();\n\n if (cacheKey) {\n if (!bounds) {\n this._bounds = bounds = {};\n }\n\n var cached = bounds[cacheKey] = {\n rect: rect.clone(),\n nonscaling: nonscaling,\n internal: internal\n };\n }\n\n return {\n rect: rect,\n nonscaling: nonscaling\n };\n },\n _getStrokeMatrix: function _getStrokeMatrix(matrix, options) {\n var parent = this.getStrokeScaling() ? null : options && options.internal ? this : this._parent || this._symbol && this._symbol._item,\n mx = parent ? parent.getViewMatrix().invert() : matrix;\n return mx && mx._shiftless();\n },\n statics: {\n _updateBoundsCache: function _updateBoundsCache(parent, item) {\n if (parent && item) {\n var id = item._id,\n ref = parent._boundsCache = parent._boundsCache || {\n ids: {},\n list: []\n };\n\n if (!ref.ids[id]) {\n ref.list.push(item);\n ref.ids[id] = item;\n }\n }\n },\n _clearBoundsCache: function _clearBoundsCache(item) {\n var cache = item._boundsCache;\n\n if (cache) {\n item._bounds = item._position = item._boundsCache = undefined;\n\n for (var i = 0, list = cache.list, l = list.length; i < l; i++) {\n var other = list[i];\n\n if (other !== item) {\n other._bounds = other._position = undefined;\n if (other._boundsCache) Item._clearBoundsCache(other);\n }\n }\n }\n },\n _getBounds: function _getBounds(items, matrix, options) {\n var x1 = Infinity,\n x2 = -x1,\n y1 = x1,\n y2 = x2,\n nonscaling = false;\n options = options || {};\n\n for (var i = 0, l = items.length; i < l; i++) {\n var item = items[i];\n\n if (item._visible && !item.isEmpty(true)) {\n var bounds = item._getCachedBounds(matrix && matrix.appended(item._matrix), options, true),\n rect = bounds.rect;\n\n x1 = Math.min(rect.x, x1);\n y1 = Math.min(rect.y, y1);\n x2 = Math.max(rect.x + rect.width, x2);\n y2 = Math.max(rect.y + rect.height, y2);\n if (bounds.nonscaling) nonscaling = true;\n }\n }\n\n return {\n rect: isFinite(x1) ? new _Rectangle(x1, y1, x2 - x1, y2 - y1) : new _Rectangle(),\n nonscaling: nonscaling\n };\n }\n }\n }), {\n beans: true,\n _decompose: function _decompose() {\n return this._applyMatrix ? null : this._decomposed || (this._decomposed = this._matrix.decompose());\n },\n getRotation: function getRotation() {\n var decomposed = this._decompose();\n\n return decomposed ? decomposed.rotation : 0;\n },\n setRotation: function setRotation(rotation) {\n var current = this.getRotation();\n\n if (current != null && rotation != null) {\n var decomposed = this._decomposed;\n this.rotate(rotation - current);\n\n if (decomposed) {\n decomposed.rotation = rotation;\n this._decomposed = decomposed;\n }\n }\n },\n getScaling: function getScaling() {\n var decomposed = this._decompose(),\n s = decomposed && decomposed.scaling;\n\n return new LinkedPoint(s ? s.x : 1, s ? s.y : 1, this, 'setScaling');\n },\n setScaling: function setScaling() {\n var current = this.getScaling(),\n scaling = Point.read(arguments, 0, {\n clone: true,\n readNull: true\n });\n\n if (current && scaling && !current.equals(scaling)) {\n var rotation = this.getRotation(),\n decomposed = this._decomposed,\n matrix = new Matrix(),\n isZero = Numerical.isZero;\n\n if (isZero(current.x) || isZero(current.y)) {\n matrix.translate(decomposed.translation);\n\n if (rotation) {\n matrix.rotate(rotation);\n }\n\n matrix.scale(scaling.x, scaling.y);\n\n this._matrix.set(matrix);\n } else {\n var center = this.getPosition(true);\n matrix.translate(center);\n if (rotation) matrix.rotate(rotation);\n matrix.scale(scaling.x / current.x, scaling.y / current.y);\n if (rotation) matrix.rotate(-rotation);\n matrix.translate(center.negate());\n this.transform(matrix);\n }\n\n if (decomposed) {\n decomposed.scaling = scaling;\n this._decomposed = decomposed;\n }\n }\n },\n getMatrix: function getMatrix() {\n return this._matrix;\n },\n setMatrix: function setMatrix() {\n var matrix = this._matrix;\n matrix.set.apply(matrix, arguments);\n },\n getGlobalMatrix: function getGlobalMatrix(_dontClone) {\n var matrix = this._globalMatrix;\n\n if (matrix) {\n var parent = this._parent;\n var parents = [];\n\n while (parent) {\n if (!parent._globalMatrix) {\n matrix = null;\n\n for (var i = 0, l = parents.length; i < l; i++) {\n parents[i]._globalMatrix = null;\n }\n\n break;\n }\n\n parents.push(parent);\n parent = parent._parent;\n }\n }\n\n if (!matrix) {\n matrix = this._globalMatrix = this._matrix.clone();\n var parent = this._parent;\n if (parent) matrix.prepend(parent.getGlobalMatrix(true));\n }\n\n return _dontClone ? matrix : matrix.clone();\n },\n getViewMatrix: function getViewMatrix() {\n return this.getGlobalMatrix().prepend(this.getView()._matrix);\n },\n getApplyMatrix: function getApplyMatrix() {\n return this._applyMatrix;\n },\n setApplyMatrix: function setApplyMatrix(apply) {\n if (this._applyMatrix = this._canApplyMatrix && !!apply) this.transform(null, true);\n },\n getTransformContent: '#getApplyMatrix',\n setTransformContent: '#setApplyMatrix'\n }, {\n getProject: function getProject() {\n return this._project;\n },\n _setProject: function _setProject(project, installEvents) {\n if (this._project !== project) {\n if (this._project) this._installEvents(false);\n this._project = project;\n var children = this._children;\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n children[i]._setProject(project);\n }\n\n installEvents = true;\n }\n\n if (installEvents) this._installEvents(true);\n },\n getView: function getView() {\n return this._project._view;\n },\n _installEvents: function _installEvents(install) {\n _installEvents.base.call(this, install);\n\n var children = this._children;\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n children[i]._installEvents(install);\n }\n },\n getLayer: function getLayer() {\n var parent = this;\n\n while (parent = parent._parent) {\n if (parent instanceof Layer) return parent;\n }\n\n return null;\n },\n getParent: function getParent() {\n return this._parent;\n },\n setParent: function setParent(item) {\n return item.addChild(this);\n },\n _getOwner: '#getParent',\n getChildren: function getChildren() {\n return this._children;\n },\n setChildren: function setChildren(items) {\n this.removeChildren();\n this.addChildren(items);\n },\n getFirstChild: function getFirstChild() {\n return this._children && this._children[0] || null;\n },\n getLastChild: function getLastChild() {\n return this._children && this._children[this._children.length - 1] || null;\n },\n getNextSibling: function getNextSibling() {\n var owner = this._getOwner();\n\n return owner && owner._children[this._index + 1] || null;\n },\n getPreviousSibling: function getPreviousSibling() {\n var owner = this._getOwner();\n\n return owner && owner._children[this._index - 1] || null;\n },\n getIndex: function getIndex() {\n return this._index;\n },\n equals: function equals(item) {\n return item === this || item && this._class === item._class && this._style.equals(item._style) && this._matrix.equals(item._matrix) && this._locked === item._locked && this._visible === item._visible && this._blendMode === item._blendMode && this._opacity === item._opacity && this._clipMask === item._clipMask && this._guide === item._guide && this._equals(item) || false;\n },\n _equals: function _equals(item) {\n return Base.equals(this._children, item._children);\n },\n clone: function clone(options) {\n var copy = new this.constructor(Item.NO_INSERT),\n children = this._children,\n insert = Base.pick(options ? options.insert : undefined, options === undefined || options === true),\n deep = Base.pick(options ? options.deep : undefined, true);\n if (children) copy.copyAttributes(this);\n if (!children || deep) copy.copyContent(this);\n if (!children) copy.copyAttributes(this);\n if (insert) copy.insertAbove(this);\n var name = this._name,\n parent = this._parent;\n\n if (name && parent) {\n var children = parent._children,\n orig = name,\n i = 1;\n\n while (children[name]) {\n name = orig + ' ' + i++;\n }\n\n if (name !== orig) copy.setName(name);\n }\n\n return copy;\n },\n copyContent: function copyContent(source) {\n var children = source._children;\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n this.addChild(children[i].clone(false), true);\n }\n },\n copyAttributes: function copyAttributes(source, excludeMatrix) {\n this.setStyle(source._style);\n var keys = ['_locked', '_visible', '_blendMode', '_opacity', '_clipMask', '_guide'];\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n if (source.hasOwnProperty(key)) this[key] = source[key];\n }\n\n if (!excludeMatrix) this._matrix.set(source._matrix, true);\n this.setApplyMatrix(source._applyMatrix);\n this.setPivot(source._pivot);\n this.setSelection(source._selection);\n var data = source._data,\n name = source._name;\n this._data = data ? Base.clone(data) : null;\n if (name) this.setName(name);\n },\n rasterize: function rasterize(arg0, arg1) {\n var resolution, insert, raster;\n\n if (Base.isPlainObject(arg0)) {\n resolution = arg0.resolution;\n insert = arg0.insert;\n raster = arg0.raster;\n } else {\n resolution = arg0;\n insert = arg1;\n }\n\n if (raster) {\n raster.matrix.reset(true);\n } else {\n raster = new Raster(Item.NO_INSERT);\n }\n\n var bounds = this.getStrokeBounds(),\n scale = (resolution || this.getView().getResolution()) / 72,\n topLeft = bounds.getTopLeft().floor(),\n bottomRight = bounds.getBottomRight().ceil(),\n boundsSize = new Size(bottomRight.subtract(topLeft)),\n rasterSize = boundsSize.multiply(scale);\n raster.setSize(rasterSize, true);\n\n if (!rasterSize.isZero()) {\n var ctx = raster.getContext(true),\n matrix = new Matrix().scale(scale).translate(topLeft.negate());\n ctx.save();\n matrix.applyToContext(ctx);\n this.draw(ctx, new Base({\n matrices: [matrix]\n }));\n ctx.restore();\n }\n\n raster.transform(new Matrix().translate(topLeft.add(boundsSize.divide(2))).scale(1 / scale));\n\n if (insert === undefined || insert) {\n raster.insertAbove(this);\n }\n\n return raster;\n },\n contains: function contains() {\n var matrix = this._matrix;\n return matrix.isInvertible() && !!this._contains(matrix._inverseTransform(Point.read(arguments)));\n },\n _contains: function _contains(point) {\n var children = this._children;\n\n if (children) {\n for (var i = children.length - 1; i >= 0; i--) {\n if (children[i].contains(point)) return true;\n }\n\n return false;\n }\n\n return point.isInside(this.getInternalBounds());\n },\n isInside: function isInside() {\n return _Rectangle.read(arguments).contains(this.getBounds());\n },\n _asPathItem: function _asPathItem() {\n return new Path.Rectangle({\n rectangle: this.getInternalBounds(),\n matrix: this._matrix,\n insert: false\n });\n },\n intersects: function intersects(item, _matrix) {\n if (!(item instanceof Item)) return false;\n return this._asPathItem().getIntersections(item._asPathItem(), null, _matrix, true).length > 0;\n }\n }, new function () {\n function hitTest() {\n var args = arguments;\n return this._hitTest(Point.read(args), HitResult.getOptions(args));\n }\n\n function hitTestAll() {\n var args = arguments,\n point = Point.read(args),\n options = HitResult.getOptions(args),\n all = [];\n\n this._hitTest(point, new Base({\n all: all\n }, options));\n\n return all;\n }\n\n function hitTestChildren(point, options, viewMatrix, _exclude) {\n var children = this._children;\n\n if (children) {\n for (var i = children.length - 1; i >= 0; i--) {\n var child = children[i];\n\n var res = child !== _exclude && child._hitTest(point, options, viewMatrix);\n\n if (res && !options.all) return res;\n }\n }\n\n return null;\n }\n\n Project.inject({\n hitTest: hitTest,\n hitTestAll: hitTestAll,\n _hitTest: hitTestChildren\n });\n return {\n hitTest: hitTest,\n hitTestAll: hitTestAll,\n _hitTestChildren: hitTestChildren\n };\n }(), {\n _hitTest: function _hitTest(point, options, parentViewMatrix) {\n if (this._locked || !this._visible || this._guide && !options.guides || this.isEmpty()) {\n return null;\n }\n\n var matrix = this._matrix,\n viewMatrix = parentViewMatrix ? parentViewMatrix.appended(matrix) : this.getGlobalMatrix().prepend(this.getView()._matrix),\n tolerance = Math.max(options.tolerance, 1e-12),\n tolerancePadding = options._tolerancePadding = new Size(Path._getStrokePadding(tolerance, matrix._shiftless().invert()));\n point = matrix._inverseTransform(point);\n\n if (!point || !this._children && !this.getBounds({\n internal: true,\n stroke: true,\n handle: true\n }).expand(tolerancePadding.multiply(2))._containsPoint(point)) {\n return null;\n }\n\n var checkSelf = !(options.guides && !this._guide || options.selected && !this.isSelected() || options.type && options.type !== Base.hyphenate(this._class) || options.class && !(this instanceof options.class)),\n match = options.match,\n that = this,\n bounds,\n res;\n\n function filter(hit) {\n if (hit && match && !match(hit)) hit = null;\n if (hit && options.all) options.all.push(hit);\n return hit;\n }\n\n function checkPoint(type, part) {\n var pt = part ? bounds['get' + part]() : that.getPosition();\n\n if (point.subtract(pt).divide(tolerancePadding).length <= 1) {\n return new HitResult(type, that, {\n name: part ? Base.hyphenate(part) : type,\n point: pt\n });\n }\n }\n\n var checkPosition = options.position,\n checkCenter = options.center,\n checkBounds = options.bounds;\n\n if (checkSelf && this._parent && (checkPosition || checkCenter || checkBounds)) {\n if (checkCenter || checkBounds) {\n bounds = this.getInternalBounds();\n }\n\n res = checkPosition && checkPoint('position') || checkCenter && checkPoint('center', 'Center');\n\n if (!res && checkBounds) {\n var points = ['TopLeft', 'TopRight', 'BottomLeft', 'BottomRight', 'LeftCenter', 'TopCenter', 'RightCenter', 'BottomCenter'];\n\n for (var i = 0; i < 8 && !res; i++) {\n res = checkPoint('bounds', points[i]);\n }\n }\n\n res = filter(res);\n }\n\n if (!res) {\n res = this._hitTestChildren(point, options, viewMatrix) || checkSelf && filter(this._hitTestSelf(point, options, viewMatrix, this.getStrokeScaling() ? null : viewMatrix._shiftless().invert())) || null;\n }\n\n if (res && res.point) {\n res.point = matrix.transform(res.point);\n }\n\n return res;\n },\n _hitTestSelf: function _hitTestSelf(point, options) {\n if (options.fill && this.hasFill() && this._contains(point)) return new HitResult('fill', this);\n },\n matches: function matches(name, compare) {\n function matchObject(obj1, obj2) {\n for (var i in obj1) {\n if (obj1.hasOwnProperty(i)) {\n var val1 = obj1[i],\n val2 = obj2[i];\n\n if (Base.isPlainObject(val1) && Base.isPlainObject(val2)) {\n if (!matchObject(val1, val2)) return false;\n } else if (!Base.equals(val1, val2)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n var type = typeof name;\n\n if (type === 'object') {\n for (var key in name) {\n if (name.hasOwnProperty(key) && !this.matches(key, name[key])) return false;\n }\n\n return true;\n } else if (type === 'function') {\n return name(this);\n } else if (name === 'match') {\n return compare(this);\n } else {\n var value = /^(empty|editable)$/.test(name) ? this['is' + Base.capitalize(name)]() : name === 'type' ? Base.hyphenate(this._class) : this[name];\n\n if (name === 'class') {\n if (typeof compare === 'function') return this instanceof compare;\n value = this._class;\n }\n\n if (typeof compare === 'function') {\n return !!compare(value);\n } else if (compare) {\n if (compare.test) {\n return compare.test(value);\n } else if (Base.isPlainObject(compare)) {\n return matchObject(compare, value);\n }\n }\n\n return Base.equals(value, compare);\n }\n },\n getItems: function getItems(options) {\n return Item._getItems(this, options, this._matrix);\n },\n getItem: function getItem(options) {\n return Item._getItems(this, options, this._matrix, null, true)[0] || null;\n },\n statics: {\n _getItems: function _getItems(item, options, matrix, param, firstOnly) {\n if (!param) {\n var obj = typeof options === 'object' && options,\n overlapping = obj && obj.overlapping,\n inside = obj && obj.inside,\n bounds = overlapping || inside,\n rect = bounds && _Rectangle.read([bounds]);\n\n param = {\n items: [],\n recursive: obj && obj.recursive !== false,\n inside: !!inside,\n overlapping: !!overlapping,\n rect: rect,\n path: overlapping && new Path.Rectangle({\n rectangle: rect,\n insert: false\n })\n };\n\n if (obj) {\n options = Base.filter({}, options, {\n recursive: true,\n inside: true,\n overlapping: true\n });\n }\n }\n\n var children = item._children,\n items = param.items,\n rect = param.rect;\n matrix = rect && (matrix || new Matrix());\n\n for (var i = 0, l = children && children.length; i < l; i++) {\n var child = children[i],\n childMatrix = matrix && matrix.appended(child._matrix),\n add = true;\n\n if (rect) {\n var bounds = child.getBounds(childMatrix);\n if (!rect.intersects(bounds)) continue;\n if (!(rect.contains(bounds) || param.overlapping && (bounds.contains(rect) || param.path.intersects(child, childMatrix)))) add = false;\n }\n\n if (add && child.matches(options)) {\n items.push(child);\n if (firstOnly) break;\n }\n\n if (param.recursive !== false) {\n _getItems(child, options, childMatrix, param, firstOnly);\n }\n\n if (firstOnly && items.length > 0) break;\n }\n\n return items;\n }\n }\n }, {\n importJSON: function importJSON(json) {\n var res = Base.importJSON(json, this);\n return res !== this ? this.addChild(res) : res;\n },\n addChild: function addChild(item) {\n return this.insertChild(undefined, item);\n },\n insertChild: function insertChild(index, item) {\n var res = item ? this.insertChildren(index, [item]) : null;\n return res && res[0];\n },\n addChildren: function addChildren(items) {\n return this.insertChildren(this._children.length, items);\n },\n insertChildren: function insertChildren(index, items) {\n var children = this._children;\n\n if (children && items && items.length > 0) {\n items = Base.slice(items);\n var inserted = {};\n\n for (var i = items.length - 1; i >= 0; i--) {\n var item = items[i],\n id = item && item._id;\n\n if (!item || inserted[id]) {\n items.splice(i, 1);\n } else {\n item._remove(false, true);\n\n inserted[id] = true;\n }\n }\n\n Base.splice(children, items, index, 0);\n var project = this._project,\n notifySelf = project._changes;\n\n for (var i = 0, l = items.length; i < l; i++) {\n var item = items[i],\n name = item._name;\n item._parent = this;\n\n item._setProject(project, true);\n\n if (name) item.setName(name);\n if (notifySelf) item._changed(5);\n }\n\n this._changed(11);\n } else {\n items = null;\n }\n\n return items;\n },\n _insertItem: '#insertChild',\n _insertAt: function _insertAt(item, offset) {\n var owner = item && item._getOwner(),\n res = item !== this && owner ? this : null;\n\n if (res) {\n res._remove(false, true);\n\n owner._insertItem(item._index + offset, res);\n }\n\n return res;\n },\n insertAbove: function insertAbove(item) {\n return this._insertAt(item, 1);\n },\n insertBelow: function insertBelow(item) {\n return this._insertAt(item, 0);\n },\n sendToBack: function sendToBack() {\n var owner = this._getOwner();\n\n return owner ? owner._insertItem(0, this) : null;\n },\n bringToFront: function bringToFront() {\n var owner = this._getOwner();\n\n return owner ? owner._insertItem(undefined, this) : null;\n },\n appendTop: '#addChild',\n appendBottom: function appendBottom(item) {\n return this.insertChild(0, item);\n },\n moveAbove: '#insertAbove',\n moveBelow: '#insertBelow',\n addTo: function addTo(owner) {\n return owner._insertItem(undefined, this);\n },\n copyTo: function copyTo(owner) {\n return this.clone(false).addTo(owner);\n },\n reduce: function reduce(options) {\n var children = this._children;\n\n if (children && children.length === 1) {\n var child = children[0].reduce(options);\n\n if (this._parent) {\n child.insertAbove(this);\n this.remove();\n } else {\n child.remove();\n }\n\n return child;\n }\n\n return this;\n },\n _removeNamed: function _removeNamed() {\n var owner = this._getOwner();\n\n if (owner) {\n var children = owner._children,\n namedChildren = owner._namedChildren,\n name = this._name,\n namedArray = namedChildren[name],\n index = namedArray ? namedArray.indexOf(this) : -1;\n\n if (index !== -1) {\n if (children[name] == this) delete children[name];\n namedArray.splice(index, 1);\n\n if (namedArray.length) {\n children[name] = namedArray[0];\n } else {\n delete namedChildren[name];\n }\n }\n }\n },\n _remove: function _remove(notifySelf, notifyParent) {\n var owner = this._getOwner(),\n project = this._project,\n index = this._index;\n\n if (this._style) this._style._dispose();\n\n if (owner) {\n if (this._name) this._removeNamed();\n\n if (index != null) {\n if (project._activeLayer === this) project._activeLayer = this.getNextSibling() || this.getPreviousSibling();\n Base.splice(owner._children, null, index, 1);\n }\n\n this._installEvents(false);\n\n if (notifySelf && project._changes) this._changed(5);\n if (notifyParent) owner._changed(11, this);\n this._parent = null;\n return true;\n }\n\n return false;\n },\n remove: function remove() {\n return this._remove(true, true);\n },\n replaceWith: function replaceWith(item) {\n var ok = item && item.insertBelow(this);\n if (ok) this.remove();\n return ok;\n },\n removeChildren: function removeChildren(start, end) {\n if (!this._children) return null;\n start = start || 0;\n end = Base.pick(end, this._children.length);\n var removed = Base.splice(this._children, null, start, end - start);\n\n for (var i = removed.length - 1; i >= 0; i--) {\n removed[i]._remove(true, false);\n }\n\n if (removed.length > 0) this._changed(11);\n return removed;\n },\n clear: '#removeChildren',\n reverseChildren: function reverseChildren() {\n if (this._children) {\n this._children.reverse();\n\n for (var i = 0, l = this._children.length; i < l; i++) {\n this._children[i]._index = i;\n }\n\n this._changed(11);\n }\n },\n isEmpty: function isEmpty(recursively) {\n var children = this._children;\n var numChildren = children ? children.length : 0;\n\n if (recursively) {\n for (var i = 0; i < numChildren; i++) {\n if (!children[i].isEmpty(recursively)) {\n return false;\n }\n }\n\n return true;\n }\n\n return !numChildren;\n },\n isEditable: function isEditable() {\n var item = this;\n\n while (item) {\n if (!item._visible || item._locked) return false;\n item = item._parent;\n }\n\n return true;\n },\n hasFill: function hasFill() {\n return this.getStyle().hasFill();\n },\n hasStroke: function hasStroke() {\n return this.getStyle().hasStroke();\n },\n hasShadow: function hasShadow() {\n return this.getStyle().hasShadow();\n },\n _getOrder: function _getOrder(item) {\n function getList(item) {\n var list = [];\n\n do {\n list.unshift(item);\n } while (item = item._parent);\n\n return list;\n }\n\n var list1 = getList(this),\n list2 = getList(item);\n\n for (var i = 0, l = Math.min(list1.length, list2.length); i < l; i++) {\n if (list1[i] != list2[i]) {\n return list1[i]._index < list2[i]._index ? 1 : -1;\n }\n }\n\n return 0;\n },\n hasChildren: function hasChildren() {\n return this._children && this._children.length > 0;\n },\n isInserted: function isInserted() {\n return this._parent ? this._parent.isInserted() : false;\n },\n isAbove: function isAbove(item) {\n return this._getOrder(item) === -1;\n },\n isBelow: function isBelow(item) {\n return this._getOrder(item) === 1;\n },\n isParent: function isParent(item) {\n return this._parent === item;\n },\n isChild: function isChild(item) {\n return item && item._parent === this;\n },\n isDescendant: function isDescendant(item) {\n var parent = this;\n\n while (parent = parent._parent) {\n if (parent === item) return true;\n }\n\n return false;\n },\n isAncestor: function isAncestor(item) {\n return item ? item.isDescendant(this) : false;\n },\n isSibling: function isSibling(item) {\n return this._parent === item._parent;\n },\n isGroupedWith: function isGroupedWith(item) {\n var parent = this._parent;\n\n while (parent) {\n if (parent._parent && /^(Group|Layer|CompoundPath)$/.test(parent._class) && item.isDescendant(parent)) return true;\n parent = parent._parent;\n }\n\n return false;\n }\n }, Base.each(['rotate', 'scale', 'shear', 'skew'], function (key) {\n var rotate = key === 'rotate';\n\n this[key] = function () {\n var args = arguments,\n value = (rotate ? Base : Point).read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n return this.transform(new Matrix()[key](value, center || this.getPosition(true)));\n };\n }, {\n translate: function translate() {\n var mx = new Matrix();\n return this.transform(mx.translate.apply(mx, arguments));\n },\n transform: function transform(matrix, _applyRecursively, _setApplyMatrix) {\n var _matrix = this._matrix,\n transformMatrix = matrix && !matrix.isIdentity(),\n applyMatrix = _setApplyMatrix && this._canApplyMatrix || this._applyMatrix && (transformMatrix || !_matrix.isIdentity() || _applyRecursively && this._children);\n if (!transformMatrix && !applyMatrix) return this;\n\n if (transformMatrix) {\n if (!matrix.isInvertible() && _matrix.isInvertible()) _matrix._backup = _matrix.getValues();\n\n _matrix.prepend(matrix, true);\n\n var style = this._style,\n fillColor = style.getFillColor(true),\n strokeColor = style.getStrokeColor(true);\n if (fillColor) fillColor.transform(matrix);\n if (strokeColor) strokeColor.transform(matrix);\n }\n\n if (applyMatrix && (applyMatrix = this._transformContent(_matrix, _applyRecursively, _setApplyMatrix))) {\n var pivot = this._pivot;\n if (pivot) _matrix._transformPoint(pivot, pivot, true);\n\n _matrix.reset(true);\n\n if (_setApplyMatrix && this._canApplyMatrix) this._applyMatrix = true;\n }\n\n var bounds = this._bounds,\n position = this._position;\n\n if (transformMatrix || applyMatrix) {\n this._changed(25);\n }\n\n var decomp = transformMatrix && bounds && matrix.decompose();\n\n if (decomp && decomp.skewing.isZero() && decomp.rotation % 90 === 0) {\n for (var key in bounds) {\n var cache = bounds[key];\n\n if (cache.nonscaling) {\n delete bounds[key];\n } else if (applyMatrix || !cache.internal) {\n var rect = cache.rect;\n\n matrix._transformBounds(rect, rect);\n }\n }\n\n this._bounds = bounds;\n\n var cached = bounds[this._getBoundsCacheKey(this._boundsOptions || {})];\n\n if (cached) {\n this._position = this._getPositionFromBounds(cached.rect);\n }\n } else if (transformMatrix && position && this._pivot) {\n this._position = matrix._transformPoint(position, position);\n }\n\n return this;\n },\n _transformContent: function _transformContent(matrix, applyRecursively, setApplyMatrix) {\n var children = this._children;\n\n if (children) {\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].transform(matrix, applyRecursively, setApplyMatrix);\n }\n\n return true;\n }\n },\n globalToLocal: function globalToLocal() {\n return this.getGlobalMatrix(true)._inverseTransform(Point.read(arguments));\n },\n localToGlobal: function localToGlobal() {\n return this.getGlobalMatrix(true)._transformPoint(Point.read(arguments));\n },\n parentToLocal: function parentToLocal() {\n return this._matrix._inverseTransform(Point.read(arguments));\n },\n localToParent: function localToParent() {\n return this._matrix._transformPoint(Point.read(arguments));\n },\n fitBounds: function fitBounds(rectangle, fill) {\n rectangle = _Rectangle.read(arguments);\n var bounds = this.getBounds(),\n itemRatio = bounds.height / bounds.width,\n rectRatio = rectangle.height / rectangle.width,\n scale = (fill ? itemRatio > rectRatio : itemRatio < rectRatio) ? rectangle.width / bounds.width : rectangle.height / bounds.height,\n newBounds = new _Rectangle(new Point(), new Size(bounds.width * scale, bounds.height * scale));\n newBounds.setCenter(rectangle.getCenter());\n this.setBounds(newBounds);\n }\n }), {\n _setStyles: function _setStyles(ctx, param, viewMatrix) {\n var style = this._style,\n matrix = this._matrix;\n\n if (style.hasFill()) {\n ctx.fillStyle = style.getFillColor().toCanvasStyle(ctx, matrix);\n }\n\n if (style.hasStroke()) {\n ctx.strokeStyle = style.getStrokeColor().toCanvasStyle(ctx, matrix);\n ctx.lineWidth = style.getStrokeWidth();\n var strokeJoin = style.getStrokeJoin(),\n strokeCap = style.getStrokeCap(),\n miterLimit = style.getMiterLimit();\n if (strokeJoin) ctx.lineJoin = strokeJoin;\n if (strokeCap) ctx.lineCap = strokeCap;\n if (miterLimit) ctx.miterLimit = miterLimit;\n\n if (paper.support.nativeDash) {\n var dashArray = style.getDashArray(),\n dashOffset = style.getDashOffset();\n\n if (dashArray && dashArray.length) {\n if ('setLineDash' in ctx) {\n ctx.setLineDash(dashArray);\n ctx.lineDashOffset = dashOffset;\n } else {\n ctx.mozDash = dashArray;\n ctx.mozDashOffset = dashOffset;\n }\n }\n }\n }\n\n if (style.hasShadow()) {\n var pixelRatio = param.pixelRatio || 1,\n mx = viewMatrix._shiftless().prepend(new Matrix().scale(pixelRatio, pixelRatio)),\n blur = mx.transform(new Point(style.getShadowBlur(), 0)),\n offset = mx.transform(this.getShadowOffset());\n\n ctx.shadowColor = style.getShadowColor().toCanvasStyle(ctx);\n ctx.shadowBlur = blur.getLength();\n ctx.shadowOffsetX = offset.x;\n ctx.shadowOffsetY = offset.y;\n }\n },\n draw: function draw(ctx, param, parentStrokeMatrix) {\n var updateVersion = this._updateVersion = this._project._updateVersion;\n if (!this._visible || this._opacity === 0) return;\n var matrices = param.matrices,\n viewMatrix = param.viewMatrix,\n matrix = this._matrix,\n globalMatrix = matrices[matrices.length - 1].appended(matrix);\n if (!globalMatrix.isInvertible()) return;\n viewMatrix = viewMatrix ? viewMatrix.appended(globalMatrix) : globalMatrix;\n matrices.push(globalMatrix);\n\n if (param.updateMatrix) {\n this._globalMatrix = globalMatrix;\n }\n\n var blendMode = this._blendMode,\n opacity = Numerical.clamp(this._opacity, 0, 1),\n normalBlend = blendMode === 'normal',\n nativeBlend = BlendMode.nativeModes[blendMode],\n direct = normalBlend && opacity === 1 || param.dontStart || param.clip || (nativeBlend || normalBlend && opacity < 1) && this._canComposite(),\n pixelRatio = param.pixelRatio || 1,\n mainCtx,\n itemOffset,\n prevOffset;\n\n if (!direct) {\n var bounds = this.getStrokeBounds(viewMatrix);\n\n if (!bounds.width || !bounds.height) {\n matrices.pop();\n return;\n }\n\n prevOffset = param.offset;\n itemOffset = param.offset = bounds.getTopLeft().floor();\n mainCtx = ctx;\n ctx = CanvasProvider.getContext(bounds.getSize().ceil().add(1).multiply(pixelRatio));\n if (pixelRatio !== 1) ctx.scale(pixelRatio, pixelRatio);\n }\n\n ctx.save();\n var strokeMatrix = parentStrokeMatrix ? parentStrokeMatrix.appended(matrix) : this._canScaleStroke && !this.getStrokeScaling(true) && viewMatrix,\n clip = !direct && param.clipItem,\n transform = !strokeMatrix || clip;\n\n if (direct) {\n ctx.globalAlpha = opacity;\n if (nativeBlend) ctx.globalCompositeOperation = blendMode;\n } else if (transform) {\n ctx.translate(-itemOffset.x, -itemOffset.y);\n }\n\n if (transform) {\n (direct ? matrix : viewMatrix).applyToContext(ctx);\n }\n\n if (clip) {\n param.clipItem.draw(ctx, param.extend({\n clip: true\n }));\n }\n\n if (strokeMatrix) {\n ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n var offset = param.offset;\n if (offset) ctx.translate(-offset.x, -offset.y);\n }\n\n this._draw(ctx, param, viewMatrix, strokeMatrix);\n\n ctx.restore();\n matrices.pop();\n\n if (param.clip && !param.dontFinish) {\n ctx.clip(this.getFillRule());\n }\n\n if (!direct) {\n BlendMode.process(blendMode, ctx, mainCtx, opacity, itemOffset.subtract(prevOffset).multiply(pixelRatio));\n CanvasProvider.release(ctx);\n param.offset = prevOffset;\n }\n },\n _isUpdated: function _isUpdated(updateVersion) {\n var parent = this._parent;\n if (parent instanceof CompoundPath) return parent._isUpdated(updateVersion);\n var updated = this._updateVersion === updateVersion;\n\n if (!updated && parent && parent._visible && parent._isUpdated(updateVersion)) {\n this._updateVersion = updateVersion;\n updated = true;\n }\n\n return updated;\n },\n _drawSelection: function _drawSelection(ctx, matrix, size, selectionItems, updateVersion) {\n var selection = this._selection,\n itemSelected = selection & 1,\n boundsSelected = selection & 2 || itemSelected && this._selectBounds,\n positionSelected = selection & 4;\n if (!this._drawSelected) itemSelected = false;\n\n if ((itemSelected || boundsSelected || positionSelected) && this._isUpdated(updateVersion)) {\n var layer,\n color = this.getSelectedColor(true) || (layer = this.getLayer()) && layer.getSelectedColor(true),\n mx = matrix.appended(this.getGlobalMatrix(true)),\n half = size / 2;\n ctx.strokeStyle = ctx.fillStyle = color ? color.toCanvasStyle(ctx) : '#009dec';\n if (itemSelected) this._drawSelected(ctx, mx, selectionItems);\n\n if (positionSelected) {\n var pos = this.getPosition(true),\n parent = this._parent,\n point = parent ? parent.localToGlobal(pos) : pos,\n x = point.x,\n y = point.y;\n ctx.beginPath();\n ctx.arc(x, y, half, 0, Math.PI * 2, true);\n ctx.stroke();\n var deltas = [[0, -1], [1, 0], [0, 1], [-1, 0]],\n start = half,\n end = size + 1;\n\n for (var i = 0; i < 4; i++) {\n var delta = deltas[i],\n dx = delta[0],\n dy = delta[1];\n ctx.moveTo(x + dx * start, y + dy * start);\n ctx.lineTo(x + dx * end, y + dy * end);\n ctx.stroke();\n }\n }\n\n if (boundsSelected) {\n var coords = mx._transformCorners(this.getInternalBounds());\n\n ctx.beginPath();\n\n for (var i = 0; i < 8; i++) {\n ctx[!i ? 'moveTo' : 'lineTo'](coords[i], coords[++i]);\n }\n\n ctx.closePath();\n ctx.stroke();\n\n for (var i = 0; i < 8; i++) {\n ctx.fillRect(coords[i] - half, coords[++i] - half, size, size);\n }\n }\n }\n },\n _canComposite: function _canComposite() {\n return false;\n }\n }, Base.each(['down', 'drag', 'up', 'move'], function (key) {\n this['removeOn' + Base.capitalize(key)] = function () {\n var hash = {};\n hash[key] = true;\n return this.removeOn(hash);\n };\n }, {\n removeOn: function removeOn(obj) {\n for (var name in obj) {\n if (obj[name]) {\n var key = 'mouse' + name,\n project = this._project,\n sets = project._removeSets = project._removeSets || {};\n sets[key] = sets[key] || {};\n sets[key][this._id] = this;\n }\n }\n\n return this;\n }\n }), {\n tween: function tween(from, to, options) {\n if (!options) {\n options = to;\n to = from;\n from = null;\n\n if (!options) {\n options = to;\n to = null;\n }\n }\n\n var easing = options && options.easing,\n start = options && options.start,\n duration = options != null && (typeof options === 'number' ? options : options.duration),\n tween = new Tween(this, from, to, duration, easing, start);\n\n function onFrame(event) {\n tween._handleFrame(event.time * 1000);\n\n if (!tween.running) {\n this.off('frame', onFrame);\n }\n }\n\n if (duration) {\n this.on('frame', onFrame);\n }\n\n return tween;\n },\n tweenTo: function tweenTo(to, options) {\n return this.tween(null, to, options);\n },\n tweenFrom: function tweenFrom(from, options) {\n return this.tween(from, null, options);\n }\n });\n var Group = Item.extend({\n _class: 'Group',\n _selectBounds: false,\n _selectChildren: true,\n _serializeFields: {\n children: []\n },\n initialize: function Group(arg) {\n this._children = [];\n this._namedChildren = {};\n if (!this._initialize(arg)) this.addChildren(Array.isArray(arg) ? arg : arguments);\n },\n _changed: function _changed(flags) {\n _changed.base.call(this, flags);\n\n if (flags & 2050) {\n this._clipItem = undefined;\n }\n },\n _getClipItem: function _getClipItem() {\n var clipItem = this._clipItem;\n\n if (clipItem === undefined) {\n clipItem = null;\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i]._clipMask) {\n clipItem = children[i];\n break;\n }\n }\n\n this._clipItem = clipItem;\n }\n\n return clipItem;\n },\n isClipped: function isClipped() {\n return !!this._getClipItem();\n },\n setClipped: function setClipped(clipped) {\n var child = this.getFirstChild();\n if (child) child.setClipMask(clipped);\n },\n _getBounds: function _getBounds(matrix, options) {\n var clipItem = this._getClipItem();\n\n return clipItem ? clipItem._getCachedBounds(clipItem._matrix.prepended(matrix), Base.set({}, options, {\n stroke: false\n })) : _getBounds.base.call(this, matrix, options);\n },\n _hitTestChildren: function _hitTestChildren(point, options, viewMatrix) {\n var clipItem = this._getClipItem();\n\n return (!clipItem || clipItem.contains(point)) && _hitTestChildren.base.call(this, point, options, viewMatrix, clipItem);\n },\n _draw: function _draw(ctx, param) {\n var clip = param.clip,\n clipItem = !clip && this._getClipItem();\n\n param = param.extend({\n clipItem: clipItem,\n clip: false\n });\n\n if (clip) {\n ctx.beginPath();\n param.dontStart = param.dontFinish = true;\n } else if (clipItem) {\n clipItem.draw(ctx, param.extend({\n clip: true\n }));\n }\n\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n var item = children[i];\n if (item !== clipItem) item.draw(ctx, param);\n }\n }\n });\n var Layer = Group.extend({\n _class: 'Layer',\n initialize: function Layer() {\n Group.apply(this, arguments);\n },\n _getOwner: function _getOwner() {\n return this._parent || this._index != null && this._project;\n },\n isInserted: function isInserted() {\n return this._parent ? isInserted.base.call(this) : this._index != null;\n },\n activate: function activate() {\n this._project._activeLayer = this;\n },\n _hitTestSelf: function _hitTestSelf() {}\n });\n var Shape = Item.extend({\n _class: 'Shape',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _canScaleStroke: true,\n _serializeFields: {\n type: null,\n size: null,\n radius: null\n },\n initialize: function Shape(props, point) {\n this._initialize(props, point);\n },\n _equals: function _equals(item) {\n return this._type === item._type && this._size.equals(item._size) && Base.equals(this._radius, item._radius);\n },\n copyContent: function copyContent(source) {\n this.setType(source._type);\n this.setSize(source._size);\n this.setRadius(source._radius);\n },\n getType: function getType() {\n return this._type;\n },\n setType: function setType(type) {\n this._type = type;\n },\n getShape: '#getType',\n setShape: '#setType',\n getSize: function getSize() {\n var size = this._size;\n return new LinkedSize(size.width, size.height, this, 'setSize');\n },\n setSize: function setSize() {\n var size = Size.read(arguments);\n\n if (!this._size) {\n this._size = size.clone();\n } else if (!this._size.equals(size)) {\n var type = this._type,\n width = size.width,\n height = size.height;\n\n if (type === 'rectangle') {\n this._radius.set(Size.min(this._radius, size.divide(2).abs()));\n } else if (type === 'circle') {\n width = height = (width + height) / 2;\n this._radius = width / 2;\n } else if (type === 'ellipse') {\n this._radius._set(width / 2, height / 2);\n }\n\n this._size._set(width, height);\n\n this._changed(9);\n }\n },\n getRadius: function getRadius() {\n var rad = this._radius;\n return this._type === 'circle' ? rad : new LinkedSize(rad.width, rad.height, this, 'setRadius');\n },\n setRadius: function setRadius(radius) {\n var type = this._type;\n\n if (type === 'circle') {\n if (radius === this._radius) return;\n var size = radius * 2;\n this._radius = radius;\n\n this._size._set(size, size);\n } else {\n radius = Size.read(arguments);\n\n if (!this._radius) {\n this._radius = radius.clone();\n } else {\n if (this._radius.equals(radius)) return;\n\n this._radius.set(radius);\n\n if (type === 'rectangle') {\n var size = Size.max(this._size, radius.multiply(2));\n\n this._size.set(size);\n } else if (type === 'ellipse') {\n this._size._set(radius.width * 2, radius.height * 2);\n }\n }\n }\n\n this._changed(9);\n },\n isEmpty: function isEmpty() {\n return false;\n },\n toPath: function toPath(insert) {\n var path = new Path[Base.capitalize(this._type)]({\n center: new Point(),\n size: this._size,\n radius: this._radius,\n insert: false\n });\n path.copyAttributes(this);\n if (paper.settings.applyMatrix) path.setApplyMatrix(true);\n if (insert === undefined || insert) path.insertAbove(this);\n return path;\n },\n toShape: '#clone',\n _asPathItem: function _asPathItem() {\n return this.toPath(false);\n },\n _draw: function _draw(ctx, param, viewMatrix, strokeMatrix) {\n var style = this._style,\n hasFill = style.hasFill(),\n hasStroke = style.hasStroke(),\n dontPaint = param.dontFinish || param.clip,\n untransformed = !strokeMatrix;\n\n if (hasFill || hasStroke || dontPaint) {\n var type = this._type,\n radius = this._radius,\n isCircle = type === 'circle';\n if (!param.dontStart) ctx.beginPath();\n\n if (untransformed && isCircle) {\n ctx.arc(0, 0, radius, 0, Math.PI * 2, true);\n } else {\n var rx = isCircle ? radius : radius.width,\n ry = isCircle ? radius : radius.height,\n size = this._size,\n width = size.width,\n height = size.height;\n\n if (untransformed && type === 'rectangle' && rx === 0 && ry === 0) {\n ctx.rect(-width / 2, -height / 2, width, height);\n } else {\n var x = width / 2,\n y = height / 2,\n kappa = 1 - 0.5522847498307936,\n cx = rx * kappa,\n cy = ry * kappa,\n c = [-x, -y + ry, -x, -y + cy, -x + cx, -y, -x + rx, -y, x - rx, -y, x - cx, -y, x, -y + cy, x, -y + ry, x, y - ry, x, y - cy, x - cx, y, x - rx, y, -x + rx, y, -x + cx, y, -x, y - cy, -x, y - ry];\n if (strokeMatrix) strokeMatrix.transform(c, c, 32);\n ctx.moveTo(c[0], c[1]);\n ctx.bezierCurveTo(c[2], c[3], c[4], c[5], c[6], c[7]);\n if (x !== rx) ctx.lineTo(c[8], c[9]);\n ctx.bezierCurveTo(c[10], c[11], c[12], c[13], c[14], c[15]);\n if (y !== ry) ctx.lineTo(c[16], c[17]);\n ctx.bezierCurveTo(c[18], c[19], c[20], c[21], c[22], c[23]);\n if (x !== rx) ctx.lineTo(c[24], c[25]);\n ctx.bezierCurveTo(c[26], c[27], c[28], c[29], c[30], c[31]);\n }\n }\n\n ctx.closePath();\n }\n\n if (!dontPaint && (hasFill || hasStroke)) {\n this._setStyles(ctx, param, viewMatrix);\n\n if (hasFill) {\n ctx.fill(style.getFillRule());\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (hasStroke) ctx.stroke();\n }\n },\n _canComposite: function _canComposite() {\n return !(this.hasFill() && this.hasStroke());\n },\n _getBounds: function _getBounds(matrix, options) {\n var rect = new _Rectangle(this._size).setCenter(0, 0),\n style = this._style,\n strokeWidth = options.stroke && style.hasStroke() && style.getStrokeWidth();\n if (matrix) rect = matrix._transformBounds(rect);\n return strokeWidth ? rect.expand(Path._getStrokePadding(strokeWidth, this._getStrokeMatrix(matrix, options))) : rect;\n }\n }, new function () {\n function getCornerCenter(that, point, expand) {\n var radius = that._radius;\n\n if (!radius.isZero()) {\n var halfSize = that._size.divide(2);\n\n for (var q = 1; q <= 4; q++) {\n var dir = new Point(q > 1 && q < 4 ? -1 : 1, q > 2 ? -1 : 1),\n corner = dir.multiply(halfSize),\n center = corner.subtract(dir.multiply(radius)),\n rect = new _Rectangle(expand ? corner.add(dir.multiply(expand)) : corner, center);\n if (rect.contains(point)) return {\n point: center,\n quadrant: q\n };\n }\n }\n }\n\n function isOnEllipseStroke(point, radius, padding, quadrant) {\n var vector = point.divide(radius);\n return (!quadrant || vector.isInQuadrant(quadrant)) && vector.subtract(vector.normalize()).multiply(radius).divide(padding).length <= 1;\n }\n\n return {\n _contains: function _contains(point) {\n if (this._type === 'rectangle') {\n var center = getCornerCenter(this, point);\n return center ? point.subtract(center.point).divide(this._radius).getLength() <= 1 : _contains.base.call(this, point);\n } else {\n return point.divide(this.size).getLength() <= 0.5;\n }\n },\n _hitTestSelf: function _hitTestSelf(point, options, viewMatrix, strokeMatrix) {\n var hit = false,\n style = this._style,\n hitStroke = options.stroke && style.hasStroke(),\n hitFill = options.fill && style.hasFill();\n\n if (hitStroke || hitFill) {\n var type = this._type,\n radius = this._radius,\n strokeRadius = hitStroke ? style.getStrokeWidth() / 2 : 0,\n strokePadding = options._tolerancePadding.add(Path._getStrokePadding(strokeRadius, !style.getStrokeScaling() && strokeMatrix));\n\n if (type === 'rectangle') {\n var padding = strokePadding.multiply(2),\n center = getCornerCenter(this, point, padding);\n\n if (center) {\n hit = isOnEllipseStroke(point.subtract(center.point), radius, strokePadding, center.quadrant);\n } else {\n var rect = new _Rectangle(this._size).setCenter(0, 0),\n outer = rect.expand(padding),\n inner = rect.expand(padding.negate());\n hit = outer._containsPoint(point) && !inner._containsPoint(point);\n }\n } else {\n hit = isOnEllipseStroke(point, radius, strokePadding);\n }\n }\n\n return hit ? new HitResult(hitStroke ? 'stroke' : 'fill', this) : _hitTestSelf.base.apply(this, arguments);\n }\n };\n }(), {\n statics: new function () {\n function createShape(type, point, size, radius, args) {\n var item = Base.create(Shape.prototype);\n item._type = type;\n item._size = size;\n item._radius = radius;\n\n item._initialize(Base.getNamed(args), point);\n\n return item;\n }\n\n return {\n Circle: function Circle() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n radius = Base.readNamed(args, 'radius');\n return createShape('circle', center, new Size(radius * 2), radius, args);\n },\n Rectangle: function Rectangle() {\n var args = arguments,\n rect = _Rectangle.readNamed(args, 'rectangle'),\n radius = Size.min(Size.readNamed(args, 'radius'), rect.getSize(true).divide(2));\n\n return createShape('rectangle', rect.getCenter(true), rect.getSize(true), radius, args);\n },\n Ellipse: function Ellipse() {\n var args = arguments,\n ellipse = Shape._readEllipse(args),\n radius = ellipse.radius;\n\n return createShape('ellipse', ellipse.center, radius.multiply(2), radius, args);\n },\n _readEllipse: function _readEllipse(args) {\n var center, radius;\n\n if (Base.hasNamed(args, 'radius')) {\n center = Point.readNamed(args, 'center');\n radius = Size.readNamed(args, 'radius');\n } else {\n var rect = _Rectangle.readNamed(args, 'rectangle');\n\n center = rect.getCenter(true);\n radius = rect.getSize(true).divide(2);\n }\n\n return {\n center: center,\n radius: radius\n };\n }\n };\n }()\n });\n var Raster = Item.extend({\n _class: 'Raster',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _boundsOptions: {\n stroke: false,\n handle: false\n },\n _serializeFields: {\n crossOrigin: null,\n source: null\n },\n _prioritize: ['crossOrigin'],\n _smoothing: 'low',\n beans: true,\n initialize: function Raster(source, position) {\n if (!this._initialize(source, position !== undefined && Point.read(arguments))) {\n var image,\n type = typeof source,\n object = type === 'string' ? document.getElementById(source) : type === 'object' ? source : null;\n\n if (object && object !== Item.NO_INSERT) {\n if (object.getContext || object.naturalHeight != null) {\n image = object;\n } else if (object) {\n var size = Size.read(arguments);\n\n if (!size.isZero()) {\n image = CanvasProvider.getCanvas(size);\n }\n }\n }\n\n if (image) {\n this.setImage(image);\n } else {\n this.setSource(source);\n }\n }\n\n if (!this._size) {\n this._size = new Size();\n this._loaded = false;\n }\n },\n _equals: function _equals(item) {\n return this.getSource() === item.getSource();\n },\n copyContent: function copyContent(source) {\n var image = source._image,\n canvas = source._canvas;\n\n if (image) {\n this._setImage(image);\n } else if (canvas) {\n var copyCanvas = CanvasProvider.getCanvas(source._size);\n copyCanvas.getContext('2d').drawImage(canvas, 0, 0);\n\n this._setImage(copyCanvas);\n }\n\n this._crossOrigin = source._crossOrigin;\n },\n getSize: function getSize() {\n var size = this._size;\n return new LinkedSize(size ? size.width : 0, size ? size.height : 0, this, 'setSize');\n },\n setSize: function setSize(_size, _clear) {\n var size = Size.read(arguments);\n\n if (!size.equals(this._size)) {\n if (size.width > 0 && size.height > 0) {\n var element = !_clear && this.getElement();\n\n this._setImage(CanvasProvider.getCanvas(size));\n\n if (element) {\n this.getContext(true).drawImage(element, 0, 0, size.width, size.height);\n }\n } else {\n if (this._canvas) CanvasProvider.release(this._canvas);\n this._size = size.clone();\n }\n } else if (_clear) {\n this.clear();\n }\n },\n getWidth: function getWidth() {\n return this._size ? this._size.width : 0;\n },\n setWidth: function setWidth(width) {\n this.setSize(width, this.getHeight());\n },\n getHeight: function getHeight() {\n return this._size ? this._size.height : 0;\n },\n setHeight: function setHeight(height) {\n this.setSize(this.getWidth(), height);\n },\n getLoaded: function getLoaded() {\n return this._loaded;\n },\n isEmpty: function isEmpty() {\n var size = this._size;\n return !size || size.width === 0 && size.height === 0;\n },\n getResolution: function getResolution() {\n var matrix = this._matrix,\n orig = new Point(0, 0).transform(matrix),\n u = new Point(1, 0).transform(matrix).subtract(orig),\n v = new Point(0, 1).transform(matrix).subtract(orig);\n return new Size(72 / u.getLength(), 72 / v.getLength());\n },\n getPpi: '#getResolution',\n getImage: function getImage() {\n return this._image;\n },\n setImage: function setImage(image) {\n var that = this;\n\n function emit(event) {\n var view = that.getView(),\n type = event && event.type || 'load';\n\n if (view && that.responds(type)) {\n paper = view._scope;\n that.emit(type, new Event(event));\n }\n }\n\n this._setImage(image);\n\n if (this._loaded) {\n setTimeout(emit, 0);\n } else if (image) {\n DomEvent.add(image, {\n load: function load(event) {\n that._setImage(image);\n\n emit(event);\n },\n error: emit\n });\n }\n },\n _setImage: function _setImage(image) {\n if (this._canvas) CanvasProvider.release(this._canvas);\n\n if (image && image.getContext) {\n this._image = null;\n this._canvas = image;\n this._loaded = true;\n } else {\n this._image = image;\n this._canvas = null;\n this._loaded = !!(image && image.src && image.complete);\n }\n\n this._size = new Size(image ? image.naturalWidth || image.width : 0, image ? image.naturalHeight || image.height : 0);\n this._context = null;\n\n this._changed(1033);\n },\n getCanvas: function getCanvas() {\n if (!this._canvas) {\n var ctx = CanvasProvider.getContext(this._size);\n\n try {\n if (this._image) ctx.drawImage(this._image, 0, 0);\n this._canvas = ctx.canvas;\n } catch (e) {\n CanvasProvider.release(ctx);\n }\n }\n\n return this._canvas;\n },\n setCanvas: '#setImage',\n getContext: function getContext(_change) {\n if (!this._context) this._context = this.getCanvas().getContext('2d');\n\n if (_change) {\n this._image = null;\n\n this._changed(1025);\n }\n\n return this._context;\n },\n setContext: function setContext(context) {\n this._context = context;\n },\n getSource: function getSource() {\n var image = this._image;\n return image && image.src || this.toDataURL();\n },\n setSource: function setSource(src) {\n var image = new self.Image(),\n crossOrigin = this._crossOrigin;\n if (crossOrigin) image.crossOrigin = crossOrigin;\n if (src) image.src = src;\n this.setImage(image);\n },\n getCrossOrigin: function getCrossOrigin() {\n var image = this._image;\n return image && image.crossOrigin || this._crossOrigin || '';\n },\n setCrossOrigin: function setCrossOrigin(crossOrigin) {\n this._crossOrigin = crossOrigin;\n var image = this._image;\n if (image) image.crossOrigin = crossOrigin;\n },\n getSmoothing: function getSmoothing() {\n return this._smoothing;\n },\n setSmoothing: function setSmoothing(smoothing) {\n this._smoothing = typeof smoothing === 'string' ? smoothing : smoothing ? 'low' : 'off';\n\n this._changed(257);\n },\n getElement: function getElement() {\n return this._canvas || this._loaded && this._image;\n }\n }, {\n beans: false,\n getSubCanvas: function getSubCanvas() {\n var rect = _Rectangle.read(arguments),\n ctx = CanvasProvider.getContext(rect.getSize());\n\n ctx.drawImage(this.getCanvas(), rect.x, rect.y, rect.width, rect.height, 0, 0, rect.width, rect.height);\n return ctx.canvas;\n },\n getSubRaster: function getSubRaster() {\n var rect = _Rectangle.read(arguments),\n raster = new Raster(Item.NO_INSERT);\n\n raster._setImage(this.getSubCanvas(rect));\n\n raster.translate(rect.getCenter().subtract(this.getSize().divide(2)));\n\n raster._matrix.prepend(this._matrix);\n\n raster.insertAbove(this);\n return raster;\n },\n toDataURL: function toDataURL() {\n var image = this._image,\n src = image && image.src;\n if (/^data:/.test(src)) return src;\n var canvas = this.getCanvas();\n return canvas ? canvas.toDataURL.apply(canvas, arguments) : null;\n },\n drawImage: function drawImage(image) {\n var point = Point.read(arguments, 1);\n this.getContext(true).drawImage(image, point.x, point.y);\n },\n getAverageColor: function getAverageColor(object) {\n var bounds, path;\n\n if (!object) {\n bounds = this.getBounds();\n } else if (object instanceof PathItem) {\n path = object;\n bounds = object.getBounds();\n } else if (typeof object === 'object') {\n if ('width' in object) {\n bounds = new _Rectangle(object);\n } else if ('x' in object) {\n bounds = new _Rectangle(object.x - 0.5, object.y - 0.5, 1, 1);\n }\n }\n\n if (!bounds) return null;\n var sampleSize = 32,\n width = Math.min(bounds.width, sampleSize),\n height = Math.min(bounds.height, sampleSize);\n var ctx = Raster._sampleContext;\n\n if (!ctx) {\n ctx = Raster._sampleContext = CanvasProvider.getContext(new Size(sampleSize));\n } else {\n ctx.clearRect(0, 0, sampleSize + 1, sampleSize + 1);\n }\n\n ctx.save();\n var matrix = new Matrix().scale(width / bounds.width, height / bounds.height).translate(-bounds.x, -bounds.y);\n matrix.applyToContext(ctx);\n if (path) path.draw(ctx, new Base({\n clip: true,\n matrices: [matrix]\n }));\n\n this._matrix.applyToContext(ctx);\n\n var element = this.getElement(),\n size = this._size;\n if (element) ctx.drawImage(element, -size.width / 2, -size.height / 2);\n ctx.restore();\n var pixels = ctx.getImageData(0.5, 0.5, Math.ceil(width), Math.ceil(height)).data,\n channels = [0, 0, 0],\n total = 0;\n\n for (var i = 0, l = pixels.length; i < l; i += 4) {\n var alpha = pixels[i + 3];\n total += alpha;\n alpha /= 255;\n channels[0] += pixels[i] * alpha;\n channels[1] += pixels[i + 1] * alpha;\n channels[2] += pixels[i + 2] * alpha;\n }\n\n for (var i = 0; i < 3; i++) {\n channels[i] /= total;\n }\n\n return total ? Color.read(channels) : null;\n },\n getPixel: function getPixel() {\n var point = Point.read(arguments);\n var data = this.getContext().getImageData(point.x, point.y, 1, 1).data;\n return new Color('rgb', [data[0] / 255, data[1] / 255, data[2] / 255], data[3] / 255);\n },\n setPixel: function setPixel() {\n var args = arguments,\n point = Point.read(args),\n color = Color.read(args),\n components = color._convert('rgb'),\n alpha = color._alpha,\n ctx = this.getContext(true),\n imageData = ctx.createImageData(1, 1),\n data = imageData.data;\n\n data[0] = components[0] * 255;\n data[1] = components[1] * 255;\n data[2] = components[2] * 255;\n data[3] = alpha != null ? alpha * 255 : 255;\n ctx.putImageData(imageData, point.x, point.y);\n },\n clear: function clear() {\n var size = this._size;\n this.getContext(true).clearRect(0, 0, size.width + 1, size.height + 1);\n },\n createImageData: function createImageData() {\n var size = Size.read(arguments);\n return this.getContext().createImageData(size.width, size.height);\n },\n getImageData: function getImageData() {\n var rect = _Rectangle.read(arguments);\n\n if (rect.isEmpty()) rect = new _Rectangle(this._size);\n return this.getContext().getImageData(rect.x, rect.y, rect.width, rect.height);\n },\n setImageData: function setImageData(data) {\n var point = Point.read(arguments, 1);\n this.getContext(true).putImageData(data, point.x, point.y);\n },\n _getBounds: function _getBounds(matrix, options) {\n var rect = new _Rectangle(this._size).setCenter(0, 0);\n return matrix ? matrix._transformBounds(rect) : rect;\n },\n _hitTestSelf: function _hitTestSelf(point) {\n if (this._contains(point)) {\n var that = this;\n return new HitResult('pixel', that, {\n offset: point.add(that._size.divide(2)).round(),\n color: {\n get: function get() {\n return that.getPixel(this.offset);\n }\n }\n });\n }\n },\n _draw: function _draw(ctx, param, viewMatrix) {\n var element = this.getElement();\n\n if (element && element.width > 0 && element.height > 0) {\n ctx.globalAlpha = Numerical.clamp(this._opacity, 0, 1);\n\n this._setStyles(ctx, param, viewMatrix);\n\n var smoothing = this._smoothing,\n disabled = smoothing === 'off';\n DomElement.setPrefixed(ctx, disabled ? 'imageSmoothingEnabled' : 'imageSmoothingQuality', disabled ? false : smoothing);\n ctx.drawImage(element, -this._size.width / 2, -this._size.height / 2);\n }\n },\n _canComposite: function _canComposite() {\n return true;\n }\n });\n var SymbolItem = Item.extend({\n _class: 'SymbolItem',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _boundsOptions: {\n stroke: true\n },\n _serializeFields: {\n symbol: null\n },\n initialize: function SymbolItem(arg0, arg1) {\n if (!this._initialize(arg0, arg1 !== undefined && Point.read(arguments, 1))) this.setDefinition(arg0 instanceof SymbolDefinition ? arg0 : new SymbolDefinition(arg0));\n },\n _equals: function _equals(item) {\n return this._definition === item._definition;\n },\n copyContent: function copyContent(source) {\n this.setDefinition(source._definition);\n },\n getDefinition: function getDefinition() {\n return this._definition;\n },\n setDefinition: function setDefinition(definition) {\n this._definition = definition;\n\n this._changed(9);\n },\n getSymbol: '#getDefinition',\n setSymbol: '#setDefinition',\n isEmpty: function isEmpty() {\n return this._definition._item.isEmpty();\n },\n _getBounds: function _getBounds(matrix, options) {\n var item = this._definition._item;\n return item._getCachedBounds(item._matrix.prepended(matrix), options);\n },\n _hitTestSelf: function _hitTestSelf(point, options, viewMatrix) {\n var opts = options.extend({\n all: false\n });\n\n var res = this._definition._item._hitTest(point, opts, viewMatrix);\n\n if (res) res.item = this;\n return res;\n },\n _draw: function _draw(ctx, param) {\n this._definition._item.draw(ctx, param);\n }\n });\n var SymbolDefinition = Base.extend({\n _class: 'SymbolDefinition',\n initialize: function SymbolDefinition(item, dontCenter) {\n this._id = UID.get();\n this.project = paper.project;\n if (item) this.setItem(item, dontCenter);\n },\n _serialize: function _serialize(options, dictionary) {\n return dictionary.add(this, function () {\n return Base.serialize([this._class, this._item], options, false, dictionary);\n });\n },\n _changed: function _changed(flags) {\n if (flags & 8) Item._clearBoundsCache(this);\n if (flags & 1) this.project._changed(flags);\n },\n getItem: function getItem() {\n return this._item;\n },\n setItem: function setItem(item, _dontCenter) {\n if (item._symbol) item = item.clone();\n if (this._item) this._item._symbol = null;\n this._item = item;\n item.remove();\n item.setSelected(false);\n if (!_dontCenter) item.setPosition(new Point());\n item._symbol = this;\n\n this._changed(9);\n },\n getDefinition: '#getItem',\n setDefinition: '#setItem',\n place: function place(position) {\n return new SymbolItem(this, position);\n },\n clone: function clone() {\n return new SymbolDefinition(this._item.clone(false));\n },\n equals: function equals(symbol) {\n return symbol === this || symbol && this._item.equals(symbol._item) || false;\n }\n });\n var HitResult = Base.extend({\n _class: 'HitResult',\n initialize: function HitResult(type, item, values) {\n this.type = type;\n this.item = item;\n if (values) this.inject(values);\n },\n statics: {\n getOptions: function getOptions(args) {\n var options = args && Base.read(args);\n return new Base({\n type: null,\n tolerance: paper.settings.hitTolerance,\n fill: !options,\n stroke: !options,\n segments: !options,\n handles: false,\n ends: false,\n position: false,\n center: false,\n bounds: false,\n guides: false,\n selected: false\n }, options);\n }\n }\n });\n var Segment = Base.extend({\n _class: 'Segment',\n beans: true,\n _selection: 0,\n initialize: function Segment(arg0, arg1, arg2, arg3, arg4, arg5) {\n var count = arguments.length,\n point,\n handleIn,\n handleOut,\n selection;\n\n if (count > 0) {\n if (arg0 == null || typeof arg0 === 'object') {\n if (count === 1 && arg0 && 'point' in arg0) {\n point = arg0.point;\n handleIn = arg0.handleIn;\n handleOut = arg0.handleOut;\n selection = arg0.selection;\n } else {\n point = arg0;\n handleIn = arg1;\n handleOut = arg2;\n selection = arg3;\n }\n } else {\n point = [arg0, arg1];\n handleIn = arg2 !== undefined ? [arg2, arg3] : null;\n handleOut = arg4 !== undefined ? [arg4, arg5] : null;\n }\n }\n\n new SegmentPoint(point, this, '_point');\n new SegmentPoint(handleIn, this, '_handleIn');\n new SegmentPoint(handleOut, this, '_handleOut');\n if (selection) this.setSelection(selection);\n },\n _serialize: function _serialize(options, dictionary) {\n var point = this._point,\n selection = this._selection,\n obj = selection || this.hasHandles() ? [point, this._handleIn, this._handleOut] : point;\n if (selection) obj.push(selection);\n return Base.serialize(obj, options, true, dictionary);\n },\n _changed: function _changed(point) {\n var path = this._path;\n if (!path) return;\n var curves = path._curves,\n index = this._index,\n curve;\n\n if (curves) {\n if ((!point || point === this._point || point === this._handleIn) && (curve = index > 0 ? curves[index - 1] : path._closed ? curves[curves.length - 1] : null)) curve._changed();\n if ((!point || point === this._point || point === this._handleOut) && (curve = curves[index])) curve._changed();\n }\n\n path._changed(41);\n },\n getPoint: function getPoint() {\n return this._point;\n },\n setPoint: function setPoint() {\n this._point.set(Point.read(arguments));\n },\n getHandleIn: function getHandleIn() {\n return this._handleIn;\n },\n setHandleIn: function setHandleIn() {\n this._handleIn.set(Point.read(arguments));\n },\n getHandleOut: function getHandleOut() {\n return this._handleOut;\n },\n setHandleOut: function setHandleOut() {\n this._handleOut.set(Point.read(arguments));\n },\n hasHandles: function hasHandles() {\n return !this._handleIn.isZero() || !this._handleOut.isZero();\n },\n isSmooth: function isSmooth() {\n var handleIn = this._handleIn,\n handleOut = this._handleOut;\n return !handleIn.isZero() && !handleOut.isZero() && handleIn.isCollinear(handleOut);\n },\n clearHandles: function clearHandles() {\n this._handleIn._set(0, 0);\n\n this._handleOut._set(0, 0);\n },\n getSelection: function getSelection() {\n return this._selection;\n },\n setSelection: function setSelection(selection) {\n var oldSelection = this._selection,\n path = this._path;\n this._selection = selection = selection || 0;\n\n if (path && selection !== oldSelection) {\n path._updateSelection(this, oldSelection, selection);\n\n path._changed(257);\n }\n },\n _changeSelection: function _changeSelection(flag, selected) {\n var selection = this._selection;\n this.setSelection(selected ? selection | flag : selection & ~flag);\n },\n isSelected: function isSelected() {\n return !!(this._selection & 7);\n },\n setSelected: function setSelected(selected) {\n this._changeSelection(7, selected);\n },\n getIndex: function getIndex() {\n return this._index !== undefined ? this._index : null;\n },\n getPath: function getPath() {\n return this._path || null;\n },\n getCurve: function getCurve() {\n var path = this._path,\n index = this._index;\n\n if (path) {\n if (index > 0 && !path._closed && index === path._segments.length - 1) index--;\n return path.getCurves()[index] || null;\n }\n\n return null;\n },\n getLocation: function getLocation() {\n var curve = this.getCurve();\n return curve ? new CurveLocation(curve, this === curve._segment1 ? 0 : 1) : null;\n },\n getNext: function getNext() {\n var segments = this._path && this._path._segments;\n return segments && (segments[this._index + 1] || this._path._closed && segments[0]) || null;\n },\n smooth: function smooth(options, _first, _last) {\n var opts = options || {},\n type = opts.type,\n factor = opts.factor,\n prev = this.getPrevious(),\n next = this.getNext(),\n p0 = (prev || this)._point,\n p1 = this._point,\n p2 = (next || this)._point,\n d1 = p0.getDistance(p1),\n d2 = p1.getDistance(p2);\n\n if (!type || type === 'catmull-rom') {\n var a = factor === undefined ? 0.5 : factor,\n d1_a = Math.pow(d1, a),\n d1_2a = d1_a * d1_a,\n d2_a = Math.pow(d2, a),\n d2_2a = d2_a * d2_a;\n\n if (!_first && prev) {\n var A = 2 * d2_2a + 3 * d2_a * d1_a + d1_2a,\n N = 3 * d2_a * (d2_a + d1_a);\n this.setHandleIn(N !== 0 ? new Point((d2_2a * p0._x + A * p1._x - d1_2a * p2._x) / N - p1._x, (d2_2a * p0._y + A * p1._y - d1_2a * p2._y) / N - p1._y) : new Point());\n }\n\n if (!_last && next) {\n var A = 2 * d1_2a + 3 * d1_a * d2_a + d2_2a,\n N = 3 * d1_a * (d1_a + d2_a);\n this.setHandleOut(N !== 0 ? new Point((d1_2a * p2._x + A * p1._x - d2_2a * p0._x) / N - p1._x, (d1_2a * p2._y + A * p1._y - d2_2a * p0._y) / N - p1._y) : new Point());\n }\n } else if (type === 'geometric') {\n if (prev && next) {\n var vector = p0.subtract(p2),\n t = factor === undefined ? 0.4 : factor,\n k = t * d1 / (d1 + d2);\n if (!_first) this.setHandleIn(vector.multiply(k));\n if (!_last) this.setHandleOut(vector.multiply(k - t));\n }\n } else {\n throw new Error('Smoothing method \\'' + type + '\\' not supported.');\n }\n },\n getPrevious: function getPrevious() {\n var segments = this._path && this._path._segments;\n return segments && (segments[this._index - 1] || this._path._closed && segments[segments.length - 1]) || null;\n },\n isFirst: function isFirst() {\n return !this._index;\n },\n isLast: function isLast() {\n var path = this._path;\n return path && this._index === path._segments.length - 1 || false;\n },\n reverse: function reverse() {\n var handleIn = this._handleIn,\n handleOut = this._handleOut,\n tmp = handleIn.clone();\n handleIn.set(handleOut);\n handleOut.set(tmp);\n },\n reversed: function reversed() {\n return new Segment(this._point, this._handleOut, this._handleIn);\n },\n remove: function remove() {\n return this._path ? !!this._path.removeSegment(this._index) : false;\n },\n clone: function clone() {\n return new Segment(this._point, this._handleIn, this._handleOut);\n },\n equals: function equals(segment) {\n return segment === this || segment && this._class === segment._class && this._point.equals(segment._point) && this._handleIn.equals(segment._handleIn) && this._handleOut.equals(segment._handleOut) || false;\n },\n toString: function toString() {\n var parts = ['point: ' + this._point];\n if (!this._handleIn.isZero()) parts.push('handleIn: ' + this._handleIn);\n if (!this._handleOut.isZero()) parts.push('handleOut: ' + this._handleOut);\n return '{ ' + parts.join(', ') + ' }';\n },\n transform: function transform(matrix) {\n this._transformCoordinates(matrix, new Array(6), true);\n\n this._changed();\n },\n interpolate: function interpolate(from, to, factor) {\n var u = 1 - factor,\n v = factor,\n point1 = from._point,\n point2 = to._point,\n handleIn1 = from._handleIn,\n handleIn2 = to._handleIn,\n handleOut2 = to._handleOut,\n handleOut1 = from._handleOut;\n\n this._point._set(u * point1._x + v * point2._x, u * point1._y + v * point2._y, true);\n\n this._handleIn._set(u * handleIn1._x + v * handleIn2._x, u * handleIn1._y + v * handleIn2._y, true);\n\n this._handleOut._set(u * handleOut1._x + v * handleOut2._x, u * handleOut1._y + v * handleOut2._y, true);\n\n this._changed();\n },\n _transformCoordinates: function _transformCoordinates(matrix, coords, change) {\n var point = this._point,\n handleIn = !change || !this._handleIn.isZero() ? this._handleIn : null,\n handleOut = !change || !this._handleOut.isZero() ? this._handleOut : null,\n x = point._x,\n y = point._y,\n i = 2;\n coords[0] = x;\n coords[1] = y;\n\n if (handleIn) {\n coords[i++] = handleIn._x + x;\n coords[i++] = handleIn._y + y;\n }\n\n if (handleOut) {\n coords[i++] = handleOut._x + x;\n coords[i++] = handleOut._y + y;\n }\n\n if (matrix) {\n matrix._transformCoordinates(coords, coords, i / 2);\n\n x = coords[0];\n y = coords[1];\n\n if (change) {\n point._x = x;\n point._y = y;\n i = 2;\n\n if (handleIn) {\n handleIn._x = coords[i++] - x;\n handleIn._y = coords[i++] - y;\n }\n\n if (handleOut) {\n handleOut._x = coords[i++] - x;\n handleOut._y = coords[i++] - y;\n }\n } else {\n if (!handleIn) {\n coords[i++] = x;\n coords[i++] = y;\n }\n\n if (!handleOut) {\n coords[i++] = x;\n coords[i++] = y;\n }\n }\n }\n\n return coords;\n }\n });\n var SegmentPoint = Point.extend({\n initialize: function SegmentPoint(point, owner, key) {\n var x, y, selected;\n\n if (!point) {\n x = y = 0;\n } else if ((x = point[0]) !== undefined) {\n y = point[1];\n } else {\n var pt = point;\n\n if ((x = pt.x) === undefined) {\n pt = Point.read(arguments);\n x = pt.x;\n }\n\n y = pt.y;\n selected = pt.selected;\n }\n\n this._x = x;\n this._y = y;\n this._owner = owner;\n owner[key] = this;\n if (selected) this.setSelected(true);\n },\n _set: function _set(x, y) {\n this._x = x;\n this._y = y;\n\n this._owner._changed(this);\n\n return this;\n },\n getX: function getX() {\n return this._x;\n },\n setX: function setX(x) {\n this._x = x;\n\n this._owner._changed(this);\n },\n getY: function getY() {\n return this._y;\n },\n setY: function setY(y) {\n this._y = y;\n\n this._owner._changed(this);\n },\n isZero: function isZero() {\n var isZero = Numerical.isZero;\n return isZero(this._x) && isZero(this._y);\n },\n isSelected: function isSelected() {\n return !!(this._owner._selection & this._getSelection());\n },\n setSelected: function setSelected(selected) {\n this._owner._changeSelection(this._getSelection(), selected);\n },\n _getSelection: function _getSelection() {\n var owner = this._owner;\n return this === owner._point ? 1 : this === owner._handleIn ? 2 : this === owner._handleOut ? 4 : 0;\n }\n });\n var Curve = Base.extend({\n _class: 'Curve',\n beans: true,\n initialize: function Curve(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) {\n var count = arguments.length,\n seg1,\n seg2,\n point1,\n point2,\n handle1,\n handle2;\n\n if (count === 3) {\n this._path = arg0;\n seg1 = arg1;\n seg2 = arg2;\n } else if (!count) {\n seg1 = new Segment();\n seg2 = new Segment();\n } else if (count === 1) {\n if ('segment1' in arg0) {\n seg1 = new Segment(arg0.segment1);\n seg2 = new Segment(arg0.segment2);\n } else if ('point1' in arg0) {\n point1 = arg0.point1;\n handle1 = arg0.handle1;\n handle2 = arg0.handle2;\n point2 = arg0.point2;\n } else if (Array.isArray(arg0)) {\n point1 = [arg0[0], arg0[1]];\n point2 = [arg0[6], arg0[7]];\n handle1 = [arg0[2] - arg0[0], arg0[3] - arg0[1]];\n handle2 = [arg0[4] - arg0[6], arg0[5] - arg0[7]];\n }\n } else if (count === 2) {\n seg1 = new Segment(arg0);\n seg2 = new Segment(arg1);\n } else if (count === 4) {\n point1 = arg0;\n handle1 = arg1;\n handle2 = arg2;\n point2 = arg3;\n } else if (count === 8) {\n point1 = [arg0, arg1];\n point2 = [arg6, arg7];\n handle1 = [arg2 - arg0, arg3 - arg1];\n handle2 = [arg4 - arg6, arg5 - arg7];\n }\n\n this._segment1 = seg1 || new Segment(point1, null, handle1);\n this._segment2 = seg2 || new Segment(point2, handle2, null);\n },\n _serialize: function _serialize(options, dictionary) {\n return Base.serialize(this.hasHandles() ? [this.getPoint1(), this.getHandle1(), this.getHandle2(), this.getPoint2()] : [this.getPoint1(), this.getPoint2()], options, true, dictionary);\n },\n _changed: function _changed() {\n this._length = this._bounds = undefined;\n },\n clone: function clone() {\n return new Curve(this._segment1, this._segment2);\n },\n toString: function toString() {\n var parts = ['point1: ' + this._segment1._point];\n if (!this._segment1._handleOut.isZero()) parts.push('handle1: ' + this._segment1._handleOut);\n if (!this._segment2._handleIn.isZero()) parts.push('handle2: ' + this._segment2._handleIn);\n parts.push('point2: ' + this._segment2._point);\n return '{ ' + parts.join(', ') + ' }';\n },\n classify: function classify() {\n return Curve.classify(this.getValues());\n },\n remove: function remove() {\n var removed = false;\n\n if (this._path) {\n var segment2 = this._segment2,\n handleOut = segment2._handleOut;\n removed = segment2.remove();\n if (removed) this._segment1._handleOut.set(handleOut);\n }\n\n return removed;\n },\n getPoint1: function getPoint1() {\n return this._segment1._point;\n },\n setPoint1: function setPoint1() {\n this._segment1._point.set(Point.read(arguments));\n },\n getPoint2: function getPoint2() {\n return this._segment2._point;\n },\n setPoint2: function setPoint2() {\n this._segment2._point.set(Point.read(arguments));\n },\n getHandle1: function getHandle1() {\n return this._segment1._handleOut;\n },\n setHandle1: function setHandle1() {\n this._segment1._handleOut.set(Point.read(arguments));\n },\n getHandle2: function getHandle2() {\n return this._segment2._handleIn;\n },\n setHandle2: function setHandle2() {\n this._segment2._handleIn.set(Point.read(arguments));\n },\n getSegment1: function getSegment1() {\n return this._segment1;\n },\n getSegment2: function getSegment2() {\n return this._segment2;\n },\n getPath: function getPath() {\n return this._path;\n },\n getIndex: function getIndex() {\n return this._segment1._index;\n },\n getNext: function getNext() {\n var curves = this._path && this._path._curves;\n return curves && (curves[this._segment1._index + 1] || this._path._closed && curves[0]) || null;\n },\n getPrevious: function getPrevious() {\n var curves = this._path && this._path._curves;\n return curves && (curves[this._segment1._index - 1] || this._path._closed && curves[curves.length - 1]) || null;\n },\n isFirst: function isFirst() {\n return !this._segment1._index;\n },\n isLast: function isLast() {\n var path = this._path;\n return path && this._segment1._index === path._curves.length - 1 || false;\n },\n isSelected: function isSelected() {\n return this.getPoint1().isSelected() && this.getHandle1().isSelected() && this.getHandle2().isSelected() && this.getPoint2().isSelected();\n },\n setSelected: function setSelected(selected) {\n this.getPoint1().setSelected(selected);\n this.getHandle1().setSelected(selected);\n this.getHandle2().setSelected(selected);\n this.getPoint2().setSelected(selected);\n },\n getValues: function getValues(matrix) {\n return Curve.getValues(this._segment1, this._segment2, matrix);\n },\n getPoints: function getPoints() {\n var coords = this.getValues(),\n points = [];\n\n for (var i = 0; i < 8; i += 2) {\n points.push(new Point(coords[i], coords[i + 1]));\n }\n\n return points;\n }\n }, {\n getLength: function getLength() {\n if (this._length == null) this._length = Curve.getLength(this.getValues(), 0, 1);\n return this._length;\n },\n getArea: function getArea() {\n return Curve.getArea(this.getValues());\n },\n getLine: function getLine() {\n return new Line(this._segment1._point, this._segment2._point);\n },\n getPart: function getPart(from, to) {\n return new Curve(Curve.getPart(this.getValues(), from, to));\n },\n getPartLength: function getPartLength(from, to) {\n return Curve.getLength(this.getValues(), from, to);\n },\n divideAt: function divideAt(location) {\n return this.divideAtTime(location && location.curve === this ? location.time : this.getTimeAt(location));\n },\n divideAtTime: function divideAtTime(time, _setHandles) {\n var tMin = 1e-8,\n tMax = 1 - tMin,\n res = null;\n\n if (time >= tMin && time <= tMax) {\n var parts = Curve.subdivide(this.getValues(), time),\n left = parts[0],\n right = parts[1],\n setHandles = _setHandles || this.hasHandles(),\n seg1 = this._segment1,\n seg2 = this._segment2,\n path = this._path;\n\n if (setHandles) {\n seg1._handleOut._set(left[2] - left[0], left[3] - left[1]);\n\n seg2._handleIn._set(right[4] - right[6], right[5] - right[7]);\n }\n\n var x = left[6],\n y = left[7],\n segment = new Segment(new Point(x, y), setHandles && new Point(left[4] - x, left[5] - y), setHandles && new Point(right[2] - x, right[3] - y));\n\n if (path) {\n path.insert(seg1._index + 1, segment);\n res = this.getNext();\n } else {\n this._segment2 = segment;\n\n this._changed();\n\n res = new Curve(segment, seg2);\n }\n }\n\n return res;\n },\n splitAt: function splitAt(location) {\n var path = this._path;\n return path ? path.splitAt(location) : null;\n },\n splitAtTime: function splitAtTime(time) {\n return this.splitAt(this.getLocationAtTime(time));\n },\n divide: function divide(offset, isTime) {\n return this.divideAtTime(offset === undefined ? 0.5 : isTime ? offset : this.getTimeAt(offset));\n },\n split: function split(offset, isTime) {\n return this.splitAtTime(offset === undefined ? 0.5 : isTime ? offset : this.getTimeAt(offset));\n },\n reversed: function reversed() {\n return new Curve(this._segment2.reversed(), this._segment1.reversed());\n },\n clearHandles: function clearHandles() {\n this._segment1._handleOut._set(0, 0);\n\n this._segment2._handleIn._set(0, 0);\n },\n statics: {\n getValues: function getValues(segment1, segment2, matrix, straight) {\n var p1 = segment1._point,\n h1 = segment1._handleOut,\n h2 = segment2._handleIn,\n p2 = segment2._point,\n x1 = p1.x,\n y1 = p1.y,\n x2 = p2.x,\n y2 = p2.y,\n values = straight ? [x1, y1, x1, y1, x2, y2, x2, y2] : [x1, y1, x1 + h1._x, y1 + h1._y, x2 + h2._x, y2 + h2._y, x2, y2];\n if (matrix) matrix._transformCoordinates(values, values, 4);\n return values;\n },\n subdivide: function subdivide(v, t) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7];\n if (t === undefined) t = 0.5;\n var u = 1 - t,\n x4 = u * x0 + t * x1,\n y4 = u * y0 + t * y1,\n x5 = u * x1 + t * x2,\n y5 = u * y1 + t * y2,\n x6 = u * x2 + t * x3,\n y6 = u * y2 + t * y3,\n x7 = u * x4 + t * x5,\n y7 = u * y4 + t * y5,\n x8 = u * x5 + t * x6,\n y8 = u * y5 + t * y6,\n x9 = u * x7 + t * x8,\n y9 = u * y7 + t * y8;\n return [[x0, y0, x4, y4, x7, y7, x9, y9], [x9, y9, x8, y8, x6, y6, x3, y3]];\n },\n getMonoCurves: function getMonoCurves(v, dir) {\n var curves = [],\n io = dir ? 0 : 1,\n o0 = v[io + 0],\n o1 = v[io + 2],\n o2 = v[io + 4],\n o3 = v[io + 6];\n\n if (o0 >= o1 === o1 >= o2 && o1 >= o2 === o2 >= o3 || Curve.isStraight(v)) {\n curves.push(v);\n } else {\n var a = 3 * (o1 - o2) - o0 + o3,\n b = 2 * (o0 + o2) - 4 * o1,\n c = o1 - o0,\n tMin = 1e-8,\n tMax = 1 - tMin,\n roots = [],\n n = Numerical.solveQuadratic(a, b, c, roots, tMin, tMax);\n\n if (!n) {\n curves.push(v);\n } else {\n roots.sort();\n var t = roots[0],\n parts = Curve.subdivide(v, t);\n curves.push(parts[0]);\n\n if (n > 1) {\n t = (roots[1] - t) / (1 - t);\n parts = Curve.subdivide(parts[1], t);\n curves.push(parts[0]);\n }\n\n curves.push(parts[1]);\n }\n }\n\n return curves;\n },\n solveCubic: function solveCubic(v, coord, val, roots, min, max) {\n var v0 = v[coord],\n v1 = v[coord + 2],\n v2 = v[coord + 4],\n v3 = v[coord + 6],\n res = 0;\n\n if (!(v0 < val && v3 < val && v1 < val && v2 < val || v0 > val && v3 > val && v1 > val && v2 > val)) {\n var c = 3 * (v1 - v0),\n b = 3 * (v2 - v1) - c,\n a = v3 - v0 - c - b;\n res = Numerical.solveCubic(a, b, c, v0 - val, roots, min, max);\n }\n\n return res;\n },\n getTimeOf: function getTimeOf(v, point) {\n var p0 = new Point(v[0], v[1]),\n p3 = new Point(v[6], v[7]),\n epsilon = 1e-12,\n geomEpsilon = 1e-7,\n t = point.isClose(p0, epsilon) ? 0 : point.isClose(p3, epsilon) ? 1 : null;\n\n if (t === null) {\n var coords = [point.x, point.y],\n roots = [];\n\n for (var c = 0; c < 2; c++) {\n var count = Curve.solveCubic(v, c, coords[c], roots, 0, 1);\n\n for (var i = 0; i < count; i++) {\n var u = roots[i];\n if (point.isClose(Curve.getPoint(v, u), geomEpsilon)) return u;\n }\n }\n }\n\n return point.isClose(p0, geomEpsilon) ? 0 : point.isClose(p3, geomEpsilon) ? 1 : null;\n },\n getNearestTime: function getNearestTime(v, point) {\n if (Curve.isStraight(v)) {\n var x0 = v[0],\n y0 = v[1],\n x3 = v[6],\n y3 = v[7],\n vx = x3 - x0,\n vy = y3 - y0,\n det = vx * vx + vy * vy;\n if (det === 0) return 0;\n var u = ((point.x - x0) * vx + (point.y - y0) * vy) / det;\n return u < 1e-12 ? 0 : u > 0.999999999999 ? 1 : Curve.getTimeOf(v, new Point(x0 + u * vx, y0 + u * vy));\n }\n\n var count = 100,\n minDist = Infinity,\n minT = 0;\n\n function refine(t) {\n if (t >= 0 && t <= 1) {\n var dist = point.getDistance(Curve.getPoint(v, t), true);\n\n if (dist < minDist) {\n minDist = dist;\n minT = t;\n return true;\n }\n }\n }\n\n for (var i = 0; i <= count; i++) {\n refine(i / count);\n }\n\n var step = 1 / (count * 2);\n\n while (step > 1e-8) {\n if (!refine(minT - step) && !refine(minT + step)) step /= 2;\n }\n\n return minT;\n },\n getPart: function getPart(v, from, to) {\n var flip = from > to;\n\n if (flip) {\n var tmp = from;\n from = to;\n to = tmp;\n }\n\n if (from > 0) v = Curve.subdivide(v, from)[1];\n if (to < 1) v = Curve.subdivide(v, (to - from) / (1 - from))[0];\n return flip ? [v[6], v[7], v[4], v[5], v[2], v[3], v[0], v[1]] : v;\n },\n isFlatEnough: function isFlatEnough(v, flatness) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n ux = 3 * x1 - 2 * x0 - x3,\n uy = 3 * y1 - 2 * y0 - y3,\n vx = 3 * x2 - 2 * x3 - x0,\n vy = 3 * y2 - 2 * y3 - y0;\n return Math.max(ux * ux, vx * vx) + Math.max(uy * uy, vy * vy) <= 16 * flatness * flatness;\n },\n getArea: function getArea(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7];\n return 3 * ((y3 - y0) * (x1 + x2) - (x3 - x0) * (y1 + y2) + y1 * (x0 - x2) - x1 * (y0 - y2) + y3 * (x2 + x0 / 3) - x3 * (y2 + y0 / 3)) / 20;\n },\n getBounds: function getBounds(v) {\n var min = v.slice(0, 2),\n max = min.slice(),\n roots = [0, 0];\n\n for (var i = 0; i < 2; i++) {\n Curve._addBounds(v[i], v[i + 2], v[i + 4], v[i + 6], i, 0, min, max, roots);\n }\n\n return new _Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n },\n _addBounds: function _addBounds(v0, v1, v2, v3, coord, padding, min, max, roots) {\n function add(value, padding) {\n var left = value - padding,\n right = value + padding;\n if (left < min[coord]) min[coord] = left;\n if (right > max[coord]) max[coord] = right;\n }\n\n padding /= 2;\n var minPad = min[coord] + padding,\n maxPad = max[coord] - padding;\n\n if (v0 < minPad || v1 < minPad || v2 < minPad || v3 < minPad || v0 > maxPad || v1 > maxPad || v2 > maxPad || v3 > maxPad) {\n if (v1 < v0 != v1 < v3 && v2 < v0 != v2 < v3) {\n add(v0, 0);\n add(v3, 0);\n } else {\n var a = 3 * (v1 - v2) - v0 + v3,\n b = 2 * (v0 + v2) - 4 * v1,\n c = v1 - v0,\n count = Numerical.solveQuadratic(a, b, c, roots),\n tMin = 1e-8,\n tMax = 1 - tMin;\n add(v3, 0);\n\n for (var i = 0; i < count; i++) {\n var t = roots[i],\n u = 1 - t;\n if (tMin <= t && t <= tMax) add(u * u * u * v0 + 3 * u * u * t * v1 + 3 * u * t * t * v2 + t * t * t * v3, padding);\n }\n }\n }\n }\n }\n }, Base.each(['getBounds', 'getStrokeBounds', 'getHandleBounds'], function (name) {\n this[name] = function () {\n if (!this._bounds) this._bounds = {};\n var bounds = this._bounds[name];\n\n if (!bounds) {\n bounds = this._bounds[name] = Path[name]([this._segment1, this._segment2], false, this._path);\n }\n\n return bounds.clone();\n };\n }, {}), Base.each({\n isStraight: function isStraight(p1, h1, h2, p2) {\n if (h1.isZero() && h2.isZero()) {\n return true;\n } else {\n var v = p2.subtract(p1);\n\n if (v.isZero()) {\n return false;\n } else if (v.isCollinear(h1) && v.isCollinear(h2)) {\n var l = new Line(p1, p2),\n epsilon = 1e-7;\n\n if (l.getDistance(p1.add(h1)) < epsilon && l.getDistance(p2.add(h2)) < epsilon) {\n var div = v.dot(v),\n s1 = v.dot(h1) / div,\n s2 = v.dot(h2) / div;\n return s1 >= 0 && s1 <= 1 && s2 <= 0 && s2 >= -1;\n }\n }\n }\n\n return false;\n },\n isLinear: function isLinear(p1, h1, h2, p2) {\n var third = p2.subtract(p1).divide(3);\n return h1.equals(third) && h2.negate().equals(third);\n }\n }, function (test, name) {\n this[name] = function (epsilon) {\n var seg1 = this._segment1,\n seg2 = this._segment2;\n return test(seg1._point, seg1._handleOut, seg2._handleIn, seg2._point, epsilon);\n };\n\n this.statics[name] = function (v, epsilon) {\n var x0 = v[0],\n y0 = v[1],\n x3 = v[6],\n y3 = v[7];\n return test(new Point(x0, y0), new Point(v[2] - x0, v[3] - y0), new Point(v[4] - x3, v[5] - y3), new Point(x3, y3), epsilon);\n };\n }, {\n statics: {},\n hasHandles: function hasHandles() {\n return !this._segment1._handleOut.isZero() || !this._segment2._handleIn.isZero();\n },\n hasLength: function hasLength(epsilon) {\n return (!this.getPoint1().equals(this.getPoint2()) || this.hasHandles()) && this.getLength() > (epsilon || 0);\n },\n isCollinear: function isCollinear(curve) {\n return curve && this.isStraight() && curve.isStraight() && this.getLine().isCollinear(curve.getLine());\n },\n isHorizontal: function isHorizontal() {\n return this.isStraight() && Math.abs(this.getTangentAtTime(0.5).y) < 1e-8;\n },\n isVertical: function isVertical() {\n return this.isStraight() && Math.abs(this.getTangentAtTime(0.5).x) < 1e-8;\n }\n }), {\n beans: false,\n getLocationAt: function getLocationAt(offset, _isTime) {\n return this.getLocationAtTime(_isTime ? offset : this.getTimeAt(offset));\n },\n getLocationAtTime: function getLocationAtTime(t) {\n return t != null && t >= 0 && t <= 1 ? new CurveLocation(this, t) : null;\n },\n getTimeAt: function getTimeAt(offset, start) {\n return Curve.getTimeAt(this.getValues(), offset, start);\n },\n getParameterAt: '#getTimeAt',\n getTimesWithTangent: function getTimesWithTangent() {\n var tangent = Point.read(arguments);\n return tangent.isZero() ? [] : Curve.getTimesWithTangent(this.getValues(), tangent);\n },\n getOffsetAtTime: function getOffsetAtTime(t) {\n return this.getPartLength(0, t);\n },\n getLocationOf: function getLocationOf() {\n return this.getLocationAtTime(this.getTimeOf(Point.read(arguments)));\n },\n getOffsetOf: function getOffsetOf() {\n var loc = this.getLocationOf.apply(this, arguments);\n return loc ? loc.getOffset() : null;\n },\n getTimeOf: function getTimeOf() {\n return Curve.getTimeOf(this.getValues(), Point.read(arguments));\n },\n getParameterOf: '#getTimeOf',\n getNearestLocation: function getNearestLocation() {\n var point = Point.read(arguments),\n values = this.getValues(),\n t = Curve.getNearestTime(values, point),\n pt = Curve.getPoint(values, t);\n return new CurveLocation(this, t, pt, null, point.getDistance(pt));\n },\n getNearestPoint: function getNearestPoint() {\n var loc = this.getNearestLocation.apply(this, arguments);\n return loc ? loc.getPoint() : loc;\n }\n }, new function () {\n var methods = ['getPoint', 'getTangent', 'getNormal', 'getWeightedTangent', 'getWeightedNormal', 'getCurvature'];\n return Base.each(methods, function (name) {\n this[name + 'At'] = function (location, _isTime) {\n var values = this.getValues();\n return Curve[name](values, _isTime ? location : Curve.getTimeAt(values, location));\n };\n\n this[name + 'AtTime'] = function (time) {\n return Curve[name](this.getValues(), time);\n };\n }, {\n statics: {\n _evaluateMethods: methods\n }\n });\n }(), new function () {\n function getLengthIntegrand(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n ax = 9 * (x1 - x2) + 3 * (x3 - x0),\n bx = 6 * (x0 + x2) - 12 * x1,\n cx = 3 * (x1 - x0),\n ay = 9 * (y1 - y2) + 3 * (y3 - y0),\n by = 6 * (y0 + y2) - 12 * y1,\n cy = 3 * (y1 - y0);\n return function (t) {\n var dx = (ax * t + bx) * t + cx,\n dy = (ay * t + by) * t + cy;\n return Math.sqrt(dx * dx + dy * dy);\n };\n }\n\n function getIterations(a, b) {\n return Math.max(2, Math.min(16, Math.ceil(Math.abs(b - a) * 32)));\n }\n\n function evaluate(v, t, type, normalized) {\n if (t == null || t < 0 || t > 1) return null;\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n isZero = Numerical.isZero;\n\n if (isZero(x1 - x0) && isZero(y1 - y0)) {\n x1 = x0;\n y1 = y0;\n }\n\n if (isZero(x2 - x3) && isZero(y2 - y3)) {\n x2 = x3;\n y2 = y3;\n }\n\n var cx = 3 * (x1 - x0),\n bx = 3 * (x2 - x1) - cx,\n ax = x3 - x0 - cx - bx,\n cy = 3 * (y1 - y0),\n by = 3 * (y2 - y1) - cy,\n ay = y3 - y0 - cy - by,\n x,\n y;\n\n if (type === 0) {\n x = t === 0 ? x0 : t === 1 ? x3 : ((ax * t + bx) * t + cx) * t + x0;\n y = t === 0 ? y0 : t === 1 ? y3 : ((ay * t + by) * t + cy) * t + y0;\n } else {\n var tMin = 1e-8,\n tMax = 1 - tMin;\n\n if (t < tMin) {\n x = cx;\n y = cy;\n } else if (t > tMax) {\n x = 3 * (x3 - x2);\n y = 3 * (y3 - y2);\n } else {\n x = (3 * ax * t + 2 * bx) * t + cx;\n y = (3 * ay * t + 2 * by) * t + cy;\n }\n\n if (normalized) {\n if (x === 0 && y === 0 && (t < tMin || t > tMax)) {\n x = x2 - x1;\n y = y2 - y1;\n }\n\n var len = Math.sqrt(x * x + y * y);\n\n if (len) {\n x /= len;\n y /= len;\n }\n }\n\n if (type === 3) {\n var x2 = 6 * ax * t + 2 * bx,\n y2 = 6 * ay * t + 2 * by,\n d = Math.pow(x * x + y * y, 3 / 2);\n x = d !== 0 ? (x * y2 - y * x2) / d : 0;\n y = 0;\n }\n }\n\n return type === 2 ? new Point(y, -x) : new Point(x, y);\n }\n\n return {\n statics: {\n classify: function classify(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n a1 = x0 * (y3 - y2) + y0 * (x2 - x3) + x3 * y2 - y3 * x2,\n a2 = x1 * (y0 - y3) + y1 * (x3 - x0) + x0 * y3 - y0 * x3,\n a3 = x2 * (y1 - y0) + y2 * (x0 - x1) + x1 * y0 - y1 * x0,\n d3 = 3 * a3,\n d2 = d3 - a2,\n d1 = d2 - a2 + a1,\n l = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3),\n s = l !== 0 ? 1 / l : 0,\n isZero = Numerical.isZero,\n serpentine = 'serpentine';\n d1 *= s;\n d2 *= s;\n d3 *= s;\n\n function type(type, t1, t2) {\n var hasRoots = t1 !== undefined,\n t1Ok = hasRoots && t1 > 0 && t1 < 1,\n t2Ok = hasRoots && t2 > 0 && t2 < 1;\n\n if (hasRoots && (!(t1Ok || t2Ok) || type === 'loop' && !(t1Ok && t2Ok))) {\n type = 'arch';\n t1Ok = t2Ok = false;\n }\n\n return {\n type: type,\n roots: t1Ok || t2Ok ? t1Ok && t2Ok ? t1 < t2 ? [t1, t2] : [t2, t1] : [t1Ok ? t1 : t2] : null\n };\n }\n\n if (isZero(d1)) {\n return isZero(d2) ? type(isZero(d3) ? 'line' : 'quadratic') : type(serpentine, d3 / (3 * d2));\n }\n\n var d = 3 * d2 * d2 - 4 * d1 * d3;\n\n if (isZero(d)) {\n return type('cusp', d2 / (2 * d1));\n }\n\n var f1 = d > 0 ? Math.sqrt(d / 3) : Math.sqrt(-d),\n f2 = 2 * d1;\n return type(d > 0 ? serpentine : 'loop', (d2 + f1) / f2, (d2 - f1) / f2);\n },\n getLength: function getLength(v, a, b, ds) {\n if (a === undefined) a = 0;\n if (b === undefined) b = 1;\n\n if (Curve.isStraight(v)) {\n var c = v;\n\n if (b < 1) {\n c = Curve.subdivide(c, b)[0];\n a /= b;\n }\n\n if (a > 0) {\n c = Curve.subdivide(c, a)[1];\n }\n\n var dx = c[6] - c[0],\n dy = c[7] - c[1];\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n return Numerical.integrate(ds || getLengthIntegrand(v), a, b, getIterations(a, b));\n },\n getTimeAt: function getTimeAt(v, offset, start) {\n if (start === undefined) start = offset < 0 ? 1 : 0;\n if (offset === 0) return start;\n var abs = Math.abs,\n epsilon = 1e-12,\n forward = offset > 0,\n a = forward ? start : 0,\n b = forward ? 1 : start,\n ds = getLengthIntegrand(v),\n rangeLength = Curve.getLength(v, a, b, ds),\n diff = abs(offset) - rangeLength;\n\n if (abs(diff) < epsilon) {\n return forward ? b : a;\n } else if (diff > epsilon) {\n return null;\n }\n\n var guess = offset / rangeLength,\n length = 0;\n\n function f(t) {\n length += Numerical.integrate(ds, start, t, getIterations(start, t));\n start = t;\n return length - offset;\n }\n\n return Numerical.findRoot(f, ds, start + guess, a, b, 32, 1e-12);\n },\n getPoint: function getPoint(v, t) {\n return evaluate(v, t, 0, false);\n },\n getTangent: function getTangent(v, t) {\n return evaluate(v, t, 1, true);\n },\n getWeightedTangent: function getWeightedTangent(v, t) {\n return evaluate(v, t, 1, false);\n },\n getNormal: function getNormal(v, t) {\n return evaluate(v, t, 2, true);\n },\n getWeightedNormal: function getWeightedNormal(v, t) {\n return evaluate(v, t, 2, false);\n },\n getCurvature: function getCurvature(v, t) {\n return evaluate(v, t, 3, false).x;\n },\n getPeaks: function getPeaks(v) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n ax = -x0 + 3 * x1 - 3 * x2 + x3,\n bx = 3 * x0 - 6 * x1 + 3 * x2,\n cx = -3 * x0 + 3 * x1,\n ay = -y0 + 3 * y1 - 3 * y2 + y3,\n by = 3 * y0 - 6 * y1 + 3 * y2,\n cy = -3 * y0 + 3 * y1,\n tMin = 1e-8,\n tMax = 1 - tMin,\n roots = [];\n Numerical.solveCubic(9 * (ax * ax + ay * ay), 9 * (ax * bx + by * ay), 2 * (bx * bx + by * by) + 3 * (cx * ax + cy * ay), cx * bx + by * cy, roots, tMin, tMax);\n return roots.sort();\n }\n }\n };\n }(), new function () {\n function addLocation(locations, include, c1, t1, c2, t2, overlap) {\n var excludeStart = !overlap && c1.getPrevious() === c2,\n excludeEnd = !overlap && c1 !== c2 && c1.getNext() === c2,\n tMin = 1e-8,\n tMax = 1 - tMin;\n\n if (t1 !== null && t1 >= (excludeStart ? tMin : 0) && t1 <= (excludeEnd ? tMax : 1)) {\n if (t2 !== null && t2 >= (excludeEnd ? tMin : 0) && t2 <= (excludeStart ? tMax : 1)) {\n var loc1 = new CurveLocation(c1, t1, null, overlap),\n loc2 = new CurveLocation(c2, t2, null, overlap);\n loc1._intersection = loc2;\n loc2._intersection = loc1;\n\n if (!include || include(loc1)) {\n CurveLocation.insert(locations, loc1, true);\n }\n }\n }\n }\n\n function addCurveIntersections(v1, v2, c1, c2, locations, include, flip, recursion, calls, tMin, tMax, uMin, uMax) {\n if (++calls >= 4096 || ++recursion >= 40) return calls;\n var fatLineEpsilon = 1e-9,\n q0x = v2[0],\n q0y = v2[1],\n q3x = v2[6],\n q3y = v2[7],\n getSignedDistance = Line.getSignedDistance,\n d1 = getSignedDistance(q0x, q0y, q3x, q3y, v2[2], v2[3]),\n d2 = getSignedDistance(q0x, q0y, q3x, q3y, v2[4], v2[5]),\n factor = d1 * d2 > 0 ? 3 / 4 : 4 / 9,\n dMin = factor * Math.min(0, d1, d2),\n dMax = factor * Math.max(0, d1, d2),\n dp0 = getSignedDistance(q0x, q0y, q3x, q3y, v1[0], v1[1]),\n dp1 = getSignedDistance(q0x, q0y, q3x, q3y, v1[2], v1[3]),\n dp2 = getSignedDistance(q0x, q0y, q3x, q3y, v1[4], v1[5]),\n dp3 = getSignedDistance(q0x, q0y, q3x, q3y, v1[6], v1[7]),\n hull = getConvexHull(dp0, dp1, dp2, dp3),\n top = hull[0],\n bottom = hull[1],\n tMinClip,\n tMaxClip;\n if (d1 === 0 && d2 === 0 && dp0 === 0 && dp1 === 0 && dp2 === 0 && dp3 === 0 || (tMinClip = clipConvexHull(top, bottom, dMin, dMax)) == null || (tMaxClip = clipConvexHull(top.reverse(), bottom.reverse(), dMin, dMax)) == null) return calls;\n var tMinNew = tMin + (tMax - tMin) * tMinClip,\n tMaxNew = tMin + (tMax - tMin) * tMaxClip;\n\n if (Math.max(uMax - uMin, tMaxNew - tMinNew) < fatLineEpsilon) {\n var t = (tMinNew + tMaxNew) / 2,\n u = (uMin + uMax) / 2;\n addLocation(locations, include, flip ? c2 : c1, flip ? u : t, flip ? c1 : c2, flip ? t : u);\n } else {\n v1 = Curve.getPart(v1, tMinClip, tMaxClip);\n var uDiff = uMax - uMin;\n\n if (tMaxClip - tMinClip > 0.8) {\n if (tMaxNew - tMinNew > uDiff) {\n var parts = Curve.subdivide(v1, 0.5),\n t = (tMinNew + tMaxNew) / 2;\n calls = addCurveIntersections(v2, parts[0], c2, c1, locations, include, !flip, recursion, calls, uMin, uMax, tMinNew, t);\n calls = addCurveIntersections(v2, parts[1], c2, c1, locations, include, !flip, recursion, calls, uMin, uMax, t, tMaxNew);\n } else {\n var parts = Curve.subdivide(v2, 0.5),\n u = (uMin + uMax) / 2;\n calls = addCurveIntersections(parts[0], v1, c2, c1, locations, include, !flip, recursion, calls, uMin, u, tMinNew, tMaxNew);\n calls = addCurveIntersections(parts[1], v1, c2, c1, locations, include, !flip, recursion, calls, u, uMax, tMinNew, tMaxNew);\n }\n } else {\n if (uDiff === 0 || uDiff >= fatLineEpsilon) {\n calls = addCurveIntersections(v2, v1, c2, c1, locations, include, !flip, recursion, calls, uMin, uMax, tMinNew, tMaxNew);\n } else {\n calls = addCurveIntersections(v1, v2, c1, c2, locations, include, flip, recursion, calls, tMinNew, tMaxNew, uMin, uMax);\n }\n }\n }\n\n return calls;\n }\n\n function getConvexHull(dq0, dq1, dq2, dq3) {\n var p0 = [0, dq0],\n p1 = [1 / 3, dq1],\n p2 = [2 / 3, dq2],\n p3 = [1, dq3],\n dist1 = dq1 - (2 * dq0 + dq3) / 3,\n dist2 = dq2 - (dq0 + 2 * dq3) / 3,\n hull;\n\n if (dist1 * dist2 < 0) {\n hull = [[p0, p1, p3], [p0, p2, p3]];\n } else {\n var distRatio = dist1 / dist2;\n hull = [distRatio >= 2 ? [p0, p1, p3] : distRatio <= 0.5 ? [p0, p2, p3] : [p0, p1, p2, p3], [p0, p3]];\n }\n\n return (dist1 || dist2) < 0 ? hull.reverse() : hull;\n }\n\n function clipConvexHull(hullTop, hullBottom, dMin, dMax) {\n if (hullTop[0][1] < dMin) {\n return clipConvexHullPart(hullTop, true, dMin);\n } else if (hullBottom[0][1] > dMax) {\n return clipConvexHullPart(hullBottom, false, dMax);\n } else {\n return hullTop[0][0];\n }\n }\n\n function clipConvexHullPart(part, top, threshold) {\n var px = part[0][0],\n py = part[0][1];\n\n for (var i = 1, l = part.length; i < l; i++) {\n var qx = part[i][0],\n qy = part[i][1];\n\n if (top ? qy >= threshold : qy <= threshold) {\n return qy === threshold ? qx : px + (threshold - py) * (qx - px) / (qy - py);\n }\n\n px = qx;\n py = qy;\n }\n\n return null;\n }\n\n function getCurveLineIntersections(v, px, py, vx, vy) {\n var isZero = Numerical.isZero;\n\n if (isZero(vx) && isZero(vy)) {\n var t = Curve.getTimeOf(v, new Point(px, py));\n return t === null ? [] : [t];\n }\n\n var angle = Math.atan2(-vy, vx),\n sin = Math.sin(angle),\n cos = Math.cos(angle),\n rv = [],\n roots = [];\n\n for (var i = 0; i < 8; i += 2) {\n var x = v[i] - px,\n y = v[i + 1] - py;\n rv.push(x * cos - y * sin, x * sin + y * cos);\n }\n\n Curve.solveCubic(rv, 1, 0, roots, 0, 1);\n return roots;\n }\n\n function addCurveLineIntersections(v1, v2, c1, c2, locations, include, flip) {\n var x1 = v2[0],\n y1 = v2[1],\n x2 = v2[6],\n y2 = v2[7],\n roots = getCurveLineIntersections(v1, x1, y1, x2 - x1, y2 - y1);\n\n for (var i = 0, l = roots.length; i < l; i++) {\n var t1 = roots[i],\n p1 = Curve.getPoint(v1, t1),\n t2 = Curve.getTimeOf(v2, p1);\n\n if (t2 !== null) {\n addLocation(locations, include, flip ? c2 : c1, flip ? t2 : t1, flip ? c1 : c2, flip ? t1 : t2);\n }\n }\n }\n\n function addLineIntersection(v1, v2, c1, c2, locations, include) {\n var pt = Line.intersect(v1[0], v1[1], v1[6], v1[7], v2[0], v2[1], v2[6], v2[7]);\n\n if (pt) {\n addLocation(locations, include, c1, Curve.getTimeOf(v1, pt), c2, Curve.getTimeOf(v2, pt));\n }\n }\n\n function getCurveIntersections(v1, v2, c1, c2, locations, include) {\n var epsilon = 1e-12,\n min = Math.min,\n max = Math.max;\n\n if (max(v1[0], v1[2], v1[4], v1[6]) + epsilon > min(v2[0], v2[2], v2[4], v2[6]) && min(v1[0], v1[2], v1[4], v1[6]) - epsilon < max(v2[0], v2[2], v2[4], v2[6]) && max(v1[1], v1[3], v1[5], v1[7]) + epsilon > min(v2[1], v2[3], v2[5], v2[7]) && min(v1[1], v1[3], v1[5], v1[7]) - epsilon < max(v2[1], v2[3], v2[5], v2[7])) {\n var overlaps = getOverlaps(v1, v2);\n\n if (overlaps) {\n for (var i = 0; i < 2; i++) {\n var overlap = overlaps[i];\n addLocation(locations, include, c1, overlap[0], c2, overlap[1], true);\n }\n } else {\n var straight1 = Curve.isStraight(v1),\n straight2 = Curve.isStraight(v2),\n straight = straight1 && straight2,\n flip = straight1 && !straight2,\n before = locations.length;\n (straight ? addLineIntersection : straight1 || straight2 ? addCurveLineIntersections : addCurveIntersections)(flip ? v2 : v1, flip ? v1 : v2, flip ? c2 : c1, flip ? c1 : c2, locations, include, flip, 0, 0, 0, 1, 0, 1);\n\n if (!straight || locations.length === before) {\n for (var i = 0; i < 4; i++) {\n var t1 = i >> 1,\n t2 = i & 1,\n i1 = t1 * 6,\n i2 = t2 * 6,\n p1 = new Point(v1[i1], v1[i1 + 1]),\n p2 = new Point(v2[i2], v2[i2 + 1]);\n\n if (p1.isClose(p2, epsilon)) {\n addLocation(locations, include, c1, t1, c2, t2);\n }\n }\n }\n }\n }\n\n return locations;\n }\n\n function getSelfIntersection(v1, c1, locations, include) {\n var info = Curve.classify(v1);\n\n if (info.type === 'loop') {\n var roots = info.roots;\n addLocation(locations, include, c1, roots[0], c1, roots[1]);\n }\n\n return locations;\n }\n\n function getIntersections(curves1, curves2, include, matrix1, matrix2, _returnFirst) {\n var epsilon = 1e-7,\n self = !curves2;\n if (self) curves2 = curves1;\n var length1 = curves1.length,\n length2 = curves2.length,\n values1 = new Array(length1),\n values2 = self ? values1 : new Array(length2),\n locations = [];\n\n for (var i = 0; i < length1; i++) {\n values1[i] = curves1[i].getValues(matrix1);\n }\n\n if (!self) {\n for (var i = 0; i < length2; i++) {\n values2[i] = curves2[i].getValues(matrix2);\n }\n }\n\n var boundsCollisions = CollisionDetection.findCurveBoundsCollisions(values1, values2, epsilon);\n\n for (var index1 = 0; index1 < length1; index1++) {\n var curve1 = curves1[index1],\n v1 = values1[index1];\n\n if (self) {\n getSelfIntersection(v1, curve1, locations, include);\n }\n\n var collisions1 = boundsCollisions[index1];\n\n if (collisions1) {\n for (var j = 0; j < collisions1.length; j++) {\n if (_returnFirst && locations.length) return locations;\n var index2 = collisions1[j];\n\n if (!self || index2 > index1) {\n var curve2 = curves2[index2],\n v2 = values2[index2];\n getCurveIntersections(v1, v2, curve1, curve2, locations, include);\n }\n }\n }\n }\n\n return locations;\n }\n\n function getOverlaps(v1, v2) {\n function getSquaredLineLength(v) {\n var x = v[6] - v[0],\n y = v[7] - v[1];\n return x * x + y * y;\n }\n\n var abs = Math.abs,\n getDistance = Line.getDistance,\n timeEpsilon = 1e-8,\n geomEpsilon = 1e-7,\n straight1 = Curve.isStraight(v1),\n straight2 = Curve.isStraight(v2),\n straightBoth = straight1 && straight2,\n flip = getSquaredLineLength(v1) < getSquaredLineLength(v2),\n l1 = flip ? v2 : v1,\n l2 = flip ? v1 : v2,\n px = l1[0],\n py = l1[1],\n vx = l1[6] - px,\n vy = l1[7] - py;\n\n if (getDistance(px, py, vx, vy, l2[0], l2[1], true) < geomEpsilon && getDistance(px, py, vx, vy, l2[6], l2[7], true) < geomEpsilon) {\n if (!straightBoth && getDistance(px, py, vx, vy, l1[2], l1[3], true) < geomEpsilon && getDistance(px, py, vx, vy, l1[4], l1[5], true) < geomEpsilon && getDistance(px, py, vx, vy, l2[2], l2[3], true) < geomEpsilon && getDistance(px, py, vx, vy, l2[4], l2[5], true) < geomEpsilon) {\n straight1 = straight2 = straightBoth = true;\n }\n } else if (straightBoth) {\n return null;\n }\n\n if (straight1 ^ straight2) {\n return null;\n }\n\n var v = [v1, v2],\n pairs = [];\n\n for (var i = 0; i < 4 && pairs.length < 2; i++) {\n var i1 = i & 1,\n i2 = i1 ^ 1,\n t1 = i >> 1,\n t2 = Curve.getTimeOf(v[i1], new Point(v[i2][t1 ? 6 : 0], v[i2][t1 ? 7 : 1]));\n\n if (t2 != null) {\n var pair = i1 ? [t1, t2] : [t2, t1];\n\n if (!pairs.length || abs(pair[0] - pairs[0][0]) > timeEpsilon && abs(pair[1] - pairs[0][1]) > timeEpsilon) {\n pairs.push(pair);\n }\n }\n\n if (i > 2 && !pairs.length) break;\n }\n\n if (pairs.length !== 2) {\n pairs = null;\n } else if (!straightBoth) {\n var o1 = Curve.getPart(v1, pairs[0][0], pairs[1][0]),\n o2 = Curve.getPart(v2, pairs[0][1], pairs[1][1]);\n if (abs(o2[2] - o1[2]) > geomEpsilon || abs(o2[3] - o1[3]) > geomEpsilon || abs(o2[4] - o1[4]) > geomEpsilon || abs(o2[5] - o1[5]) > geomEpsilon) pairs = null;\n }\n\n return pairs;\n }\n\n function getTimesWithTangent(v, tangent) {\n var x0 = v[0],\n y0 = v[1],\n x1 = v[2],\n y1 = v[3],\n x2 = v[4],\n y2 = v[5],\n x3 = v[6],\n y3 = v[7],\n normalized = tangent.normalize(),\n tx = normalized.x,\n ty = normalized.y,\n ax = 3 * x3 - 9 * x2 + 9 * x1 - 3 * x0,\n ay = 3 * y3 - 9 * y2 + 9 * y1 - 3 * y0,\n bx = 6 * x2 - 12 * x1 + 6 * x0,\n by = 6 * y2 - 12 * y1 + 6 * y0,\n cx = 3 * x1 - 3 * x0,\n cy = 3 * y1 - 3 * y0,\n den = 2 * ax * ty - 2 * ay * tx,\n times = [];\n\n if (Math.abs(den) < Numerical.CURVETIME_EPSILON) {\n var num = ax * cy - ay * cx,\n den = ax * by - ay * bx;\n\n if (den != 0) {\n var t = -num / den;\n if (t >= 0 && t <= 1) times.push(t);\n }\n } else {\n var delta = (bx * bx - 4 * ax * cx) * ty * ty + (-2 * bx * by + 4 * ay * cx + 4 * ax * cy) * tx * ty + (by * by - 4 * ay * cy) * tx * tx,\n k = bx * ty - by * tx;\n\n if (delta >= 0 && den != 0) {\n var d = Math.sqrt(delta),\n t0 = -(k + d) / den,\n t1 = (-k + d) / den;\n if (t0 >= 0 && t0 <= 1) times.push(t0);\n if (t1 >= 0 && t1 <= 1) times.push(t1);\n }\n }\n\n return times;\n }\n\n return {\n getIntersections: function getIntersections(curve) {\n var v1 = this.getValues(),\n v2 = curve && curve !== this && curve.getValues();\n return v2 ? getCurveIntersections(v1, v2, this, curve, []) : getSelfIntersection(v1, this, []);\n },\n statics: {\n getOverlaps: getOverlaps,\n getIntersections: getIntersections,\n getCurveLineIntersections: getCurveLineIntersections,\n getTimesWithTangent: getTimesWithTangent\n }\n };\n }());\n var CurveLocation = Base.extend({\n _class: 'CurveLocation',\n initialize: function CurveLocation(curve, time, point, _overlap, _distance) {\n if (time >= 0.99999999) {\n var next = curve.getNext();\n\n if (next) {\n time = 0;\n curve = next;\n }\n }\n\n this._setCurve(curve);\n\n this._time = time;\n this._point = point || curve.getPointAtTime(time);\n this._overlap = _overlap;\n this._distance = _distance;\n this._intersection = this._next = this._previous = null;\n },\n _setPath: function _setPath(path) {\n this._path = path;\n this._version = path ? path._version : 0;\n },\n _setCurve: function _setCurve(curve) {\n this._setPath(curve._path);\n\n this._curve = curve;\n this._segment = null;\n this._segment1 = curve._segment1;\n this._segment2 = curve._segment2;\n },\n _setSegment: function _setSegment(segment) {\n var curve = segment.getCurve();\n\n if (curve) {\n this._setCurve(curve);\n } else {\n this._setPath(segment._path);\n\n this._segment1 = segment;\n this._segment2 = null;\n }\n\n this._segment = segment;\n this._time = segment === this._segment1 ? 0 : 1;\n this._point = segment._point.clone();\n },\n getSegment: function getSegment() {\n var segment = this._segment;\n\n if (!segment) {\n var curve = this.getCurve(),\n time = this.getTime();\n\n if (time === 0) {\n segment = curve._segment1;\n } else if (time === 1) {\n segment = curve._segment2;\n } else if (time != null) {\n segment = curve.getPartLength(0, time) < curve.getPartLength(time, 1) ? curve._segment1 : curve._segment2;\n }\n\n this._segment = segment;\n }\n\n return segment;\n },\n getCurve: function getCurve() {\n var path = this._path,\n that = this;\n\n if (path && path._version !== this._version) {\n this._time = this._offset = this._curveOffset = this._curve = null;\n }\n\n function trySegment(segment) {\n var curve = segment && segment.getCurve();\n\n if (curve && (that._time = curve.getTimeOf(that._point)) != null) {\n that._setCurve(curve);\n\n return curve;\n }\n }\n\n return this._curve || trySegment(this._segment) || trySegment(this._segment1) || trySegment(this._segment2.getPrevious());\n },\n getPath: function getPath() {\n var curve = this.getCurve();\n return curve && curve._path;\n },\n getIndex: function getIndex() {\n var curve = this.getCurve();\n return curve && curve.getIndex();\n },\n getTime: function getTime() {\n var curve = this.getCurve(),\n time = this._time;\n return curve && time == null ? this._time = curve.getTimeOf(this._point) : time;\n },\n getParameter: '#getTime',\n getPoint: function getPoint() {\n return this._point;\n },\n getOffset: function getOffset() {\n var offset = this._offset;\n\n if (offset == null) {\n offset = 0;\n var path = this.getPath(),\n index = this.getIndex();\n\n if (path && index != null) {\n var curves = path.getCurves();\n\n for (var i = 0; i < index; i++) {\n offset += curves[i].getLength();\n }\n }\n\n this._offset = offset += this.getCurveOffset();\n }\n\n return offset;\n },\n getCurveOffset: function getCurveOffset() {\n var offset = this._curveOffset;\n\n if (offset == null) {\n var curve = this.getCurve(),\n time = this.getTime();\n this._curveOffset = offset = time != null && curve && curve.getPartLength(0, time);\n }\n\n return offset;\n },\n getIntersection: function getIntersection() {\n return this._intersection;\n },\n getDistance: function getDistance() {\n return this._distance;\n },\n divide: function divide() {\n var curve = this.getCurve(),\n res = curve && curve.divideAtTime(this.getTime());\n\n if (res) {\n this._setSegment(res._segment1);\n }\n\n return res;\n },\n split: function split() {\n var curve = this.getCurve(),\n path = curve._path,\n res = curve && curve.splitAtTime(this.getTime());\n\n if (res) {\n this._setSegment(path.getLastSegment());\n }\n\n return res;\n },\n equals: function equals(loc, _ignoreOther) {\n var res = this === loc;\n\n if (!res && loc instanceof CurveLocation) {\n var c1 = this.getCurve(),\n c2 = loc.getCurve(),\n p1 = c1._path,\n p2 = c2._path;\n\n if (p1 === p2) {\n var abs = Math.abs,\n epsilon = 1e-7,\n diff = abs(this.getOffset() - loc.getOffset()),\n i1 = !_ignoreOther && this._intersection,\n i2 = !_ignoreOther && loc._intersection;\n res = (diff < epsilon || p1 && abs(p1.getLength() - diff) < epsilon) && (!i1 && !i2 || i1 && i2 && i1.equals(i2, true));\n }\n }\n\n return res;\n },\n toString: function toString() {\n var parts = [],\n point = this.getPoint(),\n f = Formatter.instance;\n if (point) parts.push('point: ' + point);\n var index = this.getIndex();\n if (index != null) parts.push('index: ' + index);\n var time = this.getTime();\n if (time != null) parts.push('time: ' + f.number(time));\n if (this._distance != null) parts.push('distance: ' + f.number(this._distance));\n return '{ ' + parts.join(', ') + ' }';\n },\n isTouching: function isTouching() {\n var inter = this._intersection;\n\n if (inter && this.getTangent().isCollinear(inter.getTangent())) {\n var curve1 = this.getCurve(),\n curve2 = inter.getCurve();\n return !(curve1.isStraight() && curve2.isStraight() && curve1.getLine().intersect(curve2.getLine()));\n }\n\n return false;\n },\n isCrossing: function isCrossing() {\n var inter = this._intersection;\n if (!inter) return false;\n var t1 = this.getTime(),\n t2 = inter.getTime(),\n tMin = 1e-8,\n tMax = 1 - tMin,\n t1Inside = t1 >= tMin && t1 <= tMax,\n t2Inside = t2 >= tMin && t2 <= tMax;\n if (t1Inside && t2Inside) return !this.isTouching();\n var c2 = this.getCurve(),\n c1 = c2 && t1 < tMin ? c2.getPrevious() : c2,\n c4 = inter.getCurve(),\n c3 = c4 && t2 < tMin ? c4.getPrevious() : c4;\n if (t1 > tMax) c2 = c2.getNext();\n if (t2 > tMax) c4 = c4.getNext();\n if (!c1 || !c2 || !c3 || !c4) return false;\n var offsets = [];\n\n function addOffsets(curve, end) {\n var v = curve.getValues(),\n roots = Curve.classify(v).roots || Curve.getPeaks(v),\n count = roots.length,\n offset = Curve.getLength(v, end && count ? roots[count - 1] : 0, !end && count ? roots[0] : 1);\n offsets.push(count ? offset : offset / 32);\n }\n\n function isInRange(angle, min, max) {\n return min < max ? angle > min && angle < max : angle > min || angle < max;\n }\n\n if (!t1Inside) {\n addOffsets(c1, true);\n addOffsets(c2, false);\n }\n\n if (!t2Inside) {\n addOffsets(c3, true);\n addOffsets(c4, false);\n }\n\n var pt = this.getPoint(),\n offset = Math.min.apply(Math, offsets),\n v2 = t1Inside ? c2.getTangentAtTime(t1) : c2.getPointAt(offset).subtract(pt),\n v1 = t1Inside ? v2.negate() : c1.getPointAt(-offset).subtract(pt),\n v4 = t2Inside ? c4.getTangentAtTime(t2) : c4.getPointAt(offset).subtract(pt),\n v3 = t2Inside ? v4.negate() : c3.getPointAt(-offset).subtract(pt),\n a1 = v1.getAngle(),\n a2 = v2.getAngle(),\n a3 = v3.getAngle(),\n a4 = v4.getAngle();\n return !!(t1Inside ? isInRange(a1, a3, a4) ^ isInRange(a2, a3, a4) && isInRange(a1, a4, a3) ^ isInRange(a2, a4, a3) : isInRange(a3, a1, a2) ^ isInRange(a4, a1, a2) && isInRange(a3, a2, a1) ^ isInRange(a4, a2, a1));\n },\n hasOverlap: function hasOverlap() {\n return !!this._overlap;\n }\n }, Base.each(Curve._evaluateMethods, function (name) {\n var get = name + 'At';\n\n this[name] = function () {\n var curve = this.getCurve(),\n time = this.getTime();\n return time != null && curve && curve[get](time, true);\n };\n }, {\n preserve: true\n }), new function () {\n function insert(locations, loc, merge) {\n var length = locations.length,\n l = 0,\n r = length - 1;\n\n function search(index, dir) {\n for (var i = index + dir; i >= -1 && i <= length; i += dir) {\n var loc2 = locations[(i % length + length) % length];\n if (!loc.getPoint().isClose(loc2.getPoint(), 1e-7)) break;\n if (loc.equals(loc2)) return loc2;\n }\n\n return null;\n }\n\n while (l <= r) {\n var m = l + r >>> 1,\n loc2 = locations[m],\n found;\n\n if (merge && (found = loc.equals(loc2) ? loc2 : search(m, -1) || search(m, 1))) {\n if (loc._overlap) {\n found._overlap = found._intersection._overlap = true;\n }\n\n return found;\n }\n\n var path1 = loc.getPath(),\n path2 = loc2.getPath(),\n diff = path1 !== path2 ? path1._id - path2._id : loc.getIndex() + loc.getTime() - (loc2.getIndex() + loc2.getTime());\n\n if (diff < 0) {\n r = m - 1;\n } else {\n l = m + 1;\n }\n }\n\n locations.splice(l, 0, loc);\n return loc;\n }\n\n return {\n statics: {\n insert: insert,\n expand: function expand(locations) {\n var expanded = locations.slice();\n\n for (var i = locations.length - 1; i >= 0; i--) {\n insert(expanded, locations[i]._intersection, false);\n }\n\n return expanded;\n }\n }\n };\n }());\n var PathItem = Item.extend({\n _class: 'PathItem',\n _selectBounds: false,\n _canScaleStroke: true,\n beans: true,\n initialize: function PathItem() {},\n statics: {\n create: function create(arg) {\n var data, segments, compound;\n\n if (Base.isPlainObject(arg)) {\n segments = arg.segments;\n data = arg.pathData;\n } else if (Array.isArray(arg)) {\n segments = arg;\n } else if (typeof arg === 'string') {\n data = arg;\n }\n\n if (segments) {\n var first = segments[0];\n compound = first && Array.isArray(first[0]);\n } else if (data) {\n compound = (data.match(/m/gi) || []).length > 1 || /z\\s*\\S+/i.test(data);\n }\n\n var ctor = compound ? CompoundPath : Path;\n return new ctor(arg);\n }\n },\n _asPathItem: function _asPathItem() {\n return this;\n },\n isClockwise: function isClockwise() {\n return this.getArea() >= 0;\n },\n setClockwise: function setClockwise(clockwise) {\n if (this.isClockwise() != (clockwise = !!clockwise)) this.reverse();\n },\n setPathData: function setPathData(data) {\n var parts = data && data.match(/[mlhvcsqtaz][^mlhvcsqtaz]*/ig),\n coords,\n relative = false,\n previous,\n control,\n current = new Point(),\n start = new Point();\n\n function getCoord(index, coord) {\n var val = +coords[index];\n if (relative) val += current[coord];\n return val;\n }\n\n function getPoint(index) {\n return new Point(getCoord(index, 'x'), getCoord(index + 1, 'y'));\n }\n\n this.clear();\n\n for (var i = 0, l = parts && parts.length; i < l; i++) {\n var part = parts[i],\n command = part[0],\n lower = command.toLowerCase();\n coords = part.match(/[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g);\n var length = coords && coords.length;\n relative = command === lower;\n if (previous === 'z' && !/[mz]/.test(lower)) this.moveTo(current);\n\n switch (lower) {\n case 'm':\n case 'l':\n var move = lower === 'm';\n\n for (var j = 0; j < length; j += 2) {\n this[move ? 'moveTo' : 'lineTo'](current = getPoint(j));\n\n if (move) {\n start = current;\n move = false;\n }\n }\n\n control = current;\n break;\n\n case 'h':\n case 'v':\n var coord = lower === 'h' ? 'x' : 'y';\n current = current.clone();\n\n for (var j = 0; j < length; j++) {\n current[coord] = getCoord(j, coord);\n this.lineTo(current);\n }\n\n control = current;\n break;\n\n case 'c':\n for (var j = 0; j < length; j += 6) {\n this.cubicCurveTo(getPoint(j), control = getPoint(j + 2), current = getPoint(j + 4));\n }\n\n break;\n\n case 's':\n for (var j = 0; j < length; j += 4) {\n this.cubicCurveTo(/[cs]/.test(previous) ? current.multiply(2).subtract(control) : current, control = getPoint(j), current = getPoint(j + 2));\n previous = lower;\n }\n\n break;\n\n case 'q':\n for (var j = 0; j < length; j += 4) {\n this.quadraticCurveTo(control = getPoint(j), current = getPoint(j + 2));\n }\n\n break;\n\n case 't':\n for (var j = 0; j < length; j += 2) {\n this.quadraticCurveTo(control = /[qt]/.test(previous) ? current.multiply(2).subtract(control) : current, current = getPoint(j));\n previous = lower;\n }\n\n break;\n\n case 'a':\n for (var j = 0; j < length; j += 7) {\n this.arcTo(current = getPoint(j + 5), new Size(+coords[j], +coords[j + 1]), +coords[j + 2], +coords[j + 4], +coords[j + 3]);\n }\n\n break;\n\n case 'z':\n this.closePath(1e-12);\n current = start;\n break;\n }\n\n previous = lower;\n }\n },\n _canComposite: function _canComposite() {\n return !(this.hasFill() && this.hasStroke());\n },\n _contains: function _contains(point) {\n var winding = point.isInside(this.getBounds({\n internal: true,\n handle: true\n })) ? this._getWinding(point) : {};\n return winding.onPath || !!(this.getFillRule() === 'evenodd' ? winding.windingL & 1 || winding.windingR & 1 : winding.winding);\n },\n getIntersections: function getIntersections(path, include, _matrix, _returnFirst) {\n var self = this === path || !path,\n matrix1 = this._matrix._orNullIfIdentity(),\n matrix2 = self ? matrix1 : (_matrix || path._matrix)._orNullIfIdentity();\n\n return self || this.getBounds(matrix1).intersects(path.getBounds(matrix2), 1e-12) ? Curve.getIntersections(this.getCurves(), !self && path.getCurves(), include, matrix1, matrix2, _returnFirst) : [];\n },\n getCrossings: function getCrossings(path) {\n return this.getIntersections(path, function (inter) {\n return inter.isCrossing();\n });\n },\n getNearestLocation: function getNearestLocation() {\n var point = Point.read(arguments),\n curves = this.getCurves(),\n minDist = Infinity,\n minLoc = null;\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var loc = curves[i].getNearestLocation(point);\n\n if (loc._distance < minDist) {\n minDist = loc._distance;\n minLoc = loc;\n }\n }\n\n return minLoc;\n },\n getNearestPoint: function getNearestPoint() {\n var loc = this.getNearestLocation.apply(this, arguments);\n return loc ? loc.getPoint() : loc;\n },\n interpolate: function interpolate(from, to, factor) {\n var isPath = !this._children,\n name = isPath ? '_segments' : '_children',\n itemsFrom = from[name],\n itemsTo = to[name],\n items = this[name];\n\n if (!itemsFrom || !itemsTo || itemsFrom.length !== itemsTo.length) {\n throw new Error('Invalid operands in interpolate() call: ' + from + ', ' + to);\n }\n\n var current = items.length,\n length = itemsTo.length;\n\n if (current < length) {\n var ctor = isPath ? Segment : Path;\n\n for (var i = current; i < length; i++) {\n this.add(new ctor());\n }\n } else if (current > length) {\n this[isPath ? 'removeSegments' : 'removeChildren'](length, current);\n }\n\n for (var i = 0; i < length; i++) {\n items[i].interpolate(itemsFrom[i], itemsTo[i], factor);\n }\n\n if (isPath) {\n this.setClosed(from._closed);\n\n this._changed(9);\n }\n },\n compare: function compare(path) {\n var ok = false;\n\n if (path) {\n var paths1 = this._children || [this],\n paths2 = path._children ? path._children.slice() : [path],\n length1 = paths1.length,\n length2 = paths2.length,\n matched = [],\n count = 0;\n ok = true;\n var boundsOverlaps = CollisionDetection.findItemBoundsCollisions(paths1, paths2, Numerical.GEOMETRIC_EPSILON);\n\n for (var i1 = length1 - 1; i1 >= 0 && ok; i1--) {\n var path1 = paths1[i1];\n ok = false;\n var pathBoundsOverlaps = boundsOverlaps[i1];\n\n if (pathBoundsOverlaps) {\n for (var i2 = pathBoundsOverlaps.length - 1; i2 >= 0 && !ok; i2--) {\n if (path1.compare(paths2[pathBoundsOverlaps[i2]])) {\n if (!matched[pathBoundsOverlaps[i2]]) {\n matched[pathBoundsOverlaps[i2]] = true;\n count++;\n }\n\n ok = true;\n }\n }\n }\n }\n\n ok = ok && count === length2;\n }\n\n return ok;\n }\n });\n var Path = PathItem.extend({\n _class: 'Path',\n _serializeFields: {\n segments: [],\n closed: false\n },\n initialize: function Path(arg) {\n this._closed = false;\n this._segments = [];\n this._version = 0;\n var args = arguments,\n segments = Array.isArray(arg) ? typeof arg[0] === 'object' ? arg : args : arg && arg.size === undefined && (arg.x !== undefined || arg.point !== undefined) ? args : null;\n\n if (segments && segments.length > 0) {\n this.setSegments(segments);\n } else {\n this._curves = undefined;\n this._segmentSelection = 0;\n\n if (!segments && typeof arg === 'string') {\n this.setPathData(arg);\n arg = null;\n }\n }\n\n this._initialize(!segments && arg);\n },\n _equals: function _equals(item) {\n return this._closed === item._closed && Base.equals(this._segments, item._segments);\n },\n copyContent: function copyContent(source) {\n this.setSegments(source._segments);\n this._closed = source._closed;\n },\n _changed: function _changed(flags) {\n _changed.base.call(this, flags);\n\n if (flags & 8) {\n this._length = this._area = undefined;\n\n if (flags & 32) {\n this._version++;\n } else if (this._curves) {\n for (var i = 0, l = this._curves.length; i < l; i++) {\n this._curves[i]._changed();\n }\n }\n } else if (flags & 64) {\n this._bounds = undefined;\n }\n },\n getStyle: function getStyle() {\n var parent = this._parent;\n return (parent instanceof CompoundPath ? parent : this)._style;\n },\n getSegments: function getSegments() {\n return this._segments;\n },\n setSegments: function setSegments(segments) {\n var fullySelected = this.isFullySelected(),\n length = segments && segments.length;\n this._segments.length = 0;\n this._segmentSelection = 0;\n this._curves = undefined;\n\n if (length) {\n var last = segments[length - 1];\n\n if (typeof last === 'boolean') {\n this.setClosed(last);\n length--;\n }\n\n this._add(Segment.readList(segments, 0, {}, length));\n }\n\n if (fullySelected) this.setFullySelected(true);\n },\n getFirstSegment: function getFirstSegment() {\n return this._segments[0];\n },\n getLastSegment: function getLastSegment() {\n return this._segments[this._segments.length - 1];\n },\n getCurves: function getCurves() {\n var curves = this._curves,\n segments = this._segments;\n\n if (!curves) {\n var length = this._countCurves();\n\n curves = this._curves = new Array(length);\n\n for (var i = 0; i < length; i++) {\n curves[i] = new Curve(this, segments[i], segments[i + 1] || segments[0]);\n }\n }\n\n return curves;\n },\n getFirstCurve: function getFirstCurve() {\n return this.getCurves()[0];\n },\n getLastCurve: function getLastCurve() {\n var curves = this.getCurves();\n return curves[curves.length - 1];\n },\n isClosed: function isClosed() {\n return this._closed;\n },\n setClosed: function setClosed(closed) {\n if (this._closed != (closed = !!closed)) {\n this._closed = closed;\n\n if (this._curves) {\n var length = this._curves.length = this._countCurves();\n\n if (closed) this._curves[length - 1] = new Curve(this, this._segments[length - 1], this._segments[0]);\n }\n\n this._changed(41);\n }\n }\n }, {\n beans: true,\n getPathData: function getPathData(_matrix, _precision) {\n var segments = this._segments,\n length = segments.length,\n f = new Formatter(_precision),\n coords = new Array(6),\n first = true,\n curX,\n curY,\n prevX,\n prevY,\n inX,\n inY,\n outX,\n outY,\n parts = [];\n\n function addSegment(segment, skipLine) {\n segment._transformCoordinates(_matrix, coords);\n\n curX = coords[0];\n curY = coords[1];\n\n if (first) {\n parts.push('M' + f.pair(curX, curY));\n first = false;\n } else {\n inX = coords[2];\n inY = coords[3];\n\n if (inX === curX && inY === curY && outX === prevX && outY === prevY) {\n if (!skipLine) {\n var dx = curX - prevX,\n dy = curY - prevY;\n parts.push(dx === 0 ? 'v' + f.number(dy) : dy === 0 ? 'h' + f.number(dx) : 'l' + f.pair(dx, dy));\n }\n } else {\n parts.push('c' + f.pair(outX - prevX, outY - prevY) + ' ' + f.pair(inX - prevX, inY - prevY) + ' ' + f.pair(curX - prevX, curY - prevY));\n }\n }\n\n prevX = curX;\n prevY = curY;\n outX = coords[4];\n outY = coords[5];\n }\n\n if (!length) return '';\n\n for (var i = 0; i < length; i++) {\n addSegment(segments[i]);\n }\n\n if (this._closed && length > 0) {\n addSegment(segments[0], true);\n parts.push('z');\n }\n\n return parts.join('');\n },\n isEmpty: function isEmpty() {\n return !this._segments.length;\n },\n _transformContent: function _transformContent(matrix) {\n var segments = this._segments,\n coords = new Array(6);\n\n for (var i = 0, l = segments.length; i < l; i++) {\n segments[i]._transformCoordinates(matrix, coords, true);\n }\n\n return true;\n },\n _add: function _add(segs, index) {\n var segments = this._segments,\n curves = this._curves,\n amount = segs.length,\n append = index == null,\n index = append ? segments.length : index;\n\n for (var i = 0; i < amount; i++) {\n var segment = segs[i];\n if (segment._path) segment = segs[i] = segment.clone();\n segment._path = this;\n segment._index = index + i;\n if (segment._selection) this._updateSelection(segment, 0, segment._selection);\n }\n\n if (append) {\n Base.push(segments, segs);\n } else {\n segments.splice.apply(segments, [index, 0].concat(segs));\n\n for (var i = index + amount, l = segments.length; i < l; i++) {\n segments[i]._index = i;\n }\n }\n\n if (curves) {\n var total = this._countCurves(),\n start = index > 0 && index + amount - 1 === total ? index - 1 : index,\n insert = start,\n end = Math.min(start + amount, total);\n\n if (segs._curves) {\n curves.splice.apply(curves, [start, 0].concat(segs._curves));\n insert += segs._curves.length;\n }\n\n for (var i = insert; i < end; i++) {\n curves.splice(i, 0, new Curve(this, null, null));\n }\n\n this._adjustCurves(start, end);\n }\n\n this._changed(41);\n\n return segs;\n },\n _adjustCurves: function _adjustCurves(start, end) {\n var segments = this._segments,\n curves = this._curves,\n curve;\n\n for (var i = start; i < end; i++) {\n curve = curves[i];\n curve._path = this;\n curve._segment1 = segments[i];\n curve._segment2 = segments[i + 1] || segments[0];\n\n curve._changed();\n }\n\n if (curve = curves[this._closed && !start ? segments.length - 1 : start - 1]) {\n curve._segment2 = segments[start] || segments[0];\n\n curve._changed();\n }\n\n if (curve = curves[end]) {\n curve._segment1 = segments[end];\n\n curve._changed();\n }\n },\n _countCurves: function _countCurves() {\n var length = this._segments.length;\n return !this._closed && length > 0 ? length - 1 : length;\n },\n add: function add(segment1) {\n var args = arguments;\n return args.length > 1 && typeof segment1 !== 'number' ? this._add(Segment.readList(args)) : this._add([Segment.read(args)])[0];\n },\n insert: function insert(index, segment1) {\n var args = arguments;\n return args.length > 2 && typeof segment1 !== 'number' ? this._add(Segment.readList(args, 1), index) : this._add([Segment.read(args, 1)], index)[0];\n },\n addSegment: function addSegment() {\n return this._add([Segment.read(arguments)])[0];\n },\n insertSegment: function insertSegment(index) {\n return this._add([Segment.read(arguments, 1)], index)[0];\n },\n addSegments: function addSegments(segments) {\n return this._add(Segment.readList(segments));\n },\n insertSegments: function insertSegments(index, segments) {\n return this._add(Segment.readList(segments), index);\n },\n removeSegment: function removeSegment(index) {\n return this.removeSegments(index, index + 1)[0] || null;\n },\n removeSegments: function removeSegments(start, end, _includeCurves) {\n start = start || 0;\n end = Base.pick(end, this._segments.length);\n var segments = this._segments,\n curves = this._curves,\n count = segments.length,\n removed = segments.splice(start, end - start),\n amount = removed.length;\n if (!amount) return removed;\n\n for (var i = 0; i < amount; i++) {\n var segment = removed[i];\n if (segment._selection) this._updateSelection(segment, segment._selection, 0);\n segment._index = segment._path = null;\n }\n\n for (var i = start, l = segments.length; i < l; i++) {\n segments[i]._index = i;\n }\n\n if (curves) {\n var index = start > 0 && end === count + (this._closed ? 1 : 0) ? start - 1 : start,\n curves = curves.splice(index, amount);\n\n for (var i = curves.length - 1; i >= 0; i--) {\n curves[i]._path = null;\n }\n\n if (_includeCurves) removed._curves = curves.slice(1);\n\n this._adjustCurves(index, index);\n }\n\n this._changed(41);\n\n return removed;\n },\n clear: '#removeSegments',\n hasHandles: function hasHandles() {\n var segments = this._segments;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n if (segments[i].hasHandles()) return true;\n }\n\n return false;\n },\n clearHandles: function clearHandles() {\n var segments = this._segments;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n segments[i].clearHandles();\n }\n },\n getLength: function getLength() {\n if (this._length == null) {\n var curves = this.getCurves(),\n length = 0;\n\n for (var i = 0, l = curves.length; i < l; i++) {\n length += curves[i].getLength();\n }\n\n this._length = length;\n }\n\n return this._length;\n },\n getArea: function getArea() {\n var area = this._area;\n\n if (area == null) {\n var segments = this._segments,\n closed = this._closed;\n area = 0;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var last = i + 1 === l;\n area += Curve.getArea(Curve.getValues(segments[i], segments[last ? 0 : i + 1], null, last && !closed));\n }\n\n this._area = area;\n }\n\n return area;\n },\n isFullySelected: function isFullySelected() {\n var length = this._segments.length;\n return this.isSelected() && length > 0 && this._segmentSelection === length * 7;\n },\n setFullySelected: function setFullySelected(selected) {\n if (selected) this._selectSegments(true);\n this.setSelected(selected);\n },\n setSelection: function setSelection(selection) {\n if (!(selection & 1)) this._selectSegments(false);\n setSelection.base.call(this, selection);\n },\n _selectSegments: function _selectSegments(selected) {\n var segments = this._segments,\n length = segments.length,\n selection = selected ? 7 : 0;\n this._segmentSelection = selection * length;\n\n for (var i = 0; i < length; i++) {\n segments[i]._selection = selection;\n }\n },\n _updateSelection: function _updateSelection(segment, oldSelection, newSelection) {\n segment._selection = newSelection;\n var selection = this._segmentSelection += newSelection - oldSelection;\n if (selection > 0) this.setSelected(true);\n },\n divideAt: function divideAt(location) {\n var loc = this.getLocationAt(location),\n curve;\n return loc && (curve = loc.getCurve().divideAt(loc.getCurveOffset())) ? curve._segment1 : null;\n },\n splitAt: function splitAt(location) {\n var loc = this.getLocationAt(location),\n index = loc && loc.index,\n time = loc && loc.time,\n tMin = 1e-8,\n tMax = 1 - tMin;\n\n if (time > tMax) {\n index++;\n time = 0;\n }\n\n var curves = this.getCurves();\n\n if (index >= 0 && index < curves.length) {\n if (time >= tMin) {\n curves[index++].divideAtTime(time);\n }\n\n var segs = this.removeSegments(index, this._segments.length, true),\n path;\n\n if (this._closed) {\n this.setClosed(false);\n path = this;\n } else {\n path = new Path(Item.NO_INSERT);\n path.insertAbove(this);\n path.copyAttributes(this);\n }\n\n path._add(segs, 0);\n\n this.addSegment(segs[0]);\n return path;\n }\n\n return null;\n },\n split: function split(index, time) {\n var curve,\n location = time === undefined ? index : (curve = this.getCurves()[index]) && curve.getLocationAtTime(time);\n return location != null ? this.splitAt(location) : null;\n },\n join: function join(path, tolerance) {\n var epsilon = tolerance || 0;\n\n if (path && path !== this) {\n var segments = path._segments,\n last1 = this.getLastSegment(),\n last2 = path.getLastSegment();\n if (!last2) return this;\n if (last1 && last1._point.isClose(last2._point, epsilon)) path.reverse();\n var first2 = path.getFirstSegment();\n\n if (last1 && last1._point.isClose(first2._point, epsilon)) {\n last1.setHandleOut(first2._handleOut);\n\n this._add(segments.slice(1));\n } else {\n var first1 = this.getFirstSegment();\n if (first1 && first1._point.isClose(first2._point, epsilon)) path.reverse();\n last2 = path.getLastSegment();\n\n if (first1 && first1._point.isClose(last2._point, epsilon)) {\n first1.setHandleIn(last2._handleIn);\n\n this._add(segments.slice(0, segments.length - 1), 0);\n } else {\n this._add(segments.slice());\n }\n }\n\n if (path._closed) this._add([segments[0]]);\n path.remove();\n }\n\n var first = this.getFirstSegment(),\n last = this.getLastSegment();\n\n if (first !== last && first._point.isClose(last._point, epsilon)) {\n first.setHandleIn(last._handleIn);\n last.remove();\n this.setClosed(true);\n }\n\n return this;\n },\n reduce: function reduce(options) {\n var curves = this.getCurves(),\n simplify = options && options.simplify,\n tolerance = simplify ? 1e-7 : 0;\n\n for (var i = curves.length - 1; i >= 0; i--) {\n var curve = curves[i];\n if (!curve.hasHandles() && (!curve.hasLength(tolerance) || simplify && curve.isCollinear(curve.getNext()))) curve.remove();\n }\n\n return this;\n },\n reverse: function reverse() {\n this._segments.reverse();\n\n for (var i = 0, l = this._segments.length; i < l; i++) {\n var segment = this._segments[i];\n var handleIn = segment._handleIn;\n segment._handleIn = segment._handleOut;\n segment._handleOut = handleIn;\n segment._index = i;\n }\n\n this._curves = null;\n\n this._changed(9);\n },\n flatten: function flatten(flatness) {\n var flattener = new PathFlattener(this, flatness || 0.25, 256, true),\n parts = flattener.parts,\n length = parts.length,\n segments = [];\n\n for (var i = 0; i < length; i++) {\n segments.push(new Segment(parts[i].curve.slice(0, 2)));\n }\n\n if (!this._closed && length > 0) {\n segments.push(new Segment(parts[length - 1].curve.slice(6)));\n }\n\n this.setSegments(segments);\n },\n simplify: function simplify(tolerance) {\n var segments = new PathFitter(this).fit(tolerance || 2.5);\n if (segments) this.setSegments(segments);\n return !!segments;\n },\n smooth: function smooth(options) {\n var that = this,\n opts = options || {},\n type = opts.type || 'asymmetric',\n segments = this._segments,\n length = segments.length,\n closed = this._closed;\n\n function getIndex(value, _default) {\n var index = value && value.index;\n\n if (index != null) {\n var path = value.path;\n if (path && path !== that) throw new Error(value._class + ' ' + index + ' of ' + path + ' is not part of ' + that);\n if (_default && value instanceof Curve) index++;\n } else {\n index = typeof value === 'number' ? value : _default;\n }\n\n return Math.min(index < 0 && closed ? index % length : index < 0 ? index + length : index, length - 1);\n }\n\n var loop = closed && opts.from === undefined && opts.to === undefined,\n from = getIndex(opts.from, 0),\n to = getIndex(opts.to, length - 1);\n\n if (from > to) {\n if (closed) {\n from -= length;\n } else {\n var tmp = from;\n from = to;\n to = tmp;\n }\n }\n\n if (/^(?:asymmetric|continuous)$/.test(type)) {\n var asymmetric = type === 'asymmetric',\n min = Math.min,\n amount = to - from + 1,\n n = amount - 1,\n padding = loop ? min(amount, 4) : 1,\n paddingLeft = padding,\n paddingRight = padding,\n knots = [];\n\n if (!closed) {\n paddingLeft = min(1, from);\n paddingRight = min(1, length - to - 1);\n }\n\n n += paddingLeft + paddingRight;\n if (n <= 1) return;\n\n for (var i = 0, j = from - paddingLeft; i <= n; i++, j++) {\n knots[i] = segments[(j < 0 ? j + length : j) % length]._point;\n }\n\n var x = knots[0]._x + 2 * knots[1]._x,\n y = knots[0]._y + 2 * knots[1]._y,\n f = 2,\n n_1 = n - 1,\n rx = [x],\n ry = [y],\n rf = [f],\n px = [],\n py = [];\n\n for (var i = 1; i < n; i++) {\n var internal = i < n_1,\n a = internal ? 1 : asymmetric ? 1 : 2,\n b = internal ? 4 : asymmetric ? 2 : 7,\n u = internal ? 4 : asymmetric ? 3 : 8,\n v = internal ? 2 : asymmetric ? 0 : 1,\n m = a / f;\n f = rf[i] = b - m;\n x = rx[i] = u * knots[i]._x + v * knots[i + 1]._x - m * x;\n y = ry[i] = u * knots[i]._y + v * knots[i + 1]._y - m * y;\n }\n\n px[n_1] = rx[n_1] / rf[n_1];\n py[n_1] = ry[n_1] / rf[n_1];\n\n for (var i = n - 2; i >= 0; i--) {\n px[i] = (rx[i] - px[i + 1]) / rf[i];\n py[i] = (ry[i] - py[i + 1]) / rf[i];\n }\n\n px[n] = (3 * knots[n]._x - px[n_1]) / 2;\n py[n] = (3 * knots[n]._y - py[n_1]) / 2;\n\n for (var i = paddingLeft, max = n - paddingRight, j = from; i <= max; i++, j++) {\n var segment = segments[j < 0 ? j + length : j],\n pt = segment._point,\n hx = px[i] - pt._x,\n hy = py[i] - pt._y;\n if (loop || i < max) segment.setHandleOut(hx, hy);\n if (loop || i > paddingLeft) segment.setHandleIn(-hx, -hy);\n }\n } else {\n for (var i = from; i <= to; i++) {\n segments[i < 0 ? i + length : i].smooth(opts, !loop && i === from, !loop && i === to);\n }\n }\n },\n toShape: function toShape(insert) {\n if (!this._closed) return null;\n var segments = this._segments,\n type,\n size,\n radius,\n topCenter;\n\n function isCollinear(i, j) {\n var seg1 = segments[i],\n seg2 = seg1.getNext(),\n seg3 = segments[j],\n seg4 = seg3.getNext();\n return seg1._handleOut.isZero() && seg2._handleIn.isZero() && seg3._handleOut.isZero() && seg4._handleIn.isZero() && seg2._point.subtract(seg1._point).isCollinear(seg4._point.subtract(seg3._point));\n }\n\n function isOrthogonal(i) {\n var seg2 = segments[i],\n seg1 = seg2.getPrevious(),\n seg3 = seg2.getNext();\n return seg1._handleOut.isZero() && seg2._handleIn.isZero() && seg2._handleOut.isZero() && seg3._handleIn.isZero() && seg2._point.subtract(seg1._point).isOrthogonal(seg3._point.subtract(seg2._point));\n }\n\n function isArc(i) {\n var seg1 = segments[i],\n seg2 = seg1.getNext(),\n handle1 = seg1._handleOut,\n handle2 = seg2._handleIn,\n kappa = 0.5522847498307936;\n\n if (handle1.isOrthogonal(handle2)) {\n var pt1 = seg1._point,\n pt2 = seg2._point,\n corner = new Line(pt1, handle1, true).intersect(new Line(pt2, handle2, true), true);\n return corner && Numerical.isZero(handle1.getLength() / corner.subtract(pt1).getLength() - kappa) && Numerical.isZero(handle2.getLength() / corner.subtract(pt2).getLength() - kappa);\n }\n\n return false;\n }\n\n function getDistance(i, j) {\n return segments[i]._point.getDistance(segments[j]._point);\n }\n\n if (!this.hasHandles() && segments.length === 4 && isCollinear(0, 2) && isCollinear(1, 3) && isOrthogonal(1)) {\n type = Shape.Rectangle;\n size = new Size(getDistance(0, 3), getDistance(0, 1));\n topCenter = segments[1]._point.add(segments[2]._point).divide(2);\n } else if (segments.length === 8 && isArc(0) && isArc(2) && isArc(4) && isArc(6) && isCollinear(1, 5) && isCollinear(3, 7)) {\n type = Shape.Rectangle;\n size = new Size(getDistance(1, 6), getDistance(0, 3));\n radius = size.subtract(new Size(getDistance(0, 7), getDistance(1, 2))).divide(2);\n topCenter = segments[3]._point.add(segments[4]._point).divide(2);\n } else if (segments.length === 4 && isArc(0) && isArc(1) && isArc(2) && isArc(3)) {\n if (Numerical.isZero(getDistance(0, 2) - getDistance(1, 3))) {\n type = Shape.Circle;\n radius = getDistance(0, 2) / 2;\n } else {\n type = Shape.Ellipse;\n radius = new Size(getDistance(2, 0) / 2, getDistance(3, 1) / 2);\n }\n\n topCenter = segments[1]._point;\n }\n\n if (type) {\n var center = this.getPosition(true),\n shape = new type({\n center: center,\n size: size,\n radius: radius,\n insert: false\n });\n shape.copyAttributes(this, true);\n\n shape._matrix.prepend(this._matrix);\n\n shape.rotate(topCenter.subtract(center).getAngle() + 90);\n if (insert === undefined || insert) shape.insertAbove(this);\n return shape;\n }\n\n return null;\n },\n toPath: '#clone',\n compare: function compare(path) {\n if (!path || path instanceof CompoundPath) return compare.base.call(this, path);\n var curves1 = this.getCurves(),\n curves2 = path.getCurves(),\n length1 = curves1.length,\n length2 = curves2.length;\n\n if (!length1 || !length2) {\n return length1 == length2;\n }\n\n var v1 = curves1[0].getValues(),\n values2 = [],\n pos1 = 0,\n pos2,\n end1 = 0,\n end2;\n\n for (var i = 0; i < length2; i++) {\n var v2 = curves2[i].getValues();\n values2.push(v2);\n var overlaps = Curve.getOverlaps(v1, v2);\n\n if (overlaps) {\n pos2 = !i && overlaps[0][0] > 0 ? length2 - 1 : i;\n end2 = overlaps[0][1];\n break;\n }\n }\n\n var abs = Math.abs,\n epsilon = 1e-8,\n v2 = values2[pos2],\n start2;\n\n while (v1 && v2) {\n var overlaps = Curve.getOverlaps(v1, v2);\n\n if (overlaps) {\n var t1 = overlaps[0][0];\n\n if (abs(t1 - end1) < epsilon) {\n end1 = overlaps[1][0];\n\n if (end1 === 1) {\n v1 = ++pos1 < length1 ? curves1[pos1].getValues() : null;\n end1 = 0;\n }\n\n var t2 = overlaps[0][1];\n\n if (abs(t2 - end2) < epsilon) {\n if (!start2) start2 = [pos2, t2];\n end2 = overlaps[1][1];\n\n if (end2 === 1) {\n if (++pos2 >= length2) pos2 = 0;\n v2 = values2[pos2] || curves2[pos2].getValues();\n end2 = 0;\n }\n\n if (!v1) {\n return start2[0] === pos2 && start2[1] === end2;\n }\n\n continue;\n }\n }\n }\n\n break;\n }\n\n return false;\n },\n _hitTestSelf: function _hitTestSelf(point, options, viewMatrix, strokeMatrix) {\n var that = this,\n style = this.getStyle(),\n segments = this._segments,\n numSegments = segments.length,\n closed = this._closed,\n tolerancePadding = options._tolerancePadding,\n strokePadding = tolerancePadding,\n join,\n cap,\n miterLimit,\n area,\n loc,\n res,\n hitStroke = options.stroke && style.hasStroke(),\n hitFill = options.fill && style.hasFill(),\n hitCurves = options.curves,\n strokeRadius = hitStroke ? style.getStrokeWidth() / 2 : hitFill && options.tolerance > 0 || hitCurves ? 0 : null;\n\n if (strokeRadius !== null) {\n if (strokeRadius > 0) {\n join = style.getStrokeJoin();\n cap = style.getStrokeCap();\n miterLimit = style.getMiterLimit();\n strokePadding = strokePadding.add(Path._getStrokePadding(strokeRadius, strokeMatrix));\n } else {\n join = cap = 'round';\n }\n }\n\n function isCloseEnough(pt, padding) {\n return point.subtract(pt).divide(padding).length <= 1;\n }\n\n function checkSegmentPoint(seg, pt, name) {\n if (!options.selected || pt.isSelected()) {\n var anchor = seg._point;\n if (pt !== anchor) pt = pt.add(anchor);\n\n if (isCloseEnough(pt, strokePadding)) {\n return new HitResult(name, that, {\n segment: seg,\n point: pt\n });\n }\n }\n }\n\n function checkSegmentPoints(seg, ends) {\n return (ends || options.segments) && checkSegmentPoint(seg, seg._point, 'segment') || !ends && options.handles && (checkSegmentPoint(seg, seg._handleIn, 'handle-in') || checkSegmentPoint(seg, seg._handleOut, 'handle-out'));\n }\n\n function addToArea(point) {\n area.add(point);\n }\n\n function checkSegmentStroke(segment) {\n var isJoin = closed || segment._index > 0 && segment._index < numSegments - 1;\n\n if ((isJoin ? join : cap) === 'round') {\n return isCloseEnough(segment._point, strokePadding);\n } else {\n area = new Path({\n internal: true,\n closed: true\n });\n\n if (isJoin) {\n if (!segment.isSmooth()) {\n Path._addBevelJoin(segment, join, strokeRadius, miterLimit, null, strokeMatrix, addToArea, true);\n }\n } else if (cap === 'square') {\n Path._addSquareCap(segment, cap, strokeRadius, null, strokeMatrix, addToArea, true);\n }\n\n if (!area.isEmpty()) {\n var loc;\n return area.contains(point) || (loc = area.getNearestLocation(point)) && isCloseEnough(loc.getPoint(), tolerancePadding);\n }\n }\n }\n\n if (options.ends && !options.segments && !closed) {\n if (res = checkSegmentPoints(segments[0], true) || checkSegmentPoints(segments[numSegments - 1], true)) return res;\n } else if (options.segments || options.handles) {\n for (var i = 0; i < numSegments; i++) {\n if (res = checkSegmentPoints(segments[i])) return res;\n }\n }\n\n if (strokeRadius !== null) {\n loc = this.getNearestLocation(point);\n\n if (loc) {\n var time = loc.getTime();\n\n if (time === 0 || time === 1 && numSegments > 1) {\n if (!checkSegmentStroke(loc.getSegment())) loc = null;\n } else if (!isCloseEnough(loc.getPoint(), strokePadding)) {\n loc = null;\n }\n }\n\n if (!loc && join === 'miter' && numSegments > 1) {\n for (var i = 0; i < numSegments; i++) {\n var segment = segments[i];\n\n if (point.getDistance(segment._point) <= miterLimit * strokeRadius && checkSegmentStroke(segment)) {\n loc = segment.getLocation();\n break;\n }\n }\n }\n }\n\n return !loc && hitFill && this._contains(point) || loc && !hitStroke && !hitCurves ? new HitResult('fill', this) : loc ? new HitResult(hitStroke ? 'stroke' : 'curve', this, {\n location: loc,\n point: loc.getPoint()\n }) : null;\n }\n }, Base.each(Curve._evaluateMethods, function (name) {\n this[name + 'At'] = function (offset) {\n var loc = this.getLocationAt(offset);\n return loc && loc[name]();\n };\n }, {\n beans: false,\n getLocationOf: function getLocationOf() {\n var point = Point.read(arguments),\n curves = this.getCurves();\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var loc = curves[i].getLocationOf(point);\n if (loc) return loc;\n }\n\n return null;\n },\n getOffsetOf: function getOffsetOf() {\n var loc = this.getLocationOf.apply(this, arguments);\n return loc ? loc.getOffset() : null;\n },\n getLocationAt: function getLocationAt(offset) {\n if (typeof offset === 'number') {\n var curves = this.getCurves(),\n length = 0;\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var start = length,\n curve = curves[i];\n length += curve.getLength();\n\n if (length > offset) {\n return curve.getLocationAt(offset - start);\n }\n }\n\n if (curves.length > 0 && offset <= this.getLength()) {\n return new CurveLocation(curves[curves.length - 1], 1);\n }\n } else if (offset && offset.getPath && offset.getPath() === this) {\n return offset;\n }\n\n return null;\n },\n getOffsetsWithTangent: function getOffsetsWithTangent() {\n var tangent = Point.read(arguments);\n\n if (tangent.isZero()) {\n return [];\n }\n\n var offsets = [];\n var curveStart = 0;\n var curves = this.getCurves();\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var curve = curves[i];\n var curveTimes = curve.getTimesWithTangent(tangent);\n\n for (var j = 0, m = curveTimes.length; j < m; j++) {\n var offset = curveStart + curve.getOffsetAtTime(curveTimes[j]);\n\n if (offsets.indexOf(offset) < 0) {\n offsets.push(offset);\n }\n }\n\n curveStart += curve.length;\n }\n\n return offsets;\n }\n }), new function () {\n function drawHandles(ctx, segments, matrix, size) {\n if (size <= 0) return;\n var half = size / 2,\n miniSize = size - 2,\n miniHalf = half - 1,\n coords = new Array(6),\n pX,\n pY;\n\n function drawHandle(index) {\n var hX = coords[index],\n hY = coords[index + 1];\n\n if (pX != hX || pY != hY) {\n ctx.beginPath();\n ctx.moveTo(pX, pY);\n ctx.lineTo(hX, hY);\n ctx.stroke();\n ctx.beginPath();\n ctx.arc(hX, hY, half, 0, Math.PI * 2, true);\n ctx.fill();\n }\n }\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i],\n selection = segment._selection;\n\n segment._transformCoordinates(matrix, coords);\n\n pX = coords[0];\n pY = coords[1];\n if (selection & 2) drawHandle(2);\n if (selection & 4) drawHandle(4);\n ctx.fillRect(pX - half, pY - half, size, size);\n\n if (miniSize > 0 && !(selection & 1)) {\n var fillStyle = ctx.fillStyle;\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(pX - miniHalf, pY - miniHalf, miniSize, miniSize);\n ctx.fillStyle = fillStyle;\n }\n }\n }\n\n function drawSegments(ctx, path, matrix) {\n var segments = path._segments,\n length = segments.length,\n coords = new Array(6),\n first = true,\n curX,\n curY,\n prevX,\n prevY,\n inX,\n inY,\n outX,\n outY;\n\n function drawSegment(segment) {\n if (matrix) {\n segment._transformCoordinates(matrix, coords);\n\n curX = coords[0];\n curY = coords[1];\n } else {\n var point = segment._point;\n curX = point._x;\n curY = point._y;\n }\n\n if (first) {\n ctx.moveTo(curX, curY);\n first = false;\n } else {\n if (matrix) {\n inX = coords[2];\n inY = coords[3];\n } else {\n var handle = segment._handleIn;\n inX = curX + handle._x;\n inY = curY + handle._y;\n }\n\n if (inX === curX && inY === curY && outX === prevX && outY === prevY) {\n ctx.lineTo(curX, curY);\n } else {\n ctx.bezierCurveTo(outX, outY, inX, inY, curX, curY);\n }\n }\n\n prevX = curX;\n prevY = curY;\n\n if (matrix) {\n outX = coords[4];\n outY = coords[5];\n } else {\n var handle = segment._handleOut;\n outX = prevX + handle._x;\n outY = prevY + handle._y;\n }\n }\n\n for (var i = 0; i < length; i++) {\n drawSegment(segments[i]);\n }\n\n if (path._closed && length > 0) drawSegment(segments[0]);\n }\n\n return {\n _draw: function _draw(ctx, param, viewMatrix, strokeMatrix) {\n var dontStart = param.dontStart,\n dontPaint = param.dontFinish || param.clip,\n style = this.getStyle(),\n hasFill = style.hasFill(),\n hasStroke = style.hasStroke(),\n dashArray = style.getDashArray(),\n dashLength = !paper.support.nativeDash && hasStroke && dashArray && dashArray.length;\n if (!dontStart) ctx.beginPath();\n\n if (hasFill || hasStroke && !dashLength || dontPaint) {\n drawSegments(ctx, this, strokeMatrix);\n if (this._closed) ctx.closePath();\n }\n\n function getOffset(i) {\n return dashArray[(i % dashLength + dashLength) % dashLength];\n }\n\n if (!dontPaint && (hasFill || hasStroke)) {\n this._setStyles(ctx, param, viewMatrix);\n\n if (hasFill) {\n ctx.fill(style.getFillRule());\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (hasStroke) {\n if (dashLength) {\n if (!dontStart) ctx.beginPath();\n var flattener = new PathFlattener(this, 0.25, 32, false, strokeMatrix),\n length = flattener.length,\n from = -style.getDashOffset(),\n to,\n i = 0;\n\n while (from > 0) {\n from -= getOffset(i--) + getOffset(i--);\n }\n\n while (from < length) {\n to = from + getOffset(i++);\n if (from > 0 || to > 0) flattener.drawPart(ctx, Math.max(from, 0), Math.max(to, 0));\n from = to + getOffset(i++);\n }\n }\n\n ctx.stroke();\n }\n }\n },\n _drawSelected: function _drawSelected(ctx, matrix) {\n ctx.beginPath();\n drawSegments(ctx, this, matrix);\n ctx.stroke();\n drawHandles(ctx, this._segments, matrix, paper.settings.handleSize);\n }\n };\n }(), new function () {\n function getCurrentSegment(that) {\n var segments = that._segments;\n if (!segments.length) throw new Error('Use a moveTo() command first');\n return segments[segments.length - 1];\n }\n\n return {\n moveTo: function moveTo() {\n var segments = this._segments;\n if (segments.length === 1) this.removeSegment(0);\n if (!segments.length) this._add([new Segment(Point.read(arguments))]);\n },\n moveBy: function moveBy() {\n throw new Error('moveBy() is unsupported on Path items.');\n },\n lineTo: function lineTo() {\n this._add([new Segment(Point.read(arguments))]);\n },\n cubicCurveTo: function cubicCurveTo() {\n var args = arguments,\n handle1 = Point.read(args),\n handle2 = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this);\n current.setHandleOut(handle1.subtract(current._point));\n\n this._add([new Segment(to, handle2.subtract(to))]);\n },\n quadraticCurveTo: function quadraticCurveTo() {\n var args = arguments,\n handle = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this)._point;\n\n this.cubicCurveTo(handle.add(current.subtract(handle).multiply(1 / 3)), handle.add(to.subtract(handle).multiply(1 / 3)), to);\n },\n curveTo: function curveTo() {\n var args = arguments,\n through = Point.read(args),\n to = Point.read(args),\n t = Base.pick(Base.read(args), 0.5),\n t1 = 1 - t,\n current = getCurrentSegment(this)._point,\n handle = through.subtract(current.multiply(t1 * t1)).subtract(to.multiply(t * t)).divide(2 * t * t1);\n\n if (handle.isNaN()) throw new Error('Cannot put a curve through points with parameter = ' + t);\n this.quadraticCurveTo(handle, to);\n },\n arcTo: function arcTo() {\n var args = arguments,\n abs = Math.abs,\n sqrt = Math.sqrt,\n current = getCurrentSegment(this),\n from = current._point,\n to = Point.read(args),\n through,\n peek = Base.peek(args),\n clockwise = Base.pick(peek, true),\n center,\n extent,\n vector,\n matrix;\n\n if (typeof clockwise === 'boolean') {\n var middle = from.add(to).divide(2),\n through = middle.add(middle.subtract(from).rotate(clockwise ? -90 : 90));\n } else if (Base.remain(args) <= 2) {\n through = to;\n to = Point.read(args);\n } else if (!from.equals(to)) {\n var radius = Size.read(args),\n isZero = Numerical.isZero;\n if (isZero(radius.width) || isZero(radius.height)) return this.lineTo(to);\n var rotation = Base.read(args),\n clockwise = !!Base.read(args),\n large = !!Base.read(args),\n middle = from.add(to).divide(2),\n pt = from.subtract(middle).rotate(-rotation),\n x = pt.x,\n y = pt.y,\n rx = abs(radius.width),\n ry = abs(radius.height),\n rxSq = rx * rx,\n rySq = ry * ry,\n xSq = x * x,\n ySq = y * y;\n var factor = sqrt(xSq / rxSq + ySq / rySq);\n\n if (factor > 1) {\n rx *= factor;\n ry *= factor;\n rxSq = rx * rx;\n rySq = ry * ry;\n }\n\n factor = (rxSq * rySq - rxSq * ySq - rySq * xSq) / (rxSq * ySq + rySq * xSq);\n if (abs(factor) < 1e-12) factor = 0;\n if (factor < 0) throw new Error('Cannot create an arc with the given arguments');\n center = new Point(rx * y / ry, -ry * x / rx).multiply((large === clockwise ? -1 : 1) * sqrt(factor)).rotate(rotation).add(middle);\n matrix = new Matrix().translate(center).rotate(rotation).scale(rx, ry);\n vector = matrix._inverseTransform(from);\n extent = vector.getDirectedAngle(matrix._inverseTransform(to));\n if (!clockwise && extent > 0) extent -= 360;else if (clockwise && extent < 0) extent += 360;\n }\n\n if (through) {\n var l1 = new Line(from.add(through).divide(2), through.subtract(from).rotate(90), true),\n l2 = new Line(through.add(to).divide(2), to.subtract(through).rotate(90), true),\n line = new Line(from, to),\n throughSide = line.getSide(through);\n center = l1.intersect(l2, true);\n\n if (!center) {\n if (!throughSide) return this.lineTo(to);\n throw new Error('Cannot create an arc with the given arguments');\n }\n\n vector = from.subtract(center);\n extent = vector.getDirectedAngle(to.subtract(center));\n var centerSide = line.getSide(center, true);\n\n if (centerSide === 0) {\n extent = throughSide * abs(extent);\n } else if (throughSide === centerSide) {\n extent += extent < 0 ? 360 : -360;\n }\n }\n\n if (extent) {\n var epsilon = 1e-7,\n ext = abs(extent),\n count = ext >= 360 ? 4 : Math.ceil((ext - epsilon) / 90),\n inc = extent / count,\n half = inc * Math.PI / 360,\n z = 4 / 3 * Math.sin(half) / (1 + Math.cos(half)),\n segments = [];\n\n for (var i = 0; i <= count; i++) {\n var pt = to,\n out = null;\n\n if (i < count) {\n out = vector.rotate(90).multiply(z);\n\n if (matrix) {\n pt = matrix._transformPoint(vector);\n out = matrix._transformPoint(vector.add(out)).subtract(pt);\n } else {\n pt = center.add(vector);\n }\n }\n\n if (!i) {\n current.setHandleOut(out);\n } else {\n var _in = vector.rotate(-90).multiply(z);\n\n if (matrix) {\n _in = matrix._transformPoint(vector.add(_in)).subtract(pt);\n }\n\n segments.push(new Segment(pt, _in, out));\n }\n\n vector = vector.rotate(inc);\n }\n\n this._add(segments);\n }\n },\n lineBy: function lineBy() {\n var to = Point.read(arguments),\n current = getCurrentSegment(this)._point;\n\n this.lineTo(current.add(to));\n },\n curveBy: function curveBy() {\n var args = arguments,\n through = Point.read(args),\n to = Point.read(args),\n parameter = Base.read(args),\n current = getCurrentSegment(this)._point;\n\n this.curveTo(current.add(through), current.add(to), parameter);\n },\n cubicCurveBy: function cubicCurveBy() {\n var args = arguments,\n handle1 = Point.read(args),\n handle2 = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this)._point;\n\n this.cubicCurveTo(current.add(handle1), current.add(handle2), current.add(to));\n },\n quadraticCurveBy: function quadraticCurveBy() {\n var args = arguments,\n handle = Point.read(args),\n to = Point.read(args),\n current = getCurrentSegment(this)._point;\n\n this.quadraticCurveTo(current.add(handle), current.add(to));\n },\n arcBy: function arcBy() {\n var args = arguments,\n current = getCurrentSegment(this)._point,\n point = current.add(Point.read(args)),\n clockwise = Base.pick(Base.peek(args), true);\n\n if (typeof clockwise === 'boolean') {\n this.arcTo(point, clockwise);\n } else {\n this.arcTo(point, current.add(Point.read(args)));\n }\n },\n closePath: function closePath(tolerance) {\n this.setClosed(true);\n this.join(this, tolerance);\n }\n };\n }(), {\n _getBounds: function _getBounds(matrix, options) {\n var method = options.handle ? 'getHandleBounds' : options.stroke ? 'getStrokeBounds' : 'getBounds';\n return Path[method](this._segments, this._closed, this, matrix, options);\n },\n statics: {\n getBounds: function getBounds(segments, closed, path, matrix, options, strokePadding) {\n var first = segments[0];\n if (!first) return new _Rectangle();\n\n var coords = new Array(6),\n prevCoords = first._transformCoordinates(matrix, new Array(6)),\n min = prevCoords.slice(0, 2),\n max = min.slice(),\n roots = new Array(2);\n\n function processSegment(segment) {\n segment._transformCoordinates(matrix, coords);\n\n for (var i = 0; i < 2; i++) {\n Curve._addBounds(prevCoords[i], prevCoords[i + 4], coords[i + 2], coords[i], i, strokePadding ? strokePadding[i] : 0, min, max, roots);\n }\n\n var tmp = prevCoords;\n prevCoords = coords;\n coords = tmp;\n }\n\n for (var i = 1, l = segments.length; i < l; i++) {\n processSegment(segments[i]);\n }\n\n if (closed) processSegment(first);\n return new _Rectangle(min[0], min[1], max[0] - min[0], max[1] - min[1]);\n },\n getStrokeBounds: function getStrokeBounds(segments, closed, path, matrix, options) {\n var style = path.getStyle(),\n stroke = style.hasStroke(),\n strokeWidth = style.getStrokeWidth(),\n strokeMatrix = stroke && path._getStrokeMatrix(matrix, options),\n strokePadding = stroke && Path._getStrokePadding(strokeWidth, strokeMatrix),\n bounds = Path.getBounds(segments, closed, path, matrix, options, strokePadding);\n\n if (!stroke) return bounds;\n var strokeRadius = strokeWidth / 2,\n join = style.getStrokeJoin(),\n cap = style.getStrokeCap(),\n miterLimit = style.getMiterLimit(),\n joinBounds = new _Rectangle(new Size(strokePadding));\n\n function addPoint(point) {\n bounds = bounds.include(point);\n }\n\n function addRound(segment) {\n bounds = bounds.unite(joinBounds.setCenter(segment._point.transform(matrix)));\n }\n\n function addJoin(segment, join) {\n if (join === 'round' || segment.isSmooth()) {\n addRound(segment);\n } else {\n Path._addBevelJoin(segment, join, strokeRadius, miterLimit, matrix, strokeMatrix, addPoint);\n }\n }\n\n function addCap(segment, cap) {\n if (cap === 'round') {\n addRound(segment);\n } else {\n Path._addSquareCap(segment, cap, strokeRadius, matrix, strokeMatrix, addPoint);\n }\n }\n\n var length = segments.length - (closed ? 0 : 1);\n\n if (length > 0) {\n for (var i = 1; i < length; i++) {\n addJoin(segments[i], join);\n }\n\n if (closed) {\n addJoin(segments[0], join);\n } else {\n addCap(segments[0], cap);\n addCap(segments[segments.length - 1], cap);\n }\n }\n\n return bounds;\n },\n _getStrokePadding: function _getStrokePadding(radius, matrix) {\n if (!matrix) return [radius, radius];\n var hor = new Point(radius, 0).transform(matrix),\n ver = new Point(0, radius).transform(matrix),\n phi = hor.getAngleInRadians(),\n a = hor.getLength(),\n b = ver.getLength();\n var sin = Math.sin(phi),\n cos = Math.cos(phi),\n tan = Math.tan(phi),\n tx = Math.atan2(b * tan, a),\n ty = Math.atan2(b, tan * a);\n return [Math.abs(a * Math.cos(tx) * cos + b * Math.sin(tx) * sin), Math.abs(b * Math.sin(ty) * cos + a * Math.cos(ty) * sin)];\n },\n _addBevelJoin: function _addBevelJoin(segment, join, radius, miterLimit, matrix, strokeMatrix, addPoint, isArea) {\n var curve2 = segment.getCurve(),\n curve1 = curve2.getPrevious(),\n point = curve2.getPoint1().transform(matrix),\n normal1 = curve1.getNormalAtTime(1).multiply(radius).transform(strokeMatrix),\n normal2 = curve2.getNormalAtTime(0).multiply(radius).transform(strokeMatrix),\n angle = normal1.getDirectedAngle(normal2);\n\n if (angle < 0 || angle >= 180) {\n normal1 = normal1.negate();\n normal2 = normal2.negate();\n }\n\n if (isArea) addPoint(point);\n addPoint(point.add(normal1));\n\n if (join === 'miter') {\n var corner = new Line(point.add(normal1), new Point(-normal1.y, normal1.x), true).intersect(new Line(point.add(normal2), new Point(-normal2.y, normal2.x), true), true);\n\n if (corner && point.getDistance(corner) <= miterLimit * radius) {\n addPoint(corner);\n }\n }\n\n addPoint(point.add(normal2));\n },\n _addSquareCap: function _addSquareCap(segment, cap, radius, matrix, strokeMatrix, addPoint, isArea) {\n var point = segment._point.transform(matrix),\n loc = segment.getLocation(),\n normal = loc.getNormal().multiply(loc.getTime() === 0 ? radius : -radius).transform(strokeMatrix);\n\n if (cap === 'square') {\n if (isArea) {\n addPoint(point.subtract(normal));\n addPoint(point.add(normal));\n }\n\n point = point.add(normal.rotate(-90));\n }\n\n addPoint(point.add(normal));\n addPoint(point.subtract(normal));\n },\n getHandleBounds: function getHandleBounds(segments, closed, path, matrix, options) {\n var style = path.getStyle(),\n stroke = options.stroke && style.hasStroke(),\n strokePadding,\n joinPadding;\n\n if (stroke) {\n var strokeMatrix = path._getStrokeMatrix(matrix, options),\n strokeRadius = style.getStrokeWidth() / 2,\n joinRadius = strokeRadius;\n\n if (style.getStrokeJoin() === 'miter') joinRadius = strokeRadius * style.getMiterLimit();\n if (style.getStrokeCap() === 'square') joinRadius = Math.max(joinRadius, strokeRadius * Math.SQRT2);\n strokePadding = Path._getStrokePadding(strokeRadius, strokeMatrix);\n joinPadding = Path._getStrokePadding(joinRadius, strokeMatrix);\n }\n\n var coords = new Array(6),\n x1 = Infinity,\n x2 = -x1,\n y1 = x1,\n y2 = x2;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i];\n\n segment._transformCoordinates(matrix, coords);\n\n for (var j = 0; j < 6; j += 2) {\n var padding = !j ? joinPadding : strokePadding,\n paddingX = padding ? padding[0] : 0,\n paddingY = padding ? padding[1] : 0,\n x = coords[j],\n y = coords[j + 1],\n xn = x - paddingX,\n xx = x + paddingX,\n yn = y - paddingY,\n yx = y + paddingY;\n if (xn < x1) x1 = xn;\n if (xx > x2) x2 = xx;\n if (yn < y1) y1 = yn;\n if (yx > y2) y2 = yx;\n }\n }\n\n return new _Rectangle(x1, y1, x2 - x1, y2 - y1);\n }\n }\n });\n Path.inject({\n statics: new function () {\n var kappa = 0.5522847498307936,\n ellipseSegments = [new Segment([-1, 0], [0, kappa], [0, -kappa]), new Segment([0, -1], [-kappa, 0], [kappa, 0]), new Segment([1, 0], [0, -kappa], [0, kappa]), new Segment([0, 1], [kappa, 0], [-kappa, 0])];\n\n function createPath(segments, closed, args) {\n var props = Base.getNamed(args),\n path = new Path(props && props.insert == false && Item.NO_INSERT);\n\n path._add(segments);\n\n path._closed = closed;\n return path.set(props, {\n insert: true\n });\n }\n\n function createEllipse(center, radius, args) {\n var segments = new Array(4);\n\n for (var i = 0; i < 4; i++) {\n var segment = ellipseSegments[i];\n segments[i] = new Segment(segment._point.multiply(radius).add(center), segment._handleIn.multiply(radius), segment._handleOut.multiply(radius));\n }\n\n return createPath(segments, true, args);\n }\n\n return {\n Line: function Line() {\n var args = arguments;\n return createPath([new Segment(Point.readNamed(args, 'from')), new Segment(Point.readNamed(args, 'to'))], false, args);\n },\n Circle: function Circle() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n radius = Base.readNamed(args, 'radius');\n return createEllipse(center, new Size(radius), args);\n },\n Rectangle: function Rectangle() {\n var args = arguments,\n rect = _Rectangle.readNamed(args, 'rectangle'),\n radius = Size.readNamed(args, 'radius', 0, {\n readNull: true\n }),\n bl = rect.getBottomLeft(true),\n tl = rect.getTopLeft(true),\n tr = rect.getTopRight(true),\n br = rect.getBottomRight(true),\n segments;\n\n if (!radius || radius.isZero()) {\n segments = [new Segment(bl), new Segment(tl), new Segment(tr), new Segment(br)];\n } else {\n radius = Size.min(radius, rect.getSize(true).divide(2));\n var rx = radius.width,\n ry = radius.height,\n hx = rx * kappa,\n hy = ry * kappa;\n segments = [new Segment(bl.add(rx, 0), null, [-hx, 0]), new Segment(bl.subtract(0, ry), [0, hy]), new Segment(tl.add(0, ry), null, [0, -hy]), new Segment(tl.add(rx, 0), [-hx, 0], null), new Segment(tr.subtract(rx, 0), null, [hx, 0]), new Segment(tr.add(0, ry), [0, -hy], null), new Segment(br.subtract(0, ry), null, [0, hy]), new Segment(br.subtract(rx, 0), [hx, 0])];\n }\n\n return createPath(segments, true, args);\n },\n RoundRectangle: '#Rectangle',\n Ellipse: function Ellipse() {\n var args = arguments,\n ellipse = Shape._readEllipse(args);\n\n return createEllipse(ellipse.center, ellipse.radius, args);\n },\n Oval: '#Ellipse',\n Arc: function Arc() {\n var args = arguments,\n from = Point.readNamed(args, 'from'),\n through = Point.readNamed(args, 'through'),\n to = Point.readNamed(args, 'to'),\n props = Base.getNamed(args),\n path = new Path(props && props.insert == false && Item.NO_INSERT);\n path.moveTo(from);\n path.arcTo(through, to);\n return path.set(props);\n },\n RegularPolygon: function RegularPolygon() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n sides = Base.readNamed(args, 'sides'),\n radius = Base.readNamed(args, 'radius'),\n step = 360 / sides,\n three = sides % 3 === 0,\n vector = new Point(0, three ? -radius : radius),\n offset = three ? -1 : 0.5,\n segments = new Array(sides);\n\n for (var i = 0; i < sides; i++) {\n segments[i] = new Segment(center.add(vector.rotate((i + offset) * step)));\n }\n\n return createPath(segments, true, args);\n },\n Star: function Star() {\n var args = arguments,\n center = Point.readNamed(args, 'center'),\n points = Base.readNamed(args, 'points') * 2,\n radius1 = Base.readNamed(args, 'radius1'),\n radius2 = Base.readNamed(args, 'radius2'),\n step = 360 / points,\n vector = new Point(0, -1),\n segments = new Array(points);\n\n for (var i = 0; i < points; i++) {\n segments[i] = new Segment(center.add(vector.rotate(step * i).multiply(i % 2 ? radius2 : radius1)));\n }\n\n return createPath(segments, true, args);\n }\n };\n }()\n });\n var CompoundPath = PathItem.extend({\n _class: 'CompoundPath',\n _serializeFields: {\n children: []\n },\n beans: true,\n initialize: function CompoundPath(arg) {\n this._children = [];\n this._namedChildren = {};\n\n if (!this._initialize(arg)) {\n if (typeof arg === 'string') {\n this.setPathData(arg);\n } else {\n this.addChildren(Array.isArray(arg) ? arg : arguments);\n }\n }\n },\n insertChildren: function insertChildren(index, items) {\n var list = items,\n first = list[0];\n if (first && typeof first[0] === 'number') list = [list];\n\n for (var i = items.length - 1; i >= 0; i--) {\n var item = list[i];\n if (list === items && !(item instanceof Path)) list = Base.slice(list);\n\n if (Array.isArray(item)) {\n list[i] = new Path({\n segments: item,\n insert: false\n });\n } else if (item instanceof CompoundPath) {\n list.splice.apply(list, [i, 1].concat(item.removeChildren()));\n item.remove();\n }\n }\n\n return insertChildren.base.call(this, index, list);\n },\n reduce: function reduce(options) {\n var children = this._children;\n\n for (var i = children.length - 1; i >= 0; i--) {\n var path = children[i].reduce(options);\n if (path.isEmpty()) path.remove();\n }\n\n if (!children.length) {\n var path = new Path(Item.NO_INSERT);\n path.copyAttributes(this);\n path.insertAbove(this);\n this.remove();\n return path;\n }\n\n return reduce.base.call(this);\n },\n isClosed: function isClosed() {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (!children[i]._closed) return false;\n }\n\n return true;\n },\n setClosed: function setClosed(closed) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].setClosed(closed);\n }\n },\n getFirstSegment: function getFirstSegment() {\n var first = this.getFirstChild();\n return first && first.getFirstSegment();\n },\n getLastSegment: function getLastSegment() {\n var last = this.getLastChild();\n return last && last.getLastSegment();\n },\n getCurves: function getCurves() {\n var children = this._children,\n curves = [];\n\n for (var i = 0, l = children.length; i < l; i++) {\n Base.push(curves, children[i].getCurves());\n }\n\n return curves;\n },\n getFirstCurve: function getFirstCurve() {\n var first = this.getFirstChild();\n return first && first.getFirstCurve();\n },\n getLastCurve: function getLastCurve() {\n var last = this.getLastChild();\n return last && last.getLastCurve();\n },\n getArea: function getArea() {\n var children = this._children,\n area = 0;\n\n for (var i = 0, l = children.length; i < l; i++) {\n area += children[i].getArea();\n }\n\n return area;\n },\n getLength: function getLength() {\n var children = this._children,\n length = 0;\n\n for (var i = 0, l = children.length; i < l; i++) {\n length += children[i].getLength();\n }\n\n return length;\n },\n getPathData: function getPathData(_matrix, _precision) {\n var children = this._children,\n paths = [];\n\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i],\n mx = child._matrix;\n paths.push(child.getPathData(_matrix && !mx.isIdentity() ? _matrix.appended(mx) : _matrix, _precision));\n }\n\n return paths.join('');\n },\n _hitTestChildren: function _hitTestChildren(point, options, viewMatrix) {\n return _hitTestChildren.base.call(this, point, options.class === Path || options.type === 'path' ? options : Base.set({}, options, {\n fill: false\n }), viewMatrix);\n },\n _draw: function _draw(ctx, param, viewMatrix, strokeMatrix) {\n var children = this._children;\n if (!children.length) return;\n param = param.extend({\n dontStart: true,\n dontFinish: true\n });\n ctx.beginPath();\n\n for (var i = 0, l = children.length; i < l; i++) {\n children[i].draw(ctx, param, strokeMatrix);\n }\n\n if (!param.clip) {\n this._setStyles(ctx, param, viewMatrix);\n\n var style = this._style;\n\n if (style.hasFill()) {\n ctx.fill(style.getFillRule());\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (style.hasStroke()) ctx.stroke();\n }\n },\n _drawSelected: function _drawSelected(ctx, matrix, selectionItems) {\n var children = this._children;\n\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i],\n mx = child._matrix;\n\n if (!selectionItems[child._id]) {\n child._drawSelected(ctx, mx.isIdentity() ? matrix : matrix.appended(mx));\n }\n }\n }\n }, new function () {\n function getCurrentPath(that, check) {\n var children = that._children;\n if (check && !children.length) throw new Error('Use a moveTo() command first');\n return children[children.length - 1];\n }\n\n return Base.each(['lineTo', 'cubicCurveTo', 'quadraticCurveTo', 'curveTo', 'arcTo', 'lineBy', 'cubicCurveBy', 'quadraticCurveBy', 'curveBy', 'arcBy'], function (key) {\n this[key] = function () {\n var path = getCurrentPath(this, true);\n path[key].apply(path, arguments);\n };\n }, {\n moveTo: function moveTo() {\n var current = getCurrentPath(this),\n path = current && current.isEmpty() ? current : new Path(Item.NO_INSERT);\n if (path !== current) this.addChild(path);\n path.moveTo.apply(path, arguments);\n },\n moveBy: function moveBy() {\n var current = getCurrentPath(this, true),\n last = current && current.getLastSegment(),\n point = Point.read(arguments);\n this.moveTo(last ? point.add(last._point) : point);\n },\n closePath: function closePath(tolerance) {\n getCurrentPath(this, true).closePath(tolerance);\n }\n });\n }(), Base.each(['reverse', 'flatten', 'simplify', 'smooth'], function (key) {\n this[key] = function (param) {\n var children = this._children,\n res;\n\n for (var i = 0, l = children.length; i < l; i++) {\n res = children[i][key](param) || res;\n }\n\n return res;\n };\n }, {}));\n PathItem.inject(new function () {\n var min = Math.min,\n max = Math.max,\n abs = Math.abs,\n operators = {\n unite: {\n '1': true,\n '2': true\n },\n intersect: {\n '2': true\n },\n subtract: {\n '1': true\n },\n exclude: {\n '1': true,\n '-1': true\n }\n };\n\n function getPaths(path) {\n return path._children || [path];\n }\n\n function preparePath(path, resolve) {\n var res = path.clone(false).reduce({\n simplify: true\n }).transform(null, true, true);\n\n if (resolve) {\n var paths = getPaths(res);\n\n for (var i = 0, l = paths.length; i < l; i++) {\n var path = paths[i];\n\n if (!path._closed && !path.isEmpty()) {\n path.closePath(1e-12);\n path.getFirstSegment().setHandleIn(0, 0);\n path.getLastSegment().setHandleOut(0, 0);\n }\n }\n\n res = res.resolveCrossings().reorient(res.getFillRule() === 'nonzero', true);\n }\n\n return res;\n }\n\n function createResult(paths, simplify, path1, path2, options) {\n var result = new CompoundPath(Item.NO_INSERT);\n result.addChildren(paths, true);\n result = result.reduce({\n simplify: simplify\n });\n\n if (!(options && options.insert == false)) {\n result.insertAbove(path2 && path1.isSibling(path2) && path1.getIndex() < path2.getIndex() ? path2 : path1);\n }\n\n result.copyAttributes(path1, true);\n return result;\n }\n\n function filterIntersection(inter) {\n return inter.hasOverlap() || inter.isCrossing();\n }\n\n function traceBoolean(path1, path2, operation, options) {\n if (options && (options.trace == false || options.stroke) && /^(subtract|intersect)$/.test(operation)) return splitBoolean(path1, path2, operation);\n\n var _path1 = preparePath(path1, true),\n _path2 = path2 && path1 !== path2 && preparePath(path2, true),\n operator = operators[operation];\n\n operator[operation] = true;\n if (_path2 && (operator.subtract || operator.exclude) ^ (_path2.isClockwise() ^ _path1.isClockwise())) _path2.reverse();\n\n var crossings = divideLocations(CurveLocation.expand(_path1.getIntersections(_path2, filterIntersection))),\n paths1 = getPaths(_path1),\n paths2 = _path2 && getPaths(_path2),\n segments = [],\n curves = [],\n paths;\n\n function collectPaths(paths) {\n for (var i = 0, l = paths.length; i < l; i++) {\n var path = paths[i];\n Base.push(segments, path._segments);\n Base.push(curves, path.getCurves());\n path._overlapsOnly = true;\n }\n }\n\n function getCurves(indices) {\n var list = [];\n\n for (var i = 0, l = indices && indices.length; i < l; i++) {\n list.push(curves[indices[i]]);\n }\n\n return list;\n }\n\n if (crossings.length) {\n collectPaths(paths1);\n if (paths2) collectPaths(paths2);\n var curvesValues = new Array(curves.length);\n\n for (var i = 0, l = curves.length; i < l; i++) {\n curvesValues[i] = curves[i].getValues();\n }\n\n var curveCollisions = CollisionDetection.findCurveBoundsCollisions(curvesValues, curvesValues, 0, true);\n var curveCollisionsMap = {};\n\n for (var i = 0; i < curves.length; i++) {\n var curve = curves[i],\n id = curve._path._id,\n map = curveCollisionsMap[id] = curveCollisionsMap[id] || {};\n map[curve.getIndex()] = {\n hor: getCurves(curveCollisions[i].hor),\n ver: getCurves(curveCollisions[i].ver)\n };\n }\n\n for (var i = 0, l = crossings.length; i < l; i++) {\n propagateWinding(crossings[i]._segment, _path1, _path2, curveCollisionsMap, operator);\n }\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var segment = segments[i],\n inter = segment._intersection;\n\n if (!segment._winding) {\n propagateWinding(segment, _path1, _path2, curveCollisionsMap, operator);\n }\n\n if (!(inter && inter._overlap)) segment._path._overlapsOnly = false;\n }\n\n paths = tracePaths(segments, operator);\n } else {\n paths = reorientPaths(paths2 ? paths1.concat(paths2) : paths1.slice(), function (w) {\n return !!operator[w];\n });\n }\n\n return createResult(paths, true, path1, path2, options);\n }\n\n function splitBoolean(path1, path2, operation) {\n var _path1 = preparePath(path1),\n _path2 = preparePath(path2),\n crossings = _path1.getIntersections(_path2, filterIntersection),\n subtract = operation === 'subtract',\n divide = operation === 'divide',\n added = {},\n paths = [];\n\n function addPath(path) {\n if (!added[path._id] && (divide || _path2.contains(path.getPointAt(path.getLength() / 2)) ^ subtract)) {\n paths.unshift(path);\n return added[path._id] = true;\n }\n }\n\n for (var i = crossings.length - 1; i >= 0; i--) {\n var path = crossings[i].split();\n\n if (path) {\n if (addPath(path)) path.getFirstSegment().setHandleIn(0, 0);\n\n _path1.getLastSegment().setHandleOut(0, 0);\n }\n }\n\n addPath(_path1);\n return createResult(paths, false, path1, path2);\n }\n\n function linkIntersections(from, to) {\n var prev = from;\n\n while (prev) {\n if (prev === to) return;\n prev = prev._previous;\n }\n\n while (from._next && from._next !== to) {\n from = from._next;\n }\n\n if (!from._next) {\n while (to._previous) {\n to = to._previous;\n }\n\n from._next = to;\n to._previous = from;\n }\n }\n\n function clearCurveHandles(curves) {\n for (var i = curves.length - 1; i >= 0; i--) {\n curves[i].clearHandles();\n }\n }\n\n function reorientPaths(paths, isInside, clockwise) {\n var length = paths && paths.length;\n\n if (length) {\n var lookup = Base.each(paths, function (path, i) {\n this[path._id] = {\n container: null,\n winding: path.isClockwise() ? 1 : -1,\n index: i\n };\n }, {}),\n sorted = paths.slice().sort(function (a, b) {\n return abs(b.getArea()) - abs(a.getArea());\n }),\n first = sorted[0];\n var collisions = CollisionDetection.findItemBoundsCollisions(sorted, null, Numerical.GEOMETRIC_EPSILON);\n if (clockwise == null) clockwise = first.isClockwise();\n\n for (var i = 0; i < length; i++) {\n var path1 = sorted[i],\n entry1 = lookup[path1._id],\n containerWinding = 0,\n indices = collisions[i];\n\n if (indices) {\n var point = null;\n\n for (var j = indices.length - 1; j >= 0; j--) {\n if (indices[j] < i) {\n point = point || path1.getInteriorPoint();\n var path2 = sorted[indices[j]];\n\n if (path2.contains(point)) {\n var entry2 = lookup[path2._id];\n containerWinding = entry2.winding;\n entry1.winding += containerWinding;\n entry1.container = entry2.exclude ? entry2.container : path2;\n break;\n }\n }\n }\n }\n\n if (isInside(entry1.winding) === isInside(containerWinding)) {\n entry1.exclude = true;\n paths[entry1.index] = null;\n } else {\n var container = entry1.container;\n path1.setClockwise(container ? !container.isClockwise() : clockwise);\n }\n }\n }\n\n return paths;\n }\n\n function divideLocations(locations, include, clearLater) {\n var results = include && [],\n tMin = 1e-8,\n tMax = 1 - tMin,\n clearHandles = false,\n clearCurves = clearLater || [],\n clearLookup = clearLater && {},\n renormalizeLocs,\n prevCurve,\n prevTime;\n\n function getId(curve) {\n return curve._path._id + '.' + curve._segment1._index;\n }\n\n for (var i = (clearLater && clearLater.length) - 1; i >= 0; i--) {\n var curve = clearLater[i];\n if (curve._path) clearLookup[getId(curve)] = true;\n }\n\n for (var i = locations.length - 1; i >= 0; i--) {\n var loc = locations[i],\n time = loc._time,\n origTime = time,\n exclude = include && !include(loc),\n curve = loc._curve,\n segment;\n\n if (curve) {\n if (curve !== prevCurve) {\n clearHandles = !curve.hasHandles() || clearLookup && clearLookup[getId(curve)];\n renormalizeLocs = [];\n prevTime = null;\n prevCurve = curve;\n } else if (prevTime >= tMin) {\n time /= prevTime;\n }\n }\n\n if (exclude) {\n if (renormalizeLocs) renormalizeLocs.push(loc);\n continue;\n } else if (include) {\n results.unshift(loc);\n }\n\n prevTime = origTime;\n\n if (time < tMin) {\n segment = curve._segment1;\n } else if (time > tMax) {\n segment = curve._segment2;\n } else {\n var newCurve = curve.divideAtTime(time, true);\n if (clearHandles) clearCurves.push(curve, newCurve);\n segment = newCurve._segment1;\n\n for (var j = renormalizeLocs.length - 1; j >= 0; j--) {\n var l = renormalizeLocs[j];\n l._time = (l._time - time) / (1 - time);\n }\n }\n\n loc._setSegment(segment);\n\n var inter = segment._intersection,\n dest = loc._intersection;\n\n if (inter) {\n linkIntersections(inter, dest);\n var other = inter;\n\n while (other) {\n linkIntersections(other._intersection, inter);\n other = other._next;\n }\n } else {\n segment._intersection = dest;\n }\n }\n\n if (!clearLater) clearCurveHandles(clearCurves);\n return results || locations;\n }\n\n function getWinding(point, curves, dir, closed, dontFlip) {\n var curvesList = Array.isArray(curves) ? curves : curves[dir ? 'hor' : 'ver'];\n var ia = dir ? 1 : 0,\n io = ia ^ 1,\n pv = [point.x, point.y],\n pa = pv[ia],\n po = pv[io],\n windingEpsilon = 1e-9,\n qualityEpsilon = 1e-6,\n paL = pa - windingEpsilon,\n paR = pa + windingEpsilon,\n windingL = 0,\n windingR = 0,\n pathWindingL = 0,\n pathWindingR = 0,\n onPath = false,\n onAnyPath = false,\n quality = 1,\n roots = [],\n vPrev,\n vClose;\n\n function addWinding(v) {\n var o0 = v[io + 0],\n o3 = v[io + 6];\n\n if (po < min(o0, o3) || po > max(o0, o3)) {\n return;\n }\n\n var a0 = v[ia + 0],\n a1 = v[ia + 2],\n a2 = v[ia + 4],\n a3 = v[ia + 6];\n\n if (o0 === o3) {\n if (a0 < paR && a3 > paL || a3 < paR && a0 > paL) {\n onPath = true;\n }\n\n return;\n }\n\n var t = po === o0 ? 0 : po === o3 ? 1 : paL > max(a0, a1, a2, a3) || paR < min(a0, a1, a2, a3) ? 1 : Curve.solveCubic(v, io, po, roots, 0, 1) > 0 ? roots[0] : 1,\n a = t === 0 ? a0 : t === 1 ? a3 : Curve.getPoint(v, t)[dir ? 'y' : 'x'],\n winding = o0 > o3 ? 1 : -1,\n windingPrev = vPrev[io] > vPrev[io + 6] ? 1 : -1,\n a3Prev = vPrev[ia + 6];\n\n if (po !== o0) {\n if (a < paL) {\n pathWindingL += winding;\n } else if (a > paR) {\n pathWindingR += winding;\n } else {\n onPath = true;\n }\n\n if (a > pa - qualityEpsilon && a < pa + qualityEpsilon) quality /= 2;\n } else {\n if (winding !== windingPrev) {\n if (a0 < paL) {\n pathWindingL += winding;\n } else if (a0 > paR) {\n pathWindingR += winding;\n }\n } else if (a0 != a3Prev) {\n if (a3Prev < paR && a > paR) {\n pathWindingR += winding;\n onPath = true;\n } else if (a3Prev > paL && a < paL) {\n pathWindingL += winding;\n onPath = true;\n }\n }\n\n quality /= 4;\n }\n\n vPrev = v;\n return !dontFlip && a > paL && a < paR && Curve.getTangent(v, t)[dir ? 'x' : 'y'] === 0 && getWinding(point, curves, !dir, closed, true);\n }\n\n function handleCurve(v) {\n var o0 = v[io + 0],\n o1 = v[io + 2],\n o2 = v[io + 4],\n o3 = v[io + 6];\n\n if (po <= max(o0, o1, o2, o3) && po >= min(o0, o1, o2, o3)) {\n var a0 = v[ia + 0],\n a1 = v[ia + 2],\n a2 = v[ia + 4],\n a3 = v[ia + 6],\n monoCurves = paL > max(a0, a1, a2, a3) || paR < min(a0, a1, a2, a3) ? [v] : Curve.getMonoCurves(v, dir),\n res;\n\n for (var i = 0, l = monoCurves.length; i < l; i++) {\n if (res = addWinding(monoCurves[i])) return res;\n }\n }\n }\n\n for (var i = 0, l = curvesList.length; i < l; i++) {\n var curve = curvesList[i],\n path = curve._path,\n v = curve.getValues(),\n res;\n\n if (!i || curvesList[i - 1]._path !== path) {\n vPrev = null;\n\n if (!path._closed) {\n vClose = Curve.getValues(path.getLastCurve().getSegment2(), curve.getSegment1(), null, !closed);\n\n if (vClose[io] !== vClose[io + 6]) {\n vPrev = vClose;\n }\n }\n\n if (!vPrev) {\n vPrev = v;\n var prev = path.getLastCurve();\n\n while (prev && prev !== curve) {\n var v2 = prev.getValues();\n\n if (v2[io] !== v2[io + 6]) {\n vPrev = v2;\n break;\n }\n\n prev = prev.getPrevious();\n }\n }\n }\n\n if (res = handleCurve(v)) return res;\n\n if (i + 1 === l || curvesList[i + 1]._path !== path) {\n if (vClose && (res = handleCurve(vClose))) return res;\n\n if (onPath && !pathWindingL && !pathWindingR) {\n pathWindingL = pathWindingR = path.isClockwise(closed) ^ dir ? 1 : -1;\n }\n\n windingL += pathWindingL;\n windingR += pathWindingR;\n pathWindingL = pathWindingR = 0;\n\n if (onPath) {\n onAnyPath = true;\n onPath = false;\n }\n\n vClose = null;\n }\n }\n\n windingL = abs(windingL);\n windingR = abs(windingR);\n return {\n winding: max(windingL, windingR),\n windingL: windingL,\n windingR: windingR,\n quality: quality,\n onPath: onAnyPath\n };\n }\n\n function propagateWinding(segment, path1, path2, curveCollisionsMap, operator) {\n var chain = [],\n start = segment,\n totalLength = 0,\n winding;\n\n do {\n var curve = segment.getCurve();\n\n if (curve) {\n var length = curve.getLength();\n chain.push({\n segment: segment,\n curve: curve,\n length: length\n });\n totalLength += length;\n }\n\n segment = segment.getNext();\n } while (segment && !segment._intersection && segment !== start);\n\n var offsets = [0.5, 0.25, 0.75],\n winding = {\n winding: 0,\n quality: -1\n },\n tMin = 1e-3,\n tMax = 1 - tMin;\n\n for (var i = 0; i < offsets.length && winding.quality < 0.5; i++) {\n var length = totalLength * offsets[i];\n\n for (var j = 0, l = chain.length; j < l; j++) {\n var entry = chain[j],\n curveLength = entry.length;\n\n if (length <= curveLength) {\n var curve = entry.curve,\n path = curve._path,\n parent = path._parent,\n operand = parent instanceof CompoundPath ? parent : path,\n t = Numerical.clamp(curve.getTimeAt(length), tMin, tMax),\n pt = curve.getPointAtTime(t),\n dir = abs(curve.getTangentAtTime(t).y) < Math.SQRT1_2;\n var wind = null;\n\n if (operator.subtract && path2) {\n var otherPath = operand === path1 ? path2 : path1,\n pathWinding = otherPath._getWinding(pt, dir, true);\n\n if (operand === path1 && pathWinding.winding || operand === path2 && !pathWinding.winding) {\n if (pathWinding.quality < 1) {\n continue;\n } else {\n wind = {\n winding: 0,\n quality: 1\n };\n }\n }\n }\n\n wind = wind || getWinding(pt, curveCollisionsMap[path._id][curve.getIndex()], dir, true);\n if (wind.quality > winding.quality) winding = wind;\n break;\n }\n\n length -= curveLength;\n }\n }\n\n for (var j = chain.length - 1; j >= 0; j--) {\n chain[j].segment._winding = winding;\n }\n }\n\n function tracePaths(segments, operator) {\n var paths = [],\n starts;\n\n function isValid(seg) {\n var winding;\n return !!(seg && !seg._visited && (!operator || operator[(winding = seg._winding || {}).winding] && !(operator.unite && winding.winding === 2 && winding.windingL && winding.windingR)));\n }\n\n function isStart(seg) {\n if (seg) {\n for (var i = 0, l = starts.length; i < l; i++) {\n if (seg === starts[i]) return true;\n }\n }\n\n return false;\n }\n\n function visitPath(path) {\n var segments = path._segments;\n\n for (var i = 0, l = segments.length; i < l; i++) {\n segments[i]._visited = true;\n }\n }\n\n function getCrossingSegments(segment, collectStarts) {\n var inter = segment._intersection,\n start = inter,\n crossings = [];\n if (collectStarts) starts = [segment];\n\n function collect(inter, end) {\n while (inter && inter !== end) {\n var other = inter._segment,\n path = other && other._path;\n\n if (path) {\n var next = other.getNext() || path.getFirstSegment(),\n nextInter = next._intersection;\n\n if (other !== segment && (isStart(other) || isStart(next) || next && isValid(other) && (isValid(next) || nextInter && isValid(nextInter._segment)))) {\n crossings.push(other);\n }\n\n if (collectStarts) starts.push(other);\n }\n\n inter = inter._next;\n }\n }\n\n if (inter) {\n collect(inter);\n\n while (inter && inter._previous) {\n inter = inter._previous;\n }\n\n collect(inter, start);\n }\n\n return crossings;\n }\n\n segments.sort(function (seg1, seg2) {\n var inter1 = seg1._intersection,\n inter2 = seg2._intersection,\n over1 = !!(inter1 && inter1._overlap),\n over2 = !!(inter2 && inter2._overlap),\n path1 = seg1._path,\n path2 = seg2._path;\n return over1 ^ over2 ? over1 ? 1 : -1 : !inter1 ^ !inter2 ? inter1 ? 1 : -1 : path1 !== path2 ? path1._id - path2._id : seg1._index - seg2._index;\n });\n\n for (var i = 0, l = segments.length; i < l; i++) {\n var seg = segments[i],\n valid = isValid(seg),\n path = null,\n finished = false,\n closed = true,\n branches = [],\n branch,\n visited,\n handleIn;\n\n if (valid && seg._path._overlapsOnly) {\n var path1 = seg._path,\n path2 = seg._intersection._segment._path;\n\n if (path1.compare(path2)) {\n if (path1.getArea()) paths.push(path1.clone(false));\n visitPath(path1);\n visitPath(path2);\n valid = false;\n }\n }\n\n while (valid) {\n var first = !path,\n crossings = getCrossingSegments(seg, first),\n other = crossings.shift(),\n finished = !first && (isStart(seg) || isStart(other)),\n cross = !finished && other;\n\n if (first) {\n path = new Path(Item.NO_INSERT);\n branch = null;\n }\n\n if (finished) {\n if (seg.isFirst() || seg.isLast()) closed = seg._path._closed;\n seg._visited = true;\n break;\n }\n\n if (cross && branch) {\n branches.push(branch);\n branch = null;\n }\n\n if (!branch) {\n if (cross) crossings.push(seg);\n branch = {\n start: path._segments.length,\n crossings: crossings,\n visited: visited = [],\n handleIn: handleIn\n };\n }\n\n if (cross) seg = other;\n\n if (!isValid(seg)) {\n path.removeSegments(branch.start);\n\n for (var j = 0, k = visited.length; j < k; j++) {\n visited[j]._visited = false;\n }\n\n visited.length = 0;\n\n do {\n seg = branch && branch.crossings.shift();\n\n if (!seg || !seg._path) {\n seg = null;\n branch = branches.pop();\n\n if (branch) {\n visited = branch.visited;\n handleIn = branch.handleIn;\n }\n }\n } while (branch && !isValid(seg));\n\n if (!seg) break;\n }\n\n var next = seg.getNext();\n path.add(new Segment(seg._point, handleIn, next && seg._handleOut));\n seg._visited = true;\n visited.push(seg);\n seg = next || seg._path.getFirstSegment();\n handleIn = next && next._handleIn;\n }\n\n if (finished) {\n if (closed) {\n path.getFirstSegment().setHandleIn(handleIn);\n path.setClosed(closed);\n }\n\n if (path.getArea() !== 0) {\n paths.push(path);\n }\n }\n }\n\n return paths;\n }\n\n return {\n _getWinding: function _getWinding(point, dir, closed) {\n return getWinding(point, this.getCurves(), dir, closed);\n },\n unite: function unite(path, options) {\n return traceBoolean(this, path, 'unite', options);\n },\n intersect: function intersect(path, options) {\n return traceBoolean(this, path, 'intersect', options);\n },\n subtract: function subtract(path, options) {\n return traceBoolean(this, path, 'subtract', options);\n },\n exclude: function exclude(path, options) {\n return traceBoolean(this, path, 'exclude', options);\n },\n divide: function divide(path, options) {\n return options && (options.trace == false || options.stroke) ? splitBoolean(this, path, 'divide') : createResult([this.subtract(path, options), this.intersect(path, options)], true, this, path, options);\n },\n resolveCrossings: function resolveCrossings() {\n var children = this._children,\n paths = children || [this];\n\n function hasOverlap(seg, path) {\n var inter = seg && seg._intersection;\n return inter && inter._overlap && inter._path === path;\n }\n\n var hasOverlaps = false,\n hasCrossings = false,\n intersections = this.getIntersections(null, function (inter) {\n return inter.hasOverlap() && (hasOverlaps = true) || inter.isCrossing() && (hasCrossings = true);\n }),\n clearCurves = hasOverlaps && hasCrossings && [];\n intersections = CurveLocation.expand(intersections);\n\n if (hasOverlaps) {\n var overlaps = divideLocations(intersections, function (inter) {\n return inter.hasOverlap();\n }, clearCurves);\n\n for (var i = overlaps.length - 1; i >= 0; i--) {\n var overlap = overlaps[i],\n path = overlap._path,\n seg = overlap._segment,\n prev = seg.getPrevious(),\n next = seg.getNext();\n\n if (hasOverlap(prev, path) && hasOverlap(next, path)) {\n seg.remove();\n\n prev._handleOut._set(0, 0);\n\n next._handleIn._set(0, 0);\n\n if (prev !== seg && !prev.getCurve().hasLength()) {\n next._handleIn.set(prev._handleIn);\n\n prev.remove();\n }\n }\n }\n }\n\n if (hasCrossings) {\n divideLocations(intersections, hasOverlaps && function (inter) {\n var curve1 = inter.getCurve(),\n seg1 = inter.getSegment(),\n other = inter._intersection,\n curve2 = other._curve,\n seg2 = other._segment;\n if (curve1 && curve2 && curve1._path && curve2._path) return true;\n if (seg1) seg1._intersection = null;\n if (seg2) seg2._intersection = null;\n }, clearCurves);\n if (clearCurves) clearCurveHandles(clearCurves);\n paths = tracePaths(Base.each(paths, function (path) {\n Base.push(this, path._segments);\n }, []));\n }\n\n var length = paths.length,\n item;\n\n if (length > 1 && children) {\n if (paths !== children) this.setChildren(paths);\n item = this;\n } else if (length === 1 && !children) {\n if (paths[0] !== this) this.setSegments(paths[0].removeSegments());\n item = this;\n }\n\n if (!item) {\n item = new CompoundPath(Item.NO_INSERT);\n item.addChildren(paths);\n item = item.reduce();\n item.copyAttributes(this);\n this.replaceWith(item);\n }\n\n return item;\n },\n reorient: function reorient(nonZero, clockwise) {\n var children = this._children;\n\n if (children && children.length) {\n this.setChildren(reorientPaths(this.removeChildren(), function (w) {\n return !!(nonZero ? w : w & 1);\n }, clockwise));\n } else if (clockwise !== undefined) {\n this.setClockwise(clockwise);\n }\n\n return this;\n },\n getInteriorPoint: function getInteriorPoint() {\n var bounds = this.getBounds(),\n point = bounds.getCenter(true);\n\n if (!this.contains(point)) {\n var curves = this.getCurves(),\n y = point.y,\n intercepts = [],\n roots = [];\n\n for (var i = 0, l = curves.length; i < l; i++) {\n var v = curves[i].getValues(),\n o0 = v[1],\n o1 = v[3],\n o2 = v[5],\n o3 = v[7];\n\n if (y >= min(o0, o1, o2, o3) && y <= max(o0, o1, o2, o3)) {\n var monoCurves = Curve.getMonoCurves(v);\n\n for (var j = 0, m = monoCurves.length; j < m; j++) {\n var mv = monoCurves[j],\n mo0 = mv[1],\n mo3 = mv[7];\n\n if (mo0 !== mo3 && (y >= mo0 && y <= mo3 || y >= mo3 && y <= mo0)) {\n var x = y === mo0 ? mv[0] : y === mo3 ? mv[6] : Curve.solveCubic(mv, 1, y, roots, 0, 1) === 1 ? Curve.getPoint(mv, roots[0]).x : (mv[0] + mv[6]) / 2;\n intercepts.push(x);\n }\n }\n }\n }\n\n if (intercepts.length > 1) {\n intercepts.sort(function (a, b) {\n return a - b;\n });\n point.x = (intercepts[0] + intercepts[1]) / 2;\n }\n }\n\n return point;\n }\n };\n }());\n var PathFlattener = Base.extend({\n _class: 'PathFlattener',\n initialize: function initialize(path, flatness, maxRecursion, ignoreStraight, matrix) {\n var curves = [],\n parts = [],\n length = 0,\n minSpan = 1 / (maxRecursion || 32),\n segments = path._segments,\n segment1 = segments[0],\n segment2;\n\n function addCurve(segment1, segment2) {\n var curve = Curve.getValues(segment1, segment2, matrix);\n curves.push(curve);\n computeParts(curve, segment1._index, 0, 1);\n }\n\n function computeParts(curve, index, t1, t2) {\n if (t2 - t1 > minSpan && !(ignoreStraight && Curve.isStraight(curve)) && !Curve.isFlatEnough(curve, flatness || 0.25)) {\n var halves = Curve.subdivide(curve, 0.5),\n tMid = (t1 + t2) / 2;\n computeParts(halves[0], index, t1, tMid);\n computeParts(halves[1], index, tMid, t2);\n } else {\n var dx = curve[6] - curve[0],\n dy = curve[7] - curve[1],\n dist = Math.sqrt(dx * dx + dy * dy);\n\n if (dist > 0) {\n length += dist;\n parts.push({\n offset: length,\n curve: curve,\n index: index,\n time: t2\n });\n }\n }\n }\n\n for (var i = 1, l = segments.length; i < l; i++) {\n segment2 = segments[i];\n addCurve(segment1, segment2);\n segment1 = segment2;\n }\n\n if (path._closed) addCurve(segment2 || segment1, segments[0]);\n this.curves = curves;\n this.parts = parts;\n this.length = length;\n this.index = 0;\n },\n _get: function _get(offset) {\n var parts = this.parts,\n length = parts.length,\n start,\n i,\n j = this.index;\n\n for (;;) {\n i = j;\n if (!j || parts[--j].offset < offset) break;\n }\n\n for (; i < length; i++) {\n var part = parts[i];\n\n if (part.offset >= offset) {\n this.index = i;\n var prev = parts[i - 1],\n prevTime = prev && prev.index === part.index ? prev.time : 0,\n prevOffset = prev ? prev.offset : 0;\n return {\n index: part.index,\n time: prevTime + (part.time - prevTime) * (offset - prevOffset) / (part.offset - prevOffset)\n };\n }\n }\n\n return {\n index: parts[length - 1].index,\n time: 1\n };\n },\n drawPart: function drawPart(ctx, from, to) {\n var start = this._get(from),\n end = this._get(to);\n\n for (var i = start.index, l = end.index; i <= l; i++) {\n var curve = Curve.getPart(this.curves[i], i === start.index ? start.time : 0, i === end.index ? end.time : 1);\n if (i === start.index) ctx.moveTo(curve[0], curve[1]);\n ctx.bezierCurveTo.apply(ctx, curve.slice(2));\n }\n }\n }, Base.each(Curve._evaluateMethods, function (name) {\n this[name + 'At'] = function (offset) {\n var param = this._get(offset);\n\n return Curve[name](this.curves[param.index], param.time);\n };\n }, {}));\n var PathFitter = Base.extend({\n initialize: function initialize(path) {\n var points = this.points = [],\n segments = path._segments,\n closed = path._closed;\n\n for (var i = 0, prev, l = segments.length; i < l; i++) {\n var point = segments[i].point;\n\n if (!prev || !prev.equals(point)) {\n points.push(prev = point.clone());\n }\n }\n\n if (closed) {\n points.unshift(points[points.length - 1]);\n points.push(points[1]);\n }\n\n this.closed = closed;\n },\n fit: function fit(error) {\n var points = this.points,\n length = points.length,\n segments = null;\n\n if (length > 0) {\n segments = [new Segment(points[0])];\n\n if (length > 1) {\n this.fitCubic(segments, error, 0, length - 1, points[1].subtract(points[0]), points[length - 2].subtract(points[length - 1]));\n\n if (this.closed) {\n segments.shift();\n segments.pop();\n }\n }\n }\n\n return segments;\n },\n fitCubic: function fitCubic(segments, error, first, last, tan1, tan2) {\n var points = this.points;\n\n if (last - first === 1) {\n var pt1 = points[first],\n pt2 = points[last],\n dist = pt1.getDistance(pt2) / 3;\n this.addCurve(segments, [pt1, pt1.add(tan1.normalize(dist)), pt2.add(tan2.normalize(dist)), pt2]);\n return;\n }\n\n var uPrime = this.chordLengthParameterize(first, last),\n maxError = Math.max(error, error * error),\n split,\n parametersInOrder = true;\n\n for (var i = 0; i <= 4; i++) {\n var curve = this.generateBezier(first, last, uPrime, tan1, tan2);\n var max = this.findMaxError(first, last, curve, uPrime);\n\n if (max.error < error && parametersInOrder) {\n this.addCurve(segments, curve);\n return;\n }\n\n split = max.index;\n if (max.error >= maxError) break;\n parametersInOrder = this.reparameterize(first, last, uPrime, curve);\n maxError = max.error;\n }\n\n var tanCenter = points[split - 1].subtract(points[split + 1]);\n this.fitCubic(segments, error, first, split, tan1, tanCenter);\n this.fitCubic(segments, error, split, last, tanCenter.negate(), tan2);\n },\n addCurve: function addCurve(segments, curve) {\n var prev = segments[segments.length - 1];\n prev.setHandleOut(curve[1].subtract(curve[0]));\n segments.push(new Segment(curve[3], curve[2].subtract(curve[3])));\n },\n generateBezier: function generateBezier(first, last, uPrime, tan1, tan2) {\n var epsilon = 1e-12,\n abs = Math.abs,\n points = this.points,\n pt1 = points[first],\n pt2 = points[last],\n C = [[0, 0], [0, 0]],\n X = [0, 0];\n\n for (var i = 0, l = last - first + 1; i < l; i++) {\n var u = uPrime[i],\n t = 1 - u,\n b = 3 * u * t,\n b0 = t * t * t,\n b1 = b * t,\n b2 = b * u,\n b3 = u * u * u,\n a1 = tan1.normalize(b1),\n a2 = tan2.normalize(b2),\n tmp = points[first + i].subtract(pt1.multiply(b0 + b1)).subtract(pt2.multiply(b2 + b3));\n C[0][0] += a1.dot(a1);\n C[0][1] += a1.dot(a2);\n C[1][0] = C[0][1];\n C[1][1] += a2.dot(a2);\n X[0] += a1.dot(tmp);\n X[1] += a2.dot(tmp);\n }\n\n var detC0C1 = C[0][0] * C[1][1] - C[1][0] * C[0][1],\n alpha1,\n alpha2;\n\n if (abs(detC0C1) > epsilon) {\n var detC0X = C[0][0] * X[1] - C[1][0] * X[0],\n detXC1 = X[0] * C[1][1] - X[1] * C[0][1];\n alpha1 = detXC1 / detC0C1;\n alpha2 = detC0X / detC0C1;\n } else {\n var c0 = C[0][0] + C[0][1],\n c1 = C[1][0] + C[1][1];\n alpha1 = alpha2 = abs(c0) > epsilon ? X[0] / c0 : abs(c1) > epsilon ? X[1] / c1 : 0;\n }\n\n var segLength = pt2.getDistance(pt1),\n eps = epsilon * segLength,\n handle1,\n handle2;\n\n if (alpha1 < eps || alpha2 < eps) {\n alpha1 = alpha2 = segLength / 3;\n } else {\n var line = pt2.subtract(pt1);\n handle1 = tan1.normalize(alpha1);\n handle2 = tan2.normalize(alpha2);\n\n if (handle1.dot(line) - handle2.dot(line) > segLength * segLength) {\n alpha1 = alpha2 = segLength / 3;\n handle1 = handle2 = null;\n }\n }\n\n return [pt1, pt1.add(handle1 || tan1.normalize(alpha1)), pt2.add(handle2 || tan2.normalize(alpha2)), pt2];\n },\n reparameterize: function reparameterize(first, last, u, curve) {\n for (var i = first; i <= last; i++) {\n u[i - first] = this.findRoot(curve, this.points[i], u[i - first]);\n }\n\n for (var i = 1, l = u.length; i < l; i++) {\n if (u[i] <= u[i - 1]) return false;\n }\n\n return true;\n },\n findRoot: function findRoot(curve, point, u) {\n var curve1 = [],\n curve2 = [];\n\n for (var i = 0; i <= 2; i++) {\n curve1[i] = curve[i + 1].subtract(curve[i]).multiply(3);\n }\n\n for (var i = 0; i <= 1; i++) {\n curve2[i] = curve1[i + 1].subtract(curve1[i]).multiply(2);\n }\n\n var pt = this.evaluate(3, curve, u),\n pt1 = this.evaluate(2, curve1, u),\n pt2 = this.evaluate(1, curve2, u),\n diff = pt.subtract(point),\n df = pt1.dot(pt1) + diff.dot(pt2);\n return Numerical.isMachineZero(df) ? u : u - diff.dot(pt1) / df;\n },\n evaluate: function evaluate(degree, curve, t) {\n var tmp = curve.slice();\n\n for (var i = 1; i <= degree; i++) {\n for (var j = 0; j <= degree - i; j++) {\n tmp[j] = tmp[j].multiply(1 - t).add(tmp[j + 1].multiply(t));\n }\n }\n\n return tmp[0];\n },\n chordLengthParameterize: function chordLengthParameterize(first, last) {\n var u = [0];\n\n for (var i = first + 1; i <= last; i++) {\n u[i - first] = u[i - first - 1] + this.points[i].getDistance(this.points[i - 1]);\n }\n\n for (var i = 1, m = last - first; i <= m; i++) {\n u[i] /= u[m];\n }\n\n return u;\n },\n findMaxError: function findMaxError(first, last, curve, u) {\n var index = Math.floor((last - first + 1) / 2),\n maxDist = 0;\n\n for (var i = first + 1; i < last; i++) {\n var P = this.evaluate(3, curve, u[i - first]);\n var v = P.subtract(this.points[i]);\n var dist = v.x * v.x + v.y * v.y;\n\n if (dist >= maxDist) {\n maxDist = dist;\n index = i;\n }\n }\n\n return {\n error: maxDist,\n index: index\n };\n }\n });\n var TextItem = Item.extend({\n _class: 'TextItem',\n _applyMatrix: false,\n _canApplyMatrix: false,\n _serializeFields: {\n content: null\n },\n _boundsOptions: {\n stroke: false,\n handle: false\n },\n initialize: function TextItem(arg) {\n this._content = '';\n this._lines = [];\n var hasProps = arg && Base.isPlainObject(arg) && arg.x === undefined && arg.y === undefined;\n\n this._initialize(hasProps && arg, !hasProps && Point.read(arguments));\n },\n _equals: function _equals(item) {\n return this._content === item._content;\n },\n copyContent: function copyContent(source) {\n this.setContent(source._content);\n },\n getContent: function getContent() {\n return this._content;\n },\n setContent: function setContent(content) {\n this._content = '' + content;\n this._lines = this._content.split(/\\r\\n|\\n|\\r/mg);\n\n this._changed(521);\n },\n isEmpty: function isEmpty() {\n return !this._content;\n },\n getCharacterStyle: '#getStyle',\n setCharacterStyle: '#setStyle',\n getParagraphStyle: '#getStyle',\n setParagraphStyle: '#setStyle'\n });\n var PointText = TextItem.extend({\n _class: 'PointText',\n initialize: function PointText() {\n TextItem.apply(this, arguments);\n },\n getPoint: function getPoint() {\n var point = this._matrix.getTranslation();\n\n return new LinkedPoint(point.x, point.y, this, 'setPoint');\n },\n setPoint: function setPoint() {\n var point = Point.read(arguments);\n this.translate(point.subtract(this._matrix.getTranslation()));\n },\n _draw: function _draw(ctx, param, viewMatrix) {\n if (!this._content) return;\n\n this._setStyles(ctx, param, viewMatrix);\n\n var lines = this._lines,\n style = this._style,\n hasFill = style.hasFill(),\n hasStroke = style.hasStroke(),\n leading = style.getLeading(),\n shadowColor = ctx.shadowColor;\n ctx.font = style.getFontStyle();\n ctx.textAlign = style.getJustification();\n\n for (var i = 0, l = lines.length; i < l; i++) {\n ctx.shadowColor = shadowColor;\n var line = lines[i];\n\n if (hasFill) {\n ctx.fillText(line, 0, 0);\n ctx.shadowColor = 'rgba(0,0,0,0)';\n }\n\n if (hasStroke) ctx.strokeText(line, 0, 0);\n ctx.translate(0, leading);\n }\n },\n _getBounds: function _getBounds(matrix, options) {\n var style = this._style,\n lines = this._lines,\n numLines = lines.length,\n justification = style.getJustification(),\n leading = style.getLeading(),\n width = this.getView().getTextWidth(style.getFontStyle(), lines),\n x = 0;\n if (justification !== 'left') x -= width / (justification === 'center' ? 2 : 1);\n var rect = new _Rectangle(x, numLines ? -0.75 * leading : 0, width, numLines * leading);\n return matrix ? matrix._transformBounds(rect, rect) : rect;\n }\n });\n var Color = Base.extend(new function () {\n var types = {\n gray: ['gray'],\n rgb: ['red', 'green', 'blue'],\n hsb: ['hue', 'saturation', 'brightness'],\n hsl: ['hue', 'saturation', 'lightness'],\n gradient: ['gradient', 'origin', 'destination', 'highlight']\n };\n var componentParsers = {},\n namedColors = {\n transparent: [0, 0, 0, 0]\n },\n colorCtx;\n\n function fromCSS(string) {\n var match = string.match(/^#([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})([\\da-f]{2})?$/i) || string.match(/^#([\\da-f])([\\da-f])([\\da-f])([\\da-f])?$/i),\n type = 'rgb',\n components;\n\n if (match) {\n var amount = match[4] ? 4 : 3;\n components = new Array(amount);\n\n for (var i = 0; i < amount; i++) {\n var value = match[i + 1];\n components[i] = parseInt(value.length == 1 ? value + value : value, 16) / 255;\n }\n } else if (match = string.match(/^(rgb|hsl)a?\\((.*)\\)$/)) {\n type = match[1];\n components = match[2].trim().split(/[,\\s]+/g);\n var isHSL = type === 'hsl';\n\n for (var i = 0, l = Math.min(components.length, 4); i < l; i++) {\n var component = components[i];\n var value = parseFloat(component);\n\n if (isHSL) {\n if (i === 0) {\n var unit = component.match(/([a-z]*)$/)[1];\n value *= {\n turn: 360,\n rad: 180 / Math.PI,\n grad: 0.9\n }[unit] || 1;\n } else if (i < 3) {\n value /= 100;\n }\n } else if (i < 3) {\n value /= /%$/.test(component) ? 100 : 255;\n }\n\n components[i] = value;\n }\n } else {\n var color = namedColors[string];\n\n if (!color) {\n if (window) {\n if (!colorCtx) {\n colorCtx = CanvasProvider.getContext(1, 1);\n colorCtx.globalCompositeOperation = 'copy';\n }\n\n colorCtx.fillStyle = 'rgba(0,0,0,0)';\n colorCtx.fillStyle = string;\n colorCtx.fillRect(0, 0, 1, 1);\n var data = colorCtx.getImageData(0, 0, 1, 1).data;\n color = namedColors[string] = [data[0] / 255, data[1] / 255, data[2] / 255];\n } else {\n color = [0, 0, 0];\n }\n }\n\n components = color.slice();\n }\n\n return [type, components];\n }\n\n var hsbIndices = [[0, 3, 1], [2, 0, 1], [1, 0, 3], [1, 2, 0], [3, 1, 0], [0, 1, 2]];\n var converters = {\n 'rgb-hsb': function rgbHsb(r, g, b) {\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b),\n delta = max - min,\n h = delta === 0 ? 0 : (max == r ? (g - b) / delta + (g < b ? 6 : 0) : max == g ? (b - r) / delta + 2 : (r - g) / delta + 4) * 60;\n return [h, max === 0 ? 0 : delta / max, max];\n },\n 'hsb-rgb': function hsbRgb(h, s, b) {\n h = (h / 60 % 6 + 6) % 6;\n var i = Math.floor(h),\n f = h - i,\n i = hsbIndices[i],\n v = [b, b * (1 - s), b * (1 - s * f), b * (1 - s * (1 - f))];\n return [v[i[0]], v[i[1]], v[i[2]]];\n },\n 'rgb-hsl': function rgbHsl(r, g, b) {\n var max = Math.max(r, g, b),\n min = Math.min(r, g, b),\n delta = max - min,\n achromatic = delta === 0,\n h = achromatic ? 0 : (max == r ? (g - b) / delta + (g < b ? 6 : 0) : max == g ? (b - r) / delta + 2 : (r - g) / delta + 4) * 60,\n l = (max + min) / 2,\n s = achromatic ? 0 : l < 0.5 ? delta / (max + min) : delta / (2 - max - min);\n return [h, s, l];\n },\n 'hsl-rgb': function hslRgb(h, s, l) {\n h = (h / 360 % 1 + 1) % 1;\n if (s === 0) return [l, l, l];\n var t3s = [h + 1 / 3, h, h - 1 / 3],\n t2 = l < 0.5 ? l * (1 + s) : l + s - l * s,\n t1 = 2 * l - t2,\n c = [];\n\n for (var i = 0; i < 3; i++) {\n var t3 = t3s[i];\n if (t3 < 0) t3 += 1;\n if (t3 > 1) t3 -= 1;\n c[i] = 6 * t3 < 1 ? t1 + (t2 - t1) * 6 * t3 : 2 * t3 < 1 ? t2 : 3 * t3 < 2 ? t1 + (t2 - t1) * (2 / 3 - t3) * 6 : t1;\n }\n\n return c;\n },\n 'rgb-gray': function rgbGray(r, g, b) {\n return [r * 0.2989 + g * 0.587 + b * 0.114];\n },\n 'gray-rgb': function grayRgb(g) {\n return [g, g, g];\n },\n 'gray-hsb': function grayHsb(g) {\n return [0, 0, g];\n },\n 'gray-hsl': function grayHsl(g) {\n return [0, 0, g];\n },\n 'gradient-rgb': function gradientRgb() {\n return [];\n },\n 'rgb-gradient': function rgbGradient() {\n return [];\n }\n };\n return Base.each(types, function (properties, type) {\n componentParsers[type] = [];\n Base.each(properties, function (name, index) {\n var part = Base.capitalize(name),\n hasOverlap = /^(hue|saturation)$/.test(name),\n parser = componentParsers[type][index] = type === 'gradient' ? name === 'gradient' ? function (value) {\n var current = this._components[0];\n value = Gradient.read(Array.isArray(value) ? value : arguments, 0, {\n readNull: true\n });\n\n if (current !== value) {\n if (current) current._removeOwner(this);\n if (value) value._addOwner(this);\n }\n\n return value;\n } : function () {\n return Point.read(arguments, 0, {\n readNull: name === 'highlight',\n clone: true\n });\n } : function (value) {\n return value == null || isNaN(value) ? 0 : +value;\n };\n\n this['get' + part] = function () {\n return this._type === type || hasOverlap && /^hs[bl]$/.test(this._type) ? this._components[index] : this._convert(type)[index];\n };\n\n this['set' + part] = function (value) {\n if (this._type !== type && !(hasOverlap && /^hs[bl]$/.test(this._type))) {\n this._components = this._convert(type);\n this._properties = types[type];\n this._type = type;\n }\n\n this._components[index] = parser.call(this, value);\n\n this._changed();\n };\n }, this);\n }, {\n _class: 'Color',\n _readIndex: true,\n initialize: function Color(arg) {\n var args = arguments,\n reading = this.__read,\n read = 0,\n type,\n components,\n alpha,\n values;\n\n if (Array.isArray(arg)) {\n args = arg;\n arg = args[0];\n }\n\n var argType = arg != null && typeof arg;\n\n if (argType === 'string' && arg in types) {\n type = arg;\n arg = args[1];\n\n if (Array.isArray(arg)) {\n components = arg;\n alpha = args[2];\n } else {\n if (reading) read = 1;\n args = Base.slice(args, 1);\n argType = typeof arg;\n }\n }\n\n if (!components) {\n values = argType === 'number' ? args : argType === 'object' && arg.length != null ? arg : null;\n\n if (values) {\n if (!type) type = values.length >= 3 ? 'rgb' : 'gray';\n var length = types[type].length;\n alpha = values[length];\n\n if (reading) {\n read += values === arguments ? length + (alpha != null ? 1 : 0) : 1;\n }\n\n if (values.length > length) values = Base.slice(values, 0, length);\n } else if (argType === 'string') {\n var converted = fromCSS(arg);\n type = converted[0];\n components = converted[1];\n\n if (components.length === 4) {\n alpha = components[3];\n components.length--;\n }\n } else if (argType === 'object') {\n if (arg.constructor === Color) {\n type = arg._type;\n components = arg._components.slice();\n alpha = arg._alpha;\n\n if (type === 'gradient') {\n for (var i = 1, l = components.length; i < l; i++) {\n var point = components[i];\n if (point) components[i] = point.clone();\n }\n }\n } else if (arg.constructor === Gradient) {\n type = 'gradient';\n values = args;\n } else {\n type = 'hue' in arg ? 'lightness' in arg ? 'hsl' : 'hsb' : 'gradient' in arg || 'stops' in arg || 'radial' in arg ? 'gradient' : 'gray' in arg ? 'gray' : 'rgb';\n var properties = types[type],\n parsers = componentParsers[type];\n this._components = components = [];\n\n for (var i = 0, l = properties.length; i < l; i++) {\n var value = arg[properties[i]];\n\n if (value == null && !i && type === 'gradient' && 'stops' in arg) {\n value = {\n stops: arg.stops,\n radial: arg.radial\n };\n }\n\n value = parsers[i].call(this, value);\n if (value != null) components[i] = value;\n }\n\n alpha = arg.alpha;\n }\n }\n\n if (reading && type) read = 1;\n }\n\n this._type = type || 'rgb';\n\n if (!components) {\n this._components = components = [];\n var parsers = componentParsers[this._type];\n\n for (var i = 0, l = parsers.length; i < l; i++) {\n var value = parsers[i].call(this, values && values[i]);\n if (value != null) components[i] = value;\n }\n }\n\n this._components = components;\n this._properties = types[this._type];\n this._alpha = alpha;\n if (reading) this.__read = read;\n return this;\n },\n set: '#initialize',\n _serialize: function _serialize(options, dictionary) {\n var components = this.getComponents();\n return Base.serialize(/^(gray|rgb)$/.test(this._type) ? components : [this._type].concat(components), options, true, dictionary);\n },\n _changed: function _changed() {\n this._canvasStyle = null;\n\n if (this._owner) {\n if (this._setter) {\n this._owner[this._setter](this);\n } else {\n this._owner._changed(129);\n }\n }\n },\n _convert: function _convert(type) {\n var converter;\n return this._type === type ? this._components.slice() : (converter = converters[this._type + '-' + type]) ? converter.apply(this, this._components) : converters['rgb-' + type].apply(this, converters[this._type + '-rgb'].apply(this, this._components));\n },\n convert: function convert(type) {\n return new Color(type, this._convert(type), this._alpha);\n },\n getType: function getType() {\n return this._type;\n },\n setType: function setType(type) {\n this._components = this._convert(type);\n this._properties = types[type];\n this._type = type;\n },\n getComponents: function getComponents() {\n var components = this._components.slice();\n\n if (this._alpha != null) components.push(this._alpha);\n return components;\n },\n getAlpha: function getAlpha() {\n return this._alpha != null ? this._alpha : 1;\n },\n setAlpha: function setAlpha(alpha) {\n this._alpha = alpha == null ? null : Math.min(Math.max(alpha, 0), 1);\n\n this._changed();\n },\n hasAlpha: function hasAlpha() {\n return this._alpha != null;\n },\n equals: function equals(color) {\n var col = Base.isPlainValue(color, true) ? Color.read(arguments) : color;\n return col === this || col && this._class === col._class && this._type === col._type && this.getAlpha() === col.getAlpha() && Base.equals(this._components, col._components) || false;\n },\n toString: function toString() {\n var properties = this._properties,\n parts = [],\n isGradient = this._type === 'gradient',\n f = Formatter.instance;\n\n for (var i = 0, l = properties.length; i < l; i++) {\n var value = this._components[i];\n if (value != null) parts.push(properties[i] + ': ' + (isGradient ? value : f.number(value)));\n }\n\n if (this._alpha != null) parts.push('alpha: ' + f.number(this._alpha));\n return '{ ' + parts.join(', ') + ' }';\n },\n toCSS: function toCSS(hex) {\n var components = this._convert('rgb'),\n alpha = hex || this._alpha == null ? 1 : this._alpha;\n\n function convert(val) {\n return Math.round((val < 0 ? 0 : val > 1 ? 1 : val) * 255);\n }\n\n components = [convert(components[0]), convert(components[1]), convert(components[2])];\n if (alpha < 1) components.push(alpha < 0 ? 0 : alpha);\n return hex ? '#' + ((1 << 24) + (components[0] << 16) + (components[1] << 8) + components[2]).toString(16).slice(1) : (components.length == 4 ? 'rgba(' : 'rgb(') + components.join(',') + ')';\n },\n toCanvasStyle: function toCanvasStyle(ctx, matrix) {\n if (this._canvasStyle) return this._canvasStyle;\n if (this._type !== 'gradient') return this._canvasStyle = this.toCSS();\n var components = this._components,\n gradient = components[0],\n stops = gradient._stops,\n origin = components[1],\n destination = components[2],\n highlight = components[3],\n inverse = matrix && matrix.inverted(),\n canvasGradient;\n\n if (inverse) {\n origin = inverse._transformPoint(origin);\n destination = inverse._transformPoint(destination);\n if (highlight) highlight = inverse._transformPoint(highlight);\n }\n\n if (gradient._radial) {\n var radius = destination.getDistance(origin);\n\n if (highlight) {\n var vector = highlight.subtract(origin);\n if (vector.getLength() > radius) highlight = origin.add(vector.normalize(radius - 0.1));\n }\n\n var start = highlight || origin;\n canvasGradient = ctx.createRadialGradient(start.x, start.y, 0, origin.x, origin.y, radius);\n } else {\n canvasGradient = ctx.createLinearGradient(origin.x, origin.y, destination.x, destination.y);\n }\n\n for (var i = 0, l = stops.length; i < l; i++) {\n var stop = stops[i],\n offset = stop._offset;\n canvasGradient.addColorStop(offset == null ? i / (l - 1) : offset, stop._color.toCanvasStyle());\n }\n\n return this._canvasStyle = canvasGradient;\n },\n transform: function transform(matrix) {\n if (this._type === 'gradient') {\n var components = this._components;\n\n for (var i = 1, l = components.length; i < l; i++) {\n var point = components[i];\n\n matrix._transformPoint(point, point, true);\n }\n\n this._changed();\n }\n },\n statics: {\n _types: types,\n random: function random() {\n var random = Math.random;\n return new Color(random(), random(), random());\n },\n _setOwner: function _setOwner(color, owner, setter) {\n if (color) {\n if (color._owner && owner && color._owner !== owner) {\n color = color.clone();\n }\n\n if (!color._owner ^ !owner) {\n color._owner = owner || null;\n color._setter = setter || null;\n }\n }\n\n return color;\n }\n }\n });\n }(), new function () {\n var operators = {\n add: function add(a, b) {\n return a + b;\n },\n subtract: function subtract(a, b) {\n return a - b;\n },\n multiply: function multiply(a, b) {\n return a * b;\n },\n divide: function divide(a, b) {\n return a / b;\n }\n };\n return Base.each(operators, function (operator, name) {\n this[name] = function (color) {\n color = Color.read(arguments);\n\n var type = this._type,\n components1 = this._components,\n components2 = color._convert(type);\n\n for (var i = 0, l = components1.length; i < l; i++) {\n components2[i] = operator(components1[i], components2[i]);\n }\n\n return new Color(type, components2, this._alpha != null ? operator(this._alpha, color.getAlpha()) : null);\n };\n }, {});\n }());\n var Gradient = Base.extend({\n _class: 'Gradient',\n initialize: function Gradient(stops, radial) {\n this._id = UID.get();\n\n if (stops && Base.isPlainObject(stops)) {\n this.set(stops);\n stops = radial = null;\n }\n\n if (this._stops == null) {\n this.setStops(stops || ['white', 'black']);\n }\n\n if (this._radial == null) {\n this.setRadial(typeof radial === 'string' && radial === 'radial' || radial || false);\n }\n },\n _serialize: function _serialize(options, dictionary) {\n return dictionary.add(this, function () {\n return Base.serialize([this._stops, this._radial], options, true, dictionary);\n });\n },\n _changed: function _changed() {\n for (var i = 0, l = this._owners && this._owners.length; i < l; i++) {\n this._owners[i]._changed();\n }\n },\n _addOwner: function _addOwner(color) {\n if (!this._owners) this._owners = [];\n\n this._owners.push(color);\n },\n _removeOwner: function _removeOwner(color) {\n var index = this._owners ? this._owners.indexOf(color) : -1;\n\n if (index != -1) {\n this._owners.splice(index, 1);\n\n if (!this._owners.length) this._owners = undefined;\n }\n },\n clone: function clone() {\n var stops = [];\n\n for (var i = 0, l = this._stops.length; i < l; i++) {\n stops[i] = this._stops[i].clone();\n }\n\n return new Gradient(stops, this._radial);\n },\n getStops: function getStops() {\n return this._stops;\n },\n setStops: function setStops(stops) {\n if (stops.length < 2) {\n throw new Error('Gradient stop list needs to contain at least two stops.');\n }\n\n var _stops = this._stops;\n\n if (_stops) {\n for (var i = 0, l = _stops.length; i < l; i++) {\n _stops[i]._owner = undefined;\n }\n }\n\n _stops = this._stops = GradientStop.readList(stops, 0, {\n clone: true\n });\n\n for (var i = 0, l = _stops.length; i < l; i++) {\n _stops[i]._owner = this;\n }\n\n this._changed();\n },\n getRadial: function getRadial() {\n return this._radial;\n },\n setRadial: function setRadial(radial) {\n this._radial = radial;\n\n this._changed();\n },\n equals: function equals(gradient) {\n if (gradient === this) return true;\n\n if (gradient && this._class === gradient._class) {\n var stops1 = this._stops,\n stops2 = gradient._stops,\n length = stops1.length;\n\n if (length === stops2.length) {\n for (var i = 0; i < length; i++) {\n if (!stops1[i].equals(stops2[i])) return false;\n }\n\n return true;\n }\n }\n\n return false;\n }\n });\n var GradientStop = Base.extend({\n _class: 'GradientStop',\n initialize: function GradientStop(arg0, arg1) {\n var color = arg0,\n offset = arg1;\n\n if (typeof arg0 === 'object' && arg1 === undefined) {\n if (Array.isArray(arg0) && typeof arg0[0] !== 'number') {\n color = arg0[0];\n offset = arg0[1];\n } else if ('color' in arg0 || 'offset' in arg0 || 'rampPoint' in arg0) {\n color = arg0.color;\n offset = arg0.offset || arg0.rampPoint || 0;\n }\n }\n\n this.setColor(color);\n this.setOffset(offset);\n },\n clone: function clone() {\n return new GradientStop(this._color.clone(), this._offset);\n },\n _serialize: function _serialize(options, dictionary) {\n var color = this._color,\n offset = this._offset;\n return Base.serialize(offset == null ? [color] : [color, offset], options, true, dictionary);\n },\n _changed: function _changed() {\n if (this._owner) this._owner._changed(129);\n },\n getOffset: function getOffset() {\n return this._offset;\n },\n setOffset: function setOffset(offset) {\n this._offset = offset;\n\n this._changed();\n },\n getRampPoint: '#getOffset',\n setRampPoint: '#setOffset',\n getColor: function getColor() {\n return this._color;\n },\n setColor: function setColor() {\n Color._setOwner(this._color, null);\n\n this._color = Color._setOwner(Color.read(arguments, 0), this, 'setColor');\n\n this._changed();\n },\n equals: function equals(stop) {\n return stop === this || stop && this._class === stop._class && this._color.equals(stop._color) && this._offset == stop._offset || false;\n }\n });\n var Style = Base.extend(new function () {\n var itemDefaults = {\n fillColor: null,\n fillRule: 'nonzero',\n strokeColor: null,\n strokeWidth: 1,\n strokeCap: 'butt',\n strokeJoin: 'miter',\n strokeScaling: true,\n miterLimit: 10,\n dashOffset: 0,\n dashArray: [],\n shadowColor: null,\n shadowBlur: 0,\n shadowOffset: new Point(),\n selectedColor: null\n },\n groupDefaults = Base.set({}, itemDefaults, {\n fontFamily: 'sans-serif',\n fontWeight: 'normal',\n fontSize: 12,\n leading: null,\n justification: 'left'\n }),\n textDefaults = Base.set({}, groupDefaults, {\n fillColor: new Color()\n }),\n flags = {\n strokeWidth: 193,\n strokeCap: 193,\n strokeJoin: 193,\n strokeScaling: 201,\n miterLimit: 193,\n fontFamily: 9,\n fontWeight: 9,\n fontSize: 9,\n font: 9,\n leading: 9,\n justification: 9\n },\n item = {\n beans: true\n },\n fields = {\n _class: 'Style',\n beans: true,\n initialize: function Style(style, _owner, _project) {\n this._values = {};\n this._owner = _owner;\n this._project = _owner && _owner._project || _project || paper.project;\n this._defaults = !_owner || _owner instanceof Group ? groupDefaults : _owner instanceof TextItem ? textDefaults : itemDefaults;\n if (style) this.set(style);\n }\n };\n Base.each(groupDefaults, function (value, key) {\n var isColor = /Color$/.test(key),\n isPoint = key === 'shadowOffset',\n part = Base.capitalize(key),\n flag = flags[key],\n set = 'set' + part,\n get = 'get' + part;\n\n fields[set] = function (value) {\n var owner = this._owner,\n children = owner && owner._children,\n applyToChildren = children && children.length > 0 && !(owner instanceof CompoundPath);\n\n if (applyToChildren) {\n for (var i = 0, l = children.length; i < l; i++) {\n children[i]._style[set](value);\n }\n }\n\n if ((key === 'selectedColor' || !applyToChildren) && key in this._defaults) {\n var old = this._values[key];\n\n if (old !== value) {\n if (isColor) {\n if (old) {\n Color._setOwner(old, null);\n\n old._canvasStyle = null;\n }\n\n if (value && value.constructor === Color) {\n value = Color._setOwner(value, owner, applyToChildren && set);\n }\n }\n\n this._values[key] = value;\n if (owner) owner._changed(flag || 129);\n }\n }\n };\n\n fields[get] = function (_dontMerge) {\n var owner = this._owner,\n children = owner && owner._children,\n applyToChildren = children && children.length > 0 && !(owner instanceof CompoundPath),\n value;\n\n if (applyToChildren && !_dontMerge) {\n for (var i = 0, l = children.length; i < l; i++) {\n var childValue = children[i]._style[get]();\n\n if (!i) {\n value = childValue;\n } else if (!Base.equals(value, childValue)) {\n return undefined;\n }\n }\n } else if (key in this._defaults) {\n var value = this._values[key];\n\n if (value === undefined) {\n value = this._defaults[key];\n\n if (value && value.clone) {\n value = value.clone();\n }\n } else {\n var ctor = isColor ? Color : isPoint ? Point : null;\n\n if (ctor && !(value && value.constructor === ctor)) {\n this._values[key] = value = ctor.read([value], 0, {\n readNull: true,\n clone: true\n });\n }\n }\n }\n\n if (value && isColor) {\n value = Color._setOwner(value, owner, applyToChildren && set);\n }\n\n return value;\n };\n\n item[get] = function (_dontMerge) {\n return this._style[get](_dontMerge);\n };\n\n item[set] = function (value) {\n this._style[set](value);\n };\n });\n Base.each({\n Font: 'FontFamily',\n WindingRule: 'FillRule'\n }, function (value, key) {\n var get = 'get' + key,\n set = 'set' + key;\n fields[get] = item[get] = '#get' + value;\n fields[set] = item[set] = '#set' + value;\n });\n Item.inject(item);\n return fields;\n }(), {\n set: function set(style) {\n var isStyle = style instanceof Style,\n values = isStyle ? style._values : style;\n\n if (values) {\n for (var key in values) {\n if (key in this._defaults) {\n var value = values[key];\n this[key] = value && isStyle && value.clone ? value.clone() : value;\n }\n }\n }\n },\n equals: function equals(style) {\n function compare(style1, style2, secondary) {\n var values1 = style1._values,\n values2 = style2._values,\n defaults2 = style2._defaults;\n\n for (var key in values1) {\n var value1 = values1[key],\n value2 = values2[key];\n if (!(secondary && key in values2) && !Base.equals(value1, value2 === undefined ? defaults2[key] : value2)) return false;\n }\n\n return true;\n }\n\n return style === this || style && this._class === style._class && compare(this, style) && compare(style, this, true) || false;\n },\n _dispose: function _dispose() {\n var color;\n color = this.getFillColor();\n if (color) color._canvasStyle = null;\n color = this.getStrokeColor();\n if (color) color._canvasStyle = null;\n color = this.getShadowColor();\n if (color) color._canvasStyle = null;\n },\n hasFill: function hasFill() {\n var color = this.getFillColor();\n return !!color && color.alpha > 0;\n },\n hasStroke: function hasStroke() {\n var color = this.getStrokeColor();\n return !!color && color.alpha > 0 && this.getStrokeWidth() > 0;\n },\n hasShadow: function hasShadow() {\n var color = this.getShadowColor();\n return !!color && color.alpha > 0 && (this.getShadowBlur() > 0 || !this.getShadowOffset().isZero());\n },\n getView: function getView() {\n return this._project._view;\n },\n getFontStyle: function getFontStyle() {\n var fontSize = this.getFontSize();\n return this.getFontWeight() + ' ' + fontSize + (/[a-z]/i.test(fontSize + '') ? ' ' : 'px ') + this.getFontFamily();\n },\n getFont: '#getFontFamily',\n setFont: '#setFontFamily',\n getLeading: function getLeading() {\n var leading = getLeading.base.call(this),\n fontSize = this.getFontSize();\n if (/pt|em|%|px/.test(fontSize)) fontSize = this.getView().getPixelSize(fontSize);\n return leading != null ? leading : fontSize * 1.2;\n }\n });\n var DomElement = new function () {\n function handlePrefix(el, name, set, value) {\n var prefixes = ['', 'webkit', 'moz', 'Moz', 'ms', 'o'],\n suffix = name[0].toUpperCase() + name.substring(1);\n\n for (var i = 0; i < 6; i++) {\n var prefix = prefixes[i],\n key = prefix ? prefix + suffix : name;\n\n if (key in el) {\n if (set) {\n el[key] = value;\n } else {\n return el[key];\n }\n\n break;\n }\n }\n }\n\n return {\n getStyles: function getStyles(el) {\n var doc = el && el.nodeType !== 9 ? el.ownerDocument : el,\n view = doc && doc.defaultView;\n return view && view.getComputedStyle(el, '');\n },\n getBounds: function getBounds(el, viewport) {\n var doc = el.ownerDocument,\n body = doc.body,\n html = doc.documentElement,\n rect;\n\n try {\n rect = el.getBoundingClientRect();\n } catch (e) {\n rect = {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n };\n }\n\n var x = rect.left - (html.clientLeft || body.clientLeft || 0),\n y = rect.top - (html.clientTop || body.clientTop || 0);\n\n if (!viewport) {\n var view = doc.defaultView;\n x += view.pageXOffset || html.scrollLeft || body.scrollLeft;\n y += view.pageYOffset || html.scrollTop || body.scrollTop;\n }\n\n return new _Rectangle(x, y, rect.width, rect.height);\n },\n getViewportBounds: function getViewportBounds(el) {\n var doc = el.ownerDocument,\n view = doc.defaultView,\n html = doc.documentElement;\n return new _Rectangle(0, 0, view.innerWidth || html.clientWidth, view.innerHeight || html.clientHeight);\n },\n getOffset: function getOffset(el, viewport) {\n return DomElement.getBounds(el, viewport).getPoint();\n },\n getSize: function getSize(el) {\n return DomElement.getBounds(el, true).getSize();\n },\n isInvisible: function isInvisible(el) {\n return DomElement.getSize(el).equals(new Size(0, 0));\n },\n isInView: function isInView(el) {\n return !DomElement.isInvisible(el) && DomElement.getViewportBounds(el).intersects(DomElement.getBounds(el, true));\n },\n isInserted: function isInserted(el) {\n return document.body.contains(el);\n },\n getPrefixed: function getPrefixed(el, name) {\n return el && handlePrefix(el, name);\n },\n setPrefixed: function setPrefixed(el, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n handlePrefix(el, key, true, name[key]);\n }\n } else {\n handlePrefix(el, name, true, value);\n }\n }\n };\n }();\n var DomEvent = {\n add: function add(el, events) {\n if (el) {\n for (var type in events) {\n var func = events[type],\n parts = type.split(/[\\s,]+/g);\n\n for (var i = 0, l = parts.length; i < l; i++) {\n var name = parts[i];\n var options = el === document && (name === 'touchstart' || name === 'touchmove') ? {\n passive: false\n } : false;\n el.addEventListener(name, func, options);\n }\n }\n }\n },\n remove: function remove(el, events) {\n if (el) {\n for (var type in events) {\n var func = events[type],\n parts = type.split(/[\\s,]+/g);\n\n for (var i = 0, l = parts.length; i < l; i++) {\n el.removeEventListener(parts[i], func, false);\n }\n }\n }\n },\n getPoint: function getPoint(event) {\n var pos = event.targetTouches ? event.targetTouches.length ? event.targetTouches[0] : event.changedTouches[0] : event;\n return new Point(pos.pageX || pos.clientX + document.documentElement.scrollLeft, pos.pageY || pos.clientY + document.documentElement.scrollTop);\n },\n getTarget: function getTarget(event) {\n return event.target || event.srcElement;\n },\n getRelatedTarget: function getRelatedTarget(event) {\n return event.relatedTarget || event.toElement;\n },\n getOffset: function getOffset(event, target) {\n return DomEvent.getPoint(event).subtract(DomElement.getOffset(target || DomEvent.getTarget(event)));\n }\n };\n DomEvent.requestAnimationFrame = new function () {\n var nativeRequest = DomElement.getPrefixed(window, 'requestAnimationFrame'),\n requested = false,\n callbacks = [],\n timer;\n\n function handleCallbacks() {\n var functions = callbacks;\n callbacks = [];\n\n for (var i = 0, l = functions.length; i < l; i++) {\n functions[i]();\n }\n\n requested = nativeRequest && callbacks.length;\n if (requested) nativeRequest(handleCallbacks);\n }\n\n return function (callback) {\n callbacks.push(callback);\n\n if (nativeRequest) {\n if (!requested) {\n nativeRequest(handleCallbacks);\n requested = true;\n }\n } else if (!timer) {\n timer = setInterval(handleCallbacks, 1000 / 60);\n }\n };\n }();\n var View = Base.extend(Emitter, {\n _class: 'View',\n initialize: function View(project, element) {\n function getSize(name) {\n return element[name] || parseInt(element.getAttribute(name), 10);\n }\n\n function getCanvasSize() {\n var size = DomElement.getSize(element);\n return size.isNaN() || size.isZero() ? new Size(getSize('width'), getSize('height')) : size;\n }\n\n var size;\n\n if (window && element) {\n this._id = element.getAttribute('id');\n if (this._id == null) element.setAttribute('id', this._id = 'paper-view-' + View._id++);\n DomEvent.add(element, this._viewEvents);\n var none = 'none';\n DomElement.setPrefixed(element.style, {\n userDrag: none,\n userSelect: none,\n touchCallout: none,\n contentZooming: none,\n tapHighlightColor: 'rgba(0,0,0,0)'\n });\n\n if (PaperScope.hasAttribute(element, 'resize')) {\n var that = this;\n DomEvent.add(window, this._windowEvents = {\n resize: function resize() {\n that.setViewSize(getCanvasSize());\n }\n });\n }\n\n size = getCanvasSize();\n\n if (PaperScope.hasAttribute(element, 'stats') && typeof Stats !== 'undefined') {\n this._stats = new Stats();\n var stats = this._stats.domElement,\n style = stats.style,\n offset = DomElement.getOffset(element);\n style.position = 'absolute';\n style.left = offset.x + 'px';\n style.top = offset.y + 'px';\n document.body.appendChild(stats);\n }\n } else {\n size = new Size(element);\n element = null;\n }\n\n this._project = project;\n this._scope = project._scope;\n this._element = element;\n if (!this._pixelRatio) this._pixelRatio = window && window.devicePixelRatio || 1;\n\n this._setElementSize(size.width, size.height);\n\n this._viewSize = size;\n\n View._views.push(this);\n\n View._viewsById[this._id] = this;\n (this._matrix = new Matrix())._owner = this;\n if (!View._focused) View._focused = this;\n this._frameItems = {};\n this._frameItemCount = 0;\n this._itemEvents = {\n native: {},\n virtual: {}\n };\n this._autoUpdate = !paper.agent.node;\n this._needsUpdate = false;\n },\n remove: function remove() {\n if (!this._project) return false;\n if (View._focused === this) View._focused = null;\n\n View._views.splice(View._views.indexOf(this), 1);\n\n delete View._viewsById[this._id];\n var project = this._project;\n if (project._view === this) project._view = null;\n DomEvent.remove(this._element, this._viewEvents);\n DomEvent.remove(window, this._windowEvents);\n this._element = this._project = null;\n this.off('frame');\n this._animate = false;\n this._frameItems = {};\n return true;\n },\n _events: Base.each(Item._itemHandlers.concat(['onResize', 'onKeyDown', 'onKeyUp']), function (name) {\n this[name] = {};\n }, {\n onFrame: {\n install: function install() {\n this.play();\n },\n uninstall: function uninstall() {\n this.pause();\n }\n }\n }),\n _animate: false,\n _time: 0,\n _count: 0,\n getAutoUpdate: function getAutoUpdate() {\n return this._autoUpdate;\n },\n setAutoUpdate: function setAutoUpdate(autoUpdate) {\n this._autoUpdate = autoUpdate;\n if (autoUpdate) this.requestUpdate();\n },\n update: function update() {},\n draw: function draw() {\n this.update();\n },\n requestUpdate: function requestUpdate() {\n if (!this._requested) {\n var that = this;\n DomEvent.requestAnimationFrame(function () {\n that._requested = false;\n\n if (that._animate) {\n that.requestUpdate();\n var element = that._element;\n\n if ((!DomElement.getPrefixed(document, 'hidden') || PaperScope.getAttribute(element, 'keepalive') === 'true') && DomElement.isInView(element)) {\n that._handleFrame();\n }\n }\n\n if (that._autoUpdate) that.update();\n });\n this._requested = true;\n }\n },\n play: function play() {\n this._animate = true;\n this.requestUpdate();\n },\n pause: function pause() {\n this._animate = false;\n },\n _handleFrame: function _handleFrame() {\n paper = this._scope;\n var now = Date.now() / 1000,\n delta = this._last ? now - this._last : 0;\n this._last = now;\n this.emit('frame', new Base({\n delta: delta,\n time: this._time += delta,\n count: this._count++\n }));\n if (this._stats) this._stats.update();\n },\n _animateItem: function _animateItem(item, animate) {\n var items = this._frameItems;\n\n if (animate) {\n items[item._id] = {\n item: item,\n time: 0,\n count: 0\n };\n if (++this._frameItemCount === 1) this.on('frame', this._handleFrameItems);\n } else {\n delete items[item._id];\n\n if (--this._frameItemCount === 0) {\n this.off('frame', this._handleFrameItems);\n }\n }\n },\n _handleFrameItems: function _handleFrameItems(event) {\n for (var i in this._frameItems) {\n var entry = this._frameItems[i];\n entry.item.emit('frame', new Base(event, {\n time: entry.time += event.delta,\n count: entry.count++\n }));\n }\n },\n _changed: function _changed() {\n this._project._changed(4097);\n\n this._bounds = this._decomposed = undefined;\n },\n getElement: function getElement() {\n return this._element;\n },\n getPixelRatio: function getPixelRatio() {\n return this._pixelRatio;\n },\n getResolution: function getResolution() {\n return this._pixelRatio * 72;\n },\n getViewSize: function getViewSize() {\n var size = this._viewSize;\n return new LinkedSize(size.width, size.height, this, 'setViewSize');\n },\n setViewSize: function setViewSize() {\n var size = Size.read(arguments),\n delta = size.subtract(this._viewSize);\n if (delta.isZero()) return;\n\n this._setElementSize(size.width, size.height);\n\n this._viewSize.set(size);\n\n this._changed();\n\n this.emit('resize', {\n size: size,\n delta: delta\n });\n\n if (this._autoUpdate) {\n this.update();\n }\n },\n _setElementSize: function _setElementSize(width, height) {\n var element = this._element;\n\n if (element) {\n if (element.width !== width) element.width = width;\n if (element.height !== height) element.height = height;\n }\n },\n getBounds: function getBounds() {\n if (!this._bounds) this._bounds = this._matrix.inverted()._transformBounds(new _Rectangle(new Point(), this._viewSize));\n return this._bounds;\n },\n getSize: function getSize() {\n return this.getBounds().getSize();\n },\n isVisible: function isVisible() {\n return DomElement.isInView(this._element);\n },\n isInserted: function isInserted() {\n return DomElement.isInserted(this._element);\n },\n getPixelSize: function getPixelSize(size) {\n var element = this._element,\n pixels;\n\n if (element) {\n var parent = element.parentNode,\n temp = document.createElement('div');\n temp.style.fontSize = size;\n parent.appendChild(temp);\n pixels = parseFloat(DomElement.getStyles(temp).fontSize);\n parent.removeChild(temp);\n } else {\n pixels = parseFloat(pixels);\n }\n\n return pixels;\n },\n getTextWidth: function getTextWidth(font, lines) {\n return 0;\n }\n }, Base.each(['rotate', 'scale', 'shear', 'skew'], function (key) {\n var rotate = key === 'rotate';\n\n this[key] = function () {\n var args = arguments,\n value = (rotate ? Base : Point).read(args),\n center = Point.read(args, 0, {\n readNull: true\n });\n return this.transform(new Matrix()[key](value, center || this.getCenter(true)));\n };\n }, {\n _decompose: function _decompose() {\n return this._decomposed || (this._decomposed = this._matrix.decompose());\n },\n translate: function translate() {\n var mx = new Matrix();\n return this.transform(mx.translate.apply(mx, arguments));\n },\n getCenter: function getCenter() {\n return this.getBounds().getCenter();\n },\n setCenter: function setCenter() {\n var center = Point.read(arguments);\n this.translate(this.getCenter().subtract(center));\n },\n getZoom: function getZoom() {\n var scaling = this._decompose().scaling;\n\n return (scaling.x + scaling.y) / 2;\n },\n setZoom: function setZoom(zoom) {\n this.transform(new Matrix().scale(zoom / this.getZoom(), this.getCenter()));\n },\n getRotation: function getRotation() {\n return this._decompose().rotation;\n },\n setRotation: function setRotation(rotation) {\n var current = this.getRotation();\n\n if (current != null && rotation != null) {\n this.rotate(rotation - current);\n }\n },\n getScaling: function getScaling() {\n var scaling = this._decompose().scaling;\n\n return new LinkedPoint(scaling.x, scaling.y, this, 'setScaling');\n },\n setScaling: function setScaling() {\n var current = this.getScaling(),\n scaling = Point.read(arguments, 0, {\n clone: true,\n readNull: true\n });\n\n if (current && scaling) {\n this.scale(scaling.x / current.x, scaling.y / current.y);\n }\n },\n getMatrix: function getMatrix() {\n return this._matrix;\n },\n setMatrix: function setMatrix() {\n var matrix = this._matrix;\n matrix.set.apply(matrix, arguments);\n },\n transform: function transform(matrix) {\n this._matrix.append(matrix);\n },\n scrollBy: function scrollBy() {\n this.translate(Point.read(arguments).negate());\n }\n }), {\n projectToView: function projectToView() {\n return this._matrix._transformPoint(Point.read(arguments));\n },\n viewToProject: function viewToProject() {\n return this._matrix._inverseTransform(Point.read(arguments));\n },\n getEventPoint: function getEventPoint(event) {\n return this.viewToProject(DomEvent.getOffset(event, this._element));\n }\n }, {\n statics: {\n _views: [],\n _viewsById: {},\n _id: 0,\n create: function create(project, element) {\n if (document && typeof element === 'string') element = document.getElementById(element);\n var ctor = window ? CanvasView : View;\n return new ctor(project, element);\n }\n }\n }, new function () {\n if (!window) return;\n var prevFocus,\n tempFocus,\n dragging = false,\n mouseDown = false;\n\n function getView(event) {\n var target = DomEvent.getTarget(event);\n return target.getAttribute && View._viewsById[target.getAttribute('id')];\n }\n\n function updateFocus() {\n var view = View._focused;\n\n if (!view || !view.isVisible()) {\n for (var i = 0, l = View._views.length; i < l; i++) {\n if ((view = View._views[i]).isVisible()) {\n View._focused = tempFocus = view;\n break;\n }\n }\n }\n }\n\n function handleMouseMove(view, event, point) {\n view._handleMouseEvent('mousemove', event, point);\n }\n\n var navigator = window.navigator,\n mousedown,\n mousemove,\n mouseup;\n\n if (navigator.pointerEnabled || navigator.msPointerEnabled) {\n mousedown = 'pointerdown MSPointerDown';\n mousemove = 'pointermove MSPointerMove';\n mouseup = 'pointerup pointercancel MSPointerUp MSPointerCancel';\n } else {\n mousedown = 'touchstart';\n mousemove = 'touchmove';\n mouseup = 'touchend touchcancel';\n\n if (!('ontouchstart' in window && navigator.userAgent.match(/mobile|tablet|ip(ad|hone|od)|android|silk/i))) {\n mousedown += ' mousedown';\n mousemove += ' mousemove';\n mouseup += ' mouseup';\n }\n }\n\n var viewEvents = {},\n docEvents = {\n mouseout: function mouseout(event) {\n var view = View._focused,\n target = DomEvent.getRelatedTarget(event);\n\n if (view && (!target || target.nodeName === 'HTML')) {\n var offset = DomEvent.getOffset(event, view._element),\n x = offset.x,\n abs = Math.abs,\n ax = abs(x),\n max = 1 << 25,\n diff = ax - max;\n offset.x = abs(diff) < ax ? diff * (x < 0 ? -1 : 1) : x;\n handleMouseMove(view, event, view.viewToProject(offset));\n }\n },\n scroll: updateFocus\n };\n\n viewEvents[mousedown] = function (event) {\n var view = View._focused = getView(event);\n\n if (!dragging) {\n dragging = true;\n\n view._handleMouseEvent('mousedown', event);\n }\n };\n\n docEvents[mousemove] = function (event) {\n var view = View._focused;\n\n if (!mouseDown) {\n var target = getView(event);\n\n if (target) {\n if (view !== target) {\n if (view) handleMouseMove(view, event);\n if (!prevFocus) prevFocus = view;\n view = View._focused = tempFocus = target;\n }\n } else if (tempFocus && tempFocus === view) {\n if (prevFocus && !prevFocus.isInserted()) prevFocus = null;\n view = View._focused = prevFocus;\n prevFocus = null;\n updateFocus();\n }\n }\n\n if (view) handleMouseMove(view, event);\n };\n\n docEvents[mousedown] = function () {\n mouseDown = true;\n };\n\n docEvents[mouseup] = function (event) {\n var view = View._focused;\n if (view && dragging) view._handleMouseEvent('mouseup', event);\n mouseDown = dragging = false;\n };\n\n DomEvent.add(document, docEvents);\n DomEvent.add(window, {\n load: updateFocus\n });\n var called = false,\n prevented = false,\n fallbacks = {\n doubleclick: 'click',\n mousedrag: 'mousemove'\n },\n wasInView = false,\n overView,\n downPoint,\n lastPoint,\n downItem,\n overItem,\n dragItem,\n clickItem,\n clickTime,\n dblClick;\n\n function emitMouseEvent(obj, target, type, event, point, prevPoint, stopItem) {\n var stopped = false,\n mouseEvent;\n\n function emit(obj, type) {\n if (obj.responds(type)) {\n if (!mouseEvent) {\n mouseEvent = new MouseEvent(type, event, point, target || obj, prevPoint ? point.subtract(prevPoint) : null);\n }\n\n if (obj.emit(type, mouseEvent)) {\n called = true;\n if (mouseEvent.prevented) prevented = true;\n if (mouseEvent.stopped) return stopped = true;\n }\n } else {\n var fallback = fallbacks[type];\n if (fallback) return emit(obj, fallback);\n }\n }\n\n while (obj && obj !== stopItem) {\n if (emit(obj, type)) break;\n obj = obj._parent;\n }\n\n return stopped;\n }\n\n function emitMouseEvents(view, hitItem, type, event, point, prevPoint) {\n view._project.removeOn(type);\n\n prevented = called = false;\n return dragItem && emitMouseEvent(dragItem, null, type, event, point, prevPoint) || hitItem && hitItem !== dragItem && !hitItem.isDescendant(dragItem) && emitMouseEvent(hitItem, null, type === 'mousedrag' ? 'mousemove' : type, event, point, prevPoint, dragItem) || emitMouseEvent(view, dragItem || hitItem || view, type, event, point, prevPoint);\n }\n\n var itemEventsMap = {\n mousedown: {\n mousedown: 1,\n mousedrag: 1,\n click: 1,\n doubleclick: 1\n },\n mouseup: {\n mouseup: 1,\n mousedrag: 1,\n click: 1,\n doubleclick: 1\n },\n mousemove: {\n mousedrag: 1,\n mousemove: 1,\n mouseenter: 1,\n mouseleave: 1\n }\n };\n return {\n _viewEvents: viewEvents,\n _handleMouseEvent: function _handleMouseEvent(type, event, point) {\n var itemEvents = this._itemEvents,\n hitItems = itemEvents.native[type],\n nativeMove = type === 'mousemove',\n tool = this._scope.tool,\n view = this;\n\n function responds(type) {\n return itemEvents.virtual[type] || view.responds(type) || tool && tool.responds(type);\n }\n\n if (nativeMove && dragging && responds('mousedrag')) type = 'mousedrag';\n if (!point) point = this.getEventPoint(event);\n\n var inView = this.getBounds().contains(point),\n hit = hitItems && inView && view._project.hitTest(point, {\n tolerance: 0,\n fill: true,\n stroke: true\n }),\n hitItem = hit && hit.item || null,\n handle = false,\n mouse = {};\n\n mouse[type.substr(5)] = true;\n\n if (hitItems && hitItem !== overItem) {\n if (overItem) {\n emitMouseEvent(overItem, null, 'mouseleave', event, point);\n }\n\n if (hitItem) {\n emitMouseEvent(hitItem, null, 'mouseenter', event, point);\n }\n\n overItem = hitItem;\n }\n\n if (wasInView ^ inView) {\n emitMouseEvent(this, null, inView ? 'mouseenter' : 'mouseleave', event, point);\n overView = inView ? this : null;\n handle = true;\n }\n\n if ((inView || mouse.drag) && !point.equals(lastPoint)) {\n emitMouseEvents(this, hitItem, nativeMove ? type : 'mousemove', event, point, lastPoint);\n handle = true;\n }\n\n wasInView = inView;\n\n if (mouse.down && inView || mouse.up && downPoint) {\n emitMouseEvents(this, hitItem, type, event, point, downPoint);\n\n if (mouse.down) {\n dblClick = hitItem === clickItem && Date.now() - clickTime < 300;\n downItem = clickItem = hitItem;\n\n if (!prevented && hitItem) {\n var item = hitItem;\n\n while (item && !item.responds('mousedrag')) {\n item = item._parent;\n }\n\n if (item) dragItem = hitItem;\n }\n\n downPoint = point;\n } else if (mouse.up) {\n if (!prevented && hitItem === downItem) {\n clickTime = Date.now();\n emitMouseEvents(this, hitItem, dblClick ? 'doubleclick' : 'click', event, point, downPoint);\n dblClick = false;\n }\n\n downItem = dragItem = null;\n }\n\n wasInView = false;\n handle = true;\n }\n\n lastPoint = point;\n\n if (handle && tool) {\n called = tool._handleMouseEvent(type, event, point, mouse) || called;\n }\n\n if (event.cancelable !== false && (called && !mouse.move || mouse.down && responds('mouseup'))) {\n event.preventDefault();\n }\n },\n _handleKeyEvent: function _handleKeyEvent(type, event, key, character) {\n var scope = this._scope,\n tool = scope.tool,\n keyEvent;\n\n function emit(obj) {\n if (obj.responds(type)) {\n paper = scope;\n obj.emit(type, keyEvent = keyEvent || new KeyEvent(type, event, key, character));\n }\n }\n\n if (this.isVisible()) {\n emit(this);\n if (tool && tool.responds(type)) emit(tool);\n }\n },\n _countItemEvent: function _countItemEvent(type, sign) {\n var itemEvents = this._itemEvents,\n native = itemEvents.native,\n virtual = itemEvents.virtual;\n\n for (var key in itemEventsMap) {\n native[key] = (native[key] || 0) + (itemEventsMap[key][type] || 0) * sign;\n }\n\n virtual[type] = (virtual[type] || 0) + sign;\n },\n statics: {\n updateFocus: updateFocus,\n _resetState: function _resetState() {\n dragging = mouseDown = called = wasInView = false;\n prevFocus = tempFocus = overView = downPoint = lastPoint = downItem = overItem = dragItem = clickItem = clickTime = dblClick = null;\n }\n }\n };\n }());\n var CanvasView = View.extend({\n _class: 'CanvasView',\n initialize: function CanvasView(project, canvas) {\n if (!(canvas instanceof window.HTMLCanvasElement)) {\n var size = Size.read(arguments, 1);\n if (size.isZero()) throw new Error('Cannot create CanvasView with the provided argument: ' + Base.slice(arguments, 1));\n canvas = CanvasProvider.getCanvas(size);\n }\n\n var ctx = this._context = canvas.getContext('2d');\n ctx.save();\n this._pixelRatio = 1;\n\n if (!/^off|false$/.test(PaperScope.getAttribute(canvas, 'hidpi'))) {\n var deviceRatio = window.devicePixelRatio || 1,\n backingStoreRatio = DomElement.getPrefixed(ctx, 'backingStorePixelRatio') || 1;\n this._pixelRatio = deviceRatio / backingStoreRatio;\n }\n\n View.call(this, project, canvas);\n this._needsUpdate = true;\n },\n remove: function remove() {\n this._context.restore();\n\n return remove.base.call(this);\n },\n _setElementSize: function _setElementSize(width, height) {\n var pixelRatio = this._pixelRatio;\n\n _setElementSize.base.call(this, width * pixelRatio, height * pixelRatio);\n\n if (pixelRatio !== 1) {\n var element = this._element,\n ctx = this._context;\n\n if (!PaperScope.hasAttribute(element, 'resize')) {\n var style = element.style;\n style.width = width + 'px';\n style.height = height + 'px';\n }\n\n ctx.restore();\n ctx.save();\n ctx.scale(pixelRatio, pixelRatio);\n }\n },\n getContext: function getContext() {\n return this._context;\n },\n getPixelSize: function getPixelSize(size) {\n var agent = paper.agent,\n pixels;\n\n if (agent && agent.firefox) {\n pixels = getPixelSize.base.call(this, size);\n } else {\n var ctx = this._context,\n prevFont = ctx.font;\n ctx.font = size + ' serif';\n pixels = parseFloat(ctx.font);\n ctx.font = prevFont;\n }\n\n return pixels;\n },\n getTextWidth: function getTextWidth(font, lines) {\n var ctx = this._context,\n prevFont = ctx.font,\n width = 0;\n ctx.font = font;\n\n for (var i = 0, l = lines.length; i < l; i++) {\n width = Math.max(width, ctx.measureText(lines[i]).width);\n }\n\n ctx.font = prevFont;\n return width;\n },\n update: function update() {\n if (!this._needsUpdate) return false;\n var project = this._project,\n ctx = this._context,\n size = this._viewSize;\n ctx.clearRect(0, 0, size.width + 1, size.height + 1);\n if (project) project.draw(ctx, this._matrix, this._pixelRatio);\n this._needsUpdate = false;\n return true;\n }\n });\n var Event = Base.extend({\n _class: 'Event',\n initialize: function Event(event) {\n this.event = event;\n this.type = event && event.type;\n },\n prevented: false,\n stopped: false,\n preventDefault: function preventDefault() {\n this.prevented = true;\n this.event.preventDefault();\n },\n stopPropagation: function stopPropagation() {\n this.stopped = true;\n this.event.stopPropagation();\n },\n stop: function stop() {\n this.stopPropagation();\n this.preventDefault();\n },\n getTimeStamp: function getTimeStamp() {\n return this.event.timeStamp;\n },\n getModifiers: function getModifiers() {\n return Key.modifiers;\n }\n });\n var KeyEvent = Event.extend({\n _class: 'KeyEvent',\n initialize: function KeyEvent(type, event, key, character) {\n this.type = type;\n this.event = event;\n this.key = key;\n this.character = character;\n },\n toString: function toString() {\n return \"{ type: '\" + this.type + \"', key: '\" + this.key + \"', character: '\" + this.character + \"', modifiers: \" + this.getModifiers() + \" }\";\n }\n });\n var Key = new function () {\n var keyLookup = {\n '\\t': 'tab',\n ' ': 'space',\n '\\b': 'backspace',\n '\\x7f': 'delete',\n 'Spacebar': 'space',\n 'Del': 'delete',\n 'Win': 'meta',\n 'Esc': 'escape'\n },\n charLookup = {\n 'tab': '\\t',\n 'space': ' ',\n 'enter': '\\r'\n },\n keyMap = {},\n charMap = {},\n metaFixMap,\n downKey,\n modifiers = new Base({\n shift: false,\n control: false,\n alt: false,\n meta: false,\n capsLock: false,\n space: false\n }).inject({\n option: {\n get: function get() {\n return this.alt;\n }\n },\n command: {\n get: function get() {\n var agent = paper && paper.agent;\n return agent && agent.mac ? this.meta : this.control;\n }\n }\n });\n\n function getKey(event) {\n var key = event.key || event.keyIdentifier;\n key = /^U\\+/.test(key) ? String.fromCharCode(parseInt(key.substr(2), 16)) : /^Arrow[A-Z]/.test(key) ? key.substr(5) : key === 'Unidentified' || key === undefined ? String.fromCharCode(event.keyCode) : key;\n return keyLookup[key] || (key.length > 1 ? Base.hyphenate(key) : key.toLowerCase());\n }\n\n function handleKey(down, key, character, event) {\n var type = down ? 'keydown' : 'keyup',\n view = View._focused,\n name;\n keyMap[key] = down;\n\n if (down) {\n charMap[key] = character;\n } else {\n delete charMap[key];\n }\n\n if (key.length > 1 && (name = Base.camelize(key)) in modifiers) {\n modifiers[name] = down;\n var agent = paper && paper.agent;\n\n if (name === 'meta' && agent && agent.mac) {\n if (down) {\n metaFixMap = {};\n } else {\n for (var k in metaFixMap) {\n if (k in charMap) handleKey(false, k, metaFixMap[k], event);\n }\n\n metaFixMap = null;\n }\n }\n } else if (down && metaFixMap) {\n metaFixMap[key] = character;\n }\n\n if (view) {\n view._handleKeyEvent(down ? 'keydown' : 'keyup', event, key, character);\n }\n }\n\n DomEvent.add(document, {\n keydown: function keydown(event) {\n var key = getKey(event),\n agent = paper && paper.agent;\n\n if (key.length > 1 || agent && agent.chrome && (event.altKey || agent.mac && event.metaKey || !agent.mac && event.ctrlKey)) {\n handleKey(true, key, charLookup[key] || (key.length > 1 ? '' : key), event);\n } else {\n downKey = key;\n }\n },\n keypress: function keypress(event) {\n if (downKey) {\n var key = getKey(event),\n code = event.charCode,\n character = code >= 32 ? String.fromCharCode(code) : key.length > 1 ? '' : key;\n\n if (key !== downKey) {\n key = character.toLowerCase();\n }\n\n handleKey(true, key, character, event);\n downKey = null;\n }\n },\n keyup: function keyup(event) {\n var key = getKey(event);\n if (key in charMap) handleKey(false, key, charMap[key], event);\n }\n });\n DomEvent.add(window, {\n blur: function blur(event) {\n for (var key in charMap) {\n handleKey(false, key, charMap[key], event);\n }\n }\n });\n return {\n modifiers: modifiers,\n isDown: function isDown(key) {\n return !!keyMap[key];\n }\n };\n }();\n var MouseEvent = Event.extend({\n _class: 'MouseEvent',\n initialize: function MouseEvent(type, event, point, target, delta) {\n this.type = type;\n this.event = event;\n this.point = point;\n this.target = target;\n this.delta = delta;\n },\n toString: function toString() {\n return \"{ type: '\" + this.type + \"', point: \" + this.point + ', target: ' + this.target + (this.delta ? ', delta: ' + this.delta : '') + ', modifiers: ' + this.getModifiers() + ' }';\n }\n });\n var ToolEvent = Event.extend({\n _class: 'ToolEvent',\n _item: null,\n initialize: function ToolEvent(tool, type, event) {\n this.tool = tool;\n this.type = type;\n this.event = event;\n },\n _choosePoint: function _choosePoint(point, toolPoint) {\n return point ? point : toolPoint ? toolPoint.clone() : null;\n },\n getPoint: function getPoint() {\n return this._choosePoint(this._point, this.tool._point);\n },\n setPoint: function setPoint(point) {\n this._point = point;\n },\n getLastPoint: function getLastPoint() {\n return this._choosePoint(this._lastPoint, this.tool._lastPoint);\n },\n setLastPoint: function setLastPoint(lastPoint) {\n this._lastPoint = lastPoint;\n },\n getDownPoint: function getDownPoint() {\n return this._choosePoint(this._downPoint, this.tool._downPoint);\n },\n setDownPoint: function setDownPoint(downPoint) {\n this._downPoint = downPoint;\n },\n getMiddlePoint: function getMiddlePoint() {\n if (!this._middlePoint && this.tool._lastPoint) {\n return this.tool._point.add(this.tool._lastPoint).divide(2);\n }\n\n return this._middlePoint;\n },\n setMiddlePoint: function setMiddlePoint(middlePoint) {\n this._middlePoint = middlePoint;\n },\n getDelta: function getDelta() {\n return !this._delta && this.tool._lastPoint ? this.tool._point.subtract(this.tool._lastPoint) : this._delta;\n },\n setDelta: function setDelta(delta) {\n this._delta = delta;\n },\n getCount: function getCount() {\n return this.tool[/^mouse(down|up)$/.test(this.type) ? '_downCount' : '_moveCount'];\n },\n setCount: function setCount(count) {\n this.tool[/^mouse(down|up)$/.test(this.type) ? 'downCount' : 'count'] = count;\n },\n getItem: function getItem() {\n if (!this._item) {\n var result = this.tool._scope.project.hitTest(this.getPoint());\n\n if (result) {\n var item = result.item,\n parent = item._parent;\n\n while (/^(Group|CompoundPath)$/.test(parent._class)) {\n item = parent;\n parent = parent._parent;\n }\n\n this._item = item;\n }\n }\n\n return this._item;\n },\n setItem: function setItem(item) {\n this._item = item;\n },\n toString: function toString() {\n return '{ type: ' + this.type + ', point: ' + this.getPoint() + ', count: ' + this.getCount() + ', modifiers: ' + this.getModifiers() + ' }';\n }\n });\n var Tool = PaperScopeItem.extend({\n _class: 'Tool',\n _list: 'tools',\n _reference: 'tool',\n _events: ['onMouseDown', 'onMouseUp', 'onMouseDrag', 'onMouseMove', 'onActivate', 'onDeactivate', 'onEditOptions', 'onKeyDown', 'onKeyUp'],\n initialize: function Tool(props) {\n PaperScopeItem.call(this);\n this._moveCount = -1;\n this._downCount = -1;\n this.set(props);\n },\n getMinDistance: function getMinDistance() {\n return this._minDistance;\n },\n setMinDistance: function setMinDistance(minDistance) {\n this._minDistance = minDistance;\n\n if (minDistance != null && this._maxDistance != null && minDistance > this._maxDistance) {\n this._maxDistance = minDistance;\n }\n },\n getMaxDistance: function getMaxDistance() {\n return this._maxDistance;\n },\n setMaxDistance: function setMaxDistance(maxDistance) {\n this._maxDistance = maxDistance;\n\n if (this._minDistance != null && maxDistance != null && maxDistance < this._minDistance) {\n this._minDistance = maxDistance;\n }\n },\n getFixedDistance: function getFixedDistance() {\n return this._minDistance == this._maxDistance ? this._minDistance : null;\n },\n setFixedDistance: function setFixedDistance(distance) {\n this._minDistance = this._maxDistance = distance;\n },\n _handleMouseEvent: function _handleMouseEvent(type, event, point, mouse) {\n paper = this._scope;\n if (mouse.drag && !this.responds(type)) type = 'mousemove';\n var move = mouse.move || mouse.drag,\n responds = this.responds(type),\n minDistance = this.minDistance,\n maxDistance = this.maxDistance,\n called = false,\n tool = this;\n\n function update(minDistance, maxDistance) {\n var pt = point,\n toolPoint = move ? tool._point : tool._downPoint || pt;\n\n if (move) {\n if (tool._moveCount >= 0 && pt.equals(toolPoint)) {\n return false;\n }\n\n if (toolPoint && (minDistance != null || maxDistance != null)) {\n var vector = pt.subtract(toolPoint),\n distance = vector.getLength();\n if (distance < (minDistance || 0)) return false;\n\n if (maxDistance) {\n pt = toolPoint.add(vector.normalize(Math.min(distance, maxDistance)));\n }\n }\n\n tool._moveCount++;\n }\n\n tool._point = pt;\n tool._lastPoint = toolPoint || pt;\n\n if (mouse.down) {\n tool._moveCount = -1;\n tool._downPoint = pt;\n tool._downCount++;\n }\n\n return true;\n }\n\n function emit() {\n if (responds) {\n called = tool.emit(type, new ToolEvent(tool, type, event)) || called;\n }\n }\n\n if (mouse.down) {\n update();\n emit();\n } else if (mouse.up) {\n update(null, maxDistance);\n emit();\n } else if (responds) {\n while (update(minDistance, maxDistance)) {\n emit();\n }\n }\n\n return called;\n }\n });\n var Tween = Base.extend(Emitter, {\n _class: 'Tween',\n statics: {\n easings: new Base({\n linear: function linear(t) {\n return t;\n },\n easeInQuad: function easeInQuad(t) {\n return t * t;\n },\n easeOutQuad: function easeOutQuad(t) {\n return t * (2 - t);\n },\n easeInOutQuad: function easeInOutQuad(t) {\n return t < 0.5 ? 2 * t * t : -1 + 2 * (2 - t) * t;\n },\n easeInCubic: function easeInCubic(t) {\n return t * t * t;\n },\n easeOutCubic: function easeOutCubic(t) {\n return --t * t * t + 1;\n },\n easeInOutCubic: function easeInOutCubic(t) {\n return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n },\n easeInQuart: function easeInQuart(t) {\n return t * t * t * t;\n },\n easeOutQuart: function easeOutQuart(t) {\n return 1 - --t * t * t * t;\n },\n easeInOutQuart: function easeInOutQuart(t) {\n return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;\n },\n easeInQuint: function easeInQuint(t) {\n return t * t * t * t * t;\n },\n easeOutQuint: function easeOutQuint(t) {\n return 1 + --t * t * t * t * t;\n },\n easeInOutQuint: function easeInOutQuint(t) {\n return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t;\n }\n })\n },\n initialize: function Tween(object, from, to, duration, easing, start) {\n this.object = object;\n var type = typeof easing;\n var isFunction = type === 'function';\n this.type = isFunction ? type : type === 'string' ? easing : 'linear';\n this.easing = isFunction ? easing : Tween.easings[this.type];\n this.duration = duration;\n this.running = false;\n this._then = null;\n this._startTime = null;\n var state = from || to;\n this._keys = state ? Object.keys(state) : [];\n this._parsedKeys = this._parseKeys(this._keys);\n this._from = state && this._getState(from);\n this._to = state && this._getState(to);\n\n if (start !== false) {\n this.start();\n }\n },\n then: function then(_then) {\n this._then = _then;\n return this;\n },\n start: function start() {\n this._startTime = null;\n this.running = true;\n return this;\n },\n stop: function stop() {\n this.running = false;\n return this;\n },\n update: function update(progress) {\n if (this.running) {\n if (progress >= 1) {\n progress = 1;\n this.running = false;\n }\n\n var factor = this.easing(progress),\n keys = this._keys,\n getValue = function getValue(value) {\n return typeof value === 'function' ? value(factor, progress) : value;\n };\n\n for (var i = 0, l = keys && keys.length; i < l; i++) {\n var key = keys[i],\n from = getValue(this._from[key]),\n to = getValue(this._to[key]),\n value = from && to && from.__add && to.__add ? to.__subtract(from).__multiply(factor).__add(from) : (to - from) * factor + from;\n\n this._setProperty(this._parsedKeys[key], value);\n }\n\n if (this.responds('update')) {\n this.emit('update', new Base({\n progress: progress,\n factor: factor\n }));\n }\n\n if (!this.running && this._then) {\n this._then(this.object);\n }\n }\n\n return this;\n },\n _events: {\n onUpdate: {}\n },\n _handleFrame: function _handleFrame(time) {\n var startTime = this._startTime,\n progress = startTime ? (time - startTime) / this.duration : 0;\n\n if (!startTime) {\n this._startTime = time;\n }\n\n this.update(progress);\n },\n _getState: function _getState(state) {\n var keys = this._keys,\n result = {};\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i],\n path = this._parsedKeys[key],\n current = this._getProperty(path),\n value;\n\n if (state) {\n var resolved = this._resolveValue(current, state[key]);\n\n this._setProperty(path, resolved);\n\n value = this._getProperty(path);\n value = value && value.clone ? value.clone() : value;\n\n this._setProperty(path, current);\n } else {\n value = current && current.clone ? current.clone() : current;\n }\n\n result[key] = value;\n }\n\n return result;\n },\n _resolveValue: function _resolveValue(current, value) {\n if (value) {\n if (Array.isArray(value) && value.length === 2) {\n var operator = value[0];\n return operator && operator.match && operator.match(/^[+\\-\\*\\/]=/) ? this._calculate(current, operator[0], value[1]) : value;\n } else if (typeof value === 'string') {\n var match = value.match(/^[+\\-*/]=(.*)/);\n\n if (match) {\n var parsed = JSON.parse(match[1].replace(/(['\"])?([a-zA-Z0-9_]+)(['\"])?:/g, '\"$2\": '));\n return this._calculate(current, value[0], parsed);\n }\n }\n }\n\n return value;\n },\n _calculate: function _calculate(left, operator, right) {\n return paper.PaperScript.calculateBinary(left, operator, right);\n },\n _parseKeys: function _parseKeys(keys) {\n var parsed = {};\n\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i],\n path = key.replace(/\\.([^.]*)/g, '/$1').replace(/\\[['\"]?([^'\"\\]]*)['\"]?\\]/g, '/$1');\n parsed[key] = path.split('/');\n }\n\n return parsed;\n },\n _getProperty: function _getProperty(path, offset) {\n var obj = this.object;\n\n for (var i = 0, l = path.length - (offset || 0); i < l && obj; i++) {\n obj = obj[path[i]];\n }\n\n return obj;\n },\n _setProperty: function _setProperty(path, value) {\n var dest = this._getProperty(path, 1);\n\n if (dest) {\n dest[path[path.length - 1]] = value;\n }\n }\n });\n var Http = {\n request: function request(options) {\n var xhr = new self.XMLHttpRequest();\n xhr.open((options.method || 'get').toUpperCase(), options.url, Base.pick(options.async, true));\n if (options.mimeType) xhr.overrideMimeType(options.mimeType);\n\n xhr.onload = function () {\n var status = xhr.status;\n\n if (status === 0 || status === 200) {\n if (options.onLoad) {\n options.onLoad.call(xhr, xhr.responseText);\n }\n } else {\n xhr.onerror();\n }\n };\n\n xhr.onerror = function () {\n var status = xhr.status,\n message = 'Could not load \"' + options.url + '\" (Status: ' + status + ')';\n\n if (options.onError) {\n options.onError(message, status);\n } else {\n throw new Error(message);\n }\n };\n\n return xhr.send(null);\n }\n };\n var CanvasProvider = Base.exports.CanvasProvider = {\n canvases: [],\n getCanvas: function getCanvas(width, height) {\n if (!window) return null;\n var canvas,\n clear = true;\n\n if (typeof width === 'object') {\n height = width.height;\n width = width.width;\n }\n\n if (this.canvases.length) {\n canvas = this.canvases.pop();\n } else {\n canvas = document.createElement('canvas');\n clear = false;\n }\n\n var ctx = canvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Canvas ' + canvas + ' is unable to provide a 2D context.');\n }\n\n if (canvas.width === width && canvas.height === height) {\n if (clear) ctx.clearRect(0, 0, width + 1, height + 1);\n } else {\n canvas.width = width;\n canvas.height = height;\n }\n\n ctx.save();\n return canvas;\n },\n getContext: function getContext(width, height) {\n var canvas = this.getCanvas(width, height);\n return canvas ? canvas.getContext('2d') : null;\n },\n release: function release(obj) {\n var canvas = obj && obj.canvas ? obj.canvas : obj;\n\n if (canvas && canvas.getContext) {\n canvas.getContext('2d').restore();\n this.canvases.push(canvas);\n }\n }\n };\n var BlendMode = new function () {\n var min = Math.min,\n max = Math.max,\n abs = Math.abs,\n sr,\n sg,\n sb,\n sa,\n br,\n bg,\n bb,\n ba,\n dr,\n dg,\n db;\n\n function getLum(r, g, b) {\n return 0.2989 * r + 0.587 * g + 0.114 * b;\n }\n\n function setLum(r, g, b, l) {\n var d = l - getLum(r, g, b);\n dr = r + d;\n dg = g + d;\n db = b + d;\n var l = getLum(dr, dg, db),\n mn = min(dr, dg, db),\n mx = max(dr, dg, db);\n\n if (mn < 0) {\n var lmn = l - mn;\n dr = l + (dr - l) * l / lmn;\n dg = l + (dg - l) * l / lmn;\n db = l + (db - l) * l / lmn;\n }\n\n if (mx > 255) {\n var ln = 255 - l,\n mxl = mx - l;\n dr = l + (dr - l) * ln / mxl;\n dg = l + (dg - l) * ln / mxl;\n db = l + (db - l) * ln / mxl;\n }\n }\n\n function getSat(r, g, b) {\n return max(r, g, b) - min(r, g, b);\n }\n\n function setSat(r, g, b, s) {\n var col = [r, g, b],\n mx = max(r, g, b),\n mn = min(r, g, b),\n md;\n mn = mn === r ? 0 : mn === g ? 1 : 2;\n mx = mx === r ? 0 : mx === g ? 1 : 2;\n md = min(mn, mx) === 0 ? max(mn, mx) === 1 ? 2 : 1 : 0;\n\n if (col[mx] > col[mn]) {\n col[md] = (col[md] - col[mn]) * s / (col[mx] - col[mn]);\n col[mx] = s;\n } else {\n col[md] = col[mx] = 0;\n }\n\n col[mn] = 0;\n dr = col[0];\n dg = col[1];\n db = col[2];\n }\n\n var modes = {\n multiply: function multiply() {\n dr = br * sr / 255;\n dg = bg * sg / 255;\n db = bb * sb / 255;\n },\n screen: function screen() {\n dr = br + sr - br * sr / 255;\n dg = bg + sg - bg * sg / 255;\n db = bb + sb - bb * sb / 255;\n },\n overlay: function overlay() {\n dr = br < 128 ? 2 * br * sr / 255 : 255 - 2 * (255 - br) * (255 - sr) / 255;\n dg = bg < 128 ? 2 * bg * sg / 255 : 255 - 2 * (255 - bg) * (255 - sg) / 255;\n db = bb < 128 ? 2 * bb * sb / 255 : 255 - 2 * (255 - bb) * (255 - sb) / 255;\n },\n 'soft-light': function softLight() {\n var t = sr * br / 255;\n dr = t + br * (255 - (255 - br) * (255 - sr) / 255 - t) / 255;\n t = sg * bg / 255;\n dg = t + bg * (255 - (255 - bg) * (255 - sg) / 255 - t) / 255;\n t = sb * bb / 255;\n db = t + bb * (255 - (255 - bb) * (255 - sb) / 255 - t) / 255;\n },\n 'hard-light': function hardLight() {\n dr = sr < 128 ? 2 * sr * br / 255 : 255 - 2 * (255 - sr) * (255 - br) / 255;\n dg = sg < 128 ? 2 * sg * bg / 255 : 255 - 2 * (255 - sg) * (255 - bg) / 255;\n db = sb < 128 ? 2 * sb * bb / 255 : 255 - 2 * (255 - sb) * (255 - bb) / 255;\n },\n 'color-dodge': function colorDodge() {\n dr = br === 0 ? 0 : sr === 255 ? 255 : min(255, 255 * br / (255 - sr));\n dg = bg === 0 ? 0 : sg === 255 ? 255 : min(255, 255 * bg / (255 - sg));\n db = bb === 0 ? 0 : sb === 255 ? 255 : min(255, 255 * bb / (255 - sb));\n },\n 'color-burn': function colorBurn() {\n dr = br === 255 ? 255 : sr === 0 ? 0 : max(0, 255 - (255 - br) * 255 / sr);\n dg = bg === 255 ? 255 : sg === 0 ? 0 : max(0, 255 - (255 - bg) * 255 / sg);\n db = bb === 255 ? 255 : sb === 0 ? 0 : max(0, 255 - (255 - bb) * 255 / sb);\n },\n darken: function darken() {\n dr = br < sr ? br : sr;\n dg = bg < sg ? bg : sg;\n db = bb < sb ? bb : sb;\n },\n lighten: function lighten() {\n dr = br > sr ? br : sr;\n dg = bg > sg ? bg : sg;\n db = bb > sb ? bb : sb;\n },\n difference: function difference() {\n dr = br - sr;\n if (dr < 0) dr = -dr;\n dg = bg - sg;\n if (dg < 0) dg = -dg;\n db = bb - sb;\n if (db < 0) db = -db;\n },\n exclusion: function exclusion() {\n dr = br + sr * (255 - br - br) / 255;\n dg = bg + sg * (255 - bg - bg) / 255;\n db = bb + sb * (255 - bb - bb) / 255;\n },\n hue: function hue() {\n setSat(sr, sg, sb, getSat(br, bg, bb));\n setLum(dr, dg, db, getLum(br, bg, bb));\n },\n saturation: function saturation() {\n setSat(br, bg, bb, getSat(sr, sg, sb));\n setLum(dr, dg, db, getLum(br, bg, bb));\n },\n luminosity: function luminosity() {\n setLum(br, bg, bb, getLum(sr, sg, sb));\n },\n color: function color() {\n setLum(sr, sg, sb, getLum(br, bg, bb));\n },\n add: function add() {\n dr = min(br + sr, 255);\n dg = min(bg + sg, 255);\n db = min(bb + sb, 255);\n },\n subtract: function subtract() {\n dr = max(br - sr, 0);\n dg = max(bg - sg, 0);\n db = max(bb - sb, 0);\n },\n average: function average() {\n dr = (br + sr) / 2;\n dg = (bg + sg) / 2;\n db = (bb + sb) / 2;\n },\n negation: function negation() {\n dr = 255 - abs(255 - sr - br);\n dg = 255 - abs(255 - sg - bg);\n db = 255 - abs(255 - sb - bb);\n }\n };\n var nativeModes = this.nativeModes = Base.each(['source-over', 'source-in', 'source-out', 'source-atop', 'destination-over', 'destination-in', 'destination-out', 'destination-atop', 'lighter', 'darker', 'copy', 'xor'], function (mode) {\n this[mode] = true;\n }, {});\n var ctx = CanvasProvider.getContext(1, 1);\n\n if (ctx) {\n Base.each(modes, function (func, mode) {\n var darken = mode === 'darken',\n ok = false;\n ctx.save();\n\n try {\n ctx.fillStyle = darken ? '#300' : '#a00';\n ctx.fillRect(0, 0, 1, 1);\n ctx.globalCompositeOperation = mode;\n\n if (ctx.globalCompositeOperation === mode) {\n ctx.fillStyle = darken ? '#a00' : '#300';\n ctx.fillRect(0, 0, 1, 1);\n ok = ctx.getImageData(0, 0, 1, 1).data[0] !== darken ? 170 : 51;\n }\n } catch (e) {}\n\n ctx.restore();\n nativeModes[mode] = ok;\n });\n CanvasProvider.release(ctx);\n }\n\n this.process = function (mode, srcContext, dstContext, alpha, offset) {\n var srcCanvas = srcContext.canvas,\n normal = mode === 'normal';\n\n if (normal || nativeModes[mode]) {\n dstContext.save();\n dstContext.setTransform(1, 0, 0, 1, 0, 0);\n dstContext.globalAlpha = alpha;\n if (!normal) dstContext.globalCompositeOperation = mode;\n dstContext.drawImage(srcCanvas, offset.x, offset.y);\n dstContext.restore();\n } else {\n var process = modes[mode];\n if (!process) return;\n var dstData = dstContext.getImageData(offset.x, offset.y, srcCanvas.width, srcCanvas.height),\n dst = dstData.data,\n src = srcContext.getImageData(0, 0, srcCanvas.width, srcCanvas.height).data;\n\n for (var i = 0, l = dst.length; i < l; i += 4) {\n sr = src[i];\n br = dst[i];\n sg = src[i + 1];\n bg = dst[i + 1];\n sb = src[i + 2];\n bb = dst[i + 2];\n sa = src[i + 3];\n ba = dst[i + 3];\n process();\n var a1 = sa * alpha / 255,\n a2 = 1 - a1;\n dst[i] = a1 * dr + a2 * br;\n dst[i + 1] = a1 * dg + a2 * bg;\n dst[i + 2] = a1 * db + a2 * bb;\n dst[i + 3] = sa * alpha + a2 * ba;\n }\n\n dstContext.putImageData(dstData, offset.x, offset.y);\n }\n };\n }();\n var SvgElement = new function () {\n var svg = 'http://www.w3.org/2000/svg',\n xmlns = 'http://www.w3.org/2000/xmlns',\n xlink = 'http://www.w3.org/1999/xlink',\n attributeNamespace = {\n href: xlink,\n xlink: xmlns,\n xmlns: xmlns + '/',\n 'xmlns:xlink': xmlns + '/'\n };\n\n function create(tag, attributes, formatter) {\n return set(document.createElementNS(svg, tag), attributes, formatter);\n }\n\n function get(node, name) {\n var namespace = attributeNamespace[name],\n value = namespace ? node.getAttributeNS(namespace, name) : node.getAttribute(name);\n return value === 'null' ? null : value;\n }\n\n function set(node, attributes, formatter) {\n for (var name in attributes) {\n var value = attributes[name],\n namespace = attributeNamespace[name];\n if (typeof value === 'number' && formatter) value = formatter.number(value);\n\n if (namespace) {\n node.setAttributeNS(namespace, name, value);\n } else {\n node.setAttribute(name, value);\n }\n }\n\n return node;\n }\n\n return {\n svg: svg,\n xmlns: xmlns,\n xlink: xlink,\n create: create,\n get: get,\n set: set\n };\n }();\n var SvgStyles = Base.each({\n fillColor: ['fill', 'color'],\n fillRule: ['fill-rule', 'string'],\n strokeColor: ['stroke', 'color'],\n strokeWidth: ['stroke-width', 'number'],\n strokeCap: ['stroke-linecap', 'string'],\n strokeJoin: ['stroke-linejoin', 'string'],\n strokeScaling: ['vector-effect', 'lookup', {\n true: 'none',\n false: 'non-scaling-stroke'\n }, function (item, value) {\n return !value && (item instanceof PathItem || item instanceof Shape || item instanceof TextItem);\n }],\n miterLimit: ['stroke-miterlimit', 'number'],\n dashArray: ['stroke-dasharray', 'array'],\n dashOffset: ['stroke-dashoffset', 'number'],\n fontFamily: ['font-family', 'string'],\n fontWeight: ['font-weight', 'string'],\n fontSize: ['font-size', 'number'],\n justification: ['text-anchor', 'lookup', {\n left: 'start',\n center: 'middle',\n right: 'end'\n }],\n opacity: ['opacity', 'number'],\n blendMode: ['mix-blend-mode', 'style']\n }, function (entry, key) {\n var part = Base.capitalize(key),\n lookup = entry[2];\n this[key] = {\n type: entry[1],\n property: key,\n attribute: entry[0],\n toSVG: lookup,\n fromSVG: lookup && Base.each(lookup, function (value, name) {\n this[value] = name;\n }, {}),\n exportFilter: entry[3],\n get: 'get' + part,\n set: 'set' + part\n };\n }, {});\n new function () {\n var formatter;\n\n function getTransform(matrix, coordinates, center) {\n var attrs = new Base(),\n trans = matrix.getTranslation();\n\n if (coordinates) {\n var point;\n\n if (matrix.isInvertible()) {\n matrix = matrix._shiftless();\n point = matrix._inverseTransform(trans);\n trans = null;\n } else {\n point = new Point();\n }\n\n attrs[center ? 'cx' : 'x'] = point.x;\n attrs[center ? 'cy' : 'y'] = point.y;\n }\n\n if (!matrix.isIdentity()) {\n var decomposed = matrix.decompose();\n\n if (decomposed) {\n var parts = [],\n angle = decomposed.rotation,\n scale = decomposed.scaling,\n skew = decomposed.skewing;\n if (trans && !trans.isZero()) parts.push('translate(' + formatter.point(trans) + ')');\n if (angle) parts.push('rotate(' + formatter.number(angle) + ')');\n if (!Numerical.isZero(scale.x - 1) || !Numerical.isZero(scale.y - 1)) parts.push('scale(' + formatter.point(scale) + ')');\n if (skew.x) parts.push('skewX(' + formatter.number(skew.x) + ')');\n if (skew.y) parts.push('skewY(' + formatter.number(skew.y) + ')');\n attrs.transform = parts.join(' ');\n } else {\n attrs.transform = 'matrix(' + matrix.getValues().join(',') + ')';\n }\n }\n\n return attrs;\n }\n\n function exportGroup(item, options) {\n var attrs = getTransform(item._matrix),\n children = item._children;\n var node = SvgElement.create('g', attrs, formatter);\n\n for (var i = 0, l = children.length; i < l; i++) {\n var child = children[i];\n\n var childNode = _exportSVG(child, options);\n\n if (childNode) {\n if (child.isClipMask()) {\n var clip = SvgElement.create('clipPath');\n clip.appendChild(childNode);\n setDefinition(child, clip, 'clip');\n SvgElement.set(node, {\n 'clip-path': 'url(#' + clip.id + ')'\n });\n } else {\n node.appendChild(childNode);\n }\n }\n }\n\n return node;\n }\n\n function exportRaster(item, options) {\n var attrs = getTransform(item._matrix, true),\n size = item.getSize(),\n image = item.getImage();\n attrs.x -= size.width / 2;\n attrs.y -= size.height / 2;\n attrs.width = size.width;\n attrs.height = size.height;\n attrs.href = options.embedImages == false && image && image.src || item.toDataURL();\n return SvgElement.create('image', attrs, formatter);\n }\n\n function exportPath(item, options) {\n var matchShapes = options.matchShapes;\n\n if (matchShapes) {\n var shape = item.toShape(false);\n if (shape) return exportShape(shape, options);\n }\n\n var segments = item._segments,\n length = segments.length,\n type,\n attrs = getTransform(item._matrix);\n\n if (matchShapes && length >= 2 && !item.hasHandles()) {\n if (length > 2) {\n type = item._closed ? 'polygon' : 'polyline';\n var parts = [];\n\n for (var i = 0; i < length; i++) {\n parts.push(formatter.point(segments[i]._point));\n }\n\n attrs.points = parts.join(' ');\n } else {\n type = 'line';\n var start = segments[0]._point,\n end = segments[1]._point;\n attrs.set({\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y\n });\n }\n } else {\n type = 'path';\n attrs.d = item.getPathData(null, options.precision);\n }\n\n return SvgElement.create(type, attrs, formatter);\n }\n\n function exportShape(item) {\n var type = item._type,\n radius = item._radius,\n attrs = getTransform(item._matrix, true, type !== 'rectangle');\n\n if (type === 'rectangle') {\n type = 'rect';\n var size = item._size,\n width = size.width,\n height = size.height;\n attrs.x -= width / 2;\n attrs.y -= height / 2;\n attrs.width = width;\n attrs.height = height;\n if (radius.isZero()) radius = null;\n }\n\n if (radius) {\n if (type === 'circle') {\n attrs.r = radius;\n } else {\n attrs.rx = radius.width;\n attrs.ry = radius.height;\n }\n }\n\n return SvgElement.create(type, attrs, formatter);\n }\n\n function exportCompoundPath(item, options) {\n var attrs = getTransform(item._matrix);\n var data = item.getPathData(null, options.precision);\n if (data) attrs.d = data;\n return SvgElement.create('path', attrs, formatter);\n }\n\n function exportSymbolItem(item, options) {\n var attrs = getTransform(item._matrix, true),\n definition = item._definition,\n node = getDefinition(definition, 'symbol'),\n definitionItem = definition._item,\n bounds = definitionItem.getStrokeBounds();\n\n if (!node) {\n node = SvgElement.create('symbol', {\n viewBox: formatter.rectangle(bounds)\n });\n node.appendChild(_exportSVG(definitionItem, options));\n setDefinition(definition, node, 'symbol');\n }\n\n attrs.href = '#' + node.id;\n attrs.x += bounds.x;\n attrs.y += bounds.y;\n attrs.width = bounds.width;\n attrs.height = bounds.height;\n attrs.overflow = 'visible';\n return SvgElement.create('use', attrs, formatter);\n }\n\n function exportGradient(color) {\n var gradientNode = getDefinition(color, 'color');\n\n if (!gradientNode) {\n var gradient = color.getGradient(),\n radial = gradient._radial,\n origin = color.getOrigin(),\n destination = color.getDestination(),\n attrs;\n\n if (radial) {\n attrs = {\n cx: origin.x,\n cy: origin.y,\n r: origin.getDistance(destination)\n };\n var highlight = color.getHighlight();\n\n if (highlight) {\n attrs.fx = highlight.x;\n attrs.fy = highlight.y;\n }\n } else {\n attrs = {\n x1: origin.x,\n y1: origin.y,\n x2: destination.x,\n y2: destination.y\n };\n }\n\n attrs.gradientUnits = 'userSpaceOnUse';\n gradientNode = SvgElement.create((radial ? 'radial' : 'linear') + 'Gradient', attrs, formatter);\n var stops = gradient._stops;\n\n for (var i = 0, l = stops.length; i < l; i++) {\n var stop = stops[i],\n stopColor = stop._color,\n alpha = stopColor.getAlpha(),\n offset = stop._offset;\n attrs = {\n offset: offset == null ? i / (l - 1) : offset\n };\n if (stopColor) attrs['stop-color'] = stopColor.toCSS(true);\n if (alpha < 1) attrs['stop-opacity'] = alpha;\n gradientNode.appendChild(SvgElement.create('stop', attrs, formatter));\n }\n\n setDefinition(color, gradientNode, 'color');\n }\n\n return 'url(#' + gradientNode.id + ')';\n }\n\n function exportText(item) {\n var node = SvgElement.create('text', getTransform(item._matrix, true), formatter);\n node.textContent = item._content;\n return node;\n }\n\n var exporters = {\n Group: exportGroup,\n Layer: exportGroup,\n Raster: exportRaster,\n Path: exportPath,\n Shape: exportShape,\n CompoundPath: exportCompoundPath,\n SymbolItem: exportSymbolItem,\n PointText: exportText\n };\n\n function applyStyle(item, node, isRoot) {\n var attrs = {},\n parent = !isRoot && item.getParent(),\n style = [];\n if (item._name != null) attrs.id = item._name;\n Base.each(SvgStyles, function (entry) {\n var get = entry.get,\n type = entry.type,\n value = item[get]();\n\n if (entry.exportFilter ? entry.exportFilter(item, value) : !parent || !Base.equals(parent[get](), value)) {\n if (type === 'color' && value != null) {\n var alpha = value.getAlpha();\n if (alpha < 1) attrs[entry.attribute + '-opacity'] = alpha;\n }\n\n if (type === 'style') {\n style.push(entry.attribute + ': ' + value);\n } else {\n attrs[entry.attribute] = value == null ? 'none' : type === 'color' ? value.gradient ? exportGradient(value, item) : value.toCSS(true) : type === 'array' ? value.join(',') : type === 'lookup' ? entry.toSVG[value] : value;\n }\n }\n });\n if (style.length) attrs.style = style.join(';');\n if (attrs.opacity === 1) delete attrs.opacity;\n if (!item._visible) attrs.visibility = 'hidden';\n return SvgElement.set(node, attrs, formatter);\n }\n\n var definitions;\n\n function getDefinition(item, type) {\n if (!definitions) definitions = {\n ids: {},\n svgs: {}\n };\n return item && definitions.svgs[type + '-' + (item._id || item.__id || (item.__id = UID.get('svg')))];\n }\n\n function setDefinition(item, node, type) {\n if (!definitions) getDefinition();\n var typeId = definitions.ids[type] = (definitions.ids[type] || 0) + 1;\n node.id = type + '-' + typeId;\n definitions.svgs[type + '-' + (item._id || item.__id)] = node;\n }\n\n function exportDefinitions(node, options) {\n var svg = node,\n defs = null;\n\n if (definitions) {\n svg = node.nodeName.toLowerCase() === 'svg' && node;\n\n for (var i in definitions.svgs) {\n if (!defs) {\n if (!svg) {\n svg = SvgElement.create('svg');\n svg.appendChild(node);\n }\n\n defs = svg.insertBefore(SvgElement.create('defs'), svg.firstChild);\n }\n\n defs.appendChild(definitions.svgs[i]);\n }\n\n definitions = null;\n }\n\n return options.asString ? new self.XMLSerializer().serializeToString(svg) : svg;\n }\n\n function _exportSVG(item, options, isRoot) {\n var exporter = exporters[item._class],\n node = exporter && exporter(item, options);\n\n if (node) {\n var onExport = options.onExport;\n if (onExport) node = onExport(item, node, options) || node;\n var data = JSON.stringify(item._data);\n if (data && data !== '{}' && data !== 'null') node.setAttribute('data-paper-data', data);\n }\n\n return node && applyStyle(item, node, isRoot);\n }\n\n function setOptions(options) {\n if (!options) options = {};\n formatter = new Formatter(options.precision);\n return options;\n }\n\n Item.inject({\n exportSVG: function exportSVG(options) {\n options = setOptions(options);\n return exportDefinitions(_exportSVG(this, options, true), options);\n }\n });\n Project.inject({\n exportSVG: function exportSVG(options) {\n options = setOptions(options);\n var children = this._children,\n view = this.getView(),\n bounds = Base.pick(options.bounds, 'view'),\n mx = options.matrix || bounds === 'view' && view._matrix,\n matrix = mx && Matrix.read([mx]),\n rect = bounds === 'view' ? new _Rectangle([0, 0], view.getViewSize()) : bounds === 'content' ? Item._getBounds(children, matrix, {\n stroke: true\n }).rect : _Rectangle.read([bounds], 0, {\n readNull: true\n }),\n attrs = {\n version: '1.1',\n xmlns: SvgElement.svg,\n 'xmlns:xlink': SvgElement.xlink\n };\n\n if (rect) {\n attrs.width = rect.width;\n attrs.height = rect.height;\n if (rect.x || rect.x === 0 || rect.y || rect.y === 0) attrs.viewBox = formatter.rectangle(rect);\n }\n\n var node = SvgElement.create('svg', attrs, formatter),\n parent = node;\n\n if (matrix && !matrix.isIdentity()) {\n parent = node.appendChild(SvgElement.create('g', getTransform(matrix), formatter));\n }\n\n for (var i = 0, l = children.length; i < l; i++) {\n parent.appendChild(_exportSVG(children[i], options, true));\n }\n\n return exportDefinitions(node, options);\n }\n });\n }();\n new function () {\n var definitions = {},\n rootSize;\n\n function getValue(node, name, isString, allowNull, allowPercent, defaultValue) {\n var value = SvgElement.get(node, name) || defaultValue,\n res = value == null ? allowNull ? null : isString ? '' : 0 : isString ? value : parseFloat(value);\n return /%\\s*$/.test(value) ? res / 100 * (allowPercent ? 1 : rootSize[/x|^width/.test(name) ? 'width' : 'height']) : res;\n }\n\n function getPoint(node, x, y, allowNull, allowPercent, defaultX, defaultY) {\n x = getValue(node, x || 'x', false, allowNull, allowPercent, defaultX);\n y = getValue(node, y || 'y', false, allowNull, allowPercent, defaultY);\n return allowNull && (x == null || y == null) ? null : new Point(x, y);\n }\n\n function getSize(node, w, h, allowNull, allowPercent) {\n w = getValue(node, w || 'width', false, allowNull, allowPercent);\n h = getValue(node, h || 'height', false, allowNull, allowPercent);\n return allowNull && (w == null || h == null) ? null : new Size(w, h);\n }\n\n function convertValue(value, type, lookup) {\n return value === 'none' ? null : type === 'number' ? parseFloat(value) : type === 'array' ? value ? value.split(/[\\s,]+/g).map(parseFloat) : [] : type === 'color' ? getDefinition(value) || value : type === 'lookup' ? lookup[value] : value;\n }\n\n function importGroup(node, type, options, isRoot) {\n var nodes = node.childNodes,\n isClip = type === 'clippath',\n isDefs = type === 'defs',\n item = new Group(),\n project = item._project,\n currentStyle = project._currentStyle,\n children = [];\n\n if (!isClip && !isDefs) {\n item = applyAttributes(item, node, isRoot);\n project._currentStyle = item._style.clone();\n }\n\n if (isRoot) {\n var defs = node.querySelectorAll('defs');\n\n for (var i = 0, l = defs.length; i < l; i++) {\n importNode(defs[i], options, false);\n }\n }\n\n for (var i = 0, l = nodes.length; i < l; i++) {\n var childNode = nodes[i],\n child;\n if (childNode.nodeType === 1 && !/^defs$/i.test(childNode.nodeName) && (child = importNode(childNode, options, false)) && !(child instanceof SymbolDefinition)) children.push(child);\n }\n\n item.addChildren(children);\n if (isClip) item = applyAttributes(item.reduce(), node, isRoot);\n project._currentStyle = currentStyle;\n\n if (isClip || isDefs) {\n item.remove();\n item = null;\n }\n\n return item;\n }\n\n function importPoly(node, type) {\n var coords = node.getAttribute('points').match(/[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g),\n points = [];\n\n for (var i = 0, l = coords.length; i < l; i += 2) {\n points.push(new Point(parseFloat(coords[i]), parseFloat(coords[i + 1])));\n }\n\n var path = new Path(points);\n if (type === 'polygon') path.closePath();\n return path;\n }\n\n function importPath(node) {\n return PathItem.create(node.getAttribute('d'));\n }\n\n function importGradient(node, type) {\n var id = (getValue(node, 'href', true) || '').substring(1),\n radial = type === 'radialgradient',\n gradient;\n\n if (id) {\n gradient = definitions[id].getGradient();\n\n if (gradient._radial ^ radial) {\n gradient = gradient.clone();\n gradient._radial = radial;\n }\n } else {\n var nodes = node.childNodes,\n stops = [];\n\n for (var i = 0, l = nodes.length; i < l; i++) {\n var child = nodes[i];\n if (child.nodeType === 1) stops.push(applyAttributes(new GradientStop(), child));\n }\n\n gradient = new Gradient(stops, radial);\n }\n\n var origin,\n destination,\n highlight,\n scaleToBounds = getValue(node, 'gradientUnits', true) !== 'userSpaceOnUse';\n\n if (radial) {\n origin = getPoint(node, 'cx', 'cy', false, scaleToBounds, '50%', '50%');\n destination = origin.add(getValue(node, 'r', false, false, scaleToBounds, '50%'), 0);\n highlight = getPoint(node, 'fx', 'fy', true, scaleToBounds);\n } else {\n origin = getPoint(node, 'x1', 'y1', false, scaleToBounds, '0%', '0%');\n destination = getPoint(node, 'x2', 'y2', false, scaleToBounds, '100%', '0%');\n }\n\n var color = applyAttributes(new Color(gradient, origin, destination, highlight), node);\n color._scaleToBounds = scaleToBounds;\n return null;\n }\n\n var importers = {\n '#document': function document(node, type, options, isRoot) {\n var nodes = node.childNodes;\n\n for (var i = 0, l = nodes.length; i < l; i++) {\n var child = nodes[i];\n if (child.nodeType === 1) return importNode(child, options, isRoot);\n }\n },\n g: importGroup,\n svg: importGroup,\n clippath: importGroup,\n polygon: importPoly,\n polyline: importPoly,\n path: importPath,\n lineargradient: importGradient,\n radialgradient: importGradient,\n image: function image(node) {\n var raster = new Raster(getValue(node, 'href', true));\n raster.on('load', function () {\n var size = getSize(node);\n this.setSize(size);\n var center = getPoint(node).add(size.divide(2));\n\n this._matrix.append(new Matrix().translate(center));\n });\n return raster;\n },\n symbol: function symbol(node, type, options, isRoot) {\n return new SymbolDefinition(importGroup(node, type, options, isRoot), true);\n },\n defs: importGroup,\n use: function use(node) {\n var id = (getValue(node, 'href', true) || '').substring(1),\n definition = definitions[id],\n point = getPoint(node);\n return definition ? definition instanceof SymbolDefinition ? definition.place(point) : definition.clone().translate(point) : null;\n },\n circle: function circle(node) {\n return new Shape.Circle(getPoint(node, 'cx', 'cy'), getValue(node, 'r'));\n },\n ellipse: function ellipse(node) {\n return new Shape.Ellipse({\n center: getPoint(node, 'cx', 'cy'),\n radius: getSize(node, 'rx', 'ry')\n });\n },\n rect: function rect(node) {\n return new Shape.Rectangle(new _Rectangle(getPoint(node), getSize(node)), getSize(node, 'rx', 'ry'));\n },\n line: function line(node) {\n return new Path.Line(getPoint(node, 'x1', 'y1'), getPoint(node, 'x2', 'y2'));\n },\n text: function text(node) {\n var text = new PointText(getPoint(node).add(getPoint(node, 'dx', 'dy')));\n text.setContent(node.textContent.trim() || '');\n return text;\n },\n switch: importGroup\n };\n\n function applyTransform(item, value, name, node) {\n if (item.transform) {\n var transforms = (node.getAttribute(name) || '').split(/\\)\\s*/g),\n matrix = new Matrix();\n\n for (var i = 0, l = transforms.length; i < l; i++) {\n var transform = transforms[i];\n if (!transform) break;\n var parts = transform.split(/\\(\\s*/),\n command = parts[0],\n v = parts[1].split(/[\\s,]+/g);\n\n for (var j = 0, m = v.length; j < m; j++) {\n v[j] = parseFloat(v[j]);\n }\n\n switch (command) {\n case 'matrix':\n matrix.append(new Matrix(v[0], v[1], v[2], v[3], v[4], v[5]));\n break;\n\n case 'rotate':\n matrix.rotate(v[0], v[1] || 0, v[2] || 0);\n break;\n\n case 'translate':\n matrix.translate(v[0], v[1] || 0);\n break;\n\n case 'scale':\n matrix.scale(v);\n break;\n\n case 'skewX':\n matrix.skew(v[0], 0);\n break;\n\n case 'skewY':\n matrix.skew(0, v[0]);\n break;\n }\n }\n\n item.transform(matrix);\n }\n }\n\n function applyOpacity(item, value, name) {\n var key = name === 'fill-opacity' ? 'getFillColor' : 'getStrokeColor',\n color = item[key] && item[key]();\n if (color) color.setAlpha(parseFloat(value));\n }\n\n var attributes = Base.set(Base.each(SvgStyles, function (entry) {\n this[entry.attribute] = function (item, value) {\n if (item[entry.set]) {\n item[entry.set](convertValue(value, entry.type, entry.fromSVG));\n\n if (entry.type === 'color') {\n var color = item[entry.get]();\n\n if (color) {\n if (color._scaleToBounds) {\n var bounds = item.getBounds();\n color.transform(new Matrix().translate(bounds.getPoint()).scale(bounds.getSize()));\n }\n }\n }\n }\n };\n }, {}), {\n id: function id(item, value) {\n definitions[value] = item;\n if (item.setName) item.setName(value);\n },\n 'clip-path': function clipPath(item, value) {\n var clip = getDefinition(value);\n\n if (clip) {\n clip = clip.clone();\n clip.setClipMask(true);\n\n if (item instanceof Group) {\n item.insertChild(0, clip);\n } else {\n return new Group(clip, item);\n }\n }\n },\n gradientTransform: applyTransform,\n transform: applyTransform,\n 'fill-opacity': applyOpacity,\n 'stroke-opacity': applyOpacity,\n visibility: function visibility(item, value) {\n if (item.setVisible) item.setVisible(value === 'visible');\n },\n display: function display(item, value) {\n if (item.setVisible) item.setVisible(value !== null);\n },\n 'stop-color': function stopColor(item, value) {\n if (item.setColor) item.setColor(value);\n },\n 'stop-opacity': function stopOpacity(item, value) {\n if (item._color) item._color.setAlpha(parseFloat(value));\n },\n offset: function offset(item, value) {\n if (item.setOffset) {\n var percent = value.match(/(.*)%$/);\n item.setOffset(percent ? percent[1] / 100 : parseFloat(value));\n }\n },\n viewBox: function viewBox(item, value, name, node, styles) {\n var rect = new _Rectangle(convertValue(value, 'array')),\n size = getSize(node, null, null, true),\n group,\n matrix;\n\n if (item instanceof Group) {\n var scale = size ? size.divide(rect.getSize()) : 1,\n matrix = new Matrix().scale(scale).translate(rect.getPoint().negate());\n group = item;\n } else if (item instanceof SymbolDefinition) {\n if (size) rect.setSize(size);\n group = item._item;\n }\n\n if (group) {\n if (getAttribute(node, 'overflow', styles) !== 'visible') {\n var clip = new Shape.Rectangle(rect);\n clip.setClipMask(true);\n group.addChild(clip);\n }\n\n if (matrix) group.transform(matrix);\n }\n }\n });\n\n function getAttribute(node, name, styles) {\n var attr = node.attributes[name],\n value = attr && attr.value;\n\n if (!value && node.style) {\n var style = Base.camelize(name);\n value = node.style[style];\n if (!value && styles.node[style] !== styles.parent[style]) value = styles.node[style];\n }\n\n return !value ? undefined : value === 'none' ? null : value;\n }\n\n function applyAttributes(item, node, isRoot) {\n var parent = node.parentNode,\n styles = {\n node: DomElement.getStyles(node) || {},\n parent: !isRoot && !/^defs$/i.test(parent.tagName) && DomElement.getStyles(parent) || {}\n };\n Base.each(attributes, function (apply, name) {\n var value = getAttribute(node, name, styles);\n item = value !== undefined && apply(item, value, name, node, styles) || item;\n });\n return item;\n }\n\n function getDefinition(value) {\n var match = value && value.match(/\\((?:[\"'#]*)([^\"')]+)/),\n name = match && match[1],\n res = name && definitions[window ? name.replace(window.location.href.split('#')[0] + '#', '') : name];\n\n if (res && res._scaleToBounds) {\n res = res.clone();\n res._scaleToBounds = true;\n }\n\n return res;\n }\n\n function importNode(node, options, isRoot) {\n var type = node.nodeName.toLowerCase(),\n isElement = type !== '#document',\n body = document.body,\n container,\n parent,\n next;\n\n if (isRoot && isElement) {\n rootSize = paper.getView().getSize();\n rootSize = getSize(node, null, null, true) || rootSize;\n container = SvgElement.create('svg', {\n style: 'stroke-width: 1px; stroke-miterlimit: 10'\n });\n parent = node.parentNode;\n next = node.nextSibling;\n container.appendChild(node);\n body.appendChild(container);\n }\n\n var settings = paper.settings,\n applyMatrix = settings.applyMatrix,\n insertItems = settings.insertItems;\n settings.applyMatrix = false;\n settings.insertItems = false;\n var importer = importers[type],\n item = importer && importer(node, type, options, isRoot) || null;\n settings.insertItems = insertItems;\n settings.applyMatrix = applyMatrix;\n\n if (item) {\n if (isElement && !(item instanceof Group)) item = applyAttributes(item, node, isRoot);\n var onImport = options.onImport,\n data = isElement && node.getAttribute('data-paper-data');\n if (onImport) item = onImport(node, item, options) || item;\n\n if (options.expandShapes && item instanceof Shape) {\n item.remove();\n item = item.toPath();\n }\n\n if (data) item._data = JSON.parse(data);\n }\n\n if (container) {\n body.removeChild(container);\n\n if (parent) {\n if (next) {\n parent.insertBefore(node, next);\n } else {\n parent.appendChild(node);\n }\n }\n }\n\n if (isRoot) {\n definitions = {};\n if (item && Base.pick(options.applyMatrix, applyMatrix)) item.matrix.apply(true, true);\n }\n\n return item;\n }\n\n function _importSVG(source, options, owner) {\n if (!source) return null;\n options = typeof options === 'function' ? {\n onLoad: options\n } : options || {};\n var scope = paper,\n item = null;\n\n function onLoad(svg) {\n try {\n var node = typeof svg === 'object' ? svg : new self.DOMParser().parseFromString(svg.trim(), 'image/svg+xml');\n\n if (!node.nodeName) {\n node = null;\n throw new Error('Unsupported SVG source: ' + source);\n }\n\n paper = scope;\n item = importNode(node, options, true);\n\n if (!options || options.insert !== false) {\n owner._insertItem(undefined, item);\n }\n\n var onLoad = options.onLoad;\n if (onLoad) onLoad(item, svg);\n } catch (e) {\n onError(e);\n }\n }\n\n function onError(message, status) {\n var onError = options.onError;\n\n if (onError) {\n onError(message, status);\n } else {\n throw new Error(message);\n }\n }\n\n if (typeof source === 'string' && !/^[\\s\\S]* 3) {\n cats.sort(function (a, b) {\n return b.length - a.length;\n });\n f += \"switch(str.length){\";\n\n for (var i = 0; i < cats.length; ++i) {\n var cat = cats[i];\n f += \"case \" + cat[0].length + \":\";\n compareTo(cat);\n }\n\n f += \"}\";\n } else {\n compareTo(words);\n }\n\n return new Function(\"str\", f);\n }\n\n var isReservedWord3 = makePredicate(\"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile\");\n var isReservedWord5 = makePredicate(\"class enum extends super const export import\");\n var isStrictReservedWord = makePredicate(\"implements interface let package private protected public static yield\");\n var isStrictBadIdWord = makePredicate(\"eval arguments\");\n var isKeyword = makePredicate(\"break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this\");\n var nonASCIIwhitespace = /[\\u1680\\u180e\\u2000-\\u200a\\u202f\\u205f\\u3000\\ufeff]/;\n var nonASCIIidentifierStartChars = \"\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC\";\n var nonASCIIidentifierChars = \"\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u0620-\\u0649\\u0672-\\u06D3\\u06E7-\\u06E8\\u06FB-\\u06FC\\u0730-\\u074A\\u0800-\\u0814\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0840-\\u0857\\u08E4-\\u08FE\\u0900-\\u0903\\u093A-\\u093C\\u093E-\\u094F\\u0951-\\u0957\\u0962-\\u0963\\u0966-\\u096F\\u0981-\\u0983\\u09BC\\u09BE-\\u09C4\\u09C7\\u09C8\\u09D7\\u09DF-\\u09E0\\u0A01-\\u0A03\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A66-\\u0A71\\u0A75\\u0A81-\\u0A83\\u0ABC\\u0ABE-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AE2-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B3C\\u0B3E-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5F-\\u0B60\\u0B66-\\u0B6F\\u0B82\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD7\\u0BE6-\\u0BEF\\u0C01-\\u0C03\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62-\\u0C63\\u0C66-\\u0C6F\\u0C82\\u0C83\\u0CBC\\u0CBE-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CE2-\\u0CE3\\u0CE6-\\u0CEF\\u0D02\\u0D03\\u0D46-\\u0D48\\u0D57\\u0D62-\\u0D63\\u0D66-\\u0D6F\\u0D82\\u0D83\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0E34-\\u0E3A\\u0E40-\\u0E45\\u0E50-\\u0E59\\u0EB4-\\u0EB9\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F41-\\u0F47\\u0F71-\\u0F84\\u0F86-\\u0F87\\u0F8D-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1029\\u1040-\\u1049\\u1067-\\u106D\\u1071-\\u1074\\u1082-\\u108D\\u108F-\\u109D\\u135D-\\u135F\\u170E-\\u1710\\u1720-\\u1730\\u1740-\\u1750\\u1772\\u1773\\u1780-\\u17B2\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1920-\\u192B\\u1930-\\u193B\\u1951-\\u196D\\u19B0-\\u19C0\\u19C8-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A15\\u1A20-\\u1A53\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1B46-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1BB0-\\u1BB9\\u1BE6-\\u1BF3\\u1C00-\\u1C22\\u1C40-\\u1C49\\u1C5B-\\u1C7D\\u1CD0-\\u1CD2\\u1D00-\\u1DBE\\u1E01-\\u1F15\\u200C\\u200D\\u203F\\u2040\\u2054\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2D81-\\u2D96\\u2DE0-\\u2DFF\\u3021-\\u3028\\u3099\\u309A\\uA640-\\uA66D\\uA674-\\uA67D\\uA69F\\uA6F0-\\uA6F1\\uA7F8-\\uA800\\uA806\\uA80B\\uA823-\\uA827\\uA880-\\uA881\\uA8B4-\\uA8C4\\uA8D0-\\uA8D9\\uA8F3-\\uA8F7\\uA900-\\uA909\\uA926-\\uA92D\\uA930-\\uA945\\uA980-\\uA983\\uA9B3-\\uA9C0\\uAA00-\\uAA27\\uAA40-\\uAA41\\uAA4C-\\uAA4D\\uAA50-\\uAA59\\uAA7B\\uAAE0-\\uAAE9\\uAAF2-\\uAAF3\\uABC0-\\uABE1\\uABEC\\uABED\\uABF0-\\uABF9\\uFB20-\\uFB28\\uFE00-\\uFE0F\\uFE20-\\uFE26\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF10-\\uFF19\\uFF3F\";\n var nonASCIIidentifierStart = new RegExp(\"[\" + nonASCIIidentifierStartChars + \"]\");\n var nonASCIIidentifier = new RegExp(\"[\" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + \"]\");\n var newline = /[\\n\\r\\u2028\\u2029]/;\n var lineBreak = /\\r\\n|[\\n\\r\\u2028\\u2029]/g;\n\n var isIdentifierStart = exports.isIdentifierStart = function (code) {\n if (code < 65) return code === 36;\n if (code < 91) return true;\n if (code < 97) return code === 95;\n if (code < 123) return true;\n return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));\n };\n\n var isIdentifierChar = exports.isIdentifierChar = function (code) {\n if (code < 48) return code === 36;\n if (code < 58) return true;\n if (code < 65) return false;\n if (code < 91) return true;\n if (code < 97) return code === 95;\n if (code < 123) return true;\n return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));\n };\n\n function line_loc_t() {\n this.line = tokCurLine;\n this.column = tokPos - tokLineStart;\n }\n\n function initTokenState() {\n tokCurLine = 1;\n tokPos = tokLineStart = 0;\n tokRegexpAllowed = true;\n skipSpace();\n }\n\n function finishToken(type, val) {\n tokEnd = tokPos;\n if (options.locations) tokEndLoc = new line_loc_t();\n tokType = type;\n skipSpace();\n tokVal = val;\n tokRegexpAllowed = type.beforeExpr;\n }\n\n function skipBlockComment() {\n var startLoc = options.onComment && options.locations && new line_loc_t();\n var start = tokPos,\n end = input.indexOf(\"*/\", tokPos += 2);\n if (end === -1) raise(tokPos - 2, \"Unterminated comment\");\n tokPos = end + 2;\n\n if (options.locations) {\n lineBreak.lastIndex = start;\n var match;\n\n while ((match = lineBreak.exec(input)) && match.index < tokPos) {\n ++tokCurLine;\n tokLineStart = match.index + match[0].length;\n }\n }\n\n if (options.onComment) options.onComment(true, input.slice(start + 2, end), start, tokPos, startLoc, options.locations && new line_loc_t());\n }\n\n function skipLineComment() {\n var start = tokPos;\n var startLoc = options.onComment && options.locations && new line_loc_t();\n var ch = input.charCodeAt(tokPos += 2);\n\n while (tokPos < inputLen && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) {\n ++tokPos;\n ch = input.charCodeAt(tokPos);\n }\n\n if (options.onComment) options.onComment(false, input.slice(start + 2, tokPos), start, tokPos, startLoc, options.locations && new line_loc_t());\n }\n\n function skipSpace() {\n while (tokPos < inputLen) {\n var ch = input.charCodeAt(tokPos);\n\n if (ch === 32) {\n ++tokPos;\n } else if (ch === 13) {\n ++tokPos;\n var next = input.charCodeAt(tokPos);\n\n if (next === 10) {\n ++tokPos;\n }\n\n if (options.locations) {\n ++tokCurLine;\n tokLineStart = tokPos;\n }\n } else if (ch === 10 || ch === 8232 || ch === 8233) {\n ++tokPos;\n\n if (options.locations) {\n ++tokCurLine;\n tokLineStart = tokPos;\n }\n } else if (ch > 8 && ch < 14) {\n ++tokPos;\n } else if (ch === 47) {\n var next = input.charCodeAt(tokPos + 1);\n\n if (next === 42) {\n skipBlockComment();\n } else if (next === 47) {\n skipLineComment();\n } else break;\n } else if (ch === 160) {\n ++tokPos;\n } else if (ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {\n ++tokPos;\n } else {\n break;\n }\n }\n }\n\n function readToken_dot() {\n var next = input.charCodeAt(tokPos + 1);\n if (next >= 48 && next <= 57) return readNumber(true);\n ++tokPos;\n return finishToken(_dot);\n }\n\n function readToken_slash() {\n var next = input.charCodeAt(tokPos + 1);\n\n if (tokRegexpAllowed) {\n ++tokPos;\n return readRegexp();\n }\n\n if (next === 61) return finishOp(_assign, 2);\n return finishOp(_slash, 1);\n }\n\n function readToken_mult_modulo() {\n var next = input.charCodeAt(tokPos + 1);\n if (next === 61) return finishOp(_assign, 2);\n return finishOp(_multiplyModulo, 1);\n }\n\n function readToken_pipe_amp(code) {\n var next = input.charCodeAt(tokPos + 1);\n if (next === code) return finishOp(code === 124 ? _logicalOR : _logicalAND, 2);\n if (next === 61) return finishOp(_assign, 2);\n return finishOp(code === 124 ? _bitwiseOR : _bitwiseAND, 1);\n }\n\n function readToken_caret() {\n var next = input.charCodeAt(tokPos + 1);\n if (next === 61) return finishOp(_assign, 2);\n return finishOp(_bitwiseXOR, 1);\n }\n\n function readToken_plus_min(code) {\n var next = input.charCodeAt(tokPos + 1);\n\n if (next === code) {\n if (next == 45 && input.charCodeAt(tokPos + 2) == 62 && newline.test(input.slice(lastEnd, tokPos))) {\n tokPos += 3;\n skipLineComment();\n skipSpace();\n return readToken();\n }\n\n return finishOp(_incDec, 2);\n }\n\n if (next === 61) return finishOp(_assign, 2);\n return finishOp(_plusMin, 1);\n }\n\n function readToken_lt_gt(code) {\n var next = input.charCodeAt(tokPos + 1);\n var size = 1;\n\n if (next === code) {\n size = code === 62 && input.charCodeAt(tokPos + 2) === 62 ? 3 : 2;\n if (input.charCodeAt(tokPos + size) === 61) return finishOp(_assign, size + 1);\n return finishOp(_bitShift, size);\n }\n\n if (next == 33 && code == 60 && input.charCodeAt(tokPos + 2) == 45 && input.charCodeAt(tokPos + 3) == 45) {\n tokPos += 4;\n skipLineComment();\n skipSpace();\n return readToken();\n }\n\n if (next === 61) size = input.charCodeAt(tokPos + 2) === 61 ? 3 : 2;\n return finishOp(_relational, size);\n }\n\n function readToken_eq_excl(code) {\n var next = input.charCodeAt(tokPos + 1);\n if (next === 61) return finishOp(_equality, input.charCodeAt(tokPos + 2) === 61 ? 3 : 2);\n return finishOp(code === 61 ? _eq : _prefix, 1);\n }\n\n function getTokenFromCode(code) {\n switch (code) {\n case 46:\n return readToken_dot();\n\n case 40:\n ++tokPos;\n return finishToken(_parenL);\n\n case 41:\n ++tokPos;\n return finishToken(_parenR);\n\n case 59:\n ++tokPos;\n return finishToken(_semi);\n\n case 44:\n ++tokPos;\n return finishToken(_comma);\n\n case 91:\n ++tokPos;\n return finishToken(_bracketL);\n\n case 93:\n ++tokPos;\n return finishToken(_bracketR);\n\n case 123:\n ++tokPos;\n return finishToken(_braceL);\n\n case 125:\n ++tokPos;\n return finishToken(_braceR);\n\n case 58:\n ++tokPos;\n return finishToken(_colon);\n\n case 63:\n ++tokPos;\n return finishToken(_question);\n\n case 48:\n var next = input.charCodeAt(tokPos + 1);\n if (next === 120 || next === 88) return readHexNumber();\n\n case 49:\n case 50:\n case 51:\n case 52:\n case 53:\n case 54:\n case 55:\n case 56:\n case 57:\n return readNumber(false);\n\n case 34:\n case 39:\n return readString(code);\n\n case 47:\n return readToken_slash(code);\n\n case 37:\n case 42:\n return readToken_mult_modulo();\n\n case 124:\n case 38:\n return readToken_pipe_amp(code);\n\n case 94:\n return readToken_caret();\n\n case 43:\n case 45:\n return readToken_plus_min(code);\n\n case 60:\n case 62:\n return readToken_lt_gt(code);\n\n case 61:\n case 33:\n return readToken_eq_excl(code);\n\n case 126:\n return finishOp(_prefix, 1);\n }\n\n return false;\n }\n\n function readToken(forceRegexp) {\n if (!forceRegexp) tokStart = tokPos;else tokPos = tokStart + 1;\n if (options.locations) tokStartLoc = new line_loc_t();\n if (forceRegexp) return readRegexp();\n if (tokPos >= inputLen) return finishToken(_eof);\n var code = input.charCodeAt(tokPos);\n if (isIdentifierStart(code) || code === 92) return readWord();\n var tok = getTokenFromCode(code);\n\n if (tok === false) {\n var ch = String.fromCharCode(code);\n if (ch === \"\\\\\" || nonASCIIidentifierStart.test(ch)) return readWord();\n raise(tokPos, \"Unexpected character '\" + ch + \"'\");\n }\n\n return tok;\n }\n\n function finishOp(type, size) {\n var str = input.slice(tokPos, tokPos + size);\n tokPos += size;\n finishToken(type, str);\n }\n\n function readRegexp() {\n var content = \"\",\n escaped,\n inClass,\n start = tokPos;\n\n for (;;) {\n if (tokPos >= inputLen) raise(start, \"Unterminated regular expression\");\n var ch = input.charAt(tokPos);\n if (newline.test(ch)) raise(start, \"Unterminated regular expression\");\n\n if (!escaped) {\n if (ch === \"[\") inClass = true;else if (ch === \"]\" && inClass) inClass = false;else if (ch === \"/\" && !inClass) break;\n escaped = ch === \"\\\\\";\n } else escaped = false;\n\n ++tokPos;\n }\n\n var content = input.slice(start, tokPos);\n ++tokPos;\n var mods = readWord1();\n if (mods && !/^[gmsiy]*$/.test(mods)) raise(start, \"Invalid regexp flag\");\n\n try {\n var value = new RegExp(content, mods);\n } catch (e) {\n if (e instanceof SyntaxError) raise(start, e.message);\n raise(e);\n }\n\n return finishToken(_regexp, value);\n }\n\n function readInt(radix, len) {\n var start = tokPos,\n total = 0;\n\n for (var i = 0, e = len == null ? Infinity : len; i < e; ++i) {\n var code = input.charCodeAt(tokPos),\n val;\n if (code >= 97) val = code - 97 + 10;else if (code >= 65) val = code - 65 + 10;else if (code >= 48 && code <= 57) val = code - 48;else val = Infinity;\n if (val >= radix) break;\n ++tokPos;\n total = total * radix + val;\n }\n\n if (tokPos === start || len != null && tokPos - start !== len) return null;\n return total;\n }\n\n function readHexNumber() {\n tokPos += 2;\n var val = readInt(16);\n if (val == null) raise(tokStart + 2, \"Expected hexadecimal number\");\n if (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, \"Identifier directly after number\");\n return finishToken(_num, val);\n }\n\n function readNumber(startsWithDot) {\n var start = tokPos,\n isFloat = false,\n octal = input.charCodeAt(tokPos) === 48;\n if (!startsWithDot && readInt(10) === null) raise(start, \"Invalid number\");\n\n if (input.charCodeAt(tokPos) === 46) {\n ++tokPos;\n readInt(10);\n isFloat = true;\n }\n\n var next = input.charCodeAt(tokPos);\n\n if (next === 69 || next === 101) {\n next = input.charCodeAt(++tokPos);\n if (next === 43 || next === 45) ++tokPos;\n if (readInt(10) === null) raise(start, \"Invalid number\");\n isFloat = true;\n }\n\n if (isIdentifierStart(input.charCodeAt(tokPos))) raise(tokPos, \"Identifier directly after number\");\n var str = input.slice(start, tokPos),\n val;\n if (isFloat) val = parseFloat(str);else if (!octal || str.length === 1) val = parseInt(str, 10);else if (/[89]/.test(str) || strict) raise(start, \"Invalid number\");else val = parseInt(str, 8);\n return finishToken(_num, val);\n }\n\n function readString(quote) {\n tokPos++;\n var out = \"\";\n\n for (;;) {\n if (tokPos >= inputLen) raise(tokStart, \"Unterminated string constant\");\n var ch = input.charCodeAt(tokPos);\n\n if (ch === quote) {\n ++tokPos;\n return finishToken(_string, out);\n }\n\n if (ch === 92) {\n ch = input.charCodeAt(++tokPos);\n var octal = /^[0-7]+/.exec(input.slice(tokPos, tokPos + 3));\n if (octal) octal = octal[0];\n\n while (octal && parseInt(octal, 8) > 255) {\n octal = octal.slice(0, -1);\n }\n\n if (octal === \"0\") octal = null;\n ++tokPos;\n\n if (octal) {\n if (strict) raise(tokPos - 2, \"Octal literal in strict mode\");\n out += String.fromCharCode(parseInt(octal, 8));\n tokPos += octal.length - 1;\n } else {\n switch (ch) {\n case 110:\n out += \"\\n\";\n break;\n\n case 114:\n out += \"\\r\";\n break;\n\n case 120:\n out += String.fromCharCode(readHexChar(2));\n break;\n\n case 117:\n out += String.fromCharCode(readHexChar(4));\n break;\n\n case 85:\n out += String.fromCharCode(readHexChar(8));\n break;\n\n case 116:\n out += \"\\t\";\n break;\n\n case 98:\n out += \"\\b\";\n break;\n\n case 118:\n out += \"\\x0B\";\n break;\n\n case 102:\n out += \"\\f\";\n break;\n\n case 48:\n out += \"\\0\";\n break;\n\n case 13:\n if (input.charCodeAt(tokPos) === 10) ++tokPos;\n\n case 10:\n if (options.locations) {\n tokLineStart = tokPos;\n ++tokCurLine;\n }\n\n break;\n\n default:\n out += String.fromCharCode(ch);\n break;\n }\n }\n } else {\n if (ch === 13 || ch === 10 || ch === 8232 || ch === 8233) raise(tokStart, \"Unterminated string constant\");\n out += String.fromCharCode(ch);\n ++tokPos;\n }\n }\n }\n\n function readHexChar(len) {\n var n = readInt(16, len);\n if (n === null) raise(tokStart, \"Bad character escape sequence\");\n return n;\n }\n\n var containsEsc;\n\n function readWord1() {\n containsEsc = false;\n var word,\n first = true,\n start = tokPos;\n\n for (;;) {\n var ch = input.charCodeAt(tokPos);\n\n if (isIdentifierChar(ch)) {\n if (containsEsc) word += input.charAt(tokPos);\n ++tokPos;\n } else if (ch === 92) {\n if (!containsEsc) word = input.slice(start, tokPos);\n containsEsc = true;\n if (input.charCodeAt(++tokPos) != 117) raise(tokPos, \"Expecting Unicode escape sequence \\\\uXXXX\");\n ++tokPos;\n var esc = readHexChar(4);\n var escStr = String.fromCharCode(esc);\n if (!escStr) raise(tokPos - 1, \"Invalid Unicode escape\");\n if (!(first ? isIdentifierStart(esc) : isIdentifierChar(esc))) raise(tokPos - 4, \"Invalid Unicode escape\");\n word += escStr;\n } else {\n break;\n }\n\n first = false;\n }\n\n return containsEsc ? word : input.slice(start, tokPos);\n }\n\n function readWord() {\n var word = readWord1();\n var type = _name;\n if (!containsEsc && isKeyword(word)) type = keywordTypes[word];\n return finishToken(type, word);\n }\n\n function next() {\n lastStart = tokStart;\n lastEnd = tokEnd;\n lastEndLoc = tokEndLoc;\n readToken();\n }\n\n function setStrict(strct) {\n strict = strct;\n tokPos = tokStart;\n\n if (options.locations) {\n while (tokPos < tokLineStart) {\n tokLineStart = input.lastIndexOf(\"\\n\", tokLineStart - 2) + 1;\n --tokCurLine;\n }\n }\n\n skipSpace();\n readToken();\n }\n\n function node_t() {\n this.type = null;\n this.start = tokStart;\n this.end = null;\n }\n\n function node_loc_t() {\n this.start = tokStartLoc;\n this.end = null;\n if (sourceFile !== null) this.source = sourceFile;\n }\n\n function startNode() {\n var node = new node_t();\n if (options.locations) node.loc = new node_loc_t();\n if (options.directSourceFile) node.sourceFile = options.directSourceFile;\n if (options.ranges) node.range = [tokStart, 0];\n return node;\n }\n\n function startNodeFrom(other) {\n var node = new node_t();\n node.start = other.start;\n\n if (options.locations) {\n node.loc = new node_loc_t();\n node.loc.start = other.loc.start;\n }\n\n if (options.ranges) node.range = [other.range[0], 0];\n return node;\n }\n\n function finishNode(node, type) {\n node.type = type;\n node.end = lastEnd;\n if (options.locations) node.loc.end = lastEndLoc;\n if (options.ranges) node.range[1] = lastEnd;\n return node;\n }\n\n function isUseStrict(stmt) {\n return options.ecmaVersion >= 5 && stmt.type === \"ExpressionStatement\" && stmt.expression.type === \"Literal\" && stmt.expression.value === \"use strict\";\n }\n\n function eat(type) {\n if (tokType === type) {\n next();\n return true;\n }\n }\n\n function canInsertSemicolon() {\n return !options.strictSemicolons && (tokType === _eof || tokType === _braceR || newline.test(input.slice(lastEnd, tokStart)));\n }\n\n function semicolon() {\n if (!eat(_semi) && !canInsertSemicolon()) unexpected();\n }\n\n function expect(type) {\n if (tokType === type) next();else unexpected();\n }\n\n function unexpected() {\n raise(tokStart, \"Unexpected token\");\n }\n\n function checkLVal(expr) {\n if (expr.type !== \"Identifier\" && expr.type !== \"MemberExpression\") raise(expr.start, \"Assigning to rvalue\");\n if (strict && expr.type === \"Identifier\" && isStrictBadIdWord(expr.name)) raise(expr.start, \"Assigning to \" + expr.name + \" in strict mode\");\n }\n\n function parseTopLevel(program) {\n lastStart = lastEnd = tokPos;\n if (options.locations) lastEndLoc = new line_loc_t();\n inFunction = strict = null;\n labels = [];\n readToken();\n var node = program || startNode(),\n first = true;\n if (!program) node.body = [];\n\n while (tokType !== _eof) {\n var stmt = parseStatement();\n node.body.push(stmt);\n if (first && isUseStrict(stmt)) setStrict(true);\n first = false;\n }\n\n return finishNode(node, \"Program\");\n }\n\n var loopLabel = {\n kind: \"loop\"\n },\n switchLabel = {\n kind: \"switch\"\n };\n\n function parseStatement() {\n if (tokType === _slash || tokType === _assign && tokVal == \"/=\") readToken(true);\n var starttype = tokType,\n node = startNode();\n\n switch (starttype) {\n case _break:\n case _continue:\n next();\n var isBreak = starttype === _break;\n if (eat(_semi) || canInsertSemicolon()) node.label = null;else if (tokType !== _name) unexpected();else {\n node.label = parseIdent();\n semicolon();\n }\n\n for (var i = 0; i < labels.length; ++i) {\n var lab = labels[i];\n\n if (node.label == null || lab.name === node.label.name) {\n if (lab.kind != null && (isBreak || lab.kind === \"loop\")) break;\n if (node.label && isBreak) break;\n }\n }\n\n if (i === labels.length) raise(node.start, \"Unsyntactic \" + starttype.keyword);\n return finishNode(node, isBreak ? \"BreakStatement\" : \"ContinueStatement\");\n\n case _debugger:\n next();\n semicolon();\n return finishNode(node, \"DebuggerStatement\");\n\n case _do:\n next();\n labels.push(loopLabel);\n node.body = parseStatement();\n labels.pop();\n expect(_while);\n node.test = parseParenExpression();\n semicolon();\n return finishNode(node, \"DoWhileStatement\");\n\n case _for:\n next();\n labels.push(loopLabel);\n expect(_parenL);\n if (tokType === _semi) return parseFor(node, null);\n\n if (tokType === _var) {\n var init = startNode();\n next();\n parseVar(init, true);\n finishNode(init, \"VariableDeclaration\");\n if (init.declarations.length === 1 && eat(_in)) return parseForIn(node, init);\n return parseFor(node, init);\n }\n\n var init = parseExpression(false, true);\n\n if (eat(_in)) {\n checkLVal(init);\n return parseForIn(node, init);\n }\n\n return parseFor(node, init);\n\n case _function:\n next();\n return parseFunction(node, true);\n\n case _if:\n next();\n node.test = parseParenExpression();\n node.consequent = parseStatement();\n node.alternate = eat(_else) ? parseStatement() : null;\n return finishNode(node, \"IfStatement\");\n\n case _return:\n if (!inFunction && !options.allowReturnOutsideFunction) raise(tokStart, \"'return' outside of function\");\n next();\n if (eat(_semi) || canInsertSemicolon()) node.argument = null;else {\n node.argument = parseExpression();\n semicolon();\n }\n return finishNode(node, \"ReturnStatement\");\n\n case _switch:\n next();\n node.discriminant = parseParenExpression();\n node.cases = [];\n expect(_braceL);\n labels.push(switchLabel);\n\n for (var cur, sawDefault; tokType != _braceR;) {\n if (tokType === _case || tokType === _default) {\n var isCase = tokType === _case;\n if (cur) finishNode(cur, \"SwitchCase\");\n node.cases.push(cur = startNode());\n cur.consequent = [];\n next();\n if (isCase) cur.test = parseExpression();else {\n if (sawDefault) raise(lastStart, \"Multiple default clauses\");\n sawDefault = true;\n cur.test = null;\n }\n expect(_colon);\n } else {\n if (!cur) unexpected();\n cur.consequent.push(parseStatement());\n }\n }\n\n if (cur) finishNode(cur, \"SwitchCase\");\n next();\n labels.pop();\n return finishNode(node, \"SwitchStatement\");\n\n case _throw:\n next();\n if (newline.test(input.slice(lastEnd, tokStart))) raise(lastEnd, \"Illegal newline after throw\");\n node.argument = parseExpression();\n semicolon();\n return finishNode(node, \"ThrowStatement\");\n\n case _try:\n next();\n node.block = parseBlock();\n node.handler = null;\n\n if (tokType === _catch) {\n var clause = startNode();\n next();\n expect(_parenL);\n clause.param = parseIdent();\n if (strict && isStrictBadIdWord(clause.param.name)) raise(clause.param.start, \"Binding \" + clause.param.name + \" in strict mode\");\n expect(_parenR);\n clause.guard = null;\n clause.body = parseBlock();\n node.handler = finishNode(clause, \"CatchClause\");\n }\n\n node.guardedHandlers = empty;\n node.finalizer = eat(_finally) ? parseBlock() : null;\n if (!node.handler && !node.finalizer) raise(node.start, \"Missing catch or finally clause\");\n return finishNode(node, \"TryStatement\");\n\n case _var:\n next();\n parseVar(node);\n semicolon();\n return finishNode(node, \"VariableDeclaration\");\n\n case _while:\n next();\n node.test = parseParenExpression();\n labels.push(loopLabel);\n node.body = parseStatement();\n labels.pop();\n return finishNode(node, \"WhileStatement\");\n\n case _with:\n if (strict) raise(tokStart, \"'with' in strict mode\");\n next();\n node.object = parseParenExpression();\n node.body = parseStatement();\n return finishNode(node, \"WithStatement\");\n\n case _braceL:\n return parseBlock();\n\n case _semi:\n next();\n return finishNode(node, \"EmptyStatement\");\n\n default:\n var maybeName = tokVal,\n expr = parseExpression();\n\n if (starttype === _name && expr.type === \"Identifier\" && eat(_colon)) {\n for (var i = 0; i < labels.length; ++i) {\n if (labels[i].name === maybeName) raise(expr.start, \"Label '\" + maybeName + \"' is already declared\");\n }\n\n var kind = tokType.isLoop ? \"loop\" : tokType === _switch ? \"switch\" : null;\n labels.push({\n name: maybeName,\n kind: kind\n });\n node.body = parseStatement();\n labels.pop();\n node.label = expr;\n return finishNode(node, \"LabeledStatement\");\n } else {\n node.expression = expr;\n semicolon();\n return finishNode(node, \"ExpressionStatement\");\n }\n\n }\n }\n\n function parseParenExpression() {\n expect(_parenL);\n var val = parseExpression();\n expect(_parenR);\n return val;\n }\n\n function parseBlock(allowStrict) {\n var node = startNode(),\n first = true,\n strict = false,\n oldStrict;\n node.body = [];\n expect(_braceL);\n\n while (!eat(_braceR)) {\n var stmt = parseStatement();\n node.body.push(stmt);\n\n if (first && allowStrict && isUseStrict(stmt)) {\n oldStrict = strict;\n setStrict(strict = true);\n }\n\n first = false;\n }\n\n if (strict && !oldStrict) setStrict(false);\n return finishNode(node, \"BlockStatement\");\n }\n\n function parseFor(node, init) {\n node.init = init;\n expect(_semi);\n node.test = tokType === _semi ? null : parseExpression();\n expect(_semi);\n node.update = tokType === _parenR ? null : parseExpression();\n expect(_parenR);\n node.body = parseStatement();\n labels.pop();\n return finishNode(node, \"ForStatement\");\n }\n\n function parseForIn(node, init) {\n node.left = init;\n node.right = parseExpression();\n expect(_parenR);\n node.body = parseStatement();\n labels.pop();\n return finishNode(node, \"ForInStatement\");\n }\n\n function parseVar(node, noIn) {\n node.declarations = [];\n node.kind = \"var\";\n\n for (;;) {\n var decl = startNode();\n decl.id = parseIdent();\n if (strict && isStrictBadIdWord(decl.id.name)) raise(decl.id.start, \"Binding \" + decl.id.name + \" in strict mode\");\n decl.init = eat(_eq) ? parseExpression(true, noIn) : null;\n node.declarations.push(finishNode(decl, \"VariableDeclarator\"));\n if (!eat(_comma)) break;\n }\n\n return node;\n }\n\n function parseExpression(noComma, noIn) {\n var expr = parseMaybeAssign(noIn);\n\n if (!noComma && tokType === _comma) {\n var node = startNodeFrom(expr);\n node.expressions = [expr];\n\n while (eat(_comma)) {\n node.expressions.push(parseMaybeAssign(noIn));\n }\n\n return finishNode(node, \"SequenceExpression\");\n }\n\n return expr;\n }\n\n function parseMaybeAssign(noIn) {\n var left = parseMaybeConditional(noIn);\n\n if (tokType.isAssign) {\n var node = startNodeFrom(left);\n node.operator = tokVal;\n node.left = left;\n next();\n node.right = parseMaybeAssign(noIn);\n checkLVal(left);\n return finishNode(node, \"AssignmentExpression\");\n }\n\n return left;\n }\n\n function parseMaybeConditional(noIn) {\n var expr = parseExprOps(noIn);\n\n if (eat(_question)) {\n var node = startNodeFrom(expr);\n node.test = expr;\n node.consequent = parseExpression(true);\n expect(_colon);\n node.alternate = parseExpression(true, noIn);\n return finishNode(node, \"ConditionalExpression\");\n }\n\n return expr;\n }\n\n function parseExprOps(noIn) {\n return parseExprOp(parseMaybeUnary(), -1, noIn);\n }\n\n function parseExprOp(left, minPrec, noIn) {\n var prec = tokType.binop;\n\n if (prec != null && (!noIn || tokType !== _in)) {\n if (prec > minPrec) {\n var node = startNodeFrom(left);\n node.left = left;\n node.operator = tokVal;\n var op = tokType;\n next();\n node.right = parseExprOp(parseMaybeUnary(), prec, noIn);\n var exprNode = finishNode(node, op === _logicalOR || op === _logicalAND ? \"LogicalExpression\" : \"BinaryExpression\");\n return parseExprOp(exprNode, minPrec, noIn);\n }\n }\n\n return left;\n }\n\n function parseMaybeUnary() {\n if (tokType.prefix) {\n var node = startNode(),\n update = tokType.isUpdate;\n node.operator = tokVal;\n node.prefix = true;\n tokRegexpAllowed = true;\n next();\n node.argument = parseMaybeUnary();\n if (update) checkLVal(node.argument);else if (strict && node.operator === \"delete\" && node.argument.type === \"Identifier\") raise(node.start, \"Deleting local variable in strict mode\");\n return finishNode(node, update ? \"UpdateExpression\" : \"UnaryExpression\");\n }\n\n var expr = parseExprSubscripts();\n\n while (tokType.postfix && !canInsertSemicolon()) {\n var node = startNodeFrom(expr);\n node.operator = tokVal;\n node.prefix = false;\n node.argument = expr;\n checkLVal(expr);\n next();\n expr = finishNode(node, \"UpdateExpression\");\n }\n\n return expr;\n }\n\n function parseExprSubscripts() {\n return parseSubscripts(parseExprAtom());\n }\n\n function parseSubscripts(base, noCalls) {\n if (eat(_dot)) {\n var node = startNodeFrom(base);\n node.object = base;\n node.property = parseIdent(true);\n node.computed = false;\n return parseSubscripts(finishNode(node, \"MemberExpression\"), noCalls);\n } else if (eat(_bracketL)) {\n var node = startNodeFrom(base);\n node.object = base;\n node.property = parseExpression();\n node.computed = true;\n expect(_bracketR);\n return parseSubscripts(finishNode(node, \"MemberExpression\"), noCalls);\n } else if (!noCalls && eat(_parenL)) {\n var node = startNodeFrom(base);\n node.callee = base;\n node.arguments = parseExprList(_parenR, false);\n return parseSubscripts(finishNode(node, \"CallExpression\"), noCalls);\n } else return base;\n }\n\n function parseExprAtom() {\n switch (tokType) {\n case _this:\n var node = startNode();\n next();\n return finishNode(node, \"ThisExpression\");\n\n case _name:\n return parseIdent();\n\n case _num:\n case _string:\n case _regexp:\n var node = startNode();\n node.value = tokVal;\n node.raw = input.slice(tokStart, tokEnd);\n next();\n return finishNode(node, \"Literal\");\n\n case _null:\n case _true:\n case _false:\n var node = startNode();\n node.value = tokType.atomValue;\n node.raw = tokType.keyword;\n next();\n return finishNode(node, \"Literal\");\n\n case _parenL:\n var tokStartLoc1 = tokStartLoc,\n tokStart1 = tokStart;\n next();\n var val = parseExpression();\n val.start = tokStart1;\n val.end = tokEnd;\n\n if (options.locations) {\n val.loc.start = tokStartLoc1;\n val.loc.end = tokEndLoc;\n }\n\n if (options.ranges) val.range = [tokStart1, tokEnd];\n expect(_parenR);\n return val;\n\n case _bracketL:\n var node = startNode();\n next();\n node.elements = parseExprList(_bracketR, true, true);\n return finishNode(node, \"ArrayExpression\");\n\n case _braceL:\n return parseObj();\n\n case _function:\n var node = startNode();\n next();\n return parseFunction(node, false);\n\n case _new:\n return parseNew();\n\n default:\n unexpected();\n }\n }\n\n function parseNew() {\n var node = startNode();\n next();\n node.callee = parseSubscripts(parseExprAtom(), true);\n if (eat(_parenL)) node.arguments = parseExprList(_parenR, false);else node.arguments = empty;\n return finishNode(node, \"NewExpression\");\n }\n\n function parseObj() {\n var node = startNode(),\n first = true,\n sawGetSet = false;\n node.properties = [];\n next();\n\n while (!eat(_braceR)) {\n if (!first) {\n expect(_comma);\n if (options.allowTrailingCommas && eat(_braceR)) break;\n } else first = false;\n\n var prop = {\n key: parsePropertyName()\n },\n isGetSet = false,\n kind;\n\n if (eat(_colon)) {\n prop.value = parseExpression(true);\n kind = prop.kind = \"init\";\n } else if (options.ecmaVersion >= 5 && prop.key.type === \"Identifier\" && (prop.key.name === \"get\" || prop.key.name === \"set\")) {\n isGetSet = sawGetSet = true;\n kind = prop.kind = prop.key.name;\n prop.key = parsePropertyName();\n if (tokType !== _parenL) unexpected();\n prop.value = parseFunction(startNode(), false);\n } else unexpected();\n\n if (prop.key.type === \"Identifier\" && (strict || sawGetSet)) {\n for (var i = 0; i < node.properties.length; ++i) {\n var other = node.properties[i];\n\n if (other.key.name === prop.key.name) {\n var conflict = kind == other.kind || isGetSet && other.kind === \"init\" || kind === \"init\" && (other.kind === \"get\" || other.kind === \"set\");\n if (conflict && !strict && kind === \"init\" && other.kind === \"init\") conflict = false;\n if (conflict) raise(prop.key.start, \"Redefinition of property\");\n }\n }\n }\n\n node.properties.push(prop);\n }\n\n return finishNode(node, \"ObjectExpression\");\n }\n\n function parsePropertyName() {\n if (tokType === _num || tokType === _string) return parseExprAtom();\n return parseIdent(true);\n }\n\n function parseFunction(node, isStatement) {\n if (tokType === _name) node.id = parseIdent();else if (isStatement) unexpected();else node.id = null;\n node.params = [];\n var first = true;\n expect(_parenL);\n\n while (!eat(_parenR)) {\n if (!first) expect(_comma);else first = false;\n node.params.push(parseIdent());\n }\n\n var oldInFunc = inFunction,\n oldLabels = labels;\n inFunction = true;\n labels = [];\n node.body = parseBlock(true);\n inFunction = oldInFunc;\n labels = oldLabels;\n\n if (strict || node.body.body.length && isUseStrict(node.body.body[0])) {\n for (var i = node.id ? -1 : 0; i < node.params.length; ++i) {\n var id = i < 0 ? node.id : node.params[i];\n if (isStrictReservedWord(id.name) || isStrictBadIdWord(id.name)) raise(id.start, \"Defining '\" + id.name + \"' in strict mode\");\n if (i >= 0) for (var j = 0; j < i; ++j) {\n if (id.name === node.params[j].name) raise(id.start, \"Argument name clash in strict mode\");\n }\n }\n }\n\n return finishNode(node, isStatement ? \"FunctionDeclaration\" : \"FunctionExpression\");\n }\n\n function parseExprList(close, allowTrailingComma, allowEmpty) {\n var elts = [],\n first = true;\n\n while (!eat(close)) {\n if (!first) {\n expect(_comma);\n if (allowTrailingComma && options.allowTrailingCommas && eat(close)) break;\n } else first = false;\n\n if (allowEmpty && tokType === _comma) elts.push(null);else elts.push(parseExpression(true));\n }\n\n return elts;\n }\n\n function parseIdent(liberal) {\n var node = startNode();\n if (liberal && options.forbidReserved == \"everywhere\") liberal = false;\n\n if (tokType === _name) {\n if (!liberal && (options.forbidReserved && (options.ecmaVersion === 3 ? isReservedWord3 : isReservedWord5)(tokVal) || strict && isStrictReservedWord(tokVal)) && input.slice(tokStart, tokEnd).indexOf(\"\\\\\") == -1) raise(tokStart, \"The keyword '\" + tokVal + \"' is reserved\");\n node.name = tokVal;\n } else if (liberal && tokType.keyword) {\n node.name = tokType.keyword;\n } else {\n unexpected();\n }\n\n tokRegexpAllowed = false;\n next();\n return finishNode(node, \"Identifier\");\n }\n });\n\n if (!acorn.version) acorn = null;\n }\n\n function parse(code, options) {\n return (global.acorn || acorn).parse(code, options);\n }\n\n var binaryOperators = {\n '+': '__add',\n '-': '__subtract',\n '*': '__multiply',\n '/': '__divide',\n '%': '__modulo',\n '==': '__equals',\n '!=': '__equals'\n };\n var unaryOperators = {\n '-': '__negate',\n '+': '__self'\n };\n var fields = Base.each(['add', 'subtract', 'multiply', 'divide', 'modulo', 'equals', 'negate'], function (name) {\n this['__' + name] = '#' + name;\n }, {\n __self: function __self() {\n return this;\n }\n });\n Point.inject(fields);\n Size.inject(fields);\n Color.inject(fields);\n\n function __$__(left, operator, right) {\n var handler = binaryOperators[operator];\n\n if (left && left[handler]) {\n var res = left[handler](right);\n return operator === '!=' ? !res : res;\n }\n\n switch (operator) {\n case '+':\n return left + right;\n\n case '-':\n return left - right;\n\n case '*':\n return left * right;\n\n case '/':\n return left / right;\n\n case '%':\n return left % right;\n\n case '==':\n return left == right;\n\n case '!=':\n return left != right;\n }\n }\n\n function $__(operator, value) {\n var handler = unaryOperators[operator];\n if (value && value[handler]) return value[handler]();\n\n switch (operator) {\n case '+':\n return +value;\n\n case '-':\n return -value;\n }\n }\n\n function compile(code, options) {\n if (!code) return '';\n options = options || {};\n var insertions = [];\n\n function getOffset(offset) {\n for (var i = 0, l = insertions.length; i < l; i++) {\n var insertion = insertions[i];\n if (insertion[0] >= offset) break;\n offset += insertion[1];\n }\n\n return offset;\n }\n\n function getCode(node) {\n return code.substring(getOffset(node.range[0]), getOffset(node.range[1]));\n }\n\n function getBetween(left, right) {\n return code.substring(getOffset(left.range[1]), getOffset(right.range[0]));\n }\n\n function replaceCode(node, str) {\n var start = getOffset(node.range[0]),\n end = getOffset(node.range[1]),\n insert = 0;\n\n for (var i = insertions.length - 1; i >= 0; i--) {\n if (start > insertions[i][0]) {\n insert = i + 1;\n break;\n }\n }\n\n insertions.splice(insert, 0, [start, str.length - end + start]);\n code = code.substring(0, start) + str + code.substring(end);\n }\n\n function handleOverloading(node, parent) {\n switch (node.type) {\n case 'UnaryExpression':\n if (node.operator in unaryOperators && node.argument.type !== 'Literal') {\n var arg = getCode(node.argument);\n replaceCode(node, '$__(\"' + node.operator + '\", ' + arg + ')');\n }\n\n break;\n\n case 'BinaryExpression':\n if (node.operator in binaryOperators && node.left.type !== 'Literal') {\n var left = getCode(node.left),\n right = getCode(node.right),\n between = getBetween(node.left, node.right),\n operator = node.operator;\n replaceCode(node, '__$__(' + left + ',' + between.replace(new RegExp('\\\\' + operator), '\"' + operator + '\"') + ', ' + right + ')');\n }\n\n break;\n\n case 'UpdateExpression':\n case 'AssignmentExpression':\n var parentType = parent && parent.type;\n\n if (!(parentType === 'ForStatement' || parentType === 'BinaryExpression' && /^[=!<>]/.test(parent.operator) || parentType === 'MemberExpression' && parent.computed)) {\n if (node.type === 'UpdateExpression') {\n var arg = getCode(node.argument),\n exp = '__$__(' + arg + ', \"' + node.operator[0] + '\", 1)',\n str = arg + ' = ' + exp;\n\n if (node.prefix) {\n str = '(' + str + ')';\n } else if (parentType === 'AssignmentExpression' || parentType === 'VariableDeclarator' || parentType === 'BinaryExpression') {\n if (getCode(parent.left || parent.id) === arg) str = exp;\n str = arg + '; ' + str;\n }\n\n replaceCode(node, str);\n } else {\n if (/^.=$/.test(node.operator) && node.left.type !== 'Literal') {\n var left = getCode(node.left),\n right = getCode(node.right),\n exp = left + ' = __$__(' + left + ', \"' + node.operator[0] + '\", ' + right + ')';\n replaceCode(node, /^\\(.*\\)$/.test(getCode(node)) ? '(' + exp + ')' : exp);\n }\n }\n }\n\n break;\n }\n }\n\n function handleExports(node) {\n switch (node.type) {\n case 'ExportDefaultDeclaration':\n replaceCode({\n range: [node.start, node.declaration.start]\n }, 'module.exports = ');\n break;\n\n case 'ExportNamedDeclaration':\n var declaration = node.declaration;\n var specifiers = node.specifiers;\n\n if (declaration) {\n var declarations = declaration.declarations;\n\n if (declarations) {\n declarations.forEach(function (dec) {\n replaceCode(dec, 'module.exports.' + getCode(dec));\n });\n replaceCode({\n range: [node.start, declaration.start + declaration.kind.length]\n }, '');\n }\n } else if (specifiers) {\n var exports = specifiers.map(function (specifier) {\n var name = getCode(specifier);\n return 'module.exports.' + name + ' = ' + name + '; ';\n }).join('');\n\n if (exports) {\n replaceCode(node, exports);\n }\n }\n\n break;\n }\n }\n\n function walkAST(node, parent, paperFeatures) {\n if (node) {\n for (var key in node) {\n if (key !== 'range' && key !== 'loc') {\n var value = node[key];\n\n if (Array.isArray(value)) {\n for (var i = 0, l = value.length; i < l; i++) {\n walkAST(value[i], node, paperFeatures);\n }\n } else if (value && typeof value === 'object') {\n walkAST(value, node, paperFeatures);\n }\n }\n }\n\n if (paperFeatures.operatorOverloading !== false) {\n handleOverloading(node, parent);\n }\n\n if (paperFeatures.moduleExports !== false) {\n handleExports(node);\n }\n }\n }\n\n function encodeVLQ(value) {\n var res = '',\n base64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n value = (Math.abs(value) << 1) + (value < 0 ? 1 : 0);\n\n while (value || !res) {\n var next = value & 32 - 1;\n value >>= 5;\n if (value) next |= 32;\n res += base64[next];\n }\n\n return res;\n }\n\n var url = options.url || '',\n sourceMaps = options.sourceMaps,\n paperFeatures = options.paperFeatures || {},\n source = options.source || code,\n offset = options.offset || 0,\n agent = paper.agent,\n version = agent.versionNumber,\n offsetCode = false,\n lineBreaks = /\\r\\n|\\n|\\r/mg,\n map;\n\n if (sourceMaps && (agent.chrome && version >= 30 || agent.webkit && version >= 537.76 || agent.firefox && version >= 23 || agent.node)) {\n if (agent.node) {\n offset -= 2;\n } else if (window && url && !window.location.href.indexOf(url)) {\n var html = document.getElementsByTagName('html')[0].innerHTML;\n offset = html.substr(0, html.indexOf(code) + 1).match(lineBreaks).length + 1;\n }\n\n offsetCode = offset > 0 && !(agent.chrome && version >= 36 || agent.safari && version >= 600 || agent.firefox && version >= 40 || agent.node);\n var mappings = ['AA' + encodeVLQ(offsetCode ? 0 : offset) + 'A'];\n mappings.length = (code.match(lineBreaks) || []).length + 1 + (offsetCode ? offset : 0);\n map = {\n version: 3,\n file: url,\n names: [],\n mappings: mappings.join(';AACA'),\n sourceRoot: '',\n sources: [url],\n sourcesContent: [source]\n };\n }\n\n if (paperFeatures.operatorOverloading !== false || paperFeatures.moduleExports !== false) {\n walkAST(parse(code, {\n ranges: true,\n preserveParens: true,\n sourceType: 'module'\n }), null, paperFeatures);\n }\n\n if (map) {\n if (offsetCode) {\n code = new Array(offset + 1).join('\\n') + code;\n }\n\n if (/^(inline|both)$/.test(sourceMaps)) {\n code += \"\\n//# sourceMappingURL=data:application/json;base64,\" + self.btoa(unescape(encodeURIComponent(JSON.stringify(map))));\n }\n\n code += \"\\n//# sourceURL=\" + (url || 'paperscript');\n }\n\n return {\n url: url,\n source: source,\n code: code,\n map: map\n };\n }\n\n function execute(code, scope, options) {\n paper = scope;\n var view = scope.getView(),\n tool = /\\btool\\.\\w+|\\s+on(?:Key|Mouse)(?:Up|Down|Move|Drag)\\b/.test(code) && !/\\bnew\\s+Tool\\b/.test(code) ? new Tool() : null,\n toolHandlers = tool ? tool._events : [],\n handlers = ['onFrame', 'onResize'].concat(toolHandlers),\n params = [],\n args = [],\n func,\n compiled = typeof code === 'object' ? code : compile(code, options);\n code = compiled.code;\n\n function expose(scope, hidden) {\n for (var key in scope) {\n if ((hidden || !/^_/.test(key)) && new RegExp('([\\\\b\\\\s\\\\W]|^)' + key.replace(/\\$/g, '\\\\$') + '\\\\b').test(code)) {\n params.push(key);\n args.push(scope[key]);\n }\n }\n }\n\n expose({\n __$__: __$__,\n $__: $__,\n paper: scope,\n tool: tool\n }, true);\n expose(scope);\n code = 'var module = { exports: {} }; ' + code;\n var exports = Base.each(handlers, function (key) {\n if (new RegExp('\\\\s+' + key + '\\\\b').test(code)) {\n params.push(key);\n this.push('module.exports.' + key + ' = ' + key + ';');\n }\n }, []).join('\\n');\n\n if (exports) {\n code += '\\n' + exports;\n }\n\n code += '\\nreturn module.exports;';\n var agent = paper.agent;\n\n if (document && (agent.chrome || agent.firefox && agent.versionNumber < 40)) {\n var script = document.createElement('script'),\n head = document.head || document.getElementsByTagName('head')[0];\n if (agent.firefox) code = '\\n' + code;\n script.appendChild(document.createTextNode('document.__paperscript__ = function(' + params + ') {' + code + '\\n}'));\n head.appendChild(script);\n func = document.__paperscript__;\n delete document.__paperscript__;\n head.removeChild(script);\n } else {\n func = Function(params, code);\n }\n\n var exports = func && func.apply(scope, args);\n var obj = exports || {};\n Base.each(toolHandlers, function (key) {\n var value = obj[key];\n if (value) tool[key] = value;\n });\n\n if (view) {\n if (obj.onResize) view.setOnResize(obj.onResize);\n view.emit('resize', {\n size: view.size,\n delta: new Point()\n });\n if (obj.onFrame) view.setOnFrame(obj.onFrame);\n view.requestUpdate();\n }\n\n return exports;\n }\n\n function loadScript(script) {\n if (/^text\\/(?:x-|)paperscript$/.test(script.type) && PaperScope.getAttribute(script, 'ignore') !== 'true') {\n var canvasId = PaperScope.getAttribute(script, 'canvas'),\n canvas = document.getElementById(canvasId),\n src = script.src || script.getAttribute('data-src'),\n async = PaperScope.hasAttribute(script, 'async'),\n scopeAttribute = 'data-paper-scope';\n if (!canvas) throw new Error('Unable to find canvas with id \"' + canvasId + '\"');\n var scope = PaperScope.get(canvas.getAttribute(scopeAttribute)) || new PaperScope().setup(canvas);\n canvas.setAttribute(scopeAttribute, scope._id);\n\n if (src) {\n Http.request({\n url: src,\n async: async,\n mimeType: 'text/plain',\n onLoad: function onLoad(code) {\n execute(code, scope, src);\n }\n });\n } else {\n execute(script.innerHTML, scope, script.baseURI);\n }\n\n script.setAttribute('data-paper-ignore', 'true');\n return scope;\n }\n }\n\n function loadAll() {\n Base.each(document && document.getElementsByTagName('script'), loadScript);\n }\n\n function load(script) {\n return script ? loadScript(script) : loadAll();\n }\n\n if (window) {\n if (document.readyState === 'complete') {\n setTimeout(loadAll);\n } else {\n DomEvent.add(window, {\n load: loadAll\n });\n }\n }\n\n return {\n compile: compile,\n execute: execute,\n load: load,\n parse: parse,\n calculateBinary: __$__,\n calculateUnary: $__\n };\n }.call(this);\n\n var paper = new (PaperScope.inject(Base.exports, {\n Base: Base,\n Numerical: Numerical,\n Key: Key,\n DomEvent: DomEvent,\n DomElement: DomElement,\n document: document,\n window: window,\n Symbol: SymbolDefinition,\n PlacedSymbol: SymbolItem\n }))();\n\n if (paper.agent.node) {\n require('./node/extend.js')(paper);\n }\n\n if (typeof define === 'function' && define.amd) {\n define('paper', paper);\n } else if (typeof module === 'object' && module) {\n module.exports = paper;\n }\n\n return paper;\n}.call(this, typeof self === 'object' ? self : null);"],"sourceRoot":""}