diff --git a/gulpfile.js b/gulpfile.js
index 463ac5f..ae3a2af 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -121,4 +121,43 @@
         .pipe(wrap('(function(window){"use strict";<%= contents %>}(window));'))
         .pipe(gzip({ append: true }))
         .pipe(gulp.dest('build/'));
+});
+
+gulp.task('concatPlayer', function() {
+    gulp.src([
+            'player/js/main.js',
+            'player/js/3rd_party/transformation-matrix.js',
+            'player/js/3rd_party/canvasPoly.js',
+            'player/js/utils/MatrixManager.js',
+            'player/js/utils/animationFramePolyFill.js',
+            'player/js/utils/common.js',
+            'player/js/utils/canvasPolyFill.js',
+            'player/js/utils/functionExtensions.js',
+            'player/js/utils/bez.js',
+            'player/js/utils/DataManager.js',
+            'player/js/renderers/SVGRenderer.js',
+            'player/js/renderers/CanvasRenderer.js',
+            'player/js/mask.js',
+            'player/js/elements/BaseElement.js',
+            'player/js/elements/CompElement.js',
+            'player/js/elements/ImageElement.js',
+            'player/js/elements/ShapeElement.js',
+            'player/js/elements/ShapeItemElement.js',
+            'player/js/elements/SolidElement.js',
+            'player/js/elements/TextElement.js',
+            'player/js/elements/canvasElements/CVBaseElement.js',
+            'player/js/elements/canvasElements/CVCompElement.js',
+            'player/js/elements/canvasElements/CVImageElement.js',
+            'player/js/elements/canvasElements/CVShapeElement.js',
+            'player/js/elements/canvasElements/CVShapeItemElement.js',
+            'player/js/elements/canvasElements/CVSolidElement.js',
+            'player/js/elements/canvasElements/CVTextElement.js',
+            'player/js/elements/canvasElements/CVMaskElement.js',
+            'player/js/animation/AnimationManager.js',
+            'player/js/animation/AnimationItem.js',
+            'player/js/module.js'
+        ])
+        .pipe(concat('concat.js', {newLine: '\r\n'}))
+        .pipe(wrap('\'use strict\';\r\n(function(){\r\n<%= contents %>\r\n}());'))
+        .pipe(gulp.dest('build/player/'))
 });
\ No newline at end of file
diff --git a/parser/ShapesParser.js b/parser/ShapesParser.js
index 1691f44..45890c1 100644
--- a/parser/ShapesParser.js
+++ b/parser/ShapesParser.js
@@ -215,6 +215,9 @@
         var ob, prop;
         for(i=0;i<len;i+=1){
             prop = iteratable.property(i+1);
+            if(!prop.enabled){
+                continue;
+            }
             var itemType = getItemType(prop.matchName);
             if(itemType == 'sh'){
                 ob = {};
diff --git a/player/index.html b/player/index.html
index 54635be..ec01d29 100644
--- a/player/index.html
+++ b/player/index.html
@@ -36,6 +36,6 @@
     <!-- endbuild -->
 </head>
 <body style="background-color:#666; margin: 0px;height: 100%; font-family: sans-serif;font-size: 10px">
-<div style="width:600px;height:300px;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/gear" data-bm-type="svg" data-bm-loop="true" data-bm-prerender="true"></div>
+<div style="width:600px;height:300px;background-color:#000;display:inline-block" class="bodymovin" data-bm-path="exports/gear" data-bm-type="svg" data-bm-loop="false" data-bm-prerender="true"></div>
 </body>
 </html>
diff --git a/player/js/3rd_party/canvasPoly.js b/player/js/3rd_party/canvasPoly.js
index 316e23d..24452a4 100644
--- a/player/js/3rd_party/canvasPoly.js
+++ b/player/js/3rd_party/canvasPoly.js
@@ -9,7 +9,7 @@
  * A polyfill for HTML Canvas features, including
  * Path2D support.
  */
-if (CanvasRenderingContext2D.prototype.ellipse == undefined) {
+if (CanvasRenderingContext2D.prototype.ellipse === undefined) {
     CanvasRenderingContext2D.prototype.ellipse = function(x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise) {
         this.save();
         this.translate(x, y);
@@ -17,7 +17,7 @@
         this.scale(radiusX, radiusY);
         this.arc(0, 0, 1, startAngle, endAngle, antiClockwise);
         this.restore();
-    }
+    };
 }
 
 if (typeof Path2D !== 'function' || typeof Path2D.prototype.addPath !== 'function' || typeof Path2D.prototype.ellipse !== 'function') {
@@ -28,7 +28,7 @@
 
         function Path_(arg) {
             this.ops_ = [];
-            if (arg == undefined) {
+            if (arg === undefined) {
                 return;
             }
             if (typeof arg == 'string') {
@@ -42,7 +42,7 @@
             } else {
                 throw 'Error: ' + typeof arg + 'is not a valid argument to Path';
             }
-        };
+        }
 
         // TODO(jcgregorio) test for arcTo and implement via something.
 
@@ -72,7 +72,7 @@
             Path_.prototype[name] = createFunction(name);
         }
 
-        Path_.prototype['addPath'] = function(path, tr) {
+        Path_.prototype.addPath = function(path, tr) {
             var hasTx = false;
             if (tr) {
                 hasTx = true;
@@ -83,7 +83,7 @@
             if (hasTx) {
                 this.ops_.push({type: 'restore', args: []});
             }
-        }
+        };
 
         var original_fill = CanvasRenderingContext2D.prototype.fill;
         var original_stroke = CanvasRenderingContext2D.prototype.stroke;
@@ -101,7 +101,7 @@
             } else {
                 original_fill.apply(this, arguments);
             }
-        }
+        };
 
         CanvasRenderingContext2D.prototype.stroke = function(arg) {
             if (arg instanceof Path_) {
@@ -114,7 +114,7 @@
             } else {
                 original_stroke.call(this);
             }
-        }
+        };
 
         CanvasRenderingContext2D.prototype.clip = function(arg) {
             if (arg instanceof Path_) {
@@ -131,7 +131,7 @@
             } else {
                 original_clip.apply(this, arguments);
             }
-        }
+        };
 
         // Set up externs.
         Path2D = Path_;
diff --git a/player/js/3rd_party/transformation-matrix.js b/player/js/3rd_party/transformation-matrix.js
index a1ae8ed..4b046b2 100644
--- a/player/js/3rd_party/transformation-matrix.js
+++ b/player/js/3rd_party/transformation-matrix.js
@@ -109,7 +109,7 @@
      * @param {number} angle - angle in radians
      */
     rotate: function(angle) {
-        if(angle == 0){
+        if(angle === 0){
             return this;
         }
         this.cos = Math.cos(angle);
@@ -571,8 +571,9 @@
             }
         }
         else {
-            for(; p = points[i]; i++) {
-                mxPoints.push(this.applyToPoint(p.x, p.y));
+            l = points.length;
+            for(i = 0; i<l; i++) {
+                mxPoints.push(this.applyToPoint(points[i].x, points[i].y));
             }
         }
 
@@ -635,7 +636,7 @@
      * @returns {boolean}
      */
     isInvertible: function() {
-        return !this._q(this.determinant(), 0)
+        return !this._q(this.determinant(), 0);
     },
 
     /**
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 22a3c0c..aad5c07 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -96,7 +96,7 @@
     params.animType = wrapperAttributes.getNamedItem('data-anim-type') ? wrapperAttributes.getNamedItem('data-anim-type').value : wrapperAttributes.getNamedItem('data-bm-type') ? wrapperAttributes.getNamedItem('data-bm-type').value : wrapperAttributes.getNamedItem('bm-type') ? wrapperAttributes.getNamedItem('bm-type').value :  'canvas';
 
     var loop = wrapperAttributes.getNamedItem('data-anim-loop') ? wrapperAttributes.getNamedItem('data-anim-loop').value :  wrapperAttributes.getNamedItem('data-bm-loop') ? wrapperAttributes.getNamedItem('data-bm-loop').value :  wrapperAttributes.getNamedItem('bm-loop') ? wrapperAttributes.getNamedItem('bm-loop').value : '';
-    if(loop == ''){
+    if(loop === ''){
     }else if(loop === 'false'){
         params.loop = false;
     }else if(loop === 'true'){
@@ -137,7 +137,7 @@
 
 AnimationItem.prototype.checkLoaded = function () {
     this.renderer.buildStage(this.container, this.layers);
-    if (this.pendingElements == 0) {
+    if (this.pendingElements === 0) {
         if(this.prerenderFramesFlag){
             this.prerenderFrames(0);
             dataManager.renderFrame(this.animationID,this.currentFrame);
diff --git a/player/js/elements/ShapeItemElement.js b/player/js/elements/ShapeItemElement.js
index 8fc6db5..058fa18 100644
--- a/player/js/elements/ShapeItemElement.js
+++ b/player/js/elements/ShapeItemElement.js
@@ -9,89 +9,117 @@
 
 ShapeItemElement.prototype.searchShapes = function(arr){
     var i, len = arr.length - 1;
+    var j, jLen;
     var pathNode;
+    var ownArrays = [];
     for(i=len;i>=0;i-=1){
         if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
-            pathNode = document.createElementNS(svgNS, "path");
-            this.shape.appendChild(pathNode);
             this.stylesList.push({
-                path: pathNode,
+                elements: [],
                 type: arr[i].ty,
                 d: ''
-            })
+            });
+            arr[i].style = this.stylesList[this.stylesList.length - 1];
+            ownArrays.push(arr[i].style);
         }else if(arr[i].ty == 'gr'){
             this.searchShapes(arr[i].it);
+        }else if(arr[i].ty == 'tr'){
+            arr[i].matrix = new Matrix();
+        }else if(arr[i].ty == 'sh'){
+            arr[i].elements = [];
+            jLen = this.stylesList.length;
+            for(j=0;j<jLen;j+=1){
+                if(!this.stylesList[j].closed){
+                    pathNode = document.createElementNS(svgNS, "path");
+                    arr[i].elements.push(pathNode);
+                    this.shape.appendChild(pathNode);
+                    this.stylesList[j].elements.push(pathNode);
+                }
+            }
+
+        }else if(arr[i].ty == 'rc'){
+            arr[i].elements = [];
+            jLen = this.stylesList.length;
+            for(j=0;j<jLen;j+=1){
+                if(!this.stylesList[j].closed){
+                    pathNode = document.createElementNS(svgNS, "rect");
+                    arr[i].elements.push(pathNode);
+                    this.shape.appendChild(pathNode);
+                    this.stylesList[j].elements.push(pathNode);
+                }
+            }
+
+        }else if(arr[i].ty == 'el'){
+            arr[i].elements = [];
+            jLen = this.stylesList.length;
+            for(j=0;j<jLen;j+=1){
+                if(!this.stylesList[j].closed){
+                    pathNode = document.createElementNS(svgNS, "ellipse");
+                    arr[i].elements.push(pathNode);
+                    this.shape.appendChild(pathNode);
+                    this.stylesList[j].elements.push(pathNode);
+                }
+            }
+
         }
     }
+    len = ownArrays.length;
+    for(i=0;i<len;i+=1){
+        ownArrays[i].closed = true;
+        console.log('ownArrays[i]: ',ownArrays[i]);
+    }
 };
 
 ShapeItemElement.prototype.getElement = function(){
     return this.shape;
 };
 
-ShapeItemElement.prototype.renderShape = function(num,matrix){
-    var props = matrix.props;
-    this.currentMatrix.reset();
-    this.currentMatrix.transform(props[0],props[1],props[2],props[3],props[4],props[5]);
+ShapeItemElement.prototype.renderShape = function(num,matrix,items){
+    if(!items){
+        items = this.data;
+    }
     this.posCount = 0;
     this.frameNum = num;
-    var i, len = this.stylesList.length;
-    for(i=0;i<len;i+=1){
-        this.stylesList[i].d = '';
-    }
-    len = this.data.length - 1;
+    var i, len;
+    var j, jLen;
+    var styleElem;
+    len = items.length - 1;
+    var groupMatrix;
     for(i=len;i>=0;i-=1){
-        if(this.data[i].ty == 'tr'){
-            var mtArr = this.data[i].renderedData[num].mtArr;
-            this.currentMatrix.transform(mtArr[0],mtArr[1],mtArr[2],mtArr[3],mtArr[4],mtArr[5]);
-            this.currentMatrix.translate(-this.data[i].renderedData[num].a[0],-this.data[i].renderedData[num].a[1]);
-        }else if(this.data[i].ty == 'sh'){
-            this.renderPath(this.data[i],num);
-        }else if(this.data[i].ty == 'el'){
-            this.renderEllipse(this.data[i].renderedData[num]);
-        }else if(this.data[i].ty == 'fl'){
-            this.stylesList[this.posCount].path.setAttribute('fill',this.data[i].renderedData[num].color);
-            this.stylesList[this.posCount].path.setAttribute('fill-opacity',this.data[i].renderedData[num].opacity);
-            this.posCount += 1;
-        }else if(this.data[i].ty == 'st'){
-            this.stylesList[this.posCount].path.setAttribute('stroke-width',this.data[i].renderedData[num].width);
-            this.stylesList[this.posCount].path.setAttribute('stroke',this.data[i].renderedData[num].color);
-            this.stylesList[this.posCount].path.setAttribute('stroke-opacity',this.data[i].renderedData[num].opacity);
-            this.stylesList[this.posCount].path.setAttribute('fill-opacity',0);
-            this.posCount += 1;
+        if(items[i].ty == 'tr'){
+            var props = matrix.props;
+            var mtArr = items[i].renderedData[num].mtArr;
+            groupMatrix = items[i].matrix;
+            groupMatrix.reset().transform(props[0],props[1],props[2],props[3],props[4],props[5]).transform(mtArr[0],mtArr[1],mtArr[2],mtArr[3],mtArr[4],mtArr[5]).translate(-items[i].renderedData[num].a[0],-items[i].renderedData[num].a[1]);
+        }else if(items[i].ty == 'sh'){
+            this.renderPath(items[i],num,groupMatrix);
+        }else if(items[i].ty == 'el'){
+            this.renderEllipse(items[i],num,groupMatrix);
+        }else if(items[i].ty == 'rc'){
+            this.renderRect(items[i],num,groupMatrix);
+        }else if(items[i].ty == 'fl'){
+            styleElem = items[i].style;
+            jLen = styleElem.elements.length;
+            for(j=0;j<jLen;j+=1){
+                styleElem.elements[j].setAttribute('fill',items[i].renderedData[num].color);
+                styleElem.elements[j].setAttribute('fill-opacity',items[i].renderedData[num].opacity);
+            }
+        }else if(items[i].ty == 'st'){
+            styleElem = items[i].style;
+            jLen = styleElem.elements.length;
+            for(j=0;j<jLen;j+=1){
+                styleElem.elements[j].setAttribute('stroke-width',items[i].renderedData[num].width);
+                styleElem.elements[j].setAttribute('stroke',items[i].renderedData[num].color);
+                styleElem.elements[j].setAttribute('stroke-opacity',items[i].renderedData[num].opacity);
+                styleElem.elements[j].setAttribute('fill-opacity',0);
+            }
+        }else if(items[i].ty == 'gr'){
+            this.renderShape(num,this.currentMatrix,items[i].it);
         }
     }
-
-    len = this.stylesList.length;
-    for(i=0;i<len;i+=1){
-        if(this.stylesList[i].lastPath != this.stylesList[i].d){
-            this.stylesList[i].path.setAttribute('d',this.stylesList[i].d);
-            this.stylesList[i].lastPath = this.stylesList[i].d;
-        }
-        //this.stylesList[i].path.setAttribute('transform',this.currentMatrix.toCSS())
-    }
-
-
-
-    return;
-
-    this.currentData = this.data.renderedData[num];
-    if(this.data.type=="pathShape"){
-        this.pathLength = this.renderPath(num);
-    }else if(this.data.type=="rectShape"){
-        this.renderRect(num);
-    }else if(this.data.type=="ellipseShape"){
-        this.pathLength = this.renderEllipse(num);
-    }
-    if(this.data.trim){
-        this.renderTrim(num);
-    }
-    this.renderFill(num);
-    this.renderStroke(num);
-    this.renderTransform(num);
 };
 
-ShapeItemElement.prototype.renderPath = function(pathData,num){
+ShapeItemElement.prototype.renderPath = function(pathData,num,matrix){
     if(!pathData.renderedFrames){
         pathData.renderedFrames = [];
     }
@@ -99,127 +127,49 @@
     if(pathData.renderedFrames[num]){
         pathString = pathData.renderedFrames[num];
     }else{
-        pathString =  this.createPathString(pathData.renderedData[num].path.pathNodes);
+        pathString = pathData.renderedData[num].path.pathString;
         pathData.renderedFrames[num] = pathString;
     }
-    var i, len = this.stylesList.length;
+    var elements = pathData.elements;
+    var i, len = elements.length;
     for(i=0;i<len;i+=1){
         //this.stylesList[i].d += pathData.path.pathString;
-        this.stylesList[i].d += pathString;
+        elements[i].setAttribute('d',pathString);
+        elements[i].setAttribute('transform','matrix('+matrix.props.join(',')+')');
     }
 };
 
-ShapeItemElement.prototype.createPathString = function(paths,closed){
-    var pathV,pathO,pathI;
-    var pathString = '';
-    var pathData;
-    var k, kLen;
 
-    if(!(paths instanceof Array)){
-        pathV = paths.v;
-        pathO = paths.o;
-        pathI = paths.i;
-        kLen = pathV.length;
-        pt = this.currentMatrix.applyToPoint(pathV[0][0],pathV[0][1]);
-        pathString += "M"+pt.x+','+pt.y;
-        //pathString += "M"+pathV[0].join(',');
-        var pt;
-        for(k=1;k<kLen;k++){
-            //pathString += " C"+pathO[k-1].join(',') + " "+pathI[k].join(',') + " "+pathV[k].join(',');
-            pt = this.currentMatrix.applyToPoint(pathO[k-1][0],pathO[k-1][1]);
-            pathString += " C"+pt.x+','+pt.y;
-            pt = this.currentMatrix.applyToPoint(pathI[k][0],pathI[k][1]);
-            pathString += " "+pt.x+','+pt.y;
-            pt = this.currentMatrix.applyToPoint(pathV[k][0],pathV[k][1]);
-            pathString += " "+pt.x+','+pt.y;
-        }
-        if(closed !== false){
-            //pathString += " C"+pathO[k-1].join(',') + " "+pathI[0].join(',') + " "+pathV[0].join(',');
-            pt = this.currentMatrix.applyToPoint(pathO[k-1][0],pathO[k-1][1]);
-            pathString += " C"+pt.x+','+pt.y;
-            pt = this.currentMatrix.applyToPoint(pathI[0][0],pathI[0][1]);
-            pathString += " "+pt.x+','+pt.y;
-            pt = this.currentMatrix.applyToPoint(pathV[0][0],pathV[0][1]);
-            pathString += " "+pt.x+','+pt.y;
-        }
-        return pathString;
-    }
-    var l,lLen = paths.length;
-    pathString = '';
-    for(l = 0;l<lLen;l+=1){
-        pathData = paths[l];
-        pathV = pathData.v;
-        pathO = pathData.o;
-        pathI = pathData.i;
-        kLen = pathV.length;
-        pathString += "M"+pathV[0].join(',');
-        for(k=1;k<kLen;k++){
-            pathString += " C"+pathO[k-1].join(',') + " "+pathI[k].join(',') + " "+pathV[k].join(',');
-        }
-        if(closed !== false){
-            pathString += " C"+pathO[k-1].join(',') + " "+pathI[0].join(',') + " "+pathV[0].join(',');
-        }
-    }
-    return pathString;
-}
+ShapeItemElement.prototype.renderEllipse = function(ellipseData,num,matrix){
+    // cx="40" cy="40" rx="30" ry="15"
 
 
-ShapeItemElement.prototype.renderEllipse = function(ellipseData){
-
-    var ellipseStr = 'M';
-    ellipseStr+=ellipseData.p[0] - ellipseData.size[0]/2+','+ellipseData.p[1];
-    ellipseStr+='A'+ellipseData.size[0]/2+','+ellipseData.size[1]/2+' ';
-    ellipseStr+= '0 1,0 ';
-    ellipseStr+=ellipseData.p[0] + ellipseData.size[0]/2+','+ellipseData.p[1];
-    ellipseStr+='A'+ellipseData.size[0]/2+','+ellipseData.size[1]/2+' ';
-    ellipseStr+= '0 1,0 ';
-    ellipseStr+=ellipseData.p[0] - ellipseData.size[0]/2+','+ellipseData.p[1];
-
-    var pSized = this.currentMatrix.applyToPoint(ellipseData.p[0],ellipseData.p[1]);
-    var sSized = this.currentMatrix.applyToPoint(ellipseData.size[0],ellipseData.size[1]);
-
-    ellipseStr = 'M';
-    ellipseStr+=pSized.x - sSized.x/2+','+pSized.y;
-    ellipseStr+='A'+sSized.x/2+','+sSized.y/2+' ';
-    ellipseStr+= '0 1,0 ';
-    ellipseStr+=pSized.x + sSized.x/2+','+pSized.y;
-    ellipseStr+='A'+sSized.x/2+','+sSized.y/2+' ';
-    ellipseStr+= '0 1,0 ';
-    ellipseStr+=pSized.x - sSized.x/2+','+pSized.y;
-
-    var i, len = this.stylesList.length;
-
+    var elements = ellipseData.elements;
+    var ellipseAttrs = ellipseData.renderedData[num];
+    console.log(ellipseAttrs);
+    var i, len = elements.length;
     for(i=0;i<len;i+=1){
-        this.stylesList[i].d += ellipseStr;
+        elements[i].setAttribute('cx',ellipseAttrs.p[0]);
+        elements[i].setAttribute('cy',ellipseAttrs.p[1]);
+        elements[i].setAttribute('rx',ellipseAttrs.size[0]/2);
+        elements[i].setAttribute('ry',ellipseAttrs.size[1]/2);
+        //elements[i].setAttribute('transform','matrix('+matrix.props.join(',')+')');
     }
 };
 
-ShapeItemElement.prototype.renderRect = function(num){
+ShapeItemElement.prototype.renderRect = function(rectData,num,matrix){
+    var elements = rectData.elements;
+    var ellipseAttrs = rectData.renderedData[num];
     var animData = this.currentData;
-    if(animData.rect){
-        var rect = animData.rect;
-
-        if(this.renderedFrame.rect.rx != rect.roundness){
-            this.shape.setAttribute('rx',rect.roundness);
-            this.shape.setAttribute('ry',rect.roundness);
-            this.renderedFrame.rect.rx = rect.roundness;
-        }
-        if(this.renderedFrame.rect.width != rect.size[0]){
-            this.shape.setAttribute('width',rect.size[0]);
-            this.renderedFrame.rect.width = rect.size[0];
-        }
-        if(this.renderedFrame.rect.height != rect.size[1]){
-            this.shape.setAttribute('height',rect.size[1]);
-            this.renderedFrame.rect.height = rect.size[1];
-        }
-        if(this.renderedFrame.rect.x != rect.position[0] - rect.size[0]){
-            this.shape.setAttribute('x',rect.position[0] - rect.size[0]/2);
-            this.renderedFrame.rect.x = rect.position[0] - rect.size[0];
-        }
-        if(this.renderedFrame.rect.y != rect.position[1] - rect.size[1]){
-            this.shape.setAttribute('y',rect.position[1] - rect.size[1]/2);
-            this.renderedFrame.rect.y = rect.position[1] - rect.size[1];
-        }
+    var i, len = elements.length;
+    for(i=0;i<len;i+=1){
+        elements[i].setAttribute('rx',ellipseAttrs.roundness);
+        elements[i].setAttribute('ry',ellipseAttrs.roundness);
+        elements[i].setAttribute('width',ellipseAttrs.size[0]);
+        elements[i].setAttribute('height',ellipseAttrs.size[1]);
+        elements[i].setAttribute('x',ellipseAttrs.position[0] - ellipseAttrs.size[0]/2);
+        elements[i].setAttribute('y',ellipseAttrs.position[1] - ellipseAttrs.size[1]/2);
+        //elements[i].setAttribute('transform','matrix('+matrix.props.join(',')+')');
     }
 };
 
@@ -308,7 +258,7 @@
 
 ShapeItemElement.prototype.renderTrim = function(num){
     var trimData = this.currentData.trim;
-    if(this.pathLength == 0){
+    if(this.pathLength === 0){
         this.shape.setAttribute('stroke-opacity',0);
     }else{
         if(this.renderedFrame.trim.e == trimData.e && this.renderedFrame.trim.s == trimData.s && this.renderedFrame.trim.o == trimData.o){
diff --git a/player/js/elements/TextElement.js b/player/js/elements/TextElement.js
index d3bfb3b..0b25e39 100644
--- a/player/js/elements/TextElement.js
+++ b/player/js/elements/TextElement.js
@@ -13,8 +13,7 @@
     textElement.setAttribute('y',this.data.textData.height - (this.data.textData.fontSize-this.data.textData.height)/2);
     this.svgElem.setAttribute('width',this.data.textData.width);
     this.svgElem.setAttribute('height',this.data.textData.height);
-    this.svgElem.style['transform']='translate(' + this.data.textData.xOffset+"px," + this.data.textData.yOffset+"px)";
-    this.svgElem.style['-webkit-transform']='translate(' + this.data.textData.xOffset+"px," + this.data.textData.yOffset+"px)";
+    this.svgElem.style.transform=this.svgElem.style.webkitTransform='translate(' + this.data.textData.xOffset+"px," + this.data.textData.yOffset+"px)";
     textElement.setAttribute('font-size', this.data.textData.fontSize);
     textElement.setAttribute('font-family', "Arial, sans-serif");
     this.svgElem.appendChild(textElement);
diff --git a/player/js/elements/canvasElements/CVBaseElement.js b/player/js/elements/canvasElements/CVBaseElement.js
index 5cd62df..44ba585 100644
--- a/player/js/elements/canvasElements/CVBaseElement.js
+++ b/player/js/elements/canvasElements/CVBaseElement.js
@@ -4,7 +4,7 @@
     this.currentAnimData = null;
     this.renderFrame = false;
     this.init();
-};
+}
 
 CVBaseElement.prototype.init = function(){
     this.createElements();
diff --git a/player/js/elements/canvasElements/CVMaskElement.js b/player/js/elements/canvasElements/CVMaskElement.js
index 7de209f..d79f7a0 100644
--- a/player/js/elements/canvasElements/CVMaskElement.js
+++ b/player/js/elements/canvasElements/CVMaskElement.js
@@ -37,4 +37,4 @@
 
 CVMaskElement.prototype.createInvertedMask = function(){
 
-}
\ No newline at end of file
+};
\ No newline at end of file
diff --git a/player/js/elements/canvasElements/CVShapeItemElement.js b/player/js/elements/canvasElements/CVShapeItemElement.js
index b9c4373..1a382bc 100644
--- a/player/js/elements/canvasElements/CVShapeItemElement.js
+++ b/player/js/elements/canvasElements/CVShapeItemElement.js
@@ -5,10 +5,8 @@
     this.trims = [];
     this.dataLength = this.data.length;
     this.mainFlag = mainFlag;
-    this.currentPath = null;
     this.stylesList = [];
     this.ownStylesList = [];
-    this.pathsList = [];
     this.currentMatrix = document.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGMatrix();
     var i,len=this.dataLength;
     this.renderedPaths = [];
@@ -19,31 +17,6 @@
     }
 }
 
-CVShapeItemElement.prototype.getCurrentPath = function(){
-    if(!this.currentPath){
-        this.currentPath = new Path2D();
-        this.pathsList.push(this.currentPath);
-    }
-    return this.currentPath;
-};
-
-CVShapeItemElement.prototype.checkDrawing = function(){
-    var i, len = this.stylesList.length;
-    for(i=0;i<len;i+=1){
-        if((this.stylesList[i].type == 'stroke' || this.stylesList[i].type == 'fill') && this.stylesList[i].context == this){
-            this.stylesList[i].paths.push(this.currentPath);
-        }
-        /*if(this.stylesList[i].type == 'stroke'){
-            this.renderer.canvasContext.strokeStyle=this.stylesList[i].value;
-            this.renderer.canvasContext.stroke(this.currentPath);
-        }else{
-            this.renderer.canvasContext.fillStyle=this.stylesList[i].value;
-            this.renderer.canvasContext.fill(this.currentPath);
-        }*/
-    }
-    this.currentPath = null;
-};
-
 CVShapeItemElement.prototype.drawPaths = function(){
     var i, len = this.stylesList.length;
     for(i=0;i<len;i+=1){
@@ -139,47 +112,6 @@
     mat.f = matrixValue[5];
     mat = mat.translate(-tr.a[0],-tr.a[1]);
     this.currentMatrix = this.currentMatrix.multiply(mat);
-    return;
-
-
-
-
-    var dataOb;
-    if(matrixValue[0] !== 1 || matrixValue[1] !== 0 || matrixValue[2] !== 0 || matrixValue[3] !== 1 || matrixValue[4] !== 0 || matrixValue[5] !== 0){
-        //ctx.save();
-        //ctx.transform(matrixValue[0], matrixValue[1], matrixValue[2], matrixValue[3], matrixValue[4], matrixValue[5]);
-        flag = true;
-        dataOb = {
-            type: 'transform',
-            matrix:matrixValue
-        };
-    }
-    if(tr.a[0] != 0 || tr.a[1] != 0){
-        if(!flag){
-            //ctx.save();
-            flag = true;
-            dataOb = {
-                type: 'transform'
-            };
-        }
-        dataOb.translate = tr.a;
-        //ctx.translate(-tr.a[0],-tr.a[1]);
-    }
-    if(tr.o < 1){
-        if(!flag){
-            //ctx.save();
-            dataOb = {
-                type: 'transform'
-            };
-            flag = true;
-        }
-        dataOb.alpha = tr.o;
-        //ctx.globalAlpha *= tr.o;
-    }
-    if(dataOb){
-        this.stylesList.push(dataOb);
-    }
-    return flag;
 };
 
 CVShapeItemElement.prototype.renderPath = function(data){
@@ -193,16 +125,12 @@
     var i,len = pathNodes.i.length;
     path2d.moveTo(pathNodes.v[0][0],pathNodes.v[0][1]);
     for(i=1;i<len;i+=1){
-        path2d.bezierCurveTo(pathNodes.o[i-1][0],pathNodes.o[i-1][1]
-            ,pathNodes.i[i][0],pathNodes.i[i][1]
-            ,pathNodes.v[i][0],pathNodes.v[i][1]);
+        path2d.bezierCurveTo(pathNodes.o[i-1][0],pathNodes.o[i-1][1],pathNodes.i[i][0],pathNodes.i[i][1],pathNodes.v[i][0],pathNodes.v[i][1]);
     }
     if(path.closed){
-        path2d.bezierCurveTo(pathNodes.o[i-1][0],pathNodes.o[i-1][1]
-        ,pathNodes.i[0][0],pathNodes.i[0][1]
-        ,pathNodes.v[0][0],pathNodes.v[0][1]);
+        path2d.bezierCurveTo(pathNodes.o[i-1][0],pathNodes.o[i-1][1],pathNodes.i[0][0],pathNodes.i[0][1],pathNodes.v[0][0],pathNodes.v[0][1]);
     }
-    var i, len = this.stylesList.length;
+    len = this.stylesList.length;
     for(i=0;i<len;i+=1){
         if(this.stylesList[i].open){
             this.stylesList[i].path.addPath(path2d, this.currentMatrix);
@@ -227,7 +155,7 @@
     var path2d = new Path2D();
     var rect = animData.renderedData[this.frameNum];
     var roundness = rect.roundness;
-    if(roundness == 0){
+    if(roundness === 0){
         path2d.rect(rect.position[0] - rect.size[0]/2,rect.position[1] - rect.size[1]/2,rect.size[0],rect.size[1]);
     }else{
         var x = rect.position[0] - rect.size[0]/2;
@@ -271,7 +199,7 @@
                 value:fillColorToString(fill.color, fill.opacity),
                 path: new Path2D(),
                 open: true
-            })
+            });
         }else{
             ///this.renderer.canvasContext.fillStyle='rgba('+fill.color.join(',')+')';
             //this.renderer.canvasContext.fillStyle=fillColorToString(fill.color);
@@ -280,7 +208,7 @@
                 value:fillColorToString(fill.color),
                 path: new Path2D(),
                 open: true
-            })
+            });
         }
         this.ownStylesList.push(this.stylesList[this.stylesList.length -1]);
         return;
@@ -425,16 +353,14 @@
                 }
                 if(this.trims[k].s >= addedLength && this.trims[k].s < addedLength + nextPt.partialLength){
                     perc = ( this.trims[k].s - addedLength)/nextPt.partialLength;
-                    path2d.moveTo(currentPt.point[0]+(nextPt.point[0] - currentPt.point[0])*perc
-                        ,currentPt.point[1]+(nextPt.point[1] - currentPt.point[1])*perc);
+                    path2d.moveTo(currentPt.point[0]+(nextPt.point[0] - currentPt.point[0])*perc,currentPt.point[1]+(nextPt.point[1] - currentPt.point[1])*perc);
                 }
                 if(this.trims[k].e > addedLength && this.trims[k].e <= addedLength + nextPt.partialLength){
                     perc = ( this.trims[k].e - addedLength)/nextPt.partialLength;
-                    path2d.lineTo(currentPt.point[0]+(nextPt.point[0] - currentPt.point[0])*perc
-                        ,currentPt.point[1]+(nextPt.point[1] - currentPt.point[1])*perc);
+                    path2d.lineTo(currentPt.point[0]+(nextPt.point[0] - currentPt.point[0])*perc,currentPt.point[1]+(nextPt.point[1] - currentPt.point[1])*perc);
                     endedCount -= 1;
                     this.trims[k].ended = true;
-                    if(endedCount == 0){
+                    if(endedCount === 0){
                         ended = true;
                         break;
                     }
diff --git a/player/js/elements/canvasElements/CVTextElement.js b/player/js/elements/canvasElements/CVTextElement.js
index 082b51a..c42b51e 100644
--- a/player/js/elements/canvasElements/CVTextElement.js
+++ b/player/js/elements/canvasElements/CVTextElement.js
@@ -13,8 +13,7 @@
     textElement.setAttribute('y',this.data.textData.height - (this.data.textData.fontSize-this.data.textData.height)/2);
     this.svgElem.setAttribute('width',this.data.textData.width);
     this.svgElem.setAttribute('height',this.data.textData.height);
-    this.svgElem.style['transform']='translate(' + this.data.textData.xOffset+"px," + this.data.textData.yOffset+"px)";
-    this.svgElem.style['-webkit-transform']='translate(' + this.data.textData.xOffset+"px," + this.data.textData.yOffset+"px)";
+    this.svgElem.style.transform=this.svgElem.style.webkitTransform='translate(' + this.data.textData.xOffset+"px," + this.data.textData.yOffset+"px)";
     textElement.setAttribute('font-size', this.data.textData.fontSize);
     textElement.setAttribute('font-family', "Arial, sans-serif");
     this.svgElem.appendChild(textElement);
diff --git a/player/js/renderers/CanvasRenderer.js b/player/js/renderers/CanvasRenderer.js
index 3d391fb..adca800 100644
--- a/player/js/renderers/CanvasRenderer.js
+++ b/player/js/renderers/CanvasRenderer.js
@@ -27,7 +27,7 @@
             console.log('NO TYPE: ',layers[i]);
         }
     }
-}
+};
 
 CanvasRenderer.prototype.createBase = function (data) {
     data.element = new CVBaseElement(data, this);
@@ -73,14 +73,15 @@
 };
 
 CanvasRenderer.prototype.updateContainerSize = function () {
+    var elementWidth,elementHeight;
     if(this.animationItem.wrapper && this.animationItem.container){
-        var elementWidth = this.animationItem.wrapper.offsetWidth;
-        var elementHeight = this.animationItem.wrapper.offsetHeight;
+        elementWidth = this.animationItem.wrapper.offsetWidth;
+        elementHeight = this.animationItem.wrapper.offsetHeight;
         this.animationItem.container.setAttribute('width',elementWidth);
         this.animationItem.container.setAttribute('height',elementHeight);
     }else{
-        var elementWidth = this.canvasContext.canvas.width;
-        var elementHeight = this.canvasContext.canvas.height;
+        elementWidth = this.canvasContext.canvas.width;
+        elementHeight = this.canvasContext.canvas.height;
     }
     if(this.renderConfig.scaleMode == 'fit'){
         var elementRel = elementWidth/elementHeight;
@@ -123,7 +124,7 @@
     while (i < len) {
         if (layers[i].layerName == parentName) {
             threeItem.parentHierarchy.push(layers[i]);
-            if (layers[i].parent == undefined) {
+            if (layers[i].parent === undefined) {
             } else {
                 this.buildItemHierarchy(threeItem, layers, layers[i].parent);
             }
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index 291a476..a2a8f90 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -22,7 +22,7 @@
             console.log('NO TYPE: ',layers[i]);
         }
     }
-}
+};
 
 SVGRenderer.prototype.createShape = function (data) {
     data.element = new IShapeElement(data, this.animationItem);
@@ -110,7 +110,7 @@
         }
         i += 1;
     }
-}
+};
 
 SVGRenderer.prototype.updateContainerSize = function () {
 };
@@ -127,4 +127,4 @@
     for (i = 0; i < len; i++) {
         this.layers[i].element.renderFrame(num - this.layers[i].startTime);
     }
-}
\ No newline at end of file
+};
\ No newline at end of file
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index f2ed7f6..9132ee2 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -180,7 +180,7 @@
     function getInterpolatedValues(keyframes, frameCount, offsetTime){
         var i ,len;
         var valuesArray = [];
-        if(!(keyframes instanceof Array) || keyframes[0].t == null){
+        if(!(keyframes instanceof Array) || keyframes[0].t === null){
             valuesArray.push(keyframes);
             return valuesArray;
         }
@@ -190,52 +190,10 @@
         var propertyArray = [];
         var j, jLen;
         len = keyframes.length;
-        var perc;
-        var curveSegments = 1000;
-        var absToCoord = [];
-        var absTiCoord = [];
+        var perc,bezierData,k;
         for(i=0;i<len;i+=1){
             keyData = keyframes[i];
             keyData.t -= offsetTime;
-            if(keyData.to){
-                var k;
-                var triCoord1,triCoord2,triCoord3,liCoord1,liCoord2,ptCoord,perc,addedLength = 0;
-                var ptDistance;
-                var point,lastPoint = null;
-                var bezierData = {
-                    points :[],
-                    length: 0
-                };
-                for(k=0;k<curveSegments;k+=1){
-                    point = [];
-                    perc = k/(curveSegments-1);
-                    ptDistance = 0;
-                    absToCoord = [];
-                    absTiCoord = [];
-                    keyData.to.forEach(function(item,index){
-                        if(absToCoord[index] == null){
-                            absToCoord[index] = keyData.s[index] + keyData.to[index];
-                            absTiCoord[index] = keyData.e[index] + keyData.ti[index];
-                        }
-                        triCoord1 = keyData.s[index] + (absToCoord[index] - keyData.s[index])*perc;
-                        triCoord2 = absToCoord[index] + (absTiCoord[index] - absToCoord[index])*perc;
-                        triCoord3 = absTiCoord[index] + (keyData.e[index] - absTiCoord[index])*perc;
-                        liCoord1 = triCoord1 + (triCoord2 - triCoord1)*perc;
-                        liCoord2 = triCoord2 + (triCoord3 - triCoord2)*perc;
-                        ptCoord = liCoord1 + (liCoord2 - liCoord1)*perc;
-                        point.push(ptCoord);
-                        if(lastPoint !== null){
-                            ptDistance += Math.pow(point[index] - lastPoint[index],2);
-                        }
-                    });
-                    ptDistance = Math.sqrt(ptDistance);
-                    addedLength += ptDistance;
-                    bezierData.points.push({partialLength: addedLength, point: point});
-                    lastPoint = point;
-                    keyData.bezierData = bezierData;
-                }
-                bezierData.segmentLength = addedLength;
-            }
         }
         var lastFrameIndex = 0;
         var lastPointIndex = 0;
@@ -245,7 +203,7 @@
             while(count<len-1){
                 keyData = keyframes[count];
                 nextKeyData = keyframes[count+1];
-                if(i<keyData.t && count == 0){
+                if(i<keyData.t && count === 0){
                     jLen = keyData.s.length;
                     propertyArray = [];
                     for(j=0;j<jLen;j+=1){
@@ -262,12 +220,12 @@
                     propertyArray = [];
                     if(keyData.to){
                         perc = bez.getEasingCurve(keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y)('',i-keyData.t,0,1,nextKeyData.t-keyData.t);
-                        var bezierData = keyData.bezierData;
+                        bezierData = keyData.bezierData;
                         var distanceInLine = bezierData.segmentLength*perc;
-                        var k, kLen, segmentPerc;
+                        var kLen, segmentPerc;
                         j = lastPointIndex;
                         while(j<bezierData.points.length){
-                            if(i == 0 || distanceInLine == 0 || perc == 0){
+                            if(i === 0 || distanceInLine === 0 || perc === 0){
                                 propertyArray = bezierData.points[j].point;
                                 lastPointIndex = j;
                                 break;
@@ -347,7 +305,7 @@
                 }
                 count += 1;
             }
-            if(found == false){
+            if(found === false){
                 keyData = keyframes[keyframes.length - 2];
                 propertyArray = [];
                 keyData.e.forEach(function(item){
@@ -382,7 +340,7 @@
                 return [keyframes];
             }
             return keyframes;
-        }else if(keyframes[0].t == null){
+        }else if(keyframes[0].t === null){
             if(interpolatedParams.type == 'p'){
                 matrixParams.px = keyframes[0];
                 matrixParams.py = keyframes[1];
@@ -428,6 +386,7 @@
         if(interpolatedParams.type == 'default'){
             propertyArray = [];
         }
+        var fnc;
         if(keyData.to){
             bezierData = keyData.bezierData;
             if(frameNum >= nextKeyData.t-offsetTime){
@@ -453,7 +412,6 @@
                 }
                 return bezierData.points[0].point;
             }
-            var fnc;
             if(keyData.__fnct){
                 fnc = keyData.__fnct;
             }else{
@@ -470,7 +428,7 @@
             jLen = bezierData.points.length;
             while(flag){
                 addedLength +=bezierData.points[j].partialLength*dir;
-                if(distanceInLine == 0 || perc == 0){
+                if(distanceInLine === 0 || perc === 0){
                     if(interpolatedParams.type == 'p'){
                         matrixParams.px = bezierData.points[j].point[0];
                         matrixParams.py = bezierData.points[j].point[1];
@@ -541,7 +499,6 @@
                         inX = keyData.i.x;
                         inY = keyData.i.y;
                     }
-                    var fnc;
                     if(isArray){
                         if(keyData.__fnct[i]){
                             fnc = keyData.__fnct[i];
@@ -566,13 +523,13 @@
                 }
                 if(keyData.h === 1){
                     if(interpolatedParams.type == 'p'){
-                        if(i == 0){
+                        if(i === 0){
                             matrixParams.px = keyData.s[i];
                         }else if(i == 1){
                             matrixParams.py = keyData.s[i];
                         }
                     }else if(interpolatedParams.type == 's'){
-                        if(i == 0){
+                        if(i === 0){
                             matrixParams.sx = keyData.s[i];
                         }else if(i == 1){
                             matrixParams.sy = keyData.s[i];
@@ -584,13 +541,13 @@
                     }
                 }else{
                     if(interpolatedParams.type == 'p'){
-                        if(i == 0){
+                        if(i === 0){
                             matrixParams.px = keyData.s[i]+(keyData.e[i]-keyData.s[i])*perc;
                         }else if(i == 1){
                             matrixParams.py = keyData.s[i]+(keyData.e[i]-keyData.s[i])*perc;
                         }
                     }else if(interpolatedParams.type == 's'){
-                        if(i == 0){
+                        if(i === 0){
                             matrixParams.sx = keyData.s[i]+(keyData.e[i]-keyData.s[i])*perc;
                         }else if(i == 1){
                             matrixParams.sy = keyData.s[i]+(keyData.e[i]-keyData.s[i])*perc;
@@ -612,17 +569,16 @@
         var keyframes = isMask ? shapeData.pt : shapeData.ks;
         if(keyframes.v){
             if(renderType == 'svg'){
-                /*if(!keyframes.__pathString){
+                if(!keyframes.__pathString){
                     keyframes.__pathString = createPathString(keyframes,pathData.closed);
                 }
-                pathData.pathString = keyframes.__pathString;*/
-                pathData.pathNodes = keyframes;
+                pathData.pathString = keyframes.__pathString;
             }else{
                 pathData.pathNodes = keyframes;
             }
             return pathData;
         }else{
-            var shapeData = {
+            shapeData = {
                 i: [],
                 o: [],
                 v: []
@@ -647,17 +603,17 @@
                     shapeData.v.push(coordsVData);
                 }
                 propertyArray.push(shapeData);
-                /*if(renderType == 'svg'){
+                if(renderType == 'svg'){
                     if(!keyframes.__minValue){
                         keyframes.__minValue = createPathString(propertyArray,pathData.closed);
                     }
                     pathData.pathString = keyframes.__minValue;
-                }else{*/
+                }else{
                     if(!keyframes.__minValue){
                         keyframes.__minValue = propertyArray;
                     }
                     pathData.pathNodes = keyframes.__minValue;
-                //}
+                }
                 return pathData;
             }else if(frameNum > keyframes[keyframes.length - 1].t-offsetTime){
                 var pos = keyframes.length - 2;
@@ -677,17 +633,17 @@
                     shapeData.v.push(coordsVData);
                 }
                 propertyArray.push(shapeData);
-                /*if(renderType == 'svg'){
+                if(renderType == 'svg'){
                     if(!keyframes.__maxValue){
                         keyframes.__maxValue = createPathString(propertyArray,pathData.closed);
                     }
                     pathData.pathString = keyframes.__maxValue;
-                }else{*/
+                }else{
                     if(!keyframes.__maxValue){
                         keyframes.__maxValue = propertyArray;
                     }
                     pathData.pathNodes = keyframes.__maxValue;
-                //}
+                }
                 return pathData;
             }else{
                 var i = 0;
@@ -886,113 +842,6 @@
                 for(i=0;i<len;i+=1){
                     iterateShape(item.shapes[i],offsettedFrameNum,item.startTime,renderType);
                 }
-                    /*shapeItem.renderedData[offsettedFrameNum] = shapeData;
-                    if(!shapeItem._created){
-                        shapeItem.an.tr = [];
-                        shapeItem.an.renderedFrame = {};
-                        if(shapeItem.ks){
-                            shapeItem.an.path = [];
-                        }else if(shapeItem.el){
-                            shapeItem.an.ell = [];
-                        }else if(shapeItem.rc){
-                            shapeItem.an.rect = [];
-                        }
-                        if(shapeItem.fl){
-                            shapeItem.an.fill = [];
-                        }
-                        if(shapeItem.st){
-                            shapeItem.an.stroke = [];
-                        }
-                    }
-                    if(shapeItem.trim && (!shapeItem._created)){
-                        shapeItem.trim.an = [];
-                    }
-                    if(shapeItem.fl){
-                        fillColor = getInterpolatedValue(shapeItem.fl.c,offsettedFrameNum, item.startTime,interpolatedParams);
-                        fillOpacity = getInterpolatedValue(shapeItem.fl.o,offsettedFrameNum, item.startTime,interpolatedParams);
-                        shapeData.fill = {
-                            opacity : fillOpacity instanceof Array ? fillOpacity[0] : fillOpacity
-                        };
-                        if(renderType == 'canvas'){
-                            roundColor(fillColor);
-                            shapeData.fill.color = fillColor;
-                        }else{
-                            shapeData.fill.color = rgbToHex(Math.round(fillColor[0]),Math.round(fillColor[1]),Math.round(fillColor[2]));
-                        }
-                    }
-                    if(shapeItem.ks){
-                        shapeData.path = interpolateShape(shapeItem,offsettedFrameNum, item.startTime,renderType);
-                    }else if(shapeItem.el){
-                        elmPos = getInterpolatedValue(shapeItem.el.p,offsettedFrameNum, item.startTime,interpolatedParams);
-                        elmSize = getInterpolatedValue(shapeItem.el.s,offsettedFrameNum, item.startTime,interpolatedParams);
-                        shapeData.ell = {
-                            p : elmPos,
-                            size : elmSize
-                        };
-                    }else if(shapeItem.rc){
-                        elmPos = getInterpolatedValue(shapeItem.rc.p,offsettedFrameNum, item.startTime,interpolatedParams);
-                        elmSize = getInterpolatedValue(shapeItem.rc.s,offsettedFrameNum, item.startTime,interpolatedParams);
-                        elmRound = getInterpolatedValue(shapeItem.rc.r,offsettedFrameNum, item.startTime,interpolatedParams);
-                        shapeData.rect = {
-                            position : elmPos,
-                            size : elmSize,
-                            roundness : elmRound
-                        };
-                    }
-                    if(shapeItem.st){
-                        strokeColor = getInterpolatedValue(shapeItem.st.c,offsettedFrameNum, item.startTime,interpolatedParams);
-                        strokeOpacity = getInterpolatedValue(shapeItem.st.o,offsettedFrameNum, item.startTime,interpolatedParams);
-                        strokeWidth = getInterpolatedValue(shapeItem.st.w,offsettedFrameNum, item.startTime,interpolatedParams);
-                        shapeData.stroke = {
-                            opacity : strokeOpacity instanceof Array ? strokeOpacity[0] : strokeOpacity,
-                            width : strokeWidth instanceof Array ? strokeWidth[0] : strokeWidth
-                        };
-                        if(renderType == 'canvas'){
-                            roundColor(strokeColor);
-                            shapeData.stroke.color = strokeColor;
-                        }else{
-                            shapeData.stroke.color = rgbToHex(Math.round(strokeColor[0]),Math.round(strokeColor[1]),Math.round(strokeColor[2]));
-                        }
-                    }
-                    shapeTrOb = {};
-                    shapeTrOb.a = getInterpolatedValue(shapeItem.tr.a,offsettedFrameNum, item.startTime,interpolatedParams);
-                    shapeTrOb.o = getInterpolatedValue(shapeItem.tr.o,offsettedFrameNum, item.startTime,interpolatedParams);
-                    interpolatedParams.arrayFlag = true;
-                    interpolatedParams.type = 's';
-                    getInterpolatedValue(shapeItem.tr.s,offsettedFrameNum, item.startTime,interpolatedParams);
-                    interpolatedParams.arrayFlag = true;
-                    interpolatedParams.type = 'r';
-                    getInterpolatedValue(shapeItem.tr.r,offsettedFrameNum, item.startTime,interpolatedParams);
-                    interpolatedParams.arrayFlag = false;
-                    interpolatedParams.type = 'p';
-                    getInterpolatedValue(shapeItem.tr.p,offsettedFrameNum, item.startTime,interpolatedParams);
-                    interpolatedParams.arrayFlag = false;
-                    interpolatedParams.type = 'default';
-                    //console.log('frameNum: ',frameNum);
-                    //console.log('matrixParams.sx: ',matrixParams.sx);
-                    //console.log('matrixParams.sy: ',matrixParams.sy);
-                    if(renderType == 'canvas'){
-                        shapeTrOb.mtArr = matrixInstance.getMatrixArrayFromParams(matrixParams.r,matrixParams.sx,matrixParams.sy,matrixParams.px,matrixParams.py);
-                    }else{
-                        shapeTrOb.mt = matrixInstance.getMatrix2FromParams(matrixParams.r,matrixParams.sx,matrixParams.sy,matrixParams.px,matrixParams.py);
-                    }
-                    shapeItem.an.tr[offsettedFrameNum] = shapeTrOb;
-                    shapeData.tr = shapeTrOb;
-
-                    if(shapeItem.trim){
-                        var trimS = getInterpolatedValue(shapeItem.trim.s,offsettedFrameNum, item.startTime,interpolatedParams);
-                        var trimE = getInterpolatedValue(shapeItem.trim.e,offsettedFrameNum, item.startTime,interpolatedParams);
-                        var trimO = getInterpolatedValue(shapeItem.trim.o,offsettedFrameNum, item.startTime,interpolatedParams);
-                        shapeData.trim = {
-                            s: trimS,
-                            e: trimE,
-                            o: trimO
-                        }
-                    }
-                    if(!shapeItem._created){
-                        shapeItem._created = true;
-                    }
-                }*/
             }
         }
     }
@@ -1009,7 +858,7 @@
             if(shapeItem.ty == 'sh'){
                 shapeItem.renderedData[offsettedFrameNum] = {
                     path: interpolateShape(shapeItem,offsettedFrameNum, startTime,renderType)
-                }
+                };
             }else if(shapeItem.ty == 'fl'){
                 fillColor = getInterpolatedValue(shapeItem.c,offsettedFrameNum, startTime,interpolatedParams);
                 fillOpacity = getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime,interpolatedParams);
@@ -1056,7 +905,7 @@
                 shapeItem.renderedData[offsettedFrameNum] = {
                     a : getInterpolatedValue(shapeItem.a,offsettedFrameNum, startTime,interpolatedParams),
                     o : getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime,interpolatedParams)
-                }
+                };
                 interpolatedParams.arrayFlag = true;
                 interpolatedParams.type = 's';
                 getInterpolatedValue(shapeItem.s,offsettedFrameNum, startTime,interpolatedParams);
@@ -1085,7 +934,7 @@
                     s: trimS,
                     e: trimE,
                     o: trimO
-                }
+                };
             }else if(shapeItem.ty == 'gr'){
                 iterateShape(shapeItem.it,offsettedFrameNum,startTime,renderType);
             }
@@ -1130,7 +979,7 @@
         var offsettedFrameNum, timeRemapped;
         var shapes;
         for(i=0;i<len;i+=1){
-            if(rendered[i] == ''){
+            if(rendered[i] === ''){
                 continue;
             }
             offsettedFrameNum = num - layers[i].startTime;
@@ -1153,7 +1002,7 @@
         var i, len = animationData.animation.totalFrames;
         var renderedFrames = [];
         for(i=0;i<len;i+=1){
-            renderedFrames.push({num:i,data:renderFrame(id,i)})
+            renderedFrames.push({num:i,data:renderFrame(id,i)});
         }
     }
 
@@ -1163,6 +1012,6 @@
     moduleOb.renderAllFrames = renderAllFrames;
 
     return moduleOb;
-};
+}
 
 var dataManager = dataFunctionManager();
\ No newline at end of file
diff --git a/player/js/utils/MatrixManager.js b/player/js/utils/MatrixManager.js
index fd440d5..5c60dbb 100644
--- a/player/js/utils/MatrixManager.js
+++ b/player/js/utils/MatrixManager.js
@@ -92,38 +92,26 @@
     };
 
     var get2DMatrix = function(animData){
-        return returnMatrix2D(animData.r
-            ,animData.s[0],animData.s[1]
-            ,animData.p[0],animData.p[1]);
+        return returnMatrix2D(animData.r,animData.s[0],animData.s[1],animData.p[0],animData.p[1]);
     };
 
     var getMatrix = function(animData, isThreeD){
         if(!isThreeD){
-            return returnMatrix2D(animData.tr.r[2]
-                ,animData.tr.s[0],animData.tr.s[1]
-                ,animData.tr.p[0],animData.tr.p[1]);
+            return returnMatrix2D(animData.tr.r[2],animData.tr.s[0],animData.tr.s[1],animData.tr.p[0],animData.tr.p[1]);
         }
-        return returnMatrix3D(-animData.tr.r[0],animData.tr.r[1],animData.tr.r[2]
-            ,animData.tr.s[0],animData.tr.s[1],animData.tr.s[2]
-            ,animData.tr.p[0],animData.tr.p[1],animData.tr.p[2])
+        return returnMatrix3D(-animData.tr.r[0],animData.tr.r[1],animData.tr.r[2],animData.tr.s[0],animData.tr.s[1],animData.tr.s[2],animData.tr.p[0],animData.tr.p[1],animData.tr.p[2]);
     };
 
     var getMatrix2 = function(animData, isThreeD){
         if(!isThreeD){
-            return returnMatrix2D(animData.r[2]
-                ,animData.s[0],animData.s[1]
-                ,animData.p[0],animData.p[1]);
+            return returnMatrix2D(animData.r[2],animData.s[0],animData.s[1],animData.p[0],animData.p[1]);
         }
-        return returnMatrix3D(-animData.r[0],animData.r[1],animData.r[2]
-            ,animData.s[0],animData.s[1],animData.s[2]
-            ,animData.p[0],animData.p[1],animData.p[2])
+        return returnMatrix3D(-animData.r[0],animData.r[1],animData.r[2],animData.s[0],animData.s[1],animData.s[2],animData.p[0],animData.p[1],animData.p[2]);
     };
 
     var getMatrixArray = function(animData, isThreeD){
         if(!isThreeD){
-            return returnMatrix2DArray(animData.r[2]
-                ,animData.s[0],animData.s[1]
-                ,animData.p[0],animData.p[1]);
+            return returnMatrix2DArray(animData.r[2],animData.s[0],animData.s[1],animData.p[0],animData.p[1]);
         }
         return null;
     };
@@ -135,7 +123,7 @@
         getMatrixArray : getMatrixArray,
         getMatrixArrayFromParams : returnMatrix2DArray,
         getMatrix2FromParams : returnMatrix2D
-    }
+    };
 
-};
+}
 var MatrixManager = matrixManagerFunction;
\ No newline at end of file
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
index 6dd35e0..ab43677 100644
--- a/player/js/utils/bez.js
+++ b/player/js/utils/bez.js
@@ -24,7 +24,8 @@
         var A1, B1, C1;
         easingFunctions[encodedFuncName] = function(x, t, b, c, d) {
             var tt = t/d;
-            var x = tt, i = 0, z;
+            x = tt;
+            var i = 0, z;
             while (++i < 14) {
                 C0 = 3 * aa;
                 B0 = 3 * (cc - aa) - C0;
@@ -58,8 +59,7 @@
             points :[],
             segmentLength: 0
         };
-        if(pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt3[0],pt3[1])
-            && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt4[0],pt4[1])){
+        if(pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt3[0],pt3[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt4[0],pt4[1])){
             curveSegments = 2;
         }
         len = pt3.length;
@@ -104,8 +104,7 @@
             points :[],
             segmentLength: 0
         };
-        if(pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt1[0]+pt3[0],pt1[1]+pt3[1])
-            && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt2[0]+pt4[0],pt2[1]+pt4[1])){
+        if(pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt1[0]+pt3[0],pt1[1]+pt3[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt2[0]+pt4[0],pt2[1]+pt4[1])){
             curveSegments = 2;
         }
         len = pt3.length;
@@ -142,6 +141,6 @@
     };
 
     return ob;
-};
+}
 
 var bez = bezFunction();
\ No newline at end of file
diff --git a/player/js/utils/common.js b/player/js/utils/common.js
index 37a9739..7dbaf74 100644
--- a/player/js/utils/common.js
+++ b/player/js/utils/common.js
@@ -70,13 +70,13 @@
             colorMap[colorArr[0]][colorArr[1]] = [];
         }
         if(!colorMap[colorArr[0]][colorArr[1]][colorArr[2]]){
-            if(alpha != undefined){
+            if(alpha !== undefined){
                 colorArr[3] = alpha;
             }
             colorMap[colorArr[0]][colorArr[1]][colorArr[2]] = 'rgba('+colorArr.join(',')+')';
         }
         return colorMap[colorArr[0]][colorArr[1]][colorArr[2]];
-    }
+    };
 }());
 
 function createColorMap(){
diff --git a/player/js/utils/functionExtensions.js b/player/js/utils/functionExtensions.js
index 7fef705..14aabd5 100644
--- a/player/js/utils/functionExtensions.js
+++ b/player/js/utils/functionExtensions.js
@@ -37,8 +37,8 @@
     var accessor = {
         enumerable : false,
         configurable : false,
-        get: function(){return value},
-        set: function(val){value = val}
+        get: function(){return value;},
+        set: function(val){value = val;}
     };
     if(params){
         for( var s in params){
