diff --git a/player/index.html b/player/index.html
index a131b05..b70253a 100644
--- a/player/index.html
+++ b/player/index.html
@@ -2,6 +2,7 @@
 <meta charset="UTF-8">
 <head>
     <!-- build:js bodymovin.js -->
+    <script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
     <script src="js/main.js"></script>
     <script src="js/3rd_party/transformation-matrix.js"></script>
     <script src="js/utils/MatrixManager.js"></script>
@@ -35,6 +36,40 @@
     <!-- endbuild -->
 </head>
 <body style="background-color:#666; margin: 0px;height: 100%; font-family: sans-serif;font-size: 10px">
-<div style="width:510px;height:676px;background-color:#000" class="bodymovin" data-bm-path="exports/mcangel" data-bm-type="canvas" data-bm-loop="true" data-bm-prerender="true"></div>
+<div style="width:510px;height:676px;background-color:#000" class="bodymovin" data-bm-path="exports/mcangel" data-bm-type="svg" data-bm-loop="true" data-bm-prerender="true"></div>
+<script>
+    var pathsArray = [];
+    var uniquePaths = [];
+    var nanCount = 0;
+    function getUniquePaths(){
+        $.each(pathsArray, function(i, el){
+            if($.inArray(el, uniquePaths) === -1) uniquePaths.push(el);
+        });
+    }
+
+    function count() {
+        pathsArray.sort();
+
+        var current = null;
+        var cnt = 0;
+        for (var i = 0; i < pathsArray.length; i++) {
+            if (pathsArray[i] != current) {
+                if (cnt > 1) {
+                    document.write(current + ' comes --> ' + cnt + ' times<br>');
+                    //document.write(cnt + ' times<br>');
+                }
+                current = pathsArray[i];
+                cnt = 1;
+            } else {
+                cnt++;
+            }
+        }
+        if (cnt > 0) {
+            document.write(current + ' comes --> ' + cnt + ' times');
+            //document.write(cnt + ' times');
+        }
+
+    }
+</script>
 </body>
 </html>
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index 8799ea3..d6b09e9 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -628,6 +628,53 @@
         return propertyArray;
     }
 
+    function interpolateShape(shapeData, frameNum, offsetTime, renderType){
+        var pathData = {};
+        pathData.closed = shapeData.closed;
+        var keyframes = shapeData.ks;
+        if(keyframes['v']){
+            if(renderType == 'svg'){
+                if(!keyframes.__pathString){
+                    keyframes.__pathString = createPathString(keyframes,pathData.closed);
+                }
+                pathData.pathString = keyframes.__pathString;
+            }
+            pathData.pathNodes = keyframes;
+            return pathData;
+        }else{
+            if(frameNum < keyframes[0].t-offsetTime){
+                var shapeData = {
+                    i: [],
+                    o: [],
+                    v: []
+                };
+                var jLen = keyframes[0].s[0].i.length;
+                for(j=0;j<jLen;j+=1){
+                    var coordsIData = [];
+                    var coordsOData = [];
+                    var coordsVData = [];
+                    kLen = keyData.s[i].i[j].length;
+                    for(k=0;k<kLen;k+=1){
+                        if(keyData.h === 1){
+                            coordsIData.push(keyData.s[i].i[j][k]);
+                            coordsOData.push(keyData.s[i].o[j][k]);
+                            coordsVData.push(keyData.s[i].v[j][k]);
+                        }else{
+                            coordsIData.push(keyData.s[i].i[j][k]+(keyData.e[i].i[j][k]-keyData.s[i].i[j][k])*perc);
+                            coordsOData.push(keyData.s[i].o[j][k]+(keyData.e[i].o[j][k]-keyData.s[i].o[j][k])*perc);
+                            coordsVData.push(keyData.s[i].v[j][k]+(keyData.e[i].v[j][k]-keyData.s[i].v[j][k])*perc);
+                        }
+                    }
+                    shapeData.i.push(coordsIData);
+                    shapeData.o.push(coordsOData);
+                    shapeData.v.push(coordsVData);
+                }
+            }
+            return false;
+        }
+
+    }
+
     function createPathString(paths,closed){
         var pathV,pathO,pathI;
         var pathString = '';
@@ -664,6 +711,7 @@
                 pathString += " C"+pathO[k-1].join(',') + " "+pathI[0].join(',') + " "+pathV[0].join(',');
             }
         }
+        pathsArray.push(pathString);
         return pathString;
     }
 
@@ -736,11 +784,12 @@
                     maskProps[i].opacity[offsettedFrameNum] = maskProps[i].opacity[offsettedFrameNum] instanceof Array ? maskProps[i].opacity[offsettedFrameNum][0]/100 : maskProps[i].opacity[offsettedFrameNum]/100;
                 }
             }
+            if((frameNum < item.inPoint || frameNum > item.outPoint)){
+               continue;
+            }
             if(item.type == 'PreCompLayer'){
-                if(!(frameNum < item.inPoint || frameNum > item.outPoint)){
-                    timeRemapped = item.tm ? item.tm[offsettedFrameNum] < 0 ? 0 : item.tm[offsettedFrameNum] : offsettedFrameNum;
-                    iterateLayers(item.layers,timeRemapped,renderType);
-                }
+                timeRemapped = item.tm ? item.tm[offsettedFrameNum] < 0 ? 0 : item.tm[offsettedFrameNum] : offsettedFrameNum;
+                iterateLayers(item.layers,timeRemapped,renderType);
             }else if(item.type == 'ShapeLayer'){
                 len = item.shapes.length;
                 for(i=0;i<len;i+=1){
@@ -781,13 +830,16 @@
                         }
                     }
                     if(shapeItem.ks){
-                        shape = getInterpolatedValue(shapeItem.ks,offsettedFrameNum, item.startTime,interpolatedParams);
-                        shapeData.path = {
-                            pathNodes: shape,
-                            closed: shapeItem.closed
-                        };
-                        if(renderType == 'svg'){
-                            shapeData.path.pathString = createPathString(shape,shapeItem.closed);
+                        shapeData.path = interpolateShape(shapeItem,offsettedFrameNum, item.startTime,renderType);
+                        if(shapeData.path == false){
+                            shape = getInterpolatedValue(shapeItem.ks,offsettedFrameNum, item.startTime,interpolatedParams);
+                            shapeData.path = {
+                                pathNodes: shape,
+                                closed: shapeItem.closed
+                            };
+                            if(renderType == 'svg'){
+                                shapeData.path.pathString = createPathString(shape,shapeItem.closed);
+                            }
                         }
                     }else if(shapeItem.el){
                         elmPos = getInterpolatedValue(shapeItem.el.p,offsettedFrameNum, item.startTime,interpolatedParams);
