From 95fabe9160d3c95ed25edfb4de04c89cc4b6edce Mon Sep 17 00:00:00 2001 From: Eric Rowell Date: Sun, 1 Apr 2012 01:08:33 -0700 Subject: [PATCH] finished pixel detection algo which can be applied to any Shape. This enables a lot of new functionality, such as image pixel detection, shape border detection, and custom shape detection that isn't drawn with a standard path --- dist/kinetic-core.js | 43 +++++++++++++++++----- dist/kinetic-core.min.js | 2 +- src/Shape.js | 37 ++++++++++++++++--- src/Stage.js | 6 ++-- tests/js/functionalTests.js | 69 ++++++++++++++++++++++++++++++++++++ tests/lion.png | Bin 0 -> 19826 bytes 6 files changed, 140 insertions(+), 17 deletions(-) create mode 100644 tests/lion.png diff --git a/dist/kinetic-core.js b/dist/kinetic-core.js index a4c09470..d28be072 100644 --- a/dist/kinetic-core.js +++ b/dist/kinetic-core.js @@ -1280,7 +1280,7 @@ Kinetic.Stage.prototype = { this.targetFound = true; } - if(shape.visible && pos !== undefined && shape._isPointInPath(pos)) { + if(shape.visible && pos !== undefined && shape._isPointInShape(pos)) { // handle onmousedown if(!isDragging && this.mouseDown) { this.mouseDown = false; @@ -1482,8 +1482,8 @@ Kinetic.Stage.prototype = { * clear default layers */ _clearDefaultLayers: function() { - var pathLayer = this.pathLayer; - pathLayer.clear(); + this.bufferLayer.clear(); + this.pathLayer.clear(); }, /** * begin listening for events by adding event handlers @@ -1902,6 +1902,8 @@ Kinetic.GlobalObject.extend(Kinetic.Group, Kinetic.Node); * @config {Number} [strokeWidth] stroke width * @config {String} [lineJoin] line join. Can be "miter", "round", or "bevel". The default * is "miter" + * @config {String} [detectionType] shape detection type. Can be "path" or "pixel". + * The default is "path" because it performs better */ Kinetic.Shape = function(config) { this.className = 'Shape'; @@ -1916,6 +1918,10 @@ Kinetic.Shape = function(config) { } } + if(config.detectionType === undefined) { + config.detectionType = 'path'; + } + // required this.drawFunc = config.drawFunc; @@ -2066,12 +2072,33 @@ Kinetic.Shape.prototype = { * custom isPointInPath method which can use path detection * or pixel detection */ - _isPointInPath: function(pos) { + _isPointInShape: function(pos) { var stage = this.getStage(); - var pathLayer = stage.pathLayer; - var pathLayerContext = pathLayer.getContext(); - this._draw(pathLayer); - return pathLayerContext.isPointInPath(pos.x, pos.y); + + if(this.detectionType === 'path') { + var pathLayer = stage.pathLayer; + var pathLayerContext = pathLayer.getContext(); + + this._draw(pathLayer); + + return pathLayerContext.isPointInPath(pos.x, pos.y); + } + else { + var bufferLayer = stage.bufferLayer; + var bufferLayerContext = bufferLayer.getContext(); + + this._draw(bufferLayer); + + var w = stage.width; + var h = stage.height; + var x = pos.x; + var y = pos.y; + var imageData = bufferLayerContext.getImageData(0, 0, w, h); + var data = imageData.data; + var alpha = data[((w * y) + x) * 4 + 3]; + + return (alpha !== undefined && alpha !== 0); + } } }; // extend Node diff --git a/dist/kinetic-core.min.js b/dist/kinetic-core.min.js index 025107ca..15b22673 100644 --- a/dist/kinetic-core.min.js +++ b/dist/kinetic-core.min.js @@ -25,4 +25,4 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -var Kinetic={};Kinetic.GlobalObject={stages:[],idCounter:0,frame:{time:0,timeDiff:0,lastTime:0},drag:{moving:!1,node:undefined,offset:{x:0,y:0}},extend:function(a,b){for(var c in b.prototype)b.prototype.hasOwnProperty(c)&&a.prototype[c]===undefined&&(a.prototype[c]=b.prototype[c])},_isaCanvasAnimating:function(){for(var a=0;a0)return!0}}return this.frame.lastTime=0,!1},_endTransition:function(){var a=this.config;for(var b in a)if(a.hasOwnProperty(b))if(a[b].x!==undefined||a[b].y!==undefined){var c=["x","y"];for(var d=0;d=h.config.duration*1e3?(this._endTransition.apply(h),this._clearTransition(h.node),h.config.callback!==undefined&&h.config.callback()):this._runTransition(h)}f&&e.draw()}}},_updateFrameObject:function(){var a=new Date,b=a.getTime();this.frame.lastTime===0?this.frame.lastTime=b:(this.frame.timeDiff=b-this.frame.lastTime,this.frame.lastTime=b,this.frame.time+=this.frame.timeDiff)},_animationLoop:function(){if(this._isaCanvasAnimating()){this._updateFrameObject(),this._runFrames();var a=this;requestAnimFrame(function(){a._animationLoop()})}},_handleAnimation:function(){var a=this;this._isaCanvasAnimating()&&a._animationLoop()}},window.requestAnimFrame=function(a){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),Kinetic.Node=function(a){this.visible=!0,this.isListening=!0,this.name=undefined,this.alpha=1,this.x=0,this.y=0,this.scale={x:1,y:1},this.rotation=0,this.centerOffset={x:0,y:0},this.eventListeners={},this.dragConstraint="none",this.dragBounds={},this._draggable=!1;if(a)for(var b in a)switch(b){case"draggable":this.draggable(a[b]);break;case"listen":this.listen(a[b]);break;case"rotationDeg":this.rotation=a[b]*Math.PI/180;break;default:this[b]=a[b]}this.centerOffset.x===undefined&&(this.centerOffset.x=0),this.centerOffset.y===undefined&&(this.centerOffset.y=0)},Kinetic.Node.prototype={on:function(a,b){var c=a.split(" ");for(var d=0;d1?g[1]:"";this.eventListeners[h]||(this.eventListeners[h]=[]),this.eventListeners[h].push({name:i,handler:b})}},off:function(a){var b=a.split(" ");for(var c=0;c1){var h=f[1];for(var i=0;i0&&f[0].getLevel()<=a&&e(f)}var a=this.getLevel(),b=this.getStage(),c=this,d=0;return c.className!=="Stage"&&e(c.getStage().getChildren()),d},getLevel:function(){var a=0,b=this.parent;while(b)a++,b=b.parent;return a},setScale:function(a,b){b?(this.scale.x=a,this.scale.y=b):(this.scale.x=a,this.scale.y=a)},getScale:function(){return this.scale},setPosition:function(a,b){this.x=a,this.y=b},getPosition:function(){return{x:this.x,y:this.y}},getAbsolutePosition:function(){return this.getAbsoluteTransform().getTranslation()},move:function(a,b){this.x+=a,this.y+=b},setRotation:function(a){this.rotation=a},setRotationDeg:function(a){this.rotation=a*Math.PI/180},getRotation:function(){return this.rotation},getRotationDeg:function(){return this.rotation*180/Math.PI},rotate:function(a){this.rotation+=a},rotateDeg:function(a){this.rotation+=a*Math.PI/180},listen:function(a){this.isListening=a},moveToTop:function(){var a=this.index;this.parent.children.splice(a,1),this.parent.children.push(this),this.parent._setChildrenIndices()},moveUp:function(){var a=this.index;this.parent.children.splice(a,1),this.parent.children.splice(a+1,0,this),this.parent._setChildrenIndices()},moveDown:function(){var a=this.index;a>0&&(this.parent.children.splice(a,1),this.parent.children.splice(a-1,0,this),this.parent._setChildrenIndices())},moveToBottom:function(){var a=this.index;this.parent.children.splice(a,1),this.parent.children.unshift(this),this.parent._setChildrenIndices()},setZIndex:function(a){var b=this.index;this.parent.children.splice(b,1),this.parent.children.splice(a,0,this),this.parent._setChildrenIndices()},setAlpha:function(a){this.alpha=a},getAlpha:function(){return this.alpha},getAbsoluteAlpha:function(){var a=1,b=this;while(b.className!=="Stage")a*=b.alpha,b=b.parent;return a},draggable:function(a){this.draggable!==a&&(a?this._initDrag():this._dragCleanup(),this._draggable=a)},isDragging:function(){var a=Kinetic.GlobalObject;return a.drag.node!==undefined&&a.drag.node.id===this.id&&a.drag.moving},moveTo:function(a){var b=this.parent;b.children.splice(this.index,1),b._setChildrenIndices(),a.children.push(this),this.index=a.children.length-1,this.parent=a,a._setChildrenIndices(),this.name&&(b.childrenNames[this.name]=undefined,a.childrenNames[this.name]=this)},getParent:function(){return this.parent},getLayer:function(){return this.className==="Layer"?this:this.getParent().getLayer()},getStage:function(){return this.className==="Stage"?this:this.getParent().getStage()},getName:function(){return this.name},setCenterOffset:function(a,b){this.centerOffset.x=a,this.centerOffset.y=b},getCenterOffset:function(){return this.centerOffset},transitionTo:function(a){var b=this.getLayer(),c=this,d=a.duration*1e3,e={};Kinetic.GlobalObject._clearTransition(this);for(var f in a)if(a.hasOwnProperty(f)&&f!=="duration"&&f!=="easing"&&f!=="callback")if(a[f].x!==undefined||a[f].y!==undefined){e[f]={};var g=["x","y"];for(var h=0;h0)this.remove(this.children[0])},_remove:function(a){a.name!==undefined&&(this.childrenNames[a.name]=undefined),this.children.splice(a.index,1),this._setChildrenIndices(),a=undefined},_drawChildren:function(){var a=this.children;for(var b=0;b=0;d--){var e=c[d];if(e.isListening)if(e.className==="Shape"){var f=this._detectEvent(e,b);if(f)return!0}else{var f=this._traverseChildren(e,b);if(f)return!0}}return!1},_handleStageEvent:function(a){var b=Kinetic.GlobalObject;a||(a=window.event),this._setMousePosition(a),this._setTouchPosition(a),this._clearDefaultLayers(),this.targetFound=!1;var c=!1;for(var d=this.children.length-1;d>=0;d--){var e=this.children[d];e.visible&&d>=0&&e.isListening&&this._traverseChildren(e,a)&&(d=-1,c=!0)}!c&&this.mouseoutShape&&(this.mouseoutShape._handleEvents("onmouseout",a),this.mouseoutShape=undefined)},_clearDefaultLayers:function(){var a=this.pathLayer;a.clear()},_listen:function(){var a=this;this.container.addEventListener("mousedown",function(b){a.mouseDown=!0,a._handleStageEvent(b)},!1),this.container.addEventListener("mousemove",function(b){a.mouseUp=!1,a.mouseDown=!1,a._handleStageEvent(b)},!1),this.container.addEventListener("mouseup",function(b){a.mouseUp=!0,a.mouseDown=!1,a._handleStageEvent(b),a.clickStart=!1},!1),this.container.addEventListener("mouseover",function(b){a._handleStageEvent(b)},!1),this.container.addEventListener("mouseout",function(b){a.mousePos=undefined},!1),this.container.addEventListener("touchstart",function(b){b.preventDefault(),a.touchStart=!0,a._handleStageEvent(b)},!1),this.container.addEventListener("touchmove",function(b){b.preventDefault(),a._handleStageEvent(b)},!1),this.container.addEventListener("touchend",function(b){b.preventDefault(),a.touchEnd=!0,a._handleStageEvent(b)},!1)},_setMousePosition:function(a){var b=a.offsetX||a.clientX-this._getContainerPosition().left+window.pageXOffset,c=a.offsetY||a.clientY-this._getContainerPosition().top+window.pageYOffset;this.mousePos={x:b,y:c}},_setTouchPosition:function(a){if(a.touches!==undefined&&a.touches.length===1){var b=a.touches[0],c=b.clientX-this._getContainerPosition().left+window.pageXOffset,d=b.clientY-this._getContainerPosition().top+window.pageYOffset;this.touchPos={x:c,y:d}}},_getContainerPosition:function(){var a=this.container,b=0,c=0;while(a&&a.tagName!=="BODY")b+=a.offsetTop-a.scrollTop,c+=a.offsetLeft-a.scrollLeft,a=a.offsetParent;return{top:b,left:c}},_modifyPathContext:function(a){a.stroke=function(){},a.fill=function(){},a.fillRect=function(a,b,c,d){layer.context.rect(a,b,c,d)},a.strokeRect=function(a,b,c,d){layer.context.rect(a,b,c,d)},a.drawImage=function(){},a.fillText=function(){},a.strokeText=function(){}},_endDrag:function(a){var b=Kinetic.GlobalObject;b.drag.node&&b.drag.moving&&(b.drag.moving=!1,b.drag.node._handleEvents("ondragend",a)),b.drag.node=undefined},_prepareDrag:function(){var a=this;this.onContainer("mousemove touchmove",function(b){var c=Kinetic.GlobalObject,d=c.drag.node;if(d){var e=a.getUserPosition(),f=d.dragConstraint,g=d.dragBounds,h={x:e.x-c.drag.offset.x,y:e.y-c.drag.offset.y};g.left!==undefined&&h.xg.right&&(h.x=g.right),g.top!==undefined&&h.yg.bottom&&(h.y=g.bottom),f==="horizontal"?h.y=d.y:f==="vertical"&&(h.x=d.x);var i=d.rotation,j={x:d.scale.x,y:d.scale.y};d.rotation=0,d.scale={x:1,y:1};var k=d.getAbsoluteTransform();k.invert(),k.translate(h.x,h.y),d.x+=k.getTranslation().x,d.y+=k.getTranslation().y,d.rotate(i),d.scale={x:j.x,y:j.y},c.drag.node.getLayer().draw(),c.drag.moving||(c.drag.moving=!0,c.drag.node._handleEvents("ondragstart",b)),c.drag.node._handleEvents("ondragmove",b)}},!1),this.onContainer("mouseup touchend mouseout",function(b){a._endDrag(b)})},_buildDOM:function(){this.content.style.width=this.width+"px",this.content.style.height=this.height+"px",this.content.style.position="relative",this.content.style.display="inline-block",this.content.className="kineticjs-content",this.container.appendChild(this.content),this.bufferLayer=new Kinetic.Layer,this.pathLayer=new Kinetic.Layer,this.bufferLayer.parent=this,this.pathLayer.parent=this,this._modifyPathContext(this.pathLayer.context),this.bufferLayer.getCanvas().style.display="none",this.pathLayer.getCanvas().style.display="none",this.bufferLayer.canvas.width=this.width,this.bufferLayer.canvas.height=this.height,this.bufferLayer.canvas.className="kineticjs-buffer-layer",this.content.appendChild(this.bufferLayer.canvas),this.pathLayer.canvas.width=this.width,this.pathLayer.canvas.height=this.height,this.pathLayer.canvas.className="kineticjs-path-layer",this.content.appendChild(this.pathLayer.canvas)}},Kinetic.GlobalObject.extend(Kinetic.Stage,Kinetic.Container),Kinetic.GlobalObject.extend(Kinetic.Stage,Kinetic.Node),Kinetic.Layer=function(a){this.className="Layer",this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.canvas.style.position="absolute",this.transitions=[],this.transitionIdCounter=0,Kinetic.Container.apply(this,[]),Kinetic.Node.apply(this,[a])},Kinetic.Layer.prototype={draw:function(){this._draw()},clear:function(){var a=this.getContext(),b=this.getCanvas();a.clearRect(0,0,b.width,b.height)},getCanvas:function(){return this.canvas},getContext:function(){return this.context},add:function(a){this._add(a)},remove:function(a){this._remove(a)},_draw:function(){this.clear(),this.visible&&this._drawChildren()}},Kinetic.GlobalObject.extend(Kinetic.Layer,Kinetic.Container),Kinetic.GlobalObject.extend(Kinetic.Layer,Kinetic.Node),Kinetic.Group=function(a){this.className="Group",Kinetic.Container.apply(this,[]),Kinetic.Node.apply(this,[a])},Kinetic.Group.prototype={add:function(a){this._add(a)},remove:function(a){this._remove(a)},_draw:function(){this.visible&&this._drawChildren()}},Kinetic.GlobalObject.extend(Kinetic.Group,Kinetic.Container),Kinetic.GlobalObject.extend(Kinetic.Group,Kinetic.Node),Kinetic.Shape=function(a){this.className="Shape";if(a.stroke!==undefined||a.strokeWidth!==undefined)a.stroke===undefined?a.stroke="black":a.strokeWidth===undefined&&(a.strokeWidth=2);this.drawFunc=a.drawFunc,Kinetic.Node.apply(this,[a])},Kinetic.Shape.prototype={getContext:function(){return this.tempLayer.getContext()},getCanvas:function(){return this.tempLayer.getCanvas()},fillStroke:function(){var a=this.getContext();this.fill!==undefined&&(a.fillStyle=this.fill,a.fill()),this.stroke!==undefined&&(a.lineWidth=this.strokeWidth===undefined?1:this.strokeWidth,a.strokeStyle=this.stroke,a.stroke())},applyLineJoin:function(){var a=this.getContext();this.lineJoin!==undefined&&(a.lineJoin=this.lineJoin)},setFill:function(a){this.fill=a},getFill:function(){return this.fill},setStroke:function(a){this.stroke=a},getStroke:function(){return this.stroke},setLineJoin:function(a){this.lineJoin=a},getLineJoin:function(){return this.lineJoin},setStrokeWidth:function(a){this.strokeWidth=a},getStrokeWidth:function(){return this.strokeWidth},setDrawFunc:function(a){this.drawFunc=a},_draw:function(a){if(this.visible){var b=a.getStage(),c=a.getContext(),d=[],e=this.parent;d.unshift(this);while(e)d.unshift(e),e=e.parent;c.save();for(var f=0;f0)return!0}}return this.frame.lastTime=0,!1},_endTransition:function(){var a=this.config;for(var b in a)if(a.hasOwnProperty(b))if(a[b].x!==undefined||a[b].y!==undefined){var c=["x","y"];for(var d=0;d=h.config.duration*1e3?(this._endTransition.apply(h),this._clearTransition(h.node),h.config.callback!==undefined&&h.config.callback()):this._runTransition(h)}f&&e.draw()}}},_updateFrameObject:function(){var a=new Date,b=a.getTime();this.frame.lastTime===0?this.frame.lastTime=b:(this.frame.timeDiff=b-this.frame.lastTime,this.frame.lastTime=b,this.frame.time+=this.frame.timeDiff)},_animationLoop:function(){if(this._isaCanvasAnimating()){this._updateFrameObject(),this._runFrames();var a=this;requestAnimFrame(function(){a._animationLoop()})}},_handleAnimation:function(){var a=this;this._isaCanvasAnimating()&&a._animationLoop()}},window.requestAnimFrame=function(a){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),Kinetic.Node=function(a){this.visible=!0,this.isListening=!0,this.name=undefined,this.alpha=1,this.x=0,this.y=0,this.scale={x:1,y:1},this.rotation=0,this.centerOffset={x:0,y:0},this.eventListeners={},this.dragConstraint="none",this.dragBounds={},this._draggable=!1;if(a)for(var b in a)switch(b){case"draggable":this.draggable(a[b]);break;case"listen":this.listen(a[b]);break;case"rotationDeg":this.rotation=a[b]*Math.PI/180;break;default:this[b]=a[b]}this.centerOffset.x===undefined&&(this.centerOffset.x=0),this.centerOffset.y===undefined&&(this.centerOffset.y=0)},Kinetic.Node.prototype={on:function(a,b){var c=a.split(" ");for(var d=0;d1?g[1]:"";this.eventListeners[h]||(this.eventListeners[h]=[]),this.eventListeners[h].push({name:i,handler:b})}},off:function(a){var b=a.split(" ");for(var c=0;c1){var h=f[1];for(var i=0;i0&&f[0].getLevel()<=a&&e(f)}var a=this.getLevel(),b=this.getStage(),c=this,d=0;return c.className!=="Stage"&&e(c.getStage().getChildren()),d},getLevel:function(){var a=0,b=this.parent;while(b)a++,b=b.parent;return a},setScale:function(a,b){b?(this.scale.x=a,this.scale.y=b):(this.scale.x=a,this.scale.y=a)},getScale:function(){return this.scale},setPosition:function(a,b){this.x=a,this.y=b},getPosition:function(){return{x:this.x,y:this.y}},getAbsolutePosition:function(){return this.getAbsoluteTransform().getTranslation()},move:function(a,b){this.x+=a,this.y+=b},setRotation:function(a){this.rotation=a},setRotationDeg:function(a){this.rotation=a*Math.PI/180},getRotation:function(){return this.rotation},getRotationDeg:function(){return this.rotation*180/Math.PI},rotate:function(a){this.rotation+=a},rotateDeg:function(a){this.rotation+=a*Math.PI/180},listen:function(a){this.isListening=a},moveToTop:function(){var a=this.index;this.parent.children.splice(a,1),this.parent.children.push(this),this.parent._setChildrenIndices()},moveUp:function(){var a=this.index;this.parent.children.splice(a,1),this.parent.children.splice(a+1,0,this),this.parent._setChildrenIndices()},moveDown:function(){var a=this.index;a>0&&(this.parent.children.splice(a,1),this.parent.children.splice(a-1,0,this),this.parent._setChildrenIndices())},moveToBottom:function(){var a=this.index;this.parent.children.splice(a,1),this.parent.children.unshift(this),this.parent._setChildrenIndices()},setZIndex:function(a){var b=this.index;this.parent.children.splice(b,1),this.parent.children.splice(a,0,this),this.parent._setChildrenIndices()},setAlpha:function(a){this.alpha=a},getAlpha:function(){return this.alpha},getAbsoluteAlpha:function(){var a=1,b=this;while(b.className!=="Stage")a*=b.alpha,b=b.parent;return a},draggable:function(a){this.draggable!==a&&(a?this._initDrag():this._dragCleanup(),this._draggable=a)},isDragging:function(){var a=Kinetic.GlobalObject;return a.drag.node!==undefined&&a.drag.node.id===this.id&&a.drag.moving},moveTo:function(a){var b=this.parent;b.children.splice(this.index,1),b._setChildrenIndices(),a.children.push(this),this.index=a.children.length-1,this.parent=a,a._setChildrenIndices(),this.name&&(b.childrenNames[this.name]=undefined,a.childrenNames[this.name]=this)},getParent:function(){return this.parent},getLayer:function(){return this.className==="Layer"?this:this.getParent().getLayer()},getStage:function(){return this.className==="Stage"?this:this.getParent().getStage()},getName:function(){return this.name},setCenterOffset:function(a,b){this.centerOffset.x=a,this.centerOffset.y=b},getCenterOffset:function(){return this.centerOffset},transitionTo:function(a){var b=this.getLayer(),c=this,d=a.duration*1e3,e={};Kinetic.GlobalObject._clearTransition(this);for(var f in a)if(a.hasOwnProperty(f)&&f!=="duration"&&f!=="easing"&&f!=="callback")if(a[f].x!==undefined||a[f].y!==undefined){e[f]={};var g=["x","y"];for(var h=0;h0)this.remove(this.children[0])},_remove:function(a){a.name!==undefined&&(this.childrenNames[a.name]=undefined),this.children.splice(a.index,1),this._setChildrenIndices(),a=undefined},_drawChildren:function(){var a=this.children;for(var b=0;b=0;d--){var e=c[d];if(e.isListening)if(e.className==="Shape"){var f=this._detectEvent(e,b);if(f)return!0}else{var f=this._traverseChildren(e,b);if(f)return!0}}return!1},_handleStageEvent:function(a){var b=Kinetic.GlobalObject;a||(a=window.event),this._setMousePosition(a),this._setTouchPosition(a),this._clearDefaultLayers(),this.targetFound=!1;var c=!1;for(var d=this.children.length-1;d>=0;d--){var e=this.children[d];e.visible&&d>=0&&e.isListening&&this._traverseChildren(e,a)&&(d=-1,c=!0)}!c&&this.mouseoutShape&&(this.mouseoutShape._handleEvents("onmouseout",a),this.mouseoutShape=undefined)},_clearDefaultLayers:function(){this.bufferLayer.clear(),this.pathLayer.clear()},_listen:function(){var a=this;this.container.addEventListener("mousedown",function(b){a.mouseDown=!0,a._handleStageEvent(b)},!1),this.container.addEventListener("mousemove",function(b){a.mouseUp=!1,a.mouseDown=!1,a._handleStageEvent(b)},!1),this.container.addEventListener("mouseup",function(b){a.mouseUp=!0,a.mouseDown=!1,a._handleStageEvent(b),a.clickStart=!1},!1),this.container.addEventListener("mouseover",function(b){a._handleStageEvent(b)},!1),this.container.addEventListener("mouseout",function(b){a.mousePos=undefined},!1),this.container.addEventListener("touchstart",function(b){b.preventDefault(),a.touchStart=!0,a._handleStageEvent(b)},!1),this.container.addEventListener("touchmove",function(b){b.preventDefault(),a._handleStageEvent(b)},!1),this.container.addEventListener("touchend",function(b){b.preventDefault(),a.touchEnd=!0,a._handleStageEvent(b)},!1)},_setMousePosition:function(a){var b=a.offsetX||a.clientX-this._getContainerPosition().left+window.pageXOffset,c=a.offsetY||a.clientY-this._getContainerPosition().top+window.pageYOffset;this.mousePos={x:b,y:c}},_setTouchPosition:function(a){if(a.touches!==undefined&&a.touches.length===1){var b=a.touches[0],c=b.clientX-this._getContainerPosition().left+window.pageXOffset,d=b.clientY-this._getContainerPosition().top+window.pageYOffset;this.touchPos={x:c,y:d}}},_getContainerPosition:function(){var a=this.container,b=0,c=0;while(a&&a.tagName!=="BODY")b+=a.offsetTop-a.scrollTop,c+=a.offsetLeft-a.scrollLeft,a=a.offsetParent;return{top:b,left:c}},_modifyPathContext:function(a){a.stroke=function(){},a.fill=function(){},a.fillRect=function(a,b,c,d){layer.context.rect(a,b,c,d)},a.strokeRect=function(a,b,c,d){layer.context.rect(a,b,c,d)},a.drawImage=function(){},a.fillText=function(){},a.strokeText=function(){}},_endDrag:function(a){var b=Kinetic.GlobalObject;b.drag.node&&b.drag.moving&&(b.drag.moving=!1,b.drag.node._handleEvents("ondragend",a)),b.drag.node=undefined},_prepareDrag:function(){var a=this;this.onContainer("mousemove touchmove",function(b){var c=Kinetic.GlobalObject,d=c.drag.node;if(d){var e=a.getUserPosition(),f=d.dragConstraint,g=d.dragBounds,h={x:e.x-c.drag.offset.x,y:e.y-c.drag.offset.y};g.left!==undefined&&h.xg.right&&(h.x=g.right),g.top!==undefined&&h.yg.bottom&&(h.y=g.bottom),f==="horizontal"?h.y=d.y:f==="vertical"&&(h.x=d.x);var i=d.rotation,j={x:d.scale.x,y:d.scale.y};d.rotation=0,d.scale={x:1,y:1};var k=d.getAbsoluteTransform();k.invert(),k.translate(h.x,h.y),d.x+=k.getTranslation().x,d.y+=k.getTranslation().y,d.rotate(i),d.scale={x:j.x,y:j.y},c.drag.node.getLayer().draw(),c.drag.moving||(c.drag.moving=!0,c.drag.node._handleEvents("ondragstart",b)),c.drag.node._handleEvents("ondragmove",b)}},!1),this.onContainer("mouseup touchend mouseout",function(b){a._endDrag(b)})},_buildDOM:function(){this.content.style.width=this.width+"px",this.content.style.height=this.height+"px",this.content.style.position="relative",this.content.style.display="inline-block",this.content.className="kineticjs-content",this.container.appendChild(this.content),this.bufferLayer=new Kinetic.Layer,this.pathLayer=new Kinetic.Layer,this.bufferLayer.parent=this,this.pathLayer.parent=this,this._modifyPathContext(this.pathLayer.context),this.bufferLayer.getCanvas().style.display="none",this.pathLayer.getCanvas().style.display="none",this.bufferLayer.canvas.width=this.width,this.bufferLayer.canvas.height=this.height,this.bufferLayer.canvas.className="kineticjs-buffer-layer",this.content.appendChild(this.bufferLayer.canvas),this.pathLayer.canvas.width=this.width,this.pathLayer.canvas.height=this.height,this.pathLayer.canvas.className="kineticjs-path-layer",this.content.appendChild(this.pathLayer.canvas)}},Kinetic.GlobalObject.extend(Kinetic.Stage,Kinetic.Container),Kinetic.GlobalObject.extend(Kinetic.Stage,Kinetic.Node),Kinetic.Layer=function(a){this.className="Layer",this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.canvas.style.position="absolute",this.transitions=[],this.transitionIdCounter=0,Kinetic.Container.apply(this,[]),Kinetic.Node.apply(this,[a])},Kinetic.Layer.prototype={draw:function(){this._draw()},clear:function(){var a=this.getContext(),b=this.getCanvas();a.clearRect(0,0,b.width,b.height)},getCanvas:function(){return this.canvas},getContext:function(){return this.context},add:function(a){this._add(a)},remove:function(a){this._remove(a)},_draw:function(){this.clear(),this.visible&&this._drawChildren()}},Kinetic.GlobalObject.extend(Kinetic.Layer,Kinetic.Container),Kinetic.GlobalObject.extend(Kinetic.Layer,Kinetic.Node),Kinetic.Group=function(a){this.className="Group",Kinetic.Container.apply(this,[]),Kinetic.Node.apply(this,[a])},Kinetic.Group.prototype={add:function(a){this._add(a)},remove:function(a){this._remove(a)},_draw:function(){this.visible&&this._drawChildren()}},Kinetic.GlobalObject.extend(Kinetic.Group,Kinetic.Container),Kinetic.GlobalObject.extend(Kinetic.Group,Kinetic.Node),Kinetic.Shape=function(a){this.className="Shape";if(a.stroke!==undefined||a.strokeWidth!==undefined)a.stroke===undefined?a.stroke="black":a.strokeWidth===undefined&&(a.strokeWidth=2);a.detectionType===undefined&&(a.detectionType="path"),this.drawFunc=a.drawFunc,Kinetic.Node.apply(this,[a])},Kinetic.Shape.prototype={getContext:function(){return this.tempLayer.getContext()},getCanvas:function(){return this.tempLayer.getCanvas()},fillStroke:function(){var a=this.getContext();this.fill!==undefined&&(a.fillStyle=this.fill,a.fill()),this.stroke!==undefined&&(a.lineWidth=this.strokeWidth===undefined?1:this.strokeWidth,a.strokeStyle=this.stroke,a.stroke())},applyLineJoin:function(){var a=this.getContext();this.lineJoin!==undefined&&(a.lineJoin=this.lineJoin)},setFill:function(a){this.fill=a},getFill:function(){return this.fill},setStroke:function(a){this.stroke=a},getStroke:function(){return this.stroke},setLineJoin:function(a){this.lineJoin=a},getLineJoin:function(){return this.lineJoin},setStrokeWidth:function(a){this.strokeWidth=a},getStrokeWidth:function(){return this.strokeWidth},setDrawFunc:function(a){this.drawFunc=a},_draw:function(a){if(this.visible){var b=a.getStage(),c=a.getContext(),d=[],e=this.parent;d.unshift(this);while(e)d.unshift(e),e=e.parent;c.save();for(var f=0;fKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z002UrNkl<}5UMITD^evcP(*T-Y(*T-Y(*T-Y(*T-Y(`y<)(`y<)(`y<) z(`y<)(`$MiZ-rBNv4|Y;chgKZ^gnRNtdXtj&(SUGFIkoAy7z_ec>g0nNmboMukX3> z!>`#^Y29+=EBM*JwU9#!J9k{pp&$E{^#@0uRQSMm&SXxoZFl;PYU}4>5Ea9KwN<^ zLc$2dprQze-wOe2`MER0xp}Rd&df=7CXhryjjd*#wdN~&@kd_2tn~7^J@@}_$rWk5 zb*c_r0&y7uc9rvMZOi;ErS_%wZ*w#6c=g|XY~^p_xSIyhV^{}Q-_^>4KmL=->RX=^ z_aB(wRw!Ian8gJ`FdSocmB7G}-&%n2-&+CW6x$l$W@b}>DGmX3NTx{B8$M3ur|-oL z_j=1U5eP-W`QOA=F}A|~f%2}E9nb&vpM2z7p9l7c00UXD0Xk@YTus z`=4B}BhM{n^3d82>CH5%Xx<=MgH#Sh8M?9VBuZublni{A?aLyv_Gtiz5I9nkI zA`-3RwE;Wn(I^gs;z|*=l*LsIfA`!gp83_gAHA(_VBnOZUVg6tG&(pEw(Vc{_9z!Z z)P$;SI7D>ZHUda7fd16mk;#~LMJ=GU-|^-|oFcg@BZ@}4{!U@d;dg4Iz{BSY7~Aioany4d*%Nr-}|fQ z7jxNVxwn3p(*6fXR^3XFYr^3sh^YJqs}aIIqnLph4P-LdLGy-Wei0**9%X_$B|Lu_ z9C`?sBwz%iM}o*8IOCuc;D++3xYUw)5KC>s+F7hmy^GvzOg*e(S-mF1zhTdk5LJ zDu4AaU;U{cegfE|s+H*|>@luA_uo~_f9aq8t+HX&)rFR}^GRY%v6b+(e?|4)>qtfh zFhOv{PU@H`g25``o|6CP$p9#4unUTq)JaycNRT6(+lr2CMF}~oNfSk!!S-iR8=|5F zDQLW9O4$Mtj5=JkjD#UU6G*PghP{19_o*VxA z`@Wdz+4n*UO=F+8JW8;58T#bQsIIsPW1@-Tbng@+kT`G6yzd7$-*zW3 zd@N@Bu>$CE=>rYieEp^7lW+Z2rmy>j6r0B1uv`JR?Ga?nCW5(3II167b5ueD`4HSV zPxly4Wcm`5##9PI3_6nD?y*hLT2zNYjYF#euAK37&?Fr%Nl!SF80=sUGA%4`K6KH$ z&)W7MAAIvGUI%pjCjFwv9f112{l#aO|IfR=kc}(Xkj+o{5W8F+UAvO-U+%udUU)2ICZEhswVw+(9ll&q-!nUSHyxFiBJ`c>KM9?vmDO9hj9cgWe60_ z7C3JP3tphNzwe8G_tN(Qb44UG4WQ$J=PRFhW%WNk_@?V3o=l} z9k#hzKaYH5q=f)yNH_cFmY_x@)~t}A-a3R@V;T?p9j%A^S`Hx&2?SIGj61%$tFewL zcuY2dP?19*`?8!nuW8n$!?*qU4exs1XMx2clA8w5QP!bPzw0g4|NH6p=L*G(2_w*> zZ-A(v0VoM(&ma=Jx|1x8F_|bhMKcD?1;`}!RGb5KwP4<}%8~Va&=K6Dc*|rBu9We= zmpEKvaY@aCk~(Xx4P2G~!ypF2))Jbt{?$7jtXJ6L(1V6^7j||m8hGHDH^1|VU%BwS zb1oKl;8DeG)iH{A3uvFRbU{bkyuMYJ{>?KNdx+A`6H ze)gFcCo8`BhF@i#_4%B(YscG^aq}f=*0R;K3I= z?7vAt*>L(-H+xA>1UmoX+{kq zidHOUR-VjL=OBxkFj1Q0N}#f3kn;LN7z}FElYzTNk&-*Q-A?mc$$}!93s4KDSjH5S z2Ee7CNfhIhq%V&Y3N$@s7DS*n&5@}^!VIpIP+HwfvU?bb0?%-V38t-z7zcYCxXys=H|>?bxpmDgzz>1jfE_iW@%J)}@BhWWy)9ol@O*O3NR-9?`dX?FeGc=- zPa}H9i!iYRYme^q8i!UAf`!dw|Kv=AV=4&qA$1GD`mPnM8|Pa1{$-Owe8> za1Py|u*HK1Qv;6~?l!jeww797!=#(qE+M*ZqJaWO?Ui91-05eV| zFLc@gD7@#(@5)kslA56IZYTml79>l&;a04yK(1MWw6q~f?G^rf(W*nbvSj~w5fnfr zi|M)qiVG2w1<4?V8JOm!NNbMlnJti{$;2l zvM*SOX)$24n2w7f(~P>RR}QM;Y!!0t1euvciwa0f21y(m7&LD@(RZvf%%yfO9P^iI zwn+uFYDh`}K}VMCydsjBjf6RjI-fU99dLCP5recZ!)4kLn~+_02Bw%xzxQN(lr*Iq zWw|KS86TN#-V0m|H2vNIsB+hr-=51xm#UaCV=ZHxtiP*@1`(P#G#o)M1epn%fL0SS z*UTkYP(Uk!={OIG3SNucke3P&a25&+F@*xzvs+TmPS9fJI4;nb{KG^w>*KfDi07c( zNCt6`Ijb28d89Dcb3i(F%+?PibznkF`?)ysn3*Bbv*&t?=;U~ug8wKEh#k_Dqd@nZ zo8NfJ=Qh3PtXppXx3|6(m2jh1Wap8YS0>(_C+RMu`M^s%4kH!o8?Qcp;fxXn zwhqb~j9fXwRSjWVhG=#kqS+AS5SNU*UX9CARj@G<6fvz!aDD5D&TYet&bq=g2D=7k92D*exi|u(A4=j_o%H~aXWr1D5T|m#{+5+i=*Zr^Nru;>de06;n zoB~de#Q~XT&+#ErrURPhqiTZ7ilnc0@Xi>7Sq~{ z=_ueV1Wk)Day(xKL@jDENT!ppIYKfSZ$v z)CQjC$p(nz&@hj$)Y0S90|=%t2dpEQUBJxD*R6~=_5Yj`WWJym2gvyWI>Uf5Xd3NT&OZ(PV(3wAV5h7J6b(Y6170K z6|8MIgC=IHrJk?M-~te%NMfK6;anMFMIu4+AyNpT5F$p1TC>P3P-Bovf?A6$fg3VN z;K3vbpfTbsNSeDl8o4cAF9a5inn1EhWHFt2-1ZS%;E-lPW_qimxfD<;sMbAUGOZ~5r=B3v;brs4jK+ z`!T<DpNyr_wfcK~C!Vzw*1?20p<`O(eWe-7-OYKr4@aH91O-|_h$0(QYc^D&+`5v>1_TE)XqH+;B|1bC~Mx0g^){qU>JCwt5Ta)c=T#my}>o zF<=7RP!Hk~GzQyI!Ze3SAXo(wnUVof1&s<^lG}eaunc%~ssK9WeW0{1y!UG#eDBV= zhla~+6L>g*M-&b!CUFoMTxbw+6Cy#ZqNNHF8nn{q>(Nc-=()1m- z!Yp!E%_5vx@S^x~YLOBJCk=#@Pte+5scmArn#E-;c%>5QB5IQ)&{j+r#fp5Yef9h1b5|$G1Jp zfl$?W-LD~9!NnygCsYsilkDjQq%MZ57c(-|j6$>{ z7`^2G`O4QF`0Cfk7Y}4Nt-ic&FYD?+!Bs(agYHY9Rgf-&v$- zxka-ug&y?Kpyzo^5tnJkM9oN8@W9X*9qz^r?nqM##;XJqI~K+0gkHr&;BTO(8p;@* ztNS6MiVp8Ys|PXpHqZ#QB{UvFs}*#lj2#@s4veBhWt_EMwsDvRtx;g2wIg(V4scvP zkTHT&f*f;o-;B#HJoiZ})~sI%^fRUce|!LlomR5TRiF>(vuM_!or26z zXa+F>grNOHl-3L*g*-tqOVE->3OOW~!A2P*%=_0SWwbQx+qQ@qa~Mw28qYM>XzLKS z`4BegCYX`M5##zw#Dk;gXxVFfjIU@l#vG$Kv36hNFbgSl0X|yOH!3)bs^iLzQvP*U zEPnQiHT*PnriULl0P4T*jv4eFoJ|-Ub5|rtUE`{QJpu<5X%?6z&@PY_f3yvckPM9w z9}px6F!>Con8!3_ArS0PnW(uH)0H`fS6Ri>jaGzQ+2qqB0VE~xO;Z|`Po5X!y!9Dt^C2l^ffGyxr0md9g;CHFNXa|! zq5`8ZBcxKPR__9S0Bi@!spT1bTmeY7ZMaaP;4p7+g8nFnlN|NTxKfLd#R_`BL61U< z!t4O)P&8Bw0hz^fFrh(hBQq?&oiD0_OB~^>c7nbklAeCAgj8)PLL8H5_;P2T-y#+$ z35)<0(2Afo)mI0`AA#-un8$#V91Hgj1lPUh>dVh+FSfTu)|$AS|9<9@&%Ea|UtE=1 zA$QsXXvaOb<)i((7J9+hSgDH|j;NBDRH{RO$TvKYKG1#(%?4>tkmX$j?Miv!4XJeP~!U@``6^;CnH)N@Xqb*E#N>p4rp zysHi@H}Sx7bp|&&$jUv@7Ca2sdMKXe0Ll#XE~*Ho7Ck5_Tid|J$T;v!0!5lue}$=r zc)&s&k)1W`q()mO=2R=<96=$A>6}4%-62d6)l(U&TCZIj=S&Blca(j;;3A)OhY^ZIQaSrdi#nidfzmdqLL zm_i;+#uPm0Gv?N;a?PH`~kl65z)T9NCI##>wH3k4ws&Ok*s2e*Sd>}h( zX6qn*ipyulyCi8&OKf^1S?ALVvBjj)3KEA{d^*Fqx{Og$-&&nwS|WlATI)r8$4YNV zLuj1x%ae}KeEw6wq~v0aEpLbq>TaD1CU3|tZlScMXRJ$_9_y2(v8W!&IgNYmxa(-c z169{k>f;7Ls_NE%;T=siy1o`^)Orc3_^`beZELE&sk6W?m3}7bOPJFisXCaLD(&5Le)HB}y}hYW#A$$JGO35?qX}uC z4eJuS4?IO3``Gf>}?(#DnP0AE5)A zkRU(FgSdotUP5reTaf%rv^s>__;qyG%}7}AVz-GJZ#oF)7btD-N1b4d9+lC4OtvZY ziHeypV9cXDJpr^gn7eUlwg8!yG@#N3%QAtnZz%1Vu#$P4B9AdY$bz&s`^>wwteJppJ@5Jy^tS}TnFZ&zagpg!odf8 zInoiP&qqu_TZX73N77xw)rHoQHi)P_6l2c+n4D}Zb?TjGaOqPdhg(M>b;?Cj08J{u zIwhm914&_%nxLNa`;8p;3K9f_ZN&-RL+iC!*b1~RAz1on2+-5h!@$4*l5Hcp@GW3+ zD0X5_r{>+bD&d(gf=oMi-F-Ko{NyM3*0;Vzxm+b&_7|whc~RP7^n<2FV#XLU3p0eR zBLpoag64{EXIH2oxhfjPz6#bj>Y`PxMG5}LXEW57X4e`$H1-eB`tvD_iIPrF3$%XE z;HI<7(dv1Dy-0)Lq+h@0{7NoEP{{kR|44kLn;#P{egQrGRo?fWxACiA+(MLzc*QGU z#Rot1LBiQr67RVK3G)-2D+=l`xlUy66ZyagKguUQ{$Y~Dx7B;bGoQ`1*Imn;xyy-n z-*dz@YMor2LfBRy&KY0BUlZxqPoH$JU8=TJ!PzwbWzz{n7iE_c;1F!D^G^9`|Y;rYVm`fe-)3oFzZs0tXIEu9<4fQeOX> z*K*U1->F~YBOm?{BW25H-tkP#zPp$>KQ7+-%(|5C-FPP-{qP6s?<1<*@~dC)j(5J7 zYd`u2n7#K*s9yHODM%rU6mr<15)$AUXc|dE2f^4OY@){4O0cR>E|YuKdoZ&v#qC&y zJ+Kqoy8}IR05>{-lt;(}&6Bo1r*ar?UGvO640l72skKlzO!YUpkha$DM8^uaFbFnq znC3i(wV%RYsap0+~fBE#Mc;Pi?^0c;glA+-vb8`ZL2no%6{y)Do z?tNbb_UCfFPL4S&&;2`L}DpFbBn00Q}`3h zsK%nQT3_b66X^s^LhlDy--l3>0Cj@1ipc~>E@HwK$|);r0z-dqH|sZSn!vJoE3jha zN-D!oAtN&0m99m8VaTrCyBHoEIO=y@z4j6GCCeI0f+k|H6`FFs%A=m0pNti*4RA>r z>M-xSSoQ5DIk<)7;T!q-A7;*IX}j=MeRH31{d3>(WoPbT`3)WX*x+F+RA@6V0fLN15m_mrj1V>4p`jA+HfT8YQhWZZF>43v0 z_4M`hFx1~qSBn?O9~p`X@z4R(9eqElqrJYF!(oiHHriQLOq79~fl?Kbz&{+vYx-F` z#u_@Li3Dg6pnm9{f zgUrNW%K>gUiyg>g`wQ5?EOsP|tz=MZ>cpW4NGTPfuBE!0hLDNG|;qHTl_&;xYpcUwx%08X40Q%&=eWfqR7W>5rLF;Tx+ad^NVFwDh z{yfP*o@6-Z+v6q;$~|%E&v-X-tSa0e6Q&R$k`il2Neej(?QI#BEovY0u*PvH%F+d` z6kDPRH{anqzn(R($i++A>Yu^`dJG;BNI-h#IIrD`$7Lx3@#0N`g)gMy=1Swb= z(_V-F9Px!!kw6G$8_z@=t@k6Uw-ugDp3cVH z+mji_%Ubs_g^7r#EPxJv{U2YuaQCB6iSNIIWYfdwNE%tDIU8U8JN4|3OB_L0j<7Qi z&K=crs14S2WyedNGLPkFw~smU>g~(f^O||tQ|F?UWP(#r>&=~9smh-|X8}*YWJW!# zt~u}TdignY%_^qNJdgc-jQZBVnWb$6nUpxJMA(5GZYb+5u{hrZVhXgN1Q9(0$q29? z7@7+Gf64-AsJCaP*}wimL?OyzOwhp5FlFUnt=`-j$ez{eOMs5*fsXk(&RSZUBfjwV zOPJS@uakSt`G|je>qT^S!{#T#Nn_s*L zS4t*lDF98Busuh(xD{s;#5i9~Qpu1E6mWeR+>mcg<2!*I7Prcg2r!!Etx0I%Ki*H<&lji!c zc+wwT33DN9w+!;NpKK>i9Dn-kg*;(dJ8{LO2bCOm^P?yrNi3_k4N=S+mM-vZgq@q( zz0p8m)G>U=ZlvOTf9TY=b1H~+NKzrl#n38{O=AK#*0KhZ8uS3@R#;o+;gaon@%oVu z_xAPQgzqJNT8rw3x6Qun#`5}K&Odklj0LDY>SVz&QokXKrD^i8E&&mo5yG?DF#%}Y z*aGEvJ0>J$%LR*@`P|=L;@={1B<0wL(?=?KIJ}rxfFyPp1D7ss0|i@68vLQjgIO%l z6cEj8qPn>sF$SB;T>})C0S$8`r3lkk#uO~3)8LBY8$6_iV_K8O4mh+@=3CK1?d^Nu z3?M(*PjkuwNL4E$@?Uqq;j%xJxVnHaWFk$cX`mP#f~Z5)VKM>61lVM(?Mm1hk(rT8 z%jRTU+TwU*ilQV{hg7vr%BhScSd3~~0&#e`ku*q16zd= zhgV-*km{U^2A40OLkY66f@w;S*@9~pKNQ9(5)1S>ZmnkY8|&8X!xt9zPu34Q)kXFF zyXRj1?ezx-c8oF76Y(6WPZWdOxnuj1Rkt3oEN8{T z8N=vEmEAjs*>$kQo`WTN`pXOrR~W5W$|VbFT0%rA<|3L489LfBESg(n*;yUTpHslb zwyv+9{HIU?6&$Xf_w$^OYe?iUrrfM?K}OLTS!`Q~bXPH}E70Ymw);w|-`T%!SIRz z2*qs3tDb)*fAO*jLO2}vIQCANP* z66Jk2i+YRPw0bkG5fhoZ#!=GRo1hSI=biic+_jI=*_t5}1r#!ouM|m{>0066c>cRq z?C4V`-F+oC?(8R>kdkihHKBs|m!;kDp4r&K|cgSDn8f`2f49z}*7_`rZAb z`%>_1;qlhuu4aX{&b;`W8@orgxk?$TWuoQJBlrBjBI({q_4aGgpjf zx;O83Bsn3~U9EOY*A8L+o)D+A~cu!MOp`qt7`^p|D686Rr-f3Ty#!5Z+Z3k zX_6DB2If^l>ITS zMR^W%br0rH1)Wn!Ckmxrv>r=YH*dP8<}KJpwkXOHFEmP-K`%! zxbEQU@67q-JFDyNM4~K`$&Y8KCx}?QG*C(UE4bkp(-flCzrsxM`A=fY{8>dl_O{Dd z@klQ>-@S*2*7dT#w?twUV}xudBu=SXM@9nX%*yfP<+J&NC(q~XGg}~mxDuzeZ6^@O zhX!|`jNLIzkSHz}VmmUvccjWVYvYdai@cJN{yv5(Mf;-%9$u3kUk3pDxCKyZg&v;K z*)jUigOz7qP>|&sL}|6E9FrB-ltp)COT1@<+_HAm+VN4#6jogIJkDho%;d5QXVTYO zV%?TL)@;u{_UXgb&hna)-J2d=kES`Wsehu=Y2;;EvlPAHnb%zT zx3hY_y1b3066QGGBwS4+9B~dZA;qW8#pFZOr4^=AcdKhML9Ysk41{CDUjF;L8@T-Z z8C-brOsK|CRTAqOswj@r+vr$MYc?d_K1li7Tf76C&U94;H!Fwj$Pm~@)=bAeL|Pi+ zKlV12KXB8^yYWL-?gk#h>!7E+x2M&(C-tlP<6qtJ@E5vg{Nsvlx79g&OuMTo^>5N4 zDYoROtn2grg~S{&WpL7NwbTZC`xHf7N=Qb1_xq-NhH5o|a!gXPB*|F4R;@|GRN
    fP7q|a>=fdURB8gMyRT_3CmA=-T&76Z=fK=@umSxR3E3)AV8BT z9Vka^vqEeg)oO#jM-IR4Z)8@IoNWX-q`QB&!q*;hjPtAz8Hda}{Q zbxG@;+q(6K1FeVp1_tlJ_W;_MrY({a-H6k|2O8XdSEucM__ER7&F7lYJ&X5z>p2~` zN`A1iC!6bQro5#x#_yy~q)~8I37QP1*^qR{=`k2UD3sUrAvr^|uoYtKD}&Rp?L;~R zNy8Ce%mw2VhmYylR^!Wf#8LUxZjwj({7@HlzUs8W$*B>E;m!fFuYWx*7^QUWhtkID zmMuY7{N1}&J^E{+tVZKA>fdz>SG<9dP)N5z~;M}^PB(kz14$jFK;RE>|z$*1|`!BL9x#6N<56( zVRFl|BvmEuv6#?6;xNr2(IP{2Q{vm(2CiO;18L&i8cHj>NrtQB&ujN0vlH%6mR7S8 zVlBk6*0cC07%@O#uzf>Rw(P@=mN2s-+(3ft^V6E;Xjc!jBnNi#u?y$(7q_jw@vAeg zDqk?8aQUVkw>|>=8rY?(@yXb$Qw~5w+wYiFc=!XK$xb{68Ir0)eZgFz6yo& zyD*)Zbj+kXqFaZ`k>uid_;?HER2eQ=Xxw69;tG(l7|EYOX;X2n#3VZoP~CS3b++EE zRThM3pT$)1DGVKx-_{~6Mh3W1y4;7>cW(nW|K!g5?)VAZ1Z42D<3~=`ew}(2XwB!| zpJV7xHEcp`jJf0;$jqz9RVUPHon&-hnp6do7xEWo;gJgYbF!3o#n?WF9BnjqO=xC7 zB7;3xW~8#6{GtM3*9@f7i|&b?&mT384mcWpEMs+{!=qIi#blym{fruIoYvZ{7=h5B zBQf^C5b@q_bfgSH;OAoaJ`I>Wa7KXJ?1#QcI*hKCP+hsNTi3VDP2T>%=FOFA_4bry z-jzDa0Z^Wd((pF|po8E1@M~`GjqZQ>+upkipYnGn6FWT{el}kQHlJ54He+i8+p0t9 z-nfQ2S_0)BbaWpWKL<<`C1^7=U6rTwNR?!d^>f~F6Dk?UwY^o4EQE!acx?~W9Rq|H zwh~^@iJ4hI1K*6n_gT~lD@ex*9|dP&sAOsI?CSs=*Jm*R34GH_?XO}t^bxP>#kNc<^55LHdSx1>|1@QphfgMGP8dLywRb&z z`K}Fr`}6m_@{Z?x^7_vL2bqF)rlKt+g9Yuj9r9vcshchlb*`qA^t}*1DqBzMCp;u!`F=g4@)O-7$&|RZ;c1D&~!m zMfJwAH6Jc8urNUe#%RKo`+D`x*2Sd{-nQ~S;1|Hpf%U37@|!#`rUan=;@rJ+@>~B` zamziOcm4TAPhQb=#pgxjMqo%)lgIjD7G3d*UEBWas$pCeH4%h)bZ{%~f%jpq`UH|` z8}nj@c0f{ss95h%=6fs~GK(^VodM;IRjLOQj2H-Xtg%um^>E4R}Ps|Aefa$X6DgifXRfOkq*REOfhW`QS}&`Ge=q>1f@%_Mcx@-jkpA z;J@5>*WEYYdPn~Wdii#XUh$JdTYtLr;xlKRXW{|Ai&6u25sSC z=SiZNW<%5RJmp;p)y-90MbW5MU0O3^e#&8(k5PjcGbBKedMO6T1l|x-9d_3+x?_k~ z6n9oDrZoc@kSK(VAc4U|0apP_yP6oeYd=Xffr>>dzDkwEdP@=*OxiVH8pLn@E(mlx zq)D*#9)!XztEb|)iAdLVAARvh z&ydwGyz2bfbL$UYJc8@I0P}=@!Q?t|5Bwu;=Z}!Ectki<_zGB zVn!2!ouiEJDC=jyk{7rbKOp#scrRtAt0lg?zP<9!?>&5HnwIz#uuWAb?N%I%2RiAw zu)q4?C%2Smp7{vX(Yj+OnGE#rholU}cFt-xSDabi^{Vr>{OmIqti9o@_x$gte*4-F zz5V4P(k>#Cv3LWo{)ZoY>XFj2pWL(Vz}}kM=`uy6XC=DkU%^$;@`0lycWd?TDQQ?W z1WktKOS2Ttk8nm(O^^p!kgH;hq62=a&BWl*v53hjn(+>9AU@=lP#_GDj9?G*f>cy6=7B^MCz{cLQ@o zBsxyQGzND6Gk8IS{vs(sf2{h zD`yw1QmuHN%@~|5L+`_o4A(~n908#Tjfmo6OVk=ryevodoQV9=Jh^k*30ezq$ocTx z9E*oeM{|3HO z<9bdP0J%?m;N62W=by16`^1+(p%rYB3fCK=36;9gTqMD0z^=ZLIl!4rvUFBet5LD@ zVGSamdaxCwI2Y42AF4x4J`vc^XcF~Ks!d(uvSPQE{4rKe&_pMuM{7i06d=)wh|nhf zSei|JD5nz=+istQ*b;RHe0r7X`_Y{b{}T8n@U1kfzEf34Rev{gs!m7`^!Fe6)M&nK z#+Li;y6rYIa{;DxroT{QLmJV#L+DctSuS0oo#&micpi|GN$&nju5Mkfwu++M{NO=- z%6nEHI`?UB-l%qT3Lk&Gv_cv>kSUORUK`mLbr4=$#B_w-U9LEYwLSu&-q|G^peGAI z3N8>d8;r5jP9aX;-#CJ{h}@zUzPrb`RgY}jkP?J7o@Y>1e@D~t9$PLz(0R2QfX&`gnbFfaF57KW*ce6U^KU!Qvcr zD&f35MjRuRY}H!30pCIO!0#G3CnK3!`iC!F_k*Wgv3%&wLG<_SBfA%0HLIzJku>sA z#DoOR0on62gfjy)4!Gw0XvqT`?tksw|9Z`po2$#N6OkWH#AFYx`0R^=jo*H4OGf|b z!43Vpezb9>{rnC0tpI-fhfiCEayN34rXQ*GxipMLL&40+BJ*&d_dF{V3yIZV4BLxuInzp3e&lR;kdwQ&FSKYi%mfp4hlu9F6U$4DeT zRyjuk^Z@sN`A4_x1?wxvVz0-HnRuuwMv7)=;4Xjp*Yivk>A>EWv}0H zm==R+^%hFfQI{$yldQEFt?7>lr8QL~CuCYfOdA9(A*Km}tnqyg1)p0}5I50rtlW72 zfV*Q|bO7HuZ16WF3_IlkGy#zM)0?smuho^*Z>j**W8J9rJBN17%E+B(&T&scCdmb< z15LnWPT+X+fWeaXA~e2lVp5`(yEH)-6BKI6F%-z29g+_s$eFbJo%1t1G>uZVHWUUX zl*ntsp-LgSZ{@l*=}|t&DYkxRn&|X6iqoGdo$GJx_7^O@n^dSp7H**+a)P; zB8A1`1WZ6Ox|dSlI^s$nWA87h#@I?f)!q%*w(~K?d1zAh?7W+Zx|Sm*57auZr46C^ z&b=k~y<0YHOZ~u}Q;GjMtpTK}ngng#lL^7pmf1GcTD|Gk)xX|#VBr6)*q%H(^)4m` zH3l0Gk_>F~6P%BzJWZQiMy*6wdx^pYO{mKreFu!6NK$BP%n!DwA zmc%9WREqIKYc@Zel8`%+!oqd9DonP?IBC6~j?cRt!6B+cvpK?LZ>BakTV_8QOok~n z#YfO&lvM{>%X{{9Ka7`Z^!=`~?T=dkX^$O=^Oj|DPCIbD60;(l{atS zvoZxx@2P5iPHO;V>tggHkASghA`lr@+ffDBzH|4mEiPE^Y#C8AreQwr=4##5nb3PN zV0#}(WkV-;TUGhd1B34R+Yju(r*Af&%GT$!22dn%lbf(TU2UTkOoonp9He}gNh7$V z$DDnesKptbWcQ3TTQ5hO7$j(Duxq|T{J@7!_&bR!v!+FLw?3yWfO^;7a3Q7c*&0kD6BFc^o9&+evyWf>;WOsVIbTEyK(a^A z{^cXvhaP1LK9HDjyx45q@sl2O5!k+sTyXBu(8&9<>>5>pZjs=CLO@{ zE!@H>n6`M_0LUG<|C;t@^UTS<{&`o-YI*wEqgQ?EjpuzFI1kAE!5cn(b69BIFOy}Z z#UN&^pm3s49t0Q%WHhymIH|pt3Lf}8>AanQR^^?#Z;7CeXzH? z7Y$2@jq@^ahZ&THklSoHx*7cV1c5`>W zdgmj9y$?RT_CDYs62$cZ@5l790{-#|BXgg3)eBzo*Z=(E2SsG>@1j)s_X0r9s__no zJFXF}%jMH~>PeE!2NukkGy9Pi-8bL+QO60zL^0||M1JJEhr0LfJ8)kR1P7xiY6gns za(NUlhO6L7%LBk8=byK9gM^uiP^#;#k70&*?&ULD?pe3~X}5posb75G4TJw6B9G9Z z#GD4uNm|2Z#(|l33u;;?5kCn|l)zTF;l7f)`{CXpK)(6ezrJdA^uyPy^WK;ob&OQ znyzp1T|M{z-m<0jPDw@)JB+vz*b1Um&^Rshsv@q6*b#zw znE$?Q#Qp0n!QSmV_uLC?J1biKoXLKBsdv7I^X7%w6d>F13EF#r2UPW8Rb8j5n^bj= zst*0=rk})4qN?B~h~18qull)Tf@BIj@l1Ew`(D!W3E)Ef9QSDpbh6fmKlPvMX3m)L zk59XD>FZ{-*sI#}Nk?@MXs2c^aNEE1p=BgHVbqBx#L*{Rn^Vcy(ICKCu0XH;x*QC7#CEVeX0OqfqZq} z*?;khr@!v2H{AMZ5!re&+6Ybq$gk0Z-Q5q}@Z;`YU@0&cUyGJ26!JMB7#%G+eE3sM z{gOTSu|`{8^z18VbtJ3)*iG^48&RqW2FL-E(#3Y`+|A`(t2dmxD7Vy?3ToOpwh=rH z&5LEMVEfq@H?`b%AifefC-tiarU7&kR?5&0ipZlWZ<0@ak#KahRLgtSMEVIn@E%Qp zR2{9D!j9hf)&(nM|T3&NP6g4x|KMsW5n$Gb*(sRFJ^UzMUo_c5fWcS& z!~cBZ1u3W z>o+}k7rsvJlnm)ltATST?MwSFGVh&leBoOpj%BC5^fs#Y;?gO|^|~sszXbO+XP}Oxe{CVbz3hhf?rV@Qm~b zCwV->5v8Ios_zu#&_%y>%>H|HdeM_$&G*Bs;f~YpB?sxuV zP6KG_n;JCy&|n#ohK>EbStlJp(`$MiL2XRmg6TC4py@RYpy@RYpy@RYpy@TerU5j) dev9k>4*-=0nd!0F(BJ?7002ovPDHLkV1oI`$O`}f literal 0 HcmV?d00001