diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..2dd0dbf
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,22 @@
+<!--
+    This template is for bug reports. If you are reporting a bug, please answer all the questions below.
+    If you are here for another reason (feature request, question, etc) please delete this template before continuing.
+
+    Note that leaving sections blank will make it difficult for us to troubleshoot bugs, causing delays in our response,
+    or result in closing this issue.
+
+    Please include screenshots where applicable.
+-->
+
+**Tell us about your environment**
+
+* **Browser and Browser Version:**
+* **After Effects Version:**
+
+**What did you do? Please explain the steps you took before you encountered the problem.**
+
+**What did you expect to happen?**
+
+**What actually happened? Please include as much _relevant_ detail as possible.**
+
+**Please provide a download link to the After Effects file that demonstrates the problem.**
diff --git a/History.md b/History.md
index 1783afd..5de151f 100644
--- a/History.md
+++ b/History.md
@@ -1,3 +1,20 @@
+## V 4.8.0
+- Fonts fix for Lottie compatibility
+- fonts reduced exported filesize
+- fonts fix for non-zero width character
+- expressions transform separate dimensions fix
+- expression shape rectangle size support
+
+## V 4.7.1
+- still images validation fix
+- expression for transform on separate dimensions fix
+
+## V 4.7.0
+- hiding elements when opacity is at 0
+- colinear points fix
+- anchor point expression fix
+- server side rendering window object validation (thanks @zephinzer)
+
 ## V 4.6.11
 - Non spatial interpolation fix
 - new expressions supported
diff --git a/README.md b/README.md
index d30a410..88ddded 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,28 @@
 # bodymovin
-After Effects plugin for exporting animations to svg/canvas/html + js
+After Effects plugin for exporting animations to svg/canvas/html + js or natively on Android and iOS through [Lottie](https://github.com/airbnb/lottie-android)  
+
+## V 4.8.0
+- Fonts fix for Lottie compatibility
+- fonts reduced exported filesize
+- fonts fix for non-zero width character
+- expressions transform separate dimensions fix
+- expression shape rectangle size support
+
+## V 4.7.1
+- still images validation fix
+- expression for transform on separate dimensions fix
+
+## V 4.7.0
+- hiding elements when opacity is at 0
+- colinear points fix
+- anchor point expression fix
+- server side rendering window object validation (thanks @zephinzer)
 
 ## V 4.6.11
 - Non spatial interpolation fix
 - new expressions supported
 - fonts fix
 
-## V 4.6.10
-- AE language export fix
-- nearestKey expression fix
-
 # Plugin installation
 
 ### Option 1 (Recommended):
@@ -58,8 +71,12 @@
 - Go to Edit > Preferences > General > and check on "Allow Scripts to Write Files and Access Network"
 
 # HTML player installation
-```node
+```bash
+# with npm
 npm install bodymovin
+
+# with bower
+bower install bodymovin
 ```  
 Or you can use the script file from here:  
 https://cdnjs.com/libraries/bodymovin  
@@ -166,7 +183,9 @@
   rendererSettings: {
     context: canvasContext, // the canvas context
     scaleMode: 'noScale',
-    clearCanvas: false
+    clearCanvas: false,
+    progressiveLoad: false, // Boolean, only svg renderer, loads dom elements when needed. Might speed up initialization for large number of elements.
+    hideOnTransparent: true //Boolean, only svg renderer, hides elements when opacity reaches 0 (defaults to true)
   }
 });
 ```
diff --git a/bower.json b/bower.json
new file mode 100644
index 0000000..d3809e9
--- /dev/null
+++ b/bower.json
@@ -0,0 +1,31 @@
+{
+  "name": "bodymovin",
+  "description": "After Effects plugin for exporting animations to SVG + JavaScript or canvas + JavaScript",
+  "main": "./build/player/bodymovin.js",
+  "authors": [
+    "hernan <bodymovin@users.noreply.github.com>"
+  ],
+  "license": "MIT",
+  "keywords": [
+    "animation",
+    "canvas",
+    "svg",
+    "after",
+    "effects",
+    "plugin",
+    "export"
+  ],
+  "homepage": "https://github.com/bodymovin/bodymovin",
+  "ignore": [
+    "**/.*",
+    "bower_components",
+    "node_modules",
+    "player/",
+    "test",
+    "tests"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/bodymovin/bodymovin.git"
+  }
+}
diff --git a/build/extension/bodymovin.zxp b/build/extension/bodymovin.zxp
index 539c4c0..8dfc217 100644
--- a/build/extension/bodymovin.zxp
+++ b/build/extension/bodymovin.zxp
Binary files differ
diff --git a/build/player/bodymovin.js b/build/player/bodymovin.js
index 1599e5c..f54e5ab 100644
--- a/build/player/bodymovin.js
+++ b/build/player/bodymovin.js
@@ -1,4 +1,4 @@
-(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {var svgNS = "http://www.w3.org/2000/svg";
+var window=(typeof window === "undefined")?{}:window;(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {var svgNS = "http://www.w3.org/2000/svg";
 var subframeEnabled = true;
 var expressionsPlugin;
 var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -521,6 +521,7 @@
                 this.props[14] = this.props[12] * c2 + this.props[13] * g2 + this.props[14] * k2 + this.props[15] * o2 ;
                 this.props[15] = this.props[12] * d2 + this.props[13] * h2 + this.props[14] * l2 + this.props[15] * p2 ;
             }
+            this._identityCalculated = false;
             return this;
         }
 
@@ -566,9 +567,21 @@
         this.props[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2 ;
         this.props[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2 ;
 
+        this._identityCalculated = false;
         return this;
     }
 
+    function isIdentity() {
+        if(!this._identityCalculated){
+            this._identity = !(this.props[0] !== 1 || this.props[1] !== 0 || this.props[2] !== 0 || this.props[3] !== 0
+                || this.props[4] !== 0 || this.props[5] !== 1 || this.props[6] !== 0 || this.props[7] !== 0
+                || this.props[8] !== 0 || this.props[9] !== 0 || this.props[10] !== 1 || this.props[11] !== 0
+                || this.props[12] !== 0 || this.props[13] !== 0 || this.props[14] !== 0 || this.props[15] !== 1);
+            this._identityCalculated = true;
+        }
+        return this._identity;
+    }
+
     function clone(matr){
         var i;
         for(i=0;i<16;i+=1){
@@ -634,6 +647,9 @@
         return [x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]];
     }
     function applyToPointStringified(x, y) {
+        if(this.isIdentity()) {
+            return x + ',' + y;
+        }
         return (bm_rnd(x * this.props[0] + y * this.props[4] + this.props[12]))+','+(bm_rnd(x * this.props[1] + y * this.props[5] + this.props[13]));
     }
 
@@ -686,6 +702,9 @@
         this.inversePoints = inversePoints;
         this.inversePoint = inversePoint;
         this._t = this.transform;
+        this.isIdentity = isIdentity;
+        this._identity = true;
+        this._identityCalculated = false;
 
         this.props = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];
 
@@ -1161,6 +1180,9 @@
     }
 
     function pointOnLine3D(x1,y1,z1, x2,y2,z2, x3,y3,z3){
+        if(z1 === 0 && z2 === 0 && z3 === 0) {
+            return pointOnLine2D(x1,y1, x2,y2, x3,y3);
+        }
         var dist1 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2) + Math.pow(z2 - z1, 2));
         var dist2 = Math.sqrt(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2) + Math.pow(z3 - z1, 2));
         var dist3 = Math.sqrt(Math.pow(x3 - x2, 2) + Math.pow(y3 - y2, 2) + Math.pow(z3 - z2, 2));
@@ -1537,6 +1559,28 @@
         }
     }())
 
+    var checkChars = (function() {
+        var minimumVersion = [4,7,99];
+        return function (animationData){
+            if(animationData.chars && !checkVersion(minimumVersion,animationData.v)){
+                var i, len = animationData.chars.length, j, jLen, k, kLen;
+                var pathData, paths;
+                for(i = 0; i < len; i += 1) {
+                    if(animationData.chars[i].data && animationData.chars[i].data.shapes) {
+                        paths = animationData.chars[i].data.shapes[0].it;
+                        jLen = paths.length;
+
+                        for(j = 0; j < jLen; j += 1) {
+                            pathData = paths[j].ks.k;
+                            convertPathsToAbsoluteValues(paths[j].ks.k);
+                        }
+                    }
+                }
+            }
+        }
+
+    }())
+
     var checkColors = (function(){
         var minimumVersion = [4,1,9];
 
@@ -1833,6 +1877,7 @@
         }
         checkColors(animationData);
         checkText(animationData);
+        checkChars(animationData);
         checkShapes(animationData);
         completeLayers(animationData.layers, animationData.assets, fontManager);
         animationData.__complete = true;
@@ -2531,7 +2576,11 @@
 
     var TransformProperty = (function() {
         function positionGetter() {
-            return ExpressionValue(this.p);
+            if(this.p) {
+                return ExpressionValue(this.p);
+            } else {
+                return [this.px.v, this.py.v, this.pz ? this.pz.v : 0];
+            }
         }
         function xPositionGetter() {
             return ExpressionValue(this.px);
@@ -2549,7 +2598,11 @@
             return ExpressionValue(this.or);
         }
         function rotationGetter() {
-            return ExpressionValue(this.r, 1/degToRads);
+            if(this.r) {
+                return ExpressionValue(this.r, 1/degToRads);
+            } else {
+                return ExpressionValue(this.rz, 1/degToRads);
+            }
         }
         function scaleGetter() {
             return ExpressionValue(this.s, 100);
@@ -4702,8 +4755,10 @@
     };
     this.renderConfig = {
         preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
-        progressiveLoad: (config && config.progressiveLoad) || false
+        progressiveLoad: (config && config.progressiveLoad) || false,
+        hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true
     };
+    this.globalData.renderConfig = this.renderConfig;
     this.elements = [];
     this.pendingElements = [];
     this.destroyed = false;
@@ -5422,6 +5477,7 @@
     this.data = data;
     this.matteElement = null;
     this.transformedElement = null;
+    this.isTransparent = false;
     this.parentContainer = parentContainer;
     this.layerId = placeholder ? placeholder.layerId : 'ly_'+randomString(10);
     this.placeholder = placeholder;
@@ -5669,6 +5725,15 @@
         this.transformedElement.setAttribute('transform',finalMat.to2dCSS());
     }
     if(this.finalTransform.opMdf && this.layerElement){
+        if(this.finalTransform.op.v <= 0) {
+            if(!this.isTransparent && this.globalData.renderConfig.hideOnTransparent){
+                this.isTransparent = true;
+                this.hide();
+            }
+        } else if(this.hidden && this.isTransparent){
+            this.isTransparent = false;
+            this.show();
+        }
         this.transformedElement.setAttribute('opacity',this.finalTransform.op.v);
     }
 
@@ -5714,7 +5779,606 @@
 };
 
 SVGBaseElement.prototype.hide = function(){
+    if(!this.hidden){
+        this.layerElement.style.display = 'none';
+        this.hidden = true;
+    }
+};
 
+SVGBaseElement.prototype.show = function(){
+    if(this.isVisible && !this.isTransparent){
+        this.hidden = false;
+        this.layerElement.style.display = 'block';
+    }
+};
+
+function IShapeElement(data,parentContainer,globalData,comp, placeholder){
+    this.shapes = [];
+    this.shapesData = data.shapes;
+    this.stylesList = [];
+    this.viewData = [];
+    this.shapeModifiers = [];
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+}
+createElement(SVGBaseElement, IShapeElement);
+
+IShapeElement.prototype.identityMatrix = new Matrix();
+
+IShapeElement.prototype.lcEnum = {
+    '1': 'butt',
+    '2': 'round',
+    '3': 'butt'
+}
+
+IShapeElement.prototype.ljEnum = {
+    '1': 'miter',
+    '2': 'round',
+    '3': 'butt'
+}
+
+IShapeElement.prototype.buildExpressionInterface = function(){};
+
+IShapeElement.prototype.createElements = function(){
+    //TODO check if I can use symbol so i can set its viewBox
+    this._parent.createElements.call(this);
+    this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties, 0);
+    if(!this.data.hd || this.data.td){
+        styleUnselectableDiv(this.layerElement);
+    }
+    //this.elemInterface.registerShapeExpressionInterface(ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.elemInterface));
+};
+
+IShapeElement.prototype.setGradientData = function(pathElement,arr,data){
+
+    var gradientId = 'gr_'+randomString(10);
+    var gfill;
+    if(arr.t === 1){
+        gfill = document.createElementNS(svgNS,'linearGradient');
+    } else {
+        gfill = document.createElementNS(svgNS,'radialGradient');
+    }
+    gfill.setAttribute('id',gradientId);
+    gfill.setAttribute('spreadMethod','pad');
+    gfill.setAttribute('gradientUnits','userSpaceOnUse');
+    var stops = [];
+    var stop, j, jLen;
+    jLen = arr.g.p*4;
+    for(j=0;j<jLen;j+=4){
+        stop = document.createElementNS(svgNS,'stop');
+        gfill.appendChild(stop);
+        stops.push(stop);
+    }
+    pathElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+gradientId+')');
+    this.globalData.defs.appendChild(gfill);
+    data.gf = gfill;
+    data.cst = stops;
+}
+
+IShapeElement.prototype.setGradientOpacity = function(arr, data, styleOb){
+    if((arr.g.k.k[0].s && arr.g.k.k[0].s.length > arr.g.p*4) || arr.g.k.k.length > arr.g.p*4){
+        var opFill;
+        var stop, j, jLen;
+        var mask = document.createElementNS(svgNS,"mask");
+        var maskElement = document.createElementNS(svgNS, 'path');
+        mask.appendChild(maskElement);
+        var opacityId = 'op_'+randomString(10);
+        var maskId = 'mk_'+randomString(10);
+        mask.setAttribute('id',maskId);
+        if(arr.t === 1){
+            opFill = document.createElementNS(svgNS,'linearGradient');
+        } else {
+            opFill = document.createElementNS(svgNS,'radialGradient');
+        }
+        opFill.setAttribute('id',opacityId);
+        opFill.setAttribute('spreadMethod','pad');
+        opFill.setAttribute('gradientUnits','userSpaceOnUse');
+        jLen = arr.g.k.k[0].s ? arr.g.k.k[0].s.length : arr.g.k.k.length;
+        var stops = [];
+        for(j=arr.g.p*4;j<jLen;j+=2){
+            stop = document.createElementNS(svgNS,'stop');
+            stop.setAttribute('stop-color','rgb(255,255,255)');
+            //stop.setAttribute('offset',Math.round(arr.y[j][0]*100)+'%');
+            //stop.setAttribute('style','stop-color:rgb(255,255,255);stop-opacity:'+arr.y[j][1]);
+            opFill.appendChild(stop);
+            stops.push(stop);
+        }
+        maskElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+opacityId+')');
+        this.globalData.defs.appendChild(opFill);
+        this.globalData.defs.appendChild(mask);
+        data.of = opFill;
+        data.ost = stops;
+        styleOb.msElem = maskElement;
+        return maskId;
+    }
+};
+
+IShapeElement.prototype.searchShapes = function(arr,data,container,dynamicProperties, level, transformers){
+    transformers = transformers || [];
+    var ownTransformers = [].concat(transformers);
+    var i, len = arr.length - 1;
+    var j, jLen;
+    var ownArrays = [], ownModifiers = [], styleOb, currentTransform;
+    for(i=len;i>=0;i-=1){
+        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
+            data[i] = {};
+            styleOb = {
+                type: arr[i].ty,
+                d: '',
+                ld: '',
+                lvl: level,
+                mdf: false
+            };
+            var pathElement = document.createElementNS(svgNS, "path");
+            data[i].o = PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties);
+            if(arr[i].ty == 'st' || arr[i].ty == 'gs') {
+                pathElement.setAttribute('stroke-linecap', this.lcEnum[arr[i].lc] || 'round');
+                ////pathElement.style.strokeLinecap = this.lcEnum[arr[i].lc] || 'round';
+                pathElement.setAttribute('stroke-linejoin',this.ljEnum[arr[i].lj] || 'round');
+                ////pathElement.style.strokeLinejoin = this.ljEnum[arr[i].lj] || 'round';
+                pathElement.setAttribute('fill-opacity','0');
+                ////pathElement.style.fillOpacity = 0;
+                if(arr[i].lj == 1) {
+                    pathElement.setAttribute('stroke-miterlimit',arr[i].ml);
+                    ////pathElement.style.strokeMiterlimit = arr[i].ml;
+                }
+
+                data[i].w = PropertyFactory.getProp(this,arr[i].w,0,null,dynamicProperties);
+                if(arr[i].d){
+                    var d = PropertyFactory.getDashProp(this,arr[i].d,'svg',dynamicProperties);
+                    if(!d.k){
+                        pathElement.setAttribute('stroke-dasharray', d.dasharray);
+                        ////pathElement.style.strokeDasharray = d.dasharray;
+                        pathElement.setAttribute('stroke-dashoffset', d.dashoffset);
+                        ////pathElement.style.strokeDashoffset = d.dashoffset;
+                    }
+                    data[i].d = d;
+                }
+
+            }
+            if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
+                data[i].c = PropertyFactory.getProp(this,arr[i].c,1,255,dynamicProperties);
+                container.appendChild(pathElement);
+            } else {
+                data[i].g = PropertyFactory.getGradientProp(this,arr[i].g,dynamicProperties);
+                if(arr[i].t == 2){
+                    data[i].h = PropertyFactory.getProp(this,arr[i].h,1,0.01,dynamicProperties);
+                    data[i].a = PropertyFactory.getProp(this,arr[i].a,1,degToRads,dynamicProperties);
+                }
+                data[i].s = PropertyFactory.getProp(this,arr[i].s,1,null,dynamicProperties);
+                data[i].e = PropertyFactory.getProp(this,arr[i].e,1,null,dynamicProperties);
+                this.setGradientData(pathElement,arr[i],data[i], styleOb);
+                var maskId = this.setGradientOpacity(arr[i],data[i], styleOb);
+                if(maskId){
+                    pathElement.setAttribute('mask','url(#'+maskId+')');
+                }
+                data[i].elem = pathElement;
+                container.appendChild(pathElement);
+            }
+            if(arr[i].r === 2) {
+                pathElement.setAttribute('fill-rule', 'evenodd');
+            }
+
+            if(arr[i].ln){
+                pathElement.setAttribute('id',arr[i].ln);
+            }
+            if(arr[i].cl){
+                pathElement.setAttribute('class',arr[i].cl);
+            }
+            styleOb.pElem = pathElement;
+            this.stylesList.push(styleOb);
+            data[i].style = styleOb;
+            ownArrays.push(styleOb);
+        }else if(arr[i].ty == 'gr'){
+            data[i] = {
+                it: []
+            };
+            var g = document.createElementNS(svgNS,'g');
+            container.appendChild(g);
+            data[i].gr = g;
+            this.searchShapes(arr[i].it,data[i].it,g,dynamicProperties, level + 1, ownTransformers);
+        }else if(arr[i].ty == 'tr'){
+            data[i] = {
+                transform : {
+                    op: PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties),
+                    mProps: PropertyFactory.getProp(this,arr[i],2,null,dynamicProperties)
+                },
+                elements: []
+            };
+            currentTransform = data[i].transform;
+            ownTransformers.push(currentTransform);
+        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
+            data[i] = {
+                elements : [],
+                caches:[],
+                styles : [],
+                transformers: ownTransformers,
+                lStr: ''
+            };
+            var ty = 4;
+            if(arr[i].ty == 'rc'){
+                ty = 5;
+            }else if(arr[i].ty == 'el'){
+                ty = 6;
+            }else if(arr[i].ty == 'sr'){
+                ty = 7;
+            }
+            data[i].sh = ShapePropertyFactory.getShapeProp(this,arr[i],ty,dynamicProperties);
+            data[i].lvl = level;
+            this.shapes.push(data[i].sh);
+            this.addShapeToModifiers(data[i]);
+            jLen = this.stylesList.length;
+            for(j=0;j<jLen;j+=1){
+                if(!this.stylesList[j].closed){
+                    data[i].elements.push({
+                        ty:this.stylesList[j].type,
+                        st: this.stylesList[j]
+                    });
+                }
+            }
+        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms' || arr[i].ty == 'rp'){
+            var modifier = ShapeModifiers.getModifier(arr[i].ty);
+            modifier.init(this,arr[i],dynamicProperties);
+            this.shapeModifiers.push(modifier);
+            ownModifiers.push(modifier);
+            data[i] = modifier;
+        }
+    }
+    len = ownArrays.length;
+    for(i=0;i<len;i+=1){
+        ownArrays[i].closed = true;
+    }
+    len = ownModifiers.length;
+    for(i=0;i<len;i+=1){
+        ownModifiers[i].closed = true;
+    }
+};
+
+IShapeElement.prototype.addShapeToModifiers = function(data) {
+    var i, len = this.shapeModifiers.length;
+    for(i=0;i<len;i+=1){
+        this.shapeModifiers[i].addShape(data);
+    }
+};
+
+IShapeElement.prototype.renderModifiers = function() {
+    if(!this.shapeModifiers.length){
+        return;
+    }
+    var i, len = this.shapes.length;
+    for(i=0;i<len;i+=1){
+        this.shapes[i].reset();
+    }
+
+
+    len = this.shapeModifiers.length;
+
+    for(i=len-1;i>=0;i-=1){
+        this.shapeModifiers[i].processShapes(this.firstFrame);
+    }
+};
+
+IShapeElement.prototype.renderFrame = function(parentMatrix){
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
+    if(renderParent===false){
+        this.hide();
+        return;
+    }
+    this.globalToLocal([0,0,0]);
+    if(this.hidden){
+        this.layerElement.style.display = 'block';
+        this.hidden = false;
+    }
+    this.renderModifiers();
+    this.renderShape(null,null,true, null);
+};
+
+IShapeElement.prototype.hide = function(){
+    if(!this.hidden){
+        this.layerElement.style.display = 'none';
+        var i, len = this.stylesList.length;
+        for(i=len-1;i>=0;i-=1){
+            if(this.stylesList[i].ld !== '0'){
+                this.stylesList[i].ld = '0';
+                this.stylesList[i].pElem.style.display = 'none';
+                if(this.stylesList[i].pElem.parentNode){
+                    this.stylesList[i].parent = this.stylesList[i].pElem.parentNode;
+                    //this.stylesList[i].pElem.parentNode.removeChild(this.stylesList[i].pElem);
+                }
+            }
+        }
+        this.hidden = true;
+    }
+};
+
+IShapeElement.prototype.renderShape = function(items,data,isMain, container){
+    var i, len;
+    if(!items){
+        items = this.shapesData;
+        len = this.stylesList.length;
+        for(i=0;i<len;i+=1){
+            this.stylesList[i].d = '';
+            this.stylesList[i].mdf = false;
+        }
+    }
+    if(!data){
+        data = this.viewData;
+    }
+    ///
+    ///
+    len = items.length - 1;
+    var ty;
+    for(i=len;i>=0;i-=1){
+        ty = items[i].ty;
+        if(ty == 'tr'){
+            if(this.firstFrame || data[i].transform.op.mdf && container){
+                container.setAttribute('opacity',data[i].transform.op.v);
+            }
+            if(this.firstFrame || data[i].transform.mProps.mdf && container){
+                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
+            }
+        }else if(ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr'){
+            this.renderPath(items[i],data[i]);
+        }else if(ty == 'fl'){
+            this.renderFill(items[i],data[i]);
+        }else if(ty == 'gf'){
+            this.renderGradient(items[i],data[i]);
+        }else if(ty == 'gs'){
+            this.renderGradient(items[i],data[i]);
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'st'){
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'gr'){
+            this.renderShape(items[i].it,data[i].it,false, data[i].gr);
+        }else if(ty == 'tm'){
+            //
+        }
+    }
+    if(isMain) {
+        len = this.stylesList.length;
+        for (i = 0; i < len; i += 1) {
+            if (this.stylesList[i].ld === '0') {
+                this.stylesList[i].ld = '1';
+                this.stylesList[i].pElem.style.display = 'block';
+                //this.stylesList[i].parent.appendChild(this.stylesList[i].pElem);
+            }
+            if (this.stylesList[i].mdf || this.firstFrame) {
+                this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d);
+                if(this.stylesList[i].msElem){
+                    this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
+                }
+            }
+        }
+        if (this.firstFrame) {
+            this.firstFrame = false;
+        }
+    }
+
+};
+
+IShapeElement.prototype.buildShapeString = function(pathNodes, length, closed, mat) {
+    var i, shapeString = '';
+    for(i = 1; i < length; i += 1) {
+        if (i === 1) {
+            shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+        }
+        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
+    }
+    if (length === 1) {
+        shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+    }
+    if (closed && length) {
+        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+        shapeString += 'z';
+    }
+    return shapeString;
+}
+
+IShapeElement.prototype.renderPath = function(pathData,viewData){
+    var len, i, j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = viewData.elements.length;
+    var lvl = viewData.lvl;
+    for(l=0;l<lLen;l+=1){
+        redraw = viewData.sh.mdf || this.firstFrame;
+        pathStringTransformed = 'M0 0';
+        var paths = viewData.sh.paths;
+        jLen = paths._length;
+        if(viewData.elements[l].st.lvl < lvl){
+            var mat = this.mHelper.reset(), props;
+            var iterations = lvl - viewData.elements[l].st.lvl;
+            var k = viewData.transformers.length-1;
+            while(iterations > 0) {
+                redraw = viewData.transformers[k].mProps.mdf || redraw;
+                props = viewData.transformers[k].mProps.v.props;
+                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
+                iterations --;
+                k --;
+            }
+            if(redraw){
+                for(j=0;j<jLen;j+=1){
+                    pathNodes = paths.shapes[j];
+                    if(pathNodes && pathNodes._length){
+                        pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
+                        /*len = pathNodes._length;
+                        for (i = 1; i < len; i += 1) {
+                            if (i == 1) {
+                                pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            }
+                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
+                        }
+                        if (len == 1) {
+                            pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                        }
+                        if (pathNodes.c) {
+                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            pathStringTransformed += 'z';
+                        }*/
+                    }
+                }
+                viewData.caches[l] = pathStringTransformed;
+            } else {
+                pathStringTransformed = viewData.caches[l];
+            }
+        } else {
+            if(redraw){
+                for(j=0;j<jLen;j+=1){
+                    pathNodes = paths.shapes[j];
+                    if(pathNodes && pathNodes._length){
+                        pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, this.identityMatrix);
+                        /*len = pathNodes._length;
+                        for (i = 1; i < len; i += 1) {
+                            if (i == 1) {
+                                //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                                pathStringTransformed += " M" + pathNodes.v[0].join(',');
+                            }
+                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
+                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[i].join(',') + " " + pathNodes.v[i].join(',');
+                        }
+                        if (len == 1) {
+                            //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            pathStringTransformed += " M" + pathNodes.v[0].join(',');
+                        }
+                        if (pathNodes.c && len) {
+                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[0].join(',') + " " + pathNodes.v[0].join(',');
+                            pathStringTransformed += 'z';
+                        }*/
+                    }
+                }
+                viewData.caches[l] = pathStringTransformed;
+            } else {
+                pathStringTransformed = viewData.caches[l];
+            }
+        }
+        viewData.elements[l].st.d += pathStringTransformed;
+        viewData.elements[l].st.mdf = redraw || viewData.elements[l].st.mdf;
+    }
+
+};
+
+IShapeElement.prototype.renderFill = function(styleData,viewData){
+    var styleElem = viewData.style;
+
+    if(viewData.c.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
+        ////styleElem.pElem.style.fill = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
+    }
+    if(viewData.o.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('fill-opacity',viewData.o.v);
+    }
+};
+
+IShapeElement.prototype.renderGradient = function(styleData,viewData){
+    var gfill = viewData.gf;
+    var opFill = viewData.of;
+    var pt1 = viewData.s.v,pt2 = viewData.e.v;
+
+    if(viewData.o.mdf || this.firstFrame){
+        var attr = styleData.ty === 'gf' ? 'fill-opacity':'stroke-opacity';
+        viewData.elem.setAttribute(attr,viewData.o.v);
+    }
+    //clippedElement.setAttribute('transform','matrix(1,0,0,1,-100,0)');
+    if(viewData.s.mdf || this.firstFrame){
+        var attr1 = styleData.t === 1 ? 'x1':'cx';
+        var attr2 = attr1 === 'x1' ? 'y1':'cy';
+        gfill.setAttribute(attr1,pt1[0]);
+        gfill.setAttribute(attr2,pt1[1]);
+        if(opFill){
+            opFill.setAttribute(attr1,pt1[0]);
+            opFill.setAttribute(attr2,pt1[1]);
+        }
+    }
+    var stops, i, len, stop;
+    if(viewData.g.cmdf || this.firstFrame){
+        stops = viewData.cst;
+        var cValues = viewData.g.c;
+        len = stops.length;
+        for(i=0;i<len;i+=1){
+            stop = stops[i];
+            stop.setAttribute('offset',cValues[i*4]+'%');
+            stop.setAttribute('stop-color','rgb('+cValues[i*4+1]+','+cValues[i*4+2]+','+cValues[i*4+3]+')');
+        }
+    }
+    if(opFill && (viewData.g.omdf || this.firstFrame)){
+        stops = viewData.ost;
+        var oValues = viewData.g.o;
+        len = stops.length;
+        for(i=0;i<len;i+=1){
+            stop = stops[i];
+            stop.setAttribute('offset',oValues[i*2]+'%');
+            stop.setAttribute('stop-opacity',oValues[i*2+1]);
+        }
+    }
+    if(styleData.t === 1){
+        if(viewData.e.mdf  || this.firstFrame){
+            gfill.setAttribute('x2',pt2[0]);
+            gfill.setAttribute('y2',pt2[1]);
+            if(opFill){
+                opFill.setAttribute('x2',pt2[0]);
+                opFill.setAttribute('y2',pt2[1]);
+            }
+        }
+    } else {
+        var rad;
+        if(viewData.s.mdf || viewData.e.mdf || this.firstFrame){
+            rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
+            gfill.setAttribute('r',rad);
+            if(opFill){
+                opFill.setAttribute('r',rad);
+            }
+        }
+        if(viewData.e.mdf || viewData.h.mdf || viewData.a.mdf || this.firstFrame){
+            if(!rad){
+                rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
+            }
+            var ang = Math.atan2(pt2[1]-pt1[1], pt2[0]-pt1[0]);
+
+            var percent = viewData.h.v >= 1 ? 0.99 : viewData.h.v <= -1 ? -0.99:viewData.h.v;
+            var dist = rad*percent;
+            var x = Math.cos(ang + viewData.a.v)*dist + pt1[0];
+            var y = Math.sin(ang + viewData.a.v)*dist + pt1[1];
+            gfill.setAttribute('fx',x);
+            gfill.setAttribute('fy',y);
+            if(opFill){
+                opFill.setAttribute('fx',x);
+                opFill.setAttribute('fy',y);
+            }
+        }
+        //gfill.setAttribute('fy','200');
+    }
+};
+
+IShapeElement.prototype.renderStroke = function(styleData,viewData){
+    var styleElem = viewData.style;
+    //TODO fix dashes
+    var d = viewData.d;
+    var dasharray,dashoffset;
+    if(d && d.k && (d.mdf || this.firstFrame)){
+        styleElem.pElem.setAttribute('stroke-dasharray', d.dasharray);
+        ////styleElem.pElem.style.strokeDasharray = d.dasharray;
+        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset);
+        ////styleElem.pElem.style.strokeDashoffset = d.dashoffset;
+    }
+    if(viewData.c && (viewData.c.mdf || this.firstFrame)){
+        styleElem.pElem.setAttribute('stroke','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
+        ////styleElem.pElem.style.stroke = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
+    }
+    if(viewData.o.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('stroke-opacity',viewData.o.v);
+    }
+    if(viewData.w.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('stroke-width',viewData.w.v);
+        if(styleElem.msElem){
+            styleElem.msElem.setAttribute('stroke-width',viewData.w.v);
+        }
+        ////styleElem.pElem.style.strokeWidth = viewData.w.v;
+    }
+};
+
+IShapeElement.prototype.destroy = function(){
+    this._parent.destroy.call(this._parent);
+    this.shapeData = null;
+    this.viewData = null;
+    this.parentContainer = null;
+    this.placeholder = null;
 };
 
 function ITextElement(data, animationItem,parentContainer,globalData){
@@ -5832,8 +6496,9 @@
     var k, kLen, pathNodes;
     var shapeStr = '';
     for(j=0;j<jLen;j+=1){
-        kLen = shapes[j].ks.k.i.length;
         pathNodes = shapes[j].ks.k;
+        shapeStr += this.buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper);
+        /*kLen = pathNodes.i.length;
         for(k=1;k<kLen;k+=1){
             if(k==1){
                 shapeStr += " M"+matrixHelper.applyToPointStringified(pathNodes.v[0][0],pathNodes.v[0][1]);
@@ -5841,7 +6506,7 @@
             shapeStr += " C"+matrixHelper.applyToPointStringified(pathNodes.o[k-1][0],pathNodes.o[k-1][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.i[k][0],pathNodes.i[k][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.v[k][0],pathNodes.v[k][1]);
         }
         shapeStr += " C"+matrixHelper.applyToPointStringified(pathNodes.o[k-1][0],pathNodes.o[k-1][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.i[0][0],pathNodes.i[0][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.v[0][0],pathNodes.v[0][1]);
-        shapeStr += 'z';
+        shapeStr += 'z';*/
     }
     return shapeStr;
 };
@@ -6305,6 +6970,8 @@
     }
 };
 
+ITextElement.prototype.buildShapeString = IShapeElement.prototype.buildShapeString;
+
 ITextElement.prototype.emptyProp = new LetterProps();
 
 function SVGTextElement(data,parentContainer,globalData,comp, placeholder){
@@ -6318,6 +6985,7 @@
 SVGTextElement.prototype.createPathShape = ITextElement.prototype.createPathShape;
 SVGTextElement.prototype.getMeasures = ITextElement.prototype.getMeasures;
 SVGTextElement.prototype.prepareFrame = ITextElement.prototype.prepareFrame;
+SVGTextElement.prototype.buildShapeString = ITextElement.prototype.buildShapeString;
 
 SVGTextElement.prototype.createElements = function(){
 
@@ -6440,7 +7108,7 @@
             }
         }
         if(singleShape) {
-            xPos += letters[i].l;
+            xPos += letters[i].l || 0;
             xPos += documentData.tr/1000*documentData.s;
         }
         //
@@ -6459,13 +7127,6 @@
     }
 }
 
-SVGTextElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        this.hidden = true;
-    }
-};
-
 SVGTextElement.prototype.renderFrame = function(parentMatrix){
 
     var renderParent = this._parent.renderFrame.call(this,parentMatrix);
@@ -6474,8 +7135,7 @@
         return;
     }
     if(this.hidden){
-        this.hidden = false;
-        this.layerElement.style.display = 'block';
+        this.show();
     }
 
     if(this.data.singleShape){
@@ -6969,13 +7629,13 @@
 
 ICompElement.prototype.hide = function(){
     if(!this.hidden){
+        this._parent.hide.call(this);
         var i,len = this.elements.length;
         for( i = 0; i < len; i+=1 ){
             if(this.elements[i]){
                 this.elements[i].hide();
             }
         }
-        this.hidden = true;
     }
 };
 
@@ -7013,7 +7673,9 @@
         return;
     }
 
-    this.hidden = false;
+    if(this.hidden) {
+        this.show();
+    }
     for( i = 0; i < len; i+=1 ){
         if(this.completeLayers || this.elements[i]){
             this.elements[i].renderFrame();
@@ -7084,13 +7746,6 @@
 
 };
 
-IImageElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        this.hidden = true;
-    }
-};
-
 IImageElement.prototype.renderFrame = function(parentMatrix){
     var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
@@ -7098,8 +7753,7 @@
         return;
     }
     if(this.hidden){
-        this.hidden = false;
-        this.layerElement.style.display = 'block';
+        this.show();
     }
     if(this.firstFrame){
         this.firstFrame = false;
@@ -7110,573 +7764,6 @@
     this._parent.destroy.call(this._parent);
     this.innerElem =  null;
 };
-function IShapeElement(data,parentContainer,globalData,comp, placeholder){
-    this.shapes = [];
-    this.shapesData = data.shapes;
-    this.stylesList = [];
-    this.viewData = [];
-    this.shapeModifiers = [];
-    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
-}
-createElement(SVGBaseElement, IShapeElement);
-
-IShapeElement.prototype.lcEnum = {
-    '1': 'butt',
-    '2': 'round',
-    '3': 'butt'
-}
-
-IShapeElement.prototype.ljEnum = {
-    '1': 'miter',
-    '2': 'round',
-    '3': 'butt'
-}
-
-IShapeElement.prototype.buildExpressionInterface = function(){};
-
-IShapeElement.prototype.createElements = function(){
-    //TODO check if I can use symbol so i can set its viewBox
-    this._parent.createElements.call(this);
-    this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties, 0);
-    if(!this.data.hd || this.data.td){
-        styleUnselectableDiv(this.layerElement);
-    }
-    //this.elemInterface.registerShapeExpressionInterface(ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.elemInterface));
-};
-
-IShapeElement.prototype.setGradientData = function(pathElement,arr,data){
-
-    var gradientId = 'gr_'+randomString(10);
-    var gfill;
-    if(arr.t === 1){
-        gfill = document.createElementNS(svgNS,'linearGradient');
-    } else {
-        gfill = document.createElementNS(svgNS,'radialGradient');
-    }
-    gfill.setAttribute('id',gradientId);
-    gfill.setAttribute('spreadMethod','pad');
-    gfill.setAttribute('gradientUnits','userSpaceOnUse');
-    var stops = [];
-    var stop, j, jLen;
-    jLen = arr.g.p*4;
-    for(j=0;j<jLen;j+=4){
-        stop = document.createElementNS(svgNS,'stop');
-        gfill.appendChild(stop);
-        stops.push(stop);
-    }
-    pathElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+gradientId+')');
-    this.globalData.defs.appendChild(gfill);
-    data.gf = gfill;
-    data.cst = stops;
-}
-
-IShapeElement.prototype.setGradientOpacity = function(arr, data, styleOb){
-    if((arr.g.k.k[0].s && arr.g.k.k[0].s.length > arr.g.p*4) || arr.g.k.k.length > arr.g.p*4){
-        var opFill;
-        var stop, j, jLen;
-        var mask = document.createElementNS(svgNS,"mask");
-        var maskElement = document.createElementNS(svgNS, 'path');
-        mask.appendChild(maskElement);
-        var opacityId = 'op_'+randomString(10);
-        var maskId = 'mk_'+randomString(10);
-        mask.setAttribute('id',maskId);
-        if(arr.t === 1){
-            opFill = document.createElementNS(svgNS,'linearGradient');
-        } else {
-            opFill = document.createElementNS(svgNS,'radialGradient');
-        }
-        opFill.setAttribute('id',opacityId);
-        opFill.setAttribute('spreadMethod','pad');
-        opFill.setAttribute('gradientUnits','userSpaceOnUse');
-        jLen = arr.g.k.k[0].s ? arr.g.k.k[0].s.length : arr.g.k.k.length;
-        var stops = [];
-        for(j=arr.g.p*4;j<jLen;j+=2){
-            stop = document.createElementNS(svgNS,'stop');
-            stop.setAttribute('stop-color','rgb(255,255,255)');
-            //stop.setAttribute('offset',Math.round(arr.y[j][0]*100)+'%');
-            //stop.setAttribute('style','stop-color:rgb(255,255,255);stop-opacity:'+arr.y[j][1]);
-            opFill.appendChild(stop);
-            stops.push(stop);
-        }
-        maskElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+opacityId+')');
-        this.globalData.defs.appendChild(opFill);
-        this.globalData.defs.appendChild(mask);
-        data.of = opFill;
-        data.ost = stops;
-        styleOb.msElem = maskElement;
-        return maskId;
-    }
-};
-
-IShapeElement.prototype.searchShapes = function(arr,data,container,dynamicProperties, level, transformers){
-    transformers = transformers || [];
-    var ownTransformers = [].concat(transformers);
-    var i, len = arr.length - 1;
-    var j, jLen;
-    var ownArrays = [], ownModifiers = [], styleOb, currentTransform;
-    for(i=len;i>=0;i-=1){
-        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
-            data[i] = {};
-            styleOb = {
-                type: arr[i].ty,
-                d: '',
-                ld: '',
-                lvl: level,
-                mdf: false
-            };
-            var pathElement = document.createElementNS(svgNS, "path");
-            data[i].o = PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties);
-            if(arr[i].ty == 'st' || arr[i].ty == 'gs') {
-                pathElement.setAttribute('stroke-linecap', this.lcEnum[arr[i].lc] || 'round');
-                ////pathElement.style.strokeLinecap = this.lcEnum[arr[i].lc] || 'round';
-                pathElement.setAttribute('stroke-linejoin',this.ljEnum[arr[i].lj] || 'round');
-                ////pathElement.style.strokeLinejoin = this.ljEnum[arr[i].lj] || 'round';
-                pathElement.setAttribute('fill-opacity','0');
-                ////pathElement.style.fillOpacity = 0;
-                if(arr[i].lj == 1) {
-                    pathElement.setAttribute('stroke-miterlimit',arr[i].ml);
-                    ////pathElement.style.strokeMiterlimit = arr[i].ml;
-                }
-
-                data[i].w = PropertyFactory.getProp(this,arr[i].w,0,null,dynamicProperties);
-                if(arr[i].d){
-                    var d = PropertyFactory.getDashProp(this,arr[i].d,'svg',dynamicProperties);
-                    if(!d.k){
-                        pathElement.setAttribute('stroke-dasharray', d.dasharray);
-                        ////pathElement.style.strokeDasharray = d.dasharray;
-                        pathElement.setAttribute('stroke-dashoffset', d.dashoffset);
-                        ////pathElement.style.strokeDashoffset = d.dashoffset;
-                    }
-                    data[i].d = d;
-                }
-
-            }
-            if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
-                data[i].c = PropertyFactory.getProp(this,arr[i].c,1,255,dynamicProperties);
-                container.appendChild(pathElement);
-            } else {
-                data[i].g = PropertyFactory.getGradientProp(this,arr[i].g,dynamicProperties);
-                if(arr[i].t == 2){
-                    data[i].h = PropertyFactory.getProp(this,arr[i].h,1,0.01,dynamicProperties);
-                    data[i].a = PropertyFactory.getProp(this,arr[i].a,1,degToRads,dynamicProperties);
-                }
-                data[i].s = PropertyFactory.getProp(this,arr[i].s,1,null,dynamicProperties);
-                data[i].e = PropertyFactory.getProp(this,arr[i].e,1,null,dynamicProperties);
-                this.setGradientData(pathElement,arr[i],data[i], styleOb);
-                var maskId = this.setGradientOpacity(arr[i],data[i], styleOb);
-                if(maskId){
-                    pathElement.setAttribute('mask','url(#'+maskId+')');
-                }
-                data[i].elem = pathElement;
-                container.appendChild(pathElement);
-            }
-            if(arr[i].r === 2) {
-                pathElement.setAttribute('fill-rule', 'evenodd');
-            }
-
-            if(arr[i].ln){
-                pathElement.setAttribute('id',arr[i].ln);
-            }
-            if(arr[i].cl){
-                pathElement.setAttribute('class',arr[i].cl);
-            }
-            styleOb.pElem = pathElement;
-            this.stylesList.push(styleOb);
-            data[i].style = styleOb;
-            ownArrays.push(styleOb);
-        }else if(arr[i].ty == 'gr'){
-            data[i] = {
-                it: []
-            };
-            var g = document.createElementNS(svgNS,'g');
-            container.appendChild(g);
-            data[i].gr = g;
-            this.searchShapes(arr[i].it,data[i].it,g,dynamicProperties, level + 1, ownTransformers);
-        }else if(arr[i].ty == 'tr'){
-            data[i] = {
-                transform : {
-                    op: PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties),
-                    mProps: PropertyFactory.getProp(this,arr[i],2,null,dynamicProperties)
-                },
-                elements: []
-            };
-            currentTransform = data[i].transform;
-            ownTransformers.push(currentTransform);
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
-            data[i] = {
-                elements : [],
-                caches:[],
-                styles : [],
-                transformers: ownTransformers,
-                lStr: ''
-            };
-            var ty = 4;
-            if(arr[i].ty == 'rc'){
-                ty = 5;
-            }else if(arr[i].ty == 'el'){
-                ty = 6;
-            }else if(arr[i].ty == 'sr'){
-                ty = 7;
-            }
-            data[i].sh = ShapePropertyFactory.getShapeProp(this,arr[i],ty,dynamicProperties);
-            data[i].lvl = level;
-            this.shapes.push(data[i].sh);
-            this.addShapeToModifiers(data[i]);
-            jLen = this.stylesList.length;
-            for(j=0;j<jLen;j+=1){
-                if(!this.stylesList[j].closed){
-                    data[i].elements.push({
-                        ty:this.stylesList[j].type,
-                        st: this.stylesList[j]
-                    });
-                }
-            }
-        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms' || arr[i].ty == 'rp'){
-            var modifier = ShapeModifiers.getModifier(arr[i].ty);
-            modifier.init(this,arr[i],dynamicProperties);
-            this.shapeModifiers.push(modifier);
-            ownModifiers.push(modifier);
-            data[i] = modifier;
-        }
-    }
-    len = ownArrays.length;
-    for(i=0;i<len;i+=1){
-        ownArrays[i].closed = true;
-    }
-    len = ownModifiers.length;
-    for(i=0;i<len;i+=1){
-        ownModifiers[i].closed = true;
-    }
-};
-
-IShapeElement.prototype.addShapeToModifiers = function(data) {
-    var i, len = this.shapeModifiers.length;
-    for(i=0;i<len;i+=1){
-        this.shapeModifiers[i].addShape(data);
-    }
-};
-
-IShapeElement.prototype.renderModifiers = function() {
-    if(!this.shapeModifiers.length){
-        return;
-    }
-    var i, len = this.shapes.length;
-    for(i=0;i<len;i+=1){
-        this.shapes[i].reset();
-    }
-
-
-    len = this.shapeModifiers.length;
-
-    for(i=len-1;i>=0;i-=1){
-        this.shapeModifiers[i].processShapes(this.firstFrame);
-    }
-};
-
-IShapeElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
-    if(renderParent===false){
-        this.hide();
-        return;
-    }
-    this.globalToLocal([0,0,0]);
-    if(this.hidden){
-        this.layerElement.style.display = 'block';
-        this.hidden = false;
-    }
-    this.renderModifiers();
-    this.renderShape(null,null,true, null);
-};
-
-IShapeElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        var i, len = this.stylesList.length;
-        for(i=len-1;i>=0;i-=1){
-            if(this.stylesList[i].ld !== '0'){
-                this.stylesList[i].ld = '0';
-                this.stylesList[i].pElem.style.display = 'none';
-                if(this.stylesList[i].pElem.parentNode){
-                    this.stylesList[i].parent = this.stylesList[i].pElem.parentNode;
-                    //this.stylesList[i].pElem.parentNode.removeChild(this.stylesList[i].pElem);
-                }
-            }
-        }
-        this.hidden = true;
-    }
-};
-
-IShapeElement.prototype.renderShape = function(items,data,isMain, container){
-    var i, len;
-    if(!items){
-        items = this.shapesData;
-        len = this.stylesList.length;
-        for(i=0;i<len;i+=1){
-            this.stylesList[i].d = '';
-            this.stylesList[i].mdf = false;
-        }
-    }
-    if(!data){
-        data = this.viewData;
-    }
-    ///
-    ///
-    len = items.length - 1;
-    var ty;
-    for(i=len;i>=0;i-=1){
-        ty = items[i].ty;
-        if(ty == 'tr'){
-            if(this.firstFrame || data[i].transform.op.mdf && container){
-                container.setAttribute('opacity',data[i].transform.op.v);
-            }
-            if(this.firstFrame || data[i].transform.mProps.mdf && container){
-                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
-            }
-        }else if(ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr'){
-            this.renderPath(items[i],data[i]);
-        }else if(ty == 'fl'){
-            this.renderFill(items[i],data[i]);
-        }else if(ty == 'gf'){
-            this.renderGradient(items[i],data[i]);
-        }else if(ty == 'gs'){
-            this.renderGradient(items[i],data[i]);
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'st'){
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'gr'){
-            this.renderShape(items[i].it,data[i].it,false, data[i].gr);
-        }else if(ty == 'tm'){
-            //
-        }
-    }
-    if(isMain) {
-        len = this.stylesList.length;
-        for (i = 0; i < len; i += 1) {
-            if (this.stylesList[i].ld === '0') {
-                this.stylesList[i].ld = '1';
-                this.stylesList[i].pElem.style.display = 'block';
-                //this.stylesList[i].parent.appendChild(this.stylesList[i].pElem);
-            }
-            if (this.stylesList[i].mdf || this.firstFrame) {
-                this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d);
-                if(this.stylesList[i].msElem){
-                    this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
-                }
-            }
-        }
-        if (this.firstFrame) {
-            this.firstFrame = false;
-        }
-    }
-
-};
-
-IShapeElement.prototype.renderPath = function(pathData,viewData){
-    var len, i, j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = viewData.elements.length;
-    var lvl = viewData.lvl;
-    for(l=0;l<lLen;l+=1){
-        redraw = viewData.sh.mdf || this.firstFrame;
-        pathStringTransformed = 'M0 0';
-        var paths = viewData.sh.paths;
-        jLen = paths._length;
-        if(viewData.elements[l].st.lvl < lvl){
-            var mat = this.mHelper.reset(), props;
-            var iterations = lvl - viewData.elements[l].st.lvl;
-            var k = viewData.transformers.length-1;
-            while(iterations > 0) {
-                redraw = viewData.transformers[k].mProps.mdf || redraw;
-                props = viewData.transformers[k].mProps.v.props;
-                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-                iterations --;
-                k --;
-            }
-            if(redraw){
-                for(j=0;j<jLen;j+=1){
-                    pathNodes = paths.shapes[j];
-                    if(pathNodes && pathNodes._length){
-                        len = pathNodes._length;
-                        for (i = 1; i < len; i += 1) {
-                            if (i == 1) {
-                                pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            }
-                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-                        }
-                        if (len == 1) {
-                            pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                        }
-                        if (pathNodes.c) {
-                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            pathStringTransformed += 'z';
-                        }
-                    }
-                }
-                viewData.caches[l] = pathStringTransformed;
-            } else {
-                pathStringTransformed = viewData.caches[l];
-            }
-        } else {
-            if(redraw){
-                for(j=0;j<jLen;j+=1){
-                    pathNodes = paths.shapes[j];
-                    if(pathNodes && pathNodes._length){
-                        len = pathNodes._length;
-                        for (i = 1; i < len; i += 1) {
-                            if (i == 1) {
-                                //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                                pathStringTransformed += " M" + pathNodes.v[0].join(',');
-                            }
-                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[i].join(',') + " " + pathNodes.v[i].join(',');
-                        }
-                        if (len == 1) {
-                            //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            pathStringTransformed += " M" + pathNodes.v[0].join(',');
-                        }
-                        if (pathNodes.c && len) {
-                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[0].join(',') + " " + pathNodes.v[0].join(',');
-                            pathStringTransformed += 'z';
-                        }
-                    }
-                }
-                viewData.caches[l] = pathStringTransformed;
-            } else {
-                pathStringTransformed = viewData.caches[l];
-            }
-        }
-        viewData.elements[l].st.d += pathStringTransformed;
-        viewData.elements[l].st.mdf = redraw || viewData.elements[l].st.mdf;
-    }
-
-};
-
-IShapeElement.prototype.renderFill = function(styleData,viewData){
-    var styleElem = viewData.style;
-
-    if(viewData.c.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
-        ////styleElem.pElem.style.fill = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
-    }
-    if(viewData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill-opacity',viewData.o.v);
-    }
-};
-
-IShapeElement.prototype.renderGradient = function(styleData,viewData){
-    var gfill = viewData.gf;
-    var opFill = viewData.of;
-    var pt1 = viewData.s.v,pt2 = viewData.e.v;
-
-    if(viewData.o.mdf || this.firstFrame){
-        var attr = styleData.ty === 'gf' ? 'fill-opacity':'stroke-opacity';
-        viewData.elem.setAttribute(attr,viewData.o.v);
-    }
-    //clippedElement.setAttribute('transform','matrix(1,0,0,1,-100,0)');
-    if(viewData.s.mdf || this.firstFrame){
-        var attr1 = styleData.t === 1 ? 'x1':'cx';
-        var attr2 = attr1 === 'x1' ? 'y1':'cy';
-        gfill.setAttribute(attr1,pt1[0]);
-        gfill.setAttribute(attr2,pt1[1]);
-        if(opFill){
-            opFill.setAttribute(attr1,pt1[0]);
-            opFill.setAttribute(attr2,pt1[1]);
-        }
-    }
-    var stops, i, len, stop;
-    if(viewData.g.cmdf || this.firstFrame){
-        stops = viewData.cst;
-        var cValues = viewData.g.c;
-        len = stops.length;
-        for(i=0;i<len;i+=1){
-            stop = stops[i];
-            stop.setAttribute('offset',cValues[i*4]+'%');
-            stop.setAttribute('stop-color','rgb('+cValues[i*4+1]+','+cValues[i*4+2]+','+cValues[i*4+3]+')');
-        }
-    }
-    if(opFill && (viewData.g.omdf || this.firstFrame)){
-        stops = viewData.ost;
-        var oValues = viewData.g.o;
-        len = stops.length;
-        for(i=0;i<len;i+=1){
-            stop = stops[i];
-            stop.setAttribute('offset',oValues[i*2]+'%');
-            stop.setAttribute('stop-opacity',oValues[i*2+1]);
-        }
-    }
-    if(styleData.t === 1){
-        if(viewData.e.mdf  || this.firstFrame){
-            gfill.setAttribute('x2',pt2[0]);
-            gfill.setAttribute('y2',pt2[1]);
-            if(opFill){
-                opFill.setAttribute('x2',pt2[0]);
-                opFill.setAttribute('y2',pt2[1]);
-            }
-        }
-    } else {
-        var rad;
-        if(viewData.s.mdf || viewData.e.mdf || this.firstFrame){
-            rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
-            gfill.setAttribute('r',rad);
-            if(opFill){
-                opFill.setAttribute('r',rad);
-            }
-        }
-        if(viewData.e.mdf || viewData.h.mdf || viewData.a.mdf || this.firstFrame){
-            if(!rad){
-                rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
-            }
-            var ang = Math.atan2(pt2[1]-pt1[1], pt2[0]-pt1[0]);
-
-            var percent = viewData.h.v >= 1 ? 0.99 : viewData.h.v <= -1 ? -0.99:viewData.h.v;
-            var dist = rad*percent;
-            var x = Math.cos(ang + viewData.a.v)*dist + pt1[0];
-            var y = Math.sin(ang + viewData.a.v)*dist + pt1[1];
-            gfill.setAttribute('fx',x);
-            gfill.setAttribute('fy',y);
-            if(opFill){
-                opFill.setAttribute('fx',x);
-                opFill.setAttribute('fy',y);
-            }
-        }
-        //gfill.setAttribute('fy','200');
-    }
-};
-
-IShapeElement.prototype.renderStroke = function(styleData,viewData){
-    var styleElem = viewData.style;
-    //TODO fix dashes
-    var d = viewData.d;
-    var dasharray,dashoffset;
-    if(d && d.k && (d.mdf || this.firstFrame)){
-        styleElem.pElem.setAttribute('stroke-dasharray', d.dasharray);
-        ////styleElem.pElem.style.strokeDasharray = d.dasharray;
-        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset);
-        ////styleElem.pElem.style.strokeDashoffset = d.dashoffset;
-    }
-    if(viewData.c && (viewData.c.mdf || this.firstFrame)){
-        styleElem.pElem.setAttribute('stroke','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
-        ////styleElem.pElem.style.stroke = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
-    }
-    if(viewData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-opacity',viewData.o.v);
-    }
-    if(viewData.w.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-width',viewData.w.v);
-        if(styleElem.msElem){
-            styleElem.msElem.setAttribute('stroke-width',viewData.w.v);
-        }
-        ////styleElem.pElem.style.strokeWidth = viewData.w.v;
-    }
-};
-
-IShapeElement.prototype.destroy = function(){
-    this._parent.destroy.call(this._parent);
-    this.shapeData = null;
-    this.viewData = null;
-    this.parentContainer = null;
-    this.placeholder = null;
-};
-
 function ISolidElement(data,parentContainer,globalData,comp, placeholder){
     this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
@@ -7702,7 +7789,6 @@
     }
 };
 
-ISolidElement.prototype.hide = IImageElement.prototype.hide;
 ISolidElement.prototype.renderFrame = IImageElement.prototype.renderFrame;
 ISolidElement.prototype.destroy = IImageElement.prototype.destroy;
 
@@ -10473,7 +10559,8 @@
 
 
 
-HSolidElement.prototype.hide = IImageElement.prototype.hide;
+HSolidElement.prototype.hide = SVGBaseElement.prototype.hide;
+HSolidElement.prototype.show = SVGBaseElement.prototype.show;
 HSolidElement.prototype.renderFrame = IImageElement.prototype.renderFrame;
 HSolidElement.prototype.destroy = IImageElement.prototype.destroy;
 function HCompElement(data,parentContainer,globalData,comp, placeholder){
@@ -11747,6 +11834,7 @@
         var fn = new Function();
         //var fnStr = 'var fn = function(){'+val+';this.v = $bm_rt;}';
         //eval(fnStr);
+
         var fn = eval('[function(){' + val+';this.v = $bm_rt;}' + ']')[0];
         var bindedFn = fn.bind(this);
         var numKeys = property.kf ? data.k.length : 0;
@@ -12046,13 +12134,13 @@
             if(!thisLayer){
                 thisLayer = elem.layerInterface;
                 thisComp = elem.comp.compInterface;
-                 toWorld = thisLayer.toWorld.bind(thisLayer);
-                 fromWorld = thisLayer.fromWorld.bind(thisLayer);
+                toWorld = thisLayer.toWorld.bind(thisLayer);
+                fromWorld = thisLayer.fromWorld.bind(thisLayer);
             }
             if(!transform){
                 transform = elem.layerInterface("ADBE Transform Group");
+                anchorPoint = transform.anchorPoint;
             }
-            anchorPoint = transform.anchorPoint
             
             if(elemType === 4 && !content){
                 content = thisLayer("ADBE Root Vectors Group");
@@ -12073,7 +12161,6 @@
             if(needsVelocity){
                 velocity = velocityAtTime(time);
             }
-
             bindedFn();
             this.frameExpressionId = elem.globalData.frameId;
             var i,len;
@@ -12743,20 +12830,8 @@
                 if(shape.r.ix === value){
                     return interfaceFunction.rotation;
                 }
-                if(shape.pt.ix === value){
-                    return interfaceFunction.points;
-                }
-                if(shape.or.ix === value || 'ADBE Vector Star Outer Radius' === value){
-                    return interfaceFunction.outerRadius;
-                }
-                if(shape.os.ix === value){
-                    return interfaceFunction.outerRoundness;
-                }
-                if(shape.ir && (shape.ir.ix === value || 'ADBE Vector Star Inner Radius' === value)){
-                    return interfaceFunction.innerRadius;
-                }
-                if(shape.is && shape.is.ix === value){
-                    return interfaceFunction.innerRoundness;
+                if(shape.s.ix === value || value === 'Size'){
+                    return interfaceFunction.size;
                 }
 
             }
@@ -13002,6 +13077,7 @@
                 case 2:
                     return _thisLayerFunction.shapeInterface;
                 case 1:
+                case 6:
                 case "Transform":
                 case "transform":
                 case "ADBE Transform Group":
@@ -13133,23 +13209,28 @@
                 case "scale":
                 case "Scale":
                 case "ADBE Scale":
+                case 6:
                     return _thisFunction.scale;
                 case "rotation":
                 case "Rotation":
                 case "ADBE Rotation":
                 case "ADBE Rotate Z":
+                case 10:
                     return _thisFunction.rotation;
                 case "position":
                 case "Position":
                 case "ADBE Position":
+                case 2:
                     return transform.position;
                 case "anchorPoint":
                 case "AnchorPoint":
                 case "Anchor Point":
                 case "ADBE AnchorPoint":
+                case 1:
                     return _thisFunction.anchorPoint;
                 case "opacity":
                 case "Opacity":
+                case 11:
                     return _thisFunction.opacity;
             }
         }
@@ -13317,6 +13398,7 @@
 var ExpressionValue = (function() {
 	return function(elementProp, mult, type) {
         var expressionValue, arrayValue;
+
 		if (elementProp.k) {
             elementProp.getValue();
         }
@@ -13456,4 +13538,4 @@
                 break;
         }
     }
-};var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type==='expressions'){ expressionsPlugin = plugin; } } function getFactory(name){ switch(name){ case "propertyFactory": return PropertyFactory;case "shapePropertyFactory": return ShapePropertyFactory; case "matrix": return Matrix; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = '4.6.11'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index] || { src: '' }; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));  
\ No newline at end of file
+};var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type==='expressions'){ expressionsPlugin = plugin; } } function getFactory(name){ switch(name){ case "propertyFactory": return PropertyFactory;case "shapePropertyFactory": return ShapePropertyFactory; case "matrix": return Matrix; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = '4.8.0'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index] || { src: '' }; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));  
\ No newline at end of file
diff --git a/build/player/bodymovin.min.js b/build/player/bodymovin.min.js
index edcc44d..17a87a6 100644
--- a/build/player/bodymovin.min.js
+++ b/build/player/bodymovin.min.js
@@ -1,10 +1,10 @@
-!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof module&&module.exports?module.exports=e():t.bodymovin=e()}(window,function(){function ProjectInterface(){return{}}function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function roundTo2Decimals(t){return Math.round(1e4*t)/1e4}function roundTo3Decimals(t){return Math.round(100*t)/100}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function BMEnterFrameEvent(t,e,s,r){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>r?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=0>e?-1:1}function BMCompleteLoopEvent(t,e,s,r){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>r?-1:1}function BMSegmentStartEvent(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function BMDestroyEvent(t,e){this.type=t,this.target=e}function _addEventListener(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)}function _removeEventListener(t,e){if(e){if(this._cbs[t]){for(var s=0,r=this._cbs[t].length;r>s;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,r-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function _triggerEvent(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,r=0;s>r;r++)this._cbs[t][r](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,r="";for(s=t;s>0;--s)r+=e[Math.round(Math.random()*(e.length-1))];return r}function HSVtoRGB(t,e,s){var r,i,a,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=s*(1-e),l=s*(1-o*e),p=s*(1-(1-o)*e),n%6){case 0:r=s,i=p,a=h;break;case 1:r=l,i=s,a=h;break;case 2:r=h,i=s,a=p;break;case 3:r=h,i=l,a=s;break;case 4:r=p,i=h,a=s;break;case 5:r=s,i=h,a=l}return[r,i,a]}function RGBtoHSV(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var r,i=Math.max(t,e,s),a=Math.min(t,e,s),n=i-a,o=0===i?0:n/i,h=i/255;switch(i){case a:r=0;break;case t:r=e-s+n*(s>e?6:0),r/=6*n;break;case e:r=s-t+2*n,r/=6*n;break;case s:r=t-e+4*n,r/=6*n}return[r,o,h]}function addSaturationToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),HSVtoRGB(s[0],s[1],s[2])}function addBrightnessToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),HSVtoRGB(s[0],s[1],s[2])}function addHueToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),HSVtoRGB(s[0],s[1],s[2])}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function fillToRgba(t,e){if(!cachedColors[t]){var s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(s[1],16)+","+parseInt(s[2],16)+","+parseInt(s[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function RenderedFrame(t,e){this.tr=t,this.o=e}function LetterProps(t,e,s,r,i,a){this.o=t,this.sw=e,this.sc=s,this.fc=r,this.m=i,this.props=a}function iterateDynamicProperties(t){var e,s=this.dynamicProperties;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t)}function reversePath(t){var e,s,r=[],i=[],a=[],n={},o=0;t.c&&(r[0]=t.o[0],i[0]=t.i[0],a[0]=t.v[0],o=1),s=t.i.length;var h=s-1;for(e=o;s>e;e+=1)r.push(t.o[h]),i.push(t.i[h]),a.push(t.v[h]),h-=1;return n.i=r,n.o=i,n.v=a,n}function Matrix(){}function matrixManagerFunction(){var t=new Matrix,e=function(e,s,r,i,a){return t.reset().translate(i,a).rotate(e).scale(s,r).toCSS()},s=function(t){return e(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])};return{getMatrix:s}}function createElement(t,e,s){if(!e){var r=Object.create(t.prototype,s),i={};return r&&"[object Function]"===i.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype._parent=t.prototype}function extendPrototype(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function bezFunction(){function t(t,e,s,r,i,a){var n=t*r+e*i+s*a-i*r-a*t-s*e;return n>-1e-4&&1e-4>n}function e(t,e,s,r,i,a,n,o,h){var l,p=Math.sqrt(Math.pow(r-t,2)+Math.pow(i-e,2)+Math.pow(a-s,2)),m=Math.sqrt(Math.pow(n-t,2)+Math.pow(o-e,2)+Math.pow(h-s,2)),f=Math.sqrt(Math.pow(n-r,2)+Math.pow(o-i,2)+Math.pow(h-a,2));return l=p>m?p>f?p-m-f:f-m-p:f>m?f-m-p:m-p-f,l>-1e-4&&1e-4>l}function s(t){this.segmentLength=0,this.points=new Array(t)}function r(t,e){this.partialLength=t,this.point=e}function i(t,e){var s=e.segments,r=s.length,i=bm_floor((r-1)*t),a=t*e.addedLength,n=0;if(a==s[i].l)return s[i].p;for(var o=s[i].l>a?-1:1,h=!0;h;)s[i].l<=a&&s[i+1].l>a?(n=(a-s[i].l)/(s[i+1].l-s[i].l),h=!1):i+=o,(0>i||i>=r-1)&&(h=!1);return s[i].p+(s[i+1].p-s[i].p)*n}function a(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,r,n,o,h){var l=new a;n=0>n?0:n>1?1:n;var p=i(n,h);o=o>1?1:o;var m,f=i(o,h),c=t.length,d=1-p,u=1-f;for(m=0;c>m;m+=1)l.pt1[m]=Math.round(1e3*(d*d*d*t[m]+(p*d*d+d*p*d+d*d*p)*s[m]+(p*p*d+d*p*p+p*d*p)*r[m]+p*p*p*e[m]))/1e3,l.pt3[m]=Math.round(1e3*(d*d*u*t[m]+(p*d*u+d*p*u+d*d*f)*s[m]+(p*p*u+d*p*f+p*d*f)*r[m]+p*p*f*e[m]))/1e3,l.pt4[m]=Math.round(1e3*(d*u*u*t[m]+(p*u*u+d*f*u+d*u*f)*s[m]+(p*f*u+d*f*f+p*u*f)*r[m]+p*f*f*e[m]))/1e3,l.pt2[m]=Math.round(1e3*(u*u*u*t[m]+(f*u*u+u*f*u+u*u*f)*s[m]+(f*f*u+u*f*f+f*u*f)*r[m]+f*f*f*e[m]))/1e3;return l}var o=(Math,function(){function t(t,e){this.l=t,this.p=e}return function(e,s,r,i){var a,n,o,h,l,p,m=defaultCurveSegments,f=0,c=[],d=[],u={addedLength:0,segments:[]};for(o=r.length,a=0;m>a;a+=1){for(l=a/(m-1),p=0,n=0;o>n;n+=1)h=bm_pow(1-l,3)*e[n]+3*bm_pow(1-l,2)*l*r[n]+3*(1-l)*bm_pow(l,2)*i[n]+bm_pow(l,3)*s[n],c[n]=h,null!==d[n]&&(p+=bm_pow(c[n]-d[n],2)),d[n]=c[n];p&&(p=bm_sqrt(p),f+=p),u.segments.push(new t(f,l))}return u.addedLength=f,u}}()),h=function(){var e={};return function(i){var a=i.s,n=i.e,o=i.to,h=i.ti,l=(a.join("_")+"_"+n.join("_")+"_"+o.join("_")+"_"+h.join("_")).replace(/\./g,"p");if(e[l])return void(i.bezierData=e[l]);var p,m,f,c,d,u,y,g=defaultCurveSegments,v=0,b=null;2===a.length&&(a[0]!=n[0]||a[1]!=n[1])&&t(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&t(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(g=2);var E=new s(g);for(f=o.length,p=0;g>p;p+=1){for(y=new Array(f),d=p/(g-1),u=0,m=0;f>m;m+=1)c=bm_pow(1-d,3)*a[m]+3*bm_pow(1-d,2)*d*(a[m]+o[m])+3*(1-d)*bm_pow(d,2)*(n[m]+h[m])+bm_pow(d,3)*n[m],y[m]=c,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),v+=u,E.points[p]=new r(u,y),b=y}E.segmentLength=v,i.bezierData=E,e[l]=E}}();return{getBezierLength:o,getNewSegment:n,buildBezierData:h,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(i,a,o){var h,l,p,m,f,c,d,u,y=i.length;for(m=0;y>m;m+=1)if(h=i[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(i[m-1].td=h.tt),l=[],p=-1,h.hasMask){var g=h.masksProperties;for(c=g.length,f=0;c>f;f+=1)if(g[f].pt.k.i)r(g[f].pt.k);else for(u=g[f].pt.k.length,d=0;u>d;d+=1)g[f].pt.k[d].s&&r(g[f].pt.k[d].s[0]),g[f].pt.k[d].e&&r(g[f].pt.k[d].e[0])}0===h.ty?(h.layers=e(h.refId,a),t(h.layers,a,o)):4===h.ty?s(h.shapes):5==h.ty&&n(h,o)}}function e(t,e){for(var s=0,r=e.length;r>s;){if(e[s].id===t)return e[s].layers;s+=1}}function s(t){var e,i,a,n=t.length,o=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)r(t[e].ks.k);else for(a=t[e].ks.k.length,i=0;a>i;i+=1)t[e].ks.k[i].s&&r(t[e].ks.k[i].s[0]),t[e].ks.k[i].e&&r(t[e].ks.k[i].e[0]);o=!0}else"gr"==t[e].ty&&s(t[e].it)}function r(t){var e,s=t.i.length;for(e=0;s>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function i(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]?!0:s[0]>t[0]?!1:t[1]>s[1]?!0:s[1]>t[1]?!1:t[2]>s[2]?!0:s[2]>t[2]?!1:void 0}function a(e,s){e.__complete||(h(e),o(e),l(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){var s,r,i=t.t.d.k,a=i.length;for(r=0;a>r;r+=1){var n=t.t.d.k[r].s;s=[];var o,h,l,p,m,f,c,d=0,u=t.t.m.g,y=0,g=0,v=0,b=[],E=0,P=0,x=e.getFontByName(n.f),S=0,C=x.fStyle.split(" "),k="normal",M="normal";for(h=C.length,o=0;h>o;o+=1)"italic"===C[o].toLowerCase()?M="italic":"bold"===C[o].toLowerCase()?k="700":"black"===C[o].toLowerCase()?k="900":"medium"===C[o].toLowerCase()?k="500":"regular"===C[o].toLowerCase()||"normal"===C[o].toLowerCase()?k="400":("light"===C[o].toLowerCase()||"thin"===C[o].toLowerCase())&&(k="200");if(n.fWeight=k,n.fStyle=M,h=n.t.length,n.sz){var A=n.sz[0],D=-1;for(o=0;h>o;o+=1)l=!1," "===n.t.charAt(o)?D=o:13===n.t.charCodeAt(o)&&(E=0,l=!0),e.chars?(c=e.getCharData(n.t.charAt(o),x.fStyle,x.fFamily),S=l?0:c.w*n.s/100):S=e.measureText(n.t.charAt(o),n.f,n.s),E+S>A?(-1===D?(n.t=n.t.substr(0,o)+"\r"+n.t.substr(o),h+=1):(o=D,n.t=n.t.substr(0,o)+"\r"+n.t.substr(o+1)),D=-1,E=0):E+=S;h=n.t.length}for(E=0,S=0,o=0;h>o;o+=1)if(l=!1," "===n.t.charAt(o)?p="\xa0":13===n.t.charCodeAt(o)?(b.push(E),P=E>P?E:P,E=0,p="",l=!0,v+=1):p=n.t.charAt(o),e.chars?(c=e.getCharData(n.t.charAt(o),x.fStyle,e.getFontByName(n.f).fFamily),S=l?0:c.w*n.s/100):S=e.measureText(p,n.f,n.s),E+=S,s.push({l:S,an:S,add:y,n:l,anIndexes:[],val:p,line:v}),2==u){if(y+=S,""==p||"\xa0"==p||o==h-1){for((""==p||"\xa0"==p)&&(y-=S);o>=g;)s[g].an=y,s[g].ind=d,s[g].extra=S,g+=1;d+=1,y=0}}else if(3==u){if(y+=S,""==p||o==h-1){for(""==p&&(y-=S);o>=g;)s[g].an=y,s[g].ind=d,s[g].extra=S,g+=1;y=0,d+=1}}else s[d].ind=d,s[d].extra=0,d+=1;if(n.l=s,P=E>P?E:P,b.push(E),n.sz)n.boxWidth=n.sz[0],n.justifyOffset=0;else switch(n.boxWidth=P,n.j){case 1:n.justifyOffset=-n.boxWidth;break;case 2:n.justifyOffset=-n.boxWidth/2;break;default:n.justifyOffset=0}n.lineWidths=b;var w=t.t.a;f=w.length;var T,F,I=[];for(m=0;f>m;m+=1){for(w[m].a.sc&&(n.strokeColorAnim=!0),w[m].a.sw&&(n.strokeWidthAnim=!0),(w[m].a.fc||w[m].a.fh||w[m].a.fs||w[m].a.fb)&&(n.fillColorAnim=!0),F=0,T=w[m].s.b,o=0;h>o;o+=1)s[o].anIndexes[m]=F,(1==T&&""!=s[o].val||2==T&&""!=s[o].val&&"\xa0"!=s[o].val||3==T&&(s[o].n||"\xa0"==s[o].val||o==h-1)||4==T&&(s[o].n||o==h-1))&&(1===w[m].s.rn&&I.push(F),F+=1);t.t.a[m].s.totalChars=F;var _,V=-1;if(1===w[m].s.rn)for(o=0;h>o;o+=1)V!=s[o].anIndexes[m]&&(V=s[o].anIndexes[m],_=I.splice(Math.floor(Math.random()*I.length),1)[0]),s[o].anIndexes[m]=_}0!==f||"m"in t.t.p||(t.singleShape=!0),n.yOffset=n.lh||1.2*n.s,n.ls=n.ls||0,n.ascent=x.ascent*n.s/100}}var o=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var s,r=e.length;for(s=0;r>s;s+=1)5===e[s].ty&&t(e[s])}var s=[4,4,14];return function(t){if(i(s,t.v)&&(e(t.layers),t.assets)){var r,a=t.assets.length;for(r=0;a>r;r+=1)t.assets[r].layers&&e(t.assets[r].layers)}}}(),h=function(){function t(e){var s,r,i,a=e.length;for(s=0;a>s;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(i=e[s].c.k.length,r=0;i>r;r+=1)e[s].c.k[r].s&&(e[s].c.k[r].s[0]/=255,e[s].c.k[r].s[1]/=255,e[s].c.k[r].s[2]/=255,e[s].c.k[r].s[3]/=255),e[s].c.k[r].e&&(e[s].c.k[r].e[0]/=255,e[s].c.k[r].e[1]/=255,e[s].c.k[r].e[2]/=255,e[s].c.k[r].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,r=e.length;for(s=0;r>s;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(i(s,t.v)&&(e(t.layers),t.assets)){var r,a=t.assets.length;for(r=0;a>r;r+=1)t.assets[r].layers&&e(t.assets[r].layers)}}}(),l=function(){function t(e){var s,r,i,a=e.length,n=!1;for(s=a-1;s>=0;s-=1)if("sh"==e[s].ty){if(e[s].ks.k.i)e[s].ks.k.c=e[s].closed;else for(i=e[s].ks.k.length,r=0;i>r;r+=1)e[s].ks.k[r].s&&(e[s].ks.k[r].s[0].c=e[s].closed),e[s].ks.k[r].e&&(e[s].ks.k[r].e[0].c=e[s].closed);n=!0}else"gr"==e[s].ty&&t(e[s].it)}function e(e){var s,r,i,a,n,o,h=e.length;for(r=0;h>r;r+=1){if(s=e[r],s.hasMask){var l=s.masksProperties;for(a=l.length,i=0;a>i;i+=1)if(l[i].pt.k.i)l[i].pt.k.c=l[i].cl;else for(o=l[i].pt.k.length,n=0;o>n;n+=1)l[i].pt.k[n].s&&(l[i].pt.k[n].s[0].c=l[i].cl),l[i].pt.k[n].e&&(l[i].pt.k[n].e[0].c=l[i].cl)}4===s.ty&&t(s.shapes)}}var s=[4,4,18];return function(t){if(i(s,t.v)&&(e(t.layers),t.assets)){var r,a=t.assets.length;for(r=0;a>r;r+=1)t.assets[r].layers&&e(t.assets[r].layers)}}}(),p={};return p.completeData=a,p}function ShapePath(){this.c=!1,this._length=0,this._maxLength=8,this.v=Array.apply(null,{length:this._maxLength}),this.o=Array.apply(null,{length:this._maxLength}),this.i=Array.apply(null,{length:this._maxLength})}function ShapeModifier(){}function TrimModifier(){}function RoundCornersModifier(){}function RepeaterModifier(){}function ShapeCollection(){this._length=0,this._maxLength=4,this.shapes=Array.apply(null,{length:this._maxLength})}function BaseRenderer(){}function SVGRenderer(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1},this.elements=[],this.pendingElements=[],this.destroyed=!1}function MaskElement(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var r,i,a,n,o,h,l,p,m=this.globalData.defs,f=this.masksProperties.length,c=this.masksProperties,d=0,u=[],y=randomString(10),g="clipPath",v="clip-path";for(r=0;f>r;r++)if(("a"!==c[r].mode&&"n"!==c[r].mode||c[r].inv||100!==c[r].o.k)&&(g="mask",v="mask"),"s"!=c[r].mode&&"i"!=c[r].mode||0!=d?o=null:(o=document.createElementNS(svgNS,"rect"),o.setAttribute("fill","#ffffff"),o.setAttribute("width",this.element.comp.data.w),o.setAttribute("height",this.element.comp.data.h),u.push(o)),i=document.createElementNS(svgNS,"path"),"n"!=c[r].mode){if(d+=1,"s"==c[r].mode?i.setAttribute("fill","#000000"):i.setAttribute("fill","#ffffff"),i.setAttribute("clip-rule","nonzero"),0!==c[r].x.k){g="mask",v="mask",p=PropertyFactory.getProp(this.element,c[r].x,0,null,this.dynamicProperties);var b="fi_"+randomString(10);h=document.createElementNS(svgNS,"filter"),h.setAttribute("id",b),l=document.createElementNS(svgNS,"feMorphology"),l.setAttribute("operator","dilate"),l.setAttribute("in","SourceGraphic"),l.setAttribute("radius","0"),h.appendChild(l),m.appendChild(h),"s"==c[r].mode?i.setAttribute("stroke","#000000"):i.setAttribute("stroke","#ffffff")}else l=null,p=null;if(this.storedData[r]={elem:i,x:p,expan:l,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==c[r].mode){n=u.length;var E=document.createElementNS(svgNS,"g");for(a=0;n>a;a+=1)E.appendChild(u[a]);var P=document.createElementNS(svgNS,"mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+d),P.appendChild(i),m.appendChild(P),E.setAttribute("mask","url(#"+y+"_"+d+")"),u.length=0,u.push(E)}else u.push(i);c[r].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[r]={elem:i,lastPath:"",op:PropertyFactory.getProp(this.element,c[r].o,0,.01,this.dynamicProperties),prop:ShapePropertyFactory.getShapeProp(this.element,c[r],3,this.dynamicProperties,null)},o&&(this.viewData[r].invRect=o),this.viewData[r].prop.k||this.drawPath(c[r],this.viewData[r].prop.v,this.viewData[r])}else this.viewData[r]={op:PropertyFactory.getProp(this.element,c[r].o,0,.01,this.dynamicProperties),prop:ShapePropertyFactory.getShapeProp(this.element,c[r],3,this.dynamicProperties,null),elem:i},m.appendChild(i);for(this.maskElement=document.createElementNS(svgNS,g),f=u.length,r=0;f>r;r+=1)this.maskElement.appendChild(u[r]);this.maskElement.setAttribute("id",y),d>0&&this.element.maskedElement.setAttribute(v,"url(#"+y+")"),m.appendChild(this.maskElement)}function BaseElement(){}function SVGBaseElement(t,e,s,r,i){this.globalData=s,this.comp=r,this.data=t,this.matteElement=null,this.transformedElement=null,this.parentContainer=e,this.layerId=i?i.layerId:"ly_"+randomString(10),this.placeholder=i,this.init()}function ITextElement(t,e,s,r){}function SVGTextElement(t,e,s,r,i){this.textSpans=[],this.renderType="svg",this._parent.constructor.call(this,t,e,s,r,i)}function SVGTintFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=document.createElementNS(svgNS,"feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var r=document.createElementNS(svgNS,"feMerge");t.appendChild(r);var i;i=document.createElementNS(svgNS,"feMergeNode"),i.setAttribute("in","SourceGraphic"),r.appendChild(i),i=document.createElementNS(svgNS,"feMergeNode"),i.setAttribute("in","f2"),r.appendChild(i)}}function SVGFillFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function SVGStrokeEffect(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function SVGTritoneFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s);var r=document.createElementNS(svgNS,"feComponentTransfer");r.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(r),this.matrixFilter=r;var i=document.createElementNS(svgNS,"feFuncR");i.setAttribute("type","table"),r.appendChild(i),this.feFuncR=i;var a=document.createElementNS(svgNS,"feFuncG");a.setAttribute("type","table"),r.appendChild(a),this.feFuncG=a;var n=document.createElementNS(svgNS,"feFuncB");n.setAttribute("type","table"),r.appendChild(n),this.feFuncB=n}function SVGProLevelsFilter(t,e){this.filterManager=e;var s=this.filterManager.effectElements,r=document.createElementNS(svgNS,"feComponentTransfer");(s[9].p.k||0!==s[9].p.v||s[10].p.k||1!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||0!==s[12].p.v||s[13].p.k||1!==s[13].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",r)),(s[16].p.k||0!==s[16].p.v||s[17].p.k||1!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||0!==s[19].p.v||s[20].p.k||1!==s[20].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",r)),(s[23].p.k||0!==s[23].p.v||s[24].p.k||1!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||0!==s[26].p.v||s[27].p.k||1!==s[27].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",r)),(s[30].p.k||0!==s[30].p.v||s[31].p.k||1!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||0!==s[33].p.v||s[34].p.k||1!==s[34].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",r)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(r.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(r),r=document.createElementNS(svgNS,"feComponentTransfer")),(s[2].p.k||0!==s[2].p.v||s[3].p.k||1!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||0!==s[5].p.v||s[6].p.k||1!==s[6].p.v)&&(r.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(r),this.feFuncRComposed=this.createFeFunc("feFuncR",r),this.feFuncGComposed=this.createFeFunc("feFuncG",r),this.feFuncBComposed=this.createFeFunc("feFuncB",r))}function SVGDropShadowEffect(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var s=document.createElementNS(svgNS,"feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var r=document.createElementNS(svgNS,"feOffset");r.setAttribute("dx","25"),r.setAttribute("dy","0"),r.setAttribute("in","drop_shadow_1"),r.setAttribute("result","drop_shadow_2"),this.feOffset=r,t.appendChild(r);var i=document.createElementNS(svgNS,"feFlood");i.setAttribute("flood-color","#00ff00"),i.setAttribute("flood-opacity","1"),i.setAttribute("result","drop_shadow_3"),this.feFlood=i,t.appendChild(i);var a=document.createElementNS(svgNS,"feComposite");a.setAttribute("in","drop_shadow_3"),a.setAttribute("in2","drop_shadow_2"),a.setAttribute("operator","in"),a.setAttribute("result","drop_shadow_4"),t.appendChild(a);var n=document.createElementNS(svgNS,"feMerge");t.appendChild(n);var o;o=document.createElementNS(svgNS,"feMergeNode"),n.appendChild(o),o=document.createElementNS(svgNS,"feMergeNode"),o.setAttribute("in","SourceGraphic"),this.feMergeNode=o,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(o)}function SVGEffects(t){var e,s=t.data.ef.length,r=randomString(10),i=filtersFactory.createFilter(r),a=0;this.filters=[];var n;for(e=0;s>e;e+=1)20===t.data.ef[e].ty?(a+=1,n=new SVGTintFilter(i,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(a+=1,n=new SVGFillFilter(i,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new SVGStrokeEffect(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(a+=1,n=new SVGTritoneFilter(i,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty?(a+=1,n=new SVGProLevelsFilter(i,t.effects.effectElements[e]),this.filters.push(n)):25===t.data.ef[e].ty&&(a+=1,n=new SVGDropShadowEffect(i,t.effects.effectElements[e]),this.filters.push(n));a&&(t.globalData.defs.appendChild(i),t.layerElement.setAttribute("filter","url(#"+r+")"))}function ICompElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?Array.apply(null,{length:this.layers.length}):[],this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.xt?(this.layerElement=document.createElementNS(svgNS,"g"),this.buildAllItems()):s.progressiveLoad||this.buildAllItems()}function IImageElement(t,e,s,r,i){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,r,i)}function IShapeElement(t,e,s,r,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this._parent.constructor.call(this,t,e,s,r,i)}function ISolidElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i)}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig={clearCanvas:e&&void 0!==e.clearCanvas?e.clearCanvas:!0,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet"},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1},this.contextData={saved:Array.apply(null,{length:15}),savedOp:Array.apply(null,{length:15}),cArrPos:0,cTr:new Matrix,cO:1};var s,r=15;for(s=0;r>s;s+=1)this.contextData.saved[s]=Array.apply(null,{length:16});this.elements=[],this.pendingElements=[],this.transformMat=new Matrix,this.completeLayers=!1}function HybridRenderer(t){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.pendingElements=[],this.elements=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0}function CVBaseElement(t,e,s){this.globalData=s,this.data=t,this.comp=e,this.canvasContext=s.canvasContext,this.init()}function CVCompElement(t,e,s){this._parent.constructor.call(this,t,e,s);var r={};for(var i in s)s.hasOwnProperty(i)&&(r[i]=s[i]);r.renderer=this,r.compHeight=this.data.h,r.compWidth=this.data.w,this.renderConfig={clearCanvas:!0},this.contextData={saved:Array.apply(null,{length:15}),savedOp:Array.apply(null,{length:15}),cArrPos:0,cTr:new Matrix,cO:1},this.completeLayers=!1;var a,n=15;for(a=0;n>a;a+=1)this.contextData.saved[a]=Array.apply(null,{length:16});this.transformMat=new Matrix,this.parentGlobalData=this.globalData;var o=document.createElement("canvas");r.canvasContext=o.getContext("2d"),this.canvasContext=r.canvasContext,o.width=this.data.w,o.height=this.data.h,this.canvas=o,this.globalData=r,this.layers=t.layers,this.pendingElements=[],this.elements=Array.apply(null,{length:this.layers.length}),this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),(this.data.xt||!s.progressiveLoad)&&this.buildAllItems()}function CVImageElement(t,e,s){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s),this.globalData.addPendingElement()}function CVMaskElement(t,e){this.data=t,this.element=e,this.dynamicProperties=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length);var s,r=this.masksProperties.length;for(s=0;r>s;s++)this.viewData[s]=ShapePropertyFactory.getShapeProp(this.element,this.masksProperties[s],3,this.dynamicProperties,null)}function CVShapeElement(t,e,s){this.shapes=[],this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this.shapesData=t.shapes,this.firstFrame=!0,this._parent.constructor.call(this,t,e,s)}function CVSolidElement(t,e,s){this._parent.constructor.call(this,t,e,s)}function CVTextElement(t,e,s){this.textSpans=[],this.yOffset=0,this.fillColorAnim=!1,this.strokeColorAnim=!1,this.strokeWidthAnim=!1,this.stroke=!1,this.fill=!1,this.justifyOffset=0,this.currentRender=null,this.renderType="canvas",this.values={fill:"rgba(0,0,0,0)",stroke:"rgba(0,0,0,0)",sWidth:0,fValue:""},this._parent.constructor.call(this,t,e,s)}function HBaseElement(t,e,s,r,i){this.globalData=s,this.comp=r,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=i?i.layerId:"ly_"+randomString(10),this.placeholder=i,this.init()}function HSolidElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i)}function HCompElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=Array.apply(null,{length:this.layers.length}),this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.hasMask&&(this.supports3d=!1),this.data.xt&&(this.layerElement=document.createElement("div")),this.buildAllItems()}function HShapeElement(t,e,s,r,i){this.shapes=[],this.shapeModifiers=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this._parent.constructor.call(this,t,e,s,r,i),this.addedTransforms={mdf:!1,mats:[this.finalTransform.mat]},this.currentBBox={x:999999,y:-999999,h:0,w:0}}function HTextElement(t,e,s,r,i){this.textSpans=[],this.textPaths=[],this.currentBBox={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this._parent.constructor.call(this,t,e,s,r,i)}function HImageElement(t,e,s,r,i){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,r,i)}function HCameraElement(t,e,s,r,i){if(this._parent.constructor.call(this,t,e,s,r,i),this.pe=PropertyFactory.getProp(this,t.pe,0,0,this.dynamicProperties),t.ks.p.s?(this.px=PropertyFactory.getProp(this,t.ks.p.x,1,0,this.dynamicProperties),this.py=PropertyFactory.getProp(this,t.ks.p.y,1,0,this.dynamicProperties),this.pz=PropertyFactory.getProp(this,t.ks.p.z,1,0,this.dynamicProperties)):this.p=PropertyFactory.getProp(this,t.ks.p,1,0,this.dynamicProperties),t.ks.a&&(this.a=PropertyFactory.getProp(this,t.ks.a,1,0,this.dynamicProperties)),t.ks.or.k.length&&t.ks.or.k[0].to){var a,n=t.ks.or.k.length;for(a=0;n>a;a+=1)t.ks.or.k[a].to=null,t.ks.or.k[a].ti=null}this.or=PropertyFactory.getProp(this,t.ks.or,1,degToRads,this.dynamicProperties),this.or.sh=!0,this.rx=PropertyFactory.getProp(this,t.ks.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(this,t.ks.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(this,t.ks.rz,0,degToRads,this.dynamicProperties),this.mat=new Matrix}function SliderEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function AngleEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function ColorEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function PointEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function LayerIndexEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function MaskIndexEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function CheckboxEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function NoValueEffect(){this.p={}}function EffectsManager(t,e,s){var r=t.ef;this.effectElements=[];var i,a,n=r.length;for(i=0;n>i;i++)a=new GroupEffect(r[i],e,s),this.effectElements.push(a)}function GroupEffect(t,e,s){this.dynamicProperties=[],this.init(t,e,this.dynamicProperties),this.dynamicProperties.length&&s.push(this)}function play(t){animationManager.play(t)}function pause(t){animationManager.pause(t)}function togglePause(t){animationManager.togglePause(t)}function setSpeed(t,e){animationManager.setSpeed(t,e)}function setDirection(t,e){animationManager.setDirection(t,e)}function stop(t){animationManager.stop(t)}function moveFrame(t){animationManager.moveFrame(t)}function searchAnimations(){standalone===!0?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function registerAnimation(t){return animationManager.registerAnimation(t)}function resize(){animationManager.resize()}function start(){animationManager.start()}function goToAndStop(t,e,s){animationManager.goToAndStop(t,e,s)}function setSubframeRendering(t){subframeEnabled=t}function loadAnimation(t){return standalone===!0&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function destroy(t){return animationManager.destroy(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&t>1&&(defaultCurveSegments=t);roundValues(defaultCurveSegments>=50?!1:!0)}function installPlugin(t,e){"expressions"===t&&(expressionsPlugin=e)}function getFactory(t){switch(t){case"propertyFactory":return PropertyFactory;case"shapePropertyFactory":return ShapePropertyFactory;case"matrix":return Matrix}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),s=0;s<e.length;s++){var r=e[s].split("=");if(decodeURIComponent(r[0])==t)return decodeURIComponent(r[1])}}var svgNS="http://www.w3.org/2000/svg",subframeEnabled=!0,expressionsPlugin,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,blitter=10,BMMath={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;s>t;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,r=Array.apply(null,{length:t.length}),i=t.length;for(s=0;i>s;s+=1)r[s]=Math.abs(t[s]);return r}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;roundValues(!1);var rgbToHex=function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+s[t]+s[e]+s[r]}}(),fillColorToString=function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),
-t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),Matrix=function(){function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function s(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function r(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function a(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),r=Math.sin(e);return this._t(s,r,0,0,-r,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-r,0,0,r,s,0,0,0,0,1,0,0,0,0,1)}function h(t,e,s){return s=isNaN(s)?1:s,1==t&&1==e&&1==s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function l(t,e,s,r,i,a,n,o,h,l,p,m,f,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=r,this.props[4]=i,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=m,this.props[12]=f,this.props[13]=c,this.props[14]=d,this.props[15]=u,this}function p(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function m(t,e,s,r,i,a,n,o,h,l,p,m,f,c,d,u){if(1===t&&0===e&&0===s&&0===r&&0===i&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return(0!==f||0!==c||0!==d)&&(this.props[12]=this.props[12]*t+this.props[13]*i+this.props[14]*h+this.props[15]*f,this.props[13]=this.props[12]*e+this.props[13]*a+this.props[14]*l+this.props[15]*c,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*p+this.props[15]*d,this.props[15]=this.props[12]*r+this.props[13]*o+this.props[14]*m+this.props[15]*u),this;var y=this.props[0],g=this.props[1],v=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],x=this.props[6],S=this.props[7],C=this.props[8],k=this.props[9],M=this.props[10],A=this.props[11],D=this.props[12],w=this.props[13],T=this.props[14],F=this.props[15];return this.props[0]=y*t+g*i+v*h+b*f,this.props[1]=y*e+g*a+v*l+b*c,this.props[2]=y*s+g*n+v*p+b*d,this.props[3]=y*r+g*o+v*m+b*u,this.props[4]=E*t+P*i+x*h+S*f,this.props[5]=E*e+P*a+x*l+S*c,this.props[6]=E*s+P*n+x*p+S*d,this.props[7]=E*r+P*o+x*m+S*u,this.props[8]=C*t+k*i+M*h+A*f,this.props[9]=C*e+k*a+M*l+A*c,this.props[10]=C*s+k*n+M*p+A*d,this.props[11]=C*r+k*o+M*m+A*u,this.props[12]=D*t+w*i+T*h+F*f,this.props[13]=D*e+w*a+T*l+F*c,this.props[14]=D*s+w*n+T*p+F*d,this.props[15]=D*r+w*o+T*m+F*u,this}function f(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function c(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function d(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function u(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function y(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function g(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function v(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,r=-this.props[1]/e,i=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*i+n,t[0]*r+t[1]*a+o,0]}function b(t){var e,s=t.length,r=[];for(e=0;s>e;e+=1)r[e]=v(t[e]);return r}function E(t,e,s,r){if(r&&2===r){var i=point_pool.newPoint();return i[0]=t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],i[1]=t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],i}return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function P(t,e){return bm_rnd(t*this.props[0]+e*this.props[4]+this.props[12])+","+bm_rnd(t*this.props[1]+e*this.props[5]+this.props[13])}function x(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function S(){return isSafari?"matrix3d("+roundTo2Decimals(this.props[0])+","+roundTo2Decimals(this.props[1])+","+roundTo2Decimals(this.props[2])+","+roundTo2Decimals(this.props[3])+","+roundTo2Decimals(this.props[4])+","+roundTo2Decimals(this.props[5])+","+roundTo2Decimals(this.props[6])+","+roundTo2Decimals(this.props[7])+","+roundTo2Decimals(this.props[8])+","+roundTo2Decimals(this.props[9])+","+roundTo2Decimals(this.props[10])+","+roundTo2Decimals(this.props[11])+","+roundTo2Decimals(this.props[12])+","+roundTo2Decimals(this.props[13])+","+roundTo2Decimals(this.props[14])+","+roundTo2Decimals(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function C(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function k(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=r,this.rotateZ=i,this.skew=n,this.skewFromAxis=o,this.shear=a,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=d,this.applyToX=u,this.applyToY=y,this.applyToZ=g,this.applyToPointArray=E,this.applyToPointStringified=P,this.toArray=x,this.toCSS=S,this.to2dCSS=C,this.toString=k,this.clone=f,this.cloneFromProps=c,this.inversePoints=b,this.inversePoint=v,this._t=this.transform,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}();!function(t,e){function s(s,l,p){var c=[];l=1==l?{entropy:!0}:l||{};var v=n(a(l.entropy?[s,h(t)]:null==s?o():s,3),c),b=new r(c),E=function(){for(var t=b.g(f),e=u,s=0;y>t;)t=(t+s)*m,e*=m,s=b.g(1);for(;t>=g;)t/=2,e/=2,s>>>=1;return(t+s)/e};return E.int32=function(){return 0|b.g(4)},E.quick=function(){return b.g(4)/4294967296},E["double"]=E,n(h(b.S),t),(l.pass||p||function(t,s,r,a){return a&&(a.S&&i(a,b),t.state=function(){return i(b,{})}),r?(e[d]=t,s):t})(E,v,"global"in l?l.global:this==e,l.state)}function r(t){var e,s=t.length,r=this,i=0,a=r.i=r.j=0,n=r.S=[];for(s||(t=[s++]);m>i;)n[i]=i++;for(i=0;m>i;i++)n[i]=n[a=v&a+t[i%s]+(e=n[i])],n[a]=e;(r.g=function(t){for(var e,s=0,i=r.i,a=r.j,n=r.S;t--;)e=n[i=v&i+1],s=s*m+n[v&(n[i]=n[a=v&a+e])+(n[a]=e)];return r.i=i,r.j=a,s})(m)}function i(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function a(t,e){var s,r=[],i=typeof t;if(e&&"object"==i)for(s in t)try{r.push(a(t[s],e-1))}catch(n){}return r.length?r:"string"==i?t:t+"\x00"}function n(t,e){for(var s,r=t+"",i=0;i<r.length;)e[v&i]=v&(s^=19*e[v&i])+r.charCodeAt(i++);return h(e)}function o(){try{if(l)return h(l.randomBytes(m));var e=new Uint8Array(m);return(p.crypto||p.msCrypto).getRandomValues(e),h(e)}catch(s){var r=p.navigator,i=r&&r.plugins;return[+new Date,p,i,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,c=52,d="random",u=e.pow(m,f),y=e.pow(2,c),g=2*y,v=m-1;e["seed"+d]=s,n(e.random(),t)}([],BMMath);var BezierFactory=function(){function t(t,e,s,r,i){var a=i||("bez_"+t+"_"+e+"_"+s+"_"+r).replace(/\./g,"p");if(p[a])return p[a];var n=new h([t,e,s,r]);return p[a]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function r(t){return 3*t}function i(t,i,a){return((e(i,a)*t+s(i,a))*t+r(i))*t}function a(t,i,a){return 3*e(i,a)*t*t+2*s(i,a)*t+r(i)}function n(t,e,s,r,a){var n,o,h=0;do o=e+(s-e)/2,n=i(o,r,a)-t,n>0?s=o:e=o;while(Math.abs(n)>c&&++h<d);return o}function o(t,e,s,r){for(var n=0;m>n;++n){var o=a(e,s,r);if(0===o)return e;var h=i(e,s,r)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=g?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var l={};l.getBezierEasing=t;var p={},m=4,f=.001,c=1e-7,d=10,u=11,y=1/(u-1),g="function"==typeof Float32Array;return h.prototype={get:function(t){var e=this._p[0],s=this._p[1],r=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===s&&r===a?t:0===t?0:1===t?1:i(this._getTForX(t),s,a)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],r=this._p[3];this._precomputed=!0,(t!==e||s!==r)&&this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;u>s;++s)this._mSampleValues[s]=i(s*y,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],r=this._mSampleValues,i=0,h=1,l=u-1;h!==l&&r[h]<=t;++h)i+=y;--h;var p=(t-r[h])/(r[h+1]-r[h]),m=i+p*y,c=a(m,e,s);return c>=f?o(t,m,e,s):0===c?m:n(t,i,i+y,e,s)}},l}(),MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var r=(new Date).getTime(),i=Math.max(0,16-(r-t)),a=window.setTimeout(function(){e(r+i)},i);return t=r+i,a}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var r=document.createElement("span");r.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(r),document.body.appendChild(s);var i=r.offsetWidth;return r.style.fontFamily=t+", "+e,{node:r,w:i,parent:s}}function e(){var t,s,r,i=this.fonts.length,a=i;for(t=0;i>t;t+=1)if(this.fonts[t].loaded)a-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,r=this.fonts[t].monoCase.w,s.offsetWidth!==r?(a-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,r=this.fonts[t].sansCase.w,s.offsetWidth!==r&&(a-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==a&&Date.now()-this.initTime<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(svgNS,"text");s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s);var r=document.createElement("canvas").getContext("2d");return r.font="100px "+e.fFamily,r}function r(r,i){if(!r)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=r.list);var a,n=r.list,o=n.length;for(a=0;o>a;a+=1){if(n[a].loaded=!1,n[a].monoCase=t(n[a].fFamily,"monospace"),n[a].sansCase=t(n[a].fFamily,"sans-serif"),n[a].fPath){if("p"===n[a].fOrigin||3===n[a].origin){var h=document.createElement("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[a].fFamily+"; font-style: normal; src: url('"+n[a].fPath+"');}",i.appendChild(h)}else if("g"===n[a].fOrigin||1===n[a].origin){var l=document.createElement("link");l.type="text/css",l.rel="stylesheet",l.href=n[a].fPath,i.appendChild(l)}else if("t"===n[a].fOrigin||2===n[a].origin){var p=document.createElement("script");p.setAttribute("src",n[a].fPath),i.appendChild(p)}}else n[a].loaded=!0;n[a].helper=s(i,n[a]),this.fonts.push(n[a])}e.bind(this)()}function i(t){if(t){this.chars||(this.chars=[]);var e,s,r,i=t.length,a=this.chars.length;for(e=0;i>e;e+=1){for(s=0,r=!1;a>s;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(r=!0),s+=1;r||(this.chars.push(t[e]),a+=1)}}}function a(t,e,s){for(var r=0,i=this.chars.length;i>r;){if(this.chars[r].ch===t&&this.chars[r].style===e&&this.chars[r].fFamily===s)return this.chars[r];r+=1}}function n(t,e,s){var r=this.getFontByName(e),i=r.helper;return i.measureText(t).width*s/100}function o(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var h=5e3,l=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return l.prototype.addChars=i,l.prototype.addFonts=r,l.prototype.getCharData=a,l.prototype.getFontByName=o,l.prototype.measureText=n,l}(),PropertyFactory=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(!(t===this.lastFrame||this.lastFrame!==l&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime))){for(var e,s,r=this.lastFrame<t?this._lastIndex:0,i=this.keyframes.length-1,a=!0;a;){if(e=this.keyframes[r],s=this.keyframes[r+1],r==i-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;i-1>r?r+=1:a=!1}this._lastIndex=r;var n,o,h,p,m,f;if(e.to){e.bezierData||bez.buildBezierData(e);var c=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var d=t>=s.t-this.offsetTime?c.points.length-1:0;for(o=c.points[d].point.length,n=0;o>n;n+=1)this.pv[n]=c.points[d].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);this._lastBezierData=null}else{e.__fnct?f=e.__fnct:(f=BezierFactory.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=f),h=f((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var u,y=c.segmentLength*h,g=this.lastFrame<t&&this._lastBezierData===c?this._lastAddedLength:0;for(m=this.lastFrame<t&&this._lastBezierData===c?this._lastPoint:0,a=!0,p=c.points.length;a;){if(g+=c.points[m].partialLength,0===y||0===h||m==c.points.length-1){for(o=c.points[m].point.length,n=0;o>n;n+=1)this.pv[n]=c.points[m].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}if(y>=g&&y<g+c.points[m+1].partialLength){for(u=(y-g)/c.points[m+1].partialLength,o=c.points[m].point.length,n=0;o>n;n+=1)this.pv[n]=c.points[m].point[n]+(c.points[m+1].point[n]-c.points[m].point[n])*u,this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}p-1>m?m+=1:a=!1}this._lastPoint=m,this._lastAddedLength=g-c.points[m].partialLength,this._lastBezierData=c}}else{var v,b,E,P,x;for(i=e.s.length,r=0;i>r;r+=1){if(1!==e.h&&(t>=s.t-this.offsetTime?h=1:t<e.t-this.offsetTime?h=0:(e.o.x instanceof Array?(e.__fnct||(e.__fnct=[]),e.__fnct[r]?f=e.__fnct[r]:(v=e.o.x[r]||e.o.x[0],b=e.o.y[r]||e.o.y[0],E=e.i.x[r]||e.i.x[0],P=e.i.y[r]||e.i.y[0],f=BezierFactory.getBezierEasing(v,b,E,P).get,e.__fnct[r]=f)):e.__fnct?f=e.__fnct:(v=e.o.x,b=e.o.y,E=e.i.x,P=e.i.y,f=BezierFactory.getBezierEasing(v,b,E,P).get,e.__fnct=f),h=f((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime))))),this.sh&&1!==e.h){var S=e.s[r],C=e.e[r];-180>S-C?S+=360:S-C>180&&(S-=360),x=S+(C-S)*h}else x=1===e.h?e.s[r]:e.s[r]+(e.e[r]-e.s[r])*h;1===i?(this.v=this.mult?x*this.mult:x,this.pv=x,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[r]=this.mult?x*this.mult:x,this.pv[r]=x,this.lastPValue[r]!==this.pv[r]&&(this.mdf=!0,this.lastPValue[r]=this.pv[r]))}}}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){}function s(t,s,r){this.mult=r,this.v=r?s.k*r:s.k,this.pv=s.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=e}function r(t,s,r){this.mult=r,this.data=s,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=Array.apply(null,{length:s.k.length}),this.pv=Array.apply(null,{length:s.k.length}),this.lastValue=Array.apply(null,{length:s.k.length});var i=Array.apply(null,{length:s.k.length});this.vel=i.map(function(){return 0});var a,n=s.k.length;for(a=0;n>a;a+=1)this.v[a]=r?s.k[a]*r:s.k[a],this.pv[a]=s.k[a];this.getValue=e}function i(e,s,r){this.keyframes=s.k,this.offsetTime=e.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this._lastIndex=0,this.k=!0,this.kf=!0,this.data=s,this.mult=r,this.elem=e,this.comp=e.comp,this.lastFrame=l,this.v=r?s.k[0].s[0]*r:s.k[0].s[0],this.pv=s.k[0].s[0],this.getValue=t}function a(e,s,r){var i,a,n,o,h,p=s.k.length;for(i=0;p-1>i;i+=1)s.k[i].to&&s.k[i].s&&s.k[i].e&&(a=s.k[i].s,n=s.k[i].e,o=s.k[i].to,h=s.k[i].ti,(2===a.length&&(a[0]!==n[0]||a[1]!==n[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])||3===a.length&&(a[0]!==n[0]||a[1]!==n[1]||a[2]!==n[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],a[0]+o[0],a[1]+o[1],a[2]+o[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],n[0]+h[0],n[1]+h[1],n[2]+h[2]))&&(s.k[i].to=null,s.k[i].ti=null));this.keyframes=s.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this.mult=r,this.elem=e,this.comp=e.comp,this.getValue=t,this.frameId=-1,this._lastIndex=0,this.v=Array.apply(null,{length:s.k[0].s.length}),this.pv=Array.apply(null,{length:s.k[0].s.length}),this.lastValue=Array.apply(null,{length:s.k[0].s.length}),this.lastPValue=Array.apply(null,{length:s.k[0].s.length}),this.lastFrame=l}function n(t,e,n,o,h){var l;if(2===n)l=new p(t,e,h);else if(0===e.a)l=0===n?new s(t,e,o):new r(t,e,o);else if(1===e.a)l=0===n?new i(t,e,o):new a(t,e,o);else if(e.k.length)if("number"==typeof e.k[0])l=new r(t,e,o);else switch(n){case 0:l=new i(t,e,o);break;case 1:l=new a(t,e,o)}else l=new s(t,e,o);return l.k&&h.push(l),l}function o(t,e,s,r){return new f(t,e,s,r)}function h(t,e,s){return new c(t,e,s)}var l=-999999,p=function(){function t(){return ExpressionValue(this.p)}function e(){return ExpressionValue(this.px)}function s(){return ExpressionValue(this.py)}function r(){return ExpressionValue(this.a)}function i(){return ExpressionValue(this.or)}function a(){return ExpressionValue(this.r,1/degToRads)}function n(){return ExpressionValue(this.s,100)}function o(){return ExpressionValue(this.o,100)}function h(){return ExpressionValue(this.sk)}function l(){return ExpressionValue(this.sa)}function p(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function m(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,r;this.p.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/this.elem.globalData.frameRate,0),r=this.p.getValueAtTime(this.p.keyframes[0].t/this.elem.globalData.frameRate,0)):this.p.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/this.elem.globalData.frameRate,0),r=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/this.elem.globalData.frameRate,0)):(s=this.p.pv,r=this.p.getValueAtTime((this.p.lastFrame+this.p.offsetTime-.01)/this.elem.globalData.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-r[1],s[0]-r[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function f(){this.inverted=!0,this.iv=new Matrix,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function c(){}return function(d,u,y){this.elem=d,this.frameId=-1,this.type="transform",this.dynamicProperties=[],this.mdf=!1,this.data=u,this.getValue=m,this.applyToMatrix=p,this.setInverted=f,this.autoOrient=c,this.v=new Matrix,u.p.s?(this.px=PropertyFactory.getProp(d,u.p.x,0,0,this.dynamicProperties),this.py=PropertyFactory.getProp(d,u.p.y,0,0,this.dynamicProperties),u.p.z&&(this.pz=PropertyFactory.getProp(d,u.p.z,0,0,this.dynamicProperties))):this.p=PropertyFactory.getProp(d,u.p,1,0,this.dynamicProperties),u.r?this.r=PropertyFactory.getProp(d,u.r,0,degToRads,this.dynamicProperties):u.rx&&(this.rx=PropertyFactory.getProp(d,u.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(d,u.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(d,u.rz,0,degToRads,this.dynamicProperties),this.or=PropertyFactory.getProp(d,u.or,1,degToRads,this.dynamicProperties)),u.sk&&(this.sk=PropertyFactory.getProp(d,u.sk,0,degToRads,this.dynamicProperties),this.sa=PropertyFactory.getProp(d,u.sa,0,degToRads,this.dynamicProperties)),u.a&&(this.a=PropertyFactory.getProp(d,u.a,1,0,this.dynamicProperties)),u.s&&(this.s=PropertyFactory.getProp(d,u.s,1,.01,this.dynamicProperties)),this.o=u.o?PropertyFactory.getProp(d,u.o,0,.01,y):{mdf:!1,v:1},this.dynamicProperties.length?y.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?u.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"xPosition",{get:e}),Object.defineProperty(this,"yPosition",{get:s}),Object.defineProperty(this,"orientation",{get:i}),Object.defineProperty(this,"anchorPoint",{get:r}),Object.defineProperty(this,"rotation",{get:a}),Object.defineProperty(this,"scale",{get:n}),Object.defineProperty(this,"opacity",{get:o}),Object.defineProperty(this,"skew",{get:h}),Object.defineProperty(this,"skewAxis",{get:l})}}(),m=function(){function t(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,r,i=4*this.data.p;for(e=0;i>e;e+=1)s=e%4===0?100:255,r=Math.round(this.prop.v[e]*s),this.c[e]!==r&&(this.c[e]=r,this.cmdf=!0);if(this.o.length)for(i=this.prop.v.length,e=4*this.data.p;i>e;e+=1)s=e%2===0?100:1,r=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==r&&(this.o[e-4*this.data.p]=r,this.omdf=!0)}}function e(e,s,r){this.prop=n(e,s.k,1,null,[]),this.data=s,this.k=this.prop.k,this.c=Array.apply(null,{length:4*s.p});var i=s.k.k[0].s?s.k.k[0].s.length-4*s.p:s.k.k.length-4*s.p;this.o=Array.apply(null,{length:i}),this.cmdf=!1,this.omdf=!1,this.getValue=t,this.prop.k&&r.push(this),this.getValue(!0)}return function(t,s,r){return new e(t,s,r)}}(),f=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,r,i){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=r,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var a,n,o=s.length;for(a=0;o>a;a+=1)n=PropertyFactory.getProp(e,s[a].v,0,0,i),this.k=n.k?!0:this.k,this.dataProps[a]={n:s[a].n,p:n};this.getValue=t,this.k?i.push(this):this.getValue(!0)}}(),c=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0)}var s=this.data.totalChars,r=2===this.data.r?1:100/s,i=this.o.v/r,a=this.s.v/r+i,n=this.e.v/r+i;if(a>n){var o=a;a=n,n=o}this.finalS=a,this.finalE=n}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,a=0,n=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)a=o===n?t>=o?1:0:s(0,r(.5/(o-n)+(t-n)/(o-n),1)),a=e(a);else if(3==h)a=o===n?t>=o?0:1:1-s(0,r(.5/(o-n)+(t-n)/(o-n),1)),a=e(a);else if(4==h)o===n?a=0:(a=s(0,r(.5/(o-n)+(t-n)/(o-n),1)),.5>a?a*=2:a=1-2*(a-.5)),a=e(a);else if(5==h){if(o===n)a=0;else{var l=o-n;t=r(s(0,t+.5-n),o-n);var p=-l/2+t,m=l/2;a=Math.sqrt(1-p*p/(m*m))}a=e(a)}else 6==h?(o===n?a=0:(t=r(s(0,t+.5-n),o-n),a=(1+Math.cos(Math.PI+2*Math.PI*t/(o-n)))/2),a=e(a)):(t>=i(n)&&(a=0>t-n?1-(n-t):s(0,r(o-t,1))),a=e(a));return a*this.a.v}var s=Math.max,r=Math.min,i=Math.floor;return function(s,r,i){this.mdf=!1,this.k=!1,this.data=r,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=PropertyFactory.getProp(s,r.s||{k:0},0,0,this.dynamicProperties),this.e="e"in r?PropertyFactory.getProp(s,r.e,0,0,this.dynamicProperties):{v:2===r.r?r.totalChars:100},this.o=PropertyFactory.getProp(s,r.o||{k:0},0,0,this.dynamicProperties),this.xe=PropertyFactory.getProp(s,r.xe||{k:0},0,0,this.dynamicProperties),this.ne=PropertyFactory.getProp(s,r.ne||{k:0},0,0,this.dynamicProperties),this.a=PropertyFactory.getProp(s,r.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?i.push(this):this.getValue()}}(),d={};return d.getProp=n,d.getDashProp=o,d.getTextSelectorProp=h,d.getGradientProp=m,d}();ShapePath.prototype.setPathData=function(t,e){for(this.c=t;e>this._maxLength;)this.doubleArrayLength();for(var s=0;e>s;)this.v[s]=point_pool.newPoint(),this.o[s]=point_pool.newPoint(),this.i[s]=point_pool.newPoint(),s+=1;this._length=e},ShapePath.prototype.doubleArrayLength=function(){this.v=this.v.concat(Array.apply(null,{length:this._maxLength})),this.i=this.i.concat(Array.apply(null,{length:this._maxLength})),this.o=this.o.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2},ShapePath.prototype.setXYAt=function(t,e,s,r,i){var a;switch(this._length=Math.max(this._length,r+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}(!a[r]||a[r]&&!i)&&(a[r]=point_pool.newPoint()),a[r][0]=t,a[r][1]=e},ShapePath.prototype.setTripleAt=function(t,e,s,r,i,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(s,r,"o",n,o),this.setXYAt(i,a,"i",n,o)};var ShapePropertyFactory=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame===n||!(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)){var e,s,r;if(t<this.keyframes[0].t-this.offsetTime)e=this.keyframes[0].s[0],r=!0,this._lastIndex=0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],r=!0;else{for(var i,a,o,h,l,p,m=this.lastFrame<n?this._lastIndex:0,f=this.keyframes.length-1,c=!0;c&&(i=this.keyframes[m],a=this.keyframes[m+1],!(a.t-this.offsetTime>t));)f-1>m?m+=1:c=!1;r=1===i.h,this._lastIndex=m;var d;if(!r){if(t>=a.t-this.offsetTime)d=1;else if(t<i.t-this.offsetTime)d=0;else{var u;i.__fnct?u=i.__fnct:(u=BezierFactory.getBezierEasing(i.o.x,i.o.y,i.i.x,i.i.y).get,i.__fnct=u),d=u((t-(i.t-this.offsetTime))/(a.t-this.offsetTime-(i.t-this.offsetTime)))}s=i.e[0]}e=i.s[0]}h=this.v._length,p=e.i[0].length;var y,g=!1;for(o=0;h>o;o+=1)for(l=0;p>l;l+=1)r?(y=e.i[o][l],this.v.i[o][l]!==y&&(this.v.i[o][l]=y,this.pv.i[o][l]=y,g=!0),y=e.o[o][l],this.v.o[o][l]!==y&&(this.v.o[o][l]=y,this.pv.o[o][l]=y,g=!0),y=e.v[o][l],this.v.v[o][l]!==y&&(this.v.v[o][l]=y,this.pv.v[o][l]=y,g=!0)):(y=e.i[o][l]+(s.i[o][l]-e.i[o][l])*d,this.v.i[o][l]!==y&&(this.v.i[o][l]=y,this.pv.i[o][l]=y,g=!0),y=e.o[o][l]+(s.o[o][l]-e.o[o][l])*d,this.v.o[o][l]!==y&&(this.v.o[o][l]=y,this.pv.o[o][l]=y,g=!0),y=e.v[o][l]+(s.v[o][l]-e.v[o][l])*d,this.v.v[o][l]!==y&&(this.v.v[o][l]=y,this.pv.v[o][l]=y,g=!0));this.mdf=g,this.v.c=e.c,this.paths=this.localShapeCollection}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){return this.v}function s(){this.paths=this.localShapeCollection,this.k||(this.mdf=!1)}function r(t,r,i){this.comp=t.comp,this.k=!1,this.mdf=!1,this.v=shape_pool.newShape();var a=3===i?r.pt.k:r.ks.k;this.v.v=a.v,this.v.i=a.i,this.v.o=a.o,this.v.c=a.c,this.v._length=this.v.v.length,this.getValue=e,this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s}function i(e,r,i){this.comp=e.comp,this.elem=e,this.offsetTime=e.data.st,this._lastIndex=0,this.getValue=t,this.keyframes=3===i?r.pt.k:r.ks.k,this.k=!0,this.kf=!0;{var a=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length}this.v=shape_pool.newShape(),this.v.setPathData(this.keyframes[0].s[0].c,a),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=n,this.reset=s}function a(t,e,s,a){var n;if(3===s||4===s){var p=3===s?e.pt:e.ks,m=p.k;n=1===p.a||m.length?new i(t,e,s):new r(t,e,s)}else 5===s?n=new l(t,e):6===s?n=new o(t,e):7===s&&(n=new h(t,e));return n.k&&a.push(n),n}var n=-999999,o=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2;3!==this.d?(this.v.v[0][0]=t,this.v.v[0][1]=e-i,this.v.v[1][0]=t+s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+i,this.v.v[3][0]=t-s,this.v.v[3][1]=e,this.v.i[0][0]=t-s*r,this.v.i[0][1]=e-i,this.v.i[1][0]=t+s,this.v.i[1][1]=e-i*r,this.v.i[2][0]=t+s*r,this.v.i[2][1]=e+i,this.v.i[3][0]=t-s,this.v.i[3][1]=e+i*r,this.v.o[0][0]=t+s*r,
-this.v.o[0][1]=e-i,this.v.o[1][0]=t+s,this.v.o[1][1]=e+i*r,this.v.o[2][0]=t-s*r,this.v.o[2][1]=e+i,this.v.o[3][0]=t-s,this.v.o[3][1]=e-i*r):(this.v.v[0][0]=t,this.v.v[0][1]=e-i,this.v.v[1][0]=t-s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+i,this.v.v[3][0]=t+s,this.v.v[3][1]=e,this.v.i[0][0]=t+s*r,this.v.i[0][1]=e-i,this.v.i[1][0]=t-s,this.v.i[1][1]=e-i*r,this.v.i[2][0]=t-s*r,this.v.i[2][1]=e+i,this.v.i[3][0]=t+s,this.v.i[3][1]=e+i*r,this.v.o[0][0]=t-s*r,this.v.o[0][1]=e-i,this.v.o[1][0]=t-s,this.v.o[1][1]=e+i*r,this.v.o[2][0]=t+s*r,this.v.o[2][1]=e+i,this.v.o[3][0]=t+s,this.v.o[3][1]=e-i*r)}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var r=roundCorner;return function(r,i){this.v=shape_pool.newShape(),this.v.setPathData(!0,4),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=i.d,this.dynamicProperties=[],this.elem=r,this.comp=r.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=PropertyFactory.getProp(r,i.p,1,0,this.dynamicProperties),this.s=PropertyFactory.getProp(r,i.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),h=function(){function t(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,r=this.or.v,i=this.os.v,a=2*Math.PI*r/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;e>t;t+=1){var h=r*Math.cos(n),l=r*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),m=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.setTripleAt(h,l,h-p*a*i*o,l-m*a*i*o,h+p*a*i*o,l+m*a*i*o,t,!0),n+=s*o}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,s,r,i=2*Math.floor(this.pt.v),a=2*Math.PI/i,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*i),f=2*Math.PI*h/(2*i),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(this.v._length=0,t=0;i>t;t+=1){e=n?o:h,s=n?l:p,r=n?m:f;var u=e*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.setTripleAt(u,y,u-g*r*s*d,y-v*r*s*d,u+g*r*s*d,y+v*r*s*d,t,!0),n=!n,c+=a*d}}function r(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(i,a){this.v=shape_pool.newShape(),this.v.setPathData(!0,0),this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=r,this.reset=s,1===a.sy?(this.ir=PropertyFactory.getProp(i,a.ir,0,0,this.dynamicProperties),this.is=PropertyFactory.getProp(i,a.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=PropertyFactory.getProp(i,a.pt,0,0,this.dynamicProperties),this.p=PropertyFactory.getProp(i,a.p,1,0,this.dynamicProperties),this.r=PropertyFactory.getProp(i,a.r,0,degToRads,this.dynamicProperties),this.or=PropertyFactory.getProp(i,a.or,0,0,this.dynamicProperties),this.os=PropertyFactory.getProp(i,a.os,0,.01,this.dynamicProperties),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),l=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,r=this.s.v[1]/2,i=bm_min(s,r,this.r.v),a=i*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+s,e-r+i,t+s,e-r+i,t+s,e-r+a,0,!0),this.v.setTripleAt(t+s,e+r-i,t+s,e+r-a,t+s,e+r-i,1,!0),0!==i?(this.v.setTripleAt(t+s-i,e+r,t+s-i,e+r,t+s-a,e+r,2,!0),this.v.setTripleAt(t-s+i,e+r,t-s+a,e+r,t-s+i,e+r,3,!0),this.v.setTripleAt(t-s,e+r-i,t-s,e+r-i,t-s,e+r-a,4,!0),this.v.setTripleAt(t-s,e-r+i,t-s,e-r+a,t-s,e-r+i,5,!0),this.v.setTripleAt(t-s+i,e-r,t-s+i,e-r,t-s+a,e-r,6,!0),this.v.setTripleAt(t+s-i,e-r,t+s-a,e-r,t+s-i,e-r,7,!0)):(this.v.setTripleAt(t-s,e+r,t-s+a,e+r,t-s,e+r,2),this.v.setTripleAt(t-s,e-r,t-s,e-r+a,t-s,e-r,3))):(this.v.setTripleAt(t+s,e-r+i,t+s,e-r+a,t+s,e-r+i,0,!0),0!==i?(this.v.setTripleAt(t+s-i,e-r,t+s-i,e-r,t+s-a,e-r,1,!0),this.v.setTripleAt(t-s+i,e-r,t-s+a,e-r,t-s+i,e-r,2,!0),this.v.setTripleAt(t-s,e-r+i,t-s,e-r+i,t-s,e-r+a,3,!0),this.v.setTripleAt(t-s,e+r-i,t-s,e+r-a,t-s,e+r-i,4,!0),this.v.setTripleAt(t-s+i,e+r,t-s+i,e+r,t-s+a,e+r,5,!0),this.v.setTripleAt(t+s-i,e+r,t+s-a,e+r,t+s-i,e+r,6,!0),this.v.setTripleAt(t+s,e+r-i,t+s,e+r-i,t+s,e+r-a,7,!0)):(this.v.setTripleAt(t-s,e-r,t-s+a,e-r,t-s,e-r,1,!0),this.v.setTripleAt(t-s,e+r,t-s,e+r-a,t-s,e+r,2,!0),this.v.setTripleAt(t+s,e+r,t+s-a,e+r,t+s,e+r,3,!0)))}return function(r,i){this.v=shape_pool.newShape(),this.v.c=!0,this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=r,this.comp=r.comp,this.frameId=-1,this.d=i.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=PropertyFactory.getProp(r,i.p,1,0,this.dynamicProperties),this.s=PropertyFactory.getProp(r,i.s,1,0,this.dynamicProperties),this.r=PropertyFactory.getProp(r,i.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),p={};return p.getShapeProp=a,p}(),ShapeModifiers=function(){function t(t,e){r[t]||(r[t]=e)}function e(t,e,s,i){return new r[t](e,s,i)}var s={},r={};return s.registerModifier=t,s.getModifier=e,s}();ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(t){this.closed||(this.shapes.push({shape:t.sh,data:t,localShapeCollection:shapeCollection_pool.newShapeCollection()}),this.addShapeToModifier(t.sh))},ShapeModifier.prototype.init=function(t,e,s){this.elem=t,this.frameId=-1,this.shapes=[],this.dynamicProperties=[],this.mdf=!1,this.closed=!1,this.k=!1,this.isTrimming=!1,this.comp=t.comp,this.initModifierProperties(t,e),this.dynamicProperties.length?(this.k=!0,s.push(this)):this.getValue(!0)},extendPrototype(ShapeModifier,TrimModifier),TrimModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var r=this.o.v%360/360;0>r&&(r+=1);var i=this.s.v+r,a=this.e.v+r;if(i>a){var n=i;i=a,a=n}this.sValue=i,this.eValue=a,this.oValue=r}}},TrimModifier.prototype.initModifierProperties=function(t,e){this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.s=PropertyFactory.getProp(t,e.s,0,.01,this.dynamicProperties),this.e=PropertyFactory.getProp(t,e.e,0,.01,this.dynamicProperties),this.o=PropertyFactory.getProp(t,e.o,0,0,this.dynamicProperties),this.m=e.m,this.dynamicProperties.length||this.getValue(!0)},TrimModifier.prototype.getSegmentsLength=function(t){var e,s=t.c,r=t.v,i=t.o,a=t.i,n=t._length,o=[],h=0;for(e=0;n-1>e;e+=1)o[e]=bez.getBezierLength(r[e],r[e+1],i[e],a[e+1]),h+=o[e].addedLength;return s&&(o[e]=bez.getBezierLength(r[e],r[0],i[e],a[0]),h+=o[e].addedLength),{lengths:o,totalLength:h}},TrimModifier.prototype.calculateShapeEdges=function(t,e,s,r,i){var a=[];1>=e?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;l>n;n+=1)if(o=a[n],o.e*i<r||o.s*i>r+s);else{var p,m;p=o.s*i<=r?0:(o.s*i-r)/s,m=o.e*i>=r+s?1:(o.e*i-r)/s,h.push([p,m])}return h.length||h.push([0,0]),h},TrimModifier.prototype.processShapes=function(t){var e,s,r,i,a,n,o,h=this.shapes.length,l=this.sValue,p=this.eValue,m=0;if(p===l)for(s=0;h>s;s+=1)this.shapes[s].localShapeCollection.releaseShapes(),this.shapes[s].shape.mdf=!0,this.shapes[s].shape.paths=this.shapes[s].localShapeCollection;else if(1===p&&0===l||0===p&&1===l){if(this.mdf)for(s=0;h>s;s+=1)this.shapes[s].shape.mdf=!0}else{var f,c,d=[];for(s=0;h>s;s+=1)if(f=this.shapes[s],f.shape.mdf||this.mdf||t||2===this.m){if(e=f.shape.paths,i=e._length,o=0,!f.shape.mdf&&f.pathsData)o=f.totalShapeLength;else{for(a=[],r=0;i>r;r+=1)n=this.getSegmentsLength(e.shapes[r]),a.push(n),o+=n.totalLength;f.totalShapeLength=o,f.pathsData=a}m+=o,f.shape.mdf=!0}else f.shape.paths=f.localShapeCollection;var r,i,u=l,y=p,g=0;for(s=h-1;s>=0;s-=1)if(f=this.shapes[s],f.shape.mdf){if(c=f.localShapeCollection,c.releaseShapes(),2===this.m&&h>1){var v=this.calculateShapeEdges(l,p,f.totalShapeLength,g,m);g+=f.totalShapeLength}else v=[[u,y]];for(i=v.length,r=0;i>r;r+=1){u=v[r][0],y=v[r][1],d.length=0,1>=y?d.push({s:f.totalShapeLength*u,e:f.totalShapeLength*y}):u>=1?d.push({s:f.totalShapeLength*(u-1),e:f.totalShapeLength*(y-1)}):(d.push({s:f.totalShapeLength*u,e:f.totalShapeLength}),d.push({s:0,e:f.totalShapeLength*(y-1)}));var b=this.addShapes(f,d[0]);if(d[0].s!==d[0].e){if(d.length>1)if(f.shape.v.c){var E=b.pop();this.addPaths(b,c),b=this.addShapes(f,d[1],E)}else this.addPaths(b,c),b=this.addShapes(f,d[1]);this.addPaths(b,c)}}f.shape.paths=c}}this.dynamicProperties.length||(this.mdf=!1)},TrimModifier.prototype.addPaths=function(t,e){var s,r=t.length;for(s=0;r>s;s+=1)e.addShape(t[s])},TrimModifier.prototype.addSegment=function(t,e,s,r,i,a,n){i.setXYAt(e[0],e[1],"o",a),i.setXYAt(s[0],s[1],"i",a+1),n&&i.setXYAt(t[0],t[1],"v",a),i.setXYAt(r[0],r[1],"v",a+1)},TrimModifier.prototype.addShapes=function(t,e,s){var r,i,a,n,o,h,l,p,m=t.pathsData,f=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(s?(o=s._length,p=s._length):(s=shape_pool.newShape(),o=0,p=0),u.push(s),r=0;c>r;r+=1){for(h=m[r].lengths,s.c=f[r].c,a=f[r].c?h.length:h.length+1,i=1;a>i;i+=1)if(n=h[i-1],d+n.addedLength<e.s)d+=n.addedLength,s.c=!1;else{if(d>e.e){s.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(f[r].v[i-1],f[r].o[i-1],f[r].i[i],f[r].v[i],s,o,y),y=!1):(l=bez.getNewSegment(f[r].v[i-1],f[r].v[i],f[r].o[i-1],f[r].i[i],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[i-1]),this.addSegment(l.pt1,l.pt3,l.pt4,l.pt2,s,o,y),y=!1,s.c=!1),d+=n.addedLength,o+=1}if(f[r].c){if(n=h[i-1],d<=e.e){var g=h[i-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(f[r].v[i-1],f[r].o[i-1],f[r].i[0],f[r].v[0],s,o,y),y=!1):(l=bez.getNewSegment(f[r].v[i-1],f[r].v[0],f[r].o[i-1],f[r].i[0],(e.s-d)/g,(e.e-d)/g,h[i-1]),this.addSegment(l.pt1,l.pt3,l.pt4,l.pt2,s,o,y),y=!1,s.c=!1)}else s.c=!1;d+=n.addedLength,o+=1}if(s._length&&(s.setXYAt(s.v[p][0],s.v[p][1],"i",p),s.setXYAt(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),d>e.e)break;c-1>r&&(s=shape_pool.newShape(),y=!0,u.push(s),o=0)}return u},ShapeModifiers.registerModifier("tm",TrimModifier),extendPrototype(ShapeModifier,RoundCornersModifier),RoundCornersModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},RoundCornersModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(t,e.r,0,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},RoundCornersModifier.prototype.processPath=function(t,e){var s=shape_pool.newShape();s.c=t.c;var r,i,a,n,o,h,l,p,m,f,c,d,u,y=t._length,g=0;for(r=0;y>r;r+=1)i=t.v[r],n=t.o[r],a=t.i[r],i[0]===n[0]&&i[1]===n[1]&&i[0]===a[0]&&i[1]===a[1]?0!==r&&r!==y-1||t.c?(o=0===r?t.v[y-1]:t.v[r-1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=d=i[0]+(o[0]-i[0])*l,m=u=i[1]-(i[1]-o[1])*l,f=p-(p-i[0])*roundCorner,c=m-(m-i[1])*roundCorner,s.setTripleAt(p,m,f,c,d,u,g),g+=1,o=r===y-1?t.v[0]:t.v[r+1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=f=i[0]+(o[0]-i[0])*l,m=c=i[1]+(o[1]-i[1])*l,d=p-(p-i[0])*roundCorner,u=m-(m-i[1])*roundCorner,s.setTripleAt(p,m,f,c,d,u,g),g+=1):(s.setTripleAt(i[0],i[1],n[0],n[1],a[0],a[1],g),g+=1):(s.setTripleAt(t.v[r][0],t.v[r][1],t.o[r][0],t.o[r][1],t.i[r][0],t.i[r][1],g),g+=1);return s},RoundCornersModifier.prototype.processShapes=function(t){var e,s,r,i,a=this.shapes.length,n=this.rd.v;if(0!==n){var o,h,l;for(s=0;a>s;s+=1){if(o=this.shapes[s],h=o.shape.paths,l=o.localShapeCollection,o.shape.mdf||this.mdf||t)for(l.releaseShapes(),o.shape.mdf=!0,e=o.shape.paths.shapes,i=o.shape.paths._length,r=0;i>r;r+=1)l.addShape(this.processPath(e[r],n));o.shape.paths=o.localShapeCollection}}this.dynamicProperties.length||(this.mdf=!1)},ShapeModifiers.registerModifier("rd",RoundCornersModifier),extendPrototype(ShapeModifier,RepeaterModifier),RepeaterModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},RepeaterModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(t,e.c,0,null,this.dynamicProperties),this.o=PropertyFactory.getProp(t,e.o,0,null,this.dynamicProperties),this.tr=PropertyFactory.getProp(t,e.tr,2,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0),this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(t,e,s,r,i,a){var n=a?-1:1,o=r.s.v[0]+(1-r.s.v[0])*(1-i),h=r.s.v[1]+(1-r.s.v[1])*(1-i);t.translate(r.p.v[0]*n*i,r.p.v[1]*n*i,r.p.v[2]),e.translate(-r.a.v[0],-r.a.v[1],r.a.v[2]),e.rotate(-r.r.v*n*i),e.translate(r.a.v[0],r.a.v[1],r.a.v[2]),s.translate(-r.a.v[0],-r.a.v[1],r.a.v[2]),s.scale(a?1/o:o,a?1/h:h),s.translate(r.a.v[0],r.a.v[1],r.a.v[2])},RepeaterModifier.prototype.processShapes=function(t){this.dynamicProperties.length||(this.mdf=!1);var e,s,r,i,a,n,o,h,l,p,m,f,c,d,u=this.shapes.length,y=Math.ceil(this.c.v),g=this.o.v,v=g%1,b=g>0?Math.floor(g):Math.ceil(g),E=(this.tr.v.props,this.pMatrix.props),P=this.rMatrix.props,x=this.sMatrix.props,S=0;for(e=0;u>e;e+=1){if(i=this.shapes[e],a=i.localShapeCollection,i.shape.mdf||this.mdf||t){if(a.releaseShapes(),i.shape.mdf=!0,h=i.shape.paths,l=h.shapes,r=h._length,S=0,this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset(),g>0){for(;b>S;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),S+=1;v&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,v,!1),S+=v)}else if(0>b){for(;S>b;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),S-=1;v&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-v,!0),S-=v)}for(s=0;r>s;s+=1)for(n=l[s],o=0;y>o;o+=1){if(0!==o&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),i.data.transformers){for(i.data.lvl=0,d=0,m=i.data.elements.length,p=0;m>p;p+=1)d=Math.max(d,i.data.elements[p].st.lvl);for(c=i.data.transformers,m=c.length,p=m-1;p>=d;p-=1)f=c[p].mProps.v.props,this.matrix.transform(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9],f[10],f[11],f[12],f[13],f[14],f[15])}0!==S&&(this.matrix.transform(P[0],P[1],P[2],P[3],P[4],P[5],P[6],P[7],P[8],P[9],P[10],P[11],P[12],P[13],P[14],P[15]),this.matrix.transform(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]),this.matrix.transform(E[0],E[1],E[2],E[3],E[4],E[5],E[6],E[7],E[8],E[9],E[10],E[11],E[12],E[13],E[14],E[15])),a.addShape(this.processPath(n,this.matrix)),this.matrix.reset(),S+=1}}i.shape.paths=a}},RepeaterModifier.prototype.processPath=function(t,e){var s=shape_pool.clone(t,e);return s},ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeCollection.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},ShapeCollection.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0};var ImagePreloader=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages}function e(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=document.createElement("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function r(t){this.totalAssets=t.length;var r;for(r=0;r<this.totalAssets;r+=1)t[r].layers||(s.bind(this)(e.bind(this)(t[r])),this.totalImages+=1)}function i(t){this.path=t||""}function a(t){this.assetsPath=t||""}return function(){this.loadAssets=r,this.setAssetsPath=a,this.setPath=i,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0}}(),featureSupport=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),filtersFactory=function(){function t(t){var e=document.createElementNS(svgNS,"filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=document.createElementNS(svgNS,"feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 0 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}(),pooling=function(){function t(t){return t.concat(Array.apply(null,{length:t.length}))}return{"double":t}}(),point_pool=function(){function t(){var t;return r?(r-=1,t=a[r]):t=[.1,.1],t}function e(t){r===i&&(a=pooling["double"](a),i=2*i),a[r]=t,r+=1}var s={newPoint:t,release:e},r=0,i=8,a=Array.apply(null,{length:i});return s}(),shape_pool=function(){function t(){var t;return a?(a-=1,t=o[a]):t=new ShapePath,t}function e(t){a===n&&(o=pooling["double"](o),n=2*n);var e,s=t._length;for(e=0;s>e;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1,o[a]=t,a+=1}function s(t,s){for(;s--;)e(t[s])}function r(e,s){var r,i=e._length,a=t();a._length=e._length,a.c=e.c;var n;for(r=0;i>r;r+=1)s?(n=s.applyToPointArray(e.v[r][0],e.v[r][1],0,2),a.setXYAt(n[0],n[1],"v",r),point_pool.release(n),n=s.applyToPointArray(e.o[r][0],e.o[r][1],0,2),a.setXYAt(n[0],n[1],"o",r),point_pool.release(n),n=s.applyToPointArray(e.i[r][0],e.i[r][1],0,2),a.setXYAt(n[0],n[1],"i",r),point_pool.release(n)):a.setTripleAt(e.v[r][0],e.v[r][1],e.o[r][0],e.o[r][1],e.i[r][0],e.i[r][1],r);return a}var i={clone:r,newShape:t,release:e,releaseArray:s},a=0,n=4,o=Array.apply(null,{length:n});return i}(),shapeCollection_pool=function(){function t(){var t;return i?(i-=1,t=n[i]):t=new ShapeCollection,t}function e(t){var e,s=t._length;for(e=0;s>e;e+=1)shape_pool.release(t.shapes[e]);t._length=0,i===a&&(n=pooling["double"](n),a=2*a),n[i]=t,i+=1}function s(t,s){e(t),i===a&&(n=pooling["double"](n),a=2*a),n[i]=t,i+=1}var r={newShapeCollection:t,release:e,clone:s},i=0,a=4,n=Array.apply(null,{length:a});return r}();BaseRenderer.prototype.checkLayers=function(t){var e,s,r=this.layers.length;for(this.completeLayers=!0,e=r-1;e>=0;e--)this.elements[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;e>t;t+=1)this.buildItem(t);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,r=t.length,i=this.layers.length;for(e=0;r>e;e+=1)for(s=0;i>s;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},BaseRenderer.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(t,e,s){s=s||[];for(var r=this.elements,i=this.layers,a=0,n=i.length;n>a;)i[a].ind==e&&(r[a]&&r[a]!==!0?void 0!==i[a].parent?(s.push(r[a]),r[a]._isParent=!0,this.buildElementParenting(t,i[a].parent,s)):(s.push(r[a]),r[a]._isParent=!0,t.setHierarchy(s)):(this.buildItem(a),this.addPendingElement(t))),a+=1},BaseRenderer.prototype.addPendingElement=function(t){this.pendingElements.push(t)},extendPrototype(BaseRenderer,SVGRenderer),SVGRenderer.prototype.createBase=function(t){return new SVGBaseElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createShape=function(t){return new IShapeElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createText=function(t){return new SVGTextElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createImage=function(t){return new IImageElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createComp=function(t){return new ICompElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createSolid=function(t){return new ISolidElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.configAnimation=function(t){this.layerElement=document.createElementNS(svgNS,"svg"),this.layerElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.layerElement.setAttribute("width",t.w),this.layerElement.setAttribute("height",t.h),this.layerElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.layerElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.layerElement.style.width="100%",this.layerElement.style.height="100%",this.animationItem.wrapper.appendChild(this.layerElement);var e=document.createElementNS(svgNS,"defs");this.globalData.defs=e,this.layerElement.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.frameId=0,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h},this.data=t,this.globalData.frameRate=t.fr;var s=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var i="animationMask_"+randomString(10);s.setAttribute("id",i),s.appendChild(r);var a=document.createElementNS(svgNS,"g");a.setAttribute("clip-path","url(#"+i+")"),this.layerElement.appendChild(a),e.appendChild(s),this.layerElement=a,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.elements=Array.apply(null,{length:t.layers.length})},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,expressionsPlugin&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&this.elements[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},SVGRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this.elements.length;s>e;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},SVGRenderer.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},SVGRenderer.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var r,i=0;e>i;)this.elements[i]&&this.elements[i]!==!0&&this.elements[i].getBaseElement()&&(r=this.elements[i].getBaseElement()),i+=1;r?this.layerElement.insertBefore(s,r):this.layerElement.appendChild(s)}},SVGRenderer.prototype.hide=function(){this.layerElement.style.display="none"},SVGRenderer.prototype.show=function(){this.layerElement.style.display="block"},SVGRenderer.prototype.searchExtraCompositions=function(t){var e,s=t.length,r=document.createElementNS(svgNS,"g");for(e=0;s>e;e+=1)if(t[e].xt){var i=this.createComp(t[e],r,this.globalData.comp,null);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},MaskElement.prototype.renderFrame=function(t){var e,s=this.masksProperties.length;for(e=0;s>e;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var r=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url(#"+this.storedData[e].filterId+")")),r.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,s){var r,i,a=" M"+e.v[0][0]+","+e.v[0][1];for(i=e._length,r=1;i>r;r+=1)a+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[r][0])+","+bm_rnd(e.i[r][1])+" "+bm_rnd(e.v[r][0])+","+bm_rnd(e.v[r][1]);e.c&&i>1&&(a+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),s.lastPath!==a&&(s.elem&&(e.c?t.inv?s.elem.setAttribute("d",this.solidPath+a):s.elem.setAttribute("d",a):s.elem.setAttribute("d","")),s.lastPath=a)},MaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},BaseElement.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},BaseElement.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent)},BaseElement.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)(this.isVisible||this._isParent&&"transform"===this.dynamicProperties[e].type)&&(this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.elemMdf=!0,this.globalData.mdf=!0));return this.data.hasMask&&this.isVisible&&this.maskManager.prepareFrame(t*this.data.sr),this.currentFrameNum=t*this.data.sr,this.isVisible},BaseElement.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,r=this.comp;s;)r.finalTransform?(r.data.hasMask&&e.splice(0,0,r.finalTransform),r=r.comp):s=!1;var i,a,n=e.length;for(i=0;n>i;i+=1)a=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},BaseElement.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?this.layerInterface.shapeInterface=ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.layerInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this))},BaseElement.prototype.setBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}var e=this.baseElement||this.layerElement;e.style["mix-blend-mode"]=t},BaseElement.prototype.init=function(){this.data.sr||(this.data.sr=1),this.dynamicProperties=[],this.data.ef&&(this.effects=new EffectsManager(this.data,this,this.dynamicProperties)),this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this._isParent=!1,this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ks&&(this.finalTransform={mProp:PropertyFactory.getProp(this,this.data.ks,2,null,this.dynamicProperties),
-matMdf:!1,opMdf:!1,mat:new Matrix,opacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,11!==this.data.ty&&this.createElements(),this.data.hasMask&&this.addMasks(this.data)),this.elemMdf=!1},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setHierarchy=function(t){this.hierarchy=t},BaseElement.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.hide=function(){},BaseElement.prototype.mHelper=new Matrix,createElement(BaseElement,SVGBaseElement),SVGBaseElement.prototype.createElements=function(){this.layerElement=document.createElementNS(svgNS,"g"),this.transformedElement=this.layerElement,this.data.hasMask&&(this.maskedElement=this.layerElement);var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=document.createElementNS(svgNS,"mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this.layerElement),t=e,this.globalData.defs.appendChild(e),!featureSupport.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=randomString(10),r=filtersFactory.createFilter(s);this.globalData.defs.appendChild(r),r.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=document.createElementNS(svgNS,"g");i.appendChild(this.layerElement),t=i,e.appendChild(i),i.setAttribute("filter","url(#"+s+")")}}else if(2==this.data.td){var a=document.createElementNS(svgNS,"mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=document.createElementNS(svgNS,"g");a.appendChild(n);var s=randomString(10),r=filtersFactory.createFilter(s),o=document.createElementNS(svgNS,"feColorMatrix");o.setAttribute("type","matrix"),o.setAttribute("color-interpolation-filters","sRGB"),o.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),r.appendChild(o),this.globalData.defs.appendChild(r);var h=document.createElementNS(svgNS,"rect");if(h.setAttribute("width",this.comp.data.w),h.setAttribute("height",this.comp.data.h),h.setAttribute("x","0"),h.setAttribute("y","0"),h.setAttribute("fill","#ffffff"),h.setAttribute("opacity","0"),n.setAttribute("filter","url(#"+s+")"),n.appendChild(h),n.appendChild(this.layerElement),t=n,!featureSupport.maskType){a.setAttribute("mask-type","luminance"),r.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=document.createElementNS(svgNS,"g");n.appendChild(h),i.appendChild(this.layerElement),t=i,n.appendChild(i)}this.globalData.defs.appendChild(a)}}else(this.data.hasMask||this.data.tt)&&this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),t=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)),0===this.data.ty){var l=document.createElementNS(svgNS,"clipPath"),p=document.createElementNS(svgNS,"path");p.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m="cp_"+randomString(8);if(l.setAttribute("id",m),l.appendChild(p),this.globalData.defs.appendChild(l),this.checkMasks()){var f=document.createElementNS(svgNS,"g");f.setAttribute("clip-path","url(#"+m+")"),f.appendChild(this.layerElement),this.transformedElement=f,t?t.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url(#"+m+")")}0!==this.data.bm&&this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.ef&&(this.effectsManager=new SVGEffects(this)),this.checkParenting()},SVGBaseElement.prototype.setBlendMode=BaseElement.prototype.setBlendMode,SVGBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty||this.data.hd||!this.isVisible)return!1;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.firstFrame||this.finalTransform.op.mdf,this.finalTransform.matMdf=this.firstFrame||this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var r=0,i=this.hierarchy.length;if(!this.finalTransform.matMdf)for(;i>r;){if(this.hierarchy[r].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}r+=1}if(this.finalTransform.matMdf)for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&(s=this.finalTransform.mProp.v);return this.finalTransform.matMdf&&this.layerElement&&this.transformedElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement&&this.transformedElement.setAttribute("opacity",this.finalTransform.op.v),this.data.hasMask&&this.maskManager.renderFrame(s),this.effectsManager&&this.effectsManager.renderFrame(this.firstFrame),this.isVisible},SVGBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},SVGBaseElement.prototype.getBaseElement=function(){return this.baseElement},SVGBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.hide=function(){},ITextElement.prototype.init=function(){this._parent.init.call(this),this.lettersChangedFlag=!1,this.currentTextDocumentData={};var t=this.data;this.viewData={m:{a:PropertyFactory.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,r,i,a=e.a.length;for(s=0;a>s;s+=1)i=e.a[s],r={a:{},s:{}},"r"in i.a&&(r.a.r=PropertyFactory.getProp(this,i.a.r,0,degToRads,this.dynamicProperties)),"rx"in i.a&&(r.a.rx=PropertyFactory.getProp(this,i.a.rx,0,degToRads,this.dynamicProperties)),"ry"in i.a&&(r.a.ry=PropertyFactory.getProp(this,i.a.ry,0,degToRads,this.dynamicProperties)),"sk"in i.a&&(r.a.sk=PropertyFactory.getProp(this,i.a.sk,0,degToRads,this.dynamicProperties)),"sa"in i.a&&(r.a.sa=PropertyFactory.getProp(this,i.a.sa,0,degToRads,this.dynamicProperties)),"s"in i.a&&(r.a.s=PropertyFactory.getProp(this,i.a.s,1,.01,this.dynamicProperties)),"a"in i.a&&(r.a.a=PropertyFactory.getProp(this,i.a.a,1,0,this.dynamicProperties)),"o"in i.a&&(r.a.o=PropertyFactory.getProp(this,i.a.o,0,.01,this.dynamicProperties)),"p"in i.a&&(r.a.p=PropertyFactory.getProp(this,i.a.p,1,0,this.dynamicProperties)),"sw"in i.a&&(r.a.sw=PropertyFactory.getProp(this,i.a.sw,0,0,this.dynamicProperties)),"sc"in i.a&&(r.a.sc=PropertyFactory.getProp(this,i.a.sc,1,0,this.dynamicProperties)),"fc"in i.a&&(r.a.fc=PropertyFactory.getProp(this,i.a.fc,1,0,this.dynamicProperties)),"fh"in i.a&&(r.a.fh=PropertyFactory.getProp(this,i.a.fh,0,0,this.dynamicProperties)),"fs"in i.a&&(r.a.fs=PropertyFactory.getProp(this,i.a.fs,0,.01,this.dynamicProperties)),"fb"in i.a&&(r.a.fb=PropertyFactory.getProp(this,i.a.fb,0,.01,this.dynamicProperties)),"t"in i.a&&(r.a.t=PropertyFactory.getProp(this,i.a.t,0,0,this.dynamicProperties)),r.s=PropertyFactory.getTextSelectorProp(this,i.s,this.dynamicProperties),r.s.t=i.s.t,this.viewData.a[s]=r}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:PropertyFactory.getProp(this,e.p.f,0,0,this.dynamicProperties),l:PropertyFactory.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},ITextElement.prototype.prepareFrame=function(t){var e=0,s=this.data.t.d.k.length,r=this.data.t.d.k[e].s;for(e+=1;s>e&&!(this.data.t.d.k[e].t>t);)r=this.data.t.d.k[e].s,e+=1;this.lettersChangedFlag=!1,r!==this.currentTextDocumentData&&(this.currentTextDocumentData=r,this.lettersChangedFlag=!0,this.buildNewText()),this._parent.prepareFrame.call(this,t)},ITextElement.prototype.createPathShape=function(t,e){var s,r,i,a,n=e.length,o="";for(s=0;n>s;s+=1){for(i=e[s].ks.k.i.length,a=e[s].ks.k,r=1;i>r;r+=1)1==r&&(o+=" M"+t.applyToPointStringified(a.v[0][0],a.v[0][1])),o+=" C"+t.applyToPointStringified(a.o[r-1][0],a.o[r-1][1])+" "+t.applyToPointStringified(a.i[r][0],a.i[r][1])+" "+t.applyToPointStringified(a.v[r][0],a.v[r][1]);o+=" C"+t.applyToPointStringified(a.o[r-1][0],a.o[r-1][1])+" "+t.applyToPointStringified(a.i[0][0],a.i[0][1])+" "+t.applyToPointStringified(a.v[0][0],a.v[0][1]),o+="z"}return o},ITextElement.prototype.getMeasures=function(){var t,e,s,r,i=this.mHelper,a=this.renderType,n=this.data,o=this.currentTextDocumentData,h=o.l;if(this.maskPath){var l=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var p=l.v;this.viewData.p.r&&(p=reversePath(p));var m={tLength:0,segments:[]};r=p.v.length-1;var f,c=0;for(s=0;r>s;s+=1)f={s:p.v[s],e:p.v[s+1],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[s+1][0]-p.v[s+1][0],p.i[s+1][1]-p.v[s+1][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),c+=f.bezierData.segmentLength;s=r,l.v.c&&(f={s:p.v[s],e:p.v[0],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[0][0]-p.v[0][0],p.i[0][1]-p.v[0][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),c+=f.bezierData.segmentLength),this.viewData.p.pi=m}var d,u,y,m=this.viewData.p.pi,g=this.viewData.p.f.v,v=0,b=1,E=0,P=!0,x=m.segments;if(0>g&&l.v.c)for(m.tLength<Math.abs(g)&&(g=-Math.abs(g)%m.tLength),v=x.length-1,y=x[v].bezierData.points,b=y.length-1;0>g;)g+=y[b].partialLength,b-=1,0>b&&(v-=1,y=x[v].bezierData.points,b=y.length-1);y=x[v].bezierData.points,u=y[b-1],d=y[b];var S,C,k=d.partialLength}r=h.length,t=0,e=0;var M,A,D,w,T,F=1.2*o.s*.714,I=!0,_=this.viewData,V=Array.apply(null,{length:r});w=_.a.length;var R,B,N,L,G,O,j,H,z,W,Y,X,q,U,Z,J,K=-1,Q=g,$=v,tt=b,et=-1,st=0;for(s=0;r>s;s+=1)if(i.reset(),O=1,h[s].n)t=0,e+=o.yOffset,e+=I?1:0,g=Q,I=!1,st=0,this.maskPath&&(v=$,b=tt,y=x[v].bezierData.points,u=y[b-1],d=y[b],k=d.partialLength,E=0),V[s]=this.emptyProp;else{if(this.maskPath){if(et!==h[s].line){switch(o.j){case 1:g+=c-o.lineWidths[h[s].line];break;case 2:g+=(c-o.lineWidths[h[s].line])/2}et=h[s].line}K!==h[s].ind&&(h[K]&&(g+=h[K].extra),g+=h[s].an/2,K=h[s].ind),g+=_.m.a.v[0]*h[s].an/200;var rt=0;for(D=0;w>D;D+=1)M=_.a[D].a,"p"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),rt+=B.length?M.p.v[0]*B[0]:M.p.v[0]*B),"a"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),rt+=B.length?M.a.v[0]*B[0]:M.a.v[0]*B);for(P=!0;P;)E+k>=g+rt||!y?(S=(g+rt-E)/d.partialLength,L=u.point[0]+(d.point[0]-u.point[0])*S,G=u.point[1]+(d.point[1]-u.point[1])*S,i.translate(-_.m.a.v[0]*h[s].an/200,-(_.m.a.v[1]*F/100)),P=!1):y&&(E+=d.partialLength,b+=1,b>=y.length&&(b=0,v+=1,x[v]?y=x[v].bezierData.points:l.v.c?(b=0,v=0,y=x[v].bezierData.points):(E-=d.partialLength,y=null)),y&&(u=d,d=y[b],k=d.partialLength));N=h[s].an/2-h[s].add,i.translate(-N,0,0)}else N=h[s].an/2-h[s].add,i.translate(-N,0,0),i.translate(-_.m.a.v[0]*h[s].an/200,-_.m.a.v[1]*F/100,0);for(st+=h[s].l/2,D=0;w>D;D+=1)M=_.a[D].a,"t"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),this.maskPath?g+=B.length?M.t*B[0]:M.t*B:t+=B.length?M.t.v*B[0]:M.t.v*B);for(st+=h[s].l/2,o.strokeWidthAnim&&(H=o.sw||0),o.strokeColorAnim&&(j=o.sc?[o.sc[0],o.sc[1],o.sc[2]]:[0,0,0]),o.fillColorAnim&&(z=[o.fc[0],o.fc[1],o.fc[2]]),D=0;w>D;D+=1)M=_.a[D].a,"a"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),B.length?i.translate(-M.a.v[0]*B[0],-M.a.v[1]*B[1],M.a.v[2]*B[2]):i.translate(-M.a.v[0]*B,-M.a.v[1]*B,M.a.v[2]*B));for(D=0;w>D;D+=1)M=_.a[D].a,"s"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),B.length?i.scale(1+(M.s.v[0]-1)*B[0],1+(M.s.v[1]-1)*B[1],1):i.scale(1+(M.s.v[0]-1)*B,1+(M.s.v[1]-1)*B,1));for(D=0;w>D;D+=1){if(M=_.a[D].a,A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),"sk"in M&&(B.length?i.skewFromAxis(-M.sk.v*B[0],M.sa.v*B[1]):i.skewFromAxis(-M.sk.v*B,M.sa.v*B)),"r"in M&&i.rotateZ(B.length?-M.r.v*B[2]:-M.r.v*B),"ry"in M&&i.rotateY(B.length?M.ry.v*B[1]:M.ry.v*B),"rx"in M&&i.rotateX(B.length?M.rx.v*B[0]:M.rx.v*B),"o"in M&&(O+=B.length?(M.o.v*B[0]-O)*B[0]:(M.o.v*B-O)*B),o.strokeWidthAnim&&"sw"in M&&(H+=B.length?M.sw.v*B[0]:M.sw.v*B),o.strokeColorAnim&&"sc"in M)for(W=0;3>W;W+=1)j[W]=Math.round(B.length?255*(j[W]+(M.sc.v[W]-j[W])*B[0]):255*(j[W]+(M.sc.v[W]-j[W])*B));if(o.fillColorAnim){if("fc"in M)for(W=0;3>W;W+=1)z[W]=B.length?z[W]+(M.fc.v[W]-z[W])*B[0]:z[W]+(M.fc.v[W]-z[W])*B;"fh"in M&&(z=B.length?addHueToRGB(z,M.fh.v*B[0]):addHueToRGB(z,M.fh.v*B)),"fs"in M&&(z=B.length?addSaturationToRGB(z,M.fs.v*B[0]):addSaturationToRGB(z,M.fs.v*B)),"fb"in M&&(z=B.length?addBrightnessToRGB(z,M.fb.v*B[0]):addBrightnessToRGB(z,M.fb.v*B))}}for(D=0;w>D;D+=1)M=_.a[D].a,"p"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),this.maskPath?B.length?i.translate(0,M.p.v[1]*B[0],-M.p.v[2]*B[1]):i.translate(0,M.p.v[1]*B,-M.p.v[2]*B):B.length?i.translate(M.p.v[0]*B[0],M.p.v[1]*B[1],-M.p.v[2]*B[2]):i.translate(M.p.v[0]*B,M.p.v[1]*B,-M.p.v[2]*B));if(o.strokeWidthAnim&&(Y=0>H?0:H),o.strokeColorAnim&&(X="rgb("+Math.round(255*j[0])+","+Math.round(255*j[1])+","+Math.round(255*j[2])+")"),o.fillColorAnim&&(q="rgb("+Math.round(255*z[0])+","+Math.round(255*z[1])+","+Math.round(255*z[2])+")"),this.maskPath){if(i.translate(0,-o.ls),i.translate(0,_.m.a.v[1]*F/100+e,0),n.t.p.p){C=(d.point[1]-u.point[1])/(d.point[0]-u.point[0]);var it=180*Math.atan(C)/Math.PI;d.point[0]<u.point[0]&&(it+=180),i.rotate(-it*Math.PI/180)}i.translate(L,G,0),g-=_.m.a.v[0]*h[s].an/200,h[s+1]&&K!==h[s+1].ind&&(g+=h[s].an/2,g+=o.tr/1e3*o.s)}else{switch(i.translate(t,e,0),o.ps&&i.translate(o.ps[0],o.ps[1]+o.ascent,0),o.j){case 1:i.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line]),0,0);break;case 2:i.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line])/2,0,0)}i.translate(0,-o.ls),i.translate(N,0,0),i.translate(_.m.a.v[0]*h[s].an/200,_.m.a.v[1]*F/100,0),t+=h[s].l+o.tr/1e3*o.s}"html"===a?U=i.toCSS():"svg"===a?U=i.to2dCSS():Z=[i.props[0],i.props[1],i.props[2],i.props[3],i.props[4],i.props[5],i.props[6],i.props[7],i.props[8],i.props[9],i.props[10],i.props[11],i.props[12],i.props[13],i.props[14],i.props[15]],J=O,R=this.renderedLetters[s],!R||R.o===J&&R.sw===Y&&R.sc===X&&R.fc===q?"svg"!==a&&"html"!==a||R&&R.m===U?"canvas"!==a||R&&R.props[0]===Z[0]&&R.props[1]===Z[1]&&R.props[4]===Z[4]&&R.props[5]===Z[5]&&R.props[12]===Z[12]&&R.props[13]===Z[13]?T=R:(this.lettersChangedFlag=!0,T=new LetterProps(J,Y,X,q,null,Z)):(this.lettersChangedFlag=!0,T=new LetterProps(J,Y,X,q,U)):(this.lettersChangedFlag=!0,T=new LetterProps(J,Y,X,q,U,Z)),this.renderedLetters[s]=T}},ITextElement.prototype.emptyProp=new LetterProps,createElement(SVGBaseElement,SVGTextElement),SVGTextElement.prototype.init=ITextElement.prototype.init,SVGTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,SVGTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,SVGTextElement.prototype.prepareFrame=ITextElement.prototype.prepareFrame,SVGTextElement.prototype.createElements=function(){this._parent.createElements.call(this),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},SVGTextElement.prototype.buildNewText=function(){var t,e,s=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),s.fc?this.layerElement.setAttribute("fill","rgb("+Math.round(255*s.fc[0])+","+Math.round(255*s.fc[1])+","+Math.round(255*s.fc[2])+")"):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this.layerElement.setAttribute("stroke","rgb("+Math.round(255*s.sc[0])+","+Math.round(255*s.sc[1])+","+Math.round(255*s.sc[2])+")"),this.layerElement.setAttribute("stroke-width",s.sw)),this.layerElement.setAttribute("font-size",s.s);var r=this.globalData.fontManager.getFontByName(s.f);if(r.fClass)this.layerElement.setAttribute("class",r.fClass);else{this.layerElement.setAttribute("font-family",r.fFamily);var i=s.fWeight,a=s.fStyle;this.layerElement.setAttribute("font-style",a),this.layerElement.setAttribute("font-weight",i)}var n=s.l||[];if(e=n.length){var o,h,l=this.mHelper,p="",m=this.data.singleShape;if(m)var f=0,c=0,d=s.lineWidths,u=s.boxWidth,y=!0;var g=0;for(t=0;e>t;t+=1){if(this.globalData.fontManager.chars?m&&0!==t||(o=this.textSpans[g]?this.textSpans[g]:document.createElementNS(svgNS,"path")):o=this.textSpans[g]?this.textSpans[g]:document.createElementNS(svgNS,"text"),o.style.display="inherit",o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4"),m&&n[t].n&&(f=0,c+=s.yOffset,c+=y?1:0,y=!1),l.reset(),this.globalData.fontManager.chars&&l.scale(s.s/100,s.s/100),m){switch(s.ps&&l.translate(s.ps[0],s.ps[1]+s.ascent,0),l.translate(0,-s.ls,0),s.j){case 1:l.translate(s.justifyOffset+(u-d[n[t].line]),0,0);break;case 2:l.translate(s.justifyOffset+(u-d[n[t].line])/2,0,0)}l.translate(f,c,0)}if(this.globalData.fontManager.chars){var v,b=this.globalData.fontManager.getCharData(s.t.charAt(t),r.fStyle,this.globalData.fontManager.getFontByName(s.f).fFamily);v=b?b.data:null,v&&v.shapes&&(h=v.shapes[0].it,m||(p=""),p+=this.createPathShape(l,h),m||o.setAttribute("d",p)),m||this.layerElement.appendChild(o)}else o.textContent=n[t].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.layerElement.appendChild(o),m&&o.setAttribute("transform",l.to2dCSS());m&&(f+=n[t].l,f+=s.tr/1e3*s.s),this.textSpans[g]=o,g+=1}if(!m)for(;g<this.textSpans.length;)this.textSpans[g].style.display="none",g+=1;m&&this.globalData.fontManager.chars&&(o.setAttribute("d",p),this.layerElement.appendChild(o))}},SVGTextElement.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},SVGTextElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,r,i=this.renderedLetters,a=this.currentTextDocumentData.l;r=a.length;var n;for(s=0;r>s;s+=1)a[s].n||(n=i[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},SVGTextElement.prototype.destroy=function(){this._parent.destroy.call(this._parent)},SVGTintFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,r=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},SVGFillFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,s=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},SVGStrokeEffect.prototype.initialize=function(){var t,e,s,r,i=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(r=this.elem.maskManager.masksProperties.length,s=0):(s=this.filterManager.effectElements[0].p.v-1,r=s+1),e=document.createElementNS(svgNS,"g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;r>s;s+=1)t=document.createElementNS(svgNS,"path"),e.appendChild(t),this.paths.push({p:t,m:s});if(3===this.filterManager.effectElements[10].p.v){var a=document.createElementNS(svgNS,"mask"),n="stms_"+randomString(10);a.setAttribute("id",n),a.setAttribute("mask-type","alpha"),a.appendChild(e),this.elem.globalData.defs.appendChild(a);var o=document.createElementNS(svgNS,"g");o.setAttribute("mask","url(#"+n+")"),i[0]&&o.appendChild(i[0]),this.elem.layerElement.appendChild(o),this.masker=a,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var i=this.elem.layerElement.children||this.elem.layerElement.childNodes;i.length;)this.elem.layerElement.removeChild(i[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},SVGStrokeEffect.prototype.renderFrame=function(t){this.initialized||this.initialize();var e,s,r,i=this.paths.length;for(e=0;i>e;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],r=this.paths[e].p,(t||this.filterManager.mdf||s.prop.mdf)&&r.setAttribute("d",s.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||s.prop.mdf){var a;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=r.getTotalLength();a="0 0 0 "+h*n+" ";var l,p=h*(o-n),m=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,f=Math.floor(p/m);for(l=0;f>l;l+=1)a+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";a+="0 "+10*h+" 0 0"}else a="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;r.setAttribute("stroke-dasharray",a)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var c=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+bm_floor(255*c[0])+","+bm_floor(255*c[1])+","+bm_floor(255*c[2])+")")}},SVGTritoneFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,r=this.filterManager.effectElements[2].p.v,i=r[0]+" "+s[0]+" "+e[0],a=r[1]+" "+s[1]+" "+e[1],n=r[2]+" "+s[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",i),this.feFuncG.setAttribute("tableValues",a),this.feFuncB.setAttribute("tableValues",n)}},SVGProLevelsFilter.prototype.createFeFunc=function(t,e){var s=document.createElementNS(svgNS,t);return s.setAttribute("type","table"),e.appendChild(s),s},SVGProLevelsFilter.prototype.getTableValue=function(t,e,s,r,i){for(var a,n,o=0,h=256,l=Math.min(t,e),p=Math.max(t,e),m=Array.call(null,{length:h}),f=0,c=i-r,d=e-t;256>=o;)a=o/256,n=l>=a?0>d?i:r:a>=p?0>d?r:i:r+c*Math.pow((a-t)/d,1/s),m[f++]=n,o+=256/(h-1);return m.join(" ")},SVGProLevelsFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e,s=this.filterManager.effectElements;this.feFuncRComposed&&(t||s[2].p.mdf||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf)&&(e=this.getTableValue(s[2].p.v,s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[9].p.mdf||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf)&&(e=this.getTableValue(s[9].p.v,s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[16].p.mdf||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf)&&(e=this.getTableValue(s[16].p.v,s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[23].p.mdf||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf)&&(e=this.getTableValue(s[23].p.v,s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[30].p.mdf||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf)&&(e=this.getTableValue(s[30].p.v,s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v),this.feFuncA.setAttribute("tableValues",e))}},SVGDropShadowEffect.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){if((t||this.filterManager.effectElements[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p.mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p.mdf||this.filterManager.effectElements[3].p.mdf){var s=this.filterManager.effectElements[3].p.v,r=(this.filterManager.effectElements[2].p.v-90)*degToRads,i=s*Math.cos(r),a=s*Math.sin(r);this.feOffset.setAttribute("dx",i),this.feOffset.setAttribute("dy",a)}}},SVGEffects.prototype.renderFrame=function(t){var e,s=this.filters.length;for(e=0;s>e;e+=1)this.filters[e].renderFrame(t)},createElement(SVGBaseElement,ICompElement),ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.prepareFrame=function(t){if(this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){if(this.tm){var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}else this.renderedFrame=t/this.data.sr;var s,r=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=0;r>s;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st)}},ICompElement.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),r=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;r>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this._parent.destroy.call(this._parent);var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].destroy()},ICompElement.prototype.checkLayers=SVGRenderer.prototype.checkLayers,ICompElement.prototype.buildItem=SVGRenderer.prototype.buildItem,ICompElement.prototype.buildAllItems=SVGRenderer.prototype.buildAllItems,ICompElement.prototype.buildElementParenting=SVGRenderer.prototype.buildElementParenting,ICompElement.prototype.createItem=SVGRenderer.prototype.createItem,ICompElement.prototype.createImage=SVGRenderer.prototype.createImage,ICompElement.prototype.createComp=SVGRenderer.prototype.createComp,ICompElement.prototype.createSolid=SVGRenderer.prototype.createSolid,ICompElement.prototype.createShape=SVGRenderer.prototype.createShape,ICompElement.prototype.createText=SVGRenderer.prototype.createText,ICompElement.prototype.createBase=SVGRenderer.prototype.createBase,ICompElement.prototype.appendElementInPos=SVGRenderer.prototype.appendElementInPos,ICompElement.prototype.checkPendingElements=SVGRenderer.prototype.checkPendingElements,ICompElement.prototype.addPendingElement=SVGRenderer.prototype.addPendingElement,createElement(SVGBaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData);this._parent.createElements.call(this),this.innerElem=document.createElementNS(svgNS,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio","xMidYMid slice"),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.maskedElement=this.innerElem,this.layerElement.appendChild(this.innerElem),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},IImageElement.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},IImageElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),void(this.firstFrame&&(this.firstFrame=!1)))},IImageElement.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.innerElem=null},createElement(SVGBaseElement,IShapeElement),IShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},IShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},IShapeElement.prototype.buildExpressionInterface=function(){},IShapeElement.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),(!this.data.hd||this.data.td)&&styleUnselectableDiv(this.layerElement)},IShapeElement.prototype.setGradientData=function(t,e,s){var r,i="gr_"+randomString(10);r=1===e.t?document.createElementNS(svgNS,"linearGradient"):document.createElementNS(svgNS,"radialGradient"),r.setAttribute("id",i),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse");var a,n,o,h=[];for(o=4*e.g.p,n=0;o>n;n+=4)a=document.createElementNS(svgNS,"stop"),r.appendChild(a),h.push(a);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+i+")"),this.globalData.defs.appendChild(r),s.gf=r,s.cst=h},IShapeElement.prototype.setGradientOpacity=function(t,e,s){if(t.g.k.k[0].s&&t.g.k.k[0].s.length>4*t.g.p||t.g.k.k.length>4*t.g.p){var r,i,a,n,o=document.createElementNS(svgNS,"mask"),h=document.createElementNS(svgNS,"path");o.appendChild(h);var l="op_"+randomString(10),p="mk_"+randomString(10);o.setAttribute("id",p),r=1===t.t?document.createElementNS(svgNS,"linearGradient"):document.createElementNS(svgNS,"radialGradient"),r.setAttribute("id",l),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse"),n=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var m=[];for(a=4*t.g.p;n>a;a+=2)i=document.createElementNS(svgNS,"stop"),i.setAttribute("stop-color","rgb(255,255,255)"),r.appendChild(i),m.push(i);return h.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+l+")"),this.globalData.defs.appendChild(r),this.globalData.defs.appendChild(o),e.of=r,e.ost=m,s.msElem=h,p}},IShapeElement.prototype.searchShapes=function(t,e,s,r,i,a){a=a||[];var n,o,h,l,p,m=[].concat(a),f=t.length-1,c=[],d=[];for(n=f;n>=0;n-=1)if("fl"==t[n].ty||"st"==t[n].ty||"gf"==t[n].ty||"gs"==t[n].ty){e[n]={},l={type:t[n].ty,d:"",ld:"",lvl:i,mdf:!1};var u=document.createElementNS(svgNS,"path");if(e[n].o=PropertyFactory.getProp(this,t[n].o,0,.01,r),
-("st"==t[n].ty||"gs"==t[n].ty)&&(u.setAttribute("stroke-linecap",this.lcEnum[t[n].lc]||"round"),u.setAttribute("stroke-linejoin",this.ljEnum[t[n].lj]||"round"),u.setAttribute("fill-opacity","0"),1==t[n].lj&&u.setAttribute("stroke-miterlimit",t[n].ml),e[n].w=PropertyFactory.getProp(this,t[n].w,0,null,r),t[n].d)){var y=PropertyFactory.getDashProp(this,t[n].d,"svg",r);y.k||(u.setAttribute("stroke-dasharray",y.dasharray),u.setAttribute("stroke-dashoffset",y.dashoffset)),e[n].d=y}if("fl"==t[n].ty||"st"==t[n].ty)e[n].c=PropertyFactory.getProp(this,t[n].c,1,255,r),s.appendChild(u);else{e[n].g=PropertyFactory.getGradientProp(this,t[n].g,r),2==t[n].t&&(e[n].h=PropertyFactory.getProp(this,t[n].h,1,.01,r),e[n].a=PropertyFactory.getProp(this,t[n].a,1,degToRads,r)),e[n].s=PropertyFactory.getProp(this,t[n].s,1,null,r),e[n].e=PropertyFactory.getProp(this,t[n].e,1,null,r),this.setGradientData(u,t[n],e[n],l);var g=this.setGradientOpacity(t[n],e[n],l);g&&u.setAttribute("mask","url(#"+g+")"),e[n].elem=u,s.appendChild(u)}2===t[n].r&&u.setAttribute("fill-rule","evenodd"),t[n].ln&&u.setAttribute("id",t[n].ln),t[n].cl&&u.setAttribute("class",t[n].cl),l.pElem=u,this.stylesList.push(l),e[n].style=l,c.push(l)}else if("gr"==t[n].ty){e[n]={it:[]};var v=document.createElementNS(svgNS,"g");s.appendChild(v),e[n].gr=v,this.searchShapes(t[n].it,e[n].it,v,r,i+1,m)}else if("tr"==t[n].ty)e[n]={transform:{op:PropertyFactory.getProp(this,t[n].o,0,.01,r),mProps:PropertyFactory.getProp(this,t[n],2,null,r)},elements:[]},p=e[n].transform,m.push(p);else if("sh"==t[n].ty||"rc"==t[n].ty||"el"==t[n].ty||"sr"==t[n].ty){e[n]={elements:[],caches:[],styles:[],transformers:m,lStr:""};var b=4;for("rc"==t[n].ty?b=5:"el"==t[n].ty?b=6:"sr"==t[n].ty&&(b=7),e[n].sh=ShapePropertyFactory.getShapeProp(this,t[n],b,r),e[n].lvl=i,this.shapes.push(e[n].sh),this.addShapeToModifiers(e[n]),h=this.stylesList.length,o=0;h>o;o+=1)this.stylesList[o].closed||e[n].elements.push({ty:this.stylesList[o].type,st:this.stylesList[o]})}else if("tm"==t[n].ty||"rd"==t[n].ty||"ms"==t[n].ty||"rp"==t[n].ty){var E=ShapeModifiers.getModifier(t[n].ty);E.init(this,t[n],r),this.shapeModifiers.push(E),d.push(E),e[n]=E}for(f=c.length,n=0;f>n;n+=1)c[n].closed=!0;for(f=d.length,n=0;f>n;n+=1)d[n].closed=!0},IShapeElement.prototype.addShapeToModifiers=function(t){var e,s=this.shapeModifiers.length;for(e=0;s>e;e+=1)this.shapeModifiers[e].addShape(t)},IShapeElement.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;e>t;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},IShapeElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.globalToLocal([0,0,0]),this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),void this.renderShape(null,null,!0,null))},IShapeElement.prototype.hide=function(){if(!this.hidden){this.layerElement.style.display="none";var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pElem.style.display="none",this.stylesList[t].pElem.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pElem.parentNode));this.hidden=!0}},IShapeElement.prototype.renderShape=function(t,e,s,r){var i,a;if(!t)for(t=this.shapesData,a=this.stylesList.length,i=0;a>i;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;e||(e=this.viewData),a=t.length-1;var n;for(i=a;i>=0;i-=1)n=t[i].ty,"tr"==n?((this.firstFrame||e[i].transform.op.mdf&&r)&&r.setAttribute("opacity",e[i].transform.op.v),(this.firstFrame||e[i].transform.mProps.mdf&&r)&&r.setAttribute("transform",e[i].transform.mProps.v.to2dCSS())):"sh"==n||"el"==n||"rc"==n||"sr"==n?this.renderPath(t[i],e[i]):"fl"==n?this.renderFill(t[i],e[i]):"gf"==n?this.renderGradient(t[i],e[i]):"gs"==n?(this.renderGradient(t[i],e[i]),this.renderStroke(t[i],e[i])):"st"==n?this.renderStroke(t[i],e[i]):"gr"==n&&this.renderShape(t[i].it,e[i].it,!1,e[i].gr);if(s){for(a=this.stylesList.length,i=0;a>i;i+=1)"0"===this.stylesList[i].ld&&(this.stylesList[i].ld="1",this.stylesList[i].pElem.style.display="block"),(this.stylesList[i].mdf||this.firstFrame)&&(this.stylesList[i].pElem.setAttribute("d",this.stylesList[i].d),this.stylesList[i].msElem&&this.stylesList[i].msElem.setAttribute("d",this.stylesList[i].d));this.firstFrame&&(this.firstFrame=!1)}},IShapeElement.prototype.renderPath=function(t,e){var s,r,i,a,n,o,h,l,p=e.elements.length,m=e.lvl;for(l=0;p>l;l+=1){o=e.sh.mdf||this.firstFrame,n="M0 0";var f=e.sh.paths;if(a=f._length,e.elements[l].st.lvl<m){for(var c,d=this.mHelper.reset(),u=m-e.elements[l].st.lvl,y=e.transformers.length-1;u>0;)o=e.transformers[y].mProps.mdf||o,c=e.transformers[y].mProps.v.props,d.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),u--,y--;if(o){for(i=0;a>i;i+=1)if(h=f.shapes[i],h&&h._length){for(s=h._length,r=1;s>r;r+=1)1==r&&(n+=" M"+d.applyToPointStringified(h.v[0][0],h.v[0][1])),n+=" C"+d.applyToPointStringified(h.o[r-1][0],h.o[r-1][1])+" "+d.applyToPointStringified(h.i[r][0],h.i[r][1])+" "+d.applyToPointStringified(h.v[r][0],h.v[r][1]);1==s&&(n+=" M"+d.applyToPointStringified(h.v[0][0],h.v[0][1])),h.c&&(n+=" C"+d.applyToPointStringified(h.o[r-1][0],h.o[r-1][1])+" "+d.applyToPointStringified(h.i[0][0],h.i[0][1])+" "+d.applyToPointStringified(h.v[0][0],h.v[0][1]),n+="z")}e.caches[l]=n}else n=e.caches[l]}else if(o){for(i=0;a>i;i+=1)if(h=f.shapes[i],h&&h._length){for(s=h._length,r=1;s>r;r+=1)1==r&&(n+=" M"+h.v[0].join(",")),n+=" C"+h.o[r-1].join(",")+" "+h.i[r].join(",")+" "+h.v[r].join(",");1==s&&(n+=" M"+h.v[0].join(",")),h.c&&s&&(n+=" C"+h.o[r-1].join(",")+" "+h.i[0].join(",")+" "+h.v[0].join(","),n+="z")}e.caches[l]=n}else n=e.caches[l];e.elements[l].st.d+=n,e.elements[l].st.mdf=o||e.elements[l].st.mdf}},IShapeElement.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("fill","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("fill-opacity",e.o.v)},IShapeElement.prototype.renderGradient=function(t,e){var s=e.gf,r=e.of,i=e.s.v,a=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.elem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var o=1===t.t?"x1":"cx",h="x1"===o?"y1":"cy";s.setAttribute(o,i[0]),s.setAttribute(h,i[1]),r&&(r.setAttribute(o,i[0]),r.setAttribute(h,i[1]))}var l,p,m,f;if(e.g.cmdf||this.firstFrame){l=e.cst;var c=e.g.c;for(m=l.length,p=0;m>p;p+=1)f=l[p],f.setAttribute("offset",c[4*p]+"%"),f.setAttribute("stop-color","rgb("+c[4*p+1]+","+c[4*p+2]+","+c[4*p+3]+")")}if(r&&(e.g.omdf||this.firstFrame)){l=e.ost;var d=e.g.o;for(m=l.length,p=0;m>p;p+=1)f=l[p],f.setAttribute("offset",d[2*p]+"%"),f.setAttribute("stop-opacity",d[2*p+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(s.setAttribute("x2",a[0]),s.setAttribute("y2",a[1]),r&&(r.setAttribute("x2",a[0]),r.setAttribute("y2",a[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)),s.setAttribute("r",u),r&&r.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)));var y=Math.atan2(a[1]-i[1],a[0]-i[0]),g=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*g,b=Math.cos(y+e.a.v)*v+i[0],E=Math.sin(y+e.a.v)*v+i[1];s.setAttribute("fx",b),s.setAttribute("fy",E),r&&(r.setAttribute("fx",b),r.setAttribute("fy",E))}}},IShapeElement.prototype.renderStroke=function(t,e){var s=e.style,r=e.d;r&&r.k&&(r.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-dasharray",r.dasharray),s.pElem.setAttribute("stroke-dashoffset",r.dashoffset)),e.c&&(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},IShapeElement.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},createElement(SVGBaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this._parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t),this.innerElem=t,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},ISolidElement.prototype.hide=IImageElement.prototype.hide,ISolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,ISolidElement.prototype.destroy=IImageElement.prototype.destroy;var animationManager=function(){function t(t){for(var e=0,s=t.target;C>e;)x[e].animation===s&&(x.splice(e,1),e-=1,C-=1,s.isPaused||r()),e+=1}function e(t,e){if(!t)return null;for(var s=0;C>s;){if(x[s].elem==t&&null!==x[s].elem)return x[s].animation;s+=1}var r=new AnimationItem;return i(r,t),r.setData(t,e),r}function s(){M+=1,E()}function r(){M-=1,0===M&&(k=!0)}function i(e,i){e.addEventListener("destroy",t),e.addEventListener("_active",s),e.addEventListener("_idle",r),x.push({elem:i,animation:e}),C+=1}function a(t){var e=new AnimationItem;return i(e,null),e.setParams(t),e}function n(t,e){var s;for(s=0;C>s;s+=1)x[s].animation.setSpeed(t,e)}function o(t,e){var s;for(s=0;C>s;s+=1)x[s].animation.setDirection(t,e)}function h(t){var e;for(e=0;C>e;e+=1)x[e].animation.play(t)}function l(t,e){S=Date.now();var s;for(s=0;C>s;s+=1)x[s].animation.moveFrame(t,e)}function p(t){var e,s=t-S;for(e=0;C>e;e+=1)x[e].animation.advanceTime(s);S=t,k||requestAnimationFrame(p)}function m(t){S=t,requestAnimationFrame(p)}function f(t){var e;for(e=0;C>e;e+=1)x[e].animation.pause(t)}function c(t,e,s){var r;for(r=0;C>r;r+=1)x[r].animation.goToAndStop(t,e,s)}function d(t){var e;for(e=0;C>e;e+=1)x[e].animation.stop(t)}function u(t){var e;for(e=0;C>e;e+=1)x[e].animation.togglePause(t)}function y(t){var e;for(e=C-1;e>=0;e-=1)x[e].animation.destroy(t)}function g(t,s,r){var i,a=document.getElementsByClassName("bodymovin"),n=a.length;for(i=0;n>i;i+=1)r&&a[i].setAttribute("data-bm-type",r),e(a[i],t);if(s&&0===n){r||(r="svg");var o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=document.createElement("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",r),o.appendChild(h),e(h,t)}}function v(){var t;for(t=0;C>t;t+=1)x[t].animation.resize()}function b(){requestAnimationFrame(m)}function E(){k&&(k=!1,requestAnimationFrame(m))}var P={},x=[],S=0,C=0,k=!0,M=0;return setTimeout(b,0),P.registerAnimation=e,P.loadAnimation=a,P.setSpeed=n,P.setDirection=o,P.play=h,P.moveFrame=l,P.pause=f,P.stop=d,P.togglePause=u,P.searchAnimations=g,P.resize=v,P.start=b,P.goToAndStop=c,P.destroy=y,P}(),AnimationItem=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.scaleMode="fit",this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=ProjectInterface()};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var r=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.responseText);e.configAnimation(t)}catch(s){}}}},AnimationItem.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},r=t.attributes;s.path=r.getNamedItem("data-animation-path")?r.getNamedItem("data-animation-path").value:r.getNamedItem("data-bm-path")?r.getNamedItem("data-bm-path").value:r.getNamedItem("bm-path")?r.getNamedItem("bm-path").value:"",s.animType=r.getNamedItem("data-anim-type")?r.getNamedItem("data-anim-type").value:r.getNamedItem("data-bm-type")?r.getNamedItem("data-bm-type").value:r.getNamedItem("bm-type")?r.getNamedItem("bm-type").value:r.getNamedItem("data-bm-renderer")?r.getNamedItem("data-bm-renderer").value:r.getNamedItem("bm-renderer")?r.getNamedItem("bm-renderer").value:"canvas";var i=r.getNamedItem("data-anim-loop")?r.getNamedItem("data-anim-loop").value:r.getNamedItem("data-bm-loop")?r.getNamedItem("data-bm-loop").value:r.getNamedItem("bm-loop")?r.getNamedItem("bm-loop").value:"";""===i||(s.loop="false"===i?!1:"true"===i?!0:parseInt(i));var a=r.getNamedItem("data-anim-autoplay")?r.getNamedItem("data-anim-autoplay").value:r.getNamedItem("data-bm-autoplay")?r.getNamedItem("data-bm-autoplay").value:r.getNamedItem("bm-autoplay")?r.getNamedItem("bm-autoplay").value:!0;s.autoplay="false"!==a,s.name=r.getNamedItem("data-name")?r.getNamedItem("data-name").value:r.getNamedItem("data-bm-name")?r.getNamedItem("data-bm-name").value:r.getNamedItem("bm-name")?r.getNamedItem("bm-name").value:"";var n=r.getNamedItem("data-anim-prerender")?r.getNamedItem("data-anim-prerender").value:r.getNamedItem("data-bm-prerender")?r.getNamedItem("data-bm-prerender").value:r.getNamedItem("bm-prerender")?r.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,r=this.animationData.layers,i=r.length,a=t.layers,n=a.length;for(s=0;n>s;s+=1)for(e=0;i>e;){if(r[e].id==a[s].id){r[e]=a[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(i=t.assets.length,e=0;i>e;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,r=this,i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",i,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)r.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);r.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new ImagePreloader,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets),this.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()))},AnimationItem.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),AnimationItem.prototype.addPendingElement=function(){this.pendingElements+=1},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.setSubframe=function(t){this.subframeEnabled=t?!0:!1},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:Math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.pause())},AnimationItem.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},AnimationItem.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.01)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(0)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t-.01)),this.firstFrame=t,this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,r=t.length;for(s=0;r>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},AnimationItem.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.checkSegments(),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");this.currentRawFrame=this.currentRawFrame%this.totalFrames}else if(this.currentRawFrame<0)return this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames,void this.gotoFrame());this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},AnimationItem.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getAssets=function(){return this.assets},AnimationItem.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},AnimationItem.prototype.addEventListener=_addEventListener,AnimationItem.prototype.removeEventListener=_removeEventListener,AnimationItem.prototype.triggerEvent=_triggerEvent,extendPrototype(BaseRenderer,CanvasRenderer),CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this,this.globalData)},CanvasRenderer.prototype.ctxTransform=function(t){if(1!==t[0]||0!==t[1]||0!==t[4]||1!==t[5]||0!==t[12]||0!==t[13]){if(!this.renderConfig.clearCanvas)return void this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13]);this.transformMat.cloneFromProps(t),this.transformMat.transform(this.contextData.cTr.props[0],this.contextData.cTr.props[1],this.contextData.cTr.props[2],this.contextData.cTr.props[3],this.contextData.cTr.props[4],this.contextData.cTr.props[5],this.contextData.cTr.props[6],this.contextData.cTr.props[7],this.contextData.cTr.props[8],this.contextData.cTr.props[9],this.contextData.cTr.props[10],this.contextData.cTr.props[11],this.contextData.cTr.props[12],this.contextData.cTr.props[13],this.contextData.cTr.props[14],this.contextData.cTr.props[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var e=this.contextData.cTr.props;this.canvasContext.setTransform(e[0],e[1],e[4],e[5],e[12],e[13])}},CanvasRenderer.prototype.ctxOpacity=function(t){if(1!==t){if(!this.renderConfig.clearCanvas)return void(this.canvasContext.globalAlpha*=0>t?0:t);this.contextData.cO*=0>t?0:t,this.canvasContext.globalAlpha=this.contextData.cO}},CanvasRenderer.prototype.reset=function(){return this.renderConfig.clearCanvas?(this.contextData.cArrPos=0,this.contextData.cTr.reset(),void(this.contextData.cO=1)):void this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;(null===this.contextData.saved[this.contextData.cArrPos]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(16));var s,r=this.contextData.saved[this.contextData.cArrPos];for(s=0;16>s;s+=1)r[s]=e[s];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRenderer.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&this.canvasContext.restore(),this.contextData.cArrPos-=1;var e,s=this.contextData.saved[this.contextData.cArrPos],r=this.contextData.cTr.props;for(e=0;16>e;e+=1)r[e]=s[e];this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13]),s=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=s,this.canvasContext.globalAlpha=s},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.data=t,this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.totalFrames=Math.floor(t.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.globalData.frameRate=t.fr,this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,document.body),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.addPendingElement=this.animationItem.addPendingElement.bind(this.animationItem),this.globalData.transformCanvas=this.transformCanvas,this.elements=Array.apply(null,{length:t.layers.length}),this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr);var s,r;if(-1!==this.renderConfig.preserveAspectRatio.indexOf("meet")||-1!==this.renderConfig.preserveAspectRatio.indexOf("slice")){var i=this.renderConfig.preserveAspectRatio.split(" "),a=i[1]||"meet",n=i[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);s=t/e,r=this.transformCanvas.w/this.transformCanvas.h,r>s&&"meet"===a||s>r&&"slice"===a?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),this.transformCanvas.tx="xMid"===o&&(s>r&&"meet"===a||r>s&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(s>r&&"meet"===a||r>s&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===h&&(r>s&&"meet"===a||s>r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===h&&(r>s&&"meet"===a||s>r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr,this.transformCanvas.tx=0,this.transformCanvas.ty=0);this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1];
+var window="undefined"==typeof window?{}:window;!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof module&&module.exports?module.exports=e():t.bodymovin=e()}(window,function(){function ProjectInterface(){return{}}function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function roundTo2Decimals(t){return Math.round(1e4*t)/1e4}function roundTo3Decimals(t){return Math.round(100*t)/100}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function BMEnterFrameEvent(t,e,s,r){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>r?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=0>e?-1:1}function BMCompleteLoopEvent(t,e,s,r){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>r?-1:1}function BMSegmentStartEvent(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function BMDestroyEvent(t,e){this.type=t,this.target=e}function _addEventListener(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)}function _removeEventListener(t,e){if(e){if(this._cbs[t]){for(var s=0,r=this._cbs[t].length;r>s;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,r-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function _triggerEvent(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,r=0;s>r;r++)this._cbs[t][r](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,r="";for(s=t;s>0;--s)r+=e[Math.round(Math.random()*(e.length-1))];return r}function HSVtoRGB(t,e,s){var r,i,a,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=s*(1-e),l=s*(1-o*e),p=s*(1-(1-o)*e),n%6){case 0:r=s,i=p,a=h;break;case 1:r=l,i=s,a=h;break;case 2:r=h,i=s,a=p;break;case 3:r=h,i=l,a=s;break;case 4:r=p,i=h,a=s;break;case 5:r=s,i=h,a=l}return[r,i,a]}function RGBtoHSV(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var r,i=Math.max(t,e,s),a=Math.min(t,e,s),n=i-a,o=0===i?0:n/i,h=i/255;switch(i){case a:r=0;break;case t:r=e-s+n*(s>e?6:0),r/=6*n;break;case e:r=s-t+2*n,r/=6*n;break;case s:r=t-e+4*n,r/=6*n}return[r,o,h]}function addSaturationToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),HSVtoRGB(s[0],s[1],s[2])}function addBrightnessToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),HSVtoRGB(s[0],s[1],s[2])}function addHueToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),HSVtoRGB(s[0],s[1],s[2])}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function fillToRgba(t,e){if(!cachedColors[t]){var s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(s[1],16)+","+parseInt(s[2],16)+","+parseInt(s[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function RenderedFrame(t,e){this.tr=t,this.o=e}function LetterProps(t,e,s,r,i,a){this.o=t,this.sw=e,this.sc=s,this.fc=r,this.m=i,this.props=a}function iterateDynamicProperties(t){var e,s=this.dynamicProperties;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t)}function reversePath(t){var e,s,r=[],i=[],a=[],n={},o=0;t.c&&(r[0]=t.o[0],i[0]=t.i[0],a[0]=t.v[0],o=1),s=t.i.length;var h=s-1;for(e=o;s>e;e+=1)r.push(t.o[h]),i.push(t.i[h]),a.push(t.v[h]),h-=1;return n.i=r,n.o=i,n.v=a,n}function Matrix(){}function matrixManagerFunction(){var t=new Matrix,e=function(e,s,r,i,a){return t.reset().translate(i,a).rotate(e).scale(s,r).toCSS()},s=function(t){return e(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])};return{getMatrix:s}}function createElement(t,e,s){if(!e){var r=Object.create(t.prototype,s),i={};return r&&"[object Function]"===i.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype._parent=t.prototype}function extendPrototype(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function bezFunction(){function t(t,e,s,r,i,a){var n=t*r+e*i+s*a-i*r-a*t-s*e;return n>-1e-4&&1e-4>n}function e(e,s,r,i,a,n,o,h,l){if(0===r&&0===n&&0===l)return t(e,s,i,a,o,h);var p,m=Math.sqrt(Math.pow(i-e,2)+Math.pow(a-s,2)+Math.pow(n-r,2)),f=Math.sqrt(Math.pow(o-e,2)+Math.pow(h-s,2)+Math.pow(l-r,2)),c=Math.sqrt(Math.pow(o-i,2)+Math.pow(h-a,2)+Math.pow(l-n,2));return p=m>f?m>c?m-f-c:c-f-m:c>f?c-f-m:f-m-c,p>-1e-4&&1e-4>p}function s(t){this.segmentLength=0,this.points=new Array(t)}function r(t,e){this.partialLength=t,this.point=e}function i(t,e){var s=e.segments,r=s.length,i=bm_floor((r-1)*t),a=t*e.addedLength,n=0;if(a==s[i].l)return s[i].p;for(var o=s[i].l>a?-1:1,h=!0;h;)s[i].l<=a&&s[i+1].l>a?(n=(a-s[i].l)/(s[i+1].l-s[i].l),h=!1):i+=o,(0>i||i>=r-1)&&(h=!1);return s[i].p+(s[i+1].p-s[i].p)*n}function a(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,r,n,o,h){var l=new a;n=0>n?0:n>1?1:n;var p=i(n,h);o=o>1?1:o;var m,f=i(o,h),c=t.length,d=1-p,u=1-f;for(m=0;c>m;m+=1)l.pt1[m]=Math.round(1e3*(d*d*d*t[m]+(p*d*d+d*p*d+d*d*p)*s[m]+(p*p*d+d*p*p+p*d*p)*r[m]+p*p*p*e[m]))/1e3,l.pt3[m]=Math.round(1e3*(d*d*u*t[m]+(p*d*u+d*p*u+d*d*f)*s[m]+(p*p*u+d*p*f+p*d*f)*r[m]+p*p*f*e[m]))/1e3,l.pt4[m]=Math.round(1e3*(d*u*u*t[m]+(p*u*u+d*f*u+d*u*f)*s[m]+(p*f*u+d*f*f+p*u*f)*r[m]+p*f*f*e[m]))/1e3,l.pt2[m]=Math.round(1e3*(u*u*u*t[m]+(f*u*u+u*f*u+u*u*f)*s[m]+(f*f*u+u*f*f+f*u*f)*r[m]+f*f*f*e[m]))/1e3;return l}var o=(Math,function(){function t(t,e){this.l=t,this.p=e}return function(e,s,r,i){var a,n,o,h,l,p,m=defaultCurveSegments,f=0,c=[],d=[],u={addedLength:0,segments:[]};for(o=r.length,a=0;m>a;a+=1){for(l=a/(m-1),p=0,n=0;o>n;n+=1)h=bm_pow(1-l,3)*e[n]+3*bm_pow(1-l,2)*l*r[n]+3*(1-l)*bm_pow(l,2)*i[n]+bm_pow(l,3)*s[n],c[n]=h,null!==d[n]&&(p+=bm_pow(c[n]-d[n],2)),d[n]=c[n];p&&(p=bm_sqrt(p),f+=p),u.segments.push(new t(f,l))}return u.addedLength=f,u}}()),h=function(){var e={};return function(i){var a=i.s,n=i.e,o=i.to,h=i.ti,l=(a.join("_")+"_"+n.join("_")+"_"+o.join("_")+"_"+h.join("_")).replace(/\./g,"p");if(e[l])return void(i.bezierData=e[l]);var p,m,f,c,d,u,y,g=defaultCurveSegments,v=0,b=null;2===a.length&&(a[0]!=n[0]||a[1]!=n[1])&&t(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&t(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(g=2);var E=new s(g);for(f=o.length,p=0;g>p;p+=1){for(y=new Array(f),d=p/(g-1),u=0,m=0;f>m;m+=1)c=bm_pow(1-d,3)*a[m]+3*bm_pow(1-d,2)*d*(a[m]+o[m])+3*(1-d)*bm_pow(d,2)*(n[m]+h[m])+bm_pow(d,3)*n[m],y[m]=c,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),v+=u,E.points[p]=new r(u,y),b=y}E.segmentLength=v,i.bezierData=E,e[l]=E}}();return{getBezierLength:o,getNewSegment:n,buildBezierData:h,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(i,a,o){var h,l,p,m,f,c,d,u,y=i.length;for(m=0;y>m;m+=1)if(h=i[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(i[m-1].td=h.tt),l=[],p=-1,h.hasMask){var g=h.masksProperties;for(c=g.length,f=0;c>f;f+=1)if(g[f].pt.k.i)r(g[f].pt.k);else for(u=g[f].pt.k.length,d=0;u>d;d+=1)g[f].pt.k[d].s&&r(g[f].pt.k[d].s[0]),g[f].pt.k[d].e&&r(g[f].pt.k[d].e[0])}0===h.ty?(h.layers=e(h.refId,a),t(h.layers,a,o)):4===h.ty?s(h.shapes):5==h.ty&&n(h,o)}}function e(t,e){for(var s=0,r=e.length;r>s;){if(e[s].id===t)return e[s].layers;s+=1}}function s(t){var e,i,a,n=t.length,o=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)r(t[e].ks.k);else for(a=t[e].ks.k.length,i=0;a>i;i+=1)t[e].ks.k[i].s&&r(t[e].ks.k[i].s[0]),t[e].ks.k[i].e&&r(t[e].ks.k[i].e[0]);o=!0}else"gr"==t[e].ty&&s(t[e].it)}function r(t){var e,s=t.i.length;for(e=0;s>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function i(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]?!0:s[0]>t[0]?!1:t[1]>s[1]?!0:s[1]>t[1]?!1:t[2]>s[2]?!0:s[2]>t[2]?!1:void 0}function a(e,s){e.__complete||(l(e),o(e),h(e),p(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){var s,r,i=t.t.d.k,a=i.length;for(r=0;a>r;r+=1){var n=t.t.d.k[r].s;s=[];var o,h,l,p,m,f,c,d=0,u=t.t.m.g,y=0,g=0,v=0,b=[],E=0,P=0,x=e.getFontByName(n.f),S=0,C=x.fStyle.split(" "),k="normal",M="normal";for(h=C.length,o=0;h>o;o+=1)"italic"===C[o].toLowerCase()?M="italic":"bold"===C[o].toLowerCase()?k="700":"black"===C[o].toLowerCase()?k="900":"medium"===C[o].toLowerCase()?k="500":"regular"===C[o].toLowerCase()||"normal"===C[o].toLowerCase()?k="400":("light"===C[o].toLowerCase()||"thin"===C[o].toLowerCase())&&(k="200");if(n.fWeight=k,n.fStyle=M,h=n.t.length,n.sz){var A=n.sz[0],D=-1;for(o=0;h>o;o+=1)l=!1," "===n.t.charAt(o)?D=o:13===n.t.charCodeAt(o)&&(E=0,l=!0),e.chars?(c=e.getCharData(n.t.charAt(o),x.fStyle,x.fFamily),S=l?0:c.w*n.s/100):S=e.measureText(n.t.charAt(o),n.f,n.s),E+S>A?(-1===D?(n.t=n.t.substr(0,o)+"\r"+n.t.substr(o),h+=1):(o=D,n.t=n.t.substr(0,o)+"\r"+n.t.substr(o+1)),D=-1,E=0):E+=S;h=n.t.length}for(E=0,S=0,o=0;h>o;o+=1)if(l=!1," "===n.t.charAt(o)?p="\xa0":13===n.t.charCodeAt(o)?(b.push(E),P=E>P?E:P,E=0,p="",l=!0,v+=1):p=n.t.charAt(o),e.chars?(c=e.getCharData(n.t.charAt(o),x.fStyle,e.getFontByName(n.f).fFamily),S=l?0:c.w*n.s/100):S=e.measureText(p,n.f,n.s),E+=S,s.push({l:S,an:S,add:y,n:l,anIndexes:[],val:p,line:v}),2==u){if(y+=S,""==p||"\xa0"==p||o==h-1){for((""==p||"\xa0"==p)&&(y-=S);o>=g;)s[g].an=y,s[g].ind=d,s[g].extra=S,g+=1;d+=1,y=0}}else if(3==u){if(y+=S,""==p||o==h-1){for(""==p&&(y-=S);o>=g;)s[g].an=y,s[g].ind=d,s[g].extra=S,g+=1;y=0,d+=1}}else s[d].ind=d,s[d].extra=0,d+=1;if(n.l=s,P=E>P?E:P,b.push(E),n.sz)n.boxWidth=n.sz[0],n.justifyOffset=0;else switch(n.boxWidth=P,n.j){case 1:n.justifyOffset=-n.boxWidth;break;case 2:n.justifyOffset=-n.boxWidth/2;break;default:n.justifyOffset=0}n.lineWidths=b;var w=t.t.a;f=w.length;var T,F,I=[];for(m=0;f>m;m+=1){for(w[m].a.sc&&(n.strokeColorAnim=!0),w[m].a.sw&&(n.strokeWidthAnim=!0),(w[m].a.fc||w[m].a.fh||w[m].a.fs||w[m].a.fb)&&(n.fillColorAnim=!0),F=0,T=w[m].s.b,o=0;h>o;o+=1)s[o].anIndexes[m]=F,(1==T&&""!=s[o].val||2==T&&""!=s[o].val&&"\xa0"!=s[o].val||3==T&&(s[o].n||"\xa0"==s[o].val||o==h-1)||4==T&&(s[o].n||o==h-1))&&(1===w[m].s.rn&&I.push(F),F+=1);t.t.a[m].s.totalChars=F;var _,V=-1;if(1===w[m].s.rn)for(o=0;h>o;o+=1)V!=s[o].anIndexes[m]&&(V=s[o].anIndexes[m],_=I.splice(Math.floor(Math.random()*I.length),1)[0]),s[o].anIndexes[m]=_}0!==f||"m"in t.t.p||(t.singleShape=!0),n.yOffset=n.lh||1.2*n.s,n.ls=n.ls||0,n.ascent=x.ascent*n.s/100}}var o=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var s,r=e.length;for(s=0;r>s;s+=1)5===e[s].ty&&t(e[s])}var s=[4,4,14];return function(t){if(i(s,t.v)&&(e(t.layers),t.assets)){var r,a=t.assets.length;for(r=0;a>r;r+=1)t.assets[r].layers&&e(t.assets[r].layers)}}}(),h=function(){var t=[4,7,99];return function(e){if(e.chars&&!i(t,e.v)){var s,a,n,o,h,l=e.chars.length;for(s=0;l>s;s+=1)if(e.chars[s].data&&e.chars[s].data.shapes)for(h=e.chars[s].data.shapes[0].it,n=h.length,a=0;n>a;a+=1)o=h[a].ks.k,r(h[a].ks.k)}}}(),l=function(){function t(e){var s,r,i,a=e.length;for(s=0;a>s;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(i=e[s].c.k.length,r=0;i>r;r+=1)e[s].c.k[r].s&&(e[s].c.k[r].s[0]/=255,e[s].c.k[r].s[1]/=255,e[s].c.k[r].s[2]/=255,e[s].c.k[r].s[3]/=255),e[s].c.k[r].e&&(e[s].c.k[r].e[0]/=255,e[s].c.k[r].e[1]/=255,e[s].c.k[r].e[2]/=255,e[s].c.k[r].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,r=e.length;for(s=0;r>s;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(i(s,t.v)&&(e(t.layers),t.assets)){var r,a=t.assets.length;for(r=0;a>r;r+=1)t.assets[r].layers&&e(t.assets[r].layers)}}}(),p=function(){function t(e){var s,r,i,a=e.length,n=!1;for(s=a-1;s>=0;s-=1)if("sh"==e[s].ty){if(e[s].ks.k.i)e[s].ks.k.c=e[s].closed;else for(i=e[s].ks.k.length,r=0;i>r;r+=1)e[s].ks.k[r].s&&(e[s].ks.k[r].s[0].c=e[s].closed),e[s].ks.k[r].e&&(e[s].ks.k[r].e[0].c=e[s].closed);n=!0}else"gr"==e[s].ty&&t(e[s].it)}function e(e){var s,r,i,a,n,o,h=e.length;for(r=0;h>r;r+=1){if(s=e[r],s.hasMask){var l=s.masksProperties;for(a=l.length,i=0;a>i;i+=1)if(l[i].pt.k.i)l[i].pt.k.c=l[i].cl;else for(o=l[i].pt.k.length,n=0;o>n;n+=1)l[i].pt.k[n].s&&(l[i].pt.k[n].s[0].c=l[i].cl),l[i].pt.k[n].e&&(l[i].pt.k[n].e[0].c=l[i].cl)}4===s.ty&&t(s.shapes)}}var s=[4,4,18];return function(t){if(i(s,t.v)&&(e(t.layers),t.assets)){var r,a=t.assets.length;for(r=0;a>r;r+=1)t.assets[r].layers&&e(t.assets[r].layers)}}}(),m={};return m.completeData=a,m}function ShapePath(){this.c=!1,this._length=0,this._maxLength=8,this.v=Array.apply(null,{length:this._maxLength}),this.o=Array.apply(null,{length:this._maxLength}),this.i=Array.apply(null,{length:this._maxLength})}function ShapeModifier(){}function TrimModifier(){}function RoundCornersModifier(){}function RepeaterModifier(){}function ShapeCollection(){this._length=0,this._maxLength=4,this.shapes=Array.apply(null,{length:this._maxLength})}function BaseRenderer(){}function SVGRenderer(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:e&&e.hideOnTransparent===!1?!1:!0},this.globalData.renderConfig=this.renderConfig,this.elements=[],this.pendingElements=[],this.destroyed=!1}function MaskElement(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var r,i,a,n,o,h,l,p,m=this.globalData.defs,f=this.masksProperties.length,c=this.masksProperties,d=0,u=[],y=randomString(10),g="clipPath",v="clip-path";for(r=0;f>r;r++)if(("a"!==c[r].mode&&"n"!==c[r].mode||c[r].inv||100!==c[r].o.k)&&(g="mask",v="mask"),"s"!=c[r].mode&&"i"!=c[r].mode||0!=d?o=null:(o=document.createElementNS(svgNS,"rect"),o.setAttribute("fill","#ffffff"),o.setAttribute("width",this.element.comp.data.w),o.setAttribute("height",this.element.comp.data.h),u.push(o)),i=document.createElementNS(svgNS,"path"),"n"!=c[r].mode){if(d+=1,"s"==c[r].mode?i.setAttribute("fill","#000000"):i.setAttribute("fill","#ffffff"),i.setAttribute("clip-rule","nonzero"),0!==c[r].x.k){g="mask",v="mask",p=PropertyFactory.getProp(this.element,c[r].x,0,null,this.dynamicProperties);var b="fi_"+randomString(10);h=document.createElementNS(svgNS,"filter"),h.setAttribute("id",b),l=document.createElementNS(svgNS,"feMorphology"),l.setAttribute("operator","dilate"),l.setAttribute("in","SourceGraphic"),l.setAttribute("radius","0"),h.appendChild(l),m.appendChild(h),"s"==c[r].mode?i.setAttribute("stroke","#000000"):i.setAttribute("stroke","#ffffff")}else l=null,p=null;if(this.storedData[r]={elem:i,x:p,expan:l,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==c[r].mode){n=u.length;var E=document.createElementNS(svgNS,"g");for(a=0;n>a;a+=1)E.appendChild(u[a]);var P=document.createElementNS(svgNS,"mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+d),P.appendChild(i),m.appendChild(P),E.setAttribute("mask","url(#"+y+"_"+d+")"),u.length=0,u.push(E)}else u.push(i);c[r].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[r]={elem:i,lastPath:"",op:PropertyFactory.getProp(this.element,c[r].o,0,.01,this.dynamicProperties),prop:ShapePropertyFactory.getShapeProp(this.element,c[r],3,this.dynamicProperties,null)},o&&(this.viewData[r].invRect=o),this.viewData[r].prop.k||this.drawPath(c[r],this.viewData[r].prop.v,this.viewData[r])}else this.viewData[r]={op:PropertyFactory.getProp(this.element,c[r].o,0,.01,this.dynamicProperties),prop:ShapePropertyFactory.getShapeProp(this.element,c[r],3,this.dynamicProperties,null),elem:i},m.appendChild(i);for(this.maskElement=document.createElementNS(svgNS,g),f=u.length,r=0;f>r;r+=1)this.maskElement.appendChild(u[r]);this.maskElement.setAttribute("id",y),d>0&&this.element.maskedElement.setAttribute(v,"url(#"+y+")"),m.appendChild(this.maskElement)}function BaseElement(){}function SVGBaseElement(t,e,s,r,i){this.globalData=s,this.comp=r,this.data=t,this.matteElement=null,this.transformedElement=null,this.isTransparent=!1,this.parentContainer=e,this.layerId=i?i.layerId:"ly_"+randomString(10),this.placeholder=i,this.init()}function IShapeElement(t,e,s,r,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this._parent.constructor.call(this,t,e,s,r,i)}function ITextElement(t,e,s,r){}function SVGTextElement(t,e,s,r,i){this.textSpans=[],this.renderType="svg",this._parent.constructor.call(this,t,e,s,r,i)}function SVGTintFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=document.createElementNS(svgNS,"feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var r=document.createElementNS(svgNS,"feMerge");t.appendChild(r);var i;i=document.createElementNS(svgNS,"feMergeNode"),i.setAttribute("in","SourceGraphic"),r.appendChild(i),i=document.createElementNS(svgNS,"feMergeNode"),i.setAttribute("in","f2"),r.appendChild(i)}}function SVGFillFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function SVGStrokeEffect(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function SVGTritoneFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s);var r=document.createElementNS(svgNS,"feComponentTransfer");r.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(r),this.matrixFilter=r;var i=document.createElementNS(svgNS,"feFuncR");i.setAttribute("type","table"),r.appendChild(i),this.feFuncR=i;var a=document.createElementNS(svgNS,"feFuncG");a.setAttribute("type","table"),r.appendChild(a),this.feFuncG=a;var n=document.createElementNS(svgNS,"feFuncB");n.setAttribute("type","table"),r.appendChild(n),this.feFuncB=n}function SVGProLevelsFilter(t,e){this.filterManager=e;var s=this.filterManager.effectElements,r=document.createElementNS(svgNS,"feComponentTransfer");(s[9].p.k||0!==s[9].p.v||s[10].p.k||1!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||0!==s[12].p.v||s[13].p.k||1!==s[13].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",r)),(s[16].p.k||0!==s[16].p.v||s[17].p.k||1!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||0!==s[19].p.v||s[20].p.k||1!==s[20].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",r)),(s[23].p.k||0!==s[23].p.v||s[24].p.k||1!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||0!==s[26].p.v||s[27].p.k||1!==s[27].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",r)),(s[30].p.k||0!==s[30].p.v||s[31].p.k||1!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||0!==s[33].p.v||s[34].p.k||1!==s[34].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",r)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(r.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(r),r=document.createElementNS(svgNS,"feComponentTransfer")),(s[2].p.k||0!==s[2].p.v||s[3].p.k||1!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||0!==s[5].p.v||s[6].p.k||1!==s[6].p.v)&&(r.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(r),this.feFuncRComposed=this.createFeFunc("feFuncR",r),this.feFuncGComposed=this.createFeFunc("feFuncG",r),this.feFuncBComposed=this.createFeFunc("feFuncB",r))}function SVGDropShadowEffect(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var s=document.createElementNS(svgNS,"feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var r=document.createElementNS(svgNS,"feOffset");r.setAttribute("dx","25"),r.setAttribute("dy","0"),r.setAttribute("in","drop_shadow_1"),r.setAttribute("result","drop_shadow_2"),this.feOffset=r,t.appendChild(r);var i=document.createElementNS(svgNS,"feFlood");i.setAttribute("flood-color","#00ff00"),i.setAttribute("flood-opacity","1"),i.setAttribute("result","drop_shadow_3"),this.feFlood=i,t.appendChild(i);var a=document.createElementNS(svgNS,"feComposite");a.setAttribute("in","drop_shadow_3"),a.setAttribute("in2","drop_shadow_2"),a.setAttribute("operator","in"),a.setAttribute("result","drop_shadow_4"),t.appendChild(a);var n=document.createElementNS(svgNS,"feMerge");t.appendChild(n);var o;o=document.createElementNS(svgNS,"feMergeNode"),n.appendChild(o),o=document.createElementNS(svgNS,"feMergeNode"),o.setAttribute("in","SourceGraphic"),this.feMergeNode=o,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(o)}function SVGEffects(t){var e,s=t.data.ef.length,r=randomString(10),i=filtersFactory.createFilter(r),a=0;this.filters=[];var n;for(e=0;s>e;e+=1)20===t.data.ef[e].ty?(a+=1,n=new SVGTintFilter(i,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(a+=1,n=new SVGFillFilter(i,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new SVGStrokeEffect(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(a+=1,n=new SVGTritoneFilter(i,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty?(a+=1,n=new SVGProLevelsFilter(i,t.effects.effectElements[e]),this.filters.push(n)):25===t.data.ef[e].ty&&(a+=1,n=new SVGDropShadowEffect(i,t.effects.effectElements[e]),this.filters.push(n));a&&(t.globalData.defs.appendChild(i),t.layerElement.setAttribute("filter","url(#"+r+")"))}function ICompElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?Array.apply(null,{length:this.layers.length}):[],this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.xt?(this.layerElement=document.createElementNS(svgNS,"g"),this.buildAllItems()):s.progressiveLoad||this.buildAllItems()}function IImageElement(t,e,s,r,i){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,r,i)}function ISolidElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i)}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig={clearCanvas:e&&void 0!==e.clearCanvas?e.clearCanvas:!0,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet"},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1},this.contextData={saved:Array.apply(null,{length:15}),savedOp:Array.apply(null,{length:15}),cArrPos:0,cTr:new Matrix,cO:1};var s,r=15;for(s=0;r>s;s+=1)this.contextData.saved[s]=Array.apply(null,{length:16});this.elements=[],this.pendingElements=[],this.transformMat=new Matrix,this.completeLayers=!1}function HybridRenderer(t){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.pendingElements=[],this.elements=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0}function CVBaseElement(t,e,s){this.globalData=s,this.data=t,this.comp=e,this.canvasContext=s.canvasContext,this.init()}function CVCompElement(t,e,s){this._parent.constructor.call(this,t,e,s);var r={};for(var i in s)s.hasOwnProperty(i)&&(r[i]=s[i]);r.renderer=this,r.compHeight=this.data.h,r.compWidth=this.data.w,this.renderConfig={clearCanvas:!0},this.contextData={saved:Array.apply(null,{length:15}),savedOp:Array.apply(null,{length:15}),cArrPos:0,cTr:new Matrix,cO:1},this.completeLayers=!1;var a,n=15;for(a=0;n>a;a+=1)this.contextData.saved[a]=Array.apply(null,{length:16});this.transformMat=new Matrix,this.parentGlobalData=this.globalData;var o=document.createElement("canvas");r.canvasContext=o.getContext("2d"),this.canvasContext=r.canvasContext,o.width=this.data.w,o.height=this.data.h,this.canvas=o,this.globalData=r,this.layers=t.layers,this.pendingElements=[],this.elements=Array.apply(null,{length:this.layers.length}),this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),(this.data.xt||!s.progressiveLoad)&&this.buildAllItems()}function CVImageElement(t,e,s){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s),this.globalData.addPendingElement()}function CVMaskElement(t,e){this.data=t,this.element=e,this.dynamicProperties=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length);var s,r=this.masksProperties.length;for(s=0;r>s;s++)this.viewData[s]=ShapePropertyFactory.getShapeProp(this.element,this.masksProperties[s],3,this.dynamicProperties,null)}function CVShapeElement(t,e,s){this.shapes=[],this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this.shapesData=t.shapes,this.firstFrame=!0,this._parent.constructor.call(this,t,e,s)}function CVSolidElement(t,e,s){this._parent.constructor.call(this,t,e,s)}function CVTextElement(t,e,s){this.textSpans=[],this.yOffset=0,this.fillColorAnim=!1,this.strokeColorAnim=!1,this.strokeWidthAnim=!1,this.stroke=!1,this.fill=!1,this.justifyOffset=0,this.currentRender=null,this.renderType="canvas",this.values={fill:"rgba(0,0,0,0)",stroke:"rgba(0,0,0,0)",sWidth:0,fValue:""},this._parent.constructor.call(this,t,e,s)}function HBaseElement(t,e,s,r,i){this.globalData=s,this.comp=r,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=i?i.layerId:"ly_"+randomString(10),this.placeholder=i,this.init()}function HSolidElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i)}function HCompElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=Array.apply(null,{length:this.layers.length}),this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.hasMask&&(this.supports3d=!1),this.data.xt&&(this.layerElement=document.createElement("div")),this.buildAllItems()}function HShapeElement(t,e,s,r,i){this.shapes=[],this.shapeModifiers=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this._parent.constructor.call(this,t,e,s,r,i),this.addedTransforms={mdf:!1,mats:[this.finalTransform.mat]},this.currentBBox={x:999999,y:-999999,h:0,w:0}}function HTextElement(t,e,s,r,i){this.textSpans=[],this.textPaths=[],this.currentBBox={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this._parent.constructor.call(this,t,e,s,r,i)}function HImageElement(t,e,s,r,i){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,r,i)}function HCameraElement(t,e,s,r,i){if(this._parent.constructor.call(this,t,e,s,r,i),this.pe=PropertyFactory.getProp(this,t.pe,0,0,this.dynamicProperties),t.ks.p.s?(this.px=PropertyFactory.getProp(this,t.ks.p.x,1,0,this.dynamicProperties),this.py=PropertyFactory.getProp(this,t.ks.p.y,1,0,this.dynamicProperties),this.pz=PropertyFactory.getProp(this,t.ks.p.z,1,0,this.dynamicProperties)):this.p=PropertyFactory.getProp(this,t.ks.p,1,0,this.dynamicProperties),t.ks.a&&(this.a=PropertyFactory.getProp(this,t.ks.a,1,0,this.dynamicProperties)),t.ks.or.k.length&&t.ks.or.k[0].to){var a,n=t.ks.or.k.length;for(a=0;n>a;a+=1)t.ks.or.k[a].to=null,t.ks.or.k[a].ti=null}this.or=PropertyFactory.getProp(this,t.ks.or,1,degToRads,this.dynamicProperties),this.or.sh=!0,this.rx=PropertyFactory.getProp(this,t.ks.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(this,t.ks.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(this,t.ks.rz,0,degToRads,this.dynamicProperties),this.mat=new Matrix}function SliderEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function AngleEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function ColorEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function PointEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function LayerIndexEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function MaskIndexEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function CheckboxEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function NoValueEffect(){this.p={}}function EffectsManager(t,e,s){var r=t.ef;this.effectElements=[];var i,a,n=r.length;for(i=0;n>i;i++)a=new GroupEffect(r[i],e,s),this.effectElements.push(a)}function GroupEffect(t,e,s){this.dynamicProperties=[],this.init(t,e,this.dynamicProperties),this.dynamicProperties.length&&s.push(this)}function play(t){animationManager.play(t)}function pause(t){animationManager.pause(t)}function togglePause(t){animationManager.togglePause(t)}function setSpeed(t,e){animationManager.setSpeed(t,e)}function setDirection(t,e){animationManager.setDirection(t,e)}function stop(t){animationManager.stop(t)}function moveFrame(t){animationManager.moveFrame(t)}function searchAnimations(){standalone===!0?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function registerAnimation(t){return animationManager.registerAnimation(t)}function resize(){animationManager.resize()}function start(){animationManager.start()}function goToAndStop(t,e,s){animationManager.goToAndStop(t,e,s)}function setSubframeRendering(t){subframeEnabled=t}function loadAnimation(t){return standalone===!0&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function destroy(t){return animationManager.destroy(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&t>1&&(defaultCurveSegments=t);roundValues(defaultCurveSegments>=50?!1:!0)}function installPlugin(t,e){"expressions"===t&&(expressionsPlugin=e)}function getFactory(t){switch(t){case"propertyFactory":return PropertyFactory;case"shapePropertyFactory":return ShapePropertyFactory;case"matrix":return Matrix}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),s=0;s<e.length;s++){var r=e[s].split("=");if(decodeURIComponent(r[0])==t)return decodeURIComponent(r[1])}}var svgNS="http://www.w3.org/2000/svg",subframeEnabled=!0,expressionsPlugin,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,blitter=10,BMMath={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;s>t;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,r=Array.apply(null,{
+length:t.length}),i=t.length;for(s=0;i>s;s+=1)r[s]=Math.abs(t[s]);return r}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;roundValues(!1);var rgbToHex=function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+s[t]+s[e]+s[r]}}(),fillColorToString=function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),Matrix=function(){function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function s(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function r(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function a(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),r=Math.sin(e);return this._t(s,r,0,0,-r,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-r,0,0,r,s,0,0,0,0,1,0,0,0,0,1)}function h(t,e,s){return s=isNaN(s)?1:s,1==t&&1==e&&1==s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function l(t,e,s,r,i,a,n,o,h,l,p,m,f,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=r,this.props[4]=i,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=m,this.props[12]=f,this.props[13]=c,this.props[14]=d,this.props[15]=u,this}function p(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function m(t,e,s,r,i,a,n,o,h,l,p,m,f,c,d,u){if(1===t&&0===e&&0===s&&0===r&&0===i&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return(0!==f||0!==c||0!==d)&&(this.props[12]=this.props[12]*t+this.props[13]*i+this.props[14]*h+this.props[15]*f,this.props[13]=this.props[12]*e+this.props[13]*a+this.props[14]*l+this.props[15]*c,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*p+this.props[15]*d,this.props[15]=this.props[12]*r+this.props[13]*o+this.props[14]*m+this.props[15]*u),this._identityCalculated=!1,this;var y=this.props[0],g=this.props[1],v=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],x=this.props[6],S=this.props[7],C=this.props[8],k=this.props[9],M=this.props[10],A=this.props[11],D=this.props[12],w=this.props[13],T=this.props[14],F=this.props[15];return this.props[0]=y*t+g*i+v*h+b*f,this.props[1]=y*e+g*a+v*l+b*c,this.props[2]=y*s+g*n+v*p+b*d,this.props[3]=y*r+g*o+v*m+b*u,this.props[4]=E*t+P*i+x*h+S*f,this.props[5]=E*e+P*a+x*l+S*c,this.props[6]=E*s+P*n+x*p+S*d,this.props[7]=E*r+P*o+x*m+S*u,this.props[8]=C*t+k*i+M*h+A*f,this.props[9]=C*e+k*a+M*l+A*c,this.props[10]=C*s+k*n+M*p+A*d,this.props[11]=C*r+k*o+M*m+A*u,this.props[12]=D*t+w*i+T*h+F*f,this.props[13]=D*e+w*a+T*l+F*c,this.props[14]=D*s+w*n+T*p+F*d,this.props[15]=D*r+w*o+T*m+F*u,this._identityCalculated=!1,this}function f(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function c(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function d(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function u(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function y(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function g(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function v(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function b(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,r=-this.props[1]/e,i=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*i+n,t[0]*r+t[1]*a+o,0]}function E(t){var e,s=t.length,r=[];for(e=0;s>e;e+=1)r[e]=b(t[e]);return r}function P(t,e,s,r){if(r&&2===r){var i=point_pool.newPoint();return i[0]=t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],i[1]=t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],i}return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function x(t,e){return this.isIdentity()?t+","+e:bm_rnd(t*this.props[0]+e*this.props[4]+this.props[12])+","+bm_rnd(t*this.props[1]+e*this.props[5]+this.props[13])}function S(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function C(){return isSafari?"matrix3d("+roundTo2Decimals(this.props[0])+","+roundTo2Decimals(this.props[1])+","+roundTo2Decimals(this.props[2])+","+roundTo2Decimals(this.props[3])+","+roundTo2Decimals(this.props[4])+","+roundTo2Decimals(this.props[5])+","+roundTo2Decimals(this.props[6])+","+roundTo2Decimals(this.props[7])+","+roundTo2Decimals(this.props[8])+","+roundTo2Decimals(this.props[9])+","+roundTo2Decimals(this.props[10])+","+roundTo2Decimals(this.props[11])+","+roundTo2Decimals(this.props[12])+","+roundTo2Decimals(this.props[13])+","+roundTo2Decimals(this.props[14])+","+roundTo2Decimals(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function k(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function M(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=r,this.rotateZ=i,this.skew=n,this.skewFromAxis=o,this.shear=a,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=u,this.applyToX=y,this.applyToY=g,this.applyToZ=v,this.applyToPointArray=P,this.applyToPointStringified=x,this.toArray=S,this.toCSS=C,this.to2dCSS=k,this.toString=M,this.clone=c,this.cloneFromProps=d,this.inversePoints=E,this.inversePoint=b,this._t=this.transform,this.isIdentity=f,this._identity=!0,this._identityCalculated=!1,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}();!function(t,e){function s(s,l,p){var c=[];l=1==l?{entropy:!0}:l||{};var v=n(a(l.entropy?[s,h(t)]:null==s?o():s,3),c),b=new r(c),E=function(){for(var t=b.g(f),e=u,s=0;y>t;)t=(t+s)*m,e*=m,s=b.g(1);for(;t>=g;)t/=2,e/=2,s>>>=1;return(t+s)/e};return E.int32=function(){return 0|b.g(4)},E.quick=function(){return b.g(4)/4294967296},E["double"]=E,n(h(b.S),t),(l.pass||p||function(t,s,r,a){return a&&(a.S&&i(a,b),t.state=function(){return i(b,{})}),r?(e[d]=t,s):t})(E,v,"global"in l?l.global:this==e,l.state)}function r(t){var e,s=t.length,r=this,i=0,a=r.i=r.j=0,n=r.S=[];for(s||(t=[s++]);m>i;)n[i]=i++;for(i=0;m>i;i++)n[i]=n[a=v&a+t[i%s]+(e=n[i])],n[a]=e;(r.g=function(t){for(var e,s=0,i=r.i,a=r.j,n=r.S;t--;)e=n[i=v&i+1],s=s*m+n[v&(n[i]=n[a=v&a+e])+(n[a]=e)];return r.i=i,r.j=a,s})(m)}function i(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function a(t,e){var s,r=[],i=typeof t;if(e&&"object"==i)for(s in t)try{r.push(a(t[s],e-1))}catch(n){}return r.length?r:"string"==i?t:t+"\x00"}function n(t,e){for(var s,r=t+"",i=0;i<r.length;)e[v&i]=v&(s^=19*e[v&i])+r.charCodeAt(i++);return h(e)}function o(){try{if(l)return h(l.randomBytes(m));var e=new Uint8Array(m);return(p.crypto||p.msCrypto).getRandomValues(e),h(e)}catch(s){var r=p.navigator,i=r&&r.plugins;return[+new Date,p,i,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,c=52,d="random",u=e.pow(m,f),y=e.pow(2,c),g=2*y,v=m-1;e["seed"+d]=s,n(e.random(),t)}([],BMMath);var BezierFactory=function(){function t(t,e,s,r,i){var a=i||("bez_"+t+"_"+e+"_"+s+"_"+r).replace(/\./g,"p");if(p[a])return p[a];var n=new h([t,e,s,r]);return p[a]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function r(t){return 3*t}function i(t,i,a){return((e(i,a)*t+s(i,a))*t+r(i))*t}function a(t,i,a){return 3*e(i,a)*t*t+2*s(i,a)*t+r(i)}function n(t,e,s,r,a){var n,o,h=0;do o=e+(s-e)/2,n=i(o,r,a)-t,n>0?s=o:e=o;while(Math.abs(n)>c&&++h<d);return o}function o(t,e,s,r){for(var n=0;m>n;++n){var o=a(e,s,r);if(0===o)return e;var h=i(e,s,r)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=g?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var l={};l.getBezierEasing=t;var p={},m=4,f=.001,c=1e-7,d=10,u=11,y=1/(u-1),g="function"==typeof Float32Array;return h.prototype={get:function(t){var e=this._p[0],s=this._p[1],r=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===s&&r===a?t:0===t?0:1===t?1:i(this._getTForX(t),s,a)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],r=this._p[3];this._precomputed=!0,(t!==e||s!==r)&&this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;u>s;++s)this._mSampleValues[s]=i(s*y,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],r=this._mSampleValues,i=0,h=1,l=u-1;h!==l&&r[h]<=t;++h)i+=y;--h;var p=(t-r[h])/(r[h+1]-r[h]),m=i+p*y,c=a(m,e,s);return c>=f?o(t,m,e,s):0===c?m:n(t,i,i+y,e,s)}},l}(),MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var r=(new Date).getTime(),i=Math.max(0,16-(r-t)),a=window.setTimeout(function(){e(r+i)},i);return t=r+i,a}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var r=document.createElement("span");r.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(r),document.body.appendChild(s);var i=r.offsetWidth;return r.style.fontFamily=t+", "+e,{node:r,w:i,parent:s}}function e(){var t,s,r,i=this.fonts.length,a=i;for(t=0;i>t;t+=1)if(this.fonts[t].loaded)a-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,r=this.fonts[t].monoCase.w,s.offsetWidth!==r?(a-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,r=this.fonts[t].sansCase.w,s.offsetWidth!==r&&(a-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==a&&Date.now()-this.initTime<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(svgNS,"text");s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s);var r=document.createElement("canvas").getContext("2d");return r.font="100px "+e.fFamily,r}function r(r,i){if(!r)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=r.list);var a,n=r.list,o=n.length;for(a=0;o>a;a+=1){if(n[a].loaded=!1,n[a].monoCase=t(n[a].fFamily,"monospace"),n[a].sansCase=t(n[a].fFamily,"sans-serif"),n[a].fPath){if("p"===n[a].fOrigin||3===n[a].origin){var h=document.createElement("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[a].fFamily+"; font-style: normal; src: url('"+n[a].fPath+"');}",i.appendChild(h)}else if("g"===n[a].fOrigin||1===n[a].origin){var l=document.createElement("link");l.type="text/css",l.rel="stylesheet",l.href=n[a].fPath,i.appendChild(l)}else if("t"===n[a].fOrigin||2===n[a].origin){var p=document.createElement("script");p.setAttribute("src",n[a].fPath),i.appendChild(p)}}else n[a].loaded=!0;n[a].helper=s(i,n[a]),this.fonts.push(n[a])}e.bind(this)()}function i(t){if(t){this.chars||(this.chars=[]);var e,s,r,i=t.length,a=this.chars.length;for(e=0;i>e;e+=1){for(s=0,r=!1;a>s;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(r=!0),s+=1;r||(this.chars.push(t[e]),a+=1)}}}function a(t,e,s){for(var r=0,i=this.chars.length;i>r;){if(this.chars[r].ch===t&&this.chars[r].style===e&&this.chars[r].fFamily===s)return this.chars[r];r+=1}}function n(t,e,s){var r=this.getFontByName(e),i=r.helper;return i.measureText(t).width*s/100}function o(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var h=5e3,l=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return l.prototype.addChars=i,l.prototype.addFonts=r,l.prototype.getCharData=a,l.prototype.getFontByName=o,l.prototype.measureText=n,l}(),PropertyFactory=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(!(t===this.lastFrame||this.lastFrame!==l&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime))){for(var e,s,r=this.lastFrame<t?this._lastIndex:0,i=this.keyframes.length-1,a=!0;a;){if(e=this.keyframes[r],s=this.keyframes[r+1],r==i-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;i-1>r?r+=1:a=!1}this._lastIndex=r;var n,o,h,p,m,f;if(e.to){e.bezierData||bez.buildBezierData(e);var c=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var d=t>=s.t-this.offsetTime?c.points.length-1:0;for(o=c.points[d].point.length,n=0;o>n;n+=1)this.pv[n]=c.points[d].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);this._lastBezierData=null}else{e.__fnct?f=e.__fnct:(f=BezierFactory.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=f),h=f((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var u,y=c.segmentLength*h,g=this.lastFrame<t&&this._lastBezierData===c?this._lastAddedLength:0;for(m=this.lastFrame<t&&this._lastBezierData===c?this._lastPoint:0,a=!0,p=c.points.length;a;){if(g+=c.points[m].partialLength,0===y||0===h||m==c.points.length-1){for(o=c.points[m].point.length,n=0;o>n;n+=1)this.pv[n]=c.points[m].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}if(y>=g&&y<g+c.points[m+1].partialLength){for(u=(y-g)/c.points[m+1].partialLength,o=c.points[m].point.length,n=0;o>n;n+=1)this.pv[n]=c.points[m].point[n]+(c.points[m+1].point[n]-c.points[m].point[n])*u,this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}p-1>m?m+=1:a=!1}this._lastPoint=m,this._lastAddedLength=g-c.points[m].partialLength,this._lastBezierData=c}}else{var v,b,E,P,x;for(i=e.s.length,r=0;i>r;r+=1){if(1!==e.h&&(t>=s.t-this.offsetTime?h=1:t<e.t-this.offsetTime?h=0:(e.o.x instanceof Array?(e.__fnct||(e.__fnct=[]),e.__fnct[r]?f=e.__fnct[r]:(v=e.o.x[r]||e.o.x[0],b=e.o.y[r]||e.o.y[0],E=e.i.x[r]||e.i.x[0],P=e.i.y[r]||e.i.y[0],f=BezierFactory.getBezierEasing(v,b,E,P).get,e.__fnct[r]=f)):e.__fnct?f=e.__fnct:(v=e.o.x,b=e.o.y,E=e.i.x,P=e.i.y,f=BezierFactory.getBezierEasing(v,b,E,P).get,e.__fnct=f),h=f((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime))))),this.sh&&1!==e.h){var S=e.s[r],C=e.e[r];-180>S-C?S+=360:S-C>180&&(S-=360),x=S+(C-S)*h}else x=1===e.h?e.s[r]:e.s[r]+(e.e[r]-e.s[r])*h;1===i?(this.v=this.mult?x*this.mult:x,this.pv=x,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[r]=this.mult?x*this.mult:x,this.pv[r]=x,this.lastPValue[r]!==this.pv[r]&&(this.mdf=!0,this.lastPValue[r]=this.pv[r]))}}}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){}function s(t,s,r){this.mult=r,this.v=r?s.k*r:s.k,this.pv=s.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=e}function r(t,s,r){this.mult=r,this.data=s,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=Array.apply(null,{length:s.k.length}),this.pv=Array.apply(null,{length:s.k.length}),this.lastValue=Array.apply(null,{length:s.k.length});var i=Array.apply(null,{length:s.k.length});this.vel=i.map(function(){return 0});var a,n=s.k.length;for(a=0;n>a;a+=1)this.v[a]=r?s.k[a]*r:s.k[a],this.pv[a]=s.k[a];this.getValue=e}function i(e,s,r){this.keyframes=s.k,this.offsetTime=e.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this._lastIndex=0,this.k=!0,this.kf=!0,this.data=s,this.mult=r,this.elem=e,this.comp=e.comp,this.lastFrame=l,this.v=r?s.k[0].s[0]*r:s.k[0].s[0],this.pv=s.k[0].s[0],this.getValue=t}function a(e,s,r){var i,a,n,o,h,p=s.k.length;for(i=0;p-1>i;i+=1)s.k[i].to&&s.k[i].s&&s.k[i].e&&(a=s.k[i].s,n=s.k[i].e,o=s.k[i].to,h=s.k[i].ti,(2===a.length&&(a[0]!==n[0]||a[1]!==n[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])||3===a.length&&(a[0]!==n[0]||a[1]!==n[1]||a[2]!==n[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],a[0]+o[0],a[1]+o[1],a[2]+o[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],n[0]+h[0],n[1]+h[1],n[2]+h[2]))&&(s.k[i].to=null,s.k[i].ti=null));this.keyframes=s.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this.mult=r,this.elem=e,this.comp=e.comp,this.getValue=t,this.frameId=-1,this._lastIndex=0,this.v=Array.apply(null,{length:s.k[0].s.length}),this.pv=Array.apply(null,{length:s.k[0].s.length}),this.lastValue=Array.apply(null,{length:s.k[0].s.length}),this.lastPValue=Array.apply(null,{length:s.k[0].s.length}),this.lastFrame=l}function n(t,e,n,o,h){var l;if(2===n)l=new p(t,e,h);else if(0===e.a)l=0===n?new s(t,e,o):new r(t,e,o);else if(1===e.a)l=0===n?new i(t,e,o):new a(t,e,o);else if(e.k.length)if("number"==typeof e.k[0])l=new r(t,e,o);else switch(n){case 0:l=new i(t,e,o);break;case 1:l=new a(t,e,o)}else l=new s(t,e,o);return l.k&&h.push(l),l}function o(t,e,s,r){return new f(t,e,s,r)}function h(t,e,s){return new c(t,e,s)}var l=-999999,p=function(){function t(){return this.p?ExpressionValue(this.p):[this.px.v,this.py.v,this.pz?this.pz.v:0]}function e(){return ExpressionValue(this.px)}function s(){return ExpressionValue(this.py)}function r(){return ExpressionValue(this.a)}function i(){return ExpressionValue(this.or)}function a(){return this.r?ExpressionValue(this.r,1/degToRads):ExpressionValue(this.rz,1/degToRads)}function n(){return ExpressionValue(this.s,100)}function o(){return ExpressionValue(this.o,100)}function h(){return ExpressionValue(this.sk)}function l(){return ExpressionValue(this.sa)}function p(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function m(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,r;this.p.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/this.elem.globalData.frameRate,0),r=this.p.getValueAtTime(this.p.keyframes[0].t/this.elem.globalData.frameRate,0)):this.p.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/this.elem.globalData.frameRate,0),r=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/this.elem.globalData.frameRate,0)):(s=this.p.pv,r=this.p.getValueAtTime((this.p.lastFrame+this.p.offsetTime-.01)/this.elem.globalData.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-r[1],s[0]-r[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function f(){this.inverted=!0,this.iv=new Matrix,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function c(){}return function(d,u,y){this.elem=d,this.frameId=-1,this.type="transform",this.dynamicProperties=[],this.mdf=!1,this.data=u,this.getValue=m,this.applyToMatrix=p,this.setInverted=f,this.autoOrient=c,this.v=new Matrix,u.p.s?(this.px=PropertyFactory.getProp(d,u.p.x,0,0,this.dynamicProperties),this.py=PropertyFactory.getProp(d,u.p.y,0,0,this.dynamicProperties),u.p.z&&(this.pz=PropertyFactory.getProp(d,u.p.z,0,0,this.dynamicProperties))):this.p=PropertyFactory.getProp(d,u.p,1,0,this.dynamicProperties),u.r?this.r=PropertyFactory.getProp(d,u.r,0,degToRads,this.dynamicProperties):u.rx&&(this.rx=PropertyFactory.getProp(d,u.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(d,u.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(d,u.rz,0,degToRads,this.dynamicProperties),this.or=PropertyFactory.getProp(d,u.or,1,degToRads,this.dynamicProperties)),u.sk&&(this.sk=PropertyFactory.getProp(d,u.sk,0,degToRads,this.dynamicProperties),this.sa=PropertyFactory.getProp(d,u.sa,0,degToRads,this.dynamicProperties)),u.a&&(this.a=PropertyFactory.getProp(d,u.a,1,0,this.dynamicProperties)),u.s&&(this.s=PropertyFactory.getProp(d,u.s,1,.01,this.dynamicProperties)),this.o=u.o?PropertyFactory.getProp(d,u.o,0,.01,y):{mdf:!1,v:1},this.dynamicProperties.length?y.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?u.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"xPosition",{get:e}),Object.defineProperty(this,"yPosition",{get:s}),Object.defineProperty(this,"orientation",{get:i}),Object.defineProperty(this,"anchorPoint",{get:r}),Object.defineProperty(this,"rotation",{get:a}),Object.defineProperty(this,"scale",{get:n}),Object.defineProperty(this,"opacity",{get:o}),Object.defineProperty(this,"skew",{get:h}),Object.defineProperty(this,"skewAxis",{get:l})}}(),m=function(){function t(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,r,i=4*this.data.p;for(e=0;i>e;e+=1)s=e%4===0?100:255,r=Math.round(this.prop.v[e]*s),this.c[e]!==r&&(this.c[e]=r,this.cmdf=!0);if(this.o.length)for(i=this.prop.v.length,e=4*this.data.p;i>e;e+=1)s=e%2===0?100:1,r=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==r&&(this.o[e-4*this.data.p]=r,this.omdf=!0)}}function e(e,s,r){this.prop=n(e,s.k,1,null,[]),this.data=s,this.k=this.prop.k,this.c=Array.apply(null,{length:4*s.p});var i=s.k.k[0].s?s.k.k[0].s.length-4*s.p:s.k.k.length-4*s.p;this.o=Array.apply(null,{length:i}),this.cmdf=!1,this.omdf=!1,this.getValue=t,this.prop.k&&r.push(this),this.getValue(!0)}return function(t,s,r){return new e(t,s,r)}}(),f=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,r,i){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=r,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var a,n,o=s.length;for(a=0;o>a;a+=1)n=PropertyFactory.getProp(e,s[a].v,0,0,i),this.k=n.k?!0:this.k,this.dataProps[a]={n:s[a].n,p:n};this.getValue=t,this.k?i.push(this):this.getValue(!0)}}(),c=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0)}var s=this.data.totalChars,r=2===this.data.r?1:100/s,i=this.o.v/r,a=this.s.v/r+i,n=this.e.v/r+i;if(a>n){var o=a;a=n,n=o}this.finalS=a,this.finalE=n}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,a=0,n=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)a=o===n?t>=o?1:0:s(0,r(.5/(o-n)+(t-n)/(o-n),1)),a=e(a);else if(3==h)a=o===n?t>=o?0:1:1-s(0,r(.5/(o-n)+(t-n)/(o-n),1)),a=e(a);else if(4==h)o===n?a=0:(a=s(0,r(.5/(o-n)+(t-n)/(o-n),1)),.5>a?a*=2:a=1-2*(a-.5)),a=e(a);else if(5==h){if(o===n)a=0;else{var l=o-n;t=r(s(0,t+.5-n),o-n);var p=-l/2+t,m=l/2;a=Math.sqrt(1-p*p/(m*m))}a=e(a)}else 6==h?(o===n?a=0:(t=r(s(0,t+.5-n),o-n),a=(1+Math.cos(Math.PI+2*Math.PI*t/(o-n)))/2),a=e(a)):(t>=i(n)&&(a=0>t-n?1-(n-t):s(0,r(o-t,1))),a=e(a));return a*this.a.v}var s=Math.max,r=Math.min,i=Math.floor;return function(s,r,i){this.mdf=!1,this.k=!1,this.data=r,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=PropertyFactory.getProp(s,r.s||{k:0},0,0,this.dynamicProperties),this.e="e"in r?PropertyFactory.getProp(s,r.e,0,0,this.dynamicProperties):{v:2===r.r?r.totalChars:100},this.o=PropertyFactory.getProp(s,r.o||{k:0},0,0,this.dynamicProperties),this.xe=PropertyFactory.getProp(s,r.xe||{k:0},0,0,this.dynamicProperties),this.ne=PropertyFactory.getProp(s,r.ne||{k:0},0,0,this.dynamicProperties),this.a=PropertyFactory.getProp(s,r.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?i.push(this):this.getValue()}}(),d={};return d.getProp=n,d.getDashProp=o,d.getTextSelectorProp=h,d.getGradientProp=m,d}();ShapePath.prototype.setPathData=function(t,e){for(this.c=t;e>this._maxLength;)this.doubleArrayLength();for(var s=0;e>s;)this.v[s]=point_pool.newPoint(),this.o[s]=point_pool.newPoint(),this.i[s]=point_pool.newPoint(),s+=1;this._length=e},ShapePath.prototype.doubleArrayLength=function(){this.v=this.v.concat(Array.apply(null,{length:this._maxLength})),this.i=this.i.concat(Array.apply(null,{length:this._maxLength})),this.o=this.o.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2},ShapePath.prototype.setXYAt=function(t,e,s,r,i){var a;switch(this._length=Math.max(this._length,r+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}(!a[r]||a[r]&&!i)&&(a[r]=point_pool.newPoint()),a[r][0]=t,a[r][1]=e},ShapePath.prototype.setTripleAt=function(t,e,s,r,i,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(s,r,"o",n,o),this.setXYAt(i,a,"i",n,o)};var ShapePropertyFactory=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame===n||!(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)){var e,s,r;if(t<this.keyframes[0].t-this.offsetTime)e=this.keyframes[0].s[0],r=!0,this._lastIndex=0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],r=!0;else{for(var i,a,o,h,l,p,m=this.lastFrame<n?this._lastIndex:0,f=this.keyframes.length-1,c=!0;c&&(i=this.keyframes[m],a=this.keyframes[m+1],!(a.t-this.offsetTime>t));)f-1>m?m+=1:c=!1;r=1===i.h,this._lastIndex=m;var d;if(!r){if(t>=a.t-this.offsetTime)d=1;else if(t<i.t-this.offsetTime)d=0;else{var u;i.__fnct?u=i.__fnct:(u=BezierFactory.getBezierEasing(i.o.x,i.o.y,i.i.x,i.i.y).get,i.__fnct=u),d=u((t-(i.t-this.offsetTime))/(a.t-this.offsetTime-(i.t-this.offsetTime)))}s=i.e[0]}e=i.s[0]}h=this.v._length,p=e.i[0].length;var y,g=!1;for(o=0;h>o;o+=1)for(l=0;p>l;l+=1)r?(y=e.i[o][l],this.v.i[o][l]!==y&&(this.v.i[o][l]=y,this.pv.i[o][l]=y,g=!0),y=e.o[o][l],this.v.o[o][l]!==y&&(this.v.o[o][l]=y,this.pv.o[o][l]=y,g=!0),y=e.v[o][l],this.v.v[o][l]!==y&&(this.v.v[o][l]=y,this.pv.v[o][l]=y,g=!0)):(y=e.i[o][l]+(s.i[o][l]-e.i[o][l])*d,this.v.i[o][l]!==y&&(this.v.i[o][l]=y,this.pv.i[o][l]=y,g=!0),y=e.o[o][l]+(s.o[o][l]-e.o[o][l])*d,this.v.o[o][l]!==y&&(this.v.o[o][l]=y,this.pv.o[o][l]=y,g=!0),y=e.v[o][l]+(s.v[o][l]-e.v[o][l])*d,this.v.v[o][l]!==y&&(this.v.v[o][l]=y,this.pv.v[o][l]=y,g=!0));this.mdf=g,this.v.c=e.c,this.paths=this.localShapeCollection}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){return this.v}function s(){this.paths=this.localShapeCollection,this.k||(this.mdf=!1)}function r(t,r,i){this.comp=t.comp,this.k=!1,this.mdf=!1,this.v=shape_pool.newShape();var a=3===i?r.pt.k:r.ks.k;this.v.v=a.v,this.v.i=a.i,this.v.o=a.o,this.v.c=a.c,this.v._length=this.v.v.length,this.getValue=e,this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s}function i(e,r,i){
+this.comp=e.comp,this.elem=e,this.offsetTime=e.data.st,this._lastIndex=0,this.getValue=t,this.keyframes=3===i?r.pt.k:r.ks.k,this.k=!0,this.kf=!0;{var a=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length}this.v=shape_pool.newShape(),this.v.setPathData(this.keyframes[0].s[0].c,a),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=n,this.reset=s}function a(t,e,s,a){var n;if(3===s||4===s){var p=3===s?e.pt:e.ks,m=p.k;n=1===p.a||m.length?new i(t,e,s):new r(t,e,s)}else 5===s?n=new l(t,e):6===s?n=new o(t,e):7===s&&(n=new h(t,e));return n.k&&a.push(n),n}var n=-999999,o=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2;3!==this.d?(this.v.v[0][0]=t,this.v.v[0][1]=e-i,this.v.v[1][0]=t+s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+i,this.v.v[3][0]=t-s,this.v.v[3][1]=e,this.v.i[0][0]=t-s*r,this.v.i[0][1]=e-i,this.v.i[1][0]=t+s,this.v.i[1][1]=e-i*r,this.v.i[2][0]=t+s*r,this.v.i[2][1]=e+i,this.v.i[3][0]=t-s,this.v.i[3][1]=e+i*r,this.v.o[0][0]=t+s*r,this.v.o[0][1]=e-i,this.v.o[1][0]=t+s,this.v.o[1][1]=e+i*r,this.v.o[2][0]=t-s*r,this.v.o[2][1]=e+i,this.v.o[3][0]=t-s,this.v.o[3][1]=e-i*r):(this.v.v[0][0]=t,this.v.v[0][1]=e-i,this.v.v[1][0]=t-s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+i,this.v.v[3][0]=t+s,this.v.v[3][1]=e,this.v.i[0][0]=t+s*r,this.v.i[0][1]=e-i,this.v.i[1][0]=t-s,this.v.i[1][1]=e-i*r,this.v.i[2][0]=t-s*r,this.v.i[2][1]=e+i,this.v.i[3][0]=t+s,this.v.i[3][1]=e+i*r,this.v.o[0][0]=t-s*r,this.v.o[0][1]=e-i,this.v.o[1][0]=t-s,this.v.o[1][1]=e+i*r,this.v.o[2][0]=t+s*r,this.v.o[2][1]=e+i,this.v.o[3][0]=t+s,this.v.o[3][1]=e-i*r)}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var r=roundCorner;return function(r,i){this.v=shape_pool.newShape(),this.v.setPathData(!0,4),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=i.d,this.dynamicProperties=[],this.elem=r,this.comp=r.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=PropertyFactory.getProp(r,i.p,1,0,this.dynamicProperties),this.s=PropertyFactory.getProp(r,i.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),h=function(){function t(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,r=this.or.v,i=this.os.v,a=2*Math.PI*r/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;e>t;t+=1){var h=r*Math.cos(n),l=r*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),m=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.setTripleAt(h,l,h-p*a*i*o,l-m*a*i*o,h+p*a*i*o,l+m*a*i*o,t,!0),n+=s*o}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,s,r,i=2*Math.floor(this.pt.v),a=2*Math.PI/i,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*i),f=2*Math.PI*h/(2*i),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(this.v._length=0,t=0;i>t;t+=1){e=n?o:h,s=n?l:p,r=n?m:f;var u=e*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.setTripleAt(u,y,u-g*r*s*d,y-v*r*s*d,u+g*r*s*d,y+v*r*s*d,t,!0),n=!n,c+=a*d}}function r(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(i,a){this.v=shape_pool.newShape(),this.v.setPathData(!0,0),this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=r,this.reset=s,1===a.sy?(this.ir=PropertyFactory.getProp(i,a.ir,0,0,this.dynamicProperties),this.is=PropertyFactory.getProp(i,a.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=PropertyFactory.getProp(i,a.pt,0,0,this.dynamicProperties),this.p=PropertyFactory.getProp(i,a.p,1,0,this.dynamicProperties),this.r=PropertyFactory.getProp(i,a.r,0,degToRads,this.dynamicProperties),this.or=PropertyFactory.getProp(i,a.or,0,0,this.dynamicProperties),this.os=PropertyFactory.getProp(i,a.os,0,.01,this.dynamicProperties),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),l=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,r=this.s.v[1]/2,i=bm_min(s,r,this.r.v),a=i*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+s,e-r+i,t+s,e-r+i,t+s,e-r+a,0,!0),this.v.setTripleAt(t+s,e+r-i,t+s,e+r-a,t+s,e+r-i,1,!0),0!==i?(this.v.setTripleAt(t+s-i,e+r,t+s-i,e+r,t+s-a,e+r,2,!0),this.v.setTripleAt(t-s+i,e+r,t-s+a,e+r,t-s+i,e+r,3,!0),this.v.setTripleAt(t-s,e+r-i,t-s,e+r-i,t-s,e+r-a,4,!0),this.v.setTripleAt(t-s,e-r+i,t-s,e-r+a,t-s,e-r+i,5,!0),this.v.setTripleAt(t-s+i,e-r,t-s+i,e-r,t-s+a,e-r,6,!0),this.v.setTripleAt(t+s-i,e-r,t+s-a,e-r,t+s-i,e-r,7,!0)):(this.v.setTripleAt(t-s,e+r,t-s+a,e+r,t-s,e+r,2),this.v.setTripleAt(t-s,e-r,t-s,e-r+a,t-s,e-r,3))):(this.v.setTripleAt(t+s,e-r+i,t+s,e-r+a,t+s,e-r+i,0,!0),0!==i?(this.v.setTripleAt(t+s-i,e-r,t+s-i,e-r,t+s-a,e-r,1,!0),this.v.setTripleAt(t-s+i,e-r,t-s+a,e-r,t-s+i,e-r,2,!0),this.v.setTripleAt(t-s,e-r+i,t-s,e-r+i,t-s,e-r+a,3,!0),this.v.setTripleAt(t-s,e+r-i,t-s,e+r-a,t-s,e+r-i,4,!0),this.v.setTripleAt(t-s+i,e+r,t-s+i,e+r,t-s+a,e+r,5,!0),this.v.setTripleAt(t+s-i,e+r,t+s-a,e+r,t+s-i,e+r,6,!0),this.v.setTripleAt(t+s,e+r-i,t+s,e+r-i,t+s,e+r-a,7,!0)):(this.v.setTripleAt(t-s,e-r,t-s+a,e-r,t-s,e-r,1,!0),this.v.setTripleAt(t-s,e+r,t-s,e+r-a,t-s,e+r,2,!0),this.v.setTripleAt(t+s,e+r,t+s-a,e+r,t+s,e+r,3,!0)))}return function(r,i){this.v=shape_pool.newShape(),this.v.c=!0,this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=r,this.comp=r.comp,this.frameId=-1,this.d=i.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=PropertyFactory.getProp(r,i.p,1,0,this.dynamicProperties),this.s=PropertyFactory.getProp(r,i.s,1,0,this.dynamicProperties),this.r=PropertyFactory.getProp(r,i.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),p={};return p.getShapeProp=a,p}(),ShapeModifiers=function(){function t(t,e){r[t]||(r[t]=e)}function e(t,e,s,i){return new r[t](e,s,i)}var s={},r={};return s.registerModifier=t,s.getModifier=e,s}();ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(t){this.closed||(this.shapes.push({shape:t.sh,data:t,localShapeCollection:shapeCollection_pool.newShapeCollection()}),this.addShapeToModifier(t.sh))},ShapeModifier.prototype.init=function(t,e,s){this.elem=t,this.frameId=-1,this.shapes=[],this.dynamicProperties=[],this.mdf=!1,this.closed=!1,this.k=!1,this.isTrimming=!1,this.comp=t.comp,this.initModifierProperties(t,e),this.dynamicProperties.length?(this.k=!0,s.push(this)):this.getValue(!0)},extendPrototype(ShapeModifier,TrimModifier),TrimModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var r=this.o.v%360/360;0>r&&(r+=1);var i=this.s.v+r,a=this.e.v+r;if(i>a){var n=i;i=a,a=n}this.sValue=i,this.eValue=a,this.oValue=r}}},TrimModifier.prototype.initModifierProperties=function(t,e){this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.s=PropertyFactory.getProp(t,e.s,0,.01,this.dynamicProperties),this.e=PropertyFactory.getProp(t,e.e,0,.01,this.dynamicProperties),this.o=PropertyFactory.getProp(t,e.o,0,0,this.dynamicProperties),this.m=e.m,this.dynamicProperties.length||this.getValue(!0)},TrimModifier.prototype.getSegmentsLength=function(t){var e,s=t.c,r=t.v,i=t.o,a=t.i,n=t._length,o=[],h=0;for(e=0;n-1>e;e+=1)o[e]=bez.getBezierLength(r[e],r[e+1],i[e],a[e+1]),h+=o[e].addedLength;return s&&(o[e]=bez.getBezierLength(r[e],r[0],i[e],a[0]),h+=o[e].addedLength),{lengths:o,totalLength:h}},TrimModifier.prototype.calculateShapeEdges=function(t,e,s,r,i){var a=[];1>=e?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],l=a.length;for(n=0;l>n;n+=1)if(o=a[n],o.e*i<r||o.s*i>r+s);else{var p,m;p=o.s*i<=r?0:(o.s*i-r)/s,m=o.e*i>=r+s?1:(o.e*i-r)/s,h.push([p,m])}return h.length||h.push([0,0]),h},TrimModifier.prototype.processShapes=function(t){var e,s,r,i,a,n,o,h=this.shapes.length,l=this.sValue,p=this.eValue,m=0;if(p===l)for(s=0;h>s;s+=1)this.shapes[s].localShapeCollection.releaseShapes(),this.shapes[s].shape.mdf=!0,this.shapes[s].shape.paths=this.shapes[s].localShapeCollection;else if(1===p&&0===l||0===p&&1===l){if(this.mdf)for(s=0;h>s;s+=1)this.shapes[s].shape.mdf=!0}else{var f,c,d=[];for(s=0;h>s;s+=1)if(f=this.shapes[s],f.shape.mdf||this.mdf||t||2===this.m){if(e=f.shape.paths,i=e._length,o=0,!f.shape.mdf&&f.pathsData)o=f.totalShapeLength;else{for(a=[],r=0;i>r;r+=1)n=this.getSegmentsLength(e.shapes[r]),a.push(n),o+=n.totalLength;f.totalShapeLength=o,f.pathsData=a}m+=o,f.shape.mdf=!0}else f.shape.paths=f.localShapeCollection;var r,i,u=l,y=p,g=0;for(s=h-1;s>=0;s-=1)if(f=this.shapes[s],f.shape.mdf){if(c=f.localShapeCollection,c.releaseShapes(),2===this.m&&h>1){var v=this.calculateShapeEdges(l,p,f.totalShapeLength,g,m);g+=f.totalShapeLength}else v=[[u,y]];for(i=v.length,r=0;i>r;r+=1){u=v[r][0],y=v[r][1],d.length=0,1>=y?d.push({s:f.totalShapeLength*u,e:f.totalShapeLength*y}):u>=1?d.push({s:f.totalShapeLength*(u-1),e:f.totalShapeLength*(y-1)}):(d.push({s:f.totalShapeLength*u,e:f.totalShapeLength}),d.push({s:0,e:f.totalShapeLength*(y-1)}));var b=this.addShapes(f,d[0]);if(d[0].s!==d[0].e){if(d.length>1)if(f.shape.v.c){var E=b.pop();this.addPaths(b,c),b=this.addShapes(f,d[1],E)}else this.addPaths(b,c),b=this.addShapes(f,d[1]);this.addPaths(b,c)}}f.shape.paths=c}}this.dynamicProperties.length||(this.mdf=!1)},TrimModifier.prototype.addPaths=function(t,e){var s,r=t.length;for(s=0;r>s;s+=1)e.addShape(t[s])},TrimModifier.prototype.addSegment=function(t,e,s,r,i,a,n){i.setXYAt(e[0],e[1],"o",a),i.setXYAt(s[0],s[1],"i",a+1),n&&i.setXYAt(t[0],t[1],"v",a),i.setXYAt(r[0],r[1],"v",a+1)},TrimModifier.prototype.addShapes=function(t,e,s){var r,i,a,n,o,h,l,p,m=t.pathsData,f=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(s?(o=s._length,p=s._length):(s=shape_pool.newShape(),o=0,p=0),u.push(s),r=0;c>r;r+=1){for(h=m[r].lengths,s.c=f[r].c,a=f[r].c?h.length:h.length+1,i=1;a>i;i+=1)if(n=h[i-1],d+n.addedLength<e.s)d+=n.addedLength,s.c=!1;else{if(d>e.e){s.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(f[r].v[i-1],f[r].o[i-1],f[r].i[i],f[r].v[i],s,o,y),y=!1):(l=bez.getNewSegment(f[r].v[i-1],f[r].v[i],f[r].o[i-1],f[r].i[i],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[i-1]),this.addSegment(l.pt1,l.pt3,l.pt4,l.pt2,s,o,y),y=!1,s.c=!1),d+=n.addedLength,o+=1}if(f[r].c){if(n=h[i-1],d<=e.e){var g=h[i-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(f[r].v[i-1],f[r].o[i-1],f[r].i[0],f[r].v[0],s,o,y),y=!1):(l=bez.getNewSegment(f[r].v[i-1],f[r].v[0],f[r].o[i-1],f[r].i[0],(e.s-d)/g,(e.e-d)/g,h[i-1]),this.addSegment(l.pt1,l.pt3,l.pt4,l.pt2,s,o,y),y=!1,s.c=!1)}else s.c=!1;d+=n.addedLength,o+=1}if(s._length&&(s.setXYAt(s.v[p][0],s.v[p][1],"i",p),s.setXYAt(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),d>e.e)break;c-1>r&&(s=shape_pool.newShape(),y=!0,u.push(s),o=0)}return u},ShapeModifiers.registerModifier("tm",TrimModifier),extendPrototype(ShapeModifier,RoundCornersModifier),RoundCornersModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},RoundCornersModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(t,e.r,0,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},RoundCornersModifier.prototype.processPath=function(t,e){var s=shape_pool.newShape();s.c=t.c;var r,i,a,n,o,h,l,p,m,f,c,d,u,y=t._length,g=0;for(r=0;y>r;r+=1)i=t.v[r],n=t.o[r],a=t.i[r],i[0]===n[0]&&i[1]===n[1]&&i[0]===a[0]&&i[1]===a[1]?0!==r&&r!==y-1||t.c?(o=0===r?t.v[y-1]:t.v[r-1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=d=i[0]+(o[0]-i[0])*l,m=u=i[1]-(i[1]-o[1])*l,f=p-(p-i[0])*roundCorner,c=m-(m-i[1])*roundCorner,s.setTripleAt(p,m,f,c,d,u,g),g+=1,o=r===y-1?t.v[0]:t.v[r+1],h=Math.sqrt(Math.pow(i[0]-o[0],2)+Math.pow(i[1]-o[1],2)),l=h?Math.min(h/2,e)/h:0,p=f=i[0]+(o[0]-i[0])*l,m=c=i[1]+(o[1]-i[1])*l,d=p-(p-i[0])*roundCorner,u=m-(m-i[1])*roundCorner,s.setTripleAt(p,m,f,c,d,u,g),g+=1):(s.setTripleAt(i[0],i[1],n[0],n[1],a[0],a[1],g),g+=1):(s.setTripleAt(t.v[r][0],t.v[r][1],t.o[r][0],t.o[r][1],t.i[r][0],t.i[r][1],g),g+=1);return s},RoundCornersModifier.prototype.processShapes=function(t){var e,s,r,i,a=this.shapes.length,n=this.rd.v;if(0!==n){var o,h,l;for(s=0;a>s;s+=1){if(o=this.shapes[s],h=o.shape.paths,l=o.localShapeCollection,o.shape.mdf||this.mdf||t)for(l.releaseShapes(),o.shape.mdf=!0,e=o.shape.paths.shapes,i=o.shape.paths._length,r=0;i>r;r+=1)l.addShape(this.processPath(e[r],n));o.shape.paths=o.localShapeCollection}}this.dynamicProperties.length||(this.mdf=!1)},ShapeModifiers.registerModifier("rd",RoundCornersModifier),extendPrototype(ShapeModifier,RepeaterModifier),RepeaterModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},RepeaterModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(t,e.c,0,null,this.dynamicProperties),this.o=PropertyFactory.getProp(t,e.o,0,null,this.dynamicProperties),this.tr=PropertyFactory.getProp(t,e.tr,2,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0),this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(t,e,s,r,i,a){var n=a?-1:1,o=r.s.v[0]+(1-r.s.v[0])*(1-i),h=r.s.v[1]+(1-r.s.v[1])*(1-i);t.translate(r.p.v[0]*n*i,r.p.v[1]*n*i,r.p.v[2]),e.translate(-r.a.v[0],-r.a.v[1],r.a.v[2]),e.rotate(-r.r.v*n*i),e.translate(r.a.v[0],r.a.v[1],r.a.v[2]),s.translate(-r.a.v[0],-r.a.v[1],r.a.v[2]),s.scale(a?1/o:o,a?1/h:h),s.translate(r.a.v[0],r.a.v[1],r.a.v[2])},RepeaterModifier.prototype.processShapes=function(t){this.dynamicProperties.length||(this.mdf=!1);var e,s,r,i,a,n,o,h,l,p,m,f,c,d,u=this.shapes.length,y=Math.ceil(this.c.v),g=this.o.v,v=g%1,b=g>0?Math.floor(g):Math.ceil(g),E=(this.tr.v.props,this.pMatrix.props),P=this.rMatrix.props,x=this.sMatrix.props,S=0;for(e=0;u>e;e+=1){if(i=this.shapes[e],a=i.localShapeCollection,i.shape.mdf||this.mdf||t){if(a.releaseShapes(),i.shape.mdf=!0,h=i.shape.paths,l=h.shapes,r=h._length,S=0,this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset(),g>0){for(;b>S;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),S+=1;v&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,v,!1),S+=v)}else if(0>b){for(;S>b;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),S-=1;v&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-v,!0),S-=v)}for(s=0;r>s;s+=1)for(n=l[s],o=0;y>o;o+=1){if(0!==o&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),i.data.transformers){for(i.data.lvl=0,d=0,m=i.data.elements.length,p=0;m>p;p+=1)d=Math.max(d,i.data.elements[p].st.lvl);for(c=i.data.transformers,m=c.length,p=m-1;p>=d;p-=1)f=c[p].mProps.v.props,this.matrix.transform(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9],f[10],f[11],f[12],f[13],f[14],f[15])}0!==S&&(this.matrix.transform(P[0],P[1],P[2],P[3],P[4],P[5],P[6],P[7],P[8],P[9],P[10],P[11],P[12],P[13],P[14],P[15]),this.matrix.transform(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9],x[10],x[11],x[12],x[13],x[14],x[15]),this.matrix.transform(E[0],E[1],E[2],E[3],E[4],E[5],E[6],E[7],E[8],E[9],E[10],E[11],E[12],E[13],E[14],E[15])),a.addShape(this.processPath(n,this.matrix)),this.matrix.reset(),S+=1}}i.shape.paths=a}},RepeaterModifier.prototype.processPath=function(t,e){var s=shape_pool.clone(t,e);return s},ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeCollection.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},ShapeCollection.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0};var ImagePreloader=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages}function e(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=document.createElement("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function r(t){this.totalAssets=t.length;var r;for(r=0;r<this.totalAssets;r+=1)t[r].layers||(s.bind(this)(e.bind(this)(t[r])),this.totalImages+=1)}function i(t){this.path=t||""}function a(t){this.assetsPath=t||""}return function(){this.loadAssets=r,this.setAssetsPath=a,this.setPath=i,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0}}(),featureSupport=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),filtersFactory=function(){function t(t){var e=document.createElementNS(svgNS,"filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=document.createElementNS(svgNS,"feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 0 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}(),pooling=function(){function t(t){return t.concat(Array.apply(null,{length:t.length}))}return{"double":t}}(),point_pool=function(){function t(){var t;return r?(r-=1,t=a[r]):t=[.1,.1],t}function e(t){r===i&&(a=pooling["double"](a),i=2*i),a[r]=t,r+=1}var s={newPoint:t,release:e},r=0,i=8,a=Array.apply(null,{length:i});return s}(),shape_pool=function(){function t(){var t;return a?(a-=1,t=o[a]):t=new ShapePath,t}function e(t){a===n&&(o=pooling["double"](o),n=2*n);var e,s=t._length;for(e=0;s>e;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1,o[a]=t,a+=1}function s(t,s){for(;s--;)e(t[s])}function r(e,s){var r,i=e._length,a=t();a._length=e._length,a.c=e.c;var n;for(r=0;i>r;r+=1)s?(n=s.applyToPointArray(e.v[r][0],e.v[r][1],0,2),a.setXYAt(n[0],n[1],"v",r),point_pool.release(n),n=s.applyToPointArray(e.o[r][0],e.o[r][1],0,2),a.setXYAt(n[0],n[1],"o",r),point_pool.release(n),n=s.applyToPointArray(e.i[r][0],e.i[r][1],0,2),a.setXYAt(n[0],n[1],"i",r),point_pool.release(n)):a.setTripleAt(e.v[r][0],e.v[r][1],e.o[r][0],e.o[r][1],e.i[r][0],e.i[r][1],r);return a}var i={clone:r,newShape:t,release:e,releaseArray:s},a=0,n=4,o=Array.apply(null,{length:n});return i}(),shapeCollection_pool=function(){function t(){var t;return i?(i-=1,t=n[i]):t=new ShapeCollection,t}function e(t){var e,s=t._length;for(e=0;s>e;e+=1)shape_pool.release(t.shapes[e]);t._length=0,i===a&&(n=pooling["double"](n),a=2*a),n[i]=t,i+=1}function s(t,s){e(t),i===a&&(n=pooling["double"](n),a=2*a),n[i]=t,i+=1}var r={newShapeCollection:t,release:e,clone:s},i=0,a=4,n=Array.apply(null,{length:a});return r}();BaseRenderer.prototype.checkLayers=function(t){var e,s,r=this.layers.length;for(this.completeLayers=!0,e=r-1;e>=0;e--)this.elements[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;e>t;t+=1)this.buildItem(t);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,r=t.length,i=this.layers.length;for(e=0;r>e;e+=1)for(s=0;i>s;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},BaseRenderer.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(t,e,s){s=s||[];for(var r=this.elements,i=this.layers,a=0,n=i.length;n>a;)i[a].ind==e&&(r[a]&&r[a]!==!0?void 0!==i[a].parent?(s.push(r[a]),r[a]._isParent=!0,this.buildElementParenting(t,i[a].parent,s)):(s.push(r[a]),r[a]._isParent=!0,t.setHierarchy(s)):(this.buildItem(a),this.addPendingElement(t))),a+=1},BaseRenderer.prototype.addPendingElement=function(t){this.pendingElements.push(t)},extendPrototype(BaseRenderer,SVGRenderer),SVGRenderer.prototype.createBase=function(t){return new SVGBaseElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createShape=function(t){return new IShapeElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createText=function(t){return new SVGTextElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createImage=function(t){return new IImageElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createComp=function(t){return new ICompElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createSolid=function(t){return new ISolidElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.configAnimation=function(t){this.layerElement=document.createElementNS(svgNS,"svg"),this.layerElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.layerElement.setAttribute("width",t.w),this.layerElement.setAttribute("height",t.h),this.layerElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.layerElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.layerElement.style.width="100%",this.layerElement.style.height="100%",this.animationItem.wrapper.appendChild(this.layerElement);var e=document.createElementNS(svgNS,"defs");this.globalData.defs=e,this.layerElement.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.frameId=0,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h},this.data=t,this.globalData.frameRate=t.fr;var s=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var i="animationMask_"+randomString(10);s.setAttribute("id",i),s.appendChild(r);var a=document.createElementNS(svgNS,"g");a.setAttribute("clip-path","url(#"+i+")"),this.layerElement.appendChild(a),e.appendChild(s),this.layerElement=a,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.elements=Array.apply(null,{length:t.layers.length})},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,expressionsPlugin&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&this.elements[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},SVGRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this.elements.length;s>e;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},SVGRenderer.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},SVGRenderer.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var r,i=0;e>i;)this.elements[i]&&this.elements[i]!==!0&&this.elements[i].getBaseElement()&&(r=this.elements[i].getBaseElement()),i+=1;r?this.layerElement.insertBefore(s,r):this.layerElement.appendChild(s)}},SVGRenderer.prototype.hide=function(){this.layerElement.style.display="none"},SVGRenderer.prototype.show=function(){this.layerElement.style.display="block"},SVGRenderer.prototype.searchExtraCompositions=function(t){var e,s=t.length,r=document.createElementNS(svgNS,"g");for(e=0;s>e;e+=1)if(t[e].xt){var i=this.createComp(t[e],r,this.globalData.comp,null);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},MaskElement.prototype.renderFrame=function(t){var e,s=this.masksProperties.length;for(e=0;s>e;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var r=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url(#"+this.storedData[e].filterId+")")),r.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,s){var r,i,a=" M"+e.v[0][0]+","+e.v[0][1];for(i=e._length,r=1;i>r;r+=1)a+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[r][0])+","+bm_rnd(e.i[r][1])+" "+bm_rnd(e.v[r][0])+","+bm_rnd(e.v[r][1]);e.c&&i>1&&(a+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),s.lastPath!==a&&(s.elem&&(e.c?t.inv?s.elem.setAttribute("d",this.solidPath+a):s.elem.setAttribute("d",a):s.elem.setAttribute("d","")),s.lastPath=a)},MaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},BaseElement.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},BaseElement.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent)},BaseElement.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)(this.isVisible||this._isParent&&"transform"===this.dynamicProperties[e].type)&&(this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.elemMdf=!0,this.globalData.mdf=!0));return this.data.hasMask&&this.isVisible&&this.maskManager.prepareFrame(t*this.data.sr),this.currentFrameNum=t*this.data.sr,this.isVisible},BaseElement.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,r=this.comp;s;)r.finalTransform?(r.data.hasMask&&e.splice(0,0,r.finalTransform),r=r.comp):s=!1;var i,a,n=e.length;for(i=0;n>i;i+=1)a=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},BaseElement.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?this.layerInterface.shapeInterface=ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.layerInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this));
 
-var l,p=this.elements.length;for(l=0;p>l;l+=1)this.elements[l]&&0===this.elements[l].data.ty&&this.elements[l].resize(this.globalData.transformCanvas)},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers?this.layers.length:0;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem.firstFrame,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.renderConfig.clearCanvas===!0?(this.reset(),this.canvasContext.save(),this.canvasContext.clearRect(this.transformCanvas.tx,this.transformCanvas.ty,this.transformCanvas.w*this.transformCanvas.sx,this.transformCanvas.h*this.transformCanvas.sy)):this.save(),this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip();var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=0;s>e;e++)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.renderConfig.clearCanvas!==!0?this.restore():this.canvasContext.restore()}},CanvasRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){var s=this.createItem(this.layers[t],this,this.globalData);e[t]=s,s.initExpressions(),0===this.layers[t].ty&&s.resize(this.globalData.transformCanvas)}},CanvasRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},CanvasRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},CanvasRenderer.prototype.searchExtraCompositions=function(t){{var e,s=t.length;document.createElementNS(svgNS,"g")}for(e=0;s>e;e+=1)if(t[e].xt){var r=this.createComp(t[e],this.globalData.comp,this.globalData);r.initExpressions(),this.globalData.projectInterface.registerComposition(r)}},extendPrototype(BaseRenderer,HybridRenderer),HybridRenderer.prototype.buildItem=SVGRenderer.prototype.buildItem,HybridRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},HybridRenderer.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){var r=this.layers[e];if(r.ddd&&this.supports3d)this.addTo3dContainer(s,e);else{for(var i,a=0;e>a;)this.elements[a]&&this.elements[a]!==!0&&this.elements[a].getBaseElement&&(i=this.elements[a].getBaseElement()),a+=1;i?r.ddd&&this.supports3d||this.layerElement.insertBefore(s,i):r.ddd&&this.supports3d||this.layerElement.appendChild(s)}}},HybridRenderer.prototype.createBase=function(t){return new SVGBaseElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createShape=function(t){return this.supports3d?new HShapeElement(t,this.layerElement,this.globalData,this):new IShapeElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createText=function(t){return this.supports3d?new HTextElement(t,this.layerElement,this.globalData,this):new SVGTextElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createCamera=function(t){return this.camera=new HCameraElement(t,this.layerElement,this.globalData,this),this.camera},HybridRenderer.prototype.createImage=function(t){return this.supports3d?new HImageElement(t,this.layerElement,this.globalData,this):new IImageElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createComp=function(t){return this.supports3d?new HCompElement(t,this.layerElement,this.globalData,this):new ICompElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createSolid=function(t){return this.supports3d?new HSolidElement(t,this.layerElement,this.globalData,this):new ISolidElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.getThreeDContainer=function(t){var e=document.createElement("div");styleDiv(e),e.style.width=this.globalData.compSize.w+"px",e.style.height=this.globalData.compSize.h+"px",e.style.transformOrigin=e.style.mozTransformOrigin=e.style.webkitTransformOrigin="50% 50%";var s=document.createElement("div");styleDiv(s),s.style.transform=s.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",e.appendChild(s),this.resizerElem.appendChild(e);var r={container:s,perspectiveElem:e,startPos:t,endPos:t};return this.threeDElements.push(r),r},HybridRenderer.prototype.build3dContainers=function(){var t,e,s=this.layers.length;for(t=0;s>t;t+=1)this.layers[t].ddd?(e||(e=this.getThreeDContainer(t)),e.endPos=Math.max(e.endPos,t)):e=null},HybridRenderer.prototype.addTo3dContainer=function(t,e){for(var s=0,r=this.threeDElements.length;r>s;){if(e<=this.threeDElements[s].endPos){for(var i,a=this.threeDElements[s].startPos;e>a;)this.elements[a]&&this.elements[a].getBaseElement&&(i=this.elements[a].getBaseElement()),a+=1;i?this.threeDElements[s].container.insertBefore(t,i):this.threeDElements[s].container.appendChild(t);break}s+=1}},HybridRenderer.prototype.configAnimation=function(t){var e=document.createElement("div"),s=this.animationItem.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",s.appendChild(e),e.style.overflow="hidden";var r=document.createElementNS(svgNS,"svg");r.setAttribute("width","1"),r.setAttribute("height","1"),styleDiv(r),this.resizerElem.appendChild(r);var i=document.createElementNS(svgNS,"defs");r.appendChild(i),this.globalData.defs=i,this.data=t,this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,r),this.layerElement=this.resizerElem,this.build3dContainers(),this.updateContainerSize()},HybridRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},HybridRenderer.prototype.updateContainerSize=function(){var t,e,s,r,i=this.animationItem.wrapper.offsetWidth,a=this.animationItem.wrapper.offsetHeight,n=i/a,o=this.globalData.compSize.w/this.globalData.compSize.h;o>n?(t=i/this.globalData.compSize.w,e=i/this.globalData.compSize.w,s=0,r=(a-this.globalData.compSize.h*(i/this.globalData.compSize.w))/2):(t=a/this.globalData.compSize.h,e=a/this.globalData.compSize.h,s=(i-this.globalData.compSize.w*(a/this.globalData.compSize.h))/2,r=0),this.resizerElem.style.transform=this.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+s+","+r+",0,1)"},HybridRenderer.prototype.renderFrame=SVGRenderer.prototype.renderFrame,HybridRenderer.prototype.hide=function(){this.resizerElem.style.display="none"},HybridRenderer.prototype.show=function(){this.resizerElem.style.display="block"},HybridRenderer.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this.globalData.compSize.w,s=this.globalData.compSize.h,r=this.threeDElements.length;for(t=0;r>t;t+=1)this.threeDElements[t].perspectiveElem.style.perspective=this.threeDElements[t].perspectiveElem.style.webkitPerspective=Math.sqrt(Math.pow(e,2)+Math.pow(s,2))+"px"}},HybridRenderer.prototype.searchExtraCompositions=function(t){var e,s=t.length,r=document.createElement("div");for(e=0;s>e;e+=1)if(t[e].xt){var i=this.createComp(t[e],r,this.globalData.comp,null);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},createElement(BaseElement,CVBaseElement),CVBaseElement.prototype.createElements=function(){this.checkParenting()},CVBaseElement.prototype.checkBlendMode=function(t){if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e="";switch(this.data.bm){case 0:e="normal";break;case 1:e="multiply";break;case 2:e="screen";break;case 3:e="overlay";break;case 4:e="darken";break;case 5:e="lighten";break;case 6:e="color-dodge";break;case 7:e="color-burn";break;case 8:e="hard-light";break;case 9:e="soft-light";break;case 10:e="difference";break;case 11:e="exclusion";break;case 12:e="hue";break;case 13:e="saturation";break;case 14:e="color";break;case 15:e="luminosity"}t.canvasContext.globalCompositeOperation=e}},CVBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.checkBlendMode(0===this.data.ty?this.parentGlobalData:this.globalData),!this.isVisible)return this.isVisible;this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var r,i=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)this.finalTransform.matMdf=this.hierarchy[r].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props);return t&&(e=t.mat.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.data.hasMask&&(this.globalData.renderer.save(!0),this.maskManager.renderFrame(0===this.data.ty?null:s)),this.data.hd&&(this.isVisible=!1),this.isVisible},CVBaseElement.prototype.addMasks=function(t){this.maskManager=new CVMaskElement(t,this,this.globalData)},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},CVBaseElement.prototype.mHelper=new Matrix,createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.ctxTransform=CanvasRenderer.prototype.ctxTransform,CVCompElement.prototype.ctxOpacity=CanvasRenderer.prototype.ctxOpacity,CVCompElement.prototype.save=CanvasRenderer.prototype.save,CVCompElement.prototype.restore=CanvasRenderer.prototype.restore,CVCompElement.prototype.reset=function(){this.contextData.cArrPos=0,this.contextData.cTr.reset(),this.contextData.cO=1},CVCompElement.prototype.resize=function(t){var e=Math.max(t.sx,t.sy);this.canvas.width=this.data.w*e,this.canvas.height=this.data.h*e,this.transformCanvas={sc:e,w:this.data.w*e,h:this.data.h*e,props:[e,0,0,0,0,e,0,0,0,0,1,0,0,0,0,1]};var s,r=this.elements.length;for(s=0;r>s;s+=1)this.elements[s]&&0===this.elements[s].data.ty&&this.elements[s].resize(t)},CVCompElement.prototype.prepareFrame=function(t){if(this.globalData.frameId=this.parentGlobalData.frameId,this.globalData.mdf=!1,this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e/this.data.sr;var s,r=this.elements.length;for(this.completeLayers||this.checkLayers(t),s=0;r>s;s+=1)(this.completeLayers||this.elements[s])&&(this.elements[s].prepareFrame(e/this.data.sr-this.layers[s].st),0===this.elements[s].data.ty&&this.elements[s].globalData.mdf&&(this.globalData.mdf=!0));this.globalData.mdf&&!this.data.xt&&(this.canvasContext.clearRect(0,0,this.data.w,this.data.h),this.ctxTransform(this.transformCanvas.props))}},CVCompElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){if(this.globalData.mdf){var e,s=this.layers.length;for(e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}this.data.hasMask&&this.globalData.renderer.restore(!0),this.firstFrame&&(this.firstFrame=!1),this.parentGlobalData.renderer.save(),this.parentGlobalData.renderer.ctxTransform(this.finalTransform.mat.props),this.parentGlobalData.renderer.ctxOpacity(this.finalTransform.opacity),this.parentGlobalData.renderer.canvasContext.drawImage(this.canvas,0,0,this.data.w,this.data.h),this.parentGlobalData.renderer.restore(),this.globalData.mdf&&this.reset()}},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this._parent.destroy.call(this._parent)},CVCompElement.prototype.checkLayers=CanvasRenderer.prototype.checkLayers,CVCompElement.prototype.buildItem=CanvasRenderer.prototype.buildItem,CVCompElement.prototype.checkPendingElements=CanvasRenderer.prototype.checkPendingElements,CVCompElement.prototype.addPendingElement=CanvasRenderer.prototype.addPendingElement,CVCompElement.prototype.buildAllItems=CanvasRenderer.prototype.buildAllItems,CVCompElement.prototype.createItem=CanvasRenderer.prototype.createItem,CVCompElement.prototype.createImage=CanvasRenderer.prototype.createImage,CVCompElement.prototype.createComp=CanvasRenderer.prototype.createComp,CVCompElement.prototype.createSolid=CanvasRenderer.prototype.createSolid,CVCompElement.prototype.createShape=CanvasRenderer.prototype.createShape,CVCompElement.prototype.createText=CanvasRenderer.prototype.createText,CVCompElement.prototype.createBase=CanvasRenderer.prototype.createBase,CVCompElement.prototype.buildElementParenting=CanvasRenderer.prototype.buildElementParenting,createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=function(){if(this.globalData.elementLoaded(),this.assetData.w!==this.img.width||this.assetData.h!==this.img.height){var t=document.createElement("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,s,r=t.getContext("2d"),i=this.img.width,a=this.img.height,n=i/a,o=this.assetData.w/this.assetData.h;n>o?(s=a,e=s*o):(e=i,s=e/o),r.drawImage(this.img,(i-e)/2,(a-s)/2,e,s,0,0,this.assetData.w,this.assetData.h),this.img=t}}.bind(this),e=function(){this.failed=!0,this.globalData.elementLoaded()}.bind(this);this.img=new Image,this.img.addEventListener("load",t,!1),this.img.addEventListener("error",e,!1);var s=this.globalData.getAssetsPath(this.assetData);this.img.src=s,this._parent.createElements.call(this)},CVImageElement.prototype.renderFrame=function(t){if(!this.failed&&this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var s=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.drawImage(this.img,0,0),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},CVImageElement.prototype.destroy=function(){this.img=null,this._parent.destroy.call(this._parent)},CVMaskElement.prototype.getMaskProperty=function(t){return this.viewData[t]},CVMaskElement.prototype.prepareFrame=function(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.element.globalData.mdf=!0)},CVMaskElement.prototype.renderFrame=function(t){var e,s,r,i,a,n=this.element.canvasContext,o=this.data.masksProperties.length,h=!1;for(e=0;o>e;e++)if("n"!==this.masksProperties[e].mode){h===!1&&(n.beginPath(),h=!0),this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.element.globalData.compWidth,0),n.lineTo(this.element.globalData.compWidth,this.element.globalData.compHeight),n.lineTo(0,this.element.globalData.compHeight),n.lineTo(0,0)),a=this.viewData[e].v,s=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.moveTo(s[0],s[1]);var l,p=a._length;for(l=1;p>l;l++)s=t?t.applyToPointArray(a.o[l-1][0],a.o[l-1][1],0):a.o[l-1],r=t?t.applyToPointArray(a.i[l][0],a.i[l][1],0):a.i[l],i=t?t.applyToPointArray(a.v[l][0],a.v[l][1],0):a.v[l],n.bezierCurveTo(s[0],s[1],r[0],r[1],i[0],i[1]);s=t?t.applyToPointArray(a.o[l-1][0],a.o[l-1][1],0):a.o[l-1],r=t?t.applyToPointArray(a.i[0][0],a.i[0][1],0):a.i[0],i=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.bezierCurveTo(s[0],s[1],r[0],r[1],i[0],i[1])}h&&n.clip()},CVMaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].pv};e+=1}},CVMaskElement.prototype.destroy=function(){this.element=null},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},CVShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},CVShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties)},CVShapeElement.prototype.searchShapes=function(t,e,s){var r,i,a,n,o=t.length-1,h=[],l=[];for(r=o;r>=0;r-=1)if("fl"==t[r].ty||"st"==t[r].ty){if(n={type:t[r].ty,elements:[]},e[r]={},("fl"==t[r].ty||"st"==t[r].ty)&&(e[r].c=PropertyFactory.getProp(this,t[r].c,1,255,s),e[r].c.k||(n.co="rgb("+bm_floor(e[r].c.v[0])+","+bm_floor(e[r].c.v[1])+","+bm_floor(e[r].c.v[2])+")")),e[r].o=PropertyFactory.getProp(this,t[r].o,0,.01,s),"st"==t[r].ty){if(n.lc=this.lcEnum[t[r].lc]||"round",n.lj=this.ljEnum[t[r].lj]||"round",1==t[r].lj&&(n.ml=t[r].ml),e[r].w=PropertyFactory.getProp(this,t[r].w,0,null,s),e[r].w.k||(n.wi=e[r].w.v),t[r].d){var p=PropertyFactory.getDashProp(this,t[r].d,"canvas",s);e[r].d=p,e[r].d.k||(n.da=e[r].d.dasharray,n["do"]=e[r].d.dashoffset)}}else n.r=2===t[r].r?"evenodd":"nonzero";this.stylesList.push(n),e[r].style=n,h.push(e[r].style)}else if("gr"==t[r].ty)e[r]={it:[]},this.searchShapes(t[r].it,e[r].it,s);else if("tr"==t[r].ty)e[r]={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:PropertyFactory.getProp(this,t[r].o,0,.01,s),mProps:PropertyFactory.getProp(this,t[r],2,null,s)},elements:[]};else if("sh"==t[r].ty||"rc"==t[r].ty||"el"==t[r].ty||"sr"==t[r].ty){e[r]={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]};var m=4;"rc"==t[r].ty?m=5:"el"==t[r].ty?m=6:"sr"==t[r].ty&&(m=7),e[r].sh=ShapePropertyFactory.getShapeProp(this,t[r],m,s),this.shapes.push(e[r].sh),this.addShapeToModifiers(e[r]),a=this.stylesList.length;var f=!1,c=!1;for(i=0;a>i;i+=1)this.stylesList[i].closed||(this.stylesList[i].elements.push(e[r]),"st"===this.stylesList[i].type?f=!0:c=!0);e[r].st=f,e[r].fl=c}else if("tm"==t[r].ty||"rd"==t[r].ty||"rp"==t[r].ty){var d=ShapeModifiers.getModifier(t[r].ty);d.init(this,t[r],s),this.shapeModifiers.push(d),l.push(d),e[r]=d}for(o=h.length,r=0;o>r;r+=1)h[r].closed=!0;for(o=l.length,r=0;o>r;r+=1)l[r].closed=!0},CVShapeElement.prototype.addShapeToModifiers=IShapeElement.prototype.addShapeToModifiers,CVShapeElement.prototype.renderModifiers=IShapeElement.prototype.renderModifiers,CVShapeElement.prototype.renderFrame=function(t){this._parent.renderFrame.call(this,t)!==!1&&(this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderModifiers(),this.renderShape(this.transformHelper,null,null,!0),this.data.hasMask&&this.globalData.renderer.restore(!0))},CVShapeElement.prototype.renderShape=function(t,e,s,r){var i,a;if(!e)for(e=this.shapesData,a=this.stylesList.length,i=0;a>i;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;s||(s=this.viewData),a=e.length-1;var n,o;for(n=t,i=a;i>=0;i-=1)if("tr"==e[i].ty){n=s[i].transform;var h=s[i].transform.mProps.v.props;if(n.matMdf=n.mProps.mdf,n.opMdf=n.op.mdf,o=n.mat,o.cloneFromProps(h),t){var l=t.mat.props;n.opacity=t.opacity,n.opacity*=s[i].transform.op.v,n.matMdf=t.matMdf?!0:n.matMdf,n.opMdf=t.opMdf?!0:n.opMdf,o.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15])}else n.opacity=n.op.o}else"sh"==e[i].ty||"el"==e[i].ty||"rc"==e[i].ty||"sr"==e[i].ty?this.renderPath(e[i],s[i],n):"fl"==e[i].ty?this.renderFill(e[i],s[i],n):"st"==e[i].ty?this.renderStroke(e[i],s[i],n):"gr"==e[i].ty?this.renderShape(n,e[i].it,s[i].it):"tm"==e[i].ty;if(r){a=this.stylesList.length;var p,m,f,c,d,u,y,g=this.globalData.renderer,v=this.globalData.canvasContext;for(g.save(),g.ctxTransform(this.finalTransform.mat.props),i=0;a>i;i+=1)if(y=this.stylesList[i].type,"st"!==y||0!==this.stylesList[i].wi){for(g.save(),d=this.stylesList[i].elements,"st"===y?(v.strokeStyle=this.stylesList[i].co,v.lineWidth=this.stylesList[i].wi,v.lineCap=this.stylesList[i].lc,v.lineJoin=this.stylesList[i].lj,v.miterLimit=this.stylesList[i].ml||0):v.fillStyle=this.stylesList[i].co,g.ctxOpacity(this.stylesList[i].coOp),"st"!==y&&v.beginPath(),m=d.length,p=0;m>p;p+=1){for("st"===y&&(v.beginPath(),this.stylesList[i].da?(v.setLineDash(this.stylesList[i].da),v.lineDashOffset=this.stylesList[i]["do"],this.globalData.isDashed=!0):this.globalData.isDashed&&(v.setLineDash(this.dashResetter),this.globalData.isDashed=!1)),u=d[p].trNodes,c=u.length,f=0;c>f;f+=1)"m"==u[f].t?v.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?v.bezierCurveTo(u[f].p1[0],u[f].p1[1],u[f].p2[0],u[f].p2[1],u[f].p3[0],u[f].p3[1]):v.closePath();"st"===y&&v.stroke()}"st"!==y&&v.fill(this.stylesList[i].r),g.restore()}g.restore(),this.firstFrame&&(this.firstFrame=!1)}},CVShapeElement.prototype.renderPath=function(t,e,s){var r,i,a,n,o=s.matMdf||e.sh.mdf||this.firstFrame;if(o){var h=e.sh.paths;n=h._length;var l=e.trNodes;for(l.length=0,a=0;n>a;a+=1){var p=h.shapes[a];if(p&&p.v){for(r=p._length,i=1;r>i;i+=1)1==i&&l.push({t:"m",p:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),l.push({t:"c",p1:s.mat.applyToPointArray(p.o[i-1][0],p.o[i-1][1],0),p2:s.mat.applyToPointArray(p.i[i][0],p.i[i][1],0),p3:s.mat.applyToPointArray(p.v[i][0],p.v[i][1],0)});1==r&&l.push({t:"m",p:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),p.c&&r&&(l.push({t:"c",p1:s.mat.applyToPointArray(p.o[i-1][0],p.o[i-1][1],0),p2:s.mat.applyToPointArray(p.i[0][0],p.i[0][1],0),p3:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),l.push({t:"z"})),e.lStr=l}}if(e.st)for(i=0;16>i;i+=1)e.tr[i]=s.mat.props[i];e.trNodes=l}},CVShapeElement.prototype.renderFill=function(t,e,s){var r=e.style;(e.c.mdf||this.firstFrame)&&(r.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(r.coOp=e.o.v*s.opacity)},CVShapeElement.prototype.renderStroke=function(t,e,s){var r=e.style,i=e.d;i&&(i.mdf||this.firstFrame)&&(r.da=i.dasharray,r["do"]=i.dashoffset),(e.c.mdf||this.firstFrame)&&(r.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(r.coOp=e.o.v*s.opacity),(e.w.mdf||this.firstFrame)&&(r.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.viewData.length=0,this._parent.destroy.call(this._parent)},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.fillStyle=this.data.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.init=ITextElement.prototype.init,CVTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,CVTextElement.prototype.getMult=ITextElement.prototype.getMult,CVTextElement.prototype.prepareFrame=ITextElement.prototype.prepareFrame,CVTextElement.prototype.tHelper=document.createElement("canvas").getContext("2d"),CVTextElement.prototype.createElements=function(){this._parent.createElements.call(this)},CVTextElement.prototype.buildNewText=function(){var t=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0});var e=!1;t.fc?(e=!0,this.values.fill="rgb("+Math.round(255*t.fc[0])+","+Math.round(255*t.fc[1])+","+Math.round(255*t.fc[2])+")"):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;t.sc&&(s=!0,this.values.stroke="rgb("+Math.round(255*t.sc[0])+","+Math.round(255*t.sc[1])+","+Math.round(255*t.sc[2])+")",this.values.sWidth=t.sw);var r,i,a=this.globalData.fontManager.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=s,this.values.fValue=t.s+"px "+this.globalData.fontManager.getFontByName(t.f).fFamily,i=t.t.length,this.tHelper.font=this.values.fValue;var h,l,p,m,f,c,d,u,y,g,v=this.data.singleShape;if(v)var b=0,E=0,P=t.lineWidths,x=t.boxWidth,S=!0;var C=0;for(r=0;i>r;r+=1){h=this.globalData.fontManager.getCharData(t.t.charAt(r),a.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);var l;if(l=h?h.data:null,o.reset(),v&&n[r].n&&(b=0,E+=t.yOffset,E+=S?1:0,S=!1),l&&l.shapes){if(f=l.shapes[0].it,d=f.length,o.scale(t.s/100,t.s/100),v){switch(t.ps&&o.translate(t.ps[0],t.ps[1]+t.ascent,0),o.translate(0,-t.ls,0),t.j){case 1:o.translate(t.justifyOffset+(x-P[n[r].line]),0,0);break;case 2:o.translate(t.justifyOffset+(x-P[n[r].line])/2,0,0)}o.translate(b,E,0)}for(y=new Array(d),c=0;d>c;c+=1){for(m=f[c].ks.k.i.length,u=f[c].ks.k,g=[],p=1;m>p;p+=1)1==p&&g.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),g.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[p][0],u.i[p][1],0),o.applyToY(u.i[p][0],u.i[p][1],0),o.applyToX(u.v[p][0],u.v[p][1],0),o.applyToY(u.v[p][0],u.v[p][1],0));g.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[0][0],u.i[0][1],0),o.applyToY(u.i[0][0],u.i[0][1],0),o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),y[c]=g}}else y=[];v&&(b+=n[r].l),this.textSpans[C]?this.textSpans[C].elem=y:this.textSpans[C]={elem:y},C+=1}},CVTextElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext,s=this.finalTransform.mat.props;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.font=this.values.fValue,e.lineCap="butt",e.lineJoin="miter",e.miterLimit=4,this.data.singleShape||this.getMeasures();var r,i,a,n,o,h,l=this.renderedLetters,p=this.currentTextDocumentData.l;i=p.length;var m,f,c,d=null,u=null,y=null;for(r=0;i>r;r+=1)if(!p[r].n){if(m=l[r],m&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(m.props),this.globalData.renderer.ctxOpacity(m.o)),this.fill){for(m&&m.fc?d!==m.fc&&(d=m.fc,e.fillStyle=m.fc):d!==this.values.fill&&(d=this.values.fill,e.fillStyle=this.values.fill),f=this.textSpans[r].elem,n=f.length,this.globalData.canvasContext.beginPath(),a=0;n>a;a+=1)for(c=f[a],h=c.length,this.globalData.canvasContext.moveTo(c[0],c[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(c[o],c[o+1],c[o+2],c[o+3],c[o+4],c[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(m&&m.sw?y!==m.sw&&(y=m.sw,e.lineWidth=m.sw):y!==this.values.sWidth&&(y=this.values.sWidth,e.lineWidth=this.values.sWidth),m&&m.sc?u!==m.sc&&(u=m.sc,e.strokeStyle=m.sc):u!==this.values.stroke&&(u=this.values.stroke,e.strokeStyle=this.values.stroke),f=this.textSpans[r].elem,n=f.length,this.globalData.canvasContext.beginPath(),a=0;n>a;a+=1)for(c=f[a],h=c.length,this.globalData.canvasContext.moveTo(c[0],c[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(c[o],c[o+1],c[o+2],c[o+3],c[o+4],c[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}m&&this.globalData.renderer.restore()}this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(BaseElement,HBaseElement),HBaseElement.prototype.checkBlendMode=function(){},HBaseElement.prototype.setBlendMode=BaseElement.prototype.setBlendMode,HBaseElement.prototype.getBaseElement=function(){return this.baseElement},HBaseElement.prototype.createElements=function(){this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"svg"),styleDiv(this.layerElement),this.baseElement=this.layerElement,this.maskedElement=this.layerElement):this.layerElement=this.parentContainer,this.transformedElement=this.layerElement,!this.data.ln||4!==this.data.ty&&0!==this.data.ty||(this.layerElement===this.parentContainer&&(this.layerElement=document.createElementNS(svgNS,"g"),this.baseElement=this.layerElement),this.layerElement.setAttribute("id",this.data.ln)),this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.checkParenting()},HBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.currentFrameNum===this.lastNum||!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var r,i=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)this.finalTransform.matMdf=this.hierarchy[r].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&this.finalTransform.matMdf&&(t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props));return this.data.hasMask&&this.maskManager.renderFrame(s),t&&(e=t.mat.props,s.cloneFromProps(e),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.finalTransform.matMdf&&(this.transformedElement.style.transform=this.transformedElement.style.webkitTransform=s.toCSS(),this.finalMat=s),this.finalTransform.opMdf&&(this.transformedElement.style.opacity=this.finalTransform.opacity),this.isVisible},HBaseElement.prototype.destroy=function(){this.layerElement=null,this.transformedElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},HBaseElement.prototype.getDomElement=function(){return this.layerElement},HBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},HBaseElement.prototype.hide=function(){},HBaseElement.prototype.setMatte=function(){},HBaseElement.prototype.buildElementParenting=HybridRenderer.prototype.buildElementParenting,createElement(HBaseElement,HSolidElement),HSolidElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");styleDiv(e),e.setAttribute("width",this.data.sw),e.setAttribute("height",this.data.sh),t.appendChild(e),this.layerElement=t,
-this.transformedElement=t,this.baseElement=t,this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),0!==this.data.bm&&this.setBlendMode();var s=document.createElementNS(svgNS,"rect");s.setAttribute("width",this.data.sw),s.setAttribute("height",this.data.sh),s.setAttribute("fill",this.data.sc),e.appendChild(s),this.data.hasMask&&(this.maskedElement=s),this.checkParenting()},HSolidElement.prototype.hide=IImageElement.prototype.hide,HSolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,HSolidElement.prototype.destroy=IImageElement.prototype.destroy,createElement(HBaseElement,HCompElement),HCompElement.prototype.createElements=function(){var t=document.createElement("div");if(styleDiv(t),this.data.ln&&t.setAttribute("id",this.data.ln),t.style.clip="rect(0px, "+this.data.w+"px, "+this.data.h+"px, 0px)",this.data.hasMask){var e=document.createElementNS(svgNS,"svg");styleDiv(e),e.setAttribute("width",this.data.w),e.setAttribute("height",this.data.h);var s=document.createElementNS(svgNS,"g");e.appendChild(s),t.appendChild(e),this.maskedElement=s,this.baseElement=t,this.layerElement=s,this.transformedElement=t}else this.layerElement=t,this.baseElement=this.layerElement,this.transformedElement=t;this.checkParenting()},HCompElement.prototype.hide=ICompElement.prototype.hide,HCompElement.prototype.prepareFrame=ICompElement.prototype.prepareFrame,HCompElement.prototype.setElements=ICompElement.prototype.setElements,HCompElement.prototype.getElements=ICompElement.prototype.getElements,HCompElement.prototype.destroy=ICompElement.prototype.destroy,HCompElement.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),r=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;r>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},HCompElement.prototype.checkLayers=BaseRenderer.prototype.checkLayers,HCompElement.prototype.buildItem=HybridRenderer.prototype.buildItem,HCompElement.prototype.checkPendingElements=HybridRenderer.prototype.checkPendingElements,HCompElement.prototype.addPendingElement=HybridRenderer.prototype.addPendingElement,HCompElement.prototype.buildAllItems=BaseRenderer.prototype.buildAllItems,HCompElement.prototype.createItem=HybridRenderer.prototype.createItem,HCompElement.prototype.buildElementParenting=HybridRenderer.prototype.buildElementParenting,HCompElement.prototype.createImage=HybridRenderer.prototype.createImage,HCompElement.prototype.createComp=HybridRenderer.prototype.createComp,HCompElement.prototype.createSolid=HybridRenderer.prototype.createSolid,HCompElement.prototype.createShape=HybridRenderer.prototype.createShape,HCompElement.prototype.createText=HybridRenderer.prototype.createText,HCompElement.prototype.createBase=HybridRenderer.prototype.createBase,HCompElement.prototype.appendElementInPos=HybridRenderer.prototype.appendElementInPos,createElement(HBaseElement,HShapeElement);var parent=HShapeElement.prototype._parent;extendPrototype(IShapeElement,HShapeElement),HShapeElement.prototype._parent=parent,HShapeElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");styleDiv(e);var s=this.comp.data?this.comp.data:this.globalData.compSize;if(e.setAttribute("width",s.w),e.setAttribute("height",s.h),this.data.hasMask){var r=document.createElementNS(svgNS,"g");t.appendChild(e),e.appendChild(r),this.maskedElement=r,this.layerElement=r,this.shapesContainer=r}else t.appendChild(e),this.layerElement=e,this.shapesContainer=document.createElementNS(svgNS,"g"),this.layerElement.appendChild(this.shapesContainer);this.data.hd||(this.baseElement=t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),this.buildExpressionInterface(),this.layerElement=t,this.transformedElement=t,this.shapeCont=e,0!==this.data.bm&&this.setBlendMode(),this.checkParenting()},HShapeElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),this.addedTransforms.mdf=this.finalTransform.matMdf,this.addedTransforms.mats.length=1,this.addedTransforms.mats[0]=this.finalTransform.mat,this.renderShape(null,null,!0,null),this.isVisible&&(this.elemMdf||this.firstFrame)){var s=this.shapeCont.getBBox(),r=!1;this.currentBBox.w!==s.width&&(this.currentBBox.w=s.width,this.shapeCont.setAttribute("width",s.width),r=!0),this.currentBBox.h!==s.height&&(this.currentBBox.h=s.height,this.shapeCont.setAttribute("height",s.height),r=!0),(r||this.currentBBox.x!==s.x||this.currentBBox.y!==s.y)&&(this.currentBBox.w=s.width,this.currentBBox.h=s.height,this.currentBBox.x=s.x,this.currentBBox.y=s.y,this.shapeCont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.shapeCont.style.transform=this.shapeCont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}},createElement(HBaseElement,HTextElement),HTextElement.prototype.init=ITextElement.prototype.init,HTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,HTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,HTextElement.prototype.prepareFrame=ITextElement.prototype.prepareFrame,HTextElement.prototype.createElements=function(){this.isMasked=this.checkMasks();var t=document.createElement("div");if(styleDiv(t),this.layerElement=t,this.transformedElement=t,this.isMasked){this.renderType="svg";var e=document.createElementNS(svgNS,"svg");styleDiv(e),this.cont=e,this.compW=this.comp.data.w,this.compH=this.comp.data.h,e.setAttribute("width",this.compW),e.setAttribute("height",this.compH);var s=document.createElementNS(svgNS,"g");e.appendChild(s),t.appendChild(e),this.maskedElement=s,this.innerElem=s}else this.renderType="html",this.innerElem=t;this.baseElement=t,this.checkParenting()},HTextElement.prototype.buildNewText=function(){var t=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),this.innerElem.style.color=this.innerElem.style.fill=t.fc?"rgb("+Math.round(255*t.fc[0])+","+Math.round(255*t.fc[1])+","+Math.round(255*t.fc[2])+")":"rgba(0,0,0,0)",t.sc&&(this.innerElem.style.stroke="rgb("+Math.round(255*t.sc[0])+","+Math.round(255*t.sc[1])+","+Math.round(255*t.sc[2])+")",this.innerElem.style.strokeWidth=t.sw+"px");var e=this.globalData.fontManager.getFontByName(t.f);if(!this.globalData.fontManager.chars)if(this.innerElem.style.fontSize=t.s+"px",this.innerElem.style.lineHeight=t.s+"px",e.fClass)this.innerElem.className=e.fClass;else{this.innerElem.style.fontFamily=e.fFamily;var s=t.fWeight,r=t.fStyle;this.innerElem.style.fontStyle=r,this.innerElem.style.fontWeight=s}var i,a,n=t.l;a=n.length;var o,h,l,p,m=this.mHelper,f="",c=0;for(i=0;a>i;i+=1){if(this.globalData.fontManager.chars?(this.textPaths[c]?o=this.textPaths[c]:(o=document.createElementNS(svgNS,"path"),o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4")),this.isMasked||(this.textSpans[c]?(h=this.textSpans[c],l=h.children[0]):(h=document.createElement("div"),l=document.createElementNS(svgNS,"svg"),l.appendChild(o),styleDiv(h)))):this.isMasked?o=this.textPaths[c]?this.textPaths[c]:document.createElementNS(svgNS,"text"):this.textSpans[c]?(h=this.textSpans[c],o=this.textPaths[c]):(h=document.createElement("span"),styleDiv(h),o=document.createElement("span"),styleDiv(o),h.appendChild(o)),this.globalData.fontManager.chars){var d,u=this.globalData.fontManager.getCharData(t.t.charAt(i),e.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);if(d=u?u.data:null,m.reset(),d&&d.shapes&&(p=d.shapes[0].it,m.scale(t.s/100,t.s/100),f=this.createPathShape(m,p),o.setAttribute("d",f)),this.isMasked)this.innerElem.appendChild(o);else if(this.innerElem.appendChild(h),d&&d.shapes){document.body.appendChild(l);var y=l.getBBox();l.setAttribute("width",y.width),l.setAttribute("height",y.height),l.setAttribute("viewBox",y.x+" "+y.y+" "+y.width+" "+y.height),l.style.transform=l.style.webkitTransform="translate("+y.x+"px,"+y.y+"px)",n[i].yOffset=y.y,h.appendChild(l)}else l.setAttribute("width",1),l.setAttribute("height",1)}else o.textContent=n[i].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this.innerElem.appendChild(o):(this.innerElem.appendChild(h),o.style.transform=o.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.textSpans[c]=this.isMasked?o:h,this.textSpans[c].style.display="block",this.textPaths[c]=o,c+=1}for(;c<this.textSpans.length;)this.textSpans[c].style.display="none",c+=1},HTextElement.prototype.hide=SVGTextElement.prototype.hide,HTextElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block",this.layerElement.style.display="block"),this.data.singleShape){if(!this.firstFrame&&!this.lettersChangedFlag)return;this.isMasked&&this.finalTransform.matMdf&&(this.cont.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this.cont.style.transform=this.cont.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.getMeasures(),this.lettersChangedFlag){var s,r,i=this.renderedLetters,a=this.currentTextDocumentData.l;r=a.length;var n;for(s=0;r>s;s+=1)a[s].n||(n=i[s],this.isMasked?this.textSpans[s].setAttribute("transform",n.m):this.textSpans[s].style.transform=this.textSpans[s].style.webkitTransform=n.m,this.textSpans[s].style.opacity=n.o,n.sw&&this.textPaths[s].setAttribute("stroke-width",n.sw),n.sc&&this.textPaths[s].setAttribute("stroke",n.sc),n.fc&&(this.textPaths[s].setAttribute("fill",n.fc),this.textPaths[s].style.color=n.fc));if(this.isVisible&&(this.elemMdf||this.firstFrame)&&this.innerElem.getBBox){var o=this.innerElem.getBBox();this.currentBBox.w!==o.width&&(this.currentBBox.w=o.width,this.cont.setAttribute("width",o.width)),this.currentBBox.h!==o.height&&(this.currentBBox.h=o.height,this.cont.setAttribute("height",o.height)),(this.currentBBox.w!==o.width||this.currentBBox.h!==o.height||this.currentBBox.x!==o.x||this.currentBBox.y!==o.y)&&(this.currentBBox.w=o.width,this.currentBBox.h=o.height,this.currentBBox.x=o.x,this.currentBBox.y=o.y,this.cont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.cont.style.transform=this.cont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}this.firstFrame&&(this.firstFrame=!1)}},HTextElement.prototype.destroy=SVGTextElement.prototype.destroy,createElement(HBaseElement,HImageElement),HImageElement.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData),e=new Image;if(this.data.hasMask){var s=document.createElement("div");styleDiv(s);var r=document.createElementNS(svgNS,"svg");styleDiv(r),r.setAttribute("width",this.assetData.w),r.setAttribute("height",this.assetData.h),s.appendChild(r),this.imageElem=document.createElementNS(svgNS,"image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),r.appendChild(this.imageElem),this.layerElement=s,this.transformedElement=s,this.baseElement=s,this.innerElem=s,this.maskedElement=this.imageElem}else styleDiv(e),this.layerElement=e,this.baseElement=e,this.innerElem=e,this.transformedElement=e;e.src=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.checkParenting()},HImageElement.prototype.hide=HSolidElement.prototype.hide,HImageElement.prototype.renderFrame=HSolidElement.prototype.renderFrame,HImageElement.prototype.destroy=HSolidElement.prototype.destroy,createElement(HBaseElement,HCameraElement),HCameraElement.prototype.setup=function(){var t,e,s=this.comp.threeDElements.length;for(t=0;s>t;t+=1)e=this.comp.threeDElements[t],e.perspectiveElem.style.perspective=e.perspectiveElem.style.webkitPerspective=this.pe.v+"px",e.container.style.transformOrigin=e.container.style.mozTransformOrigin=e.container.style.webkitTransformOrigin="0px 0px 0px",e.perspectiveElem.style.transform=e.perspectiveElem.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},HCameraElement.prototype.createElements=function(){},HCameraElement.prototype.hide=function(){},HCameraElement.prototype.renderFrame=function(){var t,e,s=this.firstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;e>t;t+=1)s=this.hierarchy[t].finalTransform.mProp.mdf?!0:s;if(s||this.p&&this.p.mdf||this.px&&(this.px.mdf||this.py.mdf||this.pz.mdf)||this.rx.mdf||this.ry.mdf||this.rz.mdf||this.or.mdf||this.a&&this.a.mdf){if(this.mat.reset(),this.p?this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]):this.mat.translate(-this.px.v,-this.py.v,this.pz.v),this.a){var r=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],i=Math.sqrt(Math.pow(r[0],2)+Math.pow(r[1],2)+Math.pow(r[2],2)),a=[r[0]/i,r[1]/i,r[2]/i],n=Math.sqrt(a[2]*a[2]+a[0]*a[0]),o=Math.atan2(a[1],n),h=Math.atan2(a[0],-a[2]);this.mat.rotateY(h).rotateX(-o)}if(this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]),this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0),this.mat.translate(0,0,this.pe.v),this.hierarchy){var l;for(e=this.hierarchy.length,t=0;e>t;t+=1)l=this.hierarchy[t].finalTransform.mProp.iv.props,this.mat.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],-l[12],-l[13],l[14],l[15])}e=this.comp.threeDElements.length;var p;for(t=0;e>t;t+=1)p=this.comp.threeDElements[t],p.container.style.transform=p.container.style.webkitTransform=this.mat.toCSS()}this.firstFrame=!1},HCameraElement.prototype.destroy=function(){};var Expressions=function(){function t(t){t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer.globalData.projectInterface.registerComposition(t.renderer)}var e={};return e.initExpressions=t,e}();expressionsPlugin=Expressions,function(){function t(){return this.pv}function e(t,e){t*=this.elem.globalData.frameRate;var s,r,i=0,a=this.keyframes.length-1,n=1,o=!0;e=void 0===e?this.offsetTime:0;for(var h="object"==typeof this.pv?[this.pv.length]:0;o;){if(s=this.keyframes[i],r=this.keyframes[i+1],i==a-1&&t>=r.t-e){s.h&&(s=r);break}if(r.t-e>t)break;a-1>i?i+=n:o=!1}var l,p,m,f,c,d=0;if(s.to){s.bezierData||bez.buildBezierData(s);var u=s.bezierData;if(t>=r.t-e||t<s.t-e){var y=t>=r.t-e?u.points.length-1:0;for(p=u.points[y].point.length,l=0;p>l;l+=1)h[l]=u.points[y].point[l]}else{s.__fnct?c=s.__fnct:(c=BezierFactory.getBezierEasing(s.o.x,s.o.y,s.i.x,s.i.y,s.n).get,s.__fnct=c),m=c((t-(s.t-e))/(r.t-e-(s.t-e)));var g,v=u.segmentLength*m,b=0;for(n=1,o=!0,f=u.points.length;o;){if(b+=u.points[d].partialLength*n,0===v||0===m||d==u.points.length-1){for(p=u.points[d].point.length,l=0;p>l;l+=1)h[l]=u.points[d].point[l];break}if(v>=b&&v<b+u.points[d+1].partialLength){for(g=(v-b)/u.points[d+1].partialLength,p=u.points[d].point.length,l=0;p>l;l+=1)h[l]=u.points[d].point[l]+(u.points[d+1].point[l]-u.points[d].point[l])*g;break}f-1>d&&1==n||d>0&&-1==n?d+=n:o=!1}}}else{var E,P,x,S,C,k=!1;for(a=s.s.length,i=0;a>i;i+=1){if(1!==s.h&&(s.o.x instanceof Array?(k=!0,s.__fnct||(s.__fnct=[]),s.__fnct[i]||(E=s.o.x[i]||s.o.x[0],P=s.o.y[i]||s.o.y[0],x=s.i.x[i]||s.i.x[0],S=s.i.y[i]||s.i.y[0])):(k=!1,s.__fnct||(E=s.o.x,P=s.o.y,x=s.i.x,S=s.i.y)),k?s.__fnct[i]?c=s.__fnct[i]:(c=BezierFactory.getBezierEasing(E,P,x,S).get,s.__fnct[i]=c):s.__fnct?c=s.__fnct:(c=BezierFactory.getBezierEasing(E,P,x,S).get,s.__fnct=c),m=t>=r.t-e?1:t<s.t-e?0:c((t-(s.t-e))/(r.t-e-(s.t-e)))),this.sh&&1!==s.h){var M=s.s[i],A=s.e[i];-180>M-A?M+=360:M-A>180&&(M-=360),C=M+(A-M)*m}else C=1===s.h?s.s[i]:s.s[i]+(s.e[i]-s.s[i])*m;1===a?h=C:h[i]=C}}return h}function s(t){if(void 0!==this.vel)return this.vel;var e,s=-.01,r=this.getValueAtTime(t,0),i=this.getValueAtTime(t+s,0);if(r.length){e=Array.apply(null,{length:r.length});var a;for(a=0;a<r.length;a+=1)e[a]=(i[a]-r[a])/s}else e=(i-r)/s;return e}function r(t){this.propertyGroup=t}function i(t,e,s){e.x&&(s.k=!0,s.x=!0,s.getValue&&(s.getPreValue=s.getValue),s.getValue=ExpressionManager.initiateExpression.bind(s)(t,e,s))}function a(t){console.log("time:",t)}function n(t){}var o=function(){function a(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(n,o){this.pv=1,this.comp=n.comp,this.elem=n,this.mult=.01,this.type="textSelector",this.textTotal=o.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],i.bind(this)(n,o,this),this.getMult=a,this.getVelocityAtTime=s,this.getValueAtTime=this.kf?e.bind(this):t.bind(this),this.setGroupProperty=r}}(),h=PropertyFactory.getProp;PropertyFactory.getProp=function(o,l,p,m,f){var c=h(o,l,p,m,f);c.getVelocityAtTime=s,c.getValueAtTime=2===p?c.dynamicProperties.length?a.bind(c):n.bind(c):c.kf?e.bind(c):t.bind(c),c.setGroupProperty=r;var d=c.k;return void 0!==l.ix&&Object.defineProperty(c,"propertyIndex",{get:function(){return l.ix}}),i(o,l,c),!d&&c.x&&f.push(c),c};var l=ShapePropertyFactory.getShapeProp;ShapePropertyFactory.getShapeProp=function(s,a,n,o,h){var p=l(s,a,n,o,h);p.setGroupProperty=r,p.getValueAtTime=p.kf?e:t;var m=p.k;return void 0!==a.ix&&Object.defineProperty(p,"propertyIndex",{get:function(){return a.ix}}),3===n?i(s,a.pt,p):4===n&&i(s,a.ks,p),!m&&p.x&&o.push(p),p};var p=PropertyFactory.getTextSelectorProp;PropertyFactory.getTextSelectorProp=function(t,e,s){return 1===e.t?new o(t,e,s):p(t,e,s)}}();var ExpressionManager=function(){function duplicatePropertyValue(t,e){if(e=e||1,"number"==typeof t||t instanceof Number)return t*e;if(t.i)return JSON.parse(JSON.stringify(t));var s,r=Array.apply(null,{length:t.length}),i=t.length;for(s=0;i>s;s+=1)r[s]=t[s]*e;return r}function shapesEqual(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var s,r=t._length;for(s=0;r>s;s+=1)if(t.v[s][0]!==e.v[s][0]||t.v[s][1]!==e.v[s][1]||t.o[s][0]!==e.o[s][0]||t.o[s][1]!==e.o[s][1]||t.i[s][0]!==e.i[s][0]||t.i[s][1]!==e.i[s][1])return!1;return!0}function $bm_neg(t){var e=typeof t;if("number"===e||"boolean"===e||t instanceof Number)return-t;if(t.constructor===Array){var s,r=t.length,i=[];for(s=0;r>s;s+=1)i[s]=-t[s];return i}}function sum(t,e){var s=typeof t,r=typeof e;if("string"===s||"string"===r)return t+e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t+e;if(t.constructor===Array&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t[0]=t[0]+e,t;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&e.constructor===Array)return e[0]=t+e[0],e;if(t.constructor===Array&&e.constructor===Array){for(var i=0,a=t.length,n=e.length,o=[];a>i||n>i;)o[i]=("number"==typeof t[i]||t[i]instanceof Number)&&("number"==typeof e[i]||e[i]instanceof Number)?t[i]+e[i]:void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function sub(t,e){var s=typeof t,r=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t-e;if(t.constructor===Array&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t[0]=t[0]-e,t;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&e.constructor===Array)return e[0]=t-e[0],e;if(t.constructor===Array&&e.constructor===Array){for(var i=0,a=t.length,n=e.length,o=[];a>i||n>i;)o[i]="number"==typeof t[i]||t[i]instanceof Number?t[i]-e[i]:void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function mul(t,e){var s,r=typeof t,i=typeof e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t*e;var a,n;if(t.constructor===Array&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t[a]*e;return s}if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&e.constructor===Array){for(n=e.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t*e[a];return s}return 0}function div(t,e){var s,r=typeof t,i=typeof e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t/e;var a,n;if(t.constructor===Array&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t[a]/e;return s}if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&e.constructor===Array){for(n=e.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t/e[a];return s}return 0}function clamp(t,e,s){if(e>s){var r=s;s=e,e=r}return Math.min(Math.max(t,e),s)}function radiansToDegrees(t){return t/degToRads}function degreesToRadians(t){return t*degToRads}function length(t,e){if("number"==typeof t)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var s,r=Math.min(t.length,e.length),i=0;for(s=0;r>s;s+=1)i+=Math.pow(e[s]-t[s],2);return Math.sqrt(i)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,s,r=t[0],i=t[1],a=t[2],n=Math.max(r,i,a),o=Math.min(r,i,a),h=(n+o)/2;if(n==o)e=s=0;else{var l=n-o;switch(s=h>.5?l/(2-n-o):l/(n+o),n){case r:e=(i-a)/l+(a>i?6:0);break;case i:e=(a-r)/l+2;break;case a:e=(r-i)/l+4}e/=6}return[e,s,h,t[3]]}function hslToRgb(t){function e(t,e,s){return 0>s&&(s+=1),s>1&&(s-=1),1/6>s?t+6*(e-t)*s:.5>s?e:2/3>s?t+(e-t)*(2/3-s)*6:t}var s,r,i,a=t[0],n=t[1],o=t[2];if(0==n)s=r=i=o;else{var h=.5>o?o*(1+n):o+n-o*n,l=2*o-h;s=e(l,h,a+1/3),r=e(l,h,a),i=e(l,h,a-1/3)}return[s,r,i,t[3]]}function linear(t,e,s,r,i){if(void 0===r||void 0===i)return linear(t,0,1,e,s);if(e>=t)return r;if(t>=s)return i;var a=s===e?0:(t-e)/(s-e);if(!r.length)return r+(i-r)*a;var n,o=r.length,h=Array.apply(null,{length:o});for(n=0;o>n;n+=1)h[n]=r[n]+(i[n]-r[n])*a;return h}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var s,r=e.length;t||(t=Array.apply(null,{length:r}));var i=Array.apply(null,{length:r}),a=BMMath.random();for(s=0;r>s;s+=1)i[s]=t[s]+a*(e[s]-t[s]);return i}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function initiateExpression(elem,data,property){function lookAt(t,e){var s=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],r=Math.atan2(s[0],Math.sqrt(s[1]*s[1]+s[2]*s[2]))/degToRads,i=-Math.atan2(s[1],s[2])/degToRads;return[i,r,0]}function easeOut(t,e,s){return-(s-e)*t*(t-2)+e}function nearestKey(t){var e,s,r,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(s=-1,t*=elem.comp.globalData.frameRate,t<data.k[0].t)s=1,r=data.k[0].t;else{for(e=0;i-1>e;e+=1){if(t===data.k[e].t){s=e+1,r=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){t-data.k[e].t>data.k[e+1].t-t?(s=e+2,r=data.k[e+1].t):(s=e+1,r=data.k[e].t);break}}-1===s&&(s=e+1,r=data.k[e].t)}else s=0,r=0;var a={};return a.index=s,a.time=r/elem.comp.globalData.frameRate,a}function key(t){if(!data.k.length||"number"==typeof data.k[0])return{time:0};t-=1;var e,s={time:data.k[t].t/elem.comp.globalData.frameRate};e=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t-1].e;var r,i=e.length;for(r=0;i>r;r+=1)s[r]=e[r];return s}function framesToTime(t,e){return e||(e=elem.comp.globalData.frameRate),t/e}function timeToFrames(t,e){return t||(t=time),e||(e=elem.comp.globalData.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function execute(){if(_needsRandom&&seedRandom(randSeed),this.frameExpressionId!==elem.globalData.frameId||"textSelector"===this.type){if(this.lock)return this.v=duplicatePropertyValue(this.pv,this.mult),!0;"textSelector"===this.type&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer)),transform||(transform=elem.layerInterface("ADBE Transform Group")),anchorPoint=transform.anchorPoint,4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!(!elem.hierarchy||!elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[0].layerInterface),this.lock=!0,this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp.globalData.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),bindedFn(),this.frameExpressionId=elem.globalData.frameId;var t,e;if(this.mult)if("number"==typeof this.v||this.v instanceof Number||"string"==typeof this.v)this.v*=this.mult;else if(1===this.v.length)this.v=this.v[0]*this.mult;else for(e=this.v.length,value===this.v&&(this.v=2===e?[value[0],value[1]]:[value[0],value[1],value[2]]),t=0;e>t;t+=1)this.v[t]*=this.mult;if(1===this.v.length&&(this.v=this.v[0]),"number"==typeof this.v||this.v instanceof Number||"string"==typeof this.v)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if(this.v._length)shapesEqual(this.v,this.localShapeCollection.shapes[0])||(this.mdf=!0,this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(shape_pool.clone(this.v)));else for(e=this.v.length,t=0;e>t;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0);this.lock=!1}}var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=-1!==val.indexOf("random"),elemType=elem.data.ty,transform,content,effect,thisComp=elem.comp,thisProperty=property;elem.comp.frameDuration=1/elem.comp.globalData.frameRate;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,toWorld,fromWorld,anchorPoint,thisLayer,thisComp,fn=new Function,fn=eval("[function(){"+val+";this.v = $bm_rt;}]")[0],bindedFn=fn.bind(this),numKeys=property.kf?data.k.length:0,wiggle=function(t,e){var s,r,i=this.pv.length?this.pv.length:1,a=Array.apply(null,{len:i});for(r=0;i>r;r+=1)a[r]=0;t=5;var n=Math.floor(time*t);for(s=0,r=0;n>s;){for(r=0;i>r;r+=1)a[r]+=-e+2*e*BMMath.random();s+=1}var o=time*t,h=o-Math.floor(o),l=Array.apply({length:i});if(i>1){for(r=0;i>r;r+=1)l[r]=this.pv[r]+a[r]+(-e+2*e*BMMath.random())*h;return l}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this),loopIn=function(t,e,s){if(!this.k)return this.pv;var r=time*elem.comp.globalData.frameRate,i=this.keyframes,a=i[0].t;if(r>=a)return this.pv;var n,o;s?(n=e?Math.abs(elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-a),o=a+n):((!e||e>i.length-1)&&(e=i.length-1),o=i[e].t,n=o-a);var h,l,p;if("pingpong"===t){var m=Math.floor((a-r)/n);if(m%2===0)return this.getValueAtTime(((a-r)%n+a)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(a/this.comp.globalData.frameRate,0),c=this.getValueAtTime(o/this.comp.globalData.frameRate,0),d=this.getValueAtTime((n-(a-r)%n+a)/this.comp.globalData.frameRate,0),u=Math.floor((a-r)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=d[h]-(c[h]-f[h])*u;return p}return d-(c-f)*u}if("continue"===t){var y=this.getValueAtTime(a/this.comp.globalData.frameRate,0),g=this.getValueAtTime((a+.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-g[h])*(a-r)/.001;return p}return y+(y-g)*(a-r)/.001}}return this.getValueAtTime((n-(a-r)%n+a)/this.comp.globalData.frameRate,0)}.bind(this),loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOut=function(t,e,s){if(!this.k||!this.keyframes)return this.pv;var r=time*elem.comp.globalData.frameRate,i=this.keyframes,a=i[i.length-1].t;if(a>=r)return this.pv;var n,o;s?(n=e?Math.abs(a-elem.comp.globalData.frameRate*e):Math.max(0,a-this.elem.data.ip),o=a-n):((!e||e>i.length-1)&&(e=i.length-1),o=i[i.length-1-e].t,n=a-o);var h,l,p;if("pingpong"===t){var m=Math.floor((r-o)/n);if(m%2!==0)return this.getValueAtTime((n-(r-o)%n+o)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(o/this.comp.globalData.frameRate,0),c=this.getValueAtTime(a/this.comp.globalData.frameRate,0),d=this.getValueAtTime(((r-o)%n+o)/this.comp.globalData.frameRate,0),u=Math.floor((r-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=(c[h]-f[h])*u+d[h];return p}return(c-f)*u+d}if("continue"===t){var y=this.getValueAtTime(a/this.comp.globalData.frameRate,0),g=this.getValueAtTime((a-.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-g[h])*((r-a)/this.comp.globalData.frameRate)/5e-4;return p}return y+(y-g)*((r-a)/.001)}}return this.getValueAtTime(((r-o)%n+o)/this.comp.globalData.frameRate,0)}.bind(this),loop_out=loopOut,loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this),valueAtTime=function(t){return this.getValueAtTime(t,0)}.bind(this),velocityAtTime=function(t){return this.getVelocityAtTime(t)}.bind(this),comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface),time,velocity,value,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent,randSeed=Math.floor(1e6*Math.random());return execute}var ob={},Math=BMMath,window=null,document=null,add=sum,radians_to_degrees=radiansToDegrees,degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];return ob.initiateExpression=initiateExpression,ob}(),ShapeExpressionInterface=function(){function t(t,e,s){return d(t,e,s)}function e(t,e,s){return y(t,e,s)}function s(t,e,s){return g(t,e,s)}function r(t,e,s){return v(t,e,s)}function i(t,e,s){return b(t,e,s)}function a(t,e,s){return E(t,e,s)}function n(t,e,s){return P(t,e,s)}function o(t,e,s){return x(t,e,s)}function h(t,e,s){return S(t,e,s)}function l(t,e,s){return C(t,e,s)}function p(t,e,s){return k(t,e,s)}function m(t,e,s){return M(t,e,s)}function f(t,e,s){var r,i=[],a=t?t.length:0;for(r=0;a>r;r+=1)"gr"==t[r].ty?i.push(ShapeExpressionInterface.createGroupInterface(t[r],e[r],s)):"fl"==t[r].ty?i.push(ShapeExpressionInterface.createFillInterface(t[r],e[r],s)):"st"==t[r].ty?i.push(ShapeExpressionInterface.createStrokeInterface(t[r],e[r],s)):"tm"==t[r].ty?i.push(ShapeExpressionInterface.createTrimInterface(t[r],e[r],s)):"tr"==t[r].ty||("el"==t[r].ty?i.push(ShapeExpressionInterface.createEllipseInterface(t[r],e[r],s)):"sr"==t[r].ty?i.push(ShapeExpressionInterface.createStarInterface(t[r],e[r],s)):"sh"==t[r].ty?i.push(ShapeExpressionInterface.createPathInterface(t[r],e[r],s)):"rc"==t[r].ty?i.push(ShapeExpressionInterface.createRectInterface(t[r],e[r],s)):"rd"==t[r].ty?i.push(ShapeExpressionInterface.createRoundedInterface(t[r],e[r],s)):"rp"==t[r].ty&&i.push(ShapeExpressionInterface.createRepatearInterface(t[r],e[r],s)));return i}var c={createShapeInterface:t,createGroupInterface:e,createTrimInterface:i,createStrokeInterface:r,createTransformInterface:a,createEllipseInterface:n,createStarInterface:o,createRectInterface:h,createRoundedInterface:l,createRepatearInterface:p,createPathInterface:m,createFillInterface:s},d=function(){return function(t,e,s){function r(t){if("number"==typeof t)return i[t-1];for(var e=0,s=i.length;s>e;){if(i[e]._name===t)return i[e];e+=1}}var i;return r.propertyGroup=s,i=f(t,e,r),r}}(),u=function(){return function(t,e,s){var r,i=function(t){for(var e=0,s=r.length;s>e;){if(r[e]._name===t||r[e].mn===t||r[e].propertyIndex===t||r[e].ix===t||r[e].ind===t)return r[e];e+=1}return"number"==typeof t?r[t-1]:void 0};return i.propertyGroup=function(t){return 1===t?i:s(t-1);
+},BaseElement.prototype.setBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}var e=this.baseElement||this.layerElement;e.style["mix-blend-mode"]=t},BaseElement.prototype.init=function(){this.data.sr||(this.data.sr=1),this.dynamicProperties=[],this.data.ef&&(this.effects=new EffectsManager(this.data,this,this.dynamicProperties)),this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this._isParent=!1,this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ks&&(this.finalTransform={mProp:PropertyFactory.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new Matrix,opacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,11!==this.data.ty&&this.createElements(),this.data.hasMask&&this.addMasks(this.data)),this.elemMdf=!1},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.setHierarchy=function(t){this.hierarchy=t},BaseElement.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.hide=function(){},BaseElement.prototype.mHelper=new Matrix,createElement(BaseElement,SVGBaseElement),SVGBaseElement.prototype.createElements=function(){this.layerElement=document.createElementNS(svgNS,"g"),this.transformedElement=this.layerElement,this.data.hasMask&&(this.maskedElement=this.layerElement);var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=document.createElementNS(svgNS,"mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this.layerElement),t=e,this.globalData.defs.appendChild(e),!featureSupport.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=randomString(10),r=filtersFactory.createFilter(s);this.globalData.defs.appendChild(r),r.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=document.createElementNS(svgNS,"g");i.appendChild(this.layerElement),t=i,e.appendChild(i),i.setAttribute("filter","url(#"+s+")")}}else if(2==this.data.td){var a=document.createElementNS(svgNS,"mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=document.createElementNS(svgNS,"g");a.appendChild(n);var s=randomString(10),r=filtersFactory.createFilter(s),o=document.createElementNS(svgNS,"feColorMatrix");o.setAttribute("type","matrix"),o.setAttribute("color-interpolation-filters","sRGB"),o.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),r.appendChild(o),this.globalData.defs.appendChild(r);var h=document.createElementNS(svgNS,"rect");if(h.setAttribute("width",this.comp.data.w),h.setAttribute("height",this.comp.data.h),h.setAttribute("x","0"),h.setAttribute("y","0"),h.setAttribute("fill","#ffffff"),h.setAttribute("opacity","0"),n.setAttribute("filter","url(#"+s+")"),n.appendChild(h),n.appendChild(this.layerElement),t=n,!featureSupport.maskType){a.setAttribute("mask-type","luminance"),r.appendChild(filtersFactory.createAlphaToLuminanceFilter());var i=document.createElementNS(svgNS,"g");n.appendChild(h),i.appendChild(this.layerElement),t=i,n.appendChild(i)}this.globalData.defs.appendChild(a)}}else(this.data.hasMask||this.data.tt)&&this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),t=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)),0===this.data.ty){var l=document.createElementNS(svgNS,"clipPath"),p=document.createElementNS(svgNS,"path");p.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m="cp_"+randomString(8);if(l.setAttribute("id",m),l.appendChild(p),this.globalData.defs.appendChild(l),this.checkMasks()){var f=document.createElementNS(svgNS,"g");f.setAttribute("clip-path","url(#"+m+")"),f.appendChild(this.layerElement),this.transformedElement=f,t?t.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url(#"+m+")")}0!==this.data.bm&&this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.ef&&(this.effectsManager=new SVGEffects(this)),this.checkParenting()},SVGBaseElement.prototype.setBlendMode=BaseElement.prototype.setBlendMode,SVGBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty||this.data.hd||!this.isVisible)return!1;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.firstFrame||this.finalTransform.op.mdf,this.finalTransform.matMdf=this.firstFrame||this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var r=0,i=this.hierarchy.length;if(!this.finalTransform.matMdf)for(;i>r;){if(this.hierarchy[r].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}r+=1}if(this.finalTransform.matMdf)for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&(s=this.finalTransform.mProp.v);return this.finalTransform.matMdf&&this.layerElement&&this.transformedElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement&&(this.finalTransform.op.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.hidden&&this.isTransparent&&(this.isTransparent=!1,this.show()),this.transformedElement.setAttribute("opacity",this.finalTransform.op.v)),this.data.hasMask&&this.maskManager.renderFrame(s),this.effectsManager&&this.effectsManager.renderFrame(this.firstFrame),this.isVisible},SVGBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},SVGBaseElement.prototype.getBaseElement=function(){return this.baseElement},SVGBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},SVGBaseElement.prototype.show=function(){this.isVisible&&!this.isTransparent&&(this.hidden=!1,this.layerElement.style.display="block")},createElement(SVGBaseElement,IShapeElement),IShapeElement.prototype.identityMatrix=new Matrix,IShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},IShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},IShapeElement.prototype.buildExpressionInterface=function(){},IShapeElement.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),(!this.data.hd||this.data.td)&&styleUnselectableDiv(this.layerElement)},IShapeElement.prototype.setGradientData=function(t,e,s){var r,i="gr_"+randomString(10);r=1===e.t?document.createElementNS(svgNS,"linearGradient"):document.createElementNS(svgNS,"radialGradient"),r.setAttribute("id",i),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse");var a,n,o,h=[];for(o=4*e.g.p,n=0;o>n;n+=4)a=document.createElementNS(svgNS,"stop"),r.appendChild(a),h.push(a);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+i+")"),this.globalData.defs.appendChild(r),s.gf=r,s.cst=h},IShapeElement.prototype.setGradientOpacity=function(t,e,s){if(t.g.k.k[0].s&&t.g.k.k[0].s.length>4*t.g.p||t.g.k.k.length>4*t.g.p){var r,i,a,n,o=document.createElementNS(svgNS,"mask"),h=document.createElementNS(svgNS,"path");o.appendChild(h);var l="op_"+randomString(10),p="mk_"+randomString(10);o.setAttribute("id",p),r=1===t.t?document.createElementNS(svgNS,"linearGradient"):document.createElementNS(svgNS,"radialGradient"),r.setAttribute("id",l),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse"),n=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var m=[];for(a=4*t.g.p;n>a;a+=2)i=document.createElementNS(svgNS,"stop"),i.setAttribute("stop-color","rgb(255,255,255)"),r.appendChild(i),m.push(i);return h.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+l+")"),this.globalData.defs.appendChild(r),this.globalData.defs.appendChild(o),e.of=r,e.ost=m,s.msElem=h,p}},IShapeElement.prototype.searchShapes=function(t,e,s,r,i,a){a=a||[];var n,o,h,l,p,m=[].concat(a),f=t.length-1,c=[],d=[];for(n=f;n>=0;n-=1)if("fl"==t[n].ty||"st"==t[n].ty||"gf"==t[n].ty||"gs"==t[n].ty){e[n]={},l={type:t[n].ty,d:"",ld:"",lvl:i,mdf:!1};var u=document.createElementNS(svgNS,"path");if(e[n].o=PropertyFactory.getProp(this,t[n].o,0,.01,r),("st"==t[n].ty||"gs"==t[n].ty)&&(u.setAttribute("stroke-linecap",this.lcEnum[t[n].lc]||"round"),u.setAttribute("stroke-linejoin",this.ljEnum[t[n].lj]||"round"),u.setAttribute("fill-opacity","0"),1==t[n].lj&&u.setAttribute("stroke-miterlimit",t[n].ml),e[n].w=PropertyFactory.getProp(this,t[n].w,0,null,r),t[n].d)){var y=PropertyFactory.getDashProp(this,t[n].d,"svg",r);y.k||(u.setAttribute("stroke-dasharray",y.dasharray),u.setAttribute("stroke-dashoffset",y.dashoffset)),e[n].d=y}if("fl"==t[n].ty||"st"==t[n].ty)e[n].c=PropertyFactory.getProp(this,t[n].c,1,255,r),s.appendChild(u);else{e[n].g=PropertyFactory.getGradientProp(this,t[n].g,r),2==t[n].t&&(e[n].h=PropertyFactory.getProp(this,t[n].h,1,.01,r),e[n].a=PropertyFactory.getProp(this,t[n].a,1,degToRads,r)),e[n].s=PropertyFactory.getProp(this,t[n].s,1,null,r),e[n].e=PropertyFactory.getProp(this,t[n].e,1,null,r),this.setGradientData(u,t[n],e[n],l);var g=this.setGradientOpacity(t[n],e[n],l);g&&u.setAttribute("mask","url(#"+g+")"),e[n].elem=u,s.appendChild(u)}2===t[n].r&&u.setAttribute("fill-rule","evenodd"),t[n].ln&&u.setAttribute("id",t[n].ln),t[n].cl&&u.setAttribute("class",t[n].cl),l.pElem=u,this.stylesList.push(l),e[n].style=l,c.push(l)}else if("gr"==t[n].ty){e[n]={it:[]};var v=document.createElementNS(svgNS,"g");s.appendChild(v),e[n].gr=v,this.searchShapes(t[n].it,e[n].it,v,r,i+1,m)}else if("tr"==t[n].ty)e[n]={transform:{op:PropertyFactory.getProp(this,t[n].o,0,.01,r),mProps:PropertyFactory.getProp(this,t[n],2,null,r)},elements:[]},p=e[n].transform,m.push(p);else if("sh"==t[n].ty||"rc"==t[n].ty||"el"==t[n].ty||"sr"==t[n].ty){e[n]={elements:[],caches:[],styles:[],transformers:m,lStr:""};var b=4;for("rc"==t[n].ty?b=5:"el"==t[n].ty?b=6:"sr"==t[n].ty&&(b=7),e[n].sh=ShapePropertyFactory.getShapeProp(this,t[n],b,r),e[n].lvl=i,this.shapes.push(e[n].sh),this.addShapeToModifiers(e[n]),h=this.stylesList.length,o=0;h>o;o+=1)this.stylesList[o].closed||e[n].elements.push({ty:this.stylesList[o].type,st:this.stylesList[o]})}else if("tm"==t[n].ty||"rd"==t[n].ty||"ms"==t[n].ty||"rp"==t[n].ty){var E=ShapeModifiers.getModifier(t[n].ty);E.init(this,t[n],r),this.shapeModifiers.push(E),d.push(E),e[n]=E}for(f=c.length,n=0;f>n;n+=1)c[n].closed=!0;for(f=d.length,n=0;f>n;n+=1)d[n].closed=!0},IShapeElement.prototype.addShapeToModifiers=function(t){var e,s=this.shapeModifiers.length;for(e=0;s>e;e+=1)this.shapeModifiers[e].addShape(t)},IShapeElement.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;e>t;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},IShapeElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.globalToLocal([0,0,0]),this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),void this.renderShape(null,null,!0,null))},IShapeElement.prototype.hide=function(){if(!this.hidden){this.layerElement.style.display="none";var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pElem.style.display="none",this.stylesList[t].pElem.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pElem.parentNode));this.hidden=!0}},IShapeElement.prototype.renderShape=function(t,e,s,r){var i,a;if(!t)for(t=this.shapesData,a=this.stylesList.length,i=0;a>i;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;e||(e=this.viewData),a=t.length-1;var n;for(i=a;i>=0;i-=1)n=t[i].ty,"tr"==n?((this.firstFrame||e[i].transform.op.mdf&&r)&&r.setAttribute("opacity",e[i].transform.op.v),(this.firstFrame||e[i].transform.mProps.mdf&&r)&&r.setAttribute("transform",e[i].transform.mProps.v.to2dCSS())):"sh"==n||"el"==n||"rc"==n||"sr"==n?this.renderPath(t[i],e[i]):"fl"==n?this.renderFill(t[i],e[i]):"gf"==n?this.renderGradient(t[i],e[i]):"gs"==n?(this.renderGradient(t[i],e[i]),this.renderStroke(t[i],e[i])):"st"==n?this.renderStroke(t[i],e[i]):"gr"==n&&this.renderShape(t[i].it,e[i].it,!1,e[i].gr);if(s){for(a=this.stylesList.length,i=0;a>i;i+=1)"0"===this.stylesList[i].ld&&(this.stylesList[i].ld="1",this.stylesList[i].pElem.style.display="block"),(this.stylesList[i].mdf||this.firstFrame)&&(this.stylesList[i].pElem.setAttribute("d",this.stylesList[i].d),this.stylesList[i].msElem&&this.stylesList[i].msElem.setAttribute("d",this.stylesList[i].d));this.firstFrame&&(this.firstFrame=!1)}},IShapeElement.prototype.buildShapeString=function(t,e,s,r){var i,a="";for(i=1;e>i;i+=1)1===i&&(a+=" M"+r.applyToPointStringified(t.v[0][0],t.v[0][1])),a+=" C"+r.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+r.applyToPointStringified(t.i[i][0],t.i[i][1])+" "+r.applyToPointStringified(t.v[i][0],t.v[i][1]);return 1===e&&(a+=" M"+r.applyToPointStringified(t.v[0][0],t.v[0][1])),s&&e&&(a+=" C"+r.applyToPointStringified(t.o[i-1][0],t.o[i-1][1])+" "+r.applyToPointStringified(t.i[0][0],t.i[0][1])+" "+r.applyToPointStringified(t.v[0][0],t.v[0][1]),a+="z"),a},IShapeElement.prototype.renderPath=function(t,e){var s,r,i,a,n,o,h=e.elements.length,l=e.lvl;for(o=0;h>o;o+=1){a=e.sh.mdf||this.firstFrame,i="M0 0";var p=e.sh.paths;if(r=p._length,e.elements[o].st.lvl<l){for(var m,f=this.mHelper.reset(),c=l-e.elements[o].st.lvl,d=e.transformers.length-1;c>0;)a=e.transformers[d].mProps.mdf||a,m=e.transformers[d].mProps.v.props,f.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]),c--,d--;if(a){for(s=0;r>s;s+=1)n=p.shapes[s],n&&n._length&&(i+=this.buildShapeString(n,n._length,n.c,f));e.caches[o]=i}else i=e.caches[o]}else if(a){for(s=0;r>s;s+=1)n=p.shapes[s],n&&n._length&&(i+=this.buildShapeString(n,n._length,n.c,this.identityMatrix));e.caches[o]=i}else i=e.caches[o];e.elements[o].st.d+=i,e.elements[o].st.mdf=a||e.elements[o].st.mdf}},IShapeElement.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("fill","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("fill-opacity",e.o.v)},IShapeElement.prototype.renderGradient=function(t,e){var s=e.gf,r=e.of,i=e.s.v,a=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.elem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var o=1===t.t?"x1":"cx",h="x1"===o?"y1":"cy";s.setAttribute(o,i[0]),s.setAttribute(h,i[1]),r&&(r.setAttribute(o,i[0]),r.setAttribute(h,i[1]))}var l,p,m,f;if(e.g.cmdf||this.firstFrame){l=e.cst;var c=e.g.c;for(m=l.length,p=0;m>p;p+=1)f=l[p],f.setAttribute("offset",c[4*p]+"%"),f.setAttribute("stop-color","rgb("+c[4*p+1]+","+c[4*p+2]+","+c[4*p+3]+")")}if(r&&(e.g.omdf||this.firstFrame)){l=e.ost;var d=e.g.o;for(m=l.length,p=0;m>p;p+=1)f=l[p],f.setAttribute("offset",d[2*p]+"%"),f.setAttribute("stop-opacity",d[2*p+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(s.setAttribute("x2",a[0]),s.setAttribute("y2",a[1]),r&&(r.setAttribute("x2",a[0]),r.setAttribute("y2",a[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)),s.setAttribute("r",u),r&&r.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)));var y=Math.atan2(a[1]-i[1],a[0]-i[0]),g=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*g,b=Math.cos(y+e.a.v)*v+i[0],E=Math.sin(y+e.a.v)*v+i[1];s.setAttribute("fx",b),s.setAttribute("fy",E),r&&(r.setAttribute("fx",b),r.setAttribute("fy",E))}}},IShapeElement.prototype.renderStroke=function(t,e){var s=e.style,r=e.d;r&&r.k&&(r.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-dasharray",r.dasharray),s.pElem.setAttribute("stroke-dashoffset",r.dashoffset)),e.c&&(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},IShapeElement.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},ITextElement.prototype.init=function(){this._parent.init.call(this),this.lettersChangedFlag=!1,this.currentTextDocumentData={};var t=this.data;this.viewData={m:{a:PropertyFactory.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,r,i,a=e.a.length;for(s=0;a>s;s+=1)i=e.a[s],r={a:{},s:{}},"r"in i.a&&(r.a.r=PropertyFactory.getProp(this,i.a.r,0,degToRads,this.dynamicProperties)),"rx"in i.a&&(r.a.rx=PropertyFactory.getProp(this,i.a.rx,0,degToRads,this.dynamicProperties)),"ry"in i.a&&(r.a.ry=PropertyFactory.getProp(this,i.a.ry,0,degToRads,this.dynamicProperties)),"sk"in i.a&&(r.a.sk=PropertyFactory.getProp(this,i.a.sk,0,degToRads,this.dynamicProperties)),"sa"in i.a&&(r.a.sa=PropertyFactory.getProp(this,i.a.sa,0,degToRads,this.dynamicProperties)),"s"in i.a&&(r.a.s=PropertyFactory.getProp(this,i.a.s,1,.01,this.dynamicProperties)),"a"in i.a&&(r.a.a=PropertyFactory.getProp(this,i.a.a,1,0,this.dynamicProperties)),"o"in i.a&&(r.a.o=PropertyFactory.getProp(this,i.a.o,0,.01,this.dynamicProperties)),"p"in i.a&&(r.a.p=PropertyFactory.getProp(this,i.a.p,1,0,this.dynamicProperties)),"sw"in i.a&&(r.a.sw=PropertyFactory.getProp(this,i.a.sw,0,0,this.dynamicProperties)),"sc"in i.a&&(r.a.sc=PropertyFactory.getProp(this,i.a.sc,1,0,this.dynamicProperties)),"fc"in i.a&&(r.a.fc=PropertyFactory.getProp(this,i.a.fc,1,0,this.dynamicProperties)),"fh"in i.a&&(r.a.fh=PropertyFactory.getProp(this,i.a.fh,0,0,this.dynamicProperties)),"fs"in i.a&&(r.a.fs=PropertyFactory.getProp(this,i.a.fs,0,.01,this.dynamicProperties)),"fb"in i.a&&(r.a.fb=PropertyFactory.getProp(this,i.a.fb,0,.01,this.dynamicProperties)),"t"in i.a&&(r.a.t=PropertyFactory.getProp(this,i.a.t,0,0,this.dynamicProperties)),r.s=PropertyFactory.getTextSelectorProp(this,i.s,this.dynamicProperties),r.s.t=i.s.t,this.viewData.a[s]=r}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:PropertyFactory.getProp(this,e.p.f,0,0,this.dynamicProperties),l:PropertyFactory.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},ITextElement.prototype.prepareFrame=function(t){var e=0,s=this.data.t.d.k.length,r=this.data.t.d.k[e].s;for(e+=1;s>e&&!(this.data.t.d.k[e].t>t);)r=this.data.t.d.k[e].s,e+=1;this.lettersChangedFlag=!1,r!==this.currentTextDocumentData&&(this.currentTextDocumentData=r,this.lettersChangedFlag=!0,this.buildNewText()),this._parent.prepareFrame.call(this,t)},ITextElement.prototype.createPathShape=function(t,e){var s,r,i=e.length,a="";for(s=0;i>s;s+=1)r=e[s].ks.k,a+=this.buildShapeString(r,r.i.length,!0,t);return a},ITextElement.prototype.getMeasures=function(){var t,e,s,r,i=this.mHelper,a=this.renderType,n=this.data,o=this.currentTextDocumentData,h=o.l;if(this.maskPath){var l=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var p=l.v;this.viewData.p.r&&(p=reversePath(p));var m={tLength:0,segments:[]};r=p.v.length-1;var f,c=0;for(s=0;r>s;s+=1)f={s:p.v[s],e:p.v[s+1],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[s+1][0]-p.v[s+1][0],p.i[s+1][1]-p.v[s+1][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),c+=f.bezierData.segmentLength;s=r,l.v.c&&(f={s:p.v[s],e:p.v[0],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[0][0]-p.v[0][0],p.i[0][1]-p.v[0][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),c+=f.bezierData.segmentLength),this.viewData.p.pi=m}var d,u,y,m=this.viewData.p.pi,g=this.viewData.p.f.v,v=0,b=1,E=0,P=!0,x=m.segments;if(0>g&&l.v.c)for(m.tLength<Math.abs(g)&&(g=-Math.abs(g)%m.tLength),v=x.length-1,y=x[v].bezierData.points,b=y.length-1;0>g;)g+=y[b].partialLength,b-=1,0>b&&(v-=1,y=x[v].bezierData.points,b=y.length-1);y=x[v].bezierData.points,u=y[b-1],d=y[b];var S,C,k=d.partialLength}r=h.length,t=0,e=0;var M,A,D,w,T,F=1.2*o.s*.714,I=!0,_=this.viewData,V=Array.apply(null,{length:r});w=_.a.length;var R,B,N,L,G,O,j,z,H,W,Y,X,q,U,Z,J,K=-1,Q=g,$=v,tt=b,et=-1,st=0;for(s=0;r>s;s+=1)if(i.reset(),O=1,h[s].n)t=0,e+=o.yOffset,e+=I?1:0,g=Q,I=!1,st=0,this.maskPath&&(v=$,b=tt,y=x[v].bezierData.points,u=y[b-1],d=y[b],k=d.partialLength,E=0),V[s]=this.emptyProp;else{if(this.maskPath){if(et!==h[s].line){switch(o.j){case 1:g+=c-o.lineWidths[h[s].line];break;case 2:g+=(c-o.lineWidths[h[s].line])/2}et=h[s].line}K!==h[s].ind&&(h[K]&&(g+=h[K].extra),g+=h[s].an/2,K=h[s].ind),g+=_.m.a.v[0]*h[s].an/200;var rt=0;for(D=0;w>D;D+=1)M=_.a[D].a,"p"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),rt+=B.length?M.p.v[0]*B[0]:M.p.v[0]*B),"a"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),rt+=B.length?M.a.v[0]*B[0]:M.a.v[0]*B);for(P=!0;P;)E+k>=g+rt||!y?(S=(g+rt-E)/d.partialLength,L=u.point[0]+(d.point[0]-u.point[0])*S,G=u.point[1]+(d.point[1]-u.point[1])*S,i.translate(-_.m.a.v[0]*h[s].an/200,-(_.m.a.v[1]*F/100)),P=!1):y&&(E+=d.partialLength,b+=1,b>=y.length&&(b=0,v+=1,x[v]?y=x[v].bezierData.points:l.v.c?(b=0,v=0,y=x[v].bezierData.points):(E-=d.partialLength,y=null)),y&&(u=d,d=y[b],k=d.partialLength));N=h[s].an/2-h[s].add,i.translate(-N,0,0)}else N=h[s].an/2-h[s].add,i.translate(-N,0,0),i.translate(-_.m.a.v[0]*h[s].an/200,-_.m.a.v[1]*F/100,0);for(st+=h[s].l/2,D=0;w>D;D+=1)M=_.a[D].a,"t"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),this.maskPath?g+=B.length?M.t*B[0]:M.t*B:t+=B.length?M.t.v*B[0]:M.t.v*B);for(st+=h[s].l/2,o.strokeWidthAnim&&(z=o.sw||0),o.strokeColorAnim&&(j=o.sc?[o.sc[0],o.sc[1],o.sc[2]]:[0,0,0]),o.fillColorAnim&&(H=[o.fc[0],o.fc[1],o.fc[2]]),D=0;w>D;D+=1)M=_.a[D].a,"a"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),B.length?i.translate(-M.a.v[0]*B[0],-M.a.v[1]*B[1],M.a.v[2]*B[2]):i.translate(-M.a.v[0]*B,-M.a.v[1]*B,M.a.v[2]*B));for(D=0;w>D;D+=1)M=_.a[D].a,"s"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),B.length?i.scale(1+(M.s.v[0]-1)*B[0],1+(M.s.v[1]-1)*B[1],1):i.scale(1+(M.s.v[0]-1)*B,1+(M.s.v[1]-1)*B,1));for(D=0;w>D;D+=1){if(M=_.a[D].a,A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),"sk"in M&&(B.length?i.skewFromAxis(-M.sk.v*B[0],M.sa.v*B[1]):i.skewFromAxis(-M.sk.v*B,M.sa.v*B)),"r"in M&&i.rotateZ(B.length?-M.r.v*B[2]:-M.r.v*B),"ry"in M&&i.rotateY(B.length?M.ry.v*B[1]:M.ry.v*B),"rx"in M&&i.rotateX(B.length?M.rx.v*B[0]:M.rx.v*B),"o"in M&&(O+=B.length?(M.o.v*B[0]-O)*B[0]:(M.o.v*B-O)*B),o.strokeWidthAnim&&"sw"in M&&(z+=B.length?M.sw.v*B[0]:M.sw.v*B),o.strokeColorAnim&&"sc"in M)for(W=0;3>W;W+=1)j[W]=Math.round(B.length?255*(j[W]+(M.sc.v[W]-j[W])*B[0]):255*(j[W]+(M.sc.v[W]-j[W])*B));if(o.fillColorAnim){if("fc"in M)for(W=0;3>W;W+=1)H[W]=B.length?H[W]+(M.fc.v[W]-H[W])*B[0]:H[W]+(M.fc.v[W]-H[W])*B;"fh"in M&&(H=B.length?addHueToRGB(H,M.fh.v*B[0]):addHueToRGB(H,M.fh.v*B)),"fs"in M&&(H=B.length?addSaturationToRGB(H,M.fs.v*B[0]):addSaturationToRGB(H,M.fs.v*B)),"fb"in M&&(H=B.length?addBrightnessToRGB(H,M.fb.v*B[0]):addBrightnessToRGB(H,M.fb.v*B))}}for(D=0;w>D;D+=1)M=_.a[D].a,"p"in M&&(A=_.a[D].s,B=A.getMult(h[s].anIndexes[D],n.t.a[D].s.totalChars),this.maskPath?B.length?i.translate(0,M.p.v[1]*B[0],-M.p.v[2]*B[1]):i.translate(0,M.p.v[1]*B,-M.p.v[2]*B):B.length?i.translate(M.p.v[0]*B[0],M.p.v[1]*B[1],-M.p.v[2]*B[2]):i.translate(M.p.v[0]*B,M.p.v[1]*B,-M.p.v[2]*B));if(o.strokeWidthAnim&&(Y=0>z?0:z),o.strokeColorAnim&&(X="rgb("+Math.round(255*j[0])+","+Math.round(255*j[1])+","+Math.round(255*j[2])+")"),o.fillColorAnim&&(q="rgb("+Math.round(255*H[0])+","+Math.round(255*H[1])+","+Math.round(255*H[2])+")"),this.maskPath){if(i.translate(0,-o.ls),i.translate(0,_.m.a.v[1]*F/100+e,0),n.t.p.p){C=(d.point[1]-u.point[1])/(d.point[0]-u.point[0]);var it=180*Math.atan(C)/Math.PI;d.point[0]<u.point[0]&&(it+=180),i.rotate(-it*Math.PI/180)}i.translate(L,G,0),g-=_.m.a.v[0]*h[s].an/200,h[s+1]&&K!==h[s+1].ind&&(g+=h[s].an/2,g+=o.tr/1e3*o.s)}else{switch(i.translate(t,e,0),o.ps&&i.translate(o.ps[0],o.ps[1]+o.ascent,0),o.j){case 1:i.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line]),0,0);break;case 2:i.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line])/2,0,0)}i.translate(0,-o.ls),i.translate(N,0,0),i.translate(_.m.a.v[0]*h[s].an/200,_.m.a.v[1]*F/100,0),t+=h[s].l+o.tr/1e3*o.s}"html"===a?U=i.toCSS():"svg"===a?U=i.to2dCSS():Z=[i.props[0],i.props[1],i.props[2],i.props[3],i.props[4],i.props[5],i.props[6],i.props[7],i.props[8],i.props[9],i.props[10],i.props[11],i.props[12],i.props[13],i.props[14],i.props[15]],J=O,R=this.renderedLetters[s],!R||R.o===J&&R.sw===Y&&R.sc===X&&R.fc===q?"svg"!==a&&"html"!==a||R&&R.m===U?"canvas"!==a||R&&R.props[0]===Z[0]&&R.props[1]===Z[1]&&R.props[4]===Z[4]&&R.props[5]===Z[5]&&R.props[12]===Z[12]&&R.props[13]===Z[13]?T=R:(this.lettersChangedFlag=!0,T=new LetterProps(J,Y,X,q,null,Z)):(this.lettersChangedFlag=!0,T=new LetterProps(J,Y,X,q,U)):(this.lettersChangedFlag=!0,T=new LetterProps(J,Y,X,q,U,Z)),this.renderedLetters[s]=T}},ITextElement.prototype.buildShapeString=IShapeElement.prototype.buildShapeString,ITextElement.prototype.emptyProp=new LetterProps,createElement(SVGBaseElement,SVGTextElement),SVGTextElement.prototype.init=ITextElement.prototype.init,SVGTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,SVGTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,SVGTextElement.prototype.prepareFrame=ITextElement.prototype.prepareFrame,SVGTextElement.prototype.buildShapeString=ITextElement.prototype.buildShapeString,SVGTextElement.prototype.createElements=function(){this._parent.createElements.call(this),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},SVGTextElement.prototype.buildNewText=function(){var t,e,s=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),s.fc?this.layerElement.setAttribute("fill","rgb("+Math.round(255*s.fc[0])+","+Math.round(255*s.fc[1])+","+Math.round(255*s.fc[2])+")"):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this.layerElement.setAttribute("stroke","rgb("+Math.round(255*s.sc[0])+","+Math.round(255*s.sc[1])+","+Math.round(255*s.sc[2])+")"),this.layerElement.setAttribute("stroke-width",s.sw)),this.layerElement.setAttribute("font-size",s.s);var r=this.globalData.fontManager.getFontByName(s.f);if(r.fClass)this.layerElement.setAttribute("class",r.fClass);else{this.layerElement.setAttribute("font-family",r.fFamily);var i=s.fWeight,a=s.fStyle;this.layerElement.setAttribute("font-style",a),this.layerElement.setAttribute("font-weight",i)}var n=s.l||[];if(e=n.length){var o,h,l=this.mHelper,p="",m=this.data.singleShape;if(m)var f=0,c=0,d=s.lineWidths,u=s.boxWidth,y=!0;var g=0;for(t=0;e>t;t+=1){if(this.globalData.fontManager.chars?m&&0!==t||(o=this.textSpans[g]?this.textSpans[g]:document.createElementNS(svgNS,"path")):o=this.textSpans[g]?this.textSpans[g]:document.createElementNS(svgNS,"text"),o.style.display="inherit",o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4"),m&&n[t].n&&(f=0,c+=s.yOffset,c+=y?1:0,y=!1),l.reset(),this.globalData.fontManager.chars&&l.scale(s.s/100,s.s/100),m){switch(s.ps&&l.translate(s.ps[0],s.ps[1]+s.ascent,0),l.translate(0,-s.ls,0),s.j){case 1:l.translate(s.justifyOffset+(u-d[n[t].line]),0,0);break;case 2:l.translate(s.justifyOffset+(u-d[n[t].line])/2,0,0)}l.translate(f,c,0)}if(this.globalData.fontManager.chars){var v,b=this.globalData.fontManager.getCharData(s.t.charAt(t),r.fStyle,this.globalData.fontManager.getFontByName(s.f).fFamily);v=b?b.data:null,v&&v.shapes&&(h=v.shapes[0].it,m||(p=""),p+=this.createPathShape(l,h),m||o.setAttribute("d",p)),m||this.layerElement.appendChild(o)}else o.textContent=n[t].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.layerElement.appendChild(o),m&&o.setAttribute("transform",l.to2dCSS());m&&(f+=n[t].l||0,f+=s.tr/1e3*s.s),this.textSpans[g]=o,g+=1}if(!m)for(;g<this.textSpans.length;)this.textSpans[g].style.display="none",g+=1;m&&this.globalData.fontManager.chars&&(o.setAttribute("d",p),this.layerElement.appendChild(o))}},SVGTextElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&this.show(),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,r,i=this.renderedLetters,a=this.currentTextDocumentData.l;r=a.length;var n;for(s=0;r>s;s+=1)a[s].n||(n=i[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},SVGTextElement.prototype.destroy=function(){this._parent.destroy.call(this._parent)},SVGTintFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,r=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},SVGFillFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,s=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},SVGStrokeEffect.prototype.initialize=function(){var t,e,s,r,i=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(r=this.elem.maskManager.masksProperties.length,s=0):(s=this.filterManager.effectElements[0].p.v-1,r=s+1),e=document.createElementNS(svgNS,"g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;r>s;s+=1)t=document.createElementNS(svgNS,"path"),
+e.appendChild(t),this.paths.push({p:t,m:s});if(3===this.filterManager.effectElements[10].p.v){var a=document.createElementNS(svgNS,"mask"),n="stms_"+randomString(10);a.setAttribute("id",n),a.setAttribute("mask-type","alpha"),a.appendChild(e),this.elem.globalData.defs.appendChild(a);var o=document.createElementNS(svgNS,"g");o.setAttribute("mask","url(#"+n+")"),i[0]&&o.appendChild(i[0]),this.elem.layerElement.appendChild(o),this.masker=a,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var i=this.elem.layerElement.children||this.elem.layerElement.childNodes;i.length;)this.elem.layerElement.removeChild(i[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},SVGStrokeEffect.prototype.renderFrame=function(t){this.initialized||this.initialize();var e,s,r,i=this.paths.length;for(e=0;i>e;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],r=this.paths[e].p,(t||this.filterManager.mdf||s.prop.mdf)&&r.setAttribute("d",s.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||s.prop.mdf){var a;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=r.getTotalLength();a="0 0 0 "+h*n+" ";var l,p=h*(o-n),m=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,f=Math.floor(p/m);for(l=0;f>l;l+=1)a+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";a+="0 "+10*h+" 0 0"}else a="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;r.setAttribute("stroke-dasharray",a)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var c=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+bm_floor(255*c[0])+","+bm_floor(255*c[1])+","+bm_floor(255*c[2])+")")}},SVGTritoneFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,r=this.filterManager.effectElements[2].p.v,i=r[0]+" "+s[0]+" "+e[0],a=r[1]+" "+s[1]+" "+e[1],n=r[2]+" "+s[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",i),this.feFuncG.setAttribute("tableValues",a),this.feFuncB.setAttribute("tableValues",n)}},SVGProLevelsFilter.prototype.createFeFunc=function(t,e){var s=document.createElementNS(svgNS,t);return s.setAttribute("type","table"),e.appendChild(s),s},SVGProLevelsFilter.prototype.getTableValue=function(t,e,s,r,i){for(var a,n,o=0,h=256,l=Math.min(t,e),p=Math.max(t,e),m=Array.call(null,{length:h}),f=0,c=i-r,d=e-t;256>=o;)a=o/256,n=l>=a?0>d?i:r:a>=p?0>d?r:i:r+c*Math.pow((a-t)/d,1/s),m[f++]=n,o+=256/(h-1);return m.join(" ")},SVGProLevelsFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e,s=this.filterManager.effectElements;this.feFuncRComposed&&(t||s[2].p.mdf||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf)&&(e=this.getTableValue(s[2].p.v,s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[9].p.mdf||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf)&&(e=this.getTableValue(s[9].p.v,s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[16].p.mdf||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf)&&(e=this.getTableValue(s[16].p.v,s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[23].p.mdf||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf)&&(e=this.getTableValue(s[23].p.v,s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[30].p.mdf||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf)&&(e=this.getTableValue(s[30].p.v,s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v),this.feFuncA.setAttribute("tableValues",e))}},SVGDropShadowEffect.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){if((t||this.filterManager.effectElements[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p.mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p.mdf||this.filterManager.effectElements[3].p.mdf){var s=this.filterManager.effectElements[3].p.v,r=(this.filterManager.effectElements[2].p.v-90)*degToRads,i=s*Math.cos(r),a=s*Math.sin(r);this.feOffset.setAttribute("dx",i),this.feOffset.setAttribute("dy",a)}}},SVGEffects.prototype.renderFrame=function(t){var e,s=this.filters.length;for(e=0;s>e;e+=1)this.filters[e].renderFrame(t)},createElement(SVGBaseElement,ICompElement),ICompElement.prototype.hide=function(){if(!this.hidden){this._parent.hide.call(this);var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].hide()}},ICompElement.prototype.prepareFrame=function(t){if(this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){if(this.tm){var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}else this.renderedFrame=t/this.data.sr;var s,r=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=0;r>s;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st)}},ICompElement.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),r=this.layers.length;if(s===!1)return void this.hide();for(this.hidden&&this.show(),e=0;r>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this._parent.destroy.call(this._parent);var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].destroy()},ICompElement.prototype.checkLayers=SVGRenderer.prototype.checkLayers,ICompElement.prototype.buildItem=SVGRenderer.prototype.buildItem,ICompElement.prototype.buildAllItems=SVGRenderer.prototype.buildAllItems,ICompElement.prototype.buildElementParenting=SVGRenderer.prototype.buildElementParenting,ICompElement.prototype.createItem=SVGRenderer.prototype.createItem,ICompElement.prototype.createImage=SVGRenderer.prototype.createImage,ICompElement.prototype.createComp=SVGRenderer.prototype.createComp,ICompElement.prototype.createSolid=SVGRenderer.prototype.createSolid,ICompElement.prototype.createShape=SVGRenderer.prototype.createShape,ICompElement.prototype.createText=SVGRenderer.prototype.createText,ICompElement.prototype.createBase=SVGRenderer.prototype.createBase,ICompElement.prototype.appendElementInPos=SVGRenderer.prototype.appendElementInPos,ICompElement.prototype.checkPendingElements=SVGRenderer.prototype.checkPendingElements,ICompElement.prototype.addPendingElement=SVGRenderer.prototype.addPendingElement,createElement(SVGBaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData);this._parent.createElements.call(this),this.innerElem=document.createElementNS(svgNS,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio","xMidYMid slice"),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.maskedElement=this.innerElem,this.layerElement.appendChild(this.innerElem),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},IImageElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&this.show(),void(this.firstFrame&&(this.firstFrame=!1)))},IImageElement.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.innerElem=null},createElement(SVGBaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this._parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t),this.innerElem=t,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},ISolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,ISolidElement.prototype.destroy=IImageElement.prototype.destroy;var animationManager=function(){function t(t){for(var e=0,s=t.target;C>e;)x[e].animation===s&&(x.splice(e,1),e-=1,C-=1,s.isPaused||r()),e+=1}function e(t,e){if(!t)return null;for(var s=0;C>s;){if(x[s].elem==t&&null!==x[s].elem)return x[s].animation;s+=1}var r=new AnimationItem;return i(r,t),r.setData(t,e),r}function s(){M+=1,E()}function r(){M-=1,0===M&&(k=!0)}function i(e,i){e.addEventListener("destroy",t),e.addEventListener("_active",s),e.addEventListener("_idle",r),x.push({elem:i,animation:e}),C+=1}function a(t){var e=new AnimationItem;return i(e,null),e.setParams(t),e}function n(t,e){var s;for(s=0;C>s;s+=1)x[s].animation.setSpeed(t,e)}function o(t,e){var s;for(s=0;C>s;s+=1)x[s].animation.setDirection(t,e)}function h(t){var e;for(e=0;C>e;e+=1)x[e].animation.play(t)}function l(t,e){S=Date.now();var s;for(s=0;C>s;s+=1)x[s].animation.moveFrame(t,e)}function p(t){var e,s=t-S;for(e=0;C>e;e+=1)x[e].animation.advanceTime(s);S=t,k||requestAnimationFrame(p)}function m(t){S=t,requestAnimationFrame(p)}function f(t){var e;for(e=0;C>e;e+=1)x[e].animation.pause(t)}function c(t,e,s){var r;for(r=0;C>r;r+=1)x[r].animation.goToAndStop(t,e,s)}function d(t){var e;for(e=0;C>e;e+=1)x[e].animation.stop(t)}function u(t){var e;for(e=0;C>e;e+=1)x[e].animation.togglePause(t)}function y(t){var e;for(e=C-1;e>=0;e-=1)x[e].animation.destroy(t)}function g(t,s,r){var i,a=document.getElementsByClassName("bodymovin"),n=a.length;for(i=0;n>i;i+=1)r&&a[i].setAttribute("data-bm-type",r),e(a[i],t);if(s&&0===n){r||(r="svg");var o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=document.createElement("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",r),o.appendChild(h),e(h,t)}}function v(){var t;for(t=0;C>t;t+=1)x[t].animation.resize()}function b(){requestAnimationFrame(m)}function E(){k&&(k=!1,requestAnimationFrame(m))}var P={},x=[],S=0,C=0,k=!0,M=0;return setTimeout(b,0),P.registerAnimation=e,P.loadAnimation=a,P.setSpeed=n,P.setDirection=o,P.play=h,P.moveFrame=l,P.pause=f,P.stop=d,P.togglePause=u,P.searchAnimations=g,P.resize=v,P.start=b,P.goToAndStop=c,P.destroy=y,P}(),AnimationItem=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.scaleMode="fit",this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=ProjectInterface()};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var r=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.responseText);e.configAnimation(t)}catch(s){}}}},AnimationItem.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},r=t.attributes;s.path=r.getNamedItem("data-animation-path")?r.getNamedItem("data-animation-path").value:r.getNamedItem("data-bm-path")?r.getNamedItem("data-bm-path").value:r.getNamedItem("bm-path")?r.getNamedItem("bm-path").value:"",s.animType=r.getNamedItem("data-anim-type")?r.getNamedItem("data-anim-type").value:r.getNamedItem("data-bm-type")?r.getNamedItem("data-bm-type").value:r.getNamedItem("bm-type")?r.getNamedItem("bm-type").value:r.getNamedItem("data-bm-renderer")?r.getNamedItem("data-bm-renderer").value:r.getNamedItem("bm-renderer")?r.getNamedItem("bm-renderer").value:"canvas";var i=r.getNamedItem("data-anim-loop")?r.getNamedItem("data-anim-loop").value:r.getNamedItem("data-bm-loop")?r.getNamedItem("data-bm-loop").value:r.getNamedItem("bm-loop")?r.getNamedItem("bm-loop").value:"";""===i||(s.loop="false"===i?!1:"true"===i?!0:parseInt(i));var a=r.getNamedItem("data-anim-autoplay")?r.getNamedItem("data-anim-autoplay").value:r.getNamedItem("data-bm-autoplay")?r.getNamedItem("data-bm-autoplay").value:r.getNamedItem("bm-autoplay")?r.getNamedItem("bm-autoplay").value:!0;s.autoplay="false"!==a,s.name=r.getNamedItem("data-name")?r.getNamedItem("data-name").value:r.getNamedItem("data-bm-name")?r.getNamedItem("data-bm-name").value:r.getNamedItem("bm-name")?r.getNamedItem("bm-name").value:"";var n=r.getNamedItem("data-anim-prerender")?r.getNamedItem("data-anim-prerender").value:r.getNamedItem("data-bm-prerender")?r.getNamedItem("data-bm-prerender").value:r.getNamedItem("bm-prerender")?r.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,r=this.animationData.layers,i=r.length,a=t.layers,n=a.length;for(s=0;n>s;s+=1)for(e=0;i>e;){if(r[e].id==a[s].id){r[e]=a[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(i=t.assets.length,e=0;i>e;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,r=this,i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",i,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)r.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);r.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new ImagePreloader,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets),this.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()))},AnimationItem.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),AnimationItem.prototype.addPendingElement=function(){this.pendingElements+=1},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.setSubframe=function(t){this.subframeEnabled=t?!0:!1},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:Math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.pause())},AnimationItem.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},AnimationItem.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.01)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(0)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t-.01)),this.firstFrame=t,this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,r=t.length;for(s=0;r>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},AnimationItem.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.checkSegments(),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");this.currentRawFrame=this.currentRawFrame%this.totalFrames}else if(this.currentRawFrame<0)return this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames,void this.gotoFrame());this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},AnimationItem.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getAssets=function(){return this.assets},AnimationItem.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},AnimationItem.prototype.addEventListener=_addEventListener,AnimationItem.prototype.removeEventListener=_removeEventListener,AnimationItem.prototype.triggerEvent=_triggerEvent,extendPrototype(BaseRenderer,CanvasRenderer),CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this,this.globalData)},CanvasRenderer.prototype.ctxTransform=function(t){if(1!==t[0]||0!==t[1]||0!==t[4]||1!==t[5]||0!==t[12]||0!==t[13]){if(!this.renderConfig.clearCanvas)return void this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13]);this.transformMat.cloneFromProps(t),this.transformMat.transform(this.contextData.cTr.props[0],this.contextData.cTr.props[1],this.contextData.cTr.props[2],this.contextData.cTr.props[3],this.contextData.cTr.props[4],this.contextData.cTr.props[5],this.contextData.cTr.props[6],this.contextData.cTr.props[7],this.contextData.cTr.props[8],this.contextData.cTr.props[9],this.contextData.cTr.props[10],this.contextData.cTr.props[11],this.contextData.cTr.props[12],this.contextData.cTr.props[13],this.contextData.cTr.props[14],this.contextData.cTr.props[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var e=this.contextData.cTr.props;this.canvasContext.setTransform(e[0],e[1],e[4],e[5],e[12],e[13])}},CanvasRenderer.prototype.ctxOpacity=function(t){if(1!==t){if(!this.renderConfig.clearCanvas)return void(this.canvasContext.globalAlpha*=0>t?0:t);this.contextData.cO*=0>t?0:t,this.canvasContext.globalAlpha=this.contextData.cO}},CanvasRenderer.prototype.reset=function(){return this.renderConfig.clearCanvas?(this.contextData.cArrPos=0,this.contextData.cTr.reset(),void(this.contextData.cO=1)):void this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;(null===this.contextData.saved[this.contextData.cArrPos]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(16));var s,r=this.contextData.saved[this.contextData.cArrPos];for(s=0;16>s;s+=1)r[s]=e[s];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRenderer.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&this.canvasContext.restore(),this.contextData.cArrPos-=1;var e,s=this.contextData.saved[this.contextData.cArrPos],r=this.contextData.cTr.props;for(e=0;16>e;e+=1)r[e]=s[e];this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13]),s=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=s,this.canvasContext.globalAlpha=s},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.data=t,this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.totalFrames=Math.floor(t.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.globalData.frameRate=t.fr,this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,document.body),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.addPendingElement=this.animationItem.addPendingElement.bind(this.animationItem),this.globalData.transformCanvas=this.transformCanvas,this.elements=Array.apply(null,{length:t.layers.length}),this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr);var s,r;if(-1!==this.renderConfig.preserveAspectRatio.indexOf("meet")||-1!==this.renderConfig.preserveAspectRatio.indexOf("slice")){var i=this.renderConfig.preserveAspectRatio.split(" "),a=i[1]||"meet",n=i[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);s=t/e,r=this.transformCanvas.w/this.transformCanvas.h,r>s&&"meet"===a||s>r&&"slice"===a?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),this.transformCanvas.tx="xMid"===o&&(s>r&&"meet"===a||r>s&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(s>r&&"meet"===a||r>s&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,
+this.transformCanvas.ty="YMid"===h&&(r>s&&"meet"===a||s>r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===h&&(r>s&&"meet"===a||s>r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr,this.transformCanvas.tx=0,this.transformCanvas.ty=0);this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1];var l,p=this.elements.length;for(l=0;p>l;l+=1)this.elements[l]&&0===this.elements[l].data.ty&&this.elements[l].resize(this.globalData.transformCanvas)},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers?this.layers.length:0;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem.firstFrame,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.renderConfig.clearCanvas===!0?(this.reset(),this.canvasContext.save(),this.canvasContext.clearRect(this.transformCanvas.tx,this.transformCanvas.ty,this.transformCanvas.w*this.transformCanvas.sx,this.transformCanvas.h*this.transformCanvas.sy)):this.save(),this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip();var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=0;s>e;e++)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.renderConfig.clearCanvas!==!0?this.restore():this.canvasContext.restore()}},CanvasRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){var s=this.createItem(this.layers[t],this,this.globalData);e[t]=s,s.initExpressions(),0===this.layers[t].ty&&s.resize(this.globalData.transformCanvas)}},CanvasRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},CanvasRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},CanvasRenderer.prototype.searchExtraCompositions=function(t){{var e,s=t.length;document.createElementNS(svgNS,"g")}for(e=0;s>e;e+=1)if(t[e].xt){var r=this.createComp(t[e],this.globalData.comp,this.globalData);r.initExpressions(),this.globalData.projectInterface.registerComposition(r)}},extendPrototype(BaseRenderer,HybridRenderer),HybridRenderer.prototype.buildItem=SVGRenderer.prototype.buildItem,HybridRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();t.checkParenting()}},HybridRenderer.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){var r=this.layers[e];if(r.ddd&&this.supports3d)this.addTo3dContainer(s,e);else{for(var i,a=0;e>a;)this.elements[a]&&this.elements[a]!==!0&&this.elements[a].getBaseElement&&(i=this.elements[a].getBaseElement()),a+=1;i?r.ddd&&this.supports3d||this.layerElement.insertBefore(s,i):r.ddd&&this.supports3d||this.layerElement.appendChild(s)}}},HybridRenderer.prototype.createBase=function(t){return new SVGBaseElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createShape=function(t){return this.supports3d?new HShapeElement(t,this.layerElement,this.globalData,this):new IShapeElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createText=function(t){return this.supports3d?new HTextElement(t,this.layerElement,this.globalData,this):new SVGTextElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createCamera=function(t){return this.camera=new HCameraElement(t,this.layerElement,this.globalData,this),this.camera},HybridRenderer.prototype.createImage=function(t){return this.supports3d?new HImageElement(t,this.layerElement,this.globalData,this):new IImageElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createComp=function(t){return this.supports3d?new HCompElement(t,this.layerElement,this.globalData,this):new ICompElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createSolid=function(t){return this.supports3d?new HSolidElement(t,this.layerElement,this.globalData,this):new ISolidElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.getThreeDContainer=function(t){var e=document.createElement("div");styleDiv(e),e.style.width=this.globalData.compSize.w+"px",e.style.height=this.globalData.compSize.h+"px",e.style.transformOrigin=e.style.mozTransformOrigin=e.style.webkitTransformOrigin="50% 50%";var s=document.createElement("div");styleDiv(s),s.style.transform=s.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",e.appendChild(s),this.resizerElem.appendChild(e);var r={container:s,perspectiveElem:e,startPos:t,endPos:t};return this.threeDElements.push(r),r},HybridRenderer.prototype.build3dContainers=function(){var t,e,s=this.layers.length;for(t=0;s>t;t+=1)this.layers[t].ddd?(e||(e=this.getThreeDContainer(t)),e.endPos=Math.max(e.endPos,t)):e=null},HybridRenderer.prototype.addTo3dContainer=function(t,e){for(var s=0,r=this.threeDElements.length;r>s;){if(e<=this.threeDElements[s].endPos){for(var i,a=this.threeDElements[s].startPos;e>a;)this.elements[a]&&this.elements[a].getBaseElement&&(i=this.elements[a].getBaseElement()),a+=1;i?this.threeDElements[s].container.insertBefore(t,i):this.threeDElements[s].container.appendChild(t);break}s+=1}},HybridRenderer.prototype.configAnimation=function(t){var e=document.createElement("div"),s=this.animationItem.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",s.appendChild(e),e.style.overflow="hidden";var r=document.createElementNS(svgNS,"svg");r.setAttribute("width","1"),r.setAttribute("height","1"),styleDiv(r),this.resizerElem.appendChild(r);var i=document.createElementNS(svgNS,"defs");r.appendChild(i),this.globalData.defs=i,this.data=t,this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,r),this.layerElement=this.resizerElem,this.build3dContainers(),this.updateContainerSize()},HybridRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},HybridRenderer.prototype.updateContainerSize=function(){var t,e,s,r,i=this.animationItem.wrapper.offsetWidth,a=this.animationItem.wrapper.offsetHeight,n=i/a,o=this.globalData.compSize.w/this.globalData.compSize.h;o>n?(t=i/this.globalData.compSize.w,e=i/this.globalData.compSize.w,s=0,r=(a-this.globalData.compSize.h*(i/this.globalData.compSize.w))/2):(t=a/this.globalData.compSize.h,e=a/this.globalData.compSize.h,s=(i-this.globalData.compSize.w*(a/this.globalData.compSize.h))/2,r=0),this.resizerElem.style.transform=this.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+s+","+r+",0,1)"},HybridRenderer.prototype.renderFrame=SVGRenderer.prototype.renderFrame,HybridRenderer.prototype.hide=function(){this.resizerElem.style.display="none"},HybridRenderer.prototype.show=function(){this.resizerElem.style.display="block"},HybridRenderer.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this.globalData.compSize.w,s=this.globalData.compSize.h,r=this.threeDElements.length;for(t=0;r>t;t+=1)this.threeDElements[t].perspectiveElem.style.perspective=this.threeDElements[t].perspectiveElem.style.webkitPerspective=Math.sqrt(Math.pow(e,2)+Math.pow(s,2))+"px"}},HybridRenderer.prototype.searchExtraCompositions=function(t){var e,s=t.length,r=document.createElement("div");for(e=0;s>e;e+=1)if(t[e].xt){var i=this.createComp(t[e],r,this.globalData.comp,null);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},createElement(BaseElement,CVBaseElement),CVBaseElement.prototype.createElements=function(){this.checkParenting()},CVBaseElement.prototype.checkBlendMode=function(t){if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e="";switch(this.data.bm){case 0:e="normal";break;case 1:e="multiply";break;case 2:e="screen";break;case 3:e="overlay";break;case 4:e="darken";break;case 5:e="lighten";break;case 6:e="color-dodge";break;case 7:e="color-burn";break;case 8:e="hard-light";break;case 9:e="soft-light";break;case 10:e="difference";break;case 11:e="exclusion";break;case 12:e="hue";break;case 13:e="saturation";break;case 14:e="color";break;case 15:e="luminosity"}t.canvasContext.globalCompositeOperation=e}},CVBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.checkBlendMode(0===this.data.ty?this.parentGlobalData:this.globalData),!this.isVisible)return this.isVisible;this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var r,i=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)this.finalTransform.matMdf=this.hierarchy[r].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props);return t&&(e=t.mat.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.data.hasMask&&(this.globalData.renderer.save(!0),this.maskManager.renderFrame(0===this.data.ty?null:s)),this.data.hd&&(this.isVisible=!1),this.isVisible},CVBaseElement.prototype.addMasks=function(t){this.maskManager=new CVMaskElement(t,this,this.globalData)},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},CVBaseElement.prototype.mHelper=new Matrix,createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.ctxTransform=CanvasRenderer.prototype.ctxTransform,CVCompElement.prototype.ctxOpacity=CanvasRenderer.prototype.ctxOpacity,CVCompElement.prototype.save=CanvasRenderer.prototype.save,CVCompElement.prototype.restore=CanvasRenderer.prototype.restore,CVCompElement.prototype.reset=function(){this.contextData.cArrPos=0,this.contextData.cTr.reset(),this.contextData.cO=1},CVCompElement.prototype.resize=function(t){var e=Math.max(t.sx,t.sy);this.canvas.width=this.data.w*e,this.canvas.height=this.data.h*e,this.transformCanvas={sc:e,w:this.data.w*e,h:this.data.h*e,props:[e,0,0,0,0,e,0,0,0,0,1,0,0,0,0,1]};var s,r=this.elements.length;for(s=0;r>s;s+=1)this.elements[s]&&0===this.elements[s].data.ty&&this.elements[s].resize(t)},CVCompElement.prototype.prepareFrame=function(t){if(this.globalData.frameId=this.parentGlobalData.frameId,this.globalData.mdf=!1,this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e/this.data.sr;var s,r=this.elements.length;for(this.completeLayers||this.checkLayers(t),s=0;r>s;s+=1)(this.completeLayers||this.elements[s])&&(this.elements[s].prepareFrame(e/this.data.sr-this.layers[s].st),0===this.elements[s].data.ty&&this.elements[s].globalData.mdf&&(this.globalData.mdf=!0));this.globalData.mdf&&!this.data.xt&&(this.canvasContext.clearRect(0,0,this.data.w,this.data.h),this.ctxTransform(this.transformCanvas.props))}},CVCompElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){if(this.globalData.mdf){var e,s=this.layers.length;for(e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}this.data.hasMask&&this.globalData.renderer.restore(!0),this.firstFrame&&(this.firstFrame=!1),this.parentGlobalData.renderer.save(),this.parentGlobalData.renderer.ctxTransform(this.finalTransform.mat.props),this.parentGlobalData.renderer.ctxOpacity(this.finalTransform.opacity),this.parentGlobalData.renderer.canvasContext.drawImage(this.canvas,0,0,this.data.w,this.data.h),this.parentGlobalData.renderer.restore(),this.globalData.mdf&&this.reset()}},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this._parent.destroy.call(this._parent)},CVCompElement.prototype.checkLayers=CanvasRenderer.prototype.checkLayers,CVCompElement.prototype.buildItem=CanvasRenderer.prototype.buildItem,CVCompElement.prototype.checkPendingElements=CanvasRenderer.prototype.checkPendingElements,CVCompElement.prototype.addPendingElement=CanvasRenderer.prototype.addPendingElement,CVCompElement.prototype.buildAllItems=CanvasRenderer.prototype.buildAllItems,CVCompElement.prototype.createItem=CanvasRenderer.prototype.createItem,CVCompElement.prototype.createImage=CanvasRenderer.prototype.createImage,CVCompElement.prototype.createComp=CanvasRenderer.prototype.createComp,CVCompElement.prototype.createSolid=CanvasRenderer.prototype.createSolid,CVCompElement.prototype.createShape=CanvasRenderer.prototype.createShape,CVCompElement.prototype.createText=CanvasRenderer.prototype.createText,CVCompElement.prototype.createBase=CanvasRenderer.prototype.createBase,CVCompElement.prototype.buildElementParenting=CanvasRenderer.prototype.buildElementParenting,createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=function(){if(this.globalData.elementLoaded(),this.assetData.w!==this.img.width||this.assetData.h!==this.img.height){var t=document.createElement("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,s,r=t.getContext("2d"),i=this.img.width,a=this.img.height,n=i/a,o=this.assetData.w/this.assetData.h;n>o?(s=a,e=s*o):(e=i,s=e/o),r.drawImage(this.img,(i-e)/2,(a-s)/2,e,s,0,0,this.assetData.w,this.assetData.h),this.img=t}}.bind(this),e=function(){this.failed=!0,this.globalData.elementLoaded()}.bind(this);this.img=new Image,this.img.addEventListener("load",t,!1),this.img.addEventListener("error",e,!1);var s=this.globalData.getAssetsPath(this.assetData);this.img.src=s,this._parent.createElements.call(this)},CVImageElement.prototype.renderFrame=function(t){if(!this.failed&&this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var s=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.drawImage(this.img,0,0),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},CVImageElement.prototype.destroy=function(){this.img=null,this._parent.destroy.call(this._parent)},CVMaskElement.prototype.getMaskProperty=function(t){return this.viewData[t]},CVMaskElement.prototype.prepareFrame=function(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.element.globalData.mdf=!0)},CVMaskElement.prototype.renderFrame=function(t){var e,s,r,i,a,n=this.element.canvasContext,o=this.data.masksProperties.length,h=!1;for(e=0;o>e;e++)if("n"!==this.masksProperties[e].mode){h===!1&&(n.beginPath(),h=!0),this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.element.globalData.compWidth,0),n.lineTo(this.element.globalData.compWidth,this.element.globalData.compHeight),n.lineTo(0,this.element.globalData.compHeight),n.lineTo(0,0)),a=this.viewData[e].v,s=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.moveTo(s[0],s[1]);var l,p=a._length;for(l=1;p>l;l++)s=t?t.applyToPointArray(a.o[l-1][0],a.o[l-1][1],0):a.o[l-1],r=t?t.applyToPointArray(a.i[l][0],a.i[l][1],0):a.i[l],i=t?t.applyToPointArray(a.v[l][0],a.v[l][1],0):a.v[l],n.bezierCurveTo(s[0],s[1],r[0],r[1],i[0],i[1]);s=t?t.applyToPointArray(a.o[l-1][0],a.o[l-1][1],0):a.o[l-1],r=t?t.applyToPointArray(a.i[0][0],a.i[0][1],0):a.i[0],i=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.bezierCurveTo(s[0],s[1],r[0],r[1],i[0],i[1])}h&&n.clip()},CVMaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].pv};e+=1}},CVMaskElement.prototype.destroy=function(){this.element=null},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},CVShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},CVShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties)},CVShapeElement.prototype.searchShapes=function(t,e,s){var r,i,a,n,o=t.length-1,h=[],l=[];for(r=o;r>=0;r-=1)if("fl"==t[r].ty||"st"==t[r].ty){if(n={type:t[r].ty,elements:[]},e[r]={},("fl"==t[r].ty||"st"==t[r].ty)&&(e[r].c=PropertyFactory.getProp(this,t[r].c,1,255,s),e[r].c.k||(n.co="rgb("+bm_floor(e[r].c.v[0])+","+bm_floor(e[r].c.v[1])+","+bm_floor(e[r].c.v[2])+")")),e[r].o=PropertyFactory.getProp(this,t[r].o,0,.01,s),"st"==t[r].ty){if(n.lc=this.lcEnum[t[r].lc]||"round",n.lj=this.ljEnum[t[r].lj]||"round",1==t[r].lj&&(n.ml=t[r].ml),e[r].w=PropertyFactory.getProp(this,t[r].w,0,null,s),e[r].w.k||(n.wi=e[r].w.v),t[r].d){var p=PropertyFactory.getDashProp(this,t[r].d,"canvas",s);e[r].d=p,e[r].d.k||(n.da=e[r].d.dasharray,n["do"]=e[r].d.dashoffset)}}else n.r=2===t[r].r?"evenodd":"nonzero";this.stylesList.push(n),e[r].style=n,h.push(e[r].style)}else if("gr"==t[r].ty)e[r]={it:[]},this.searchShapes(t[r].it,e[r].it,s);else if("tr"==t[r].ty)e[r]={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:PropertyFactory.getProp(this,t[r].o,0,.01,s),mProps:PropertyFactory.getProp(this,t[r],2,null,s)},elements:[]};else if("sh"==t[r].ty||"rc"==t[r].ty||"el"==t[r].ty||"sr"==t[r].ty){e[r]={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]};var m=4;"rc"==t[r].ty?m=5:"el"==t[r].ty?m=6:"sr"==t[r].ty&&(m=7),e[r].sh=ShapePropertyFactory.getShapeProp(this,t[r],m,s),this.shapes.push(e[r].sh),this.addShapeToModifiers(e[r]),a=this.stylesList.length;var f=!1,c=!1;for(i=0;a>i;i+=1)this.stylesList[i].closed||(this.stylesList[i].elements.push(e[r]),"st"===this.stylesList[i].type?f=!0:c=!0);e[r].st=f,e[r].fl=c}else if("tm"==t[r].ty||"rd"==t[r].ty||"rp"==t[r].ty){var d=ShapeModifiers.getModifier(t[r].ty);d.init(this,t[r],s),this.shapeModifiers.push(d),l.push(d),e[r]=d}for(o=h.length,r=0;o>r;r+=1)h[r].closed=!0;for(o=l.length,r=0;o>r;r+=1)l[r].closed=!0},CVShapeElement.prototype.addShapeToModifiers=IShapeElement.prototype.addShapeToModifiers,CVShapeElement.prototype.renderModifiers=IShapeElement.prototype.renderModifiers,CVShapeElement.prototype.renderFrame=function(t){this._parent.renderFrame.call(this,t)!==!1&&(this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderModifiers(),this.renderShape(this.transformHelper,null,null,!0),this.data.hasMask&&this.globalData.renderer.restore(!0))},CVShapeElement.prototype.renderShape=function(t,e,s,r){var i,a;if(!e)for(e=this.shapesData,a=this.stylesList.length,i=0;a>i;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;s||(s=this.viewData),a=e.length-1;var n,o;for(n=t,i=a;i>=0;i-=1)if("tr"==e[i].ty){n=s[i].transform;var h=s[i].transform.mProps.v.props;if(n.matMdf=n.mProps.mdf,n.opMdf=n.op.mdf,o=n.mat,o.cloneFromProps(h),t){var l=t.mat.props;n.opacity=t.opacity,n.opacity*=s[i].transform.op.v,n.matMdf=t.matMdf?!0:n.matMdf,n.opMdf=t.opMdf?!0:n.opMdf,o.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15])}else n.opacity=n.op.o}else"sh"==e[i].ty||"el"==e[i].ty||"rc"==e[i].ty||"sr"==e[i].ty?this.renderPath(e[i],s[i],n):"fl"==e[i].ty?this.renderFill(e[i],s[i],n):"st"==e[i].ty?this.renderStroke(e[i],s[i],n):"gr"==e[i].ty?this.renderShape(n,e[i].it,s[i].it):"tm"==e[i].ty;if(r){a=this.stylesList.length;var p,m,f,c,d,u,y,g=this.globalData.renderer,v=this.globalData.canvasContext;for(g.save(),g.ctxTransform(this.finalTransform.mat.props),i=0;a>i;i+=1)if(y=this.stylesList[i].type,"st"!==y||0!==this.stylesList[i].wi){for(g.save(),d=this.stylesList[i].elements,"st"===y?(v.strokeStyle=this.stylesList[i].co,v.lineWidth=this.stylesList[i].wi,v.lineCap=this.stylesList[i].lc,v.lineJoin=this.stylesList[i].lj,v.miterLimit=this.stylesList[i].ml||0):v.fillStyle=this.stylesList[i].co,g.ctxOpacity(this.stylesList[i].coOp),"st"!==y&&v.beginPath(),m=d.length,p=0;m>p;p+=1){for("st"===y&&(v.beginPath(),this.stylesList[i].da?(v.setLineDash(this.stylesList[i].da),v.lineDashOffset=this.stylesList[i]["do"],this.globalData.isDashed=!0):this.globalData.isDashed&&(v.setLineDash(this.dashResetter),this.globalData.isDashed=!1)),u=d[p].trNodes,c=u.length,f=0;c>f;f+=1)"m"==u[f].t?v.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?v.bezierCurveTo(u[f].p1[0],u[f].p1[1],u[f].p2[0],u[f].p2[1],u[f].p3[0],u[f].p3[1]):v.closePath();"st"===y&&v.stroke()}"st"!==y&&v.fill(this.stylesList[i].r),g.restore()}g.restore(),this.firstFrame&&(this.firstFrame=!1)}},CVShapeElement.prototype.renderPath=function(t,e,s){var r,i,a,n,o=s.matMdf||e.sh.mdf||this.firstFrame;if(o){var h=e.sh.paths;n=h._length;var l=e.trNodes;for(l.length=0,a=0;n>a;a+=1){var p=h.shapes[a];if(p&&p.v){for(r=p._length,i=1;r>i;i+=1)1==i&&l.push({t:"m",p:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),l.push({t:"c",p1:s.mat.applyToPointArray(p.o[i-1][0],p.o[i-1][1],0),p2:s.mat.applyToPointArray(p.i[i][0],p.i[i][1],0),p3:s.mat.applyToPointArray(p.v[i][0],p.v[i][1],0)});1==r&&l.push({t:"m",p:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),p.c&&r&&(l.push({t:"c",p1:s.mat.applyToPointArray(p.o[i-1][0],p.o[i-1][1],0),p2:s.mat.applyToPointArray(p.i[0][0],p.i[0][1],0),p3:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),l.push({t:"z"})),e.lStr=l}}if(e.st)for(i=0;16>i;i+=1)e.tr[i]=s.mat.props[i];e.trNodes=l}},CVShapeElement.prototype.renderFill=function(t,e,s){var r=e.style;(e.c.mdf||this.firstFrame)&&(r.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(r.coOp=e.o.v*s.opacity)},CVShapeElement.prototype.renderStroke=function(t,e,s){var r=e.style,i=e.d;i&&(i.mdf||this.firstFrame)&&(r.da=i.dasharray,r["do"]=i.dashoffset),(e.c.mdf||this.firstFrame)&&(r.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(r.coOp=e.o.v*s.opacity),(e.w.mdf||this.firstFrame)&&(r.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.viewData.length=0,this._parent.destroy.call(this._parent)},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.fillStyle=this.data.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.init=ITextElement.prototype.init,CVTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,CVTextElement.prototype.getMult=ITextElement.prototype.getMult,CVTextElement.prototype.prepareFrame=ITextElement.prototype.prepareFrame,CVTextElement.prototype.tHelper=document.createElement("canvas").getContext("2d"),CVTextElement.prototype.createElements=function(){this._parent.createElements.call(this)},CVTextElement.prototype.buildNewText=function(){var t=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0});var e=!1;t.fc?(e=!0,this.values.fill="rgb("+Math.round(255*t.fc[0])+","+Math.round(255*t.fc[1])+","+Math.round(255*t.fc[2])+")"):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;t.sc&&(s=!0,this.values.stroke="rgb("+Math.round(255*t.sc[0])+","+Math.round(255*t.sc[1])+","+Math.round(255*t.sc[2])+")",this.values.sWidth=t.sw);var r,i,a=this.globalData.fontManager.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=s,this.values.fValue=t.s+"px "+this.globalData.fontManager.getFontByName(t.f).fFamily,i=t.t.length,this.tHelper.font=this.values.fValue;var h,l,p,m,f,c,d,u,y,g,v=this.data.singleShape;if(v)var b=0,E=0,P=t.lineWidths,x=t.boxWidth,S=!0;var C=0;for(r=0;i>r;r+=1){h=this.globalData.fontManager.getCharData(t.t.charAt(r),a.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);var l;if(l=h?h.data:null,o.reset(),v&&n[r].n&&(b=0,E+=t.yOffset,E+=S?1:0,S=!1),l&&l.shapes){if(f=l.shapes[0].it,d=f.length,o.scale(t.s/100,t.s/100),v){switch(t.ps&&o.translate(t.ps[0],t.ps[1]+t.ascent,0),o.translate(0,-t.ls,0),t.j){case 1:o.translate(t.justifyOffset+(x-P[n[r].line]),0,0);break;case 2:o.translate(t.justifyOffset+(x-P[n[r].line])/2,0,0)}o.translate(b,E,0)}for(y=new Array(d),c=0;d>c;c+=1){for(m=f[c].ks.k.i.length,u=f[c].ks.k,g=[],p=1;m>p;p+=1)1==p&&g.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),g.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[p][0],u.i[p][1],0),o.applyToY(u.i[p][0],u.i[p][1],0),o.applyToX(u.v[p][0],u.v[p][1],0),o.applyToY(u.v[p][0],u.v[p][1],0));g.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[0][0],u.i[0][1],0),o.applyToY(u.i[0][0],u.i[0][1],0),o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),y[c]=g}}else y=[];v&&(b+=n[r].l),this.textSpans[C]?this.textSpans[C].elem=y:this.textSpans[C]={elem:y},C+=1}},CVTextElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext,s=this.finalTransform.mat.props;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.font=this.values.fValue,e.lineCap="butt",e.lineJoin="miter",e.miterLimit=4,this.data.singleShape||this.getMeasures();var r,i,a,n,o,h,l=this.renderedLetters,p=this.currentTextDocumentData.l;i=p.length;var m,f,c,d=null,u=null,y=null;for(r=0;i>r;r+=1)if(!p[r].n){if(m=l[r],m&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(m.props),this.globalData.renderer.ctxOpacity(m.o)),this.fill){for(m&&m.fc?d!==m.fc&&(d=m.fc,e.fillStyle=m.fc):d!==this.values.fill&&(d=this.values.fill,e.fillStyle=this.values.fill),f=this.textSpans[r].elem,n=f.length,this.globalData.canvasContext.beginPath(),a=0;n>a;a+=1)for(c=f[a],h=c.length,this.globalData.canvasContext.moveTo(c[0],c[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(c[o],c[o+1],c[o+2],c[o+3],c[o+4],c[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(m&&m.sw?y!==m.sw&&(y=m.sw,e.lineWidth=m.sw):y!==this.values.sWidth&&(y=this.values.sWidth,e.lineWidth=this.values.sWidth),m&&m.sc?u!==m.sc&&(u=m.sc,e.strokeStyle=m.sc):u!==this.values.stroke&&(u=this.values.stroke,e.strokeStyle=this.values.stroke),f=this.textSpans[r].elem,n=f.length,this.globalData.canvasContext.beginPath(),a=0;n>a;a+=1)for(c=f[a],h=c.length,this.globalData.canvasContext.moveTo(c[0],c[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(c[o],c[o+1],c[o+2],c[o+3],c[o+4],c[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}m&&this.globalData.renderer.restore()}this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(BaseElement,HBaseElement),HBaseElement.prototype.checkBlendMode=function(){},HBaseElement.prototype.setBlendMode=BaseElement.prototype.setBlendMode,HBaseElement.prototype.getBaseElement=function(){return this.baseElement},HBaseElement.prototype.createElements=function(){this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"svg"),styleDiv(this.layerElement),this.baseElement=this.layerElement,this.maskedElement=this.layerElement):this.layerElement=this.parentContainer,this.transformedElement=this.layerElement,!this.data.ln||4!==this.data.ty&&0!==this.data.ty||(this.layerElement===this.parentContainer&&(this.layerElement=document.createElementNS(svgNS,"g"),this.baseElement=this.layerElement),this.layerElement.setAttribute("id",this.data.ln)),this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.checkParenting()},HBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.currentFrameNum===this.lastNum||!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var r,i=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)this.finalTransform.matMdf=this.hierarchy[r].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&this.finalTransform.matMdf&&(t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props));return this.data.hasMask&&this.maskManager.renderFrame(s),t&&(e=t.mat.props,s.cloneFromProps(e),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.finalTransform.matMdf&&(this.transformedElement.style.transform=this.transformedElement.style.webkitTransform=s.toCSS(),this.finalMat=s),this.finalTransform.opMdf&&(this.transformedElement.style.opacity=this.finalTransform.opacity),this.isVisible},HBaseElement.prototype.destroy=function(){this.layerElement=null,this.transformedElement=null,
+this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},HBaseElement.prototype.getDomElement=function(){return this.layerElement},HBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},HBaseElement.prototype.hide=function(){},HBaseElement.prototype.setMatte=function(){},HBaseElement.prototype.buildElementParenting=HybridRenderer.prototype.buildElementParenting,createElement(HBaseElement,HSolidElement),HSolidElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");styleDiv(e),e.setAttribute("width",this.data.sw),e.setAttribute("height",this.data.sh),t.appendChild(e),this.layerElement=t,this.transformedElement=t,this.baseElement=t,this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),0!==this.data.bm&&this.setBlendMode();var s=document.createElementNS(svgNS,"rect");s.setAttribute("width",this.data.sw),s.setAttribute("height",this.data.sh),s.setAttribute("fill",this.data.sc),e.appendChild(s),this.data.hasMask&&(this.maskedElement=s),this.checkParenting()},HSolidElement.prototype.hide=SVGBaseElement.prototype.hide,HSolidElement.prototype.show=SVGBaseElement.prototype.show,HSolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,HSolidElement.prototype.destroy=IImageElement.prototype.destroy,createElement(HBaseElement,HCompElement),HCompElement.prototype.createElements=function(){var t=document.createElement("div");if(styleDiv(t),this.data.ln&&t.setAttribute("id",this.data.ln),t.style.clip="rect(0px, "+this.data.w+"px, "+this.data.h+"px, 0px)",this.data.hasMask){var e=document.createElementNS(svgNS,"svg");styleDiv(e),e.setAttribute("width",this.data.w),e.setAttribute("height",this.data.h);var s=document.createElementNS(svgNS,"g");e.appendChild(s),t.appendChild(e),this.maskedElement=s,this.baseElement=t,this.layerElement=s,this.transformedElement=t}else this.layerElement=t,this.baseElement=this.layerElement,this.transformedElement=t;this.checkParenting()},HCompElement.prototype.hide=ICompElement.prototype.hide,HCompElement.prototype.prepareFrame=ICompElement.prototype.prepareFrame,HCompElement.prototype.setElements=ICompElement.prototype.setElements,HCompElement.prototype.getElements=ICompElement.prototype.getElements,HCompElement.prototype.destroy=ICompElement.prototype.destroy,HCompElement.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),r=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;r>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},HCompElement.prototype.checkLayers=BaseRenderer.prototype.checkLayers,HCompElement.prototype.buildItem=HybridRenderer.prototype.buildItem,HCompElement.prototype.checkPendingElements=HybridRenderer.prototype.checkPendingElements,HCompElement.prototype.addPendingElement=HybridRenderer.prototype.addPendingElement,HCompElement.prototype.buildAllItems=BaseRenderer.prototype.buildAllItems,HCompElement.prototype.createItem=HybridRenderer.prototype.createItem,HCompElement.prototype.buildElementParenting=HybridRenderer.prototype.buildElementParenting,HCompElement.prototype.createImage=HybridRenderer.prototype.createImage,HCompElement.prototype.createComp=HybridRenderer.prototype.createComp,HCompElement.prototype.createSolid=HybridRenderer.prototype.createSolid,HCompElement.prototype.createShape=HybridRenderer.prototype.createShape,HCompElement.prototype.createText=HybridRenderer.prototype.createText,HCompElement.prototype.createBase=HybridRenderer.prototype.createBase,HCompElement.prototype.appendElementInPos=HybridRenderer.prototype.appendElementInPos,createElement(HBaseElement,HShapeElement);var parent=HShapeElement.prototype._parent;extendPrototype(IShapeElement,HShapeElement),HShapeElement.prototype._parent=parent,HShapeElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");styleDiv(e);var s=this.comp.data?this.comp.data:this.globalData.compSize;if(e.setAttribute("width",s.w),e.setAttribute("height",s.h),this.data.hasMask){var r=document.createElementNS(svgNS,"g");t.appendChild(e),e.appendChild(r),this.maskedElement=r,this.layerElement=r,this.shapesContainer=r}else t.appendChild(e),this.layerElement=e,this.shapesContainer=document.createElementNS(svgNS,"g"),this.layerElement.appendChild(this.shapesContainer);this.data.hd||(this.baseElement=t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),this.buildExpressionInterface(),this.layerElement=t,this.transformedElement=t,this.shapeCont=e,0!==this.data.bm&&this.setBlendMode(),this.checkParenting()},HShapeElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),this.addedTransforms.mdf=this.finalTransform.matMdf,this.addedTransforms.mats.length=1,this.addedTransforms.mats[0]=this.finalTransform.mat,this.renderShape(null,null,!0,null),this.isVisible&&(this.elemMdf||this.firstFrame)){var s=this.shapeCont.getBBox(),r=!1;this.currentBBox.w!==s.width&&(this.currentBBox.w=s.width,this.shapeCont.setAttribute("width",s.width),r=!0),this.currentBBox.h!==s.height&&(this.currentBBox.h=s.height,this.shapeCont.setAttribute("height",s.height),r=!0),(r||this.currentBBox.x!==s.x||this.currentBBox.y!==s.y)&&(this.currentBBox.w=s.width,this.currentBBox.h=s.height,this.currentBBox.x=s.x,this.currentBBox.y=s.y,this.shapeCont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.shapeCont.style.transform=this.shapeCont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}},createElement(HBaseElement,HTextElement),HTextElement.prototype.init=ITextElement.prototype.init,HTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,HTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,HTextElement.prototype.prepareFrame=ITextElement.prototype.prepareFrame,HTextElement.prototype.createElements=function(){this.isMasked=this.checkMasks();var t=document.createElement("div");if(styleDiv(t),this.layerElement=t,this.transformedElement=t,this.isMasked){this.renderType="svg";var e=document.createElementNS(svgNS,"svg");styleDiv(e),this.cont=e,this.compW=this.comp.data.w,this.compH=this.comp.data.h,e.setAttribute("width",this.compW),e.setAttribute("height",this.compH);var s=document.createElementNS(svgNS,"g");e.appendChild(s),t.appendChild(e),this.maskedElement=s,this.innerElem=s}else this.renderType="html",this.innerElem=t;this.baseElement=t,this.checkParenting()},HTextElement.prototype.buildNewText=function(){var t=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),this.innerElem.style.color=this.innerElem.style.fill=t.fc?"rgb("+Math.round(255*t.fc[0])+","+Math.round(255*t.fc[1])+","+Math.round(255*t.fc[2])+")":"rgba(0,0,0,0)",t.sc&&(this.innerElem.style.stroke="rgb("+Math.round(255*t.sc[0])+","+Math.round(255*t.sc[1])+","+Math.round(255*t.sc[2])+")",this.innerElem.style.strokeWidth=t.sw+"px");var e=this.globalData.fontManager.getFontByName(t.f);if(!this.globalData.fontManager.chars)if(this.innerElem.style.fontSize=t.s+"px",this.innerElem.style.lineHeight=t.s+"px",e.fClass)this.innerElem.className=e.fClass;else{this.innerElem.style.fontFamily=e.fFamily;var s=t.fWeight,r=t.fStyle;this.innerElem.style.fontStyle=r,this.innerElem.style.fontWeight=s}var i,a,n=t.l;a=n.length;var o,h,l,p,m=this.mHelper,f="",c=0;for(i=0;a>i;i+=1){if(this.globalData.fontManager.chars?(this.textPaths[c]?o=this.textPaths[c]:(o=document.createElementNS(svgNS,"path"),o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4")),this.isMasked||(this.textSpans[c]?(h=this.textSpans[c],l=h.children[0]):(h=document.createElement("div"),l=document.createElementNS(svgNS,"svg"),l.appendChild(o),styleDiv(h)))):this.isMasked?o=this.textPaths[c]?this.textPaths[c]:document.createElementNS(svgNS,"text"):this.textSpans[c]?(h=this.textSpans[c],o=this.textPaths[c]):(h=document.createElement("span"),styleDiv(h),o=document.createElement("span"),styleDiv(o),h.appendChild(o)),this.globalData.fontManager.chars){var d,u=this.globalData.fontManager.getCharData(t.t.charAt(i),e.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);if(d=u?u.data:null,m.reset(),d&&d.shapes&&(p=d.shapes[0].it,m.scale(t.s/100,t.s/100),f=this.createPathShape(m,p),o.setAttribute("d",f)),this.isMasked)this.innerElem.appendChild(o);else if(this.innerElem.appendChild(h),d&&d.shapes){document.body.appendChild(l);var y=l.getBBox();l.setAttribute("width",y.width),l.setAttribute("height",y.height),l.setAttribute("viewBox",y.x+" "+y.y+" "+y.width+" "+y.height),l.style.transform=l.style.webkitTransform="translate("+y.x+"px,"+y.y+"px)",n[i].yOffset=y.y,h.appendChild(l)}else l.setAttribute("width",1),l.setAttribute("height",1)}else o.textContent=n[i].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this.innerElem.appendChild(o):(this.innerElem.appendChild(h),o.style.transform=o.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.textSpans[c]=this.isMasked?o:h,this.textSpans[c].style.display="block",this.textPaths[c]=o,c+=1}for(;c<this.textSpans.length;)this.textSpans[c].style.display="none",c+=1},HTextElement.prototype.hide=SVGTextElement.prototype.hide,HTextElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block",this.layerElement.style.display="block"),this.data.singleShape){if(!this.firstFrame&&!this.lettersChangedFlag)return;this.isMasked&&this.finalTransform.matMdf&&(this.cont.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this.cont.style.transform=this.cont.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.getMeasures(),this.lettersChangedFlag){var s,r,i=this.renderedLetters,a=this.currentTextDocumentData.l;r=a.length;var n;for(s=0;r>s;s+=1)a[s].n||(n=i[s],this.isMasked?this.textSpans[s].setAttribute("transform",n.m):this.textSpans[s].style.transform=this.textSpans[s].style.webkitTransform=n.m,this.textSpans[s].style.opacity=n.o,n.sw&&this.textPaths[s].setAttribute("stroke-width",n.sw),n.sc&&this.textPaths[s].setAttribute("stroke",n.sc),n.fc&&(this.textPaths[s].setAttribute("fill",n.fc),this.textPaths[s].style.color=n.fc));if(this.isVisible&&(this.elemMdf||this.firstFrame)&&this.innerElem.getBBox){var o=this.innerElem.getBBox();this.currentBBox.w!==o.width&&(this.currentBBox.w=o.width,this.cont.setAttribute("width",o.width)),this.currentBBox.h!==o.height&&(this.currentBBox.h=o.height,this.cont.setAttribute("height",o.height)),(this.currentBBox.w!==o.width||this.currentBBox.h!==o.height||this.currentBBox.x!==o.x||this.currentBBox.y!==o.y)&&(this.currentBBox.w=o.width,this.currentBBox.h=o.height,this.currentBBox.x=o.x,this.currentBBox.y=o.y,this.cont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.cont.style.transform=this.cont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}this.firstFrame&&(this.firstFrame=!1)}},HTextElement.prototype.destroy=SVGTextElement.prototype.destroy,createElement(HBaseElement,HImageElement),HImageElement.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData),e=new Image;if(this.data.hasMask){var s=document.createElement("div");styleDiv(s);var r=document.createElementNS(svgNS,"svg");styleDiv(r),r.setAttribute("width",this.assetData.w),r.setAttribute("height",this.assetData.h),s.appendChild(r),this.imageElem=document.createElementNS(svgNS,"image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),r.appendChild(this.imageElem),this.layerElement=s,this.transformedElement=s,this.baseElement=s,this.innerElem=s,this.maskedElement=this.imageElem}else styleDiv(e),this.layerElement=e,this.baseElement=e,this.innerElem=e,this.transformedElement=e;e.src=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.checkParenting()},HImageElement.prototype.hide=HSolidElement.prototype.hide,HImageElement.prototype.renderFrame=HSolidElement.prototype.renderFrame,HImageElement.prototype.destroy=HSolidElement.prototype.destroy,createElement(HBaseElement,HCameraElement),HCameraElement.prototype.setup=function(){var t,e,s=this.comp.threeDElements.length;for(t=0;s>t;t+=1)e=this.comp.threeDElements[t],e.perspectiveElem.style.perspective=e.perspectiveElem.style.webkitPerspective=this.pe.v+"px",e.container.style.transformOrigin=e.container.style.mozTransformOrigin=e.container.style.webkitTransformOrigin="0px 0px 0px",e.perspectiveElem.style.transform=e.perspectiveElem.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},HCameraElement.prototype.createElements=function(){},HCameraElement.prototype.hide=function(){},HCameraElement.prototype.renderFrame=function(){var t,e,s=this.firstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;e>t;t+=1)s=this.hierarchy[t].finalTransform.mProp.mdf?!0:s;if(s||this.p&&this.p.mdf||this.px&&(this.px.mdf||this.py.mdf||this.pz.mdf)||this.rx.mdf||this.ry.mdf||this.rz.mdf||this.or.mdf||this.a&&this.a.mdf){if(this.mat.reset(),this.p?this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]):this.mat.translate(-this.px.v,-this.py.v,this.pz.v),this.a){var r=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],i=Math.sqrt(Math.pow(r[0],2)+Math.pow(r[1],2)+Math.pow(r[2],2)),a=[r[0]/i,r[1]/i,r[2]/i],n=Math.sqrt(a[2]*a[2]+a[0]*a[0]),o=Math.atan2(a[1],n),h=Math.atan2(a[0],-a[2]);this.mat.rotateY(h).rotateX(-o)}if(this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]),this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0),this.mat.translate(0,0,this.pe.v),this.hierarchy){var l;for(e=this.hierarchy.length,t=0;e>t;t+=1)l=this.hierarchy[t].finalTransform.mProp.iv.props,this.mat.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],-l[12],-l[13],l[14],l[15])}e=this.comp.threeDElements.length;var p;for(t=0;e>t;t+=1)p=this.comp.threeDElements[t],p.container.style.transform=p.container.style.webkitTransform=this.mat.toCSS()}this.firstFrame=!1},HCameraElement.prototype.destroy=function(){};var Expressions=function(){function t(t){t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer.globalData.projectInterface.registerComposition(t.renderer)}var e={};return e.initExpressions=t,e}();expressionsPlugin=Expressions,function(){function t(){return this.pv}function e(t,e){t*=this.elem.globalData.frameRate;var s,r,i=0,a=this.keyframes.length-1,n=1,o=!0;e=void 0===e?this.offsetTime:0;for(var h="object"==typeof this.pv?[this.pv.length]:0;o;){if(s=this.keyframes[i],r=this.keyframes[i+1],i==a-1&&t>=r.t-e){s.h&&(s=r);break}if(r.t-e>t)break;a-1>i?i+=n:o=!1}var l,p,m,f,c,d=0;if(s.to){s.bezierData||bez.buildBezierData(s);var u=s.bezierData;if(t>=r.t-e||t<s.t-e){var y=t>=r.t-e?u.points.length-1:0;for(p=u.points[y].point.length,l=0;p>l;l+=1)h[l]=u.points[y].point[l]}else{s.__fnct?c=s.__fnct:(c=BezierFactory.getBezierEasing(s.o.x,s.o.y,s.i.x,s.i.y,s.n).get,s.__fnct=c),m=c((t-(s.t-e))/(r.t-e-(s.t-e)));var g,v=u.segmentLength*m,b=0;for(n=1,o=!0,f=u.points.length;o;){if(b+=u.points[d].partialLength*n,0===v||0===m||d==u.points.length-1){for(p=u.points[d].point.length,l=0;p>l;l+=1)h[l]=u.points[d].point[l];break}if(v>=b&&v<b+u.points[d+1].partialLength){for(g=(v-b)/u.points[d+1].partialLength,p=u.points[d].point.length,l=0;p>l;l+=1)h[l]=u.points[d].point[l]+(u.points[d+1].point[l]-u.points[d].point[l])*g;break}f-1>d&&1==n||d>0&&-1==n?d+=n:o=!1}}}else{var E,P,x,S,C,k=!1;for(a=s.s.length,i=0;a>i;i+=1){if(1!==s.h&&(s.o.x instanceof Array?(k=!0,s.__fnct||(s.__fnct=[]),s.__fnct[i]||(E=s.o.x[i]||s.o.x[0],P=s.o.y[i]||s.o.y[0],x=s.i.x[i]||s.i.x[0],S=s.i.y[i]||s.i.y[0])):(k=!1,s.__fnct||(E=s.o.x,P=s.o.y,x=s.i.x,S=s.i.y)),k?s.__fnct[i]?c=s.__fnct[i]:(c=BezierFactory.getBezierEasing(E,P,x,S).get,s.__fnct[i]=c):s.__fnct?c=s.__fnct:(c=BezierFactory.getBezierEasing(E,P,x,S).get,s.__fnct=c),m=t>=r.t-e?1:t<s.t-e?0:c((t-(s.t-e))/(r.t-e-(s.t-e)))),this.sh&&1!==s.h){var M=s.s[i],A=s.e[i];-180>M-A?M+=360:M-A>180&&(M-=360),C=M+(A-M)*m}else C=1===s.h?s.s[i]:s.s[i]+(s.e[i]-s.s[i])*m;1===a?h=C:h[i]=C}}return h}function s(t){if(void 0!==this.vel)return this.vel;var e,s=-.01,r=this.getValueAtTime(t,0),i=this.getValueAtTime(t+s,0);if(r.length){e=Array.apply(null,{length:r.length});var a;for(a=0;a<r.length;a+=1)e[a]=(i[a]-r[a])/s}else e=(i-r)/s;return e}function r(t){this.propertyGroup=t}function i(t,e,s){e.x&&(s.k=!0,s.x=!0,s.getValue&&(s.getPreValue=s.getValue),s.getValue=ExpressionManager.initiateExpression.bind(s)(t,e,s))}function a(t){console.log("time:",t)}function n(t){}var o=function(){function a(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(n,o){this.pv=1,this.comp=n.comp,this.elem=n,this.mult=.01,this.type="textSelector",this.textTotal=o.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],i.bind(this)(n,o,this),this.getMult=a,this.getVelocityAtTime=s,this.getValueAtTime=this.kf?e.bind(this):t.bind(this),this.setGroupProperty=r}}(),h=PropertyFactory.getProp;PropertyFactory.getProp=function(o,l,p,m,f){var c=h(o,l,p,m,f);c.getVelocityAtTime=s,c.getValueAtTime=2===p?c.dynamicProperties.length?a.bind(c):n.bind(c):c.kf?e.bind(c):t.bind(c),c.setGroupProperty=r;var d=c.k;return void 0!==l.ix&&Object.defineProperty(c,"propertyIndex",{get:function(){return l.ix}}),i(o,l,c),!d&&c.x&&f.push(c),c};var l=ShapePropertyFactory.getShapeProp;ShapePropertyFactory.getShapeProp=function(s,a,n,o,h){var p=l(s,a,n,o,h);p.setGroupProperty=r,p.getValueAtTime=p.kf?e:t;var m=p.k;return void 0!==a.ix&&Object.defineProperty(p,"propertyIndex",{get:function(){return a.ix}}),3===n?i(s,a.pt,p):4===n&&i(s,a.ks,p),!m&&p.x&&o.push(p),p};var p=PropertyFactory.getTextSelectorProp;PropertyFactory.getTextSelectorProp=function(t,e,s){return 1===e.t?new o(t,e,s):p(t,e,s)}}();var ExpressionManager=function(){function duplicatePropertyValue(t,e){if(e=e||1,"number"==typeof t||t instanceof Number)return t*e;if(t.i)return JSON.parse(JSON.stringify(t));var s,r=Array.apply(null,{length:t.length}),i=t.length;for(s=0;i>s;s+=1)r[s]=t[s]*e;return r}function shapesEqual(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var s,r=t._length;for(s=0;r>s;s+=1)if(t.v[s][0]!==e.v[s][0]||t.v[s][1]!==e.v[s][1]||t.o[s][0]!==e.o[s][0]||t.o[s][1]!==e.o[s][1]||t.i[s][0]!==e.i[s][0]||t.i[s][1]!==e.i[s][1])return!1;return!0}function $bm_neg(t){var e=typeof t;if("number"===e||"boolean"===e||t instanceof Number)return-t;if(t.constructor===Array){var s,r=t.length,i=[];for(s=0;r>s;s+=1)i[s]=-t[s];return i}}function sum(t,e){var s=typeof t,r=typeof e;if("string"===s||"string"===r)return t+e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t+e;if(t.constructor===Array&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t[0]=t[0]+e,t;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&e.constructor===Array)return e[0]=t+e[0],e;if(t.constructor===Array&&e.constructor===Array){for(var i=0,a=t.length,n=e.length,o=[];a>i||n>i;)o[i]=("number"==typeof t[i]||t[i]instanceof Number)&&("number"==typeof e[i]||e[i]instanceof Number)?t[i]+e[i]:void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function sub(t,e){var s=typeof t,r=typeof e;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t-e;if(t.constructor===Array&&("number"===r||"boolean"===r||"string"===r||e instanceof Number))return t[0]=t[0]-e,t;if(("number"===s||"boolean"===s||"string"===s||t instanceof Number)&&e.constructor===Array)return e[0]=t-e[0],e;if(t.constructor===Array&&e.constructor===Array){for(var i=0,a=t.length,n=e.length,o=[];a>i||n>i;)o[i]="number"==typeof t[i]||t[i]instanceof Number?t[i]-e[i]:void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function mul(t,e){var s,r=typeof t,i=typeof e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t*e;var a,n;if(t.constructor===Array&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t[a]*e;return s}if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&e.constructor===Array){for(n=e.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t*e[a];return s}return 0}function div(t,e){var s,r=typeof t,i=typeof e;if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&("number"===i||"boolean"===i||"string"===i||e instanceof Number))return t/e;var a,n;if(t.constructor===Array&&("number"===i||"boolean"===i||"string"===i||e instanceof Number)){for(n=t.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t[a]/e;return s}if(("number"===r||"boolean"===r||"string"===r||t instanceof Number)&&e.constructor===Array){for(n=e.length,s=Array.apply(null,{length:n}),a=0;n>a;a+=1)s[a]=t/e[a];return s}return 0}function clamp(t,e,s){if(e>s){var r=s;s=e,e=r}return Math.min(Math.max(t,e),s)}function radiansToDegrees(t){return t/degToRads}function degreesToRadians(t){return t*degToRads}function length(t,e){if("number"==typeof t)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var s,r=Math.min(t.length,e.length),i=0;for(s=0;r>s;s+=1)i+=Math.pow(e[s]-t[s],2);return Math.sqrt(i)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,s,r=t[0],i=t[1],a=t[2],n=Math.max(r,i,a),o=Math.min(r,i,a),h=(n+o)/2;if(n==o)e=s=0;else{var l=n-o;switch(s=h>.5?l/(2-n-o):l/(n+o),n){case r:e=(i-a)/l+(a>i?6:0);break;case i:e=(a-r)/l+2;break;case a:e=(r-i)/l+4}e/=6}return[e,s,h,t[3]]}function hslToRgb(t){function e(t,e,s){return 0>s&&(s+=1),s>1&&(s-=1),1/6>s?t+6*(e-t)*s:.5>s?e:2/3>s?t+(e-t)*(2/3-s)*6:t}var s,r,i,a=t[0],n=t[1],o=t[2];if(0==n)s=r=i=o;else{var h=.5>o?o*(1+n):o+n-o*n,l=2*o-h;s=e(l,h,a+1/3),r=e(l,h,a),i=e(l,h,a-1/3)}return[s,r,i,t[3]]}function linear(t,e,s,r,i){if(void 0===r||void 0===i)return linear(t,0,1,e,s);if(e>=t)return r;if(t>=s)return i;var a=s===e?0:(t-e)/(s-e);if(!r.length)return r+(i-r)*a;var n,o=r.length,h=Array.apply(null,{length:o});for(n=0;o>n;n+=1)h[n]=r[n]+(i[n]-r[n])*a;return h}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var s,r=e.length;t||(t=Array.apply(null,{length:r}));var i=Array.apply(null,{length:r}),a=BMMath.random();for(s=0;r>s;s+=1)i[s]=t[s]+a*(e[s]-t[s]);return i}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function initiateExpression(elem,data,property){function lookAt(t,e){var s=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],r=Math.atan2(s[0],Math.sqrt(s[1]*s[1]+s[2]*s[2]))/degToRads,i=-Math.atan2(s[1],s[2])/degToRads;return[i,r,0]}function easeOut(t,e,s){return-(s-e)*t*(t-2)+e}function nearestKey(t){var e,s,r,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(s=-1,t*=elem.comp.globalData.frameRate,t<data.k[0].t)s=1,r=data.k[0].t;else{for(e=0;i-1>e;e+=1){if(t===data.k[e].t){s=e+1,r=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){t-data.k[e].t>data.k[e+1].t-t?(s=e+2,r=data.k[e+1].t):(s=e+1,r=data.k[e].t);break}}-1===s&&(s=e+1,r=data.k[e].t)}else s=0,r=0;var a={};return a.index=s,a.time=r/elem.comp.globalData.frameRate,a}function key(t){if(!data.k.length||"number"==typeof data.k[0])return{time:0};t-=1;var e,s={time:data.k[t].t/elem.comp.globalData.frameRate};e=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t-1].e;var r,i=e.length;for(r=0;i>r;r+=1)s[r]=e[r];return s}function framesToTime(t,e){return e||(e=elem.comp.globalData.frameRate),t/e}function timeToFrames(t,e){return t||(t=time),e||(e=elem.comp.globalData.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function execute(){if(_needsRandom&&seedRandom(randSeed),this.frameExpressionId!==elem.globalData.frameId||"textSelector"===this.type){if(this.lock)return this.v=duplicatePropertyValue(this.pv,this.mult),!0;"textSelector"===this.type&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer)),transform||(transform=elem.layerInterface("ADBE Transform Group"),anchorPoint=transform.anchorPoint),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!(!elem.hierarchy||!elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[0].layerInterface),this.lock=!0,this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp.globalData.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),bindedFn(),this.frameExpressionId=elem.globalData.frameId;var t,e;if(this.mult)if("number"==typeof this.v||this.v instanceof Number||"string"==typeof this.v)this.v*=this.mult;else if(1===this.v.length)this.v=this.v[0]*this.mult;else for(e=this.v.length,value===this.v&&(this.v=2===e?[value[0],value[1]]:[value[0],value[1],value[2]]),t=0;e>t;t+=1)this.v[t]*=this.mult;if(1===this.v.length&&(this.v=this.v[0]),"number"==typeof this.v||this.v instanceof Number||"string"==typeof this.v)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if(this.v._length)shapesEqual(this.v,this.localShapeCollection.shapes[0])||(this.mdf=!0,this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(shape_pool.clone(this.v)));else for(e=this.v.length,t=0;e>t;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0);this.lock=!1}}var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=-1!==val.indexOf("random"),elemType=elem.data.ty,transform,content,effect,thisComp=elem.comp,thisProperty=property;elem.comp.frameDuration=1/elem.comp.globalData.frameRate;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,toWorld,fromWorld,anchorPoint,thisLayer,thisComp,fn=new Function,fn=eval("[function(){"+val+";this.v = $bm_rt;}]")[0],bindedFn=fn.bind(this),numKeys=property.kf?data.k.length:0,wiggle=function(t,e){var s,r,i=this.pv.length?this.pv.length:1,a=Array.apply(null,{len:i});for(r=0;i>r;r+=1)a[r]=0;t=5;var n=Math.floor(time*t);for(s=0,r=0;n>s;){for(r=0;i>r;r+=1)a[r]+=-e+2*e*BMMath.random();s+=1}var o=time*t,h=o-Math.floor(o),l=Array.apply({length:i});if(i>1){for(r=0;i>r;r+=1)l[r]=this.pv[r]+a[r]+(-e+2*e*BMMath.random())*h;return l}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this),loopIn=function(t,e,s){if(!this.k)return this.pv;var r=time*elem.comp.globalData.frameRate,i=this.keyframes,a=i[0].t;if(r>=a)return this.pv;var n,o;s?(n=e?Math.abs(elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-a),o=a+n):((!e||e>i.length-1)&&(e=i.length-1),o=i[e].t,n=o-a);var h,l,p;if("pingpong"===t){var m=Math.floor((a-r)/n);if(m%2===0)return this.getValueAtTime(((a-r)%n+a)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(a/this.comp.globalData.frameRate,0),c=this.getValueAtTime(o/this.comp.globalData.frameRate,0),d=this.getValueAtTime((n-(a-r)%n+a)/this.comp.globalData.frameRate,0),u=Math.floor((a-r)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=d[h]-(c[h]-f[h])*u;return p}return d-(c-f)*u}if("continue"===t){var y=this.getValueAtTime(a/this.comp.globalData.frameRate,0),g=this.getValueAtTime((a+.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-g[h])*(a-r)/.001;return p}return y+(y-g)*(a-r)/.001}}return this.getValueAtTime((n-(a-r)%n+a)/this.comp.globalData.frameRate,0)}.bind(this),loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOut=function(t,e,s){if(!this.k||!this.keyframes)return this.pv;var r=time*elem.comp.globalData.frameRate,i=this.keyframes,a=i[i.length-1].t;if(a>=r)return this.pv;var n,o;s?(n=e?Math.abs(a-elem.comp.globalData.frameRate*e):Math.max(0,a-this.elem.data.ip),o=a-n):((!e||e>i.length-1)&&(e=i.length-1),o=i[i.length-1-e].t,n=a-o);var h,l,p;if("pingpong"===t){var m=Math.floor((r-o)/n);if(m%2!==0)return this.getValueAtTime((n-(r-o)%n+o)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(o/this.comp.globalData.frameRate,0),c=this.getValueAtTime(a/this.comp.globalData.frameRate,0),d=this.getValueAtTime(((r-o)%n+o)/this.comp.globalData.frameRate,0),u=Math.floor((r-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=(c[h]-f[h])*u+d[h];return p}return(c-f)*u+d}if("continue"===t){var y=this.getValueAtTime(a/this.comp.globalData.frameRate,0),g=this.getValueAtTime((a-.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-g[h])*((r-a)/this.comp.globalData.frameRate)/5e-4;return p}return y+(y-g)*((r-a)/.001)}}return this.getValueAtTime(((r-o)%n+o)/this.comp.globalData.frameRate,0)}.bind(this),loop_out=loopOut,loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this),valueAtTime=function(t){return this.getValueAtTime(t,0)}.bind(this),velocityAtTime=function(t){return this.getVelocityAtTime(t)}.bind(this),comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface),time,velocity,value,textIndex,textTotal,selectorValue,index=elem.data.ind,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent,randSeed=Math.floor(1e6*Math.random());return execute}var ob={},Math=BMMath,window=null,document=null,add=sum,radians_to_degrees=radiansToDegrees,degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];return ob.initiateExpression=initiateExpression,ob}(),ShapeExpressionInterface=function(){function t(t,e,s){return d(t,e,s)}function e(t,e,s){return y(t,e,s)}function s(t,e,s){return g(t,e,s)}function r(t,e,s){return v(t,e,s)}function i(t,e,s){return b(t,e,s)}function a(t,e,s){return E(t,e,s)}function n(t,e,s){return P(t,e,s)}function o(t,e,s){return x(t,e,s)}function h(t,e,s){return S(t,e,s)}function l(t,e,s){return C(t,e,s)}function p(t,e,s){return k(t,e,s)}function m(t,e,s){return M(t,e,s)}function f(t,e,s){var r,i=[],a=t?t.length:0;for(r=0;a>r;r+=1)"gr"==t[r].ty?i.push(ShapeExpressionInterface.createGroupInterface(t[r],e[r],s)):"fl"==t[r].ty?i.push(ShapeExpressionInterface.createFillInterface(t[r],e[r],s)):"st"==t[r].ty?i.push(ShapeExpressionInterface.createStrokeInterface(t[r],e[r],s)):"tm"==t[r].ty?i.push(ShapeExpressionInterface.createTrimInterface(t[r],e[r],s)):"tr"==t[r].ty||("el"==t[r].ty?i.push(ShapeExpressionInterface.createEllipseInterface(t[r],e[r],s)):"sr"==t[r].ty?i.push(ShapeExpressionInterface.createStarInterface(t[r],e[r],s)):"sh"==t[r].ty?i.push(ShapeExpressionInterface.createPathInterface(t[r],e[r],s)):"rc"==t[r].ty?i.push(ShapeExpressionInterface.createRectInterface(t[r],e[r],s)):"rd"==t[r].ty?i.push(ShapeExpressionInterface.createRoundedInterface(t[r],e[r],s)):"rp"==t[r].ty&&i.push(ShapeExpressionInterface.createRepatearInterface(t[r],e[r],s)));
 
-},r=f(t.it,e.it,i.propertyGroup),i.numProperties=r.length,i.propertyIndex=t.cix,i}}(),y=function(){return function(t,e,s){var r=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return r.content;case"ADBE Vector Transform Group":case 3:default:return r.transform}};r.propertyGroup=function(t){return 1===t?r:s(t-1)};var i=u(t,e,r.propertyGroup),a=ShapeExpressionInterface.createTransformInterface(t.it[t.it.length-1],e.it[e.it.length-1],r.propertyGroup);return r.content=i,r.transform=a,Object.defineProperty(r,"_name",{get:function(){return t.nm}}),r.numProperties=t.np,r.propertyIndex=t.ix,r.nm=t.nm,r.mn=t.mn,r}}(),g=function(){return function(t,e,s){function r(t){return"Color"===t||"color"===t?r.color:"Opacity"===t||"opacity"===t?r.opacity:void 0}return Object.defineProperty(r,"color",{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}}),Object.defineProperty(r,"opacity",{get:function(){return ExpressionValue(e.o,100)}}),Object.defineProperty(r,"_name",{value:t.nm}),Object.defineProperty(r,"mn",{value:t.mn}),e.c.setGroupProperty(s),e.o.setGroupProperty(s),r}}(),v=function(){return function(t,e,s){function r(t){return 1===t?c:s(t-1)}function i(t){return 1===t?l:r(t-1)}function a(s){Object.defineProperty(l,t.d[s].nm,{get:function(){return ExpressionValue(e.d.dataProps[s].p)}})}function n(t){return"Color"===t||"color"===t?n.color:"Opacity"===t||"opacity"===t?n.opacity:"Stroke Width"===t||"stroke width"===t?n.strokeWidth:void 0}var o,h=t.d?t.d.length:0,l={};for(o=0;h>o;o+=1)a(o),e.d.dataProps[o].p.setGroupProperty(i);return Object.defineProperty(n,"color",{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}}),Object.defineProperty(n,"opacity",{get:function(){return ExpressionValue(e.o,100)}}),Object.defineProperty(n,"strokeWidth",{get:function(){return ExpressionValue(e.w)}}),Object.defineProperty(n,"dash",{get:function(){return l}}),Object.defineProperty(n,"_name",{value:t.nm}),Object.defineProperty(n,"mn",{value:t.mn}),e.c.setGroupProperty(r),e.o.setGroupProperty(r),e.w.setGroupProperty(r),n}}(),b=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return e===t.e.ix||"End"===e||"end"===e?i.end:e===t.s.ix?i.start:e===t.o.ix?i.offset:void 0}return i.propertyIndex=t.ix,e.s.setGroupProperty(r),e.e.setGroupProperty(r),e.o.setGroupProperty(r),i.propertyIndex=t.ix,Object.defineProperty(i,"start",{get:function(){return ExpressionValue(e.s,1/e.s.mult)}}),Object.defineProperty(i,"end",{get:function(){return ExpressionValue(e.e,1/e.e.mult)}}),Object.defineProperty(i,"offset",{get:function(){return ExpressionValue(e.o)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),E=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.a.ix===e?i.anchorPoint:t.o.ix===e?i.opacity:t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.s.ix===e?i.scale:t.sk&&t.sk.ix===e?i.skew:t.sa&&t.sa.ix===e?i.skewAxis:"Opacity"===e?i.opacity:"Position"===e?i.position:"Anchor Point"===e?i.anchorPoint:"Scale"===e?i.scale:"Rotation"===e||"ADBE Vector Rotation"===e?i.rotation:"Skew"===e?i.skew:"Skew Axis"===e?i.skewAxis:void 0}e.transform.mProps.o.setGroupProperty(r),e.transform.mProps.p.setGroupProperty(r),e.transform.mProps.a.setGroupProperty(r),e.transform.mProps.s.setGroupProperty(r),e.transform.mProps.r.setGroupProperty(r),e.transform.mProps.sk&&(e.transform.mProps.sk.setGroupProperty(r),e.transform.mProps.sa.setGroupProperty(r)),e.transform.op.setGroupProperty(r),Object.defineProperty(i,"opacity",{get:function(){return ExpressionValue(e.transform.mProps.o,1/e.transform.mProps.o.mult)}}),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(e.transform.mProps.p)}}),Object.defineProperty(i,"anchorPoint",{get:function(){return ExpressionValue(e.transform.mProps.a)}});return Object.defineProperty(i,"scale",{get:function(){return ExpressionValue(e.transform.mProps.s,1/e.transform.mProps.s.mult)}}),Object.defineProperty(i,"rotation",{get:function(){return ExpressionValue(e.transform.mProps.r,1/e.transform.mProps.r.mult)}}),Object.defineProperty(i,"skew",{get:function(){return ExpressionValue(e.transform.mProps.sk)}}),Object.defineProperty(i,"skewAxis",{get:function(){return ExpressionValue(e.transform.mProps.sa)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.ty="tr",i.mn=t.mn,i}}(),P=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.p.ix===e?i.position:t.s.ix===e?i.size:void 0}i.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.s.setGroupProperty(r),a.p.setGroupProperty(r),Object.defineProperty(i,"size",{get:function(){return ExpressionValue(a.s)}}),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(a.p)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),x=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.pt.ix===e?i.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?i.outerRadius:t.os.ix===e?i.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?i.innerRoundness:void 0:i.innerRadius}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.or.setGroupProperty(r),a.os.setGroupProperty(r),a.pt.setGroupProperty(r),a.p.setGroupProperty(r),a.r.setGroupProperty(r),t.ir&&(a.ir.setGroupProperty(r),a.is.setGroupProperty(r)),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(a.p)}}),Object.defineProperty(i,"rotation",{get:function(){return ExpressionValue(a.r,1/a.r.mult)}}),Object.defineProperty(i,"points",{get:function(){return ExpressionValue(a.pt)}}),Object.defineProperty(i,"outerRadius",{get:function(){return ExpressionValue(a.or)}}),Object.defineProperty(i,"outerRoundness",{get:function(){return ExpressionValue(a.os)}}),Object.defineProperty(i,"innerRadius",{get:function(){return a.ir?ExpressionValue(a.ir):0}}),Object.defineProperty(i,"innerRoundness",{get:function(){return a.is?ExpressionValue(a.is,1/a.is.mult):0}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),S=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.pt.ix===e?i.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?i.outerRadius:t.os.ix===e?i.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?i.innerRoundness:void 0:i.innerRadius}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.p.setGroupProperty(r),a.s.setGroupProperty(r),a.r.setGroupProperty(r),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(a.p)}}),Object.defineProperty(i,"roundness",{get:function(){return ExpressionValue(a.r)}}),Object.defineProperty(i,"size",{get:function(){return ExpressionValue(a.s)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),C=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.r.ix===e||"Round Corners 1"===e?i.radius:void 0}var a=e;return i.propertyIndex=t.ix,a.rd.setGroupProperty(r),Object.defineProperty(i,"radius",{get:function(){return ExpressionValue(a.rd)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),k=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.c.ix===e||"Copies"===e?i.copies:t.o.ix===e||"Offset"===e?i.offset:void 0}var a=e;return i.propertyIndex=t.ix,a.c.setGroupProperty(r),a.o.setGroupProperty(r),Object.defineProperty(i,"copies",{get:function(){return ExpressionValue(a.c)}}),Object.defineProperty(i,"offset",{get:function(){return ExpressionValue(a.o)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),M=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(t){return"Shape"===t||"shape"===t||"Path"===t||"path"===t?i.path:void 0}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.setGroupProperty(r),Object.defineProperty(i,"path",{get:function(){return a.k&&a.getValue(),a.v}}),Object.defineProperty(i,"shape",{get:function(){return a.k&&a.getValue(),a.v}}),Object.defineProperty(i,"_name",{value:t.nm}),Object.defineProperty(i,"ix",{value:t.ix}),Object.defineProperty(i,"mn",{value:t.mn}),i}}();return c}(),TextExpressionInterface=function(){return function(t){function e(){}return Object.defineProperty(e,"sourceText",{get:function(){return t.currentTextDocumentData.t?t.currentTextDocumentData.t:""}}),e}}(),LayerExpressionInterface=function(){function t(t,e){var s=new Matrix;s.reset();var r;if(r=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,r.applyToMatrix(s),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;a>i;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(s);return s.applyToPointArray(t[0],t[1],t[2]||0)}return s.applyToPointArray(t[0],t[1],t[2]||0)}function e(t,e){var s=new Matrix;s.reset();var r;if(r=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,r.applyToMatrix(s),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;a>i;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(s);return s.inversePoint(t)}return s.inversePoint(t)}function s(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var s,r=this._elem.hierarchy.length;for(s=0;r>s;s+=1)this._elem.hierarchy[s].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}return function(r){function i(t){n.mask=t.getMask.bind(t)}function a(t){n.effect=t}function n(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return n.shapeInterface;case 1:case"Transform":case"transform":case"ADBE Transform Group":return o;case 4:case"ADBE Effect Parade":return n.effect}}var o=TransformExpressionInterface(r.transform);return n.toWorld=t,n.fromWorld=e,n.toComp=t,n.fromComp=s,n._elem=r,Object.defineProperty(n,"hasParent",{get:function(){return!!r.hierarchy}}),Object.defineProperty(n,"parent",{get:function(){return r.hierarchy[0].layerInterface}}),Object.defineProperty(n,"rotation",{get:function(){return o.rotation}}),Object.defineProperty(n,"scale",{get:function(){return o.scale}}),Object.defineProperty(n,"position",{get:function(){return o.position}}),Object.defineProperty(n,"anchorPoint",{get:function(){return o.anchorPoint}}),Object.defineProperty(n,"transform",{get:function(){return o}}),Object.defineProperty(n,"width",{get:function(){return 0===r.data.ty?r.data.w:100}}),Object.defineProperty(n,"height",{get:function(){return 0===r.data.ty?r.data.h:100}}),Object.defineProperty(n,"source",{get:function(){return r.data.refId}}),Object.defineProperty(n,"_name",{value:r.data.nm}),Object.defineProperty(n,"content",{get:function(){return n.shapeInterface}}),Object.defineProperty(n,"active",{get:function(){return r.isVisible}}),Object.defineProperty(n,"text",{get:function(){return n.textInterface}}),n.registerMaskInterface=i,n.registerEffectsInterface=a,n}}(),CompExpressionInterface=function(){return function(t){function e(e){for(var s=0,r=t.layers.length;r>s;){if(t.layers[s].nm===e||t.layers[s].ind===e)return t.elements[s].layerInterface;s+=1}return{active:!1}}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t.globalData.compSize.h,e.width=t.globalData.compSize.w,e.pixelAspect=1,e.frameDuration=1/t.globalData.frameRate,e}}(),TransformExpressionInterface=function(){return function(t){function e(s){switch(s){case"scale":case"Scale":case"ADBE Scale":return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":return e.rotation;case"position":case"Position":case"ADBE Position":return t.position;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":return e.anchorPoint;case"opacity":case"Opacity":return e.opacity}}return Object.defineProperty(e,"rotation",{get:function(){return t.rotation}}),Object.defineProperty(e,"scale",{get:function(){return t.scale}}),Object.defineProperty(e,"position",{get:function(){return t.position}}),Object.defineProperty(e,"xPosition",{get:function(){return t.xPosition}}),Object.defineProperty(e,"yPosition",{get:function(){return t.yPosition}}),Object.defineProperty(e,"anchorPoint",{get:function(){return t.anchorPoint}}),Object.defineProperty(e,"opacity",{get:function(){return t.opacity}}),Object.defineProperty(e,"skew",{get:function(){return t.skew}}),Object.defineProperty(e,"skewAxis",{get:function(){return t.skewAxis}}),e}}(),ProjectInterface=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,s=this.compositions.length;s>e;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),EffectsExpressionInterface=function(){function t(t,s){if(t.effects){var r,i=[],a=t.data.ef,n=t.effects.effectElements.length;for(r=0;n>r;r+=1)i.push(e(a[r],t.effects.effectElements[r],s,t));return function(e){for(var s=t.data.ef,r=0,a=s.length;a>r;){if(e===s[r].nm||e===s[r].mn||e===s[r].ix)return i[r];r+=1}}}}function e(t,r,i,a){var n,o=[],h=t.ef.length;for(n=0;h>n;n+=1)o.push(5===t.ef[n].ty?e(t.ef[n],r.effectElements[n],i,a):s(r.effectElements[n],t.ef[n].ty,a));var l=function(e){for(var s=t.ef,r=0,i=s.length;i>r;){if(e===s[r].nm||e===s[r].mn||e===s[r].ix)return 5===s[r].ty?o[r]:o[r]();r+=1}return o[0]()};return"ADBE Color Control"===t.mn&&Object.defineProperty(l,"color",{get:function(){return o[0]()}}),l.active=0!==t.en,l}function s(t,e,s){return function(){return 10===e?s.comp.compInterface(t.p.v):ExpressionValue(t.p)}}var r={createEffectsInterface:t};return r}(),ExpressionValue=function(){return function(t,e,s){var r;t.k&&t.getValue();var i,a,n;if(s){if("color"===s){for(a=4,r=Array.apply(null,{length:a}),n=Array.apply(null,{length:a}),i=0;a>i;i+=1)r[i]=n[i]=e&&3>i?t.v[i]*e:1;r.value=n}}else if("number"==typeof t.v||t.v instanceof Number)r=new Number(e?t.v*e:t.v),r.value=e?t.v*e:t.v;else{for(a=t.v.length,r=Array.apply(null,{length:a}),n=Array.apply(null,{length:a}),i=0;a>i;i+=1)r[i]=n[i]=e?t.v[i]*e:t.v[i];r.value=n}return r.numKeys=t.keyframes?t.keyframes.length:0,r.key=function(e){return r.numKeys?t.keyframes[e-1].t:0},r.valueAtTime=t.getValueAtTime,r.propertyGroup=t.propertyGroup,r}}();GroupEffect.prototype.getValue=function(){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.mdf=this.dynamicProperties[t].mdf?!0:this.mdf},GroupEffect.prototype.init=function(t,e,s){this.data=t,this.mdf=!1,this.effectElements=[];var r,i,a=this.data.ef.length,n=this.data.ef;for(r=0;a>r;r+=1)switch(n[r].ty){case 0:i=new SliderEffect(n[r],e,s),this.effectElements.push(i);break;case 1:i=new AngleEffect(n[r],e,s),this.effectElements.push(i);break;case 2:i=new ColorEffect(n[r],e,s),this.effectElements.push(i);break;case 3:i=new PointEffect(n[r],e,s),this.effectElements.push(i);break;case 4:case 7:i=new CheckboxEffect(n[r],e,s),this.effectElements.push(i);break;case 10:i=new LayerIndexEffect(n[r],e,s),this.effectElements.push(i);break;case 11:i=new MaskIndexEffect(n[r],e,s),this.effectElements.push(i);break;case 5:i=new EffectsManager(n[r],e,s),this.effectElements.push(i);break;case 6:i=new NoValueEffect(n[r],e,s),this.effectElements.push(i)}};var bodymovinjs={};bodymovinjs.play=play,bodymovinjs.pause=pause,bodymovinjs.togglePause=togglePause,bodymovinjs.setSpeed=setSpeed,bodymovinjs.setDirection=setDirection,bodymovinjs.stop=stop,bodymovinjs.moveFrame=moveFrame,bodymovinjs.searchAnimations=searchAnimations,bodymovinjs.registerAnimation=registerAnimation,bodymovinjs.loadAnimation=loadAnimation,bodymovinjs.setSubframeRendering=setSubframeRendering,bodymovinjs.resize=resize,bodymovinjs.start=start,bodymovinjs.goToAndStop=goToAndStop,bodymovinjs.destroy=destroy,bodymovinjs.setQuality=setQuality,bodymovinjs.installPlugin=installPlugin,bodymovinjs.__getFactory=getFactory,bodymovinjs.version="4.6.11";var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";if(standalone){var scripts=document.getElementsByTagName("script"),index=scripts.length-1,myScript=scripts[index]||{src:""},queryString=myScript.src.replace(/^[^\?]+\??/,"");renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);return bodymovinjs});
\ No newline at end of file
+return i}var c={createShapeInterface:t,createGroupInterface:e,createTrimInterface:i,createStrokeInterface:r,createTransformInterface:a,createEllipseInterface:n,createStarInterface:o,createRectInterface:h,createRoundedInterface:l,createRepatearInterface:p,createPathInterface:m,createFillInterface:s},d=function(){return function(t,e,s){function r(t){if("number"==typeof t)return i[t-1];for(var e=0,s=i.length;s>e;){if(i[e]._name===t)return i[e];e+=1}}var i;return r.propertyGroup=s,i=f(t,e,r),r}}(),u=function(){return function(t,e,s){var r,i=function(t){for(var e=0,s=r.length;s>e;){if(r[e]._name===t||r[e].mn===t||r[e].propertyIndex===t||r[e].ix===t||r[e].ind===t)return r[e];e+=1}return"number"==typeof t?r[t-1]:void 0};return i.propertyGroup=function(t){return 1===t?i:s(t-1)},r=f(t.it,e.it,i.propertyGroup),i.numProperties=r.length,i.propertyIndex=t.cix,i}}(),y=function(){return function(t,e,s){var r=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return r.content;case"ADBE Vector Transform Group":case 3:default:return r.transform}};r.propertyGroup=function(t){return 1===t?r:s(t-1)};var i=u(t,e,r.propertyGroup),a=ShapeExpressionInterface.createTransformInterface(t.it[t.it.length-1],e.it[e.it.length-1],r.propertyGroup);return r.content=i,r.transform=a,Object.defineProperty(r,"_name",{get:function(){return t.nm}}),r.numProperties=t.np,r.propertyIndex=t.ix,r.nm=t.nm,r.mn=t.mn,r}}(),g=function(){return function(t,e,s){function r(t){return"Color"===t||"color"===t?r.color:"Opacity"===t||"opacity"===t?r.opacity:void 0}return Object.defineProperty(r,"color",{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}}),Object.defineProperty(r,"opacity",{get:function(){return ExpressionValue(e.o,100)}}),Object.defineProperty(r,"_name",{value:t.nm}),Object.defineProperty(r,"mn",{value:t.mn}),e.c.setGroupProperty(s),e.o.setGroupProperty(s),r}}(),v=function(){return function(t,e,s){function r(t){return 1===t?c:s(t-1)}function i(t){return 1===t?l:r(t-1)}function a(s){Object.defineProperty(l,t.d[s].nm,{get:function(){return ExpressionValue(e.d.dataProps[s].p)}})}function n(t){return"Color"===t||"color"===t?n.color:"Opacity"===t||"opacity"===t?n.opacity:"Stroke Width"===t||"stroke width"===t?n.strokeWidth:void 0}var o,h=t.d?t.d.length:0,l={};for(o=0;h>o;o+=1)a(o),e.d.dataProps[o].p.setGroupProperty(i);return Object.defineProperty(n,"color",{get:function(){return ExpressionValue(e.c,1/e.c.mult,"color")}}),Object.defineProperty(n,"opacity",{get:function(){return ExpressionValue(e.o,100)}}),Object.defineProperty(n,"strokeWidth",{get:function(){return ExpressionValue(e.w)}}),Object.defineProperty(n,"dash",{get:function(){return l}}),Object.defineProperty(n,"_name",{value:t.nm}),Object.defineProperty(n,"mn",{value:t.mn}),e.c.setGroupProperty(r),e.o.setGroupProperty(r),e.w.setGroupProperty(r),n}}(),b=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return e===t.e.ix||"End"===e||"end"===e?i.end:e===t.s.ix?i.start:e===t.o.ix?i.offset:void 0}return i.propertyIndex=t.ix,e.s.setGroupProperty(r),e.e.setGroupProperty(r),e.o.setGroupProperty(r),i.propertyIndex=t.ix,Object.defineProperty(i,"start",{get:function(){return ExpressionValue(e.s,1/e.s.mult)}}),Object.defineProperty(i,"end",{get:function(){return ExpressionValue(e.e,1/e.e.mult)}}),Object.defineProperty(i,"offset",{get:function(){return ExpressionValue(e.o)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),E=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.a.ix===e?i.anchorPoint:t.o.ix===e?i.opacity:t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.s.ix===e?i.scale:t.sk&&t.sk.ix===e?i.skew:t.sa&&t.sa.ix===e?i.skewAxis:"Opacity"===e?i.opacity:"Position"===e?i.position:"Anchor Point"===e?i.anchorPoint:"Scale"===e?i.scale:"Rotation"===e||"ADBE Vector Rotation"===e?i.rotation:"Skew"===e?i.skew:"Skew Axis"===e?i.skewAxis:void 0}e.transform.mProps.o.setGroupProperty(r),e.transform.mProps.p.setGroupProperty(r),e.transform.mProps.a.setGroupProperty(r),e.transform.mProps.s.setGroupProperty(r),e.transform.mProps.r.setGroupProperty(r),e.transform.mProps.sk&&(e.transform.mProps.sk.setGroupProperty(r),e.transform.mProps.sa.setGroupProperty(r)),e.transform.op.setGroupProperty(r),Object.defineProperty(i,"opacity",{get:function(){return ExpressionValue(e.transform.mProps.o,1/e.transform.mProps.o.mult)}}),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(e.transform.mProps.p)}}),Object.defineProperty(i,"anchorPoint",{get:function(){return ExpressionValue(e.transform.mProps.a)}});return Object.defineProperty(i,"scale",{get:function(){return ExpressionValue(e.transform.mProps.s,1/e.transform.mProps.s.mult)}}),Object.defineProperty(i,"rotation",{get:function(){return ExpressionValue(e.transform.mProps.r,1/e.transform.mProps.r.mult)}}),Object.defineProperty(i,"skew",{get:function(){return ExpressionValue(e.transform.mProps.sk)}}),Object.defineProperty(i,"skewAxis",{get:function(){return ExpressionValue(e.transform.mProps.sa)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.ty="tr",i.mn=t.mn,i}}(),P=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.p.ix===e?i.position:t.s.ix===e?i.size:void 0}i.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.s.setGroupProperty(r),a.p.setGroupProperty(r),Object.defineProperty(i,"size",{get:function(){return ExpressionValue(a.s)}}),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(a.p)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),x=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.pt.ix===e?i.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?i.outerRadius:t.os.ix===e?i.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?i.innerRoundness:void 0:i.innerRadius}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.or.setGroupProperty(r),a.os.setGroupProperty(r),a.pt.setGroupProperty(r),a.p.setGroupProperty(r),a.r.setGroupProperty(r),t.ir&&(a.ir.setGroupProperty(r),a.is.setGroupProperty(r)),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(a.p)}}),Object.defineProperty(i,"rotation",{get:function(){return ExpressionValue(a.r,1/a.r.mult)}}),Object.defineProperty(i,"points",{get:function(){return ExpressionValue(a.pt)}}),Object.defineProperty(i,"outerRadius",{get:function(){return ExpressionValue(a.or)}}),Object.defineProperty(i,"outerRoundness",{get:function(){return ExpressionValue(a.os)}}),Object.defineProperty(i,"innerRadius",{get:function(){return a.ir?ExpressionValue(a.ir):0}}),Object.defineProperty(i,"innerRoundness",{get:function(){return a.is?ExpressionValue(a.is,1/a.is.mult):0}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),S=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.s.ix===e||"Size"===e?i.size:void 0}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return i.propertyIndex=t.ix,a.p.setGroupProperty(r),a.s.setGroupProperty(r),a.r.setGroupProperty(r),Object.defineProperty(i,"position",{get:function(){return ExpressionValue(a.p)}}),Object.defineProperty(i,"roundness",{get:function(){return ExpressionValue(a.r)}}),Object.defineProperty(i,"size",{get:function(){return ExpressionValue(a.s)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),C=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.r.ix===e||"Round Corners 1"===e?i.radius:void 0}var a=e;return i.propertyIndex=t.ix,a.rd.setGroupProperty(r),Object.defineProperty(i,"radius",{get:function(){return ExpressionValue(a.rd)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),k=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.c.ix===e||"Copies"===e?i.copies:t.o.ix===e||"Offset"===e?i.offset:void 0}var a=e;return i.propertyIndex=t.ix,a.c.setGroupProperty(r),a.o.setGroupProperty(r),Object.defineProperty(i,"copies",{get:function(){return ExpressionValue(a.c)}}),Object.defineProperty(i,"offset",{get:function(){return ExpressionValue(a.o)}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.mn=t.mn,i}}(),M=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(t){return"Shape"===t||"shape"===t||"Path"===t||"path"===t?i.path:void 0}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.setGroupProperty(r),Object.defineProperty(i,"path",{get:function(){return a.k&&a.getValue(),a.v}}),Object.defineProperty(i,"shape",{get:function(){return a.k&&a.getValue(),a.v}}),Object.defineProperty(i,"_name",{value:t.nm}),Object.defineProperty(i,"ix",{value:t.ix}),Object.defineProperty(i,"mn",{value:t.mn}),i}}();return c}(),TextExpressionInterface=function(){return function(t){function e(){}return Object.defineProperty(e,"sourceText",{get:function(){return t.currentTextDocumentData.t?t.currentTextDocumentData.t:""}}),e}}(),LayerExpressionInterface=function(){function t(t,e){var s=new Matrix;s.reset();var r;if(r=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,r.applyToMatrix(s),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;a>i;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(s);return s.applyToPointArray(t[0],t[1],t[2]||0)}return s.applyToPointArray(t[0],t[1],t[2]||0)}function e(t,e){var s=new Matrix;s.reset();var r;if(r=e?this._elem.finalTransform.mProp:this._elem.finalTransform.mProp,r.applyToMatrix(s),this._elem.hierarchy&&this._elem.hierarchy.length){var i,a=this._elem.hierarchy.length;for(i=0;a>i;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(s);return s.inversePoint(t)}return s.inversePoint(t)}function s(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var s,r=this._elem.hierarchy.length;for(s=0;r>s;s+=1)this._elem.hierarchy[s].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}return function(r){function i(t){n.mask=t.getMask.bind(t)}function a(t){n.effect=t}function n(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return n.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return o;case 4:case"ADBE Effect Parade":return n.effect}}var o=TransformExpressionInterface(r.transform);return n.toWorld=t,n.fromWorld=e,n.toComp=t,n.fromComp=s,n._elem=r,Object.defineProperty(n,"hasParent",{get:function(){return!!r.hierarchy}}),Object.defineProperty(n,"parent",{get:function(){return r.hierarchy[0].layerInterface}}),Object.defineProperty(n,"rotation",{get:function(){return o.rotation}}),Object.defineProperty(n,"scale",{get:function(){return o.scale}}),Object.defineProperty(n,"position",{get:function(){return o.position}}),Object.defineProperty(n,"anchorPoint",{get:function(){return o.anchorPoint}}),Object.defineProperty(n,"transform",{get:function(){return o}}),Object.defineProperty(n,"width",{get:function(){return 0===r.data.ty?r.data.w:100}}),Object.defineProperty(n,"height",{get:function(){return 0===r.data.ty?r.data.h:100}}),Object.defineProperty(n,"source",{get:function(){return r.data.refId}}),Object.defineProperty(n,"_name",{value:r.data.nm}),Object.defineProperty(n,"content",{get:function(){return n.shapeInterface}}),Object.defineProperty(n,"active",{get:function(){return r.isVisible}}),Object.defineProperty(n,"text",{get:function(){return n.textInterface}}),n.registerMaskInterface=i,n.registerEffectsInterface=a,n}}(),CompExpressionInterface=function(){return function(t){function e(e){for(var s=0,r=t.layers.length;r>s;){if(t.layers[s].nm===e||t.layers[s].ind===e)return t.elements[s].layerInterface;s+=1}return{active:!1}}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t.globalData.compSize.h,e.width=t.globalData.compSize.w,e.pixelAspect=1,e.frameDuration=1/t.globalData.frameRate,e}}(),TransformExpressionInterface=function(){return function(t){function e(s){switch(s){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"position":case"Position":case"ADBE Position":case 2:return t.position;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity}}return Object.defineProperty(e,"rotation",{get:function(){return t.rotation}}),Object.defineProperty(e,"scale",{get:function(){return t.scale}}),Object.defineProperty(e,"position",{get:function(){return t.position}}),Object.defineProperty(e,"xPosition",{get:function(){return t.xPosition}}),Object.defineProperty(e,"yPosition",{get:function(){return t.yPosition}}),Object.defineProperty(e,"anchorPoint",{get:function(){return t.anchorPoint}}),Object.defineProperty(e,"opacity",{get:function(){return t.opacity}}),Object.defineProperty(e,"skew",{get:function(){return t.skew}}),Object.defineProperty(e,"skewAxis",{get:function(){return t.skewAxis}}),e}}(),ProjectInterface=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,s=this.compositions.length;s>e;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),EffectsExpressionInterface=function(){function t(t,s){if(t.effects){var r,i=[],a=t.data.ef,n=t.effects.effectElements.length;for(r=0;n>r;r+=1)i.push(e(a[r],t.effects.effectElements[r],s,t));return function(e){for(var s=t.data.ef,r=0,a=s.length;a>r;){if(e===s[r].nm||e===s[r].mn||e===s[r].ix)return i[r];r+=1}}}}function e(t,r,i,a){var n,o=[],h=t.ef.length;for(n=0;h>n;n+=1)o.push(5===t.ef[n].ty?e(t.ef[n],r.effectElements[n],i,a):s(r.effectElements[n],t.ef[n].ty,a));var l=function(e){for(var s=t.ef,r=0,i=s.length;i>r;){if(e===s[r].nm||e===s[r].mn||e===s[r].ix)return 5===s[r].ty?o[r]:o[r]();r+=1}return o[0]()};return"ADBE Color Control"===t.mn&&Object.defineProperty(l,"color",{get:function(){return o[0]()}}),l.active=0!==t.en,l}function s(t,e,s){return function(){return 10===e?s.comp.compInterface(t.p.v):ExpressionValue(t.p)}}var r={createEffectsInterface:t};return r}(),ExpressionValue=function(){return function(t,e,s){var r;t.k&&t.getValue();var i,a,n;if(s){if("color"===s){for(a=4,r=Array.apply(null,{length:a}),n=Array.apply(null,{length:a}),i=0;a>i;i+=1)r[i]=n[i]=e&&3>i?t.v[i]*e:1;r.value=n}}else if("number"==typeof t.v||t.v instanceof Number)r=new Number(e?t.v*e:t.v),r.value=e?t.v*e:t.v;else{for(a=t.v.length,r=Array.apply(null,{length:a}),n=Array.apply(null,{length:a}),i=0;a>i;i+=1)r[i]=n[i]=e?t.v[i]*e:t.v[i];r.value=n}return r.numKeys=t.keyframes?t.keyframes.length:0,r.key=function(e){return r.numKeys?t.keyframes[e-1].t:0},r.valueAtTime=t.getValueAtTime,r.propertyGroup=t.propertyGroup,r}}();GroupEffect.prototype.getValue=function(){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.mdf=this.dynamicProperties[t].mdf?!0:this.mdf},GroupEffect.prototype.init=function(t,e,s){this.data=t,this.mdf=!1,this.effectElements=[];var r,i,a=this.data.ef.length,n=this.data.ef;for(r=0;a>r;r+=1)switch(n[r].ty){case 0:i=new SliderEffect(n[r],e,s),this.effectElements.push(i);break;case 1:i=new AngleEffect(n[r],e,s),this.effectElements.push(i);break;case 2:i=new ColorEffect(n[r],e,s),this.effectElements.push(i);break;case 3:i=new PointEffect(n[r],e,s),this.effectElements.push(i);break;case 4:case 7:i=new CheckboxEffect(n[r],e,s),this.effectElements.push(i);break;case 10:i=new LayerIndexEffect(n[r],e,s),this.effectElements.push(i);break;case 11:i=new MaskIndexEffect(n[r],e,s),this.effectElements.push(i);break;case 5:i=new EffectsManager(n[r],e,s),this.effectElements.push(i);break;case 6:i=new NoValueEffect(n[r],e,s),this.effectElements.push(i)}};var bodymovinjs={};bodymovinjs.play=play,bodymovinjs.pause=pause,bodymovinjs.togglePause=togglePause,bodymovinjs.setSpeed=setSpeed,bodymovinjs.setDirection=setDirection,bodymovinjs.stop=stop,bodymovinjs.moveFrame=moveFrame,bodymovinjs.searchAnimations=searchAnimations,bodymovinjs.registerAnimation=registerAnimation,bodymovinjs.loadAnimation=loadAnimation,bodymovinjs.setSubframeRendering=setSubframeRendering,bodymovinjs.resize=resize,bodymovinjs.start=start,bodymovinjs.goToAndStop=goToAndStop,bodymovinjs.destroy=destroy,bodymovinjs.setQuality=setQuality,bodymovinjs.installPlugin=installPlugin,bodymovinjs.__getFactory=getFactory,bodymovinjs.version="4.8.0";var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";if(standalone){var scripts=document.getElementsByTagName("script"),index=scripts.length-1,myScript=scripts[index]||{src:""},queryString=myScript.src.replace(/^[^\?]+\??/,"");renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);return bodymovinjs});
\ No newline at end of file
diff --git a/build/player/bodymovin_light.js b/build/player/bodymovin_light.js
index c87bb07..06dfab8 100644
--- a/build/player/bodymovin_light.js
+++ b/build/player/bodymovin_light.js
@@ -1,4 +1,4 @@
-(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {var svgNS = "http://www.w3.org/2000/svg";
+var window=(typeof window === "undefined")?{}:window;(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {var svgNS = "http://www.w3.org/2000/svg";
 var subframeEnabled = true;
 var expressionsPlugin;
 var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
@@ -521,6 +521,7 @@
                 this.props[14] = this.props[12] * c2 + this.props[13] * g2 + this.props[14] * k2 + this.props[15] * o2 ;
                 this.props[15] = this.props[12] * d2 + this.props[13] * h2 + this.props[14] * l2 + this.props[15] * p2 ;
             }
+            this._identityCalculated = false;
             return this;
         }
 
@@ -566,9 +567,21 @@
         this.props[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2 ;
         this.props[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2 ;
 
+        this._identityCalculated = false;
         return this;
     }
 
+    function isIdentity() {
+        if(!this._identityCalculated){
+            this._identity = !(this.props[0] !== 1 || this.props[1] !== 0 || this.props[2] !== 0 || this.props[3] !== 0
+                || this.props[4] !== 0 || this.props[5] !== 1 || this.props[6] !== 0 || this.props[7] !== 0
+                || this.props[8] !== 0 || this.props[9] !== 0 || this.props[10] !== 1 || this.props[11] !== 0
+                || this.props[12] !== 0 || this.props[13] !== 0 || this.props[14] !== 0 || this.props[15] !== 1);
+            this._identityCalculated = true;
+        }
+        return this._identity;
+    }
+
     function clone(matr){
         var i;
         for(i=0;i<16;i+=1){
@@ -634,6 +647,9 @@
         return [x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]];
     }
     function applyToPointStringified(x, y) {
+        if(this.isIdentity()) {
+            return x + ',' + y;
+        }
         return (bm_rnd(x * this.props[0] + y * this.props[4] + this.props[12]))+','+(bm_rnd(x * this.props[1] + y * this.props[5] + this.props[13]));
     }
 
@@ -686,6 +702,9 @@
         this.inversePoints = inversePoints;
         this.inversePoint = inversePoint;
         this._t = this.transform;
+        this.isIdentity = isIdentity;
+        this._identity = true;
+        this._identityCalculated = false;
 
         this.props = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];
 
@@ -1161,6 +1180,9 @@
     }
 
     function pointOnLine3D(x1,y1,z1, x2,y2,z2, x3,y3,z3){
+        if(z1 === 0 && z2 === 0 && z3 === 0) {
+            return pointOnLine2D(x1,y1, x2,y2, x3,y3);
+        }
         var dist1 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2) + Math.pow(z2 - z1, 2));
         var dist2 = Math.sqrt(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2) + Math.pow(z3 - z1, 2));
         var dist3 = Math.sqrt(Math.pow(x3 - x2, 2) + Math.pow(y3 - y2, 2) + Math.pow(z3 - z2, 2));
@@ -1537,6 +1559,28 @@
         }
     }())
 
+    var checkChars = (function() {
+        var minimumVersion = [4,7,99];
+        return function (animationData){
+            if(animationData.chars && !checkVersion(minimumVersion,animationData.v)){
+                var i, len = animationData.chars.length, j, jLen, k, kLen;
+                var pathData, paths;
+                for(i = 0; i < len; i += 1) {
+                    if(animationData.chars[i].data && animationData.chars[i].data.shapes) {
+                        paths = animationData.chars[i].data.shapes[0].it;
+                        jLen = paths.length;
+
+                        for(j = 0; j < jLen; j += 1) {
+                            pathData = paths[j].ks.k;
+                            convertPathsToAbsoluteValues(paths[j].ks.k);
+                        }
+                    }
+                }
+            }
+        }
+
+    }())
+
     var checkColors = (function(){
         var minimumVersion = [4,1,9];
 
@@ -1833,6 +1877,7 @@
         }
         checkColors(animationData);
         checkText(animationData);
+        checkChars(animationData);
         checkShapes(animationData);
         completeLayers(animationData.layers, animationData.assets, fontManager);
         animationData.__complete = true;
@@ -2531,7 +2576,11 @@
 
     var TransformProperty = (function() {
         function positionGetter() {
-            return ExpressionValue(this.p);
+            if(this.p) {
+                return ExpressionValue(this.p);
+            } else {
+                return [this.px.v, this.py.v, this.pz ? this.pz.v : 0];
+            }
         }
         function xPositionGetter() {
             return ExpressionValue(this.px);
@@ -2549,7 +2598,11 @@
             return ExpressionValue(this.or);
         }
         function rotationGetter() {
-            return ExpressionValue(this.r, 1/degToRads);
+            if(this.r) {
+                return ExpressionValue(this.r, 1/degToRads);
+            } else {
+                return ExpressionValue(this.rz, 1/degToRads);
+            }
         }
         function scaleGetter() {
             return ExpressionValue(this.s, 100);
@@ -4702,8 +4755,10 @@
     };
     this.renderConfig = {
         preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
-        progressiveLoad: (config && config.progressiveLoad) || false
+        progressiveLoad: (config && config.progressiveLoad) || false,
+        hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true
     };
+    this.globalData.renderConfig = this.renderConfig;
     this.elements = [];
     this.pendingElements = [];
     this.destroyed = false;
@@ -5422,6 +5477,7 @@
     this.data = data;
     this.matteElement = null;
     this.transformedElement = null;
+    this.isTransparent = false;
     this.parentContainer = parentContainer;
     this.layerId = placeholder ? placeholder.layerId : 'ly_'+randomString(10);
     this.placeholder = placeholder;
@@ -5669,6 +5725,15 @@
         this.transformedElement.setAttribute('transform',finalMat.to2dCSS());
     }
     if(this.finalTransform.opMdf && this.layerElement){
+        if(this.finalTransform.op.v <= 0) {
+            if(!this.isTransparent && this.globalData.renderConfig.hideOnTransparent){
+                this.isTransparent = true;
+                this.hide();
+            }
+        } else if(this.hidden && this.isTransparent){
+            this.isTransparent = false;
+            this.show();
+        }
         this.transformedElement.setAttribute('opacity',this.finalTransform.op.v);
     }
 
@@ -5714,7 +5779,606 @@
 };
 
 SVGBaseElement.prototype.hide = function(){
+    if(!this.hidden){
+        this.layerElement.style.display = 'none';
+        this.hidden = true;
+    }
+};
 
+SVGBaseElement.prototype.show = function(){
+    if(this.isVisible && !this.isTransparent){
+        this.hidden = false;
+        this.layerElement.style.display = 'block';
+    }
+};
+
+function IShapeElement(data,parentContainer,globalData,comp, placeholder){
+    this.shapes = [];
+    this.shapesData = data.shapes;
+    this.stylesList = [];
+    this.viewData = [];
+    this.shapeModifiers = [];
+    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
+}
+createElement(SVGBaseElement, IShapeElement);
+
+IShapeElement.prototype.identityMatrix = new Matrix();
+
+IShapeElement.prototype.lcEnum = {
+    '1': 'butt',
+    '2': 'round',
+    '3': 'butt'
+}
+
+IShapeElement.prototype.ljEnum = {
+    '1': 'miter',
+    '2': 'round',
+    '3': 'butt'
+}
+
+IShapeElement.prototype.buildExpressionInterface = function(){};
+
+IShapeElement.prototype.createElements = function(){
+    //TODO check if I can use symbol so i can set its viewBox
+    this._parent.createElements.call(this);
+    this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties, 0);
+    if(!this.data.hd || this.data.td){
+        styleUnselectableDiv(this.layerElement);
+    }
+    //this.elemInterface.registerShapeExpressionInterface(ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.elemInterface));
+};
+
+IShapeElement.prototype.setGradientData = function(pathElement,arr,data){
+
+    var gradientId = 'gr_'+randomString(10);
+    var gfill;
+    if(arr.t === 1){
+        gfill = document.createElementNS(svgNS,'linearGradient');
+    } else {
+        gfill = document.createElementNS(svgNS,'radialGradient');
+    }
+    gfill.setAttribute('id',gradientId);
+    gfill.setAttribute('spreadMethod','pad');
+    gfill.setAttribute('gradientUnits','userSpaceOnUse');
+    var stops = [];
+    var stop, j, jLen;
+    jLen = arr.g.p*4;
+    for(j=0;j<jLen;j+=4){
+        stop = document.createElementNS(svgNS,'stop');
+        gfill.appendChild(stop);
+        stops.push(stop);
+    }
+    pathElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+gradientId+')');
+    this.globalData.defs.appendChild(gfill);
+    data.gf = gfill;
+    data.cst = stops;
+}
+
+IShapeElement.prototype.setGradientOpacity = function(arr, data, styleOb){
+    if((arr.g.k.k[0].s && arr.g.k.k[0].s.length > arr.g.p*4) || arr.g.k.k.length > arr.g.p*4){
+        var opFill;
+        var stop, j, jLen;
+        var mask = document.createElementNS(svgNS,"mask");
+        var maskElement = document.createElementNS(svgNS, 'path');
+        mask.appendChild(maskElement);
+        var opacityId = 'op_'+randomString(10);
+        var maskId = 'mk_'+randomString(10);
+        mask.setAttribute('id',maskId);
+        if(arr.t === 1){
+            opFill = document.createElementNS(svgNS,'linearGradient');
+        } else {
+            opFill = document.createElementNS(svgNS,'radialGradient');
+        }
+        opFill.setAttribute('id',opacityId);
+        opFill.setAttribute('spreadMethod','pad');
+        opFill.setAttribute('gradientUnits','userSpaceOnUse');
+        jLen = arr.g.k.k[0].s ? arr.g.k.k[0].s.length : arr.g.k.k.length;
+        var stops = [];
+        for(j=arr.g.p*4;j<jLen;j+=2){
+            stop = document.createElementNS(svgNS,'stop');
+            stop.setAttribute('stop-color','rgb(255,255,255)');
+            //stop.setAttribute('offset',Math.round(arr.y[j][0]*100)+'%');
+            //stop.setAttribute('style','stop-color:rgb(255,255,255);stop-opacity:'+arr.y[j][1]);
+            opFill.appendChild(stop);
+            stops.push(stop);
+        }
+        maskElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+opacityId+')');
+        this.globalData.defs.appendChild(opFill);
+        this.globalData.defs.appendChild(mask);
+        data.of = opFill;
+        data.ost = stops;
+        styleOb.msElem = maskElement;
+        return maskId;
+    }
+};
+
+IShapeElement.prototype.searchShapes = function(arr,data,container,dynamicProperties, level, transformers){
+    transformers = transformers || [];
+    var ownTransformers = [].concat(transformers);
+    var i, len = arr.length - 1;
+    var j, jLen;
+    var ownArrays = [], ownModifiers = [], styleOb, currentTransform;
+    for(i=len;i>=0;i-=1){
+        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
+            data[i] = {};
+            styleOb = {
+                type: arr[i].ty,
+                d: '',
+                ld: '',
+                lvl: level,
+                mdf: false
+            };
+            var pathElement = document.createElementNS(svgNS, "path");
+            data[i].o = PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties);
+            if(arr[i].ty == 'st' || arr[i].ty == 'gs') {
+                pathElement.setAttribute('stroke-linecap', this.lcEnum[arr[i].lc] || 'round');
+                ////pathElement.style.strokeLinecap = this.lcEnum[arr[i].lc] || 'round';
+                pathElement.setAttribute('stroke-linejoin',this.ljEnum[arr[i].lj] || 'round');
+                ////pathElement.style.strokeLinejoin = this.ljEnum[arr[i].lj] || 'round';
+                pathElement.setAttribute('fill-opacity','0');
+                ////pathElement.style.fillOpacity = 0;
+                if(arr[i].lj == 1) {
+                    pathElement.setAttribute('stroke-miterlimit',arr[i].ml);
+                    ////pathElement.style.strokeMiterlimit = arr[i].ml;
+                }
+
+                data[i].w = PropertyFactory.getProp(this,arr[i].w,0,null,dynamicProperties);
+                if(arr[i].d){
+                    var d = PropertyFactory.getDashProp(this,arr[i].d,'svg',dynamicProperties);
+                    if(!d.k){
+                        pathElement.setAttribute('stroke-dasharray', d.dasharray);
+                        ////pathElement.style.strokeDasharray = d.dasharray;
+                        pathElement.setAttribute('stroke-dashoffset', d.dashoffset);
+                        ////pathElement.style.strokeDashoffset = d.dashoffset;
+                    }
+                    data[i].d = d;
+                }
+
+            }
+            if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
+                data[i].c = PropertyFactory.getProp(this,arr[i].c,1,255,dynamicProperties);
+                container.appendChild(pathElement);
+            } else {
+                data[i].g = PropertyFactory.getGradientProp(this,arr[i].g,dynamicProperties);
+                if(arr[i].t == 2){
+                    data[i].h = PropertyFactory.getProp(this,arr[i].h,1,0.01,dynamicProperties);
+                    data[i].a = PropertyFactory.getProp(this,arr[i].a,1,degToRads,dynamicProperties);
+                }
+                data[i].s = PropertyFactory.getProp(this,arr[i].s,1,null,dynamicProperties);
+                data[i].e = PropertyFactory.getProp(this,arr[i].e,1,null,dynamicProperties);
+                this.setGradientData(pathElement,arr[i],data[i], styleOb);
+                var maskId = this.setGradientOpacity(arr[i],data[i], styleOb);
+                if(maskId){
+                    pathElement.setAttribute('mask','url(#'+maskId+')');
+                }
+                data[i].elem = pathElement;
+                container.appendChild(pathElement);
+            }
+            if(arr[i].r === 2) {
+                pathElement.setAttribute('fill-rule', 'evenodd');
+            }
+
+            if(arr[i].ln){
+                pathElement.setAttribute('id',arr[i].ln);
+            }
+            if(arr[i].cl){
+                pathElement.setAttribute('class',arr[i].cl);
+            }
+            styleOb.pElem = pathElement;
+            this.stylesList.push(styleOb);
+            data[i].style = styleOb;
+            ownArrays.push(styleOb);
+        }else if(arr[i].ty == 'gr'){
+            data[i] = {
+                it: []
+            };
+            var g = document.createElementNS(svgNS,'g');
+            container.appendChild(g);
+            data[i].gr = g;
+            this.searchShapes(arr[i].it,data[i].it,g,dynamicProperties, level + 1, ownTransformers);
+        }else if(arr[i].ty == 'tr'){
+            data[i] = {
+                transform : {
+                    op: PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties),
+                    mProps: PropertyFactory.getProp(this,arr[i],2,null,dynamicProperties)
+                },
+                elements: []
+            };
+            currentTransform = data[i].transform;
+            ownTransformers.push(currentTransform);
+        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
+            data[i] = {
+                elements : [],
+                caches:[],
+                styles : [],
+                transformers: ownTransformers,
+                lStr: ''
+            };
+            var ty = 4;
+            if(arr[i].ty == 'rc'){
+                ty = 5;
+            }else if(arr[i].ty == 'el'){
+                ty = 6;
+            }else if(arr[i].ty == 'sr'){
+                ty = 7;
+            }
+            data[i].sh = ShapePropertyFactory.getShapeProp(this,arr[i],ty,dynamicProperties);
+            data[i].lvl = level;
+            this.shapes.push(data[i].sh);
+            this.addShapeToModifiers(data[i]);
+            jLen = this.stylesList.length;
+            for(j=0;j<jLen;j+=1){
+                if(!this.stylesList[j].closed){
+                    data[i].elements.push({
+                        ty:this.stylesList[j].type,
+                        st: this.stylesList[j]
+                    });
+                }
+            }
+        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms' || arr[i].ty == 'rp'){
+            var modifier = ShapeModifiers.getModifier(arr[i].ty);
+            modifier.init(this,arr[i],dynamicProperties);
+            this.shapeModifiers.push(modifier);
+            ownModifiers.push(modifier);
+            data[i] = modifier;
+        }
+    }
+    len = ownArrays.length;
+    for(i=0;i<len;i+=1){
+        ownArrays[i].closed = true;
+    }
+    len = ownModifiers.length;
+    for(i=0;i<len;i+=1){
+        ownModifiers[i].closed = true;
+    }
+};
+
+IShapeElement.prototype.addShapeToModifiers = function(data) {
+    var i, len = this.shapeModifiers.length;
+    for(i=0;i<len;i+=1){
+        this.shapeModifiers[i].addShape(data);
+    }
+};
+
+IShapeElement.prototype.renderModifiers = function() {
+    if(!this.shapeModifiers.length){
+        return;
+    }
+    var i, len = this.shapes.length;
+    for(i=0;i<len;i+=1){
+        this.shapes[i].reset();
+    }
+
+
+    len = this.shapeModifiers.length;
+
+    for(i=len-1;i>=0;i-=1){
+        this.shapeModifiers[i].processShapes(this.firstFrame);
+    }
+};
+
+IShapeElement.prototype.renderFrame = function(parentMatrix){
+    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
+    if(renderParent===false){
+        this.hide();
+        return;
+    }
+    this.globalToLocal([0,0,0]);
+    if(this.hidden){
+        this.layerElement.style.display = 'block';
+        this.hidden = false;
+    }
+    this.renderModifiers();
+    this.renderShape(null,null,true, null);
+};
+
+IShapeElement.prototype.hide = function(){
+    if(!this.hidden){
+        this.layerElement.style.display = 'none';
+        var i, len = this.stylesList.length;
+        for(i=len-1;i>=0;i-=1){
+            if(this.stylesList[i].ld !== '0'){
+                this.stylesList[i].ld = '0';
+                this.stylesList[i].pElem.style.display = 'none';
+                if(this.stylesList[i].pElem.parentNode){
+                    this.stylesList[i].parent = this.stylesList[i].pElem.parentNode;
+                    //this.stylesList[i].pElem.parentNode.removeChild(this.stylesList[i].pElem);
+                }
+            }
+        }
+        this.hidden = true;
+    }
+};
+
+IShapeElement.prototype.renderShape = function(items,data,isMain, container){
+    var i, len;
+    if(!items){
+        items = this.shapesData;
+        len = this.stylesList.length;
+        for(i=0;i<len;i+=1){
+            this.stylesList[i].d = '';
+            this.stylesList[i].mdf = false;
+        }
+    }
+    if(!data){
+        data = this.viewData;
+    }
+    ///
+    ///
+    len = items.length - 1;
+    var ty;
+    for(i=len;i>=0;i-=1){
+        ty = items[i].ty;
+        if(ty == 'tr'){
+            if(this.firstFrame || data[i].transform.op.mdf && container){
+                container.setAttribute('opacity',data[i].transform.op.v);
+            }
+            if(this.firstFrame || data[i].transform.mProps.mdf && container){
+                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
+            }
+        }else if(ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr'){
+            this.renderPath(items[i],data[i]);
+        }else if(ty == 'fl'){
+            this.renderFill(items[i],data[i]);
+        }else if(ty == 'gf'){
+            this.renderGradient(items[i],data[i]);
+        }else if(ty == 'gs'){
+            this.renderGradient(items[i],data[i]);
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'st'){
+            this.renderStroke(items[i],data[i]);
+        }else if(ty == 'gr'){
+            this.renderShape(items[i].it,data[i].it,false, data[i].gr);
+        }else if(ty == 'tm'){
+            //
+        }
+    }
+    if(isMain) {
+        len = this.stylesList.length;
+        for (i = 0; i < len; i += 1) {
+            if (this.stylesList[i].ld === '0') {
+                this.stylesList[i].ld = '1';
+                this.stylesList[i].pElem.style.display = 'block';
+                //this.stylesList[i].parent.appendChild(this.stylesList[i].pElem);
+            }
+            if (this.stylesList[i].mdf || this.firstFrame) {
+                this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d);
+                if(this.stylesList[i].msElem){
+                    this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
+                }
+            }
+        }
+        if (this.firstFrame) {
+            this.firstFrame = false;
+        }
+    }
+
+};
+
+IShapeElement.prototype.buildShapeString = function(pathNodes, length, closed, mat) {
+    var i, shapeString = '';
+    for(i = 1; i < length; i += 1) {
+        if (i === 1) {
+            shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+        }
+        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
+    }
+    if (length === 1) {
+        shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+    }
+    if (closed && length) {
+        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+        shapeString += 'z';
+    }
+    return shapeString;
+}
+
+IShapeElement.prototype.renderPath = function(pathData,viewData){
+    var len, i, j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = viewData.elements.length;
+    var lvl = viewData.lvl;
+    for(l=0;l<lLen;l+=1){
+        redraw = viewData.sh.mdf || this.firstFrame;
+        pathStringTransformed = 'M0 0';
+        var paths = viewData.sh.paths;
+        jLen = paths._length;
+        if(viewData.elements[l].st.lvl < lvl){
+            var mat = this.mHelper.reset(), props;
+            var iterations = lvl - viewData.elements[l].st.lvl;
+            var k = viewData.transformers.length-1;
+            while(iterations > 0) {
+                redraw = viewData.transformers[k].mProps.mdf || redraw;
+                props = viewData.transformers[k].mProps.v.props;
+                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
+                iterations --;
+                k --;
+            }
+            if(redraw){
+                for(j=0;j<jLen;j+=1){
+                    pathNodes = paths.shapes[j];
+                    if(pathNodes && pathNodes._length){
+                        pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
+                        /*len = pathNodes._length;
+                        for (i = 1; i < len; i += 1) {
+                            if (i == 1) {
+                                pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            }
+                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
+                        }
+                        if (len == 1) {
+                            pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                        }
+                        if (pathNodes.c) {
+                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            pathStringTransformed += 'z';
+                        }*/
+                    }
+                }
+                viewData.caches[l] = pathStringTransformed;
+            } else {
+                pathStringTransformed = viewData.caches[l];
+            }
+        } else {
+            if(redraw){
+                for(j=0;j<jLen;j+=1){
+                    pathNodes = paths.shapes[j];
+                    if(pathNodes && pathNodes._length){
+                        pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, this.identityMatrix);
+                        /*len = pathNodes._length;
+                        for (i = 1; i < len; i += 1) {
+                            if (i == 1) {
+                                //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                                pathStringTransformed += " M" + pathNodes.v[0].join(',');
+                            }
+                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
+                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[i].join(',') + " " + pathNodes.v[i].join(',');
+                        }
+                        if (len == 1) {
+                            //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            pathStringTransformed += " M" + pathNodes.v[0].join(',');
+                        }
+                        if (pathNodes.c && len) {
+                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[0].join(',') + " " + pathNodes.v[0].join(',');
+                            pathStringTransformed += 'z';
+                        }*/
+                    }
+                }
+                viewData.caches[l] = pathStringTransformed;
+            } else {
+                pathStringTransformed = viewData.caches[l];
+            }
+        }
+        viewData.elements[l].st.d += pathStringTransformed;
+        viewData.elements[l].st.mdf = redraw || viewData.elements[l].st.mdf;
+    }
+
+};
+
+IShapeElement.prototype.renderFill = function(styleData,viewData){
+    var styleElem = viewData.style;
+
+    if(viewData.c.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
+        ////styleElem.pElem.style.fill = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
+    }
+    if(viewData.o.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('fill-opacity',viewData.o.v);
+    }
+};
+
+IShapeElement.prototype.renderGradient = function(styleData,viewData){
+    var gfill = viewData.gf;
+    var opFill = viewData.of;
+    var pt1 = viewData.s.v,pt2 = viewData.e.v;
+
+    if(viewData.o.mdf || this.firstFrame){
+        var attr = styleData.ty === 'gf' ? 'fill-opacity':'stroke-opacity';
+        viewData.elem.setAttribute(attr,viewData.o.v);
+    }
+    //clippedElement.setAttribute('transform','matrix(1,0,0,1,-100,0)');
+    if(viewData.s.mdf || this.firstFrame){
+        var attr1 = styleData.t === 1 ? 'x1':'cx';
+        var attr2 = attr1 === 'x1' ? 'y1':'cy';
+        gfill.setAttribute(attr1,pt1[0]);
+        gfill.setAttribute(attr2,pt1[1]);
+        if(opFill){
+            opFill.setAttribute(attr1,pt1[0]);
+            opFill.setAttribute(attr2,pt1[1]);
+        }
+    }
+    var stops, i, len, stop;
+    if(viewData.g.cmdf || this.firstFrame){
+        stops = viewData.cst;
+        var cValues = viewData.g.c;
+        len = stops.length;
+        for(i=0;i<len;i+=1){
+            stop = stops[i];
+            stop.setAttribute('offset',cValues[i*4]+'%');
+            stop.setAttribute('stop-color','rgb('+cValues[i*4+1]+','+cValues[i*4+2]+','+cValues[i*4+3]+')');
+        }
+    }
+    if(opFill && (viewData.g.omdf || this.firstFrame)){
+        stops = viewData.ost;
+        var oValues = viewData.g.o;
+        len = stops.length;
+        for(i=0;i<len;i+=1){
+            stop = stops[i];
+            stop.setAttribute('offset',oValues[i*2]+'%');
+            stop.setAttribute('stop-opacity',oValues[i*2+1]);
+        }
+    }
+    if(styleData.t === 1){
+        if(viewData.e.mdf  || this.firstFrame){
+            gfill.setAttribute('x2',pt2[0]);
+            gfill.setAttribute('y2',pt2[1]);
+            if(opFill){
+                opFill.setAttribute('x2',pt2[0]);
+                opFill.setAttribute('y2',pt2[1]);
+            }
+        }
+    } else {
+        var rad;
+        if(viewData.s.mdf || viewData.e.mdf || this.firstFrame){
+            rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
+            gfill.setAttribute('r',rad);
+            if(opFill){
+                opFill.setAttribute('r',rad);
+            }
+        }
+        if(viewData.e.mdf || viewData.h.mdf || viewData.a.mdf || this.firstFrame){
+            if(!rad){
+                rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
+            }
+            var ang = Math.atan2(pt2[1]-pt1[1], pt2[0]-pt1[0]);
+
+            var percent = viewData.h.v >= 1 ? 0.99 : viewData.h.v <= -1 ? -0.99:viewData.h.v;
+            var dist = rad*percent;
+            var x = Math.cos(ang + viewData.a.v)*dist + pt1[0];
+            var y = Math.sin(ang + viewData.a.v)*dist + pt1[1];
+            gfill.setAttribute('fx',x);
+            gfill.setAttribute('fy',y);
+            if(opFill){
+                opFill.setAttribute('fx',x);
+                opFill.setAttribute('fy',y);
+            }
+        }
+        //gfill.setAttribute('fy','200');
+    }
+};
+
+IShapeElement.prototype.renderStroke = function(styleData,viewData){
+    var styleElem = viewData.style;
+    //TODO fix dashes
+    var d = viewData.d;
+    var dasharray,dashoffset;
+    if(d && d.k && (d.mdf || this.firstFrame)){
+        styleElem.pElem.setAttribute('stroke-dasharray', d.dasharray);
+        ////styleElem.pElem.style.strokeDasharray = d.dasharray;
+        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset);
+        ////styleElem.pElem.style.strokeDashoffset = d.dashoffset;
+    }
+    if(viewData.c && (viewData.c.mdf || this.firstFrame)){
+        styleElem.pElem.setAttribute('stroke','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
+        ////styleElem.pElem.style.stroke = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
+    }
+    if(viewData.o.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('stroke-opacity',viewData.o.v);
+    }
+    if(viewData.w.mdf || this.firstFrame){
+        styleElem.pElem.setAttribute('stroke-width',viewData.w.v);
+        if(styleElem.msElem){
+            styleElem.msElem.setAttribute('stroke-width',viewData.w.v);
+        }
+        ////styleElem.pElem.style.strokeWidth = viewData.w.v;
+    }
+};
+
+IShapeElement.prototype.destroy = function(){
+    this._parent.destroy.call(this._parent);
+    this.shapeData = null;
+    this.viewData = null;
+    this.parentContainer = null;
+    this.placeholder = null;
 };
 
 function ITextElement(data, animationItem,parentContainer,globalData){
@@ -5832,8 +6496,9 @@
     var k, kLen, pathNodes;
     var shapeStr = '';
     for(j=0;j<jLen;j+=1){
-        kLen = shapes[j].ks.k.i.length;
         pathNodes = shapes[j].ks.k;
+        shapeStr += this.buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper);
+        /*kLen = pathNodes.i.length;
         for(k=1;k<kLen;k+=1){
             if(k==1){
                 shapeStr += " M"+matrixHelper.applyToPointStringified(pathNodes.v[0][0],pathNodes.v[0][1]);
@@ -5841,7 +6506,7 @@
             shapeStr += " C"+matrixHelper.applyToPointStringified(pathNodes.o[k-1][0],pathNodes.o[k-1][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.i[k][0],pathNodes.i[k][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.v[k][0],pathNodes.v[k][1]);
         }
         shapeStr += " C"+matrixHelper.applyToPointStringified(pathNodes.o[k-1][0],pathNodes.o[k-1][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.i[0][0],pathNodes.i[0][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.v[0][0],pathNodes.v[0][1]);
-        shapeStr += 'z';
+        shapeStr += 'z';*/
     }
     return shapeStr;
 };
@@ -6305,6 +6970,8 @@
     }
 };
 
+ITextElement.prototype.buildShapeString = IShapeElement.prototype.buildShapeString;
+
 ITextElement.prototype.emptyProp = new LetterProps();
 
 function SVGTextElement(data,parentContainer,globalData,comp, placeholder){
@@ -6318,6 +6985,7 @@
 SVGTextElement.prototype.createPathShape = ITextElement.prototype.createPathShape;
 SVGTextElement.prototype.getMeasures = ITextElement.prototype.getMeasures;
 SVGTextElement.prototype.prepareFrame = ITextElement.prototype.prepareFrame;
+SVGTextElement.prototype.buildShapeString = ITextElement.prototype.buildShapeString;
 
 SVGTextElement.prototype.createElements = function(){
 
@@ -6440,7 +7108,7 @@
             }
         }
         if(singleShape) {
-            xPos += letters[i].l;
+            xPos += letters[i].l || 0;
             xPos += documentData.tr/1000*documentData.s;
         }
         //
@@ -6459,13 +7127,6 @@
     }
 }
 
-SVGTextElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        this.hidden = true;
-    }
-};
-
 SVGTextElement.prototype.renderFrame = function(parentMatrix){
 
     var renderParent = this._parent.renderFrame.call(this,parentMatrix);
@@ -6474,8 +7135,7 @@
         return;
     }
     if(this.hidden){
-        this.hidden = false;
-        this.layerElement.style.display = 'block';
+        this.show();
     }
 
     if(this.data.singleShape){
@@ -6969,13 +7629,13 @@
 
 ICompElement.prototype.hide = function(){
     if(!this.hidden){
+        this._parent.hide.call(this);
         var i,len = this.elements.length;
         for( i = 0; i < len; i+=1 ){
             if(this.elements[i]){
                 this.elements[i].hide();
             }
         }
-        this.hidden = true;
     }
 };
 
@@ -7013,7 +7673,9 @@
         return;
     }
 
-    this.hidden = false;
+    if(this.hidden) {
+        this.show();
+    }
     for( i = 0; i < len; i+=1 ){
         if(this.completeLayers || this.elements[i]){
             this.elements[i].renderFrame();
@@ -7084,13 +7746,6 @@
 
 };
 
-IImageElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        this.hidden = true;
-    }
-};
-
 IImageElement.prototype.renderFrame = function(parentMatrix){
     var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
@@ -7098,8 +7753,7 @@
         return;
     }
     if(this.hidden){
-        this.hidden = false;
-        this.layerElement.style.display = 'block';
+        this.show();
     }
     if(this.firstFrame){
         this.firstFrame = false;
@@ -7110,573 +7764,6 @@
     this._parent.destroy.call(this._parent);
     this.innerElem =  null;
 };
-function IShapeElement(data,parentContainer,globalData,comp, placeholder){
-    this.shapes = [];
-    this.shapesData = data.shapes;
-    this.stylesList = [];
-    this.viewData = [];
-    this.shapeModifiers = [];
-    this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
-}
-createElement(SVGBaseElement, IShapeElement);
-
-IShapeElement.prototype.lcEnum = {
-    '1': 'butt',
-    '2': 'round',
-    '3': 'butt'
-}
-
-IShapeElement.prototype.ljEnum = {
-    '1': 'miter',
-    '2': 'round',
-    '3': 'butt'
-}
-
-IShapeElement.prototype.buildExpressionInterface = function(){};
-
-IShapeElement.prototype.createElements = function(){
-    //TODO check if I can use symbol so i can set its viewBox
-    this._parent.createElements.call(this);
-    this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties, 0);
-    if(!this.data.hd || this.data.td){
-        styleUnselectableDiv(this.layerElement);
-    }
-    //this.elemInterface.registerShapeExpressionInterface(ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.elemInterface));
-};
-
-IShapeElement.prototype.setGradientData = function(pathElement,arr,data){
-
-    var gradientId = 'gr_'+randomString(10);
-    var gfill;
-    if(arr.t === 1){
-        gfill = document.createElementNS(svgNS,'linearGradient');
-    } else {
-        gfill = document.createElementNS(svgNS,'radialGradient');
-    }
-    gfill.setAttribute('id',gradientId);
-    gfill.setAttribute('spreadMethod','pad');
-    gfill.setAttribute('gradientUnits','userSpaceOnUse');
-    var stops = [];
-    var stop, j, jLen;
-    jLen = arr.g.p*4;
-    for(j=0;j<jLen;j+=4){
-        stop = document.createElementNS(svgNS,'stop');
-        gfill.appendChild(stop);
-        stops.push(stop);
-    }
-    pathElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+gradientId+')');
-    this.globalData.defs.appendChild(gfill);
-    data.gf = gfill;
-    data.cst = stops;
-}
-
-IShapeElement.prototype.setGradientOpacity = function(arr, data, styleOb){
-    if((arr.g.k.k[0].s && arr.g.k.k[0].s.length > arr.g.p*4) || arr.g.k.k.length > arr.g.p*4){
-        var opFill;
-        var stop, j, jLen;
-        var mask = document.createElementNS(svgNS,"mask");
-        var maskElement = document.createElementNS(svgNS, 'path');
-        mask.appendChild(maskElement);
-        var opacityId = 'op_'+randomString(10);
-        var maskId = 'mk_'+randomString(10);
-        mask.setAttribute('id',maskId);
-        if(arr.t === 1){
-            opFill = document.createElementNS(svgNS,'linearGradient');
-        } else {
-            opFill = document.createElementNS(svgNS,'radialGradient');
-        }
-        opFill.setAttribute('id',opacityId);
-        opFill.setAttribute('spreadMethod','pad');
-        opFill.setAttribute('gradientUnits','userSpaceOnUse');
-        jLen = arr.g.k.k[0].s ? arr.g.k.k[0].s.length : arr.g.k.k.length;
-        var stops = [];
-        for(j=arr.g.p*4;j<jLen;j+=2){
-            stop = document.createElementNS(svgNS,'stop');
-            stop.setAttribute('stop-color','rgb(255,255,255)');
-            //stop.setAttribute('offset',Math.round(arr.y[j][0]*100)+'%');
-            //stop.setAttribute('style','stop-color:rgb(255,255,255);stop-opacity:'+arr.y[j][1]);
-            opFill.appendChild(stop);
-            stops.push(stop);
-        }
-        maskElement.setAttribute( arr.ty === 'gf' ? 'fill':'stroke','url(#'+opacityId+')');
-        this.globalData.defs.appendChild(opFill);
-        this.globalData.defs.appendChild(mask);
-        data.of = opFill;
-        data.ost = stops;
-        styleOb.msElem = maskElement;
-        return maskId;
-    }
-};
-
-IShapeElement.prototype.searchShapes = function(arr,data,container,dynamicProperties, level, transformers){
-    transformers = transformers || [];
-    var ownTransformers = [].concat(transformers);
-    var i, len = arr.length - 1;
-    var j, jLen;
-    var ownArrays = [], ownModifiers = [], styleOb, currentTransform;
-    for(i=len;i>=0;i-=1){
-        if(arr[i].ty == 'fl' || arr[i].ty == 'st' || arr[i].ty == 'gf' || arr[i].ty == 'gs'){
-            data[i] = {};
-            styleOb = {
-                type: arr[i].ty,
-                d: '',
-                ld: '',
-                lvl: level,
-                mdf: false
-            };
-            var pathElement = document.createElementNS(svgNS, "path");
-            data[i].o = PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties);
-            if(arr[i].ty == 'st' || arr[i].ty == 'gs') {
-                pathElement.setAttribute('stroke-linecap', this.lcEnum[arr[i].lc] || 'round');
-                ////pathElement.style.strokeLinecap = this.lcEnum[arr[i].lc] || 'round';
-                pathElement.setAttribute('stroke-linejoin',this.ljEnum[arr[i].lj] || 'round');
-                ////pathElement.style.strokeLinejoin = this.ljEnum[arr[i].lj] || 'round';
-                pathElement.setAttribute('fill-opacity','0');
-                ////pathElement.style.fillOpacity = 0;
-                if(arr[i].lj == 1) {
-                    pathElement.setAttribute('stroke-miterlimit',arr[i].ml);
-                    ////pathElement.style.strokeMiterlimit = arr[i].ml;
-                }
-
-                data[i].w = PropertyFactory.getProp(this,arr[i].w,0,null,dynamicProperties);
-                if(arr[i].d){
-                    var d = PropertyFactory.getDashProp(this,arr[i].d,'svg',dynamicProperties);
-                    if(!d.k){
-                        pathElement.setAttribute('stroke-dasharray', d.dasharray);
-                        ////pathElement.style.strokeDasharray = d.dasharray;
-                        pathElement.setAttribute('stroke-dashoffset', d.dashoffset);
-                        ////pathElement.style.strokeDashoffset = d.dashoffset;
-                    }
-                    data[i].d = d;
-                }
-
-            }
-            if(arr[i].ty == 'fl' || arr[i].ty == 'st'){
-                data[i].c = PropertyFactory.getProp(this,arr[i].c,1,255,dynamicProperties);
-                container.appendChild(pathElement);
-            } else {
-                data[i].g = PropertyFactory.getGradientProp(this,arr[i].g,dynamicProperties);
-                if(arr[i].t == 2){
-                    data[i].h = PropertyFactory.getProp(this,arr[i].h,1,0.01,dynamicProperties);
-                    data[i].a = PropertyFactory.getProp(this,arr[i].a,1,degToRads,dynamicProperties);
-                }
-                data[i].s = PropertyFactory.getProp(this,arr[i].s,1,null,dynamicProperties);
-                data[i].e = PropertyFactory.getProp(this,arr[i].e,1,null,dynamicProperties);
-                this.setGradientData(pathElement,arr[i],data[i], styleOb);
-                var maskId = this.setGradientOpacity(arr[i],data[i], styleOb);
-                if(maskId){
-                    pathElement.setAttribute('mask','url(#'+maskId+')');
-                }
-                data[i].elem = pathElement;
-                container.appendChild(pathElement);
-            }
-            if(arr[i].r === 2) {
-                pathElement.setAttribute('fill-rule', 'evenodd');
-            }
-
-            if(arr[i].ln){
-                pathElement.setAttribute('id',arr[i].ln);
-            }
-            if(arr[i].cl){
-                pathElement.setAttribute('class',arr[i].cl);
-            }
-            styleOb.pElem = pathElement;
-            this.stylesList.push(styleOb);
-            data[i].style = styleOb;
-            ownArrays.push(styleOb);
-        }else if(arr[i].ty == 'gr'){
-            data[i] = {
-                it: []
-            };
-            var g = document.createElementNS(svgNS,'g');
-            container.appendChild(g);
-            data[i].gr = g;
-            this.searchShapes(arr[i].it,data[i].it,g,dynamicProperties, level + 1, ownTransformers);
-        }else if(arr[i].ty == 'tr'){
-            data[i] = {
-                transform : {
-                    op: PropertyFactory.getProp(this,arr[i].o,0,0.01,dynamicProperties),
-                    mProps: PropertyFactory.getProp(this,arr[i],2,null,dynamicProperties)
-                },
-                elements: []
-            };
-            currentTransform = data[i].transform;
-            ownTransformers.push(currentTransform);
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
-            data[i] = {
-                elements : [],
-                caches:[],
-                styles : [],
-                transformers: ownTransformers,
-                lStr: ''
-            };
-            var ty = 4;
-            if(arr[i].ty == 'rc'){
-                ty = 5;
-            }else if(arr[i].ty == 'el'){
-                ty = 6;
-            }else if(arr[i].ty == 'sr'){
-                ty = 7;
-            }
-            data[i].sh = ShapePropertyFactory.getShapeProp(this,arr[i],ty,dynamicProperties);
-            data[i].lvl = level;
-            this.shapes.push(data[i].sh);
-            this.addShapeToModifiers(data[i]);
-            jLen = this.stylesList.length;
-            for(j=0;j<jLen;j+=1){
-                if(!this.stylesList[j].closed){
-                    data[i].elements.push({
-                        ty:this.stylesList[j].type,
-                        st: this.stylesList[j]
-                    });
-                }
-            }
-        }else if(arr[i].ty == 'tm' || arr[i].ty == 'rd' || arr[i].ty == 'ms' || arr[i].ty == 'rp'){
-            var modifier = ShapeModifiers.getModifier(arr[i].ty);
-            modifier.init(this,arr[i],dynamicProperties);
-            this.shapeModifiers.push(modifier);
-            ownModifiers.push(modifier);
-            data[i] = modifier;
-        }
-    }
-    len = ownArrays.length;
-    for(i=0;i<len;i+=1){
-        ownArrays[i].closed = true;
-    }
-    len = ownModifiers.length;
-    for(i=0;i<len;i+=1){
-        ownModifiers[i].closed = true;
-    }
-};
-
-IShapeElement.prototype.addShapeToModifiers = function(data) {
-    var i, len = this.shapeModifiers.length;
-    for(i=0;i<len;i+=1){
-        this.shapeModifiers[i].addShape(data);
-    }
-};
-
-IShapeElement.prototype.renderModifiers = function() {
-    if(!this.shapeModifiers.length){
-        return;
-    }
-    var i, len = this.shapes.length;
-    for(i=0;i<len;i+=1){
-        this.shapes[i].reset();
-    }
-
-
-    len = this.shapeModifiers.length;
-
-    for(i=len-1;i>=0;i-=1){
-        this.shapeModifiers[i].processShapes(this.firstFrame);
-    }
-};
-
-IShapeElement.prototype.renderFrame = function(parentMatrix){
-    var renderParent = this._parent.renderFrame.call(this,parentMatrix);
-    if(renderParent===false){
-        this.hide();
-        return;
-    }
-    this.globalToLocal([0,0,0]);
-    if(this.hidden){
-        this.layerElement.style.display = 'block';
-        this.hidden = false;
-    }
-    this.renderModifiers();
-    this.renderShape(null,null,true, null);
-};
-
-IShapeElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        var i, len = this.stylesList.length;
-        for(i=len-1;i>=0;i-=1){
-            if(this.stylesList[i].ld !== '0'){
-                this.stylesList[i].ld = '0';
-                this.stylesList[i].pElem.style.display = 'none';
-                if(this.stylesList[i].pElem.parentNode){
-                    this.stylesList[i].parent = this.stylesList[i].pElem.parentNode;
-                    //this.stylesList[i].pElem.parentNode.removeChild(this.stylesList[i].pElem);
-                }
-            }
-        }
-        this.hidden = true;
-    }
-};
-
-IShapeElement.prototype.renderShape = function(items,data,isMain, container){
-    var i, len;
-    if(!items){
-        items = this.shapesData;
-        len = this.stylesList.length;
-        for(i=0;i<len;i+=1){
-            this.stylesList[i].d = '';
-            this.stylesList[i].mdf = false;
-        }
-    }
-    if(!data){
-        data = this.viewData;
-    }
-    ///
-    ///
-    len = items.length - 1;
-    var ty;
-    for(i=len;i>=0;i-=1){
-        ty = items[i].ty;
-        if(ty == 'tr'){
-            if(this.firstFrame || data[i].transform.op.mdf && container){
-                container.setAttribute('opacity',data[i].transform.op.v);
-            }
-            if(this.firstFrame || data[i].transform.mProps.mdf && container){
-                container.setAttribute('transform',data[i].transform.mProps.v.to2dCSS());
-            }
-        }else if(ty == 'sh' || ty == 'el' || ty == 'rc' || ty == 'sr'){
-            this.renderPath(items[i],data[i]);
-        }else if(ty == 'fl'){
-            this.renderFill(items[i],data[i]);
-        }else if(ty == 'gf'){
-            this.renderGradient(items[i],data[i]);
-        }else if(ty == 'gs'){
-            this.renderGradient(items[i],data[i]);
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'st'){
-            this.renderStroke(items[i],data[i]);
-        }else if(ty == 'gr'){
-            this.renderShape(items[i].it,data[i].it,false, data[i].gr);
-        }else if(ty == 'tm'){
-            //
-        }
-    }
-    if(isMain) {
-        len = this.stylesList.length;
-        for (i = 0; i < len; i += 1) {
-            if (this.stylesList[i].ld === '0') {
-                this.stylesList[i].ld = '1';
-                this.stylesList[i].pElem.style.display = 'block';
-                //this.stylesList[i].parent.appendChild(this.stylesList[i].pElem);
-            }
-            if (this.stylesList[i].mdf || this.firstFrame) {
-                this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d);
-                if(this.stylesList[i].msElem){
-                    this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d);
-                }
-            }
-        }
-        if (this.firstFrame) {
-            this.firstFrame = false;
-        }
-    }
-
-};
-
-IShapeElement.prototype.renderPath = function(pathData,viewData){
-    var len, i, j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = viewData.elements.length;
-    var lvl = viewData.lvl;
-    for(l=0;l<lLen;l+=1){
-        redraw = viewData.sh.mdf || this.firstFrame;
-        pathStringTransformed = 'M0 0';
-        var paths = viewData.sh.paths;
-        jLen = paths._length;
-        if(viewData.elements[l].st.lvl < lvl){
-            var mat = this.mHelper.reset(), props;
-            var iterations = lvl - viewData.elements[l].st.lvl;
-            var k = viewData.transformers.length-1;
-            while(iterations > 0) {
-                redraw = viewData.transformers[k].mProps.mdf || redraw;
-                props = viewData.transformers[k].mProps.v.props;
-                mat.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
-                iterations --;
-                k --;
-            }
-            if(redraw){
-                for(j=0;j<jLen;j+=1){
-                    pathNodes = paths.shapes[j];
-                    if(pathNodes && pathNodes._length){
-                        len = pathNodes._length;
-                        for (i = 1; i < len; i += 1) {
-                            if (i == 1) {
-                                pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            }
-                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-                        }
-                        if (len == 1) {
-                            pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                        }
-                        if (pathNodes.c) {
-                            pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            pathStringTransformed += 'z';
-                        }
-                    }
-                }
-                viewData.caches[l] = pathStringTransformed;
-            } else {
-                pathStringTransformed = viewData.caches[l];
-            }
-        } else {
-            if(redraw){
-                for(j=0;j<jLen;j+=1){
-                    pathNodes = paths.shapes[j];
-                    if(pathNodes && pathNodes._length){
-                        len = pathNodes._length;
-                        for (i = 1; i < len; i += 1) {
-                            if (i == 1) {
-                                //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                                pathStringTransformed += " M" + pathNodes.v[0].join(',');
-                            }
-                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[i].join(',') + " " + pathNodes.v[i].join(',');
-                        }
-                        if (len == 1) {
-                            //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            pathStringTransformed += " M" + pathNodes.v[0].join(',');
-                        }
-                        if (pathNodes.c && len) {
-                            //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[0].join(',') + " " + pathNodes.v[0].join(',');
-                            pathStringTransformed += 'z';
-                        }
-                    }
-                }
-                viewData.caches[l] = pathStringTransformed;
-            } else {
-                pathStringTransformed = viewData.caches[l];
-            }
-        }
-        viewData.elements[l].st.d += pathStringTransformed;
-        viewData.elements[l].st.mdf = redraw || viewData.elements[l].st.mdf;
-    }
-
-};
-
-IShapeElement.prototype.renderFill = function(styleData,viewData){
-    var styleElem = viewData.style;
-
-    if(viewData.c.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
-        ////styleElem.pElem.style.fill = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
-    }
-    if(viewData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('fill-opacity',viewData.o.v);
-    }
-};
-
-IShapeElement.prototype.renderGradient = function(styleData,viewData){
-    var gfill = viewData.gf;
-    var opFill = viewData.of;
-    var pt1 = viewData.s.v,pt2 = viewData.e.v;
-
-    if(viewData.o.mdf || this.firstFrame){
-        var attr = styleData.ty === 'gf' ? 'fill-opacity':'stroke-opacity';
-        viewData.elem.setAttribute(attr,viewData.o.v);
-    }
-    //clippedElement.setAttribute('transform','matrix(1,0,0,1,-100,0)');
-    if(viewData.s.mdf || this.firstFrame){
-        var attr1 = styleData.t === 1 ? 'x1':'cx';
-        var attr2 = attr1 === 'x1' ? 'y1':'cy';
-        gfill.setAttribute(attr1,pt1[0]);
-        gfill.setAttribute(attr2,pt1[1]);
-        if(opFill){
-            opFill.setAttribute(attr1,pt1[0]);
-            opFill.setAttribute(attr2,pt1[1]);
-        }
-    }
-    var stops, i, len, stop;
-    if(viewData.g.cmdf || this.firstFrame){
-        stops = viewData.cst;
-        var cValues = viewData.g.c;
-        len = stops.length;
-        for(i=0;i<len;i+=1){
-            stop = stops[i];
-            stop.setAttribute('offset',cValues[i*4]+'%');
-            stop.setAttribute('stop-color','rgb('+cValues[i*4+1]+','+cValues[i*4+2]+','+cValues[i*4+3]+')');
-        }
-    }
-    if(opFill && (viewData.g.omdf || this.firstFrame)){
-        stops = viewData.ost;
-        var oValues = viewData.g.o;
-        len = stops.length;
-        for(i=0;i<len;i+=1){
-            stop = stops[i];
-            stop.setAttribute('offset',oValues[i*2]+'%');
-            stop.setAttribute('stop-opacity',oValues[i*2+1]);
-        }
-    }
-    if(styleData.t === 1){
-        if(viewData.e.mdf  || this.firstFrame){
-            gfill.setAttribute('x2',pt2[0]);
-            gfill.setAttribute('y2',pt2[1]);
-            if(opFill){
-                opFill.setAttribute('x2',pt2[0]);
-                opFill.setAttribute('y2',pt2[1]);
-            }
-        }
-    } else {
-        var rad;
-        if(viewData.s.mdf || viewData.e.mdf || this.firstFrame){
-            rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
-            gfill.setAttribute('r',rad);
-            if(opFill){
-                opFill.setAttribute('r',rad);
-            }
-        }
-        if(viewData.e.mdf || viewData.h.mdf || viewData.a.mdf || this.firstFrame){
-            if(!rad){
-                rad = Math.sqrt(Math.pow(pt1[0]-pt2[0],2)+Math.pow(pt1[1]-pt2[1],2));
-            }
-            var ang = Math.atan2(pt2[1]-pt1[1], pt2[0]-pt1[0]);
-
-            var percent = viewData.h.v >= 1 ? 0.99 : viewData.h.v <= -1 ? -0.99:viewData.h.v;
-            var dist = rad*percent;
-            var x = Math.cos(ang + viewData.a.v)*dist + pt1[0];
-            var y = Math.sin(ang + viewData.a.v)*dist + pt1[1];
-            gfill.setAttribute('fx',x);
-            gfill.setAttribute('fy',y);
-            if(opFill){
-                opFill.setAttribute('fx',x);
-                opFill.setAttribute('fy',y);
-            }
-        }
-        //gfill.setAttribute('fy','200');
-    }
-};
-
-IShapeElement.prototype.renderStroke = function(styleData,viewData){
-    var styleElem = viewData.style;
-    //TODO fix dashes
-    var d = viewData.d;
-    var dasharray,dashoffset;
-    if(d && d.k && (d.mdf || this.firstFrame)){
-        styleElem.pElem.setAttribute('stroke-dasharray', d.dasharray);
-        ////styleElem.pElem.style.strokeDasharray = d.dasharray;
-        styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset);
-        ////styleElem.pElem.style.strokeDashoffset = d.dashoffset;
-    }
-    if(viewData.c && (viewData.c.mdf || this.firstFrame)){
-        styleElem.pElem.setAttribute('stroke','rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')');
-        ////styleElem.pElem.style.stroke = 'rgb('+bm_floor(viewData.c.v[0])+','+bm_floor(viewData.c.v[1])+','+bm_floor(viewData.c.v[2])+')';
-    }
-    if(viewData.o.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-opacity',viewData.o.v);
-    }
-    if(viewData.w.mdf || this.firstFrame){
-        styleElem.pElem.setAttribute('stroke-width',viewData.w.v);
-        if(styleElem.msElem){
-            styleElem.msElem.setAttribute('stroke-width',viewData.w.v);
-        }
-        ////styleElem.pElem.style.strokeWidth = viewData.w.v;
-    }
-};
-
-IShapeElement.prototype.destroy = function(){
-    this._parent.destroy.call(this._parent);
-    this.shapeData = null;
-    this.viewData = null;
-    this.parentContainer = null;
-    this.placeholder = null;
-};
-
 function ISolidElement(data,parentContainer,globalData,comp, placeholder){
     this._parent.constructor.call(this,data,parentContainer,globalData,comp, placeholder);
 }
@@ -7702,7 +7789,6 @@
     }
 };
 
-ISolidElement.prototype.hide = IImageElement.prototype.hide;
 ISolidElement.prototype.renderFrame = IImageElement.prototype.renderFrame;
 ISolidElement.prototype.destroy = IImageElement.prototype.destroy;
 
@@ -8576,4 +8662,4 @@
 AnimationItem.prototype.addEventListener = _addEventListener;
 AnimationItem.prototype.removeEventListener = _removeEventListener;
 AnimationItem.prototype.triggerEvent = _triggerEvent;
-var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type==='expressions'){ expressionsPlugin = plugin; } } function getFactory(name){ switch(name){ case "propertyFactory": return PropertyFactory;case "shapePropertyFactory": return ShapePropertyFactory; case "matrix": return Matrix; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = '4.6.11'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index] || { src: '' }; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));  
\ No newline at end of file
+var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type==='expressions'){ expressionsPlugin = plugin; } } function getFactory(name){ switch(name){ case "propertyFactory": return PropertyFactory;case "shapePropertyFactory": return ShapePropertyFactory; case "matrix": return Matrix; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = '4.8.0'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index] || { src: '' }; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));  
\ No newline at end of file
diff --git a/build/player/bodymovin_light.min.js b/build/player/bodymovin_light.min.js
index 3695584..e95fa32 100644
--- a/build/player/bodymovin_light.min.js
+++ b/build/player/bodymovin_light.min.js
@@ -1,8 +1,9 @@
-!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof module&&module.exports?module.exports=e():t.bodymovin=e()}(window,function(){function t(){return{}}function e(t){gt=t?Math.round:function(t){return t}}function s(t){return Math.round(1e4*t)/1e4}function i(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function a(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>i?-1:1}function r(t,e){this.type=t,this.direction=0>e?-1:1}function n(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>i?-1:1}function h(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function o(t,e){this.type=t,this.target=e}function p(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)}function l(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;i>s;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,i-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function f(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;s>i;i++)this._cbs[t][i](e)}function m(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,i="";for(s=t;s>0;--s)i+=e[Math.round(Math.random()*(e.length-1))];return i}function d(t,e,s){var i,a,r,n,h,o,p,l;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),h=6*t-n,o=s*(1-e),p=s*(1-h*e),l=s*(1-(1-h)*e),n%6){case 0:i=s,a=l,r=o;break;case 1:i=p,a=s,r=o;break;case 2:i=o,a=s,r=l;break;case 3:i=o,a=p,r=s;break;case 4:i=l,a=o,r=s;break;case 5:i=s,a=o,r=p}return[i,a,r]}function c(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var i,a=Math.max(t,e,s),r=Math.min(t,e,s),n=a-r,h=0===a?0:n/a,o=a/255;switch(a){case r:i=0;break;case t:i=e-s+n*(s>e?6:0),i/=6*n;break;case e:i=s-t+2*n,i/=6*n;break;case s:i=t-e+4*n,i/=6*n}return[i,h,o]}function u(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),d(s[0],s[1],s[2])}function g(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),d(s[0],s[1],s[2])}function v(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),d(s[0],s[1],s[2])}function y(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.props=r}function b(t){var e,s,i=[],a=[],r=[],n={},h=0;t.c&&(i[0]=t.o[0],a[0]=t.i[0],r[0]=t.v[0],h=1),s=t.i.length;var o=s-1;for(e=h;s>e;e+=1)i.push(t.o[o]),a.push(t.i[o]),r.push(t.v[o]),o-=1;return n.i=i,n.o=a,n.v=r,n}function k(){}function P(t,e,s){if(!e){var i=Object.create(t.prototype,s),a={};return i&&"[object Function]"===a.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype._parent=t.prototype}function A(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function M(){function t(t,e,s,i,a,r){var n=t*i+e*a+s*r-a*i-r*t-s*e;return n>-1e-4&&1e-4>n}function e(t,e,s,i,a,r,n,h,o){var p,l=Math.sqrt(Math.pow(i-t,2)+Math.pow(a-e,2)+Math.pow(r-s,2)),f=Math.sqrt(Math.pow(n-t,2)+Math.pow(h-e,2)+Math.pow(o-s,2)),m=Math.sqrt(Math.pow(n-i,2)+Math.pow(h-a,2)+Math.pow(o-r,2));return p=l>f?l>m?l-f-m:m-f-l:m>f?m-f-l:f-l-m,p>-1e-4&&1e-4>p}function s(t){this.segmentLength=0,this.points=new Array(t)}function i(t,e){this.partialLength=t,this.point=e}function a(t,e){var s=e.segments,i=s.length,a=At((i-1)*t),r=t*e.addedLength,n=0;if(r==s[a].l)return s[a].p;for(var h=s[a].l>r?-1:1,o=!0;o;)s[a].l<=r&&s[a+1].l>r?(n=(r-s[a].l)/(s[a+1].l-s[a].l),o=!1):a+=h,(0>a||a>=i-1)&&(o=!1);return s[a].p+(s[a+1].p-s[a].p)*n}function r(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,i,n,h,o){var p=new r;n=0>n?0:n>1?1:n;var l=a(n,o);h=h>1?1:h;var f,m=a(h,o),d=t.length,c=1-l,u=1-m;for(f=0;d>f;f+=1)p.pt1[f]=Math.round(1e3*(c*c*c*t[f]+(l*c*c+c*l*c+c*c*l)*s[f]+(l*l*c+c*l*l+l*c*l)*i[f]+l*l*l*e[f]))/1e3,p.pt3[f]=Math.round(1e3*(c*c*u*t[f]+(l*c*u+c*l*u+c*c*m)*s[f]+(l*l*u+c*l*m+l*c*m)*i[f]+l*l*m*e[f]))/1e3,p.pt4[f]=Math.round(1e3*(c*u*u*t[f]+(l*u*u+c*m*u+c*u*m)*s[f]+(l*m*u+c*m*m+l*u*m)*i[f]+l*m*m*e[f]))/1e3,p.pt2[f]=Math.round(1e3*(u*u*u*t[f]+(m*u*u+u*m*u+u*u*m)*s[f]+(m*m*u+u*m*m+m*u*m)*i[f]+m*m*m*e[f]))/1e3;return p}var h=(Math,function(){function t(t,e){this.l=t,this.p=e}return function(e,s,i,a){var r,n,h,o,p,l,f=wt,m=0,d=[],c=[],u={addedLength:0,segments:[]};for(h=i.length,r=0;f>r;r+=1){for(p=r/(f-1),l=0,n=0;h>n;n+=1)o=kt(1-p,3)*e[n]+3*kt(1-p,2)*p*i[n]+3*(1-p)*kt(p,2)*a[n]+kt(p,3)*s[n],d[n]=o,null!==c[n]&&(l+=kt(d[n]-c[n],2)),c[n]=d[n];l&&(l=Pt(l),m+=l),u.segments.push(new t(m,p))}return u.addedLength=m,u}}()),o=function(){var e={};return function(a){var r=a.s,n=a.e,h=a.to,o=a.ti,p=(r.join("_")+"_"+n.join("_")+"_"+h.join("_")+"_"+o.join("_")).replace(/\./g,"p");if(e[p])return void(a.bezierData=e[p]);var l,f,m,d,c,u,g,v=wt,y=0,b=null;2===r.length&&(r[0]!=n[0]||r[1]!=n[1])&&t(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&t(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])&&(v=2);var k=new s(v);for(m=h.length,l=0;v>l;l+=1){for(g=new Array(m),c=l/(v-1),u=0,f=0;m>f;f+=1)d=kt(1-c,3)*r[f]+3*kt(1-c,2)*c*(r[f]+h[f])+3*(1-c)*kt(c,2)*(n[f]+o[f])+kt(c,3)*n[f],g[f]=d,null!==b&&(u+=kt(g[f]-b[f],2));u=Pt(u),y+=u,k.points[l]=new i(u,g),b=g}k.segmentLength=y,a.bezierData=k,e[p]=k}}();return{getBezierLength:h,getNewSegment:n,buildBezierData:o,pointOnLine2D:t,pointOnLine3D:e}}function E(){function t(a,r,h){var o,p,l,f,m,d,c,u,g=a.length;for(f=0;g>f;f+=1)if(o=a[f],"ks"in o&&!o.completed){if(o.completed=!0,o.tt&&(a[f-1].td=o.tt),p=[],l=-1,o.hasMask){var v=o.masksProperties;for(d=v.length,m=0;d>m;m+=1)if(v[m].pt.k.i)i(v[m].pt.k);else for(u=v[m].pt.k.length,c=0;u>c;c+=1)v[m].pt.k[c].s&&i(v[m].pt.k[c].s[0]),v[m].pt.k[c].e&&i(v[m].pt.k[c].e[0])}0===o.ty?(o.layers=e(o.refId,r),t(o.layers,r,h)):4===o.ty?s(o.shapes):5==o.ty&&n(o,h)}}function e(t,e){for(var s=0,i=e.length;i>s;){if(e[s].id===t)return e[s].layers;s+=1}}function s(t){var e,a,r,n=t.length,h=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)i(t[e].ks.k);else for(r=t[e].ks.k.length,a=0;r>a;a+=1)t[e].ks.k[a].s&&i(t[e].ks.k[a].s[0]),t[e].ks.k[a].e&&i(t[e].ks.k[a].e[0]);h=!0}else"gr"==t[e].ty&&s(t[e].it)}function i(t){var e,s=t.i.length;for(e=0;s>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function a(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]?!0:s[0]>t[0]?!1:t[1]>s[1]?!0:s[1]>t[1]?!1:t[2]>s[2]?!0:s[2]>t[2]?!1:void 0}function r(e,s){e.__complete||(o(e),h(e),p(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){var s,i,a=t.t.d.k,r=a.length;for(i=0;r>i;i+=1){var n=t.t.d.k[i].s;s=[];var h,o,p,l,f,m,d,c=0,u=t.t.m.g,g=0,v=0,y=0,b=[],k=0,P=0,A=e.getFontByName(n.f),M=0,E=A.fStyle.split(" "),w="normal",S="normal";for(o=E.length,h=0;o>h;h+=1)"italic"===E[h].toLowerCase()?S="italic":"bold"===E[h].toLowerCase()?w="700":"black"===E[h].toLowerCase()?w="900":"medium"===E[h].toLowerCase()?w="500":"regular"===E[h].toLowerCase()||"normal"===E[h].toLowerCase()?w="400":("light"===E[h].toLowerCase()||"thin"===E[h].toLowerCase())&&(w="200");if(n.fWeight=w,n.fStyle=S,o=n.t.length,n.sz){var F=n.sz[0],x=-1;for(h=0;o>h;h+=1)p=!1," "===n.t.charAt(h)?x=h:13===n.t.charCodeAt(h)&&(k=0,p=!0),e.chars?(d=e.getCharData(n.t.charAt(h),A.fStyle,A.fFamily),M=p?0:d.w*n.s/100):M=e.measureText(n.t.charAt(h),n.f,n.s),k+M>F?(-1===x?(n.t=n.t.substr(0,h)+"\r"+n.t.substr(h),o+=1):(h=x,n.t=n.t.substr(0,h)+"\r"+n.t.substr(h+1)),x=-1,k=0):k+=M;o=n.t.length}for(k=0,M=0,h=0;o>h;h+=1)if(p=!1," "===n.t.charAt(h)?l="\xa0":13===n.t.charCodeAt(h)?(b.push(k),P=k>P?k:P,k=0,l="",p=!0,y+=1):l=n.t.charAt(h),e.chars?(d=e.getCharData(n.t.charAt(h),A.fStyle,e.getFontByName(n.f).fFamily),M=p?0:d.w*n.s/100):M=e.measureText(l,n.f,n.s),k+=M,s.push({l:M,an:M,add:g,n:p,anIndexes:[],val:l,line:y}),2==u){if(g+=M,""==l||"\xa0"==l||h==o-1){for((""==l||"\xa0"==l)&&(g-=M);h>=v;)s[v].an=g,s[v].ind=c,s[v].extra=M,v+=1;c+=1,g=0}}else if(3==u){if(g+=M,""==l||h==o-1){for(""==l&&(g-=M);h>=v;)s[v].an=g,s[v].ind=c,s[v].extra=M,v+=1;g=0,c+=1}}else s[c].ind=c,s[c].extra=0,c+=1;if(n.l=s,P=k>P?k:P,b.push(k),n.sz)n.boxWidth=n.sz[0],n.justifyOffset=0;else switch(n.boxWidth=P,n.j){case 1:n.justifyOffset=-n.boxWidth;break;case 2:n.justifyOffset=-n.boxWidth/2;break;default:n.justifyOffset=0}n.lineWidths=b;var D=t.t.a;m=D.length;var C,_,T=[];for(f=0;m>f;f+=1){for(D[f].a.sc&&(n.strokeColorAnim=!0),D[f].a.sw&&(n.strokeWidthAnim=!0),(D[f].a.fc||D[f].a.fh||D[f].a.fs||D[f].a.fb)&&(n.fillColorAnim=!0),_=0,C=D[f].s.b,h=0;o>h;h+=1)s[h].anIndexes[f]=_,(1==C&&""!=s[h].val||2==C&&""!=s[h].val&&"\xa0"!=s[h].val||3==C&&(s[h].n||"\xa0"==s[h].val||h==o-1)||4==C&&(s[h].n||h==o-1))&&(1===D[f].s.rn&&T.push(_),_+=1);t.t.a[f].s.totalChars=_;var I,L=-1;if(1===D[f].s.rn)for(h=0;o>h;h+=1)L!=s[h].anIndexes[f]&&(L=s[h].anIndexes[f],I=T.splice(Math.floor(Math.random()*T.length),1)[0]),s[h].anIndexes[f]=I}0!==m||"m"in t.t.p||(t.singleShape=!0),n.yOffset=n.lh||1.2*n.s,n.ls=n.ls||0,n.ascent=A.ascent*n.s/100}}var h=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)5===e[s].ty&&t(e[s])}var s=[4,4,14];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),o=function(){function t(e){var s,i,a,r=e.length;for(s=0;r>s;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(a=e[s].c.k.length,i=0;a>i;i+=1)e[s].c.k[i].s&&(e[s].c.k[i].s[0]/=255,e[s].c.k[i].s[1]/=255,e[s].c.k[i].s[2]/=255,e[s].c.k[i].s[3]/=255),e[s].c.k[i].e&&(e[s].c.k[i].e[0]/=255,e[s].c.k[i].e[1]/=255,e[s].c.k[i].e[2]/=255,e[s].c.k[i].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),p=function(){function t(e){var s,i,a,r=e.length,n=!1;for(s=r-1;s>=0;s-=1)if("sh"==e[s].ty){if(e[s].ks.k.i)e[s].ks.k.c=e[s].closed;else for(a=e[s].ks.k.length,i=0;a>i;i+=1)e[s].ks.k[i].s&&(e[s].ks.k[i].s[0].c=e[s].closed),e[s].ks.k[i].e&&(e[s].ks.k[i].e[0].c=e[s].closed);n=!0}else"gr"==e[s].ty&&t(e[s].it)}function e(e){var s,i,a,r,n,h,o=e.length;for(i=0;o>i;i+=1){if(s=e[i],s.hasMask){var p=s.masksProperties;for(r=p.length,a=0;r>a;a+=1)if(p[a].pt.k.i)p[a].pt.k.c=p[a].cl;else for(h=p[a].pt.k.length,n=0;h>n;n+=1)p[a].pt.k[n].s&&(p[a].pt.k[n].s[0].c=p[a].cl),p[a].pt.k[n].e&&(p[a].pt.k[n].e[0].c=p[a].cl)}4===s.ty&&t(s.shapes)}}var s=[4,4,18];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),l={};return l.completeData=r,l}function w(){this.c=!1,this._length=0,this._maxLength=8,this.v=Array.apply(null,{length:this._maxLength}),this.o=Array.apply(null,{length:this._maxLength}),this.i=Array.apply(null,{length:this._maxLength})}function S(){}function F(){}function x(){}function D(){}function C(){this._length=0,this._maxLength=4,this.shapes=Array.apply(null,{length:this._maxLength})}function _(){}function T(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1},this.elements=[],this.pendingElements=[],this.destroyed=!1}function I(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var i,a,r,n,h,o,p,l,f=this.globalData.defs,d=this.masksProperties.length,c=this.masksProperties,u=0,g=[],v=m(10),y="clipPath",b="clip-path";for(i=0;d>i;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(y="mask",b="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!=u?h=null:(h=document.createElementNS(vt,"rect"),h.setAttribute("fill","#ffffff"),h.setAttribute("width",this.element.comp.data.w),h.setAttribute("height",this.element.comp.data.h),g.push(h)),a=document.createElementNS(vt,"path"),"n"!=c[i].mode){if(u+=1,"s"==c[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"),a.setAttribute("clip-rule","nonzero"),0!==c[i].x.k){y="mask",b="mask",l=It.getProp(this.element,c[i].x,0,null,this.dynamicProperties);var k="fi_"+m(10);o=document.createElementNS(vt,"filter"),o.setAttribute("id",k),p=document.createElementNS(vt,"feMorphology"),p.setAttribute("operator","dilate"),p.setAttribute("in","SourceGraphic"),p.setAttribute("radius","0"),o.appendChild(p),f.appendChild(o),"s"==c[i].mode?a.setAttribute("stroke","#000000"):a.setAttribute("stroke","#ffffff")}else p=null,l=null;if(this.storedData[i]={elem:a,x:l,expan:p,lastPath:"",lastOperator:"",filterId:k,lastRadius:0},"i"==c[i].mode){n=g.length;var P=document.createElementNS(vt,"g");for(r=0;n>r;r+=1)P.appendChild(g[r]);var A=document.createElementNS(vt,"mask");A.setAttribute("mask-type","alpha"),A.setAttribute("id",v+"_"+u),A.appendChild(a),f.appendChild(A),P.setAttribute("mask","url(#"+v+"_"+u+")"),g.length=0,g.push(P)}else g.push(a);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:a,lastPath:"",op:It.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Lt.getShapeProp(this.element,c[i],3,this.dynamicProperties,null)},h&&(this.viewData[i].invRect=h),this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:It.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Lt.getShapeProp(this.element,c[i],3,this.dynamicProperties,null),elem:a},f.appendChild(a);for(this.maskElement=document.createElementNS(vt,y),d=g.length,i=0;d>i;i+=1)this.maskElement.appendChild(g[i]);this.maskElement.setAttribute("id",v),u>0&&this.element.maskedElement.setAttribute(b,"url(#"+v+")"),f.appendChild(this.maskElement)}function L(){}function N(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.transformedElement=null,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+m(10),this.placeholder=a,this.init()}function V(t,e,s,i){}function z(t,e,s,i,a){this.textSpans=[],this.renderType="svg",this._parent.constructor.call(this,t,e,s,i,a)}function R(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=document.createElementNS(vt,"feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var i=document.createElementNS(vt,"feMerge");t.appendChild(i);var a;a=document.createElementNS(vt,"feMergeNode"),a.setAttribute("in","SourceGraphic"),i.appendChild(a),a=document.createElementNS(vt,"feMergeNode"),a.setAttribute("in","f2"),i.appendChild(a)}}function j(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function O(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function B(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s);var i=document.createElementNS(vt,"feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var a=document.createElementNS(vt,"feFuncR");a.setAttribute("type","table"),i.appendChild(a),this.feFuncR=a;var r=document.createElementNS(vt,"feFuncG");r.setAttribute("type","table"),i.appendChild(r),this.feFuncG=r;var n=document.createElementNS(vt,"feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function G(t,e){this.filterManager=e;var s=this.filterManager.effectElements,i=document.createElementNS(vt,"feComponentTransfer");(s[9].p.k||0!==s[9].p.v||s[10].p.k||1!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||0!==s[12].p.v||s[13].p.k||1!==s[13].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(s[16].p.k||0!==s[16].p.v||s[17].p.k||1!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||0!==s[19].p.v||s[20].p.k||1!==s[20].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(s[23].p.k||0!==s[23].p.v||s[24].p.k||1!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||0!==s[26].p.v||s[27].p.k||1!==s[27].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(s[30].p.k||0!==s[30].p.v||s[31].p.k||1!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||0!==s[33].p.v||s[34].p.k||1!==s[34].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",i)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),i=document.createElementNS(vt,"feComponentTransfer")),(s[2].p.k||0!==s[2].p.v||s[3].p.k||1!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||0!==s[5].p.v||s[6].p.k||1!==s[6].p.v)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.feFuncRComposed=this.createFeFunc("feFuncR",i),this.feFuncGComposed=this.createFeFunc("feFuncG",i),this.feFuncBComposed=this.createFeFunc("feFuncB",i))}function X(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var s=document.createElementNS(vt,"feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var i=document.createElementNS(vt,"feOffset");i.setAttribute("dx","25"),i.setAttribute("dy","0"),i.setAttribute("in","drop_shadow_1"),i.setAttribute("result","drop_shadow_2"),this.feOffset=i,t.appendChild(i);var a=document.createElementNS(vt,"feFlood");a.setAttribute("flood-color","#00ff00"),a.setAttribute("flood-opacity","1"),a.setAttribute("result","drop_shadow_3"),this.feFlood=a,t.appendChild(a);var r=document.createElementNS(vt,"feComposite");r.setAttribute("in","drop_shadow_3"),r.setAttribute("in2","drop_shadow_2"),r.setAttribute("operator","in"),r.setAttribute("result","drop_shadow_4"),t.appendChild(r);var n=document.createElementNS(vt,"feMerge");t.appendChild(n);var h;h=document.createElementNS(vt,"feMergeNode"),n.appendChild(h),h=document.createElementNS(vt,"feMergeNode"),h.setAttribute("in","SourceGraphic"),this.feMergeNode=h,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(h)}function q(t){var e,s=t.data.ef.length,i=m(10),a=Rt.createFilter(i),r=0;this.filters=[];var n;for(e=0;s>e;e+=1)20===t.data.ef[e].ty?(r+=1,n=new R(a,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(r+=1,n=new j(a,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new O(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(r+=1,n=new B(a,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty?(r+=1,n=new G(a,t.effects.effectElements[e]),this.filters.push(n)):25===t.data.ef[e].ty&&(r+=1,n=new X(a,t.effects.effectElements[e]),this.filters.push(n));r&&(t.globalData.defs.appendChild(a),t.layerElement.setAttribute("filter","url(#"+i+")"))}function Y(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?Array.apply(null,{length:this.layers.length}):[],this.data.tm&&(this.tm=It.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.xt?(this.layerElement=document.createElementNS(vt,"g"),this.buildAllItems()):s.progressiveLoad||this.buildAllItems()}function W(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,i,a)}function H(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this._parent.constructor.call(this,t,e,s,i,a)}function U(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a)}function Z(t){Xt.play(t)}function J(t){Xt.pause(t)}function K(t){Xt.togglePause(t)}function Q(t,e){Xt.setSpeed(t,e)}function $(t,e){Xt.setDirection(t,e)}function tt(t){Xt.stop(t)}function et(t){Xt.moveFrame(t)}function st(){Wt===!0?Xt.searchAnimations(Ht,Wt,Ut):Xt.searchAnimations()}function it(t){return Xt.registerAnimation(t)}function at(){Xt.resize()}function rt(){Xt.start()}function nt(t,e,s){Xt.goToAndStop(t,e,s)}function ht(t){yt=t}function ot(t){return Wt===!0&&(t.animationData=JSON.parse(Ht)),Xt.loadAnimation(t)}function pt(t){return Xt.destroy(t)}function lt(t){if("string"==typeof t)switch(t){case"high":wt=200;break;case"medium":wt=50;break;case"low":wt=10}else!isNaN(t)&&t>1&&(wt=t);e(wt>=50?!1:!0)}function ft(t,e){"expressions"===t&&(ut=e)}function mt(t){switch(t){case"propertyFactory":return It;case"shapePropertyFactory":return Lt;case"matrix":return k}}function dt(){"complete"===document.readyState&&(clearInterval($t),st())}function ct(t){for(var e=Qt.split("&"),s=0;s<e.length;s++){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}var ut,gt,vt="http://www.w3.org/2000/svg",yt=!0,bt=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),kt=(Math.round,Math.pow),Pt=Math.sqrt,At=(Math.abs,Math.floor),Mt=(Math.max,Math.min),Et={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;s>t;t+=1)Et[e[t]]=Math[e[t]]}(),Et.random=Math.random,Et.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,i=Array.apply(null,{length:t.length}),a=t.length;for(s=0;a>s;s+=1)i[s]=Math.abs(t[s]);return i}return Math.abs(t)};var wt=150,St=Math.PI/180,Ft=.5519;e(!1);var xt=function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+s[t]+s[e]+s[i]}}(),k=(function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),function(){function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function a(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function r(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function n(t,e){return this._t(1,e,t,1,0,0)}function h(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),i=Math.sin(e);return this._t(s,i,0,0,-i,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-i,0,0,i,s,0,0,0,0,1,0,0,0,0,1)}function p(t,e,s){return s=isNaN(s)?1:s,1==t&&1==e&&1==s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function l(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=i,this.props[4]=a,this.props[5]=r,this.props[6]=n,this.props[7]=h,this.props[8]=o,this.props[9]=p,this.props[10]=l,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function f(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function m(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===h&&0===o&&0===p&&1===l&&0===f)return(0!==m||0!==d||0!==c)&&(this.props[12]=this.props[12]*t+this.props[13]*a+this.props[14]*o+this.props[15]*m,this.props[13]=this.props[12]*e+this.props[13]*r+this.props[14]*p+this.props[15]*d,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*l+this.props[15]*c,this.props[15]=this.props[12]*i+this.props[13]*h+this.props[14]*f+this.props[15]*u),this;var g=this.props[0],v=this.props[1],y=this.props[2],b=this.props[3],k=this.props[4],P=this.props[5],A=this.props[6],M=this.props[7],E=this.props[8],w=this.props[9],S=this.props[10],F=this.props[11],x=this.props[12],D=this.props[13],C=this.props[14],_=this.props[15];return this.props[0]=g*t+v*a+y*o+b*m,this.props[1]=g*e+v*r+y*p+b*d,this.props[2]=g*s+v*n+y*l+b*c,this.props[3]=g*i+v*h+y*f+b*u,this.props[4]=k*t+P*a+A*o+M*m,this.props[5]=k*e+P*r+A*p+M*d,this.props[6]=k*s+P*n+A*l+M*c,this.props[7]=k*i+P*h+A*f+M*u,this.props[8]=E*t+w*a+S*o+F*m,this.props[9]=E*e+w*r+S*p+F*d,this.props[10]=E*s+w*n+S*l+F*c,this.props[11]=E*i+w*h+S*f+F*u,this.props[12]=x*t+D*a+C*o+_*m,this.props[13]=x*e+D*r+C*p+_*d,this.props[14]=x*s+D*n+C*l+_*c,this.props[15]=x*i+D*h+C*f+_*u,this}function d(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function c(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function u(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function g(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function v(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function y(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function b(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,i=-this.props[1]/e,a=-this.props[4]/e,r=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,h=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*a+n,t[0]*i+t[1]*r+h,0]}function k(t){var e,s=t.length,i=[];for(e=0;s>e;e+=1)i[e]=b(t[e]);return i}function P(t,e,s,i){if(i&&2===i){var a=Ot.newPoint();return a[0]=t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],a[1]=t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],a}return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function A(t,e){return gt(t*this.props[0]+e*this.props[4]+this.props[12])+","+gt(t*this.props[1]+e*this.props[5]+this.props[13])}function M(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function E(){return bt?"matrix3d("+s(this.props[0])+","+s(this.props[1])+","+s(this.props[2])+","+s(this.props[3])+","+s(this.props[4])+","+s(this.props[5])+","+s(this.props[6])+","+s(this.props[7])+","+s(this.props[8])+","+s(this.props[9])+","+s(this.props[10])+","+s(this.props[11])+","+s(this.props[12])+","+s(this.props[13])+","+s(this.props[14])+","+s(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function w(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function S(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=i,this.rotateY=a,this.rotateZ=r,this.skew=h,this.skewFromAxis=o,this.shear=n,this.scale=p,this.setTransform=l,this.translate=f,this.transform=m,this.applyToPoint=u,this.applyToX=g,this.applyToY=v,this.applyToZ=y,this.applyToPointArray=P,this.applyToPointStringified=A,this.toArray=M,this.toCSS=E,this.to2dCSS=w,this.toString=S,this.clone=d,this.cloneFromProps=c,this.inversePoints=k,this.inversePoint=b,this._t=this.transform,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}());!function(t,e){function s(s,p,l){var d=[];p=1==p?{entropy:!0}:p||{};var y=n(r(p.entropy?[s,o(t)]:null==s?h():s,3),d),b=new i(d),k=function(){for(var t=b.g(m),e=u,s=0;g>t;)t=(t+s)*f,e*=f,s=b.g(1);for(;t>=v;)t/=2,e/=2,s>>>=1;return(t+s)/e};return k.int32=function(){return 0|b.g(4)},k.quick=function(){return b.g(4)/4294967296},k["double"]=k,n(o(b.S),t),(p.pass||l||function(t,s,i,r){return r&&(r.S&&a(r,b),t.state=function(){return a(b,{})}),i?(e[c]=t,s):t})(k,y,"global"in p?p.global:this==e,p.state)}function i(t){var e,s=t.length,i=this,a=0,r=i.i=i.j=0,n=i.S=[];for(s||(t=[s++]);f>a;)n[a]=a++;for(a=0;f>a;a++)n[a]=n[r=y&r+t[a%s]+(e=n[a])],n[r]=e;(i.g=function(t){for(var e,s=0,a=i.i,r=i.j,n=i.S;t--;)e=n[a=y&a+1],s=s*f+n[y&(n[a]=n[r=y&r+e])+(n[r]=e)];return i.i=a,i.j=r,s})(f)}function a(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function r(t,e){var s,i=[],a=typeof t;if(e&&"object"==a)for(s in t)try{i.push(r(t[s],e-1))}catch(n){}return i.length?i:"string"==a?t:t+"\x00"}function n(t,e){for(var s,i=t+"",a=0;a<i.length;)e[y&a]=y&(s^=19*e[y&a])+i.charCodeAt(a++);return o(e)}function h(){try{if(p)return o(p.randomBytes(f));var e=new Uint8Array(f);return(l.crypto||l.msCrypto).getRandomValues(e),o(e)}catch(s){var i=l.navigator,a=i&&i.plugins;return[+new Date,l,a,l.screen,o(t)]}}function o(t){return String.fromCharCode.apply(0,t)}var p,l=this,f=256,m=6,d=52,c="random",u=e.pow(f,m),g=e.pow(2,d),v=2*g,y=f-1;e["seed"+c]=s,n(e.random(),t)}([],Et);var Dt=function(){function t(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(l[r])return l[r];var n=new o([t,e,s,i]);return l[r]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function i(t){return 3*t}function a(t,a,r){return((e(a,r)*t+s(a,r))*t+i(a))*t}function r(t,a,r){return 3*e(a,r)*t*t+2*s(a,r)*t+i(a)}function n(t,e,s,i,r){var n,h,o=0;do h=e+(s-e)/2,n=a(h,i,r)-t,n>0?s=h:e=h;while(Math.abs(n)>d&&++o<c);return h}function h(t,e,s,i){for(var n=0;f>n;++n){var h=r(e,s,i);if(0===h)return e;var o=a(e,s,i)-t;e-=o/h}return e}function o(t){this._p=t,this._mSampleValues=v?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var p={};p.getBezierEasing=t;var l={},f=4,m=.001,d=1e-7,c=10,u=11,g=1/(u-1),v="function"==typeof Float32Array;return o.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],r=this._p[3];return this._precomputed||this._precompute(),e===s&&i===r?t:0===t?0:1===t?1:a(this._getTForX(t),s,r)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],i=this._p[3];this._precomputed=!0,(t!==e||s!==i)&&this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;u>s;++s)this._mSampleValues[s]=a(s*g,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,o=1,p=u-1;o!==p&&i[o]<=t;++o)a+=g;--o;var l=(t-i[o])/(i[o+1]-i[o]),f=a+l*g,d=r(f,e,s);return d>=m?h(t,f,e,s):0===d?f:n(t,a,a+g,e,s)}},p}();!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var i=(new Date).getTime(),a=Math.max(0,16-(i-t)),r=window.setTimeout(function(){e(i+a)},a);
+var window="undefined"==typeof window?{}:window;!function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof module&&module.exports?module.exports=e():t.bodymovin=e()}(window,function(){function t(){return{}}function e(t){gt=t?Math.round:function(t){return t}}function s(t){return Math.round(1e4*t)/1e4}function i(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function a(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>i?-1:1}function r(t,e){this.type=t,this.direction=0>e?-1:1}function n(t,e,s,i){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>i?-1:1}function h(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function o(t,e){this.type=t,this.target=e}function p(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)}function l(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;i>s;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,i-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function f(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;s>i;i++)this._cbs[t][i](e)}function m(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,i="";for(s=t;s>0;--s)i+=e[Math.round(Math.random()*(e.length-1))];return i}function d(t,e,s){var i,a,r,n,h,o,p,l;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),h=6*t-n,o=s*(1-e),p=s*(1-h*e),l=s*(1-(1-h)*e),n%6){case 0:i=s,a=l,r=o;break;case 1:i=p,a=s,r=o;break;case 2:i=o,a=s,r=l;break;case 3:i=o,a=p,r=s;break;case 4:i=l,a=o,r=s;break;case 5:i=s,a=o,r=p}return[i,a,r]}function c(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var i,a=Math.max(t,e,s),r=Math.min(t,e,s),n=a-r,h=0===a?0:n/a,o=a/255;switch(a){case r:i=0;break;case t:i=e-s+n*(s>e?6:0),i/=6*n;break;case e:i=s-t+2*n,i/=6*n;break;case s:i=t-e+4*n,i/=6*n}return[i,h,o]}function u(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),d(s[0],s[1],s[2])}function g(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),d(s[0],s[1],s[2])}function v(t,e){var s=c(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),d(s[0],s[1],s[2])}function y(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.props=r}function b(t){var e,s,i=[],a=[],r=[],n={},h=0;t.c&&(i[0]=t.o[0],a[0]=t.i[0],r[0]=t.v[0],h=1),s=t.i.length;var o=s-1;for(e=h;s>e;e+=1)i.push(t.o[o]),a.push(t.i[o]),r.push(t.v[o]),o-=1;return n.i=i,n.o=a,n.v=r,n}function k(){}function A(t,e,s){if(!e){var i=Object.create(t.prototype,s),a={};return i&&"[object Function]"===a.toString.call(i.init)&&i.init(),i}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype._parent=t.prototype}function P(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function M(){function t(t,e,s,i,a,r){var n=t*i+e*a+s*r-a*i-r*t-s*e;return n>-1e-4&&1e-4>n}function e(e,s,i,a,r,n,h,o,p){if(0===i&&0===n&&0===p)return t(e,s,a,r,h,o);var l,f=Math.sqrt(Math.pow(a-e,2)+Math.pow(r-s,2)+Math.pow(n-i,2)),m=Math.sqrt(Math.pow(h-e,2)+Math.pow(o-s,2)+Math.pow(p-i,2)),d=Math.sqrt(Math.pow(h-a,2)+Math.pow(o-r,2)+Math.pow(p-n,2));return l=f>m?f>d?f-m-d:d-m-f:d>m?d-m-f:m-f-d,l>-1e-4&&1e-4>l}function s(t){this.segmentLength=0,this.points=new Array(t)}function i(t,e){this.partialLength=t,this.point=e}function a(t,e){var s=e.segments,i=s.length,a=Pt((i-1)*t),r=t*e.addedLength,n=0;if(r==s[a].l)return s[a].p;for(var h=s[a].l>r?-1:1,o=!0;o;)s[a].l<=r&&s[a+1].l>r?(n=(r-s[a].l)/(s[a+1].l-s[a].l),o=!1):a+=h,(0>a||a>=i-1)&&(o=!1);return s[a].p+(s[a+1].p-s[a].p)*n}function r(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,i,n,h,o){var p=new r;n=0>n?0:n>1?1:n;var l=a(n,o);h=h>1?1:h;var f,m=a(h,o),d=t.length,c=1-l,u=1-m;for(f=0;d>f;f+=1)p.pt1[f]=Math.round(1e3*(c*c*c*t[f]+(l*c*c+c*l*c+c*c*l)*s[f]+(l*l*c+c*l*l+l*c*l)*i[f]+l*l*l*e[f]))/1e3,p.pt3[f]=Math.round(1e3*(c*c*u*t[f]+(l*c*u+c*l*u+c*c*m)*s[f]+(l*l*u+c*l*m+l*c*m)*i[f]+l*l*m*e[f]))/1e3,p.pt4[f]=Math.round(1e3*(c*u*u*t[f]+(l*u*u+c*m*u+c*u*m)*s[f]+(l*m*u+c*m*m+l*u*m)*i[f]+l*m*m*e[f]))/1e3,p.pt2[f]=Math.round(1e3*(u*u*u*t[f]+(m*u*u+u*m*u+u*u*m)*s[f]+(m*m*u+u*m*m+m*u*m)*i[f]+m*m*m*e[f]))/1e3;return p}var h=(Math,function(){function t(t,e){this.l=t,this.p=e}return function(e,s,i,a){var r,n,h,o,p,l,f=wt,m=0,d=[],c=[],u={addedLength:0,segments:[]};for(h=i.length,r=0;f>r;r+=1){for(p=r/(f-1),l=0,n=0;h>n;n+=1)o=kt(1-p,3)*e[n]+3*kt(1-p,2)*p*i[n]+3*(1-p)*kt(p,2)*a[n]+kt(p,3)*s[n],d[n]=o,null!==c[n]&&(l+=kt(d[n]-c[n],2)),c[n]=d[n];l&&(l=At(l),m+=l),u.segments.push(new t(m,p))}return u.addedLength=m,u}}()),o=function(){var e={};return function(a){var r=a.s,n=a.e,h=a.to,o=a.ti,p=(r.join("_")+"_"+n.join("_")+"_"+h.join("_")+"_"+o.join("_")).replace(/\./g,"p");if(e[p])return void(a.bezierData=e[p]);var l,f,m,d,c,u,g,v=wt,y=0,b=null;2===r.length&&(r[0]!=n[0]||r[1]!=n[1])&&t(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&t(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])&&(v=2);var k=new s(v);for(m=h.length,l=0;v>l;l+=1){for(g=new Array(m),c=l/(v-1),u=0,f=0;m>f;f+=1)d=kt(1-c,3)*r[f]+3*kt(1-c,2)*c*(r[f]+h[f])+3*(1-c)*kt(c,2)*(n[f]+o[f])+kt(c,3)*n[f],g[f]=d,null!==b&&(u+=kt(g[f]-b[f],2));u=At(u),y+=u,k.points[l]=new i(u,g),b=g}k.segmentLength=y,a.bezierData=k,e[p]=k}}();return{getBezierLength:h,getNewSegment:n,buildBezierData:o,pointOnLine2D:t,pointOnLine3D:e}}function E(){function t(a,r,h){var o,p,l,f,m,d,c,u,g=a.length;for(f=0;g>f;f+=1)if(o=a[f],"ks"in o&&!o.completed){if(o.completed=!0,o.tt&&(a[f-1].td=o.tt),p=[],l=-1,o.hasMask){var v=o.masksProperties;for(d=v.length,m=0;d>m;m+=1)if(v[m].pt.k.i)i(v[m].pt.k);else for(u=v[m].pt.k.length,c=0;u>c;c+=1)v[m].pt.k[c].s&&i(v[m].pt.k[c].s[0]),v[m].pt.k[c].e&&i(v[m].pt.k[c].e[0])}0===o.ty?(o.layers=e(o.refId,r),t(o.layers,r,h)):4===o.ty?s(o.shapes):5==o.ty&&n(o,h)}}function e(t,e){for(var s=0,i=e.length;i>s;){if(e[s].id===t)return e[s].layers;s+=1}}function s(t){var e,a,r,n=t.length,h=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)i(t[e].ks.k);else for(r=t[e].ks.k.length,a=0;r>a;a+=1)t[e].ks.k[a].s&&i(t[e].ks.k[a].s[0]),t[e].ks.k[a].e&&i(t[e].ks.k[a].e[0]);h=!0}else"gr"==t[e].ty&&s(t[e].it)}function i(t){var e,s=t.i.length;for(e=0;s>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function a(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]?!0:s[0]>t[0]?!1:t[1]>s[1]?!0:s[1]>t[1]?!1:t[2]>s[2]?!0:s[2]>t[2]?!1:void 0}function r(e,s){e.__complete||(p(e),h(e),o(e),l(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){var s,i,a=t.t.d.k,r=a.length;for(i=0;r>i;i+=1){var n=t.t.d.k[i].s;s=[];var h,o,p,l,f,m,d,c=0,u=t.t.m.g,g=0,v=0,y=0,b=[],k=0,A=0,P=e.getFontByName(n.f),M=0,E=P.fStyle.split(" "),w="normal",S="normal";for(o=E.length,h=0;o>h;h+=1)"italic"===E[h].toLowerCase()?S="italic":"bold"===E[h].toLowerCase()?w="700":"black"===E[h].toLowerCase()?w="900":"medium"===E[h].toLowerCase()?w="500":"regular"===E[h].toLowerCase()||"normal"===E[h].toLowerCase()?w="400":("light"===E[h].toLowerCase()||"thin"===E[h].toLowerCase())&&(w="200");if(n.fWeight=w,n.fStyle=S,o=n.t.length,n.sz){var F=n.sz[0],x=-1;for(h=0;o>h;h+=1)p=!1," "===n.t.charAt(h)?x=h:13===n.t.charCodeAt(h)&&(k=0,p=!0),e.chars?(d=e.getCharData(n.t.charAt(h),P.fStyle,P.fFamily),M=p?0:d.w*n.s/100):M=e.measureText(n.t.charAt(h),n.f,n.s),k+M>F?(-1===x?(n.t=n.t.substr(0,h)+"\r"+n.t.substr(h),o+=1):(h=x,n.t=n.t.substr(0,h)+"\r"+n.t.substr(h+1)),x=-1,k=0):k+=M;o=n.t.length}for(k=0,M=0,h=0;o>h;h+=1)if(p=!1," "===n.t.charAt(h)?l="\xa0":13===n.t.charCodeAt(h)?(b.push(k),A=k>A?k:A,k=0,l="",p=!0,y+=1):l=n.t.charAt(h),e.chars?(d=e.getCharData(n.t.charAt(h),P.fStyle,e.getFontByName(n.f).fFamily),M=p?0:d.w*n.s/100):M=e.measureText(l,n.f,n.s),k+=M,s.push({l:M,an:M,add:g,n:p,anIndexes:[],val:l,line:y}),2==u){if(g+=M,""==l||"\xa0"==l||h==o-1){for((""==l||"\xa0"==l)&&(g-=M);h>=v;)s[v].an=g,s[v].ind=c,s[v].extra=M,v+=1;c+=1,g=0}}else if(3==u){if(g+=M,""==l||h==o-1){for(""==l&&(g-=M);h>=v;)s[v].an=g,s[v].ind=c,s[v].extra=M,v+=1;g=0,c+=1}}else s[c].ind=c,s[c].extra=0,c+=1;if(n.l=s,A=k>A?k:A,b.push(k),n.sz)n.boxWidth=n.sz[0],n.justifyOffset=0;else switch(n.boxWidth=A,n.j){case 1:n.justifyOffset=-n.boxWidth;break;case 2:n.justifyOffset=-n.boxWidth/2;break;default:n.justifyOffset=0}n.lineWidths=b;var D=t.t.a;m=D.length;var C,_,T=[];for(f=0;m>f;f+=1){for(D[f].a.sc&&(n.strokeColorAnim=!0),D[f].a.sw&&(n.strokeWidthAnim=!0),(D[f].a.fc||D[f].a.fh||D[f].a.fs||D[f].a.fb)&&(n.fillColorAnim=!0),_=0,C=D[f].s.b,h=0;o>h;h+=1)s[h].anIndexes[f]=_,(1==C&&""!=s[h].val||2==C&&""!=s[h].val&&"\xa0"!=s[h].val||3==C&&(s[h].n||"\xa0"==s[h].val||h==o-1)||4==C&&(s[h].n||h==o-1))&&(1===D[f].s.rn&&T.push(_),_+=1);t.t.a[f].s.totalChars=_;var I,L=-1;if(1===D[f].s.rn)for(h=0;o>h;h+=1)L!=s[h].anIndexes[f]&&(L=s[h].anIndexes[f],I=T.splice(Math.floor(Math.random()*T.length),1)[0]),s[h].anIndexes[f]=I}0!==m||"m"in t.t.p||(t.singleShape=!0),n.yOffset=n.lh||1.2*n.s,n.ls=n.ls||0,n.ascent=P.ascent*n.s/100}}var h=function(){function t(t){var e=t.t.d;t.t.d={k:[{s:e,t:0}]}}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)5===e[s].ty&&t(e[s])}var s=[4,4,14];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),o=function(){var t=[4,7,99];return function(e){if(e.chars&&!a(t,e.v)){var s,r,n,h,o,p=e.chars.length;for(s=0;p>s;s+=1)if(e.chars[s].data&&e.chars[s].data.shapes)for(o=e.chars[s].data.shapes[0].it,n=o.length,r=0;n>r;r+=1)h=o[r].ks.k,i(o[r].ks.k)}}}(),p=function(){function t(e){var s,i,a,r=e.length;for(s=0;r>s;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(a=e[s].c.k.length,i=0;a>i;i+=1)e[s].c.k[i].s&&(e[s].c.k[i].s[0]/=255,e[s].c.k[i].s[1]/=255,e[s].c.k[i].s[2]/=255,e[s].c.k[i].s[3]/=255),e[s].c.k[i].e&&(e[s].c.k[i].e[0]/=255,e[s].c.k[i].e[1]/=255,e[s].c.k[i].e[2]/=255,e[s].c.k[i].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,i=e.length;for(s=0;i>s;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),l=function(){function t(e){var s,i,a,r=e.length,n=!1;for(s=r-1;s>=0;s-=1)if("sh"==e[s].ty){if(e[s].ks.k.i)e[s].ks.k.c=e[s].closed;else for(a=e[s].ks.k.length,i=0;a>i;i+=1)e[s].ks.k[i].s&&(e[s].ks.k[i].s[0].c=e[s].closed),e[s].ks.k[i].e&&(e[s].ks.k[i].e[0].c=e[s].closed);n=!0}else"gr"==e[s].ty&&t(e[s].it)}function e(e){var s,i,a,r,n,h,o=e.length;for(i=0;o>i;i+=1){if(s=e[i],s.hasMask){var p=s.masksProperties;for(r=p.length,a=0;r>a;a+=1)if(p[a].pt.k.i)p[a].pt.k.c=p[a].cl;else for(h=p[a].pt.k.length,n=0;h>n;n+=1)p[a].pt.k[n].s&&(p[a].pt.k[n].s[0].c=p[a].cl),p[a].pt.k[n].e&&(p[a].pt.k[n].e[0].c=p[a].cl)}4===s.ty&&t(s.shapes)}}var s=[4,4,18];return function(t){if(a(s,t.v)&&(e(t.layers),t.assets)){var i,r=t.assets.length;for(i=0;r>i;i+=1)t.assets[i].layers&&e(t.assets[i].layers)}}}(),f={};return f.completeData=r,f}function w(){this.c=!1,this._length=0,this._maxLength=8,this.v=Array.apply(null,{length:this._maxLength}),this.o=Array.apply(null,{length:this._maxLength}),this.i=Array.apply(null,{length:this._maxLength})}function S(){}function F(){}function x(){}function D(){}function C(){this._length=0,this._maxLength=4,this.shapes=Array.apply(null,{length:this._maxLength})}function _(){}function T(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:e&&e.hideOnTransparent===!1?!1:!0},this.globalData.renderConfig=this.renderConfig,this.elements=[],this.pendingElements=[],this.destroyed=!1}function I(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var i,a,r,n,h,o,p,l,f=this.globalData.defs,d=this.masksProperties.length,c=this.masksProperties,u=0,g=[],v=m(10),y="clipPath",b="clip-path";for(i=0;d>i;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(y="mask",b="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!=u?h=null:(h=document.createElementNS(vt,"rect"),h.setAttribute("fill","#ffffff"),h.setAttribute("width",this.element.comp.data.w),h.setAttribute("height",this.element.comp.data.h),g.push(h)),a=document.createElementNS(vt,"path"),"n"!=c[i].mode){if(u+=1,"s"==c[i].mode?a.setAttribute("fill","#000000"):a.setAttribute("fill","#ffffff"),a.setAttribute("clip-rule","nonzero"),0!==c[i].x.k){y="mask",b="mask",l=It.getProp(this.element,c[i].x,0,null,this.dynamicProperties);var k="fi_"+m(10);o=document.createElementNS(vt,"filter"),o.setAttribute("id",k),p=document.createElementNS(vt,"feMorphology"),p.setAttribute("operator","dilate"),p.setAttribute("in","SourceGraphic"),p.setAttribute("radius","0"),o.appendChild(p),f.appendChild(o),"s"==c[i].mode?a.setAttribute("stroke","#000000"):a.setAttribute("stroke","#ffffff")}else p=null,l=null;if(this.storedData[i]={elem:a,x:l,expan:p,lastPath:"",lastOperator:"",filterId:k,lastRadius:0},"i"==c[i].mode){n=g.length;var A=document.createElementNS(vt,"g");for(r=0;n>r;r+=1)A.appendChild(g[r]);var P=document.createElementNS(vt,"mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",v+"_"+u),P.appendChild(a),f.appendChild(P),A.setAttribute("mask","url(#"+v+"_"+u+")"),g.length=0,g.push(A)}else g.push(a);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:a,lastPath:"",op:It.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Lt.getShapeProp(this.element,c[i],3,this.dynamicProperties,null)},h&&(this.viewData[i].invRect=h),this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:It.getProp(this.element,c[i].o,0,.01,this.dynamicProperties),prop:Lt.getShapeProp(this.element,c[i],3,this.dynamicProperties,null),elem:a},f.appendChild(a);for(this.maskElement=document.createElementNS(vt,y),d=g.length,i=0;d>i;i+=1)this.maskElement.appendChild(g[i]);this.maskElement.setAttribute("id",v),u>0&&this.element.maskedElement.setAttribute(b,"url(#"+v+")"),f.appendChild(this.maskElement)}function L(){}function N(t,e,s,i,a){this.globalData=s,this.comp=i,this.data=t,this.matteElement=null,this.transformedElement=null,this.isTransparent=!1,this.parentContainer=e,this.layerId=a?a.layerId:"ly_"+m(10),this.placeholder=a,this.init()}function V(t,e,s,i,a){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this._parent.constructor.call(this,t,e,s,i,a)}function z(t,e,s,i){}function R(t,e,s,i,a){this.textSpans=[],this.renderType="svg",this._parent.constructor.call(this,t,e,s,i,a)}function O(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=document.createElementNS(vt,"feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var i=document.createElementNS(vt,"feMerge");t.appendChild(i);var a;a=document.createElementNS(vt,"feMergeNode"),a.setAttribute("in","SourceGraphic"),i.appendChild(a),a=document.createElementNS(vt,"feMergeNode"),a.setAttribute("in","f2"),i.appendChild(a)}}function j(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function B(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function G(t,e){this.filterManager=e;var s=document.createElementNS(vt,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s);var i=document.createElementNS(vt,"feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var a=document.createElementNS(vt,"feFuncR");a.setAttribute("type","table"),i.appendChild(a),this.feFuncR=a;var r=document.createElementNS(vt,"feFuncG");r.setAttribute("type","table"),i.appendChild(r),this.feFuncG=r;var n=document.createElementNS(vt,"feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function X(t,e){this.filterManager=e;var s=this.filterManager.effectElements,i=document.createElementNS(vt,"feComponentTransfer");(s[9].p.k||0!==s[9].p.v||s[10].p.k||1!==s[10].p.v||s[11].p.k||1!==s[11].p.v||s[12].p.k||0!==s[12].p.v||s[13].p.k||1!==s[13].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(s[16].p.k||0!==s[16].p.v||s[17].p.k||1!==s[17].p.v||s[18].p.k||1!==s[18].p.v||s[19].p.k||0!==s[19].p.v||s[20].p.k||1!==s[20].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(s[23].p.k||0!==s[23].p.v||s[24].p.k||1!==s[24].p.v||s[25].p.k||1!==s[25].p.v||s[26].p.k||0!==s[26].p.v||s[27].p.k||1!==s[27].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(s[30].p.k||0!==s[30].p.v||s[31].p.k||1!==s[31].p.v||s[32].p.k||1!==s[32].p.v||s[33].p.k||0!==s[33].p.v||s[34].p.k||1!==s[34].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",i)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),i=document.createElementNS(vt,"feComponentTransfer")),(s[2].p.k||0!==s[2].p.v||s[3].p.k||1!==s[3].p.v||s[4].p.k||1!==s[4].p.v||s[5].p.k||0!==s[5].p.v||s[6].p.k||1!==s[6].p.v)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.feFuncRComposed=this.createFeFunc("feFuncR",i),this.feFuncGComposed=this.createFeFunc("feFuncG",i),this.feFuncBComposed=this.createFeFunc("feFuncB",i))}function q(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var s=document.createElementNS(vt,"feGaussianBlur");s.setAttribute("in","SourceAlpha"),s.setAttribute("result","drop_shadow_1"),s.setAttribute("stdDeviation","0"),this.feGaussianBlur=s,t.appendChild(s);var i=document.createElementNS(vt,"feOffset");i.setAttribute("dx","25"),i.setAttribute("dy","0"),i.setAttribute("in","drop_shadow_1"),i.setAttribute("result","drop_shadow_2"),this.feOffset=i,t.appendChild(i);var a=document.createElementNS(vt,"feFlood");a.setAttribute("flood-color","#00ff00"),a.setAttribute("flood-opacity","1"),a.setAttribute("result","drop_shadow_3"),this.feFlood=a,t.appendChild(a);var r=document.createElementNS(vt,"feComposite");r.setAttribute("in","drop_shadow_3"),r.setAttribute("in2","drop_shadow_2"),r.setAttribute("operator","in"),r.setAttribute("result","drop_shadow_4"),t.appendChild(r);var n=document.createElementNS(vt,"feMerge");t.appendChild(n);var h;h=document.createElementNS(vt,"feMergeNode"),n.appendChild(h),h=document.createElementNS(vt,"feMergeNode"),h.setAttribute("in","SourceGraphic"),this.feMergeNode=h,this.feMerge=n,this.originalNodeAdded=!1,n.appendChild(h)}function Y(t){var e,s=t.data.ef.length,i=m(10),a=Rt.createFilter(i),r=0;this.filters=[];var n;for(e=0;s>e;e+=1)20===t.data.ef[e].ty?(r+=1,n=new O(a,t.effects.effectElements[e]),this.filters.push(n)):21===t.data.ef[e].ty?(r+=1,n=new j(a,t.effects.effectElements[e]),this.filters.push(n)):22===t.data.ef[e].ty?(n=new B(t,t.effects.effectElements[e]),this.filters.push(n)):23===t.data.ef[e].ty?(r+=1,n=new G(a,t.effects.effectElements[e]),this.filters.push(n)):24===t.data.ef[e].ty?(r+=1,n=new X(a,t.effects.effectElements[e]),this.filters.push(n)):25===t.data.ef[e].ty&&(r+=1,n=new q(a,t.effects.effectElements[e]),this.filters.push(n));r&&(t.globalData.defs.appendChild(a),t.layerElement.setAttribute("filter","url(#"+i+")"))}function W(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?Array.apply(null,{length:this.layers.length}):[],this.data.tm&&(this.tm=It.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.xt?(this.layerElement=document.createElementNS(vt,"g"),this.buildAllItems()):s.progressiveLoad||this.buildAllItems()}function H(t,e,s,i,a){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,i,a)}function U(t,e,s,i,a){this._parent.constructor.call(this,t,e,s,i,a)}function Z(t){Xt.play(t)}function J(t){Xt.pause(t)}function K(t){Xt.togglePause(t)}function Q(t,e){Xt.setSpeed(t,e)}function $(t,e){Xt.setDirection(t,e)}function tt(t){Xt.stop(t)}function et(t){Xt.moveFrame(t)}function st(){Wt===!0?Xt.searchAnimations(Ht,Wt,Ut):Xt.searchAnimations()}function it(t){return Xt.registerAnimation(t)}function at(){Xt.resize()}function rt(){Xt.start()}function nt(t,e,s){Xt.goToAndStop(t,e,s)}function ht(t){yt=t}function ot(t){return Wt===!0&&(t.animationData=JSON.parse(Ht)),Xt.loadAnimation(t)}function pt(t){return Xt.destroy(t)}function lt(t){if("string"==typeof t)switch(t){case"high":wt=200;break;case"medium":wt=50;break;case"low":wt=10}else!isNaN(t)&&t>1&&(wt=t);e(wt>=50?!1:!0)}function ft(t,e){"expressions"===t&&(ut=e)}function mt(t){switch(t){case"propertyFactory":return It;case"shapePropertyFactory":return Lt;case"matrix":return k}}function dt(){"complete"===document.readyState&&(clearInterval($t),st())}function ct(t){for(var e=Qt.split("&"),s=0;s<e.length;s++){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}var ut,gt,vt="http://www.w3.org/2000/svg",yt=!0,bt=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),kt=(Math.round,Math.pow),At=Math.sqrt,Pt=(Math.abs,Math.floor),Mt=(Math.max,Math.min),Et={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;s>t;t+=1)Et[e[t]]=Math[e[t]]}(),Et.random=Math.random,Et.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,i=Array.apply(null,{length:t.length}),a=t.length;for(s=0;a>s;s+=1)i[s]=Math.abs(t[s]);return i}return Math.abs(t)};var wt=150,St=Math.PI/180,Ft=.5519;e(!1);var xt=function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,i){return 0>t&&(t=0),0>e&&(e=0),0>i&&(i=0),"#"+s[t]+s[e]+s[i]}}(),k=(function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),function(){function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function a(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function r(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function n(t,e){return this._t(1,e,t,1,0,0)}function h(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),i=Math.sin(e);return this._t(s,i,0,0,-i,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-i,0,0,i,s,0,0,0,0,1,0,0,0,0,1)}function p(t,e,s){return s=isNaN(s)?1:s,1==t&&1==e&&1==s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function l(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=i,this.props[4]=a,this.props[5]=r,this.props[6]=n,this.props[7]=h,this.props[8]=o,this.props[9]=p,this.props[10]=l,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function f(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function m(t,e,s,i,a,r,n,h,o,p,l,f,m,d,c,u){if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===h&&0===o&&0===p&&1===l&&0===f)return(0!==m||0!==d||0!==c)&&(this.props[12]=this.props[12]*t+this.props[13]*a+this.props[14]*o+this.props[15]*m,this.props[13]=this.props[12]*e+this.props[13]*r+this.props[14]*p+this.props[15]*d,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*l+this.props[15]*c,this.props[15]=this.props[12]*i+this.props[13]*h+this.props[14]*f+this.props[15]*u),this._identityCalculated=!1,this;var g=this.props[0],v=this.props[1],y=this.props[2],b=this.props[3],k=this.props[4],A=this.props[5],P=this.props[6],M=this.props[7],E=this.props[8],w=this.props[9],S=this.props[10],F=this.props[11],x=this.props[12],D=this.props[13],C=this.props[14],_=this.props[15];return this.props[0]=g*t+v*a+y*o+b*m,this.props[1]=g*e+v*r+y*p+b*d,this.props[2]=g*s+v*n+y*l+b*c,this.props[3]=g*i+v*h+y*f+b*u,this.props[4]=k*t+A*a+P*o+M*m,this.props[5]=k*e+A*r+P*p+M*d,this.props[6]=k*s+A*n+P*l+M*c,this.props[7]=k*i+A*h+P*f+M*u,this.props[8]=E*t+w*a+S*o+F*m,this.props[9]=E*e+w*r+S*p+F*d,this.props[10]=E*s+w*n+S*l+F*c,this.props[11]=E*i+w*h+S*f+F*u,this.props[12]=x*t+D*a+C*o+_*m,this.props[13]=x*e+D*r+C*p+_*d,this.props[14]=x*s+D*n+C*l+_*c,this.props[15]=x*i+D*h+C*f+_*u,this._identityCalculated=!1,this}function d(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function c(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function u(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function g(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function v(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function y(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function b(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function k(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],s=this.props[5]/e,i=-this.props[1]/e,a=-this.props[4]/e,r=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,h=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*s+t[1]*a+n,t[0]*i+t[1]*r+h,0]}function A(t){var e,s=t.length,i=[];for(e=0;s>e;e+=1)i[e]=k(t[e]);return i}function P(t,e,s,i){if(i&&2===i){var a=jt.newPoint();return a[0]=t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],a[1]=t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],a}return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function M(t,e){return this.isIdentity()?t+","+e:gt(t*this.props[0]+e*this.props[4]+this.props[12])+","+gt(t*this.props[1]+e*this.props[5]+this.props[13])}function E(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function w(){return bt?"matrix3d("+s(this.props[0])+","+s(this.props[1])+","+s(this.props[2])+","+s(this.props[3])+","+s(this.props[4])+","+s(this.props[5])+","+s(this.props[6])+","+s(this.props[7])+","+s(this.props[8])+","+s(this.props[9])+","+s(this.props[10])+","+s(this.props[11])+","+s(this.props[12])+","+s(this.props[13])+","+s(this.props[14])+","+s(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function S(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function F(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=i,this.rotateY=a,this.rotateZ=r,this.skew=h,this.skewFromAxis=o,this.shear=n,this.scale=p,this.setTransform=l,this.translate=f,this.transform=m,this.applyToPoint=g,this.applyToX=v,this.applyToY=y,this.applyToZ=b,this.applyToPointArray=P,this.applyToPointStringified=M,this.toArray=E,this.toCSS=w,this.to2dCSS=S,this.toString=F,this.clone=c,this.cloneFromProps=u,this.inversePoints=A,this.inversePoint=k,this._t=this.transform,this.isIdentity=d,this._identity=!0,this._identityCalculated=!1,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}());!function(t,e){function s(s,p,l){var d=[];p=1==p?{entropy:!0}:p||{};var y=n(r(p.entropy?[s,o(t)]:null==s?h():s,3),d),b=new i(d),k=function(){for(var t=b.g(m),e=u,s=0;g>t;)t=(t+s)*f,e*=f,s=b.g(1);for(;t>=v;)t/=2,e/=2,s>>>=1;return(t+s)/e};return k.int32=function(){return 0|b.g(4)},k.quick=function(){return b.g(4)/4294967296},k["double"]=k,n(o(b.S),t),(p.pass||l||function(t,s,i,r){return r&&(r.S&&a(r,b),t.state=function(){return a(b,{})}),i?(e[c]=t,s):t})(k,y,"global"in p?p.global:this==e,p.state)}function i(t){var e,s=t.length,i=this,a=0,r=i.i=i.j=0,n=i.S=[];for(s||(t=[s++]);f>a;)n[a]=a++;for(a=0;f>a;a++)n[a]=n[r=y&r+t[a%s]+(e=n[a])],n[r]=e;(i.g=function(t){for(var e,s=0,a=i.i,r=i.j,n=i.S;t--;)e=n[a=y&a+1],s=s*f+n[y&(n[a]=n[r=y&r+e])+(n[r]=e)];return i.i=a,i.j=r,s})(f)}function a(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function r(t,e){var s,i=[],a=typeof t;if(e&&"object"==a)for(s in t)try{i.push(r(t[s],e-1))}catch(n){}return i.length?i:"string"==a?t:t+"\x00"}function n(t,e){for(var s,i=t+"",a=0;a<i.length;)e[y&a]=y&(s^=19*e[y&a])+i.charCodeAt(a++);return o(e)}function h(){try{if(p)return o(p.randomBytes(f));var e=new Uint8Array(f);return(l.crypto||l.msCrypto).getRandomValues(e),o(e)}catch(s){var i=l.navigator,a=i&&i.plugins;return[+new Date,l,a,l.screen,o(t)]}}function o(t){return String.fromCharCode.apply(0,t)}var p,l=this,f=256,m=6,d=52,c="random",u=e.pow(f,m),g=e.pow(2,d),v=2*g,y=f-1;e["seed"+c]=s,n(e.random(),t)}([],Et);var Dt=function(){function t(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(l[r])return l[r];var n=new o([t,e,s,i]);return l[r]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function i(t){return 3*t}function a(t,a,r){return((e(a,r)*t+s(a,r))*t+i(a))*t}function r(t,a,r){return 3*e(a,r)*t*t+2*s(a,r)*t+i(a)}function n(t,e,s,i,r){var n,h,o=0;do h=e+(s-e)/2,n=a(h,i,r)-t,n>0?s=h:e=h;while(Math.abs(n)>d&&++o<c);return h}function h(t,e,s,i){for(var n=0;f>n;++n){var h=r(e,s,i);if(0===h)return e;var o=a(e,s,i)-t;e-=o/h}return e}function o(t){this._p=t,this._mSampleValues=v?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var p={};p.getBezierEasing=t;var l={},f=4,m=.001,d=1e-7,c=10,u=11,g=1/(u-1),v="function"==typeof Float32Array;return o.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],r=this._p[3];
 
-return t=i+a,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var Ct=M(),_t=E(),Tt=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var i=document.createElement("span");i.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(i),document.body.appendChild(s);var a=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:a,parent:s}}function e(){var t,s,i,a=this.fonts.length,r=a;for(t=0;a>t;t+=1)if(this.fonts[t].loaded)r-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,s.offsetWidth!==i?(r-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,s.offsetWidth!==i&&(r-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==r&&Date.now()-this.initTime<o?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(vt,"text");s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s);var i=document.createElement("canvas").getContext("2d");return i.font="100px "+e.fFamily,i}function i(i,a){if(!i)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=i.list);var r,n=i.list,h=n.length;for(r=0;h>r;r+=1){if(n[r].loaded=!1,n[r].monoCase=t(n[r].fFamily,"monospace"),n[r].sansCase=t(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin||3===n[r].origin){var o=document.createElement("style");o.type="text/css",o.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",a.appendChild(o)}else if("g"===n[r].fOrigin||1===n[r].origin){var p=document.createElement("link");p.type="text/css",p.rel="stylesheet",p.href=n[r].fPath,a.appendChild(p)}else if("t"===n[r].fOrigin||2===n[r].origin){var l=document.createElement("script");l.setAttribute("src",n[r].fPath),a.appendChild(l)}}else n[r].loaded=!0;n[r].helper=s(a,n[r]),this.fonts.push(n[r])}e.bind(this)()}function a(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;a>e;e+=1){for(s=0,i=!1;r>s;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(i=!0),s+=1;i||(this.chars.push(t[e]),r+=1)}}}function r(t,e,s){for(var i=0,a=this.chars.length;a>i;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}}function n(t,e,s){var i=this.getFontByName(e),a=i.helper;return a.measureText(t).width*s/100}function h(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var o=5e3,p=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return p.prototype.addChars=a,p.prototype.addFonts=i,p.prototype.getCharData=r,p.prototype.getFontByName=h,p.prototype.measureText=n,p}(),It=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(!(t===this.lastFrame||this.lastFrame!==p&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime))){for(var e,s,i=this.lastFrame<t?this._lastIndex:0,a=this.keyframes.length-1,r=!0;r;){if(e=this.keyframes[i],s=this.keyframes[i+1],i==a-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;a-1>i?i+=1:r=!1}this._lastIndex=i;var n,h,o,l,f,m;if(e.to){e.bezierData||Ct.buildBezierData(e);var d=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var c=t>=s.t-this.offsetTime?d.points.length-1:0;for(h=d.points[c].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[c].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);this._lastBezierData=null}else{e.__fnct?m=e.__fnct:(m=Dt.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=m),o=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var u,g=d.segmentLength*o,v=this.lastFrame<t&&this._lastBezierData===d?this._lastAddedLength:0;for(f=this.lastFrame<t&&this._lastBezierData===d?this._lastPoint:0,r=!0,l=d.points.length;r;){if(v+=d.points[f].partialLength,0===g||0===o||f==d.points.length-1){for(h=d.points[f].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[f].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}if(g>=v&&g<v+d.points[f+1].partialLength){for(u=(g-v)/d.points[f+1].partialLength,h=d.points[f].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[f].point[n]+(d.points[f+1].point[n]-d.points[f].point[n])*u,this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}l-1>f?f+=1:r=!1}this._lastPoint=f,this._lastAddedLength=v-d.points[f].partialLength,this._lastBezierData=d}}else{var y,b,k,P,A;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(t>=s.t-this.offsetTime?o=1:t<e.t-this.offsetTime?o=0:(e.o.x instanceof Array?(e.__fnct||(e.__fnct=[]),e.__fnct[i]?m=e.__fnct[i]:(y=e.o.x[i]||e.o.x[0],b=e.o.y[i]||e.o.y[0],k=e.i.x[i]||e.i.x[0],P=e.i.y[i]||e.i.y[0],m=Dt.getBezierEasing(y,b,k,P).get,e.__fnct[i]=m)):e.__fnct?m=e.__fnct:(y=e.o.x,b=e.o.y,k=e.i.x,P=e.i.y,m=Dt.getBezierEasing(y,b,k,P).get,e.__fnct=m),o=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime))))),this.sh&&1!==e.h){var M=e.s[i],E=e.e[i];-180>M-E?M+=360:M-E>180&&(M-=360),A=M+(E-M)*o}else A=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*o;1===a?(this.v=this.mult?A*this.mult:A,this.pv=A,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[i]=this.mult?A*this.mult:A,this.pv[i]=A,this.lastPValue[i]!==this.pv[i]&&(this.mdf=!0,this.lastPValue[i]=this.pv[i]))}}}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){}function s(t,s,i){this.mult=i,this.v=i?s.k*i:s.k,this.pv=s.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=e}function i(t,s,i){this.mult=i,this.data=s,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=Array.apply(null,{length:s.k.length}),this.pv=Array.apply(null,{length:s.k.length}),this.lastValue=Array.apply(null,{length:s.k.length});var a=Array.apply(null,{length:s.k.length});this.vel=a.map(function(){return 0});var r,n=s.k.length;for(r=0;n>r;r+=1)this.v[r]=i?s.k[r]*i:s.k[r],this.pv[r]=s.k[r];this.getValue=e}function a(e,s,i){this.keyframes=s.k,this.offsetTime=e.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this._lastIndex=0,this.k=!0,this.kf=!0,this.data=s,this.mult=i,this.elem=e,this.comp=e.comp,this.lastFrame=p,this.v=i?s.k[0].s[0]*i:s.k[0].s[0],this.pv=s.k[0].s[0],this.getValue=t}function r(e,s,i){var a,r,n,h,o,l=s.k.length;for(a=0;l-1>a;a+=1)s.k[a].to&&s.k[a].s&&s.k[a].e&&(r=s.k[a].s,n=s.k[a].e,h=s.k[a].to,o=s.k[a].ti,(2===r.length&&(r[0]!==n[0]||r[1]!==n[1])&&Ct.pointOnLine2D(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&Ct.pointOnLine2D(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])||3===r.length&&(r[0]!==n[0]||r[1]!==n[1]||r[2]!==n[2])&&Ct.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],r[0]+h[0],r[1]+h[1],r[2]+h[2])&&Ct.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],n[0]+o[0],n[1]+o[1],n[2]+o[2]))&&(s.k[a].to=null,s.k[a].ti=null));this.keyframes=s.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this.mult=i,this.elem=e,this.comp=e.comp,this.getValue=t,this.frameId=-1,this._lastIndex=0,this.v=Array.apply(null,{length:s.k[0].s.length}),this.pv=Array.apply(null,{length:s.k[0].s.length}),this.lastValue=Array.apply(null,{length:s.k[0].s.length}),this.lastPValue=Array.apply(null,{length:s.k[0].s.length}),this.lastFrame=p}function n(t,e,n,h,o){var p;if(2===n)p=new l(t,e,o);else if(0===e.a)p=0===n?new s(t,e,h):new i(t,e,h);else if(1===e.a)p=0===n?new a(t,e,h):new r(t,e,h);else if(e.k.length)if("number"==typeof e.k[0])p=new i(t,e,h);else switch(n){case 0:p=new a(t,e,h);break;case 1:p=new r(t,e,h)}else p=new s(t,e,h);return p.k&&o.push(p),p}function h(t,e,s,i){return new m(t,e,s,i)}function o(t,e,s){return new d(t,e,s)}var p=-999999,l=function(){function t(){return ExpressionValue(this.p)}function e(){return ExpressionValue(this.px)}function s(){return ExpressionValue(this.py)}function i(){return ExpressionValue(this.a)}function a(){return ExpressionValue(this.or)}function r(){return ExpressionValue(this.r,1/St)}function n(){return ExpressionValue(this.s,100)}function h(){return ExpressionValue(this.o,100)}function o(){return ExpressionValue(this.sk)}function p(){return ExpressionValue(this.sa)}function l(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function f(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,i;this.p.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/this.elem.globalData.frameRate,0),i=this.p.getValueAtTime(this.p.keyframes[0].t/this.elem.globalData.frameRate,0)):this.p.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/this.elem.globalData.frameRate,0),i=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/this.elem.globalData.frameRate,0)):(s=this.p.pv,i=this.p.getValueAtTime((this.p.lastFrame+this.p.offsetTime-.01)/this.elem.globalData.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function m(){this.inverted=!0,this.iv=new k,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function d(){}return function(c,u,g){this.elem=c,this.frameId=-1,this.type="transform",this.dynamicProperties=[],this.mdf=!1,this.data=u,this.getValue=f,this.applyToMatrix=l,this.setInverted=m,this.autoOrient=d,this.v=new k,u.p.s?(this.px=It.getProp(c,u.p.x,0,0,this.dynamicProperties),this.py=It.getProp(c,u.p.y,0,0,this.dynamicProperties),u.p.z&&(this.pz=It.getProp(c,u.p.z,0,0,this.dynamicProperties))):this.p=It.getProp(c,u.p,1,0,this.dynamicProperties),u.r?this.r=It.getProp(c,u.r,0,St,this.dynamicProperties):u.rx&&(this.rx=It.getProp(c,u.rx,0,St,this.dynamicProperties),this.ry=It.getProp(c,u.ry,0,St,this.dynamicProperties),this.rz=It.getProp(c,u.rz,0,St,this.dynamicProperties),this.or=It.getProp(c,u.or,1,St,this.dynamicProperties)),u.sk&&(this.sk=It.getProp(c,u.sk,0,St,this.dynamicProperties),this.sa=It.getProp(c,u.sa,0,St,this.dynamicProperties)),u.a&&(this.a=It.getProp(c,u.a,1,0,this.dynamicProperties)),u.s&&(this.s=It.getProp(c,u.s,1,.01,this.dynamicProperties)),this.o=u.o?It.getProp(c,u.o,0,.01,g):{mdf:!1,v:1},this.dynamicProperties.length?g.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?u.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"xPosition",{get:e}),Object.defineProperty(this,"yPosition",{get:s}),Object.defineProperty(this,"orientation",{get:a}),Object.defineProperty(this,"anchorPoint",{get:i}),Object.defineProperty(this,"rotation",{get:r}),Object.defineProperty(this,"scale",{get:n}),Object.defineProperty(this,"opacity",{get:h}),Object.defineProperty(this,"skew",{get:o}),Object.defineProperty(this,"skewAxis",{get:p})}}(),f=function(){function t(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,i,a=4*this.data.p;for(e=0;a>e;e+=1)s=e%4===0?100:255,i=Math.round(this.prop.v[e]*s),this.c[e]!==i&&(this.c[e]=i,this.cmdf=!0);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;a>e;e+=1)s=e%2===0?100:1,i=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this.omdf=!0)}}function e(e,s,i){this.prop=n(e,s.k,1,null,[]),this.data=s,this.k=this.prop.k,this.c=Array.apply(null,{length:4*s.p});var a=s.k.k[0].s?s.k.k[0].s.length-4*s.p:s.k.k.length-4*s.p;this.o=Array.apply(null,{length:a}),this.cmdf=!1,this.omdf=!1,this.getValue=t,this.prop.k&&i.push(this),this.getValue(!0)}return function(t,s,i){return new e(t,s,i)}}(),m=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,i,a){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=i,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var r,n,h=s.length;for(r=0;h>r;r+=1)n=It.getProp(e,s[r].v,0,0,a),this.k=n.k?!0:this.k,this.dataProps[r]={n:s[r].n,p:n};this.getValue=t,this.k?a.push(this):this.getValue(!0)}}(),d=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0)}var s=this.data.totalChars,i=2===this.data.r?1:100/s,a=this.o.v/i,r=this.s.v/i+a,n=this.e.v/i+a;if(r>n){var h=r;r=n,n=h}this.finalS=r,this.finalE=n}function e(t){var e=Dt.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,n=this.finalS,h=this.finalE,o=this.data.sh;if(2==o)r=h===n?t>=h?1:0:s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(3==o)r=h===n?t>=h?0:1:1-s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(4==o)h===n?r=0:(r=s(0,i(.5/(h-n)+(t-n)/(h-n),1)),.5>r?r*=2:r=1-2*(r-.5)),r=e(r);else if(5==o){if(h===n)r=0;else{var p=h-n;t=i(s(0,t+.5-n),h-n);var l=-p/2+t,f=p/2;r=Math.sqrt(1-l*l/(f*f))}r=e(r)}else 6==o?(h===n?r=0:(t=i(s(0,t+.5-n),h-n),r=(1+Math.cos(Math.PI+2*Math.PI*t/(h-n)))/2),r=e(r)):(t>=a(n)&&(r=0>t-n?1-(n-t):s(0,i(h-t,1))),r=e(r));return r*this.a.v}var s=Math.max,i=Math.min,a=Math.floor;return function(s,i,a){this.mdf=!1,this.k=!1,this.data=i,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=It.getProp(s,i.s||{k:0},0,0,this.dynamicProperties),this.e="e"in i?It.getProp(s,i.e,0,0,this.dynamicProperties):{v:2===i.r?i.totalChars:100},this.o=It.getProp(s,i.o||{k:0},0,0,this.dynamicProperties),this.xe=It.getProp(s,i.xe||{k:0},0,0,this.dynamicProperties),this.ne=It.getProp(s,i.ne||{k:0},0,0,this.dynamicProperties),this.a=It.getProp(s,i.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?a.push(this):this.getValue()}}(),c={};return c.getProp=n,c.getDashProp=h,c.getTextSelectorProp=o,c.getGradientProp=f,c}();w.prototype.setPathData=function(t,e){for(this.c=t;e>this._maxLength;)this.doubleArrayLength();for(var s=0;e>s;)this.v[s]=Ot.newPoint(),this.o[s]=Ot.newPoint(),this.i[s]=Ot.newPoint(),s+=1;this._length=e},w.prototype.doubleArrayLength=function(){this.v=this.v.concat(Array.apply(null,{length:this._maxLength})),this.i=this.i.concat(Array.apply(null,{length:this._maxLength})),this.o=this.o.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2},w.prototype.setXYAt=function(t,e,s,i,a){var r;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":r=this.v;break;case"i":r=this.i;break;case"o":r=this.o}(!r[i]||r[i]&&!a)&&(r[i]=Ot.newPoint()),r[i][0]=t,r[i][1]=e},w.prototype.setTripleAt=function(t,e,s,i,a,r,n,h){this.setXYAt(t,e,"v",n,h),this.setXYAt(s,i,"o",n,h),this.setXYAt(a,r,"i",n,h)};var Lt=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame===n||!(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)){var e,s,i;if(t<this.keyframes[0].t-this.offsetTime)e=this.keyframes[0].s[0],i=!0,this._lastIndex=0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],i=!0;else{for(var a,r,h,o,p,l,f=this.lastFrame<n?this._lastIndex:0,m=this.keyframes.length-1,d=!0;d&&(a=this.keyframes[f],r=this.keyframes[f+1],!(r.t-this.offsetTime>t));)m-1>f?f+=1:d=!1;i=1===a.h,this._lastIndex=f;var c;if(!i){if(t>=r.t-this.offsetTime)c=1;else if(t<a.t-this.offsetTime)c=0;else{var u;a.__fnct?u=a.__fnct:(u=Dt.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y).get,a.__fnct=u),c=u((t-(a.t-this.offsetTime))/(r.t-this.offsetTime-(a.t-this.offsetTime)))}s=a.e[0]}e=a.s[0]}o=this.v._length,l=e.i[0].length;var g,v=!1;for(h=0;o>h;h+=1)for(p=0;l>p;p+=1)i?(g=e.i[h][p],this.v.i[h][p]!==g&&(this.v.i[h][p]=g,this.pv.i[h][p]=g,v=!0),g=e.o[h][p],this.v.o[h][p]!==g&&(this.v.o[h][p]=g,this.pv.o[h][p]=g,v=!0),g=e.v[h][p],this.v.v[h][p]!==g&&(this.v.v[h][p]=g,this.pv.v[h][p]=g,v=!0)):(g=e.i[h][p]+(s.i[h][p]-e.i[h][p])*c,this.v.i[h][p]!==g&&(this.v.i[h][p]=g,this.pv.i[h][p]=g,v=!0),g=e.o[h][p]+(s.o[h][p]-e.o[h][p])*c,this.v.o[h][p]!==g&&(this.v.o[h][p]=g,this.pv.o[h][p]=g,v=!0),g=e.v[h][p]+(s.v[h][p]-e.v[h][p])*c,this.v.v[h][p]!==g&&(this.v.v[h][p]=g,this.pv.v[h][p]=g,v=!0));this.mdf=v,this.v.c=e.c,this.paths=this.localShapeCollection}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){return this.v}function s(){this.paths=this.localShapeCollection,this.k||(this.mdf=!1)}function i(t,i,a){this.comp=t.comp,this.k=!1,this.mdf=!1,this.v=Bt.newShape();var r=3===a?i.pt.k:i.ks.k;this.v.v=r.v,this.v.i=r.i,this.v.o=r.o,this.v.c=r.c,this.v._length=this.v.v.length,this.getValue=e,this.pv=Bt.clone(this.v),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s}function a(e,i,a){this.comp=e.comp,this.elem=e,this.offsetTime=e.data.st,this._lastIndex=0,this.getValue=t,this.keyframes=3===a?i.pt.k:i.ks.k,this.k=!0,this.kf=!0;{var r=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length}this.v=Bt.newShape(),this.v.setPathData(this.keyframes[0].s[0].c,r),this.pv=Bt.clone(this.v),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=n,this.reset=s}function r(t,e,s,r){var n;if(3===s||4===s){var l=3===s?e.pt:e.ks,f=l.k;n=1===l.a||f.length?new a(t,e,s):new i(t,e,s)}else 5===s?n=new p(t,e):6===s?n=new h(t,e):7===s&&(n=new o(t,e));return n.k&&r.push(n),n}var n=-999999,h=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,a=this.s.v[1]/2;3!==this.d?(this.v.v[0][0]=t,this.v.v[0][1]=e-a,this.v.v[1][0]=t+s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+a,this.v.v[3][0]=t-s,this.v.v[3][1]=e,this.v.i[0][0]=t-s*i,this.v.i[0][1]=e-a,this.v.i[1][0]=t+s,this.v.i[1][1]=e-a*i,this.v.i[2][0]=t+s*i,this.v.i[2][1]=e+a,this.v.i[3][0]=t-s,this.v.i[3][1]=e+a*i,this.v.o[0][0]=t+s*i,this.v.o[0][1]=e-a,this.v.o[1][0]=t+s,this.v.o[1][1]=e+a*i,this.v.o[2][0]=t-s*i,this.v.o[2][1]=e+a,this.v.o[3][0]=t-s,this.v.o[3][1]=e-a*i):(this.v.v[0][0]=t,this.v.v[0][1]=e-a,this.v.v[1][0]=t-s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+a,this.v.v[3][0]=t+s,this.v.v[3][1]=e,this.v.i[0][0]=t+s*i,this.v.i[0][1]=e-a,this.v.i[1][0]=t-s,this.v.i[1][1]=e-a*i,this.v.i[2][0]=t-s*i,this.v.i[2][1]=e+a,this.v.i[3][0]=t+s,this.v.i[3][1]=e+a*i,this.v.o[0][0]=t-s*i,this.v.o[0][1]=e-a,this.v.o[1][0]=t-s,this.v.o[1][1]=e+a*i,this.v.o[2][0]=t+s*i,this.v.o[2][1]=e+a,this.v.o[3][0]=t+s,this.v.o[3][1]=e-a*i)}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var i=Ft;return function(i,a){this.v=Bt.newShape(),this.v.setPathData(!0,4),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=a.d,this.dynamicProperties=[],this.elem=i,this.comp=i.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=It.getProp(i,a.p,1,0,this.dynamicProperties),this.s=It.getProp(i,a.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),o=function(){function t(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*e),n=-Math.PI/2,h=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;e>t;t+=1){var o=i*Math.cos(n),p=i*Math.sin(n),l=0===o&&0===p?0:p/Math.sqrt(o*o+p*p),f=0===o&&0===p?0:-o/Math.sqrt(o*o+p*p);o+=+this.p.v[0],p+=+this.p.v[1],this.v.setTripleAt(o,p,o-l*r*a*h,p-f*r*a*h,o+l*r*a*h,p+f*r*a*h,t,!0),n+=s*h}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,s,i,a=2*Math.floor(this.pt.v),r=2*Math.PI/a,n=!0,h=this.or.v,o=this.ir.v,p=this.os.v,l=this.is.v,f=2*Math.PI*h/(2*a),m=2*Math.PI*o/(2*a),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(this.v._length=0,t=0;a>t;t+=1){e=n?h:o,s=n?p:l,i=n?f:m;var u=e*Math.cos(d),g=e*Math.sin(d),v=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),y=0===u&&0===g?0:-u/Math.sqrt(u*u+g*g);u+=+this.p.v[0],g+=+this.p.v[1],this.v.setTripleAt(u,g,u-v*i*s*c,g-y*i*s*c,u+v*i*s*c,g+y*i*s*c,t,!0),n=!n,d+=r*c}}function i(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(a,r){this.v=Bt.newShape(),this.v.setPathData(!0,0),this.elem=a,this.comp=a.comp,this.data=r,this.frameId=-1,this.d=r.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=i,this.reset=s,1===r.sy?(this.ir=It.getProp(a,r.ir,0,0,this.dynamicProperties),this.is=It.getProp(a,r.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=It.getProp(a,r.pt,0,0,this.dynamicProperties),this.p=It.getProp(a,r.p,1,0,this.dynamicProperties),this.r=It.getProp(a,r.r,0,St,this.dynamicProperties),this.or=It.getProp(a,r.or,0,0,this.dynamicProperties),this.os=It.getProp(a,r.os,0,.01,this.dynamicProperties),this.localShapeCollection=Gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),p=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=Mt(s,i,this.r.v),r=a*(1-Ft);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+a,t+s,e-i+r,0,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-r,t+s,e+i-a,1,!0),0!==a?(this.v.setTripleAt(t+s-a,e+i,t+s-a,e+i,t+s-r,e+i,2,!0),this.v.setTripleAt(t-s+a,e+i,t-s+r,e+i,t-s+a,e+i,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-a,t-s,e+i-r,4,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+r,t-s,e-i+a,5,!0),this.v.setTripleAt(t-s+a,e-i,t-s+a,e-i,t-s+r,e-i,6,!0),this.v.setTripleAt(t+s-a,e-i,t+s-r,e-i,t+s-a,e-i,7,!0)):(this.v.setTripleAt(t-s,e+i,t-s+r,e+i,t-s,e+i,2),this.v.setTripleAt(t-s,e-i,t-s,e-i+r,t-s,e-i,3))):(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+r,t+s,e-i+a,0,!0),0!==a?(this.v.setTripleAt(t+s-a,e-i,t+s-a,e-i,t+s-r,e-i,1,!0),this.v.setTripleAt(t-s+a,e-i,t-s+r,e-i,t-s+a,e-i,2,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+a,t-s,e-i+r,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-r,t-s,e+i-a,4,!0),this.v.setTripleAt(t-s+a,e+i,t-s+a,e+i,t-s+r,e+i,5,!0),this.v.setTripleAt(t+s-a,e+i,t+s-r,e+i,t+s-a,e+i,6,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-a,t+s,e+i-r,7,!0)):(this.v.setTripleAt(t-s,e-i,t-s+r,e-i,t-s,e-i,1,!0),this.v.setTripleAt(t-s,e+i,t-s,e+i-r,t-s,e+i,2,!0),this.v.setTripleAt(t+s,e+i,t+s-r,e+i,t+s,e+i,3,!0)))}return function(i,a){this.v=Bt.newShape(),this.v.c=!0,this.localShapeCollection=Gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=i,this.comp=i.comp,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=It.getProp(i,a.p,1,0,this.dynamicProperties),this.s=It.getProp(i,a.s,1,0,this.dynamicProperties),this.r=It.getProp(i,a.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),l={};return l.getShapeProp=r,l}(),Nt=function(){function t(t,e){i[t]||(i[t]=e)}function e(t,e,s,a){return new i[t](e,s,a)}var s={},i={};return s.registerModifier=t,s.getModifier=e,s}();S.prototype.initModifierProperties=function(){},S.prototype.addShapeToModifier=function(){},S.prototype.addShape=function(t){this.closed||(this.shapes.push({shape:t.sh,data:t,localShapeCollection:Gt.newShapeCollection()}),this.addShapeToModifier(t.sh))},S.prototype.init=function(t,e,s){this.elem=t,this.frameId=-1,this.shapes=[],this.dynamicProperties=[],this.mdf=!1,this.closed=!1,this.k=!1,this.isTrimming=!1,this.comp=t.comp,this.initModifierProperties(t,e),this.dynamicProperties.length?(this.k=!0,s.push(this)):this.getValue(!0)},A(S,F),F.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;0>i&&(i+=1);var a=this.s.v+i,r=this.e.v+i;if(a>r){var n=a;a=r,r=n}this.sValue=a,this.eValue=r,this.oValue=i}}},F.prototype.initModifierProperties=function(t,e){this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.s=It.getProp(t,e.s,0,.01,this.dynamicProperties),this.e=It.getProp(t,e.e,0,.01,this.dynamicProperties),this.o=It.getProp(t,e.o,0,0,this.dynamicProperties),this.m=e.m,this.dynamicProperties.length||this.getValue(!0)},F.prototype.getSegmentsLength=function(t){var e,s=t.c,i=t.v,a=t.o,r=t.i,n=t._length,h=[],o=0;for(e=0;n-1>e;e+=1)h[e]=Ct.getBezierLength(i[e],i[e+1],a[e],r[e+1]),o+=h[e].addedLength;return s&&(h[e]=Ct.getBezierLength(i[e],i[0],a[e],r[0]),o+=h[e].addedLength),{lengths:h,totalLength:o}},F.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];1>=e?r.push({s:t,e:e}):t>=1?r.push({s:t-1,e:e-1}):(r.push({s:t,e:1}),r.push({s:0,e:e-1}));var n,h,o=[],p=r.length;for(n=0;p>n;n+=1)if(h=r[n],h.e*a<i||h.s*a>i+s);else{var l,f;l=h.s*a<=i?0:(h.s*a-i)/s,f=h.e*a>=i+s?1:(h.e*a-i)/s,o.push([l,f])}return o.length||o.push([0,0]),o},F.prototype.processShapes=function(t){var e,s,i,a,r,n,h,o=this.shapes.length,p=this.sValue,l=this.eValue,f=0;if(l===p)for(s=0;o>s;s+=1)this.shapes[s].localShapeCollection.releaseShapes(),this.shapes[s].shape.mdf=!0,this.shapes[s].shape.paths=this.shapes[s].localShapeCollection;else if(1===l&&0===p||0===l&&1===p){if(this.mdf)for(s=0;o>s;s+=1)this.shapes[s].shape.mdf=!0}else{var m,d,c=[];for(s=0;o>s;s+=1)if(m=this.shapes[s],m.shape.mdf||this.mdf||t||2===this.m){if(e=m.shape.paths,a=e._length,h=0,!m.shape.mdf&&m.pathsData)h=m.totalShapeLength;else{for(r=[],i=0;a>i;i+=1)n=this.getSegmentsLength(e.shapes[i]),r.push(n),h+=n.totalLength;m.totalShapeLength=h,m.pathsData=r}f+=h,m.shape.mdf=!0}else m.shape.paths=m.localShapeCollection;var i,a,u=p,g=l,v=0;for(s=o-1;s>=0;s-=1)if(m=this.shapes[s],m.shape.mdf){if(d=m.localShapeCollection,d.releaseShapes(),2===this.m&&o>1){var y=this.calculateShapeEdges(p,l,m.totalShapeLength,v,f);v+=m.totalShapeLength}else y=[[u,g]];for(a=y.length,i=0;a>i;i+=1){u=y[i][0],g=y[i][1],c.length=0,1>=g?c.push({s:m.totalShapeLength*u,e:m.totalShapeLength*g}):u>=1?c.push({s:m.totalShapeLength*(u-1),e:m.totalShapeLength*(g-1)}):(c.push({s:m.totalShapeLength*u,e:m.totalShapeLength}),c.push({s:0,e:m.totalShapeLength*(g-1)}));var b=this.addShapes(m,c[0]);if(c[0].s!==c[0].e){if(c.length>1)if(m.shape.v.c){var k=b.pop();this.addPaths(b,d),b=this.addShapes(m,c[1],k)}else this.addPaths(b,d),b=this.addShapes(m,c[1]);this.addPaths(b,d)}}m.shape.paths=d}}this.dynamicProperties.length||(this.mdf=!1)},F.prototype.addPaths=function(t,e){var s,i=t.length;for(s=0;i>s;s+=1)e.addShape(t[s])},F.prototype.addSegment=function(t,e,s,i,a,r,n){a.setXYAt(e[0],e[1],"o",r),a.setXYAt(s[0],s[1],"i",r+1),n&&a.setXYAt(t[0],t[1],"v",r),a.setXYAt(i[0],i[1],"v",r+1)},F.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,p,l,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,c=0,u=[],g=!0;for(s?(h=s._length,l=s._length):(s=Bt.newShape(),h=0,l=0),u.push(s),i=0;d>i;i+=1){for(o=f[i].lengths,s.c=m[i].c,r=m[i].c?o.length:o.length+1,a=1;r>a;a+=1)if(n=o[a-1],c+n.addedLength<e.s)c+=n.addedLength,s.c=!1;else{if(c>e.e){s.c=!1;break}e.s<=c&&e.e>=c+n.addedLength?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[a],m[i].v[a],s,h,g),g=!1):(p=Ct.getNewSegment(m[i].v[a-1],m[i].v[a],m[i].o[a-1],m[i].i[a],(e.s-c)/n.addedLength,(e.e-c)/n.addedLength,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h,g),g=!1,s.c=!1),c+=n.addedLength,h+=1}if(m[i].c){if(n=o[a-1],c<=e.e){var v=o[a-1].addedLength;
+return this._precomputed||this._precompute(),e===s&&i===r?t:0===t?0:1===t?1:a(this._getTForX(t),s,r)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],i=this._p[3];this._precomputed=!0,(t!==e||s!==i)&&this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;u>s;++s)this._mSampleValues[s]=a(s*g,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,o=1,p=u-1;o!==p&&i[o]<=t;++o)a+=g;--o;var l=(t-i[o])/(i[o+1]-i[o]),f=a+l*g,d=r(f,e,s);return d>=m?h(t,f,e,s):0===d?f:n(t,a,a+g,e,s)}},p}();!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var i=(new Date).getTime(),a=Math.max(0,16-(i-t)),r=window.setTimeout(function(){e(i+a)},a);return t=i+a,r}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var Ct=M(),_t=E(),Tt=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var i=document.createElement("span");i.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(i),document.body.appendChild(s);var a=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:a,parent:s}}function e(){var t,s,i,a=this.fonts.length,r=a;for(t=0;a>t;t+=1)if(this.fonts[t].loaded)r-=1;else if("t"===this.fonts[t].fOrigin||2===this.fonts[t].origin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{window.Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,i=this.fonts[t].monoCase.w,s.offsetWidth!==i?(r-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,i=this.fonts[t].sansCase.w,s.offsetWidth!==i&&(r-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==r&&Date.now()-this.initTime<o?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(vt,"text");s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s);var i=document.createElement("canvas").getContext("2d");return i.font="100px "+e.fFamily,i}function i(i,a){if(!i)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=i.list);var r,n=i.list,h=n.length;for(r=0;h>r;r+=1){if(n[r].loaded=!1,n[r].monoCase=t(n[r].fFamily,"monospace"),n[r].sansCase=t(n[r].fFamily,"sans-serif"),n[r].fPath){if("p"===n[r].fOrigin||3===n[r].origin){var o=document.createElement("style");o.type="text/css",o.innerHTML="@font-face {font-family: "+n[r].fFamily+"; font-style: normal; src: url('"+n[r].fPath+"');}",a.appendChild(o)}else if("g"===n[r].fOrigin||1===n[r].origin){var p=document.createElement("link");p.type="text/css",p.rel="stylesheet",p.href=n[r].fPath,a.appendChild(p)}else if("t"===n[r].fOrigin||2===n[r].origin){var l=document.createElement("script");l.setAttribute("src",n[r].fPath),a.appendChild(l)}}else n[r].loaded=!0;n[r].helper=s(a,n[r]),this.fonts.push(n[r])}e.bind(this)()}function a(t){if(t){this.chars||(this.chars=[]);var e,s,i,a=t.length,r=this.chars.length;for(e=0;a>e;e+=1){for(s=0,i=!1;r>s;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(i=!0),s+=1;i||(this.chars.push(t[e]),r+=1)}}}function r(t,e,s){for(var i=0,a=this.chars.length;a>i;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}}function n(t,e,s){var i=this.getFontByName(e),a=i.helper;return a.measureText(t).width*s/100}function h(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var o=5e3,p=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return p.prototype.addChars=a,p.prototype.addFonts=i,p.prototype.getCharData=r,p.prototype.getFontByName=h,p.prototype.measureText=n,p}(),It=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(!(t===this.lastFrame||this.lastFrame!==p&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime))){for(var e,s,i=this.lastFrame<t?this._lastIndex:0,a=this.keyframes.length-1,r=!0;r;){if(e=this.keyframes[i],s=this.keyframes[i+1],i==a-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;a-1>i?i+=1:r=!1}this._lastIndex=i;var n,h,o,l,f,m;if(e.to){e.bezierData||Ct.buildBezierData(e);var d=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var c=t>=s.t-this.offsetTime?d.points.length-1:0;for(h=d.points[c].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[c].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);this._lastBezierData=null}else{e.__fnct?m=e.__fnct:(m=Dt.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=m),o=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var u,g=d.segmentLength*o,v=this.lastFrame<t&&this._lastBezierData===d?this._lastAddedLength:0;for(f=this.lastFrame<t&&this._lastBezierData===d?this._lastPoint:0,r=!0,l=d.points.length;r;){if(v+=d.points[f].partialLength,0===g||0===o||f==d.points.length-1){for(h=d.points[f].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[f].point[n],this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}if(g>=v&&g<v+d.points[f+1].partialLength){for(u=(g-v)/d.points[f+1].partialLength,h=d.points[f].point.length,n=0;h>n;n+=1)this.pv[n]=d.points[f].point[n]+(d.points[f+1].point[n]-d.points[f].point[n])*u,this.v[n]=this.mult?this.pv[n]*this.mult:this.pv[n],this.lastPValue[n]!==this.pv[n]&&(this.mdf=!0,this.lastPValue[n]=this.pv[n]);break}l-1>f?f+=1:r=!1}this._lastPoint=f,this._lastAddedLength=v-d.points[f].partialLength,this._lastBezierData=d}}else{var y,b,k,A,P;for(a=e.s.length,i=0;a>i;i+=1){if(1!==e.h&&(t>=s.t-this.offsetTime?o=1:t<e.t-this.offsetTime?o=0:(e.o.x instanceof Array?(e.__fnct||(e.__fnct=[]),e.__fnct[i]?m=e.__fnct[i]:(y=e.o.x[i]||e.o.x[0],b=e.o.y[i]||e.o.y[0],k=e.i.x[i]||e.i.x[0],A=e.i.y[i]||e.i.y[0],m=Dt.getBezierEasing(y,b,k,A).get,e.__fnct[i]=m)):e.__fnct?m=e.__fnct:(y=e.o.x,b=e.o.y,k=e.i.x,A=e.i.y,m=Dt.getBezierEasing(y,b,k,A).get,e.__fnct=m),o=m((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime))))),this.sh&&1!==e.h){var M=e.s[i],E=e.e[i];-180>M-E?M+=360:M-E>180&&(M-=360),P=M+(E-M)*o}else P=1===e.h?e.s[i]:e.s[i]+(e.e[i]-e.s[i])*o;1===a?(this.v=this.mult?P*this.mult:P,this.pv=P,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[i]=this.mult?P*this.mult:P,this.pv[i]=P,this.lastPValue[i]!==this.pv[i]&&(this.mdf=!0,this.lastPValue[i]=this.pv[i]))}}}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){}function s(t,s,i){this.mult=i,this.v=i?s.k*i:s.k,this.pv=s.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=e}function i(t,s,i){this.mult=i,this.data=s,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=Array.apply(null,{length:s.k.length}),this.pv=Array.apply(null,{length:s.k.length}),this.lastValue=Array.apply(null,{length:s.k.length});var a=Array.apply(null,{length:s.k.length});this.vel=a.map(function(){return 0});var r,n=s.k.length;for(r=0;n>r;r+=1)this.v[r]=i?s.k[r]*i:s.k[r],this.pv[r]=s.k[r];this.getValue=e}function a(e,s,i){this.keyframes=s.k,this.offsetTime=e.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this._lastIndex=0,this.k=!0,this.kf=!0,this.data=s,this.mult=i,this.elem=e,this.comp=e.comp,this.lastFrame=p,this.v=i?s.k[0].s[0]*i:s.k[0].s[0],this.pv=s.k[0].s[0],this.getValue=t}function r(e,s,i){var a,r,n,h,o,l=s.k.length;for(a=0;l-1>a;a+=1)s.k[a].to&&s.k[a].s&&s.k[a].e&&(r=s.k[a].s,n=s.k[a].e,h=s.k[a].to,o=s.k[a].ti,(2===r.length&&(r[0]!==n[0]||r[1]!==n[1])&&Ct.pointOnLine2D(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&Ct.pointOnLine2D(r[0],r[1],n[0],n[1],n[0]+o[0],n[1]+o[1])||3===r.length&&(r[0]!==n[0]||r[1]!==n[1]||r[2]!==n[2])&&Ct.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],r[0]+h[0],r[1]+h[1],r[2]+h[2])&&Ct.pointOnLine3D(r[0],r[1],r[2],n[0],n[1],n[2],n[0]+o[0],n[1]+o[1],n[2]+o[2]))&&(s.k[a].to=null,s.k[a].ti=null));this.keyframes=s.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this.mult=i,this.elem=e,this.comp=e.comp,this.getValue=t,this.frameId=-1,this._lastIndex=0,this.v=Array.apply(null,{length:s.k[0].s.length}),this.pv=Array.apply(null,{length:s.k[0].s.length}),this.lastValue=Array.apply(null,{length:s.k[0].s.length}),this.lastPValue=Array.apply(null,{length:s.k[0].s.length}),this.lastFrame=p}function n(t,e,n,h,o){var p;if(2===n)p=new l(t,e,o);else if(0===e.a)p=0===n?new s(t,e,h):new i(t,e,h);else if(1===e.a)p=0===n?new a(t,e,h):new r(t,e,h);else if(e.k.length)if("number"==typeof e.k[0])p=new i(t,e,h);else switch(n){case 0:p=new a(t,e,h);break;case 1:p=new r(t,e,h)}else p=new s(t,e,h);return p.k&&o.push(p),p}function h(t,e,s,i){return new m(t,e,s,i)}function o(t,e,s){return new d(t,e,s)}var p=-999999,l=function(){function t(){return this.p?ExpressionValue(this.p):[this.px.v,this.py.v,this.pz?this.pz.v:0]}function e(){return ExpressionValue(this.px)}function s(){return ExpressionValue(this.py)}function i(){return ExpressionValue(this.a)}function a(){return ExpressionValue(this.or)}function r(){return this.r?ExpressionValue(this.r,1/St):ExpressionValue(this.rz,1/St)}function n(){return ExpressionValue(this.s,100)}function h(){return ExpressionValue(this.o,100)}function o(){return ExpressionValue(this.sk)}function p(){return ExpressionValue(this.sa)}function l(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function f(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,i;this.p.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/this.elem.globalData.frameRate,0),i=this.p.getValueAtTime(this.p.keyframes[0].t/this.elem.globalData.frameRate,0)):this.p.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/this.elem.globalData.frameRate,0),i=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/this.elem.globalData.frameRate,0)):(s=this.p.pv,i=this.p.getValueAtTime((this.p.lastFrame+this.p.offsetTime-.01)/this.elem.globalData.frameRate,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function m(){this.inverted=!0,this.iv=new k,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function d(){}return function(c,u,g){this.elem=c,this.frameId=-1,this.type="transform",this.dynamicProperties=[],this.mdf=!1,this.data=u,this.getValue=f,this.applyToMatrix=l,this.setInverted=m,this.autoOrient=d,this.v=new k,u.p.s?(this.px=It.getProp(c,u.p.x,0,0,this.dynamicProperties),this.py=It.getProp(c,u.p.y,0,0,this.dynamicProperties),u.p.z&&(this.pz=It.getProp(c,u.p.z,0,0,this.dynamicProperties))):this.p=It.getProp(c,u.p,1,0,this.dynamicProperties),u.r?this.r=It.getProp(c,u.r,0,St,this.dynamicProperties):u.rx&&(this.rx=It.getProp(c,u.rx,0,St,this.dynamicProperties),this.ry=It.getProp(c,u.ry,0,St,this.dynamicProperties),this.rz=It.getProp(c,u.rz,0,St,this.dynamicProperties),this.or=It.getProp(c,u.or,1,St,this.dynamicProperties)),u.sk&&(this.sk=It.getProp(c,u.sk,0,St,this.dynamicProperties),this.sa=It.getProp(c,u.sa,0,St,this.dynamicProperties)),u.a&&(this.a=It.getProp(c,u.a,1,0,this.dynamicProperties)),u.s&&(this.s=It.getProp(c,u.s,1,.01,this.dynamicProperties)),this.o=u.o?It.getProp(c,u.o,0,.01,g):{mdf:!1,v:1},this.dynamicProperties.length?g.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?u.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"xPosition",{get:e}),Object.defineProperty(this,"yPosition",{get:s}),Object.defineProperty(this,"orientation",{get:a}),Object.defineProperty(this,"anchorPoint",{get:i}),Object.defineProperty(this,"rotation",{get:r}),Object.defineProperty(this,"scale",{get:n}),Object.defineProperty(this,"opacity",{get:h}),Object.defineProperty(this,"skew",{get:o}),Object.defineProperty(this,"skewAxis",{get:p})}}(),f=function(){function t(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,i,a=4*this.data.p;for(e=0;a>e;e+=1)s=e%4===0?100:255,i=Math.round(this.prop.v[e]*s),this.c[e]!==i&&(this.c[e]=i,this.cmdf=!0);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;a>e;e+=1)s=e%2===0?100:1,i=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this.omdf=!0)}}function e(e,s,i){this.prop=n(e,s.k,1,null,[]),this.data=s,this.k=this.prop.k,this.c=Array.apply(null,{length:4*s.p});var a=s.k.k[0].s?s.k.k[0].s.length-4*s.p:s.k.k.length-4*s.p;this.o=Array.apply(null,{length:a}),this.cmdf=!1,this.omdf=!1,this.getValue=t,this.prop.k&&i.push(this),this.getValue(!0)}return function(t,s,i){return new e(t,s,i)}}(),m=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,i,a){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=i,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var r,n,h=s.length;for(r=0;h>r;r+=1)n=It.getProp(e,s[r].v,0,0,a),this.k=n.k?!0:this.k,this.dataProps[r]={n:s[r].n,p:n};this.getValue=t,this.k?a.push(this):this.getValue(!0)}}(),d=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0)}var s=this.data.totalChars,i=2===this.data.r?1:100/s,a=this.o.v/i,r=this.s.v/i+a,n=this.e.v/i+a;if(r>n){var h=r;r=n,n=h}this.finalS=r,this.finalE=n}function e(t){var e=Dt.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,r=0,n=this.finalS,h=this.finalE,o=this.data.sh;if(2==o)r=h===n?t>=h?1:0:s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(3==o)r=h===n?t>=h?0:1:1-s(0,i(.5/(h-n)+(t-n)/(h-n),1)),r=e(r);else if(4==o)h===n?r=0:(r=s(0,i(.5/(h-n)+(t-n)/(h-n),1)),.5>r?r*=2:r=1-2*(r-.5)),r=e(r);else if(5==o){if(h===n)r=0;else{var p=h-n;t=i(s(0,t+.5-n),h-n);var l=-p/2+t,f=p/2;r=Math.sqrt(1-l*l/(f*f))}r=e(r)}else 6==o?(h===n?r=0:(t=i(s(0,t+.5-n),h-n),r=(1+Math.cos(Math.PI+2*Math.PI*t/(h-n)))/2),r=e(r)):(t>=a(n)&&(r=0>t-n?1-(n-t):s(0,i(h-t,1))),r=e(r));return r*this.a.v}var s=Math.max,i=Math.min,a=Math.floor;return function(s,i,a){this.mdf=!1,this.k=!1,this.data=i,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=It.getProp(s,i.s||{k:0},0,0,this.dynamicProperties),this.e="e"in i?It.getProp(s,i.e,0,0,this.dynamicProperties):{v:2===i.r?i.totalChars:100},this.o=It.getProp(s,i.o||{k:0},0,0,this.dynamicProperties),this.xe=It.getProp(s,i.xe||{k:0},0,0,this.dynamicProperties),this.ne=It.getProp(s,i.ne||{k:0},0,0,this.dynamicProperties),this.a=It.getProp(s,i.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?a.push(this):this.getValue()}}(),c={};return c.getProp=n,c.getDashProp=h,c.getTextSelectorProp=o,c.getGradientProp=f,c}();w.prototype.setPathData=function(t,e){for(this.c=t;e>this._maxLength;)this.doubleArrayLength();for(var s=0;e>s;)this.v[s]=jt.newPoint(),this.o[s]=jt.newPoint(),this.i[s]=jt.newPoint(),s+=1;this._length=e},w.prototype.doubleArrayLength=function(){this.v=this.v.concat(Array.apply(null,{length:this._maxLength})),this.i=this.i.concat(Array.apply(null,{length:this._maxLength})),this.o=this.o.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2},w.prototype.setXYAt=function(t,e,s,i,a){var r;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),s){case"v":r=this.v;break;case"i":r=this.i;break;case"o":r=this.o}(!r[i]||r[i]&&!a)&&(r[i]=jt.newPoint()),r[i][0]=t,r[i][1]=e},w.prototype.setTripleAt=function(t,e,s,i,a,r,n,h){this.setXYAt(t,e,"v",n,h),this.setXYAt(s,i,"o",n,h),this.setXYAt(a,r,"i",n,h)};var Lt=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame===n||!(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)){var e,s,i;if(t<this.keyframes[0].t-this.offsetTime)e=this.keyframes[0].s[0],i=!0,this._lastIndex=0;else if(t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime)e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],i=!0;else{for(var a,r,h,o,p,l,f=this.lastFrame<n?this._lastIndex:0,m=this.keyframes.length-1,d=!0;d&&(a=this.keyframes[f],r=this.keyframes[f+1],!(r.t-this.offsetTime>t));)m-1>f?f+=1:d=!1;i=1===a.h,this._lastIndex=f;var c;if(!i){if(t>=r.t-this.offsetTime)c=1;else if(t<a.t-this.offsetTime)c=0;else{var u;a.__fnct?u=a.__fnct:(u=Dt.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y).get,a.__fnct=u),c=u((t-(a.t-this.offsetTime))/(r.t-this.offsetTime-(a.t-this.offsetTime)))}s=a.e[0]}e=a.s[0]}o=this.v._length,l=e.i[0].length;var g,v=!1;for(h=0;o>h;h+=1)for(p=0;l>p;p+=1)i?(g=e.i[h][p],this.v.i[h][p]!==g&&(this.v.i[h][p]=g,this.pv.i[h][p]=g,v=!0),g=e.o[h][p],this.v.o[h][p]!==g&&(this.v.o[h][p]=g,this.pv.o[h][p]=g,v=!0),g=e.v[h][p],this.v.v[h][p]!==g&&(this.v.v[h][p]=g,this.pv.v[h][p]=g,v=!0)):(g=e.i[h][p]+(s.i[h][p]-e.i[h][p])*c,this.v.i[h][p]!==g&&(this.v.i[h][p]=g,this.pv.i[h][p]=g,v=!0),g=e.o[h][p]+(s.o[h][p]-e.o[h][p])*c,this.v.o[h][p]!==g&&(this.v.o[h][p]=g,this.pv.o[h][p]=g,v=!0),g=e.v[h][p]+(s.v[h][p]-e.v[h][p])*c,this.v.v[h][p]!==g&&(this.v.v[h][p]=g,this.pv.v[h][p]=g,v=!0));this.mdf=v,this.v.c=e.c,this.paths=this.localShapeCollection}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){return this.v}function s(){this.paths=this.localShapeCollection,this.k||(this.mdf=!1)}function i(t,i,a){this.comp=t.comp,this.k=!1,this.mdf=!1,this.v=Bt.newShape();var r=3===a?i.pt.k:i.ks.k;this.v.v=r.v,this.v.i=r.i,this.v.o=r.o,this.v.c=r.c,this.v._length=this.v.v.length,this.getValue=e,this.pv=Bt.clone(this.v),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=s}function a(e,i,a){this.comp=e.comp,this.elem=e,this.offsetTime=e.data.st,this._lastIndex=0,this.getValue=t,this.keyframes=3===a?i.pt.k:i.ks.k,this.k=!0,this.kf=!0;{var r=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length}this.v=Bt.newShape(),this.v.setPathData(this.keyframes[0].s[0].c,r),this.pv=Bt.clone(this.v),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=n,this.reset=s}function r(t,e,s,r){var n;if(3===s||4===s){var l=3===s?e.pt:e.ks,f=l.k;n=1===l.a||f.length?new a(t,e,s):new i(t,e,s)}else 5===s?n=new p(t,e):6===s?n=new h(t,e):7===s&&(n=new o(t,e));return n.k&&r.push(n),n}var n=-999999,h=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,a=this.s.v[1]/2;3!==this.d?(this.v.v[0][0]=t,this.v.v[0][1]=e-a,this.v.v[1][0]=t+s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+a,this.v.v[3][0]=t-s,this.v.v[3][1]=e,this.v.i[0][0]=t-s*i,this.v.i[0][1]=e-a,this.v.i[1][0]=t+s,this.v.i[1][1]=e-a*i,this.v.i[2][0]=t+s*i,this.v.i[2][1]=e+a,this.v.i[3][0]=t-s,this.v.i[3][1]=e+a*i,this.v.o[0][0]=t+s*i,this.v.o[0][1]=e-a,this.v.o[1][0]=t+s,this.v.o[1][1]=e+a*i,this.v.o[2][0]=t-s*i,this.v.o[2][1]=e+a,this.v.o[3][0]=t-s,this.v.o[3][1]=e-a*i):(this.v.v[0][0]=t,this.v.v[0][1]=e-a,this.v.v[1][0]=t-s,this.v.v[1][1]=e,this.v.v[2][0]=t,this.v.v[2][1]=e+a,this.v.v[3][0]=t+s,this.v.v[3][1]=e,this.v.i[0][0]=t+s*i,this.v.i[0][1]=e-a,this.v.i[1][0]=t-s,this.v.i[1][1]=e-a*i,this.v.i[2][0]=t-s*i,this.v.i[2][1]=e+a,this.v.i[3][0]=t+s,this.v.i[3][1]=e+a*i,this.v.o[0][0]=t-s*i,this.v.o[0][1]=e-a,this.v.o[1][0]=t-s,this.v.o[1][1]=e+a*i,this.v.o[2][0]=t+s*i,this.v.o[2][1]=e+a,this.v.o[3][0]=t+s,this.v.o[3][1]=e-a*i)}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertEllToPath()}}var i=Ft;return function(i,a){this.v=Bt.newShape(),this.v.setPathData(!0,4),this.localShapeCollection=Gt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=a.d,this.dynamicProperties=[],this.elem=i,this.comp=i.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=It.getProp(i,a.p,1,0,this.dynamicProperties),this.s=It.getProp(i,a.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),o=function(){function t(){var t,e=Math.floor(this.pt.v),s=2*Math.PI/e,i=this.or.v,a=this.os.v,r=2*Math.PI*i/(4*e),n=-Math.PI/2,h=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;e>t;t+=1){var o=i*Math.cos(n),p=i*Math.sin(n),l=0===o&&0===p?0:p/Math.sqrt(o*o+p*p),f=0===o&&0===p?0:-o/Math.sqrt(o*o+p*p);o+=+this.p.v[0],p+=+this.p.v[1],this.v.setTripleAt(o,p,o-l*r*a*h,p-f*r*a*h,o+l*r*a*h,p+f*r*a*h,t,!0),n+=s*h}this.paths.length=0,this.paths[0]=this.v}function e(){var t,e,s,i,a=2*Math.floor(this.pt.v),r=2*Math.PI/a,n=!0,h=this.or.v,o=this.ir.v,p=this.os.v,l=this.is.v,f=2*Math.PI*h/(2*a),m=2*Math.PI*o/(2*a),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(this.v._length=0,t=0;a>t;t+=1){e=n?h:o,s=n?p:l,i=n?f:m;var u=e*Math.cos(d),g=e*Math.sin(d),v=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),y=0===u&&0===g?0:-u/Math.sqrt(u*u+g*g);u+=+this.p.v[0],g+=+this.p.v[1],this.v.setTripleAt(u,g,u-v*i*s*c,g-y*i*s*c,u+v*i*s*c,g+y*i*s*c,t,!0),n=!n,d+=r*c}}function i(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(a,r){this.v=Bt.newShape(),this.v.setPathData(!0,0),this.elem=a,this.comp=a.comp,this.data=r,this.frameId=-1,this.d=r.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=i,this.reset=s,1===r.sy?(this.ir=It.getProp(a,r.ir,0,0,this.dynamicProperties),this.is=It.getProp(a,r.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=It.getProp(a,r.pt,0,0,this.dynamicProperties),this.p=It.getProp(a,r.p,1,0,this.dynamicProperties),this.r=It.getProp(a,r.r,0,St,this.dynamicProperties),this.or=It.getProp(a,r.or,0,0,this.dynamicProperties),this.os=It.getProp(a,r.os,0,.01,this.dynamicProperties),this.localShapeCollection=Gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),p=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=Mt(s,i,this.r.v),r=a*(1-Ft);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+a,t+s,e-i+r,0,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-r,t+s,e+i-a,1,!0),0!==a?(this.v.setTripleAt(t+s-a,e+i,t+s-a,e+i,t+s-r,e+i,2,!0),this.v.setTripleAt(t-s+a,e+i,t-s+r,e+i,t-s+a,e+i,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-a,t-s,e+i-r,4,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+r,t-s,e-i+a,5,!0),this.v.setTripleAt(t-s+a,e-i,t-s+a,e-i,t-s+r,e-i,6,!0),this.v.setTripleAt(t+s-a,e-i,t+s-r,e-i,t+s-a,e-i,7,!0)):(this.v.setTripleAt(t-s,e+i,t-s+r,e+i,t-s,e+i,2),this.v.setTripleAt(t-s,e-i,t-s,e-i+r,t-s,e-i,3))):(this.v.setTripleAt(t+s,e-i+a,t+s,e-i+r,t+s,e-i+a,0,!0),0!==a?(this.v.setTripleAt(t+s-a,e-i,t+s-a,e-i,t+s-r,e-i,1,!0),this.v.setTripleAt(t-s+a,e-i,t-s+r,e-i,t-s+a,e-i,2,!0),this.v.setTripleAt(t-s,e-i+a,t-s,e-i+a,t-s,e-i+r,3,!0),this.v.setTripleAt(t-s,e+i-a,t-s,e+i-r,t-s,e+i-a,4,!0),this.v.setTripleAt(t-s+a,e+i,t-s+a,e+i,t-s+r,e+i,5,!0),this.v.setTripleAt(t+s-a,e+i,t+s-r,e+i,t+s-a,e+i,6,!0),this.v.setTripleAt(t+s,e+i-a,t+s,e+i-a,t+s,e+i-r,7,!0)):(this.v.setTripleAt(t-s,e-i,t-s+r,e-i,t-s,e-i,1,!0),this.v.setTripleAt(t-s,e+i,t-s,e+i-r,t-s,e+i,2,!0),this.v.setTripleAt(t+s,e+i,t+s-r,e+i,t+s,e+i,3,!0)))}return function(i,a){this.v=Bt.newShape(),this.v.c=!0,this.localShapeCollection=Gt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=i,this.comp=i.comp,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=It.getProp(i,a.p,1,0,this.dynamicProperties),this.s=It.getProp(i,a.s,1,0,this.dynamicProperties),this.r=It.getProp(i,a.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),l={};return l.getShapeProp=r,l}(),Nt=function(){function t(t,e){i[t]||(i[t]=e)}function e(t,e,s,a){return new i[t](e,s,a)}var s={},i={};return s.registerModifier=t,s.getModifier=e,s}();S.prototype.initModifierProperties=function(){},S.prototype.addShapeToModifier=function(){},S.prototype.addShape=function(t){this.closed||(this.shapes.push({shape:t.sh,data:t,localShapeCollection:Gt.newShapeCollection()}),this.addShapeToModifier(t.sh))},S.prototype.init=function(t,e,s){this.elem=t,this.frameId=-1,this.shapes=[],this.dynamicProperties=[],this.mdf=!1,this.closed=!1,this.k=!1,this.isTrimming=!1,this.comp=t.comp,this.initModifierProperties(t,e),this.dynamicProperties.length?(this.k=!0,s.push(this)):this.getValue(!0)},P(S,F),F.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var i=this.o.v%360/360;0>i&&(i+=1);var a=this.s.v+i,r=this.e.v+i;if(a>r){var n=a;a=r,r=n}this.sValue=a,this.eValue=r,this.oValue=i}}},F.prototype.initModifierProperties=function(t,e){this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.s=It.getProp(t,e.s,0,.01,this.dynamicProperties),this.e=It.getProp(t,e.e,0,.01,this.dynamicProperties),this.o=It.getProp(t,e.o,0,0,this.dynamicProperties),this.m=e.m,this.dynamicProperties.length||this.getValue(!0)},F.prototype.getSegmentsLength=function(t){var e,s=t.c,i=t.v,a=t.o,r=t.i,n=t._length,h=[],o=0;for(e=0;n-1>e;e+=1)h[e]=Ct.getBezierLength(i[e],i[e+1],a[e],r[e+1]),o+=h[e].addedLength;return s&&(h[e]=Ct.getBezierLength(i[e],i[0],a[e],r[0]),o+=h[e].addedLength),{lengths:h,totalLength:o}},F.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];1>=e?r.push({s:t,e:e}):t>=1?r.push({s:t-1,e:e-1}):(r.push({s:t,e:1}),r.push({s:0,e:e-1}));var n,h,o=[],p=r.length;for(n=0;p>n;n+=1)if(h=r[n],h.e*a<i||h.s*a>i+s);else{var l,f;l=h.s*a<=i?0:(h.s*a-i)/s,f=h.e*a>=i+s?1:(h.e*a-i)/s,o.push([l,f])}return o.length||o.push([0,0]),o},F.prototype.processShapes=function(t){var e,s,i,a,r,n,h,o=this.shapes.length,p=this.sValue,l=this.eValue,f=0;if(l===p)for(s=0;o>s;s+=1)this.shapes[s].localShapeCollection.releaseShapes(),this.shapes[s].shape.mdf=!0,this.shapes[s].shape.paths=this.shapes[s].localShapeCollection;else if(1===l&&0===p||0===l&&1===p){if(this.mdf)for(s=0;o>s;s+=1)this.shapes[s].shape.mdf=!0}else{var m,d,c=[];for(s=0;o>s;s+=1)if(m=this.shapes[s],m.shape.mdf||this.mdf||t||2===this.m){if(e=m.shape.paths,a=e._length,h=0,!m.shape.mdf&&m.pathsData)h=m.totalShapeLength;else{for(r=[],i=0;a>i;i+=1)n=this.getSegmentsLength(e.shapes[i]),r.push(n),h+=n.totalLength;m.totalShapeLength=h,m.pathsData=r}f+=h,m.shape.mdf=!0}else m.shape.paths=m.localShapeCollection;var i,a,u=p,g=l,v=0;for(s=o-1;s>=0;s-=1)if(m=this.shapes[s],m.shape.mdf){if(d=m.localShapeCollection,d.releaseShapes(),2===this.m&&o>1){var y=this.calculateShapeEdges(p,l,m.totalShapeLength,v,f);v+=m.totalShapeLength}else y=[[u,g]];for(a=y.length,i=0;a>i;i+=1){u=y[i][0],g=y[i][1],c.length=0,1>=g?c.push({s:m.totalShapeLength*u,e:m.totalShapeLength*g}):u>=1?c.push({s:m.totalShapeLength*(u-1),e:m.totalShapeLength*(g-1)}):(c.push({s:m.totalShapeLength*u,e:m.totalShapeLength}),c.push({s:0,e:m.totalShapeLength*(g-1)}));var b=this.addShapes(m,c[0]);if(c[0].s!==c[0].e){if(c.length>1)if(m.shape.v.c){var k=b.pop();this.addPaths(b,d),b=this.addShapes(m,c[1],k);
 
-e.s<=c&&e.e>=c+v?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[0],m[i].v[0],s,h,g),g=!1):(p=Ct.getNewSegment(m[i].v[a-1],m[i].v[0],m[i].o[a-1],m[i].i[0],(e.s-c)/v,(e.e-c)/v,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h,g),g=!1,s.c=!1)}else s.c=!1;c+=n.addedLength,h+=1}if(s._length&&(s.setXYAt(s.v[l][0],s.v[l][1],"i",l),s.setXYAt(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),c>e.e)break;d-1>i&&(s=Bt.newShape(),g=!0,u.push(s),h=0)}return u},Nt.registerModifier("tm",F),A(S,x),x.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},x.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=It.getProp(t,e.r,0,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},x.prototype.processPath=function(t,e){var s=Bt.newShape();s.c=t.c;var i,a,r,n,h,o,p,l,f,m,d,c,u,g=t._length,v=0;for(i=0;g>i;i+=1)a=t.v[i],n=t.o[i],r=t.i[i],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==i&&i!==g-1||t.c?(h=0===i?t.v[g-1]:t.v[i-1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=c=a[0]+(h[0]-a[0])*p,f=u=a[1]-(a[1]-h[1])*p,m=l-(l-a[0])*Ft,d=f-(f-a[1])*Ft,s.setTripleAt(l,f,m,d,c,u,v),v+=1,h=i===g-1?t.v[0]:t.v[i+1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=m=a[0]+(h[0]-a[0])*p,f=d=a[1]+(h[1]-a[1])*p,c=l-(l-a[0])*Ft,u=f-(f-a[1])*Ft,s.setTripleAt(l,f,m,d,c,u,v),v+=1):(s.setTripleAt(a[0],a[1],n[0],n[1],r[0],r[1],v),v+=1):(s.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],v),v+=1);return s},x.prototype.processShapes=function(t){var e,s,i,a,r=this.shapes.length,n=this.rd.v;if(0!==n){var h,o,p;for(s=0;r>s;s+=1){if(h=this.shapes[s],o=h.shape.paths,p=h.localShapeCollection,h.shape.mdf||this.mdf||t)for(p.releaseShapes(),h.shape.mdf=!0,e=h.shape.paths.shapes,a=h.shape.paths._length,i=0;a>i;i+=1)p.addShape(this.processPath(e[i],n));h.shape.paths=h.localShapeCollection}}this.dynamicProperties.length||(this.mdf=!1)},Nt.registerModifier("rd",x),A(S,D),D.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},D.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=It.getProp(t,e.c,0,null,this.dynamicProperties),this.o=It.getProp(t,e.o,0,null,this.dynamicProperties),this.tr=It.getProp(t,e.tr,2,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0),this.pMatrix=new k,this.rMatrix=new k,this.sMatrix=new k,this.tMatrix=new k,this.matrix=new k},D.prototype.applyTransforms=function(t,e,s,i,a,r){var n=r?-1:1,h=i.s.v[0]+(1-i.s.v[0])*(1-a),o=i.s.v[1]+(1-i.s.v[1])*(1-a);t.translate(i.p.v[0]*n*a,i.p.v[1]*n*a,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*a),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),s.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),s.scale(r?1/h:h,r?1/o:o),s.translate(i.a.v[0],i.a.v[1],i.a.v[2])},D.prototype.processShapes=function(t){this.dynamicProperties.length||(this.mdf=!1);var e,s,i,a,r,n,h,o,p,l,f,m,d,c,u=this.shapes.length,g=Math.ceil(this.c.v),v=this.o.v,y=v%1,b=v>0?Math.floor(v):Math.ceil(v),k=(this.tr.v.props,this.pMatrix.props),P=this.rMatrix.props,A=this.sMatrix.props,M=0;for(e=0;u>e;e+=1){if(a=this.shapes[e],r=a.localShapeCollection,a.shape.mdf||this.mdf||t){if(r.releaseShapes(),a.shape.mdf=!0,o=a.shape.paths,p=o.shapes,i=o._length,M=0,this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset(),v>0){for(;b>M;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),M+=1;y&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,y,!1),M+=y)}else if(0>b){for(;M>b;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),M-=1;y&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-y,!0),M-=y)}for(s=0;i>s;s+=1)for(n=p[s],h=0;g>h;h+=1){if(0!==h&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),a.data.transformers){for(a.data.lvl=0,c=0,f=a.data.elements.length,l=0;f>l;l+=1)c=Math.max(c,a.data.elements[l].st.lvl);for(d=a.data.transformers,f=d.length,l=f-1;l>=c;l-=1)m=d[l].mProps.v.props,this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15])}0!==M&&(this.matrix.transform(P[0],P[1],P[2],P[3],P[4],P[5],P[6],P[7],P[8],P[9],P[10],P[11],P[12],P[13],P[14],P[15]),this.matrix.transform(A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],A[9],A[10],A[11],A[12],A[13],A[14],A[15]),this.matrix.transform(k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7],k[8],k[9],k[10],k[11],k[12],k[13],k[14],k[15])),r.addShape(this.processPath(n,this.matrix)),this.matrix.reset(),M+=1}}a.shape.paths=r}},D.prototype.processPath=function(t,e){var s=Bt.clone(t,e);return s},Nt.registerModifier("rp",D),C.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},C.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)Bt.release(this.shapes[t]);this._length=0};var Vt=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages}function e(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=document.createElement("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function i(t){this.totalAssets=t.length;var i;for(i=0;i<this.totalAssets;i+=1)t[i].layers||(s.bind(this)(e.bind(this)(t[i])),this.totalImages+=1)}function a(t){this.path=t||""}function r(t){this.assetsPath=t||""}return function(){this.loadAssets=i,this.setAssetsPath=r,this.setPath=a,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0}}(),zt=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),Rt=function(){function t(t){var e=document.createElementNS(vt,"filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=document.createElementNS(vt,"feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 0 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}(),jt=function(){function t(t){return t.concat(Array.apply(null,{length:t.length}))}return{"double":t}}(),Ot=function(){function t(){var t;return i?(i-=1,t=r[i]):t=[.1,.1],t}function e(t){i===a&&(r=jt["double"](r),a=2*a),r[i]=t,i+=1}var s={newPoint:t,release:e},i=0,a=8,r=Array.apply(null,{length:a});return s}(),Bt=function(){function t(){var t;return r?(r-=1,t=h[r]):t=new w,t}function e(t){r===n&&(h=jt["double"](h),n=2*n);var e,s=t._length;for(e=0;s>e;e+=1)Ot.release(t.v[e]),Ot.release(t.i[e]),Ot.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1,h[r]=t,r+=1}function s(t,s){for(;s--;)e(t[s])}function i(e,s){var i,a=e._length,r=t();r._length=e._length,r.c=e.c;var n;for(i=0;a>i;i+=1)s?(n=s.applyToPointArray(e.v[i][0],e.v[i][1],0,2),r.setXYAt(n[0],n[1],"v",i),Ot.release(n),n=s.applyToPointArray(e.o[i][0],e.o[i][1],0,2),r.setXYAt(n[0],n[1],"o",i),Ot.release(n),n=s.applyToPointArray(e.i[i][0],e.i[i][1],0,2),r.setXYAt(n[0],n[1],"i",i),Ot.release(n)):r.setTripleAt(e.v[i][0],e.v[i][1],e.o[i][0],e.o[i][1],e.i[i][0],e.i[i][1],i);return r}var a={clone:i,newShape:t,release:e,releaseArray:s},r=0,n=4,h=Array.apply(null,{length:n});return a}(),Gt=function(){function t(){var t;return a?(a-=1,t=n[a]):t=new C,t}function e(t){var e,s=t._length;for(e=0;s>e;e+=1)Bt.release(t.shapes[e]);t._length=0,a===r&&(n=jt["double"](n),r=2*r),n[a]=t,a+=1}function s(t,s){e(t),a===r&&(n=jt["double"](n),r=2*r),n[a]=t,a+=1}var i={newShapeCollection:t,release:e,clone:s},a=0,r=4,n=Array.apply(null,{length:r});return i}();_.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this.completeLayers=!0,e=i-1;e>=0;e--)this.elements[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1;this.checkPendingElements()},_.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},_.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},_.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;e>t;t+=1)this.buildItem(t);this.checkPendingElements()},_.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,i=t.length,a=this.layers.length;for(e=0;i>e;e+=1)for(s=0;a>s;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},_.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},_.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},_.prototype.buildElementParenting=function(t,e,s){s=s||[];for(var i=this.elements,a=this.layers,r=0,n=a.length;n>r;)a[r].ind==e&&(i[r]&&i[r]!==!0?void 0!==a[r].parent?(s.push(i[r]),i[r]._isParent=!0,this.buildElementParenting(t,a[r].parent,s)):(s.push(i[r]),i[r]._isParent=!0,t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},_.prototype.addPendingElement=function(t){this.pendingElements.push(t)},A(_,T),T.prototype.createBase=function(t){return new N(t,this.layerElement,this.globalData,this)},T.prototype.createShape=function(t){return new H(t,this.layerElement,this.globalData,this)},T.prototype.createText=function(t){return new z(t,this.layerElement,this.globalData,this)},T.prototype.createImage=function(t){return new W(t,this.layerElement,this.globalData,this)},T.prototype.createComp=function(t){return new Y(t,this.layerElement,this.globalData,this)},T.prototype.createSolid=function(t){return new U(t,this.layerElement,this.globalData,this)},T.prototype.configAnimation=function(t){this.layerElement=document.createElementNS(vt,"svg"),this.layerElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.layerElement.setAttribute("width",t.w),this.layerElement.setAttribute("height",t.h),this.layerElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.layerElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.layerElement.style.width="100%",this.layerElement.style.height="100%",this.animationItem.wrapper.appendChild(this.layerElement);var e=document.createElementNS(vt,"defs");this.globalData.defs=e,this.layerElement.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.frameId=0,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h},this.data=t,this.globalData.frameRate=t.fr;var s=document.createElementNS(vt,"clipPath"),i=document.createElementNS(vt,"rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+m(10);s.setAttribute("id",a),s.appendChild(i);var r=document.createElementNS(vt,"g");r.setAttribute("clip-path","url(#"+a+")"),this.layerElement.appendChild(r),e.appendChild(s),this.layerElement=r,this.layers=t.layers,this.globalData.fontManager=new Tt,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.elements=Array.apply(null,{length:t.layers.length})},T.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},T.prototype.updateContainerSize=function(){},T.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,ut&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&this.elements[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},T.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this.elements.length;s>e;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},T.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},T.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var i,a=0;e>a;)this.elements[a]&&this.elements[a]!==!0&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?this.layerElement.insertBefore(s,i):this.layerElement.appendChild(s)}},T.prototype.hide=function(){this.layerElement.style.display="none"},T.prototype.show=function(){this.layerElement.style.display="block"},T.prototype.searchExtraCompositions=function(t){var e,s=t.length,i=document.createElementNS(vt,"g");for(e=0;s>e;e+=1)if(t[e].xt){var a=this.createComp(t[e],i,this.globalData.comp,null);a.initExpressions(),this.globalData.projectInterface.registerComposition(a)}},I.prototype.getMaskProperty=function(t){return this.viewData[t].prop},I.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},I.prototype.renderFrame=function(t){var e,s=this.masksProperties.length;for(e=0;s>e;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var i=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url(#"+this.storedData[e].filterId+")")),i.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},I.prototype.getMaskelement=function(){return this.maskElement},I.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},I.prototype.drawPath=function(t,e,s){var i,a,r=" M"+e.v[0][0]+","+e.v[0][1];for(a=e._length,i=1;a>i;i+=1)r+=" C"+gt(e.o[i-1][0])+","+gt(e.o[i-1][1])+" "+gt(e.i[i][0])+","+gt(e.i[i][1])+" "+gt(e.v[i][0])+","+gt(e.v[i][1]);e.c&&a>1&&(r+=" C"+gt(e.o[i-1][0])+","+gt(e.o[i-1][1])+" "+gt(e.i[0][0])+","+gt(e.i[0][1])+" "+gt(e.v[0][0])+","+gt(e.v[0][1])),s.lastPath!==r&&(s.elem&&(e.c?t.inv?s.elem.setAttribute("d",this.solidPath+r):s.elem.setAttribute("d",r):s.elem.setAttribute("d","")),s.lastPath=r)},I.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},I.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},L.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},L.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent)},L.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)(this.isVisible||this._isParent&&"transform"===this.dynamicProperties[e].type)&&(this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.elemMdf=!0,this.globalData.mdf=!0));return this.data.hasMask&&this.isVisible&&this.maskManager.prepareFrame(t*this.data.sr),this.currentFrameNum=t*this.data.sr,this.isVisible},L.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,i=this.comp;s;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):s=!1;var a,r,n=e.length;for(a=0;n>a;a+=1)r=e[a].mat.applyToPointArray(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},L.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?this.layerInterface.shapeInterface=ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.layerInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this))},L.prototype.setBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}var e=this.baseElement||this.layerElement;e.style["mix-blend-mode"]=t},L.prototype.init=function(){this.data.sr||(this.data.sr=1),this.dynamicProperties=[],this.data.ef&&(this.effects=new EffectsManager(this.data,this,this.dynamicProperties)),this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this._isParent=!1,this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ks&&(this.finalTransform={mProp:It.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new k,opacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,11!==this.data.ty&&this.createElements(),this.data.hasMask&&this.addMasks(this.data)),this.elemMdf=!1},L.prototype.getType=function(){return this.type},L.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},L.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},L.prototype.setHierarchy=function(t){this.hierarchy=t},L.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},L.prototype.hide=function(){},L.prototype.mHelper=new k,P(L,N),N.prototype.createElements=function(){this.layerElement=document.createElementNS(vt,"g"),this.transformedElement=this.layerElement,this.data.hasMask&&(this.maskedElement=this.layerElement);var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=document.createElementNS(vt,"mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this.layerElement),t=e,this.globalData.defs.appendChild(e),!zt.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=m(10),i=Rt.createFilter(s);this.globalData.defs.appendChild(i),i.appendChild(Rt.createAlphaToLuminanceFilter());var a=document.createElementNS(vt,"g");a.appendChild(this.layerElement),t=a,e.appendChild(a),a.setAttribute("filter","url(#"+s+")")}}else if(2==this.data.td){var r=document.createElementNS(vt,"mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=document.createElementNS(vt,"g");r.appendChild(n);var s=m(10),i=Rt.createFilter(s),h=document.createElementNS(vt,"feColorMatrix");h.setAttribute("type","matrix"),h.setAttribute("color-interpolation-filters","sRGB"),h.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),i.appendChild(h),this.globalData.defs.appendChild(i);var o=document.createElementNS(vt,"rect");if(o.setAttribute("width",this.comp.data.w),o.setAttribute("height",this.comp.data.h),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("fill","#ffffff"),o.setAttribute("opacity","0"),n.setAttribute("filter","url(#"+s+")"),n.appendChild(o),n.appendChild(this.layerElement),t=n,!zt.maskType){r.setAttribute("mask-type","luminance"),i.appendChild(Rt.createAlphaToLuminanceFilter());var a=document.createElementNS(vt,"g");n.appendChild(o),a.appendChild(this.layerElement),t=a,n.appendChild(a)}this.globalData.defs.appendChild(r)}}else(this.data.hasMask||this.data.tt)&&this.data.tt?(this.matteElement=document.createElementNS(vt,"g"),this.matteElement.appendChild(this.layerElement),t=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)),0===this.data.ty){var p=document.createElementNS(vt,"clipPath"),l=document.createElementNS(vt,"path");l.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var f="cp_"+m(8);if(p.setAttribute("id",f),p.appendChild(l),this.globalData.defs.appendChild(p),this.checkMasks()){var d=document.createElementNS(vt,"g");d.setAttribute("clip-path","url(#"+f+")"),d.appendChild(this.layerElement),this.transformedElement=d,t?t.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url(#"+f+")")}0!==this.data.bm&&this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.ef&&(this.effectsManager=new q(this)),this.checkParenting()},N.prototype.setBlendMode=L.prototype.setBlendMode,N.prototype.renderFrame=function(t){if(3===this.data.ty||this.data.hd||!this.isVisible)return!1;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.firstFrame||this.finalTransform.op.mdf,this.finalTransform.matMdf=this.firstFrame||this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var i=0,a=this.hierarchy.length;if(!this.finalTransform.matMdf)for(;a>i;){if(this.hierarchy[i].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}i+=1}if(this.finalTransform.matMdf)for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)e=this.hierarchy[i].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&(s=this.finalTransform.mProp.v);return this.finalTransform.matMdf&&this.layerElement&&this.transformedElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement&&this.transformedElement.setAttribute("opacity",this.finalTransform.op.v),this.data.hasMask&&this.maskManager.renderFrame(s),this.effectsManager&&this.effectsManager.renderFrame(this.firstFrame),this.isVisible},N.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},N.prototype.getBaseElement=function(){return this.baseElement},N.prototype.addMasks=function(t){this.maskManager=new I(t,this,this.globalData)},N.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},N.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},N.prototype.hide=function(){},V.prototype.init=function(){this._parent.init.call(this),this.lettersChangedFlag=!1,this.currentTextDocumentData={};var t=this.data;this.viewData={m:{a:It.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,i,a,r=e.a.length;for(s=0;r>s;s+=1)a=e.a[s],i={a:{},s:{}},"r"in a.a&&(i.a.r=It.getProp(this,a.a.r,0,St,this.dynamicProperties)),"rx"in a.a&&(i.a.rx=It.getProp(this,a.a.rx,0,St,this.dynamicProperties)),"ry"in a.a&&(i.a.ry=It.getProp(this,a.a.ry,0,St,this.dynamicProperties)),"sk"in a.a&&(i.a.sk=It.getProp(this,a.a.sk,0,St,this.dynamicProperties)),"sa"in a.a&&(i.a.sa=It.getProp(this,a.a.sa,0,St,this.dynamicProperties)),"s"in a.a&&(i.a.s=It.getProp(this,a.a.s,1,.01,this.dynamicProperties)),"a"in a.a&&(i.a.a=It.getProp(this,a.a.a,1,0,this.dynamicProperties)),"o"in a.a&&(i.a.o=It.getProp(this,a.a.o,0,.01,this.dynamicProperties)),"p"in a.a&&(i.a.p=It.getProp(this,a.a.p,1,0,this.dynamicProperties)),"sw"in a.a&&(i.a.sw=It.getProp(this,a.a.sw,0,0,this.dynamicProperties)),"sc"in a.a&&(i.a.sc=It.getProp(this,a.a.sc,1,0,this.dynamicProperties)),"fc"in a.a&&(i.a.fc=It.getProp(this,a.a.fc,1,0,this.dynamicProperties)),"fh"in a.a&&(i.a.fh=It.getProp(this,a.a.fh,0,0,this.dynamicProperties)),"fs"in a.a&&(i.a.fs=It.getProp(this,a.a.fs,0,.01,this.dynamicProperties)),"fb"in a.a&&(i.a.fb=It.getProp(this,a.a.fb,0,.01,this.dynamicProperties)),"t"in a.a&&(i.a.t=It.getProp(this,a.a.t,0,0,this.dynamicProperties)),i.s=It.getTextSelectorProp(this,a.s,this.dynamicProperties),i.s.t=a.s.t,this.viewData.a[s]=i}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:It.getProp(this,e.p.f,0,0,this.dynamicProperties),l:It.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},V.prototype.prepareFrame=function(t){var e=0,s=this.data.t.d.k.length,i=this.data.t.d.k[e].s;for(e+=1;s>e&&!(this.data.t.d.k[e].t>t);)i=this.data.t.d.k[e].s,e+=1;this.lettersChangedFlag=!1,i!==this.currentTextDocumentData&&(this.currentTextDocumentData=i,this.lettersChangedFlag=!0,this.buildNewText()),this._parent.prepareFrame.call(this,t)},V.prototype.createPathShape=function(t,e){var s,i,a,r,n=e.length,h="";for(s=0;n>s;s+=1){for(a=e[s].ks.k.i.length,r=e[s].ks.k,i=1;a>i;i+=1)1==i&&(h+=" M"+t.applyToPointStringified(r.v[0][0],r.v[0][1])),h+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[i][0],r.i[i][1])+" "+t.applyToPointStringified(r.v[i][0],r.v[i][1]);h+=" C"+t.applyToPointStringified(r.o[i-1][0],r.o[i-1][1])+" "+t.applyToPointStringified(r.i[0][0],r.i[0][1])+" "+t.applyToPointStringified(r.v[0][0],r.v[0][1]),h+="z"}return h},V.prototype.getMeasures=function(){var t,e,s,i,a=this.mHelper,r=this.renderType,n=this.data,h=this.currentTextDocumentData,o=h.l;if(this.maskPath){var p=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var l=p.v;this.viewData.p.r&&(l=b(l));var f={tLength:0,segments:[]};i=l.v.length-1;var m,d=0;for(s=0;i>s;s+=1)m={s:l.v[s],e:l.v[s+1],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[s+1][0]-l.v[s+1][0],l.i[s+1][1]-l.v[s+1][1]]},Ct.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength;s=i,p.v.c&&(m={s:l.v[s],e:l.v[0],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[0][0]-l.v[0][0],l.i[0][1]-l.v[0][1]]},Ct.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength),this.viewData.p.pi=f}var c,k,P,f=this.viewData.p.pi,A=this.viewData.p.f.v,M=0,E=1,w=0,S=!0,F=f.segments;if(0>A&&p.v.c)for(f.tLength<Math.abs(A)&&(A=-Math.abs(A)%f.tLength),M=F.length-1,P=F[M].bezierData.points,E=P.length-1;0>A;)A+=P[E].partialLength,E-=1,0>E&&(M-=1,P=F[M].bezierData.points,E=P.length-1);P=F[M].bezierData.points,k=P[E-1],c=P[E];var x,D,C=c.partialLength}i=o.length,t=0,e=0;var _,T,I,L,N,V=1.2*h.s*.714,z=!0,R=this.viewData,j=Array.apply(null,{length:i});L=R.a.length;var O,B,G,X,q,Y,W,H,U,Z,J,K,Q,$,tt,et,st=-1,it=A,at=M,rt=E,nt=-1,ht=0;for(s=0;i>s;s+=1)if(a.reset(),Y=1,o[s].n)t=0,e+=h.yOffset,e+=z?1:0,A=it,z=!1,ht=0,this.maskPath&&(M=at,E=rt,P=F[M].bezierData.points,k=P[E-1],c=P[E],C=c.partialLength,w=0),j[s]=this.emptyProp;else{if(this.maskPath){if(nt!==o[s].line){switch(h.j){case 1:A+=d-h.lineWidths[o[s].line];break;case 2:A+=(d-h.lineWidths[o[s].line])/2}nt=o[s].line}st!==o[s].ind&&(o[st]&&(A+=o[st].extra),A+=o[s].an/2,st=o[s].ind),A+=R.m.a.v[0]*o[s].an/200;var ot=0;for(I=0;L>I;I+=1)_=R.a[I].a,"p"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),ot+=B.length?_.p.v[0]*B[0]:_.p.v[0]*B),"a"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),ot+=B.length?_.a.v[0]*B[0]:_.a.v[0]*B);for(S=!0;S;)w+C>=A+ot||!P?(x=(A+ot-w)/c.partialLength,X=k.point[0]+(c.point[0]-k.point[0])*x,q=k.point[1]+(c.point[1]-k.point[1])*x,a.translate(-R.m.a.v[0]*o[s].an/200,-(R.m.a.v[1]*V/100)),S=!1):P&&(w+=c.partialLength,E+=1,E>=P.length&&(E=0,M+=1,F[M]?P=F[M].bezierData.points:p.v.c?(E=0,M=0,P=F[M].bezierData.points):(w-=c.partialLength,P=null)),P&&(k=c,c=P[E],C=c.partialLength));G=o[s].an/2-o[s].add,a.translate(-G,0,0)}else G=o[s].an/2-o[s].add,a.translate(-G,0,0),a.translate(-R.m.a.v[0]*o[s].an/200,-R.m.a.v[1]*V/100,0);for(ht+=o[s].l/2,I=0;L>I;I+=1)_=R.a[I].a,"t"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),this.maskPath?A+=B.length?_.t*B[0]:_.t*B:t+=B.length?_.t.v*B[0]:_.t.v*B);for(ht+=o[s].l/2,h.strokeWidthAnim&&(H=h.sw||0),h.strokeColorAnim&&(W=h.sc?[h.sc[0],h.sc[1],h.sc[2]]:[0,0,0]),h.fillColorAnim&&(U=[h.fc[0],h.fc[1],h.fc[2]]),I=0;L>I;I+=1)_=R.a[I].a,"a"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),B.length?a.translate(-_.a.v[0]*B[0],-_.a.v[1]*B[1],_.a.v[2]*B[2]):a.translate(-_.a.v[0]*B,-_.a.v[1]*B,_.a.v[2]*B));for(I=0;L>I;I+=1)_=R.a[I].a,"s"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),B.length?a.scale(1+(_.s.v[0]-1)*B[0],1+(_.s.v[1]-1)*B[1],1):a.scale(1+(_.s.v[0]-1)*B,1+(_.s.v[1]-1)*B,1));for(I=0;L>I;I+=1){if(_=R.a[I].a,T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),"sk"in _&&(B.length?a.skewFromAxis(-_.sk.v*B[0],_.sa.v*B[1]):a.skewFromAxis(-_.sk.v*B,_.sa.v*B)),"r"in _&&a.rotateZ(B.length?-_.r.v*B[2]:-_.r.v*B),"ry"in _&&a.rotateY(B.length?_.ry.v*B[1]:_.ry.v*B),"rx"in _&&a.rotateX(B.length?_.rx.v*B[0]:_.rx.v*B),
-"o"in _&&(Y+=B.length?(_.o.v*B[0]-Y)*B[0]:(_.o.v*B-Y)*B),h.strokeWidthAnim&&"sw"in _&&(H+=B.length?_.sw.v*B[0]:_.sw.v*B),h.strokeColorAnim&&"sc"in _)for(Z=0;3>Z;Z+=1)W[Z]=Math.round(B.length?255*(W[Z]+(_.sc.v[Z]-W[Z])*B[0]):255*(W[Z]+(_.sc.v[Z]-W[Z])*B));if(h.fillColorAnim){if("fc"in _)for(Z=0;3>Z;Z+=1)U[Z]=B.length?U[Z]+(_.fc.v[Z]-U[Z])*B[0]:U[Z]+(_.fc.v[Z]-U[Z])*B;"fh"in _&&(U=B.length?v(U,_.fh.v*B[0]):v(U,_.fh.v*B)),"fs"in _&&(U=B.length?u(U,_.fs.v*B[0]):u(U,_.fs.v*B)),"fb"in _&&(U=B.length?g(U,_.fb.v*B[0]):g(U,_.fb.v*B))}}for(I=0;L>I;I+=1)_=R.a[I].a,"p"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),this.maskPath?B.length?a.translate(0,_.p.v[1]*B[0],-_.p.v[2]*B[1]):a.translate(0,_.p.v[1]*B,-_.p.v[2]*B):B.length?a.translate(_.p.v[0]*B[0],_.p.v[1]*B[1],-_.p.v[2]*B[2]):a.translate(_.p.v[0]*B,_.p.v[1]*B,-_.p.v[2]*B));if(h.strokeWidthAnim&&(J=0>H?0:H),h.strokeColorAnim&&(K="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),h.fillColorAnim&&(Q="rgb("+Math.round(255*U[0])+","+Math.round(255*U[1])+","+Math.round(255*U[2])+")"),this.maskPath){if(a.translate(0,-h.ls),a.translate(0,R.m.a.v[1]*V/100+e,0),n.t.p.p){D=(c.point[1]-k.point[1])/(c.point[0]-k.point[0]);var pt=180*Math.atan(D)/Math.PI;c.point[0]<k.point[0]&&(pt+=180),a.rotate(-pt*Math.PI/180)}a.translate(X,q,0),A-=R.m.a.v[0]*o[s].an/200,o[s+1]&&st!==o[s+1].ind&&(A+=o[s].an/2,A+=h.tr/1e3*h.s)}else{switch(a.translate(t,e,0),h.ps&&a.translate(h.ps[0],h.ps[1]+h.ascent,0),h.j){case 1:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line]),0,0);break;case 2:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line])/2,0,0)}a.translate(0,-h.ls),a.translate(G,0,0),a.translate(R.m.a.v[0]*o[s].an/200,R.m.a.v[1]*V/100,0),t+=o[s].l+h.tr/1e3*h.s}"html"===r?$=a.toCSS():"svg"===r?$=a.to2dCSS():tt=[a.props[0],a.props[1],a.props[2],a.props[3],a.props[4],a.props[5],a.props[6],a.props[7],a.props[8],a.props[9],a.props[10],a.props[11],a.props[12],a.props[13],a.props[14],a.props[15]],et=Y,O=this.renderedLetters[s],!O||O.o===et&&O.sw===J&&O.sc===K&&O.fc===Q?"svg"!==r&&"html"!==r||O&&O.m===$?"canvas"!==r||O&&O.props[0]===tt[0]&&O.props[1]===tt[1]&&O.props[4]===tt[4]&&O.props[5]===tt[5]&&O.props[12]===tt[12]&&O.props[13]===tt[13]?N=O:(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,null,tt)):(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,$)):(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,$,tt)),this.renderedLetters[s]=N}},V.prototype.emptyProp=new y,P(N,z),z.prototype.init=V.prototype.init,z.prototype.createPathShape=V.prototype.createPathShape,z.prototype.getMeasures=V.prototype.getMeasures,z.prototype.prepareFrame=V.prototype.prepareFrame,z.prototype.createElements=function(){this._parent.createElements.call(this),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},z.prototype.buildNewText=function(){var t,e,s=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),s.fc?this.layerElement.setAttribute("fill","rgb("+Math.round(255*s.fc[0])+","+Math.round(255*s.fc[1])+","+Math.round(255*s.fc[2])+")"):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this.layerElement.setAttribute("stroke","rgb("+Math.round(255*s.sc[0])+","+Math.round(255*s.sc[1])+","+Math.round(255*s.sc[2])+")"),this.layerElement.setAttribute("stroke-width",s.sw)),this.layerElement.setAttribute("font-size",s.s);var i=this.globalData.fontManager.getFontByName(s.f);if(i.fClass)this.layerElement.setAttribute("class",i.fClass);else{this.layerElement.setAttribute("font-family",i.fFamily);var a=s.fWeight,r=s.fStyle;this.layerElement.setAttribute("font-style",r),this.layerElement.setAttribute("font-weight",a)}var n=s.l||[];if(e=n.length){var h,o,p=this.mHelper,l="",f=this.data.singleShape;if(f)var m=0,d=0,c=s.lineWidths,u=s.boxWidth,g=!0;var v=0;for(t=0;e>t;t+=1){if(this.globalData.fontManager.chars?f&&0!==t||(h=this.textSpans[v]?this.textSpans[v]:document.createElementNS(vt,"path")):h=this.textSpans[v]?this.textSpans[v]:document.createElementNS(vt,"text"),h.style.display="inherit",h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4"),f&&n[t].n&&(m=0,d+=s.yOffset,d+=g?1:0,g=!1),p.reset(),this.globalData.fontManager.chars&&p.scale(s.s/100,s.s/100),f){switch(s.ps&&p.translate(s.ps[0],s.ps[1]+s.ascent,0),p.translate(0,-s.ls,0),s.j){case 1:p.translate(s.justifyOffset+(u-c[n[t].line]),0,0);break;case 2:p.translate(s.justifyOffset+(u-c[n[t].line])/2,0,0)}p.translate(m,d,0)}if(this.globalData.fontManager.chars){var y,b=this.globalData.fontManager.getCharData(s.t.charAt(t),i.fStyle,this.globalData.fontManager.getFontByName(s.f).fFamily);y=b?b.data:null,y&&y.shapes&&(o=y.shapes[0].it,f||(l=""),l+=this.createPathShape(p,o),f||h.setAttribute("d",l)),f||this.layerElement.appendChild(h)}else h.textContent=n[t].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.layerElement.appendChild(h),f&&h.setAttribute("transform",p.to2dCSS());f&&(m+=n[t].l,m+=s.tr/1e3*s.s),this.textSpans[v]=h,v+=1}if(!f)for(;v<this.textSpans.length;)this.textSpans[v].style.display="none",v+=1;f&&this.globalData.fontManager.chars&&(h.setAttribute("d",l),this.layerElement.appendChild(h))}},z.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},z.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,i,a=this.renderedLetters,r=this.currentTextDocumentData.l;i=r.length;var n;for(s=0;i>s;s+=1)r[s].n||(n=a[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},z.prototype.destroy=function(){this._parent.destroy.call(this._parent)},R.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},j.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,s=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},O.prototype.initialize=function(){var t,e,s,i,a=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(i=this.elem.maskManager.masksProperties.length,s=0):(s=this.filterManager.effectElements[0].p.v-1,i=s+1),e=document.createElementNS(vt,"g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;i>s;s+=1)t=document.createElementNS(vt,"path"),e.appendChild(t),this.paths.push({p:t,m:s});if(3===this.filterManager.effectElements[10].p.v){var r=document.createElementNS(vt,"mask"),n="stms_"+m(10);r.setAttribute("id",n),r.setAttribute("mask-type","alpha"),r.appendChild(e),this.elem.globalData.defs.appendChild(r);var h=document.createElementNS(vt,"g");h.setAttribute("mask","url(#"+n+")"),a[0]&&h.appendChild(a[0]),this.elem.layerElement.appendChild(h),this.masker=r,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var a=this.elem.layerElement.children||this.elem.layerElement.childNodes;a.length;)this.elem.layerElement.removeChild(a[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},O.prototype.renderFrame=function(t){this.initialized||this.initialize();var e,s,i,a=this.paths.length;for(e=0;a>e;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],i=this.paths[e].p,(t||this.filterManager.mdf||s.prop.mdf)&&i.setAttribute("d",s.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||s.prop.mdf){var r;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=i.getTotalLength();r="0 0 0 "+o*n+" ";var p,l=o*(h-n),f=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,m=Math.floor(l/f);for(p=0;m>p;p+=1)r+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";r+="0 "+10*o+" 0 0"}else r="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;i.setAttribute("stroke-dasharray",r)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var d=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+At(255*d[0])+","+At(255*d[1])+","+At(255*d[2])+")")}},B.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v,a=i[0]+" "+s[0]+" "+e[0],r=i[1]+" "+s[1]+" "+e[1],n=i[2]+" "+s[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",a),this.feFuncG.setAttribute("tableValues",r),this.feFuncB.setAttribute("tableValues",n)}},G.prototype.createFeFunc=function(t,e){var s=document.createElementNS(vt,t);return s.setAttribute("type","table"),e.appendChild(s),s},G.prototype.getTableValue=function(t,e,s,i,a){for(var r,n,h=0,o=256,p=Math.min(t,e),l=Math.max(t,e),f=Array.call(null,{length:o}),m=0,d=a-i,c=e-t;256>=h;)r=h/256,n=p>=r?0>c?a:i:r>=l?0>c?i:a:i+d*Math.pow((r-t)/c,1/s),f[m++]=n,h+=256/(o-1);return f.join(" ")},G.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e,s=this.filterManager.effectElements;this.feFuncRComposed&&(t||s[2].p.mdf||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf)&&(e=this.getTableValue(s[2].p.v,s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[9].p.mdf||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf)&&(e=this.getTableValue(s[9].p.v,s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[16].p.mdf||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf)&&(e=this.getTableValue(s[16].p.v,s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[23].p.mdf||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf)&&(e=this.getTableValue(s[23].p.v,s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[30].p.mdf||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf)&&(e=this.getTableValue(s[30].p.v,s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v),this.feFuncA.setAttribute("tableValues",e))}},X.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){if((t||this.filterManager.effectElements[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p.mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",xt(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p.mdf||this.filterManager.effectElements[3].p.mdf){var s=this.filterManager.effectElements[3].p.v,i=(this.filterManager.effectElements[2].p.v-90)*St,a=s*Math.cos(i),r=s*Math.sin(i);this.feOffset.setAttribute("dx",a),this.feOffset.setAttribute("dy",r)}}},q.prototype.renderFrame=function(t){var e,s=this.filters.length;for(e=0;s>e;e+=1)this.filters[e].renderFrame(t)},P(N,Y),Y.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].hide();this.hidden=!0}},Y.prototype.prepareFrame=function(t){if(this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){if(this.tm){var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}else this.renderedFrame=t/this.data.sr;var s,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=0;i>s;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st)}},Y.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),i=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;i>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},Y.prototype.setElements=function(t){this.elements=t},Y.prototype.getElements=function(){return this.elements},Y.prototype.destroy=function(){this._parent.destroy.call(this._parent);var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].destroy()},Y.prototype.checkLayers=T.prototype.checkLayers,Y.prototype.buildItem=T.prototype.buildItem,Y.prototype.buildAllItems=T.prototype.buildAllItems,Y.prototype.buildElementParenting=T.prototype.buildElementParenting,Y.prototype.createItem=T.prototype.createItem,Y.prototype.createImage=T.prototype.createImage,Y.prototype.createComp=T.prototype.createComp,Y.prototype.createSolid=T.prototype.createSolid,Y.prototype.createShape=T.prototype.createShape,Y.prototype.createText=T.prototype.createText,Y.prototype.createBase=T.prototype.createBase,Y.prototype.appendElementInPos=T.prototype.appendElementInPos,Y.prototype.checkPendingElements=T.prototype.checkPendingElements,Y.prototype.addPendingElement=T.prototype.addPendingElement,P(N,W),W.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData);this._parent.createElements.call(this),this.innerElem=document.createElementNS(vt,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio","xMidYMid slice"),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.maskedElement=this.innerElem,this.layerElement.appendChild(this.innerElem),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},W.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},W.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),void(this.firstFrame&&(this.firstFrame=!1)))},W.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.innerElem=null},P(N,H),H.prototype.lcEnum={1:"butt",2:"round",3:"butt"},H.prototype.ljEnum={1:"miter",2:"round",3:"butt"},H.prototype.buildExpressionInterface=function(){},H.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),(!this.data.hd||this.data.td)&&i(this.layerElement)},H.prototype.setGradientData=function(t,e,s){var i,a="gr_"+m(10);i=1===e.t?document.createElementNS(vt,"linearGradient"):document.createElementNS(vt,"radialGradient"),i.setAttribute("id",a),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse");var r,n,h,o=[];for(h=4*e.g.p,n=0;h>n;n+=4)r=document.createElementNS(vt,"stop"),i.appendChild(r),o.push(r);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+a+")"),this.globalData.defs.appendChild(i),s.gf=i,s.cst=o},H.prototype.setGradientOpacity=function(t,e,s){if(t.g.k.k[0].s&&t.g.k.k[0].s.length>4*t.g.p||t.g.k.k.length>4*t.g.p){var i,a,r,n,h=document.createElementNS(vt,"mask"),o=document.createElementNS(vt,"path");h.appendChild(o);var p="op_"+m(10),l="mk_"+m(10);h.setAttribute("id",l),i=1===t.t?document.createElementNS(vt,"linearGradient"):document.createElementNS(vt,"radialGradient"),i.setAttribute("id",p),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse"),n=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=[];for(r=4*t.g.p;n>r;r+=2)a=document.createElementNS(vt,"stop"),a.setAttribute("stop-color","rgb(255,255,255)"),i.appendChild(a),f.push(a);return o.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+p+")"),this.globalData.defs.appendChild(i),this.globalData.defs.appendChild(h),e.of=i,e.ost=f,s.msElem=o,l}},H.prototype.searchShapes=function(t,e,s,i,a,r){r=r||[];var n,h,o,p,l,f=[].concat(r),m=t.length-1,d=[],c=[];for(n=m;n>=0;n-=1)if("fl"==t[n].ty||"st"==t[n].ty||"gf"==t[n].ty||"gs"==t[n].ty){e[n]={},p={type:t[n].ty,d:"",ld:"",lvl:a,mdf:!1};var u=document.createElementNS(vt,"path");if(e[n].o=It.getProp(this,t[n].o,0,.01,i),("st"==t[n].ty||"gs"==t[n].ty)&&(u.setAttribute("stroke-linecap",this.lcEnum[t[n].lc]||"round"),u.setAttribute("stroke-linejoin",this.ljEnum[t[n].lj]||"round"),u.setAttribute("fill-opacity","0"),1==t[n].lj&&u.setAttribute("stroke-miterlimit",t[n].ml),e[n].w=It.getProp(this,t[n].w,0,null,i),t[n].d)){var g=It.getDashProp(this,t[n].d,"svg",i);g.k||(u.setAttribute("stroke-dasharray",g.dasharray),u.setAttribute("stroke-dashoffset",g.dashoffset)),e[n].d=g}if("fl"==t[n].ty||"st"==t[n].ty)e[n].c=It.getProp(this,t[n].c,1,255,i),s.appendChild(u);else{e[n].g=It.getGradientProp(this,t[n].g,i),2==t[n].t&&(e[n].h=It.getProp(this,t[n].h,1,.01,i),e[n].a=It.getProp(this,t[n].a,1,St,i)),e[n].s=It.getProp(this,t[n].s,1,null,i),e[n].e=It.getProp(this,t[n].e,1,null,i),this.setGradientData(u,t[n],e[n],p);var v=this.setGradientOpacity(t[n],e[n],p);v&&u.setAttribute("mask","url(#"+v+")"),e[n].elem=u,s.appendChild(u)}2===t[n].r&&u.setAttribute("fill-rule","evenodd"),t[n].ln&&u.setAttribute("id",t[n].ln),t[n].cl&&u.setAttribute("class",t[n].cl),p.pElem=u,this.stylesList.push(p),e[n].style=p,d.push(p)}else if("gr"==t[n].ty){e[n]={it:[]};var y=document.createElementNS(vt,"g");s.appendChild(y),e[n].gr=y,this.searchShapes(t[n].it,e[n].it,y,i,a+1,f)}else if("tr"==t[n].ty)e[n]={transform:{op:It.getProp(this,t[n].o,0,.01,i),mProps:It.getProp(this,t[n],2,null,i)},elements:[]},l=e[n].transform,f.push(l);else if("sh"==t[n].ty||"rc"==t[n].ty||"el"==t[n].ty||"sr"==t[n].ty){e[n]={elements:[],caches:[],styles:[],transformers:f,lStr:""};var b=4;for("rc"==t[n].ty?b=5:"el"==t[n].ty?b=6:"sr"==t[n].ty&&(b=7),e[n].sh=Lt.getShapeProp(this,t[n],b,i),e[n].lvl=a,this.shapes.push(e[n].sh),this.addShapeToModifiers(e[n]),o=this.stylesList.length,h=0;o>h;h+=1)this.stylesList[h].closed||e[n].elements.push({ty:this.stylesList[h].type,st:this.stylesList[h]})}else if("tm"==t[n].ty||"rd"==t[n].ty||"ms"==t[n].ty||"rp"==t[n].ty){var k=Nt.getModifier(t[n].ty);k.init(this,t[n],i),this.shapeModifiers.push(k),c.push(k),e[n]=k}for(m=d.length,n=0;m>n;n+=1)d[n].closed=!0;for(m=c.length,n=0;m>n;n+=1)c[n].closed=!0},H.prototype.addShapeToModifiers=function(t){var e,s=this.shapeModifiers.length;for(e=0;s>e;e+=1)this.shapeModifiers[e].addShape(t)},H.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;e>t;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},H.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.globalToLocal([0,0,0]),this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),void this.renderShape(null,null,!0,null))},H.prototype.hide=function(){if(!this.hidden){this.layerElement.style.display="none";var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pElem.style.display="none",this.stylesList[t].pElem.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pElem.parentNode));this.hidden=!0}},H.prototype.renderShape=function(t,e,s,i){var a,r;if(!t)for(t=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;e||(e=this.viewData),r=t.length-1;var n;for(a=r;a>=0;a-=1)n=t[a].ty,"tr"==n?((this.firstFrame||e[a].transform.op.mdf&&i)&&i.setAttribute("opacity",e[a].transform.op.v),(this.firstFrame||e[a].transform.mProps.mdf&&i)&&i.setAttribute("transform",e[a].transform.mProps.v.to2dCSS())):"sh"==n||"el"==n||"rc"==n||"sr"==n?this.renderPath(t[a],e[a]):"fl"==n?this.renderFill(t[a],e[a]):"gf"==n?this.renderGradient(t[a],e[a]):"gs"==n?(this.renderGradient(t[a],e[a]),this.renderStroke(t[a],e[a])):"st"==n?this.renderStroke(t[a],e[a]):"gr"==n&&this.renderShape(t[a].it,e[a].it,!1,e[a].gr);if(s){for(r=this.stylesList.length,a=0;r>a;a+=1)"0"===this.stylesList[a].ld&&(this.stylesList[a].ld="1",this.stylesList[a].pElem.style.display="block"),(this.stylesList[a].mdf||this.firstFrame)&&(this.stylesList[a].pElem.setAttribute("d",this.stylesList[a].d),this.stylesList[a].msElem&&this.stylesList[a].msElem.setAttribute("d",this.stylesList[a].d));this.firstFrame&&(this.firstFrame=!1)}},H.prototype.renderPath=function(t,e){var s,i,a,r,n,h,o,p,l=e.elements.length,f=e.lvl;for(p=0;l>p;p+=1){h=e.sh.mdf||this.firstFrame,n="M0 0";var m=e.sh.paths;if(r=m._length,e.elements[p].st.lvl<f){for(var d,c=this.mHelper.reset(),u=f-e.elements[p].st.lvl,g=e.transformers.length-1;u>0;)h=e.transformers[g].mProps.mdf||h,d=e.transformers[g].mProps.v.props,c.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),u--,g--;if(h){for(a=0;r>a;a+=1)if(o=m.shapes[a],o&&o._length){for(s=o._length,i=1;s>i;i+=1)1==i&&(n+=" M"+c.applyToPointStringified(o.v[0][0],o.v[0][1])),n+=" C"+c.applyToPointStringified(o.o[i-1][0],o.o[i-1][1])+" "+c.applyToPointStringified(o.i[i][0],o.i[i][1])+" "+c.applyToPointStringified(o.v[i][0],o.v[i][1]);1==s&&(n+=" M"+c.applyToPointStringified(o.v[0][0],o.v[0][1])),o.c&&(n+=" C"+c.applyToPointStringified(o.o[i-1][0],o.o[i-1][1])+" "+c.applyToPointStringified(o.i[0][0],o.i[0][1])+" "+c.applyToPointStringified(o.v[0][0],o.v[0][1]),n+="z")}e.caches[p]=n}else n=e.caches[p]}else if(h){for(a=0;r>a;a+=1)if(o=m.shapes[a],o&&o._length){for(s=o._length,i=1;s>i;i+=1)1==i&&(n+=" M"+o.v[0].join(",")),n+=" C"+o.o[i-1].join(",")+" "+o.i[i].join(",")+" "+o.v[i].join(",");1==s&&(n+=" M"+o.v[0].join(",")),o.c&&s&&(n+=" C"+o.o[i-1].join(",")+" "+o.i[0].join(",")+" "+o.v[0].join(","),n+="z")}e.caches[p]=n}else n=e.caches[p];e.elements[p].st.d+=n,e.elements[p].st.mdf=h||e.elements[p].st.mdf}},H.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("fill","rgb("+At(e.c.v[0])+","+At(e.c.v[1])+","+At(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("fill-opacity",e.o.v)},H.prototype.renderGradient=function(t,e){var s=e.gf,i=e.of,a=e.s.v,r=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.elem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var h=1===t.t?"x1":"cx",o="x1"===h?"y1":"cy";s.setAttribute(h,a[0]),s.setAttribute(o,a[1]),i&&(i.setAttribute(h,a[0]),i.setAttribute(o,a[1]))}var p,l,f,m;if(e.g.cmdf||this.firstFrame){p=e.cst;var d=e.g.c;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",d[4*l]+"%"),m.setAttribute("stop-color","rgb("+d[4*l+1]+","+d[4*l+2]+","+d[4*l+3]+")")}if(i&&(e.g.omdf||this.firstFrame)){p=e.ost;var c=e.g.o;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",c[2*l]+"%"),m.setAttribute("stop-opacity",c[2*l+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(s.setAttribute("x2",r[0]),s.setAttribute("y2",r[1]),i&&(i.setAttribute("x2",r[0]),i.setAttribute("y2",r[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)),s.setAttribute("r",u),i&&i.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)));var g=Math.atan2(r[1]-a[1],r[0]-a[0]),v=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,y=u*v,b=Math.cos(g+e.a.v)*y+a[0],k=Math.sin(g+e.a.v)*y+a[1];s.setAttribute("fx",b),s.setAttribute("fy",k),i&&(i.setAttribute("fx",b),i.setAttribute("fy",k))}}},H.prototype.renderStroke=function(t,e){var s=e.style,i=e.d;i&&i.k&&(i.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-dasharray",i.dasharray),s.pElem.setAttribute("stroke-dashoffset",i.dashoffset)),e.c&&(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke","rgb("+At(e.c.v[0])+","+At(e.c.v[1])+","+At(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},H.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},P(N,U),U.prototype.createElements=function(){this._parent.createElements.call(this);var t=document.createElementNS(vt,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t),this.innerElem=t,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},U.prototype.hide=W.prototype.hide,U.prototype.renderFrame=W.prototype.renderFrame,U.prototype.destroy=W.prototype.destroy;var Xt=function(){function t(t){for(var e=0,s=t.target;E>e;)A[e].animation===s&&(A.splice(e,1),e-=1,E-=1,s.isPaused||i()),e+=1}function e(t,e){if(!t)return null;for(var s=0;E>s;){if(A[s].elem==t&&null!==A[s].elem)return A[s].animation;s+=1}var i=new qt;return a(i,t),i.setData(t,e),i}function s(){S+=1,k()}function i(){S-=1,0===S&&(w=!0)}function a(e,a){e.addEventListener("destroy",t),e.addEventListener("_active",s),e.addEventListener("_idle",i),A.push({elem:a,animation:e}),E+=1}function r(t){var e=new qt;return a(e,null),e.setParams(t),e}function n(t,e){var s;for(s=0;E>s;s+=1)A[s].animation.setSpeed(t,e)}function h(t,e){var s;for(s=0;E>s;s+=1)A[s].animation.setDirection(t,e)}function o(t){var e;for(e=0;E>e;e+=1)A[e].animation.play(t)}function p(t,e){M=Date.now();var s;for(s=0;E>s;s+=1)A[s].animation.moveFrame(t,e)}function l(t){var e,s=t-M;for(e=0;E>e;e+=1)A[e].animation.advanceTime(s);M=t,w||requestAnimationFrame(l)}function f(t){M=t,requestAnimationFrame(l)}function m(t){var e;for(e=0;E>e;e+=1)A[e].animation.pause(t)}function d(t,e,s){var i;for(i=0;E>i;i+=1)A[i].animation.goToAndStop(t,e,s)}function c(t){var e;for(e=0;E>e;e+=1)A[e].animation.stop(t)}function u(t){var e;for(e=0;E>e;e+=1)A[e].animation.togglePause(t)}function g(t){var e;for(e=E-1;e>=0;e-=1)A[e].animation.destroy(t)}function v(t,s,i){var a,r=document.getElementsByClassName("bodymovin"),n=r.length;for(a=0;n>a;a+=1)i&&r[a].setAttribute("data-bm-type",i),e(r[a],t);if(s&&0===n){i||(i="svg");var h=document.getElementsByTagName("body")[0];h.innerHTML="";var o=document.createElement("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",i),h.appendChild(o),e(o,t)}}function y(){var t;for(t=0;E>t;t+=1)A[t].animation.resize()}function b(){requestAnimationFrame(f)}function k(){w&&(w=!1,requestAnimationFrame(f))}var P={},A=[],M=0,E=0,w=!0,S=0;return setTimeout(b,0),P.registerAnimation=e,P.loadAnimation=r,P.setSpeed=n,P.setDirection=h,P.play=o,P.moveFrame=p,P.pause=m,P.stop=c,P.togglePause=u,P.searchAnimations=v,P.resize=y,P.start=b,P.goToAndStop=d,P.destroy=g,P}(),qt=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=m(10),this.scaleMode="fit",this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=yt,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=t()};qt.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new T(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var i=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(s){}}}},qt.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;s.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",s.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";var a=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===a||(s.loop="false"===a?!1:"true"===a?!0:parseInt(a));var r=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:i.getNamedItem("bm-autoplay")?i.getNamedItem("bm-autoplay").value:!0;s.autoplay="false"!==r,s.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"";
+}else this.addPaths(b,d),b=this.addShapes(m,c[1]);this.addPaths(b,d)}}m.shape.paths=d}}this.dynamicProperties.length||(this.mdf=!1)},F.prototype.addPaths=function(t,e){var s,i=t.length;for(s=0;i>s;s+=1)e.addShape(t[s])},F.prototype.addSegment=function(t,e,s,i,a,r,n){a.setXYAt(e[0],e[1],"o",r),a.setXYAt(s[0],s[1],"i",r+1),n&&a.setXYAt(t[0],t[1],"v",r),a.setXYAt(i[0],i[1],"v",r+1)},F.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,p,l,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,c=0,u=[],g=!0;for(s?(h=s._length,l=s._length):(s=Bt.newShape(),h=0,l=0),u.push(s),i=0;d>i;i+=1){for(o=f[i].lengths,s.c=m[i].c,r=m[i].c?o.length:o.length+1,a=1;r>a;a+=1)if(n=o[a-1],c+n.addedLength<e.s)c+=n.addedLength,s.c=!1;else{if(c>e.e){s.c=!1;break}e.s<=c&&e.e>=c+n.addedLength?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[a],m[i].v[a],s,h,g),g=!1):(p=Ct.getNewSegment(m[i].v[a-1],m[i].v[a],m[i].o[a-1],m[i].i[a],(e.s-c)/n.addedLength,(e.e-c)/n.addedLength,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h,g),g=!1,s.c=!1),c+=n.addedLength,h+=1}if(m[i].c){if(n=o[a-1],c<=e.e){var v=o[a-1].addedLength;e.s<=c&&e.e>=c+v?(this.addSegment(m[i].v[a-1],m[i].o[a-1],m[i].i[0],m[i].v[0],s,h,g),g=!1):(p=Ct.getNewSegment(m[i].v[a-1],m[i].v[0],m[i].o[a-1],m[i].i[0],(e.s-c)/v,(e.e-c)/v,o[a-1]),this.addSegment(p.pt1,p.pt3,p.pt4,p.pt2,s,h,g),g=!1,s.c=!1)}else s.c=!1;c+=n.addedLength,h+=1}if(s._length&&(s.setXYAt(s.v[l][0],s.v[l][1],"i",l),s.setXYAt(s.v[s._length-1][0],s.v[s._length-1][1],"o",s._length-1)),c>e.e)break;d-1>i&&(s=Bt.newShape(),g=!0,u.push(s),h=0)}return u},Nt.registerModifier("tm",F),P(S,x),x.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},x.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=It.getProp(t,e.r,0,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},x.prototype.processPath=function(t,e){var s=Bt.newShape();s.c=t.c;var i,a,r,n,h,o,p,l,f,m,d,c,u,g=t._length,v=0;for(i=0;g>i;i+=1)a=t.v[i],n=t.o[i],r=t.i[i],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==i&&i!==g-1||t.c?(h=0===i?t.v[g-1]:t.v[i-1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=c=a[0]+(h[0]-a[0])*p,f=u=a[1]-(a[1]-h[1])*p,m=l-(l-a[0])*Ft,d=f-(f-a[1])*Ft,s.setTripleAt(l,f,m,d,c,u,v),v+=1,h=i===g-1?t.v[0]:t.v[i+1],o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)),p=o?Math.min(o/2,e)/o:0,l=m=a[0]+(h[0]-a[0])*p,f=d=a[1]+(h[1]-a[1])*p,c=l-(l-a[0])*Ft,u=f-(f-a[1])*Ft,s.setTripleAt(l,f,m,d,c,u,v),v+=1):(s.setTripleAt(a[0],a[1],n[0],n[1],r[0],r[1],v),v+=1):(s.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],v),v+=1);return s},x.prototype.processShapes=function(t){var e,s,i,a,r=this.shapes.length,n=this.rd.v;if(0!==n){var h,o,p;for(s=0;r>s;s+=1){if(h=this.shapes[s],o=h.shape.paths,p=h.localShapeCollection,h.shape.mdf||this.mdf||t)for(p.releaseShapes(),h.shape.mdf=!0,e=h.shape.paths.shapes,a=h.shape.paths._length,i=0;a>i;i+=1)p.addShape(this.processPath(e[i],n));h.shape.paths=h.localShapeCollection}}this.dynamicProperties.length||(this.mdf=!1)},Nt.registerModifier("rd",x),P(S,D),D.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},D.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=It.getProp(t,e.c,0,null,this.dynamicProperties),this.o=It.getProp(t,e.o,0,null,this.dynamicProperties),this.tr=It.getProp(t,e.tr,2,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0),this.pMatrix=new k,this.rMatrix=new k,this.sMatrix=new k,this.tMatrix=new k,this.matrix=new k},D.prototype.applyTransforms=function(t,e,s,i,a,r){var n=r?-1:1,h=i.s.v[0]+(1-i.s.v[0])*(1-a),o=i.s.v[1]+(1-i.s.v[1])*(1-a);t.translate(i.p.v[0]*n*a,i.p.v[1]*n*a,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*a),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),s.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),s.scale(r?1/h:h,r?1/o:o),s.translate(i.a.v[0],i.a.v[1],i.a.v[2])},D.prototype.processShapes=function(t){this.dynamicProperties.length||(this.mdf=!1);var e,s,i,a,r,n,h,o,p,l,f,m,d,c,u=this.shapes.length,g=Math.ceil(this.c.v),v=this.o.v,y=v%1,b=v>0?Math.floor(v):Math.ceil(v),k=(this.tr.v.props,this.pMatrix.props),A=this.rMatrix.props,P=this.sMatrix.props,M=0;for(e=0;u>e;e+=1){if(a=this.shapes[e],r=a.localShapeCollection,a.shape.mdf||this.mdf||t){if(r.releaseShapes(),a.shape.mdf=!0,o=a.shape.paths,p=o.shapes,i=o._length,M=0,this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset(),v>0){for(;b>M;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),M+=1;y&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,y,!1),M+=y)}else if(0>b){for(;M>b;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),M-=1;y&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-y,!0),M-=y)}for(s=0;i>s;s+=1)for(n=p[s],h=0;g>h;h+=1){if(0!==h&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),a.data.transformers){for(a.data.lvl=0,c=0,f=a.data.elements.length,l=0;f>l;l+=1)c=Math.max(c,a.data.elements[l].st.lvl);for(d=a.data.transformers,f=d.length,l=f-1;l>=c;l-=1)m=d[l].mProps.v.props,this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15])}0!==M&&(this.matrix.transform(A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],A[9],A[10],A[11],A[12],A[13],A[14],A[15]),this.matrix.transform(P[0],P[1],P[2],P[3],P[4],P[5],P[6],P[7],P[8],P[9],P[10],P[11],P[12],P[13],P[14],P[15]),this.matrix.transform(k[0],k[1],k[2],k[3],k[4],k[5],k[6],k[7],k[8],k[9],k[10],k[11],k[12],k[13],k[14],k[15])),r.addShape(this.processPath(n,this.matrix)),this.matrix.reset(),M+=1}}a.shape.paths=r}},D.prototype.processPath=function(t,e){var s=Bt.clone(t,e);return s},Nt.registerModifier("rp",D),C.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(Array.apply(null,{length:this._maxLength})),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},C.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)Bt.release(this.shapes[t]);this._length=0};var Vt=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages}function e(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=document.createElement("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function i(t){this.totalAssets=t.length;var i;for(i=0;i<this.totalAssets;i+=1)t[i].layers||(s.bind(this)(e.bind(this)(t[i])),this.totalImages+=1)}function a(t){this.path=t||""}function r(t){this.assetsPath=t||""}return function(){this.loadAssets=i,this.setAssetsPath=r,this.setPath=a,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0}}(),zt=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),Rt=function(){function t(t){var e=document.createElementNS(vt,"filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e}function e(){var t=document.createElementNS(vt,"feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 0 1"),t}var s={};return s.createFilter=t,s.createAlphaToLuminanceFilter=e,s}(),Ot=function(){function t(t){return t.concat(Array.apply(null,{length:t.length}))}return{"double":t}}(),jt=function(){function t(){var t;return i?(i-=1,t=r[i]):t=[.1,.1],t}function e(t){i===a&&(r=Ot["double"](r),a=2*a),r[i]=t,i+=1}var s={newPoint:t,release:e},i=0,a=8,r=Array.apply(null,{length:a});return s}(),Bt=function(){function t(){var t;return r?(r-=1,t=h[r]):t=new w,t}function e(t){r===n&&(h=Ot["double"](h),n=2*n);var e,s=t._length;for(e=0;s>e;e+=1)jt.release(t.v[e]),jt.release(t.i[e]),jt.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1,h[r]=t,r+=1}function s(t,s){for(;s--;)e(t[s])}function i(e,s){var i,a=e._length,r=t();r._length=e._length,r.c=e.c;var n;for(i=0;a>i;i+=1)s?(n=s.applyToPointArray(e.v[i][0],e.v[i][1],0,2),r.setXYAt(n[0],n[1],"v",i),jt.release(n),n=s.applyToPointArray(e.o[i][0],e.o[i][1],0,2),r.setXYAt(n[0],n[1],"o",i),jt.release(n),n=s.applyToPointArray(e.i[i][0],e.i[i][1],0,2),r.setXYAt(n[0],n[1],"i",i),jt.release(n)):r.setTripleAt(e.v[i][0],e.v[i][1],e.o[i][0],e.o[i][1],e.i[i][0],e.i[i][1],i);return r}var a={clone:i,newShape:t,release:e,releaseArray:s},r=0,n=4,h=Array.apply(null,{length:n});return a}(),Gt=function(){function t(){var t;return a?(a-=1,t=n[a]):t=new C,t}function e(t){var e,s=t._length;for(e=0;s>e;e+=1)Bt.release(t.shapes[e]);t._length=0,a===r&&(n=Ot["double"](n),r=2*r),n[a]=t,a+=1}function s(t,s){e(t),a===r&&(n=Ot["double"](n),r=2*r),n[a]=t,a+=1}var i={newShapeCollection:t,release:e,clone:s},a=0,r=4,n=Array.apply(null,{length:r});return i}();_.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this.completeLayers=!0,e=i-1;e>=0;e--)this.elements[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1;this.checkPendingElements()},_.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t);case 99:return null}return this.createBase(t)},_.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},_.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;e>t;t+=1)this.buildItem(t);this.checkPendingElements()},_.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,i=t.length,a=this.layers.length;for(e=0;i>e;e+=1)for(s=0;a>s;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},_.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},_.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},_.prototype.buildElementParenting=function(t,e,s){s=s||[];for(var i=this.elements,a=this.layers,r=0,n=a.length;n>r;)a[r].ind==e&&(i[r]&&i[r]!==!0?void 0!==a[r].parent?(s.push(i[r]),i[r]._isParent=!0,this.buildElementParenting(t,a[r].parent,s)):(s.push(i[r]),i[r]._isParent=!0,t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},_.prototype.addPendingElement=function(t){this.pendingElements.push(t)},P(_,T),T.prototype.createBase=function(t){return new N(t,this.layerElement,this.globalData,this)},T.prototype.createShape=function(t){return new V(t,this.layerElement,this.globalData,this)},T.prototype.createText=function(t){return new R(t,this.layerElement,this.globalData,this)},T.prototype.createImage=function(t){return new H(t,this.layerElement,this.globalData,this)},T.prototype.createComp=function(t){return new W(t,this.layerElement,this.globalData,this)},T.prototype.createSolid=function(t){return new U(t,this.layerElement,this.globalData,this)},T.prototype.configAnimation=function(t){this.layerElement=document.createElementNS(vt,"svg"),this.layerElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.layerElement.setAttribute("width",t.w),this.layerElement.setAttribute("height",t.h),this.layerElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.layerElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.layerElement.style.width="100%",this.layerElement.style.height="100%",this.animationItem.wrapper.appendChild(this.layerElement);var e=document.createElementNS(vt,"defs");this.globalData.defs=e,this.layerElement.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.frameId=0,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h},this.data=t,this.globalData.frameRate=t.fr;var s=document.createElementNS(vt,"clipPath"),i=document.createElementNS(vt,"rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a="animationMask_"+m(10);s.setAttribute("id",a),s.appendChild(i);var r=document.createElementNS(vt,"g");r.setAttribute("clip-path","url(#"+a+")"),this.layerElement.appendChild(r),e.appendChild(s),this.layerElement=r,this.layers=t.layers,this.globalData.fontManager=new Tt,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.elements=Array.apply(null,{length:t.layers.length})},T.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},T.prototype.updateContainerSize=function(){},T.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var s=this.createItem(this.layers[t]);e[t]=s,ut&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&this.elements[t-1]!==!0?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},T.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,s=this.elements.length;s>e;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},T.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},T.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var i,a=0;e>a;)this.elements[a]&&this.elements[a]!==!0&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?this.layerElement.insertBefore(s,i):this.layerElement.appendChild(s)}},T.prototype.hide=function(){this.layerElement.style.display="none"},T.prototype.show=function(){this.layerElement.style.display="block"},T.prototype.searchExtraCompositions=function(t){var e,s=t.length,i=document.createElementNS(vt,"g");for(e=0;s>e;e+=1)if(t[e].xt){var a=this.createComp(t[e],i,this.globalData.comp,null);a.initExpressions(),this.globalData.projectInterface.registerComposition(a)}},I.prototype.getMaskProperty=function(t){return this.viewData[t].prop},I.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},I.prototype.renderFrame=function(t){var e,s=this.masksProperties.length;for(e=0;s>e;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op.mdf||this.firstFrame)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var i=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url(#"+this.storedData[e].filterId+")")),i.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},I.prototype.getMaskelement=function(){return this.maskElement},I.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},I.prototype.drawPath=function(t,e,s){var i,a,r=" M"+e.v[0][0]+","+e.v[0][1];for(a=e._length,i=1;a>i;i+=1)r+=" C"+gt(e.o[i-1][0])+","+gt(e.o[i-1][1])+" "+gt(e.i[i][0])+","+gt(e.i[i][1])+" "+gt(e.v[i][0])+","+gt(e.v[i][1]);e.c&&a>1&&(r+=" C"+gt(e.o[i-1][0])+","+gt(e.o[i-1][1])+" "+gt(e.i[0][0])+","+gt(e.i[0][1])+" "+gt(e.v[0][0])+","+gt(e.v[0][1])),s.lastPath!==r&&(s.elem&&(e.c?t.inv?s.elem.setAttribute("d",this.solidPath+r):s.elem.setAttribute("d",r):s.elem.setAttribute("d","")),s.lastPath=r)},I.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},I.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},L.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},L.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent)},L.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)(this.isVisible||this._isParent&&"transform"===this.dynamicProperties[e].type)&&(this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.elemMdf=!0,this.globalData.mdf=!0));return this.data.hasMask&&this.isVisible&&this.maskManager.prepareFrame(t*this.data.sr),this.currentFrameNum=t*this.data.sr,this.isVisible},L.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,i=this.comp;s;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):s=!1;var a,r,n=e.length;for(a=0;n>a;a+=1)r=e[a].mat.applyToPointArray(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},L.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?this.layerInterface.shapeInterface=ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.layerInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this))},L.prototype.setBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}var e=this.baseElement||this.layerElement;e.style["mix-blend-mode"]=t},L.prototype.init=function(){this.data.sr||(this.data.sr=1),this.dynamicProperties=[],this.data.ef&&(this.effects=new EffectsManager(this.data,this,this.dynamicProperties)),this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this._isParent=!1,this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ks&&(this.finalTransform={mProp:It.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new k,opacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,11!==this.data.ty&&this.createElements(),this.data.hasMask&&this.addMasks(this.data)),this.elemMdf=!1},L.prototype.getType=function(){return this.type},L.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},L.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},L.prototype.setHierarchy=function(t){this.hierarchy=t},L.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},L.prototype.hide=function(){},L.prototype.mHelper=new k,A(L,N),N.prototype.createElements=function(){this.layerElement=document.createElementNS(vt,"g"),this.transformedElement=this.layerElement,this.data.hasMask&&(this.maskedElement=this.layerElement);var t=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var e=document.createElementNS(vt,"mask");if(e.setAttribute("id",this.layerId),e.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),e.appendChild(this.layerElement),t=e,this.globalData.defs.appendChild(e),!zt.maskType&&1==this.data.td){e.setAttribute("mask-type","luminance");var s=m(10),i=Rt.createFilter(s);this.globalData.defs.appendChild(i),i.appendChild(Rt.createAlphaToLuminanceFilter());var a=document.createElementNS(vt,"g");a.appendChild(this.layerElement),t=a,e.appendChild(a),a.setAttribute("filter","url(#"+s+")")}}else if(2==this.data.td){var r=document.createElementNS(vt,"mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=document.createElementNS(vt,"g");r.appendChild(n);var s=m(10),i=Rt.createFilter(s),h=document.createElementNS(vt,"feColorMatrix");h.setAttribute("type","matrix"),h.setAttribute("color-interpolation-filters","sRGB"),h.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"),i.appendChild(h),this.globalData.defs.appendChild(i);var o=document.createElementNS(vt,"rect");if(o.setAttribute("width",this.comp.data.w),o.setAttribute("height",this.comp.data.h),o.setAttribute("x","0"),o.setAttribute("y","0"),o.setAttribute("fill","#ffffff"),o.setAttribute("opacity","0"),n.setAttribute("filter","url(#"+s+")"),n.appendChild(o),n.appendChild(this.layerElement),t=n,!zt.maskType){r.setAttribute("mask-type","luminance"),i.appendChild(Rt.createAlphaToLuminanceFilter());var a=document.createElementNS(vt,"g");n.appendChild(o),a.appendChild(this.layerElement),t=a,n.appendChild(a)}this.globalData.defs.appendChild(r)}}else(this.data.hasMask||this.data.tt)&&this.data.tt?(this.matteElement=document.createElementNS(vt,"g"),this.matteElement.appendChild(this.layerElement),t=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)),0===this.data.ty){var p=document.createElementNS(vt,"clipPath"),l=document.createElementNS(vt,"path");l.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var f="cp_"+m(8);if(p.setAttribute("id",f),p.appendChild(l),this.globalData.defs.appendChild(p),this.checkMasks()){var d=document.createElementNS(vt,"g");d.setAttribute("clip-path","url(#"+f+")"),d.appendChild(this.layerElement),this.transformedElement=d,t?t.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url(#"+f+")")}0!==this.data.bm&&this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.ef&&(this.effectsManager=new Y(this)),this.checkParenting()},N.prototype.setBlendMode=L.prototype.setBlendMode,N.prototype.renderFrame=function(t){if(3===this.data.ty||this.data.hd||!this.isVisible)return!1;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.firstFrame||this.finalTransform.op.mdf,this.finalTransform.matMdf=this.firstFrame||this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var i=0,a=this.hierarchy.length;if(!this.finalTransform.matMdf)for(;a>i;){if(this.hierarchy[i].finalTransform.mProp.mdf){this.finalTransform.matMdf=!0;break}i+=1}if(this.finalTransform.matMdf)for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),i=0;a>i;i+=1)e=this.hierarchy[i].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&(s=this.finalTransform.mProp.v);return this.finalTransform.matMdf&&this.layerElement&&this.transformedElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement&&(this.finalTransform.op.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.hidden&&this.isTransparent&&(this.isTransparent=!1,this.show()),this.transformedElement.setAttribute("opacity",this.finalTransform.op.v)),this.data.hasMask&&this.maskManager.renderFrame(s),this.effectsManager&&this.effectsManager.renderFrame(this.firstFrame),this.isVisible},N.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},N.prototype.getBaseElement=function(){return this.baseElement},N.prototype.addMasks=function(t){this.maskManager=new I(t,this,this.globalData)},N.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},N.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},N.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},N.prototype.show=function(){this.isVisible&&!this.isTransparent&&(this.hidden=!1,this.layerElement.style.display="block")},A(N,V),V.prototype.identityMatrix=new k,V.prototype.lcEnum={1:"butt",2:"round",3:"butt"},V.prototype.ljEnum={1:"miter",2:"round",3:"butt"},V.prototype.buildExpressionInterface=function(){},V.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),(!this.data.hd||this.data.td)&&i(this.layerElement)},V.prototype.setGradientData=function(t,e,s){var i,a="gr_"+m(10);i=1===e.t?document.createElementNS(vt,"linearGradient"):document.createElementNS(vt,"radialGradient"),i.setAttribute("id",a),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse");var r,n,h,o=[];for(h=4*e.g.p,n=0;h>n;n+=4)r=document.createElementNS(vt,"stop"),i.appendChild(r),o.push(r);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+a+")"),this.globalData.defs.appendChild(i),s.gf=i,s.cst=o},V.prototype.setGradientOpacity=function(t,e,s){if(t.g.k.k[0].s&&t.g.k.k[0].s.length>4*t.g.p||t.g.k.k.length>4*t.g.p){var i,a,r,n,h=document.createElementNS(vt,"mask"),o=document.createElementNS(vt,"path");h.appendChild(o);var p="op_"+m(10),l="mk_"+m(10);h.setAttribute("id",l),i=1===t.t?document.createElementNS(vt,"linearGradient"):document.createElementNS(vt,"radialGradient"),i.setAttribute("id",p),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse"),n=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var f=[];for(r=4*t.g.p;n>r;r+=2)a=document.createElementNS(vt,"stop"),a.setAttribute("stop-color","rgb(255,255,255)"),i.appendChild(a),f.push(a);return o.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+p+")"),this.globalData.defs.appendChild(i),this.globalData.defs.appendChild(h),e.of=i,e.ost=f,s.msElem=o,l}},V.prototype.searchShapes=function(t,e,s,i,a,r){r=r||[];var n,h,o,p,l,f=[].concat(r),m=t.length-1,d=[],c=[];for(n=m;n>=0;n-=1)if("fl"==t[n].ty||"st"==t[n].ty||"gf"==t[n].ty||"gs"==t[n].ty){e[n]={},p={type:t[n].ty,d:"",ld:"",lvl:a,mdf:!1};var u=document.createElementNS(vt,"path");if(e[n].o=It.getProp(this,t[n].o,0,.01,i),("st"==t[n].ty||"gs"==t[n].ty)&&(u.setAttribute("stroke-linecap",this.lcEnum[t[n].lc]||"round"),u.setAttribute("stroke-linejoin",this.ljEnum[t[n].lj]||"round"),u.setAttribute("fill-opacity","0"),1==t[n].lj&&u.setAttribute("stroke-miterlimit",t[n].ml),e[n].w=It.getProp(this,t[n].w,0,null,i),t[n].d)){var g=It.getDashProp(this,t[n].d,"svg",i);g.k||(u.setAttribute("stroke-dasharray",g.dasharray),u.setAttribute("stroke-dashoffset",g.dashoffset)),e[n].d=g}if("fl"==t[n].ty||"st"==t[n].ty)e[n].c=It.getProp(this,t[n].c,1,255,i),s.appendChild(u);else{e[n].g=It.getGradientProp(this,t[n].g,i),2==t[n].t&&(e[n].h=It.getProp(this,t[n].h,1,.01,i),e[n].a=It.getProp(this,t[n].a,1,St,i)),e[n].s=It.getProp(this,t[n].s,1,null,i),e[n].e=It.getProp(this,t[n].e,1,null,i),this.setGradientData(u,t[n],e[n],p);var v=this.setGradientOpacity(t[n],e[n],p);v&&u.setAttribute("mask","url(#"+v+")"),e[n].elem=u,s.appendChild(u)}2===t[n].r&&u.setAttribute("fill-rule","evenodd"),t[n].ln&&u.setAttribute("id",t[n].ln),t[n].cl&&u.setAttribute("class",t[n].cl),p.pElem=u,this.stylesList.push(p),e[n].style=p,d.push(p)}else if("gr"==t[n].ty){e[n]={it:[]};var y=document.createElementNS(vt,"g");s.appendChild(y),e[n].gr=y,this.searchShapes(t[n].it,e[n].it,y,i,a+1,f)}else if("tr"==t[n].ty)e[n]={transform:{op:It.getProp(this,t[n].o,0,.01,i),mProps:It.getProp(this,t[n],2,null,i)},elements:[]},l=e[n].transform,f.push(l);else if("sh"==t[n].ty||"rc"==t[n].ty||"el"==t[n].ty||"sr"==t[n].ty){e[n]={elements:[],caches:[],styles:[],transformers:f,lStr:""};var b=4;for("rc"==t[n].ty?b=5:"el"==t[n].ty?b=6:"sr"==t[n].ty&&(b=7),e[n].sh=Lt.getShapeProp(this,t[n],b,i),e[n].lvl=a,this.shapes.push(e[n].sh),this.addShapeToModifiers(e[n]),o=this.stylesList.length,h=0;o>h;h+=1)this.stylesList[h].closed||e[n].elements.push({ty:this.stylesList[h].type,st:this.stylesList[h]})}else if("tm"==t[n].ty||"rd"==t[n].ty||"ms"==t[n].ty||"rp"==t[n].ty){var k=Nt.getModifier(t[n].ty);k.init(this,t[n],i),this.shapeModifiers.push(k),c.push(k),e[n]=k}for(m=d.length,n=0;m>n;n+=1)d[n].closed=!0;for(m=c.length,n=0;m>n;n+=1)c[n].closed=!0},V.prototype.addShapeToModifiers=function(t){var e,s=this.shapeModifiers.length;for(e=0;s>e;e+=1)this.shapeModifiers[e].addShape(t)},V.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;e>t;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},V.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.globalToLocal([0,0,0]),this.hidden&&(this.layerElement.style.display="block",this.hidden=!1),this.renderModifiers(),void this.renderShape(null,null,!0,null))},V.prototype.hide=function(){if(!this.hidden){this.layerElement.style.display="none";
 
-var n=i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},qt.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,i=this.animationData.layers,a=i.length,r=t.layers,n=r.length;for(s=0;n>s;s+=1)for(e=0;a>e;){if(i[e].id==r[s].id){i[e]=r[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(a=t.assets.length,e=0;a>e;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),ut&&ut.initExpressions(this),this.renderer.renderFrame(null),this.loadNextSegment()},qt.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,i=this,a=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",a,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)i.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);i.includeLayers(t)}catch(e){}}},qt.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},qt.prototype.configAnimation=function(t){this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new Vt,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets),this.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()))},qt.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),qt.prototype.addPendingElement=function(){this.pendingElements+=1},qt.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},qt.prototype.checkLoaded=function(){0===this.pendingElements&&(ut&&ut.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},qt.prototype.resize=function(){this.renderer.updateContainerSize()},qt.prototype.setSubframe=function(t){this.subframeEnabled=t?!0:!1},qt.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:Math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},qt.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},qt.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},qt.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},qt.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},qt.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},qt.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.pause())},qt.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},qt.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},qt.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},qt.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},qt.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.01)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(0)),this.trigger("segmentStart")},qt.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t-.01)),this.firstFrame=t,this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},qt.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,i=t.length;for(s=0;i>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},qt.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},qt.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},qt.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},qt.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null)},qt.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.checkSegments(),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");this.currentRawFrame=this.currentRawFrame%this.totalFrames}else if(this.currentRawFrame<0)return this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames,void this.gotoFrame());this.gotoFrame()},qt.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},qt.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},qt.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},qt.prototype.getPath=function(){return this.path},qt.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},qt.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},qt.prototype.hide=function(){this.renderer.hide()},qt.prototype.show=function(){this.renderer.show()},qt.prototype.getAssets=function(){return this.assets},qt.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new a(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new n(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new r(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new h(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new o(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new a(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new n(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new r(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new h(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new o(t,this))},qt.prototype.addEventListener=p,qt.prototype.removeEventListener=l,qt.prototype.triggerEvent=f;var Yt={};Yt.play=Z,Yt.pause=J,Yt.togglePause=K,Yt.setSpeed=Q,Yt.setDirection=$,Yt.stop=tt,Yt.moveFrame=et,Yt.searchAnimations=st,Yt.registerAnimation=it,Yt.loadAnimation=ot,Yt.setSubframeRendering=ht,Yt.resize=at,Yt.start=rt,Yt.goToAndStop=nt,Yt.destroy=pt,Yt.setQuality=lt,Yt.installPlugin=ft,Yt.__getFactory=mt,Yt.version="4.6.11";var Wt="__[STANDALONE]__",Ht="__[ANIMATIONDATA]__",Ut="";if(Wt){var Zt=document.getElementsByTagName("script"),Jt=Zt.length-1,Kt=Zt[Jt]||{src:""},Qt=Kt.src.replace(/^[^\?]+\??/,"");Ut=ct("renderer")}var $t=setInterval(dt,100);return Yt});
\ No newline at end of file
+var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pElem.style.display="none",this.stylesList[t].pElem.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pElem.parentNode));this.hidden=!0}},V.prototype.renderShape=function(t,e,s,i){var a,r;if(!t)for(t=this.shapesData,r=this.stylesList.length,a=0;r>a;a+=1)this.stylesList[a].d="",this.stylesList[a].mdf=!1;e||(e=this.viewData),r=t.length-1;var n;for(a=r;a>=0;a-=1)n=t[a].ty,"tr"==n?((this.firstFrame||e[a].transform.op.mdf&&i)&&i.setAttribute("opacity",e[a].transform.op.v),(this.firstFrame||e[a].transform.mProps.mdf&&i)&&i.setAttribute("transform",e[a].transform.mProps.v.to2dCSS())):"sh"==n||"el"==n||"rc"==n||"sr"==n?this.renderPath(t[a],e[a]):"fl"==n?this.renderFill(t[a],e[a]):"gf"==n?this.renderGradient(t[a],e[a]):"gs"==n?(this.renderGradient(t[a],e[a]),this.renderStroke(t[a],e[a])):"st"==n?this.renderStroke(t[a],e[a]):"gr"==n&&this.renderShape(t[a].it,e[a].it,!1,e[a].gr);if(s){for(r=this.stylesList.length,a=0;r>a;a+=1)"0"===this.stylesList[a].ld&&(this.stylesList[a].ld="1",this.stylesList[a].pElem.style.display="block"),(this.stylesList[a].mdf||this.firstFrame)&&(this.stylesList[a].pElem.setAttribute("d",this.stylesList[a].d),this.stylesList[a].msElem&&this.stylesList[a].msElem.setAttribute("d",this.stylesList[a].d));this.firstFrame&&(this.firstFrame=!1)}},V.prototype.buildShapeString=function(t,e,s,i){var a,r="";for(a=1;e>a;a+=1)1===a&&(r+=" M"+i.applyToPointStringified(t.v[0][0],t.v[0][1])),r+=" C"+i.applyToPointStringified(t.o[a-1][0],t.o[a-1][1])+" "+i.applyToPointStringified(t.i[a][0],t.i[a][1])+" "+i.applyToPointStringified(t.v[a][0],t.v[a][1]);return 1===e&&(r+=" M"+i.applyToPointStringified(t.v[0][0],t.v[0][1])),s&&e&&(r+=" C"+i.applyToPointStringified(t.o[a-1][0],t.o[a-1][1])+" "+i.applyToPointStringified(t.i[0][0],t.i[0][1])+" "+i.applyToPointStringified(t.v[0][0],t.v[0][1]),r+="z"),r},V.prototype.renderPath=function(t,e){var s,i,a,r,n,h,o=e.elements.length,p=e.lvl;for(h=0;o>h;h+=1){r=e.sh.mdf||this.firstFrame,a="M0 0";var l=e.sh.paths;if(i=l._length,e.elements[h].st.lvl<p){for(var f,m=this.mHelper.reset(),d=p-e.elements[h].st.lvl,c=e.transformers.length-1;d>0;)r=e.transformers[c].mProps.mdf||r,f=e.transformers[c].mProps.v.props,m.transform(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9],f[10],f[11],f[12],f[13],f[14],f[15]),d--,c--;if(r){for(s=0;i>s;s+=1)n=l.shapes[s],n&&n._length&&(a+=this.buildShapeString(n,n._length,n.c,m));e.caches[h]=a}else a=e.caches[h]}else if(r){for(s=0;i>s;s+=1)n=l.shapes[s],n&&n._length&&(a+=this.buildShapeString(n,n._length,n.c,this.identityMatrix));e.caches[h]=a}else a=e.caches[h];e.elements[h].st.d+=a,e.elements[h].st.mdf=r||e.elements[h].st.mdf}},V.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("fill","rgb("+Pt(e.c.v[0])+","+Pt(e.c.v[1])+","+Pt(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("fill-opacity",e.o.v)},V.prototype.renderGradient=function(t,e){var s=e.gf,i=e.of,a=e.s.v,r=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.elem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var h=1===t.t?"x1":"cx",o="x1"===h?"y1":"cy";s.setAttribute(h,a[0]),s.setAttribute(o,a[1]),i&&(i.setAttribute(h,a[0]),i.setAttribute(o,a[1]))}var p,l,f,m;if(e.g.cmdf||this.firstFrame){p=e.cst;var d=e.g.c;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",d[4*l]+"%"),m.setAttribute("stop-color","rgb("+d[4*l+1]+","+d[4*l+2]+","+d[4*l+3]+")")}if(i&&(e.g.omdf||this.firstFrame)){p=e.ost;var c=e.g.o;for(f=p.length,l=0;f>l;l+=1)m=p[l],m.setAttribute("offset",c[2*l]+"%"),m.setAttribute("stop-opacity",c[2*l+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(s.setAttribute("x2",r[0]),s.setAttribute("y2",r[1]),i&&(i.setAttribute("x2",r[0]),i.setAttribute("y2",r[1])));else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)),s.setAttribute("r",u),i&&i.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(a[0]-r[0],2)+Math.pow(a[1]-r[1],2)));var g=Math.atan2(r[1]-a[1],r[0]-a[0]),v=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,y=u*v,b=Math.cos(g+e.a.v)*y+a[0],k=Math.sin(g+e.a.v)*y+a[1];s.setAttribute("fx",b),s.setAttribute("fy",k),i&&(i.setAttribute("fx",b),i.setAttribute("fy",k))}}},V.prototype.renderStroke=function(t,e){var s=e.style,i=e.d;i&&i.k&&(i.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-dasharray",i.dasharray),s.pElem.setAttribute("stroke-dashoffset",i.dashoffset)),e.c&&(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke","rgb("+Pt(e.c.v[0])+","+Pt(e.c.v[1])+","+Pt(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},V.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},z.prototype.init=function(){this._parent.init.call(this),this.lettersChangedFlag=!1,this.currentTextDocumentData={};var t=this.data;this.viewData={m:{a:It.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,i,a,r=e.a.length;for(s=0;r>s;s+=1)a=e.a[s],i={a:{},s:{}},"r"in a.a&&(i.a.r=It.getProp(this,a.a.r,0,St,this.dynamicProperties)),"rx"in a.a&&(i.a.rx=It.getProp(this,a.a.rx,0,St,this.dynamicProperties)),"ry"in a.a&&(i.a.ry=It.getProp(this,a.a.ry,0,St,this.dynamicProperties)),"sk"in a.a&&(i.a.sk=It.getProp(this,a.a.sk,0,St,this.dynamicProperties)),"sa"in a.a&&(i.a.sa=It.getProp(this,a.a.sa,0,St,this.dynamicProperties)),"s"in a.a&&(i.a.s=It.getProp(this,a.a.s,1,.01,this.dynamicProperties)),"a"in a.a&&(i.a.a=It.getProp(this,a.a.a,1,0,this.dynamicProperties)),"o"in a.a&&(i.a.o=It.getProp(this,a.a.o,0,.01,this.dynamicProperties)),"p"in a.a&&(i.a.p=It.getProp(this,a.a.p,1,0,this.dynamicProperties)),"sw"in a.a&&(i.a.sw=It.getProp(this,a.a.sw,0,0,this.dynamicProperties)),"sc"in a.a&&(i.a.sc=It.getProp(this,a.a.sc,1,0,this.dynamicProperties)),"fc"in a.a&&(i.a.fc=It.getProp(this,a.a.fc,1,0,this.dynamicProperties)),"fh"in a.a&&(i.a.fh=It.getProp(this,a.a.fh,0,0,this.dynamicProperties)),"fs"in a.a&&(i.a.fs=It.getProp(this,a.a.fs,0,.01,this.dynamicProperties)),"fb"in a.a&&(i.a.fb=It.getProp(this,a.a.fb,0,.01,this.dynamicProperties)),"t"in a.a&&(i.a.t=It.getProp(this,a.a.t,0,0,this.dynamicProperties)),i.s=It.getTextSelectorProp(this,a.s,this.dynamicProperties),i.s.t=a.s.t,this.viewData.a[s]=i}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:It.getProp(this,e.p.f,0,0,this.dynamicProperties),l:It.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},z.prototype.prepareFrame=function(t){var e=0,s=this.data.t.d.k.length,i=this.data.t.d.k[e].s;for(e+=1;s>e&&!(this.data.t.d.k[e].t>t);)i=this.data.t.d.k[e].s,e+=1;this.lettersChangedFlag=!1,i!==this.currentTextDocumentData&&(this.currentTextDocumentData=i,this.lettersChangedFlag=!0,this.buildNewText()),this._parent.prepareFrame.call(this,t)},z.prototype.createPathShape=function(t,e){var s,i,a=e.length,r="";for(s=0;a>s;s+=1)i=e[s].ks.k,r+=this.buildShapeString(i,i.i.length,!0,t);return r},z.prototype.getMeasures=function(){var t,e,s,i,a=this.mHelper,r=this.renderType,n=this.data,h=this.currentTextDocumentData,o=h.l;if(this.maskPath){var p=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var l=p.v;this.viewData.p.r&&(l=b(l));var f={tLength:0,segments:[]};i=l.v.length-1;var m,d=0;for(s=0;i>s;s+=1)m={s:l.v[s],e:l.v[s+1],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[s+1][0]-l.v[s+1][0],l.i[s+1][1]-l.v[s+1][1]]},Ct.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength;s=i,p.v.c&&(m={s:l.v[s],e:l.v[0],to:[l.o[s][0]-l.v[s][0],l.o[s][1]-l.v[s][1]],ti:[l.i[0][0]-l.v[0][0],l.i[0][1]-l.v[0][1]]},Ct.buildBezierData(m),f.tLength+=m.bezierData.segmentLength,f.segments.push(m),d+=m.bezierData.segmentLength),this.viewData.p.pi=f}var c,k,A,f=this.viewData.p.pi,P=this.viewData.p.f.v,M=0,E=1,w=0,S=!0,F=f.segments;if(0>P&&p.v.c)for(f.tLength<Math.abs(P)&&(P=-Math.abs(P)%f.tLength),M=F.length-1,A=F[M].bezierData.points,E=A.length-1;0>P;)P+=A[E].partialLength,E-=1,0>E&&(M-=1,A=F[M].bezierData.points,E=A.length-1);A=F[M].bezierData.points,k=A[E-1],c=A[E];var x,D,C=c.partialLength}i=o.length,t=0,e=0;var _,T,I,L,N,V=1.2*h.s*.714,z=!0,R=this.viewData,O=Array.apply(null,{length:i});L=R.a.length;var j,B,G,X,q,Y,W,H,U,Z,J,K,Q,$,tt,et,st=-1,it=P,at=M,rt=E,nt=-1,ht=0;for(s=0;i>s;s+=1)if(a.reset(),Y=1,o[s].n)t=0,e+=h.yOffset,e+=z?1:0,P=it,z=!1,ht=0,this.maskPath&&(M=at,E=rt,A=F[M].bezierData.points,k=A[E-1],c=A[E],C=c.partialLength,w=0),O[s]=this.emptyProp;else{if(this.maskPath){if(nt!==o[s].line){switch(h.j){case 1:P+=d-h.lineWidths[o[s].line];break;case 2:P+=(d-h.lineWidths[o[s].line])/2}nt=o[s].line}st!==o[s].ind&&(o[st]&&(P+=o[st].extra),P+=o[s].an/2,st=o[s].ind),P+=R.m.a.v[0]*o[s].an/200;var ot=0;for(I=0;L>I;I+=1)_=R.a[I].a,"p"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),ot+=B.length?_.p.v[0]*B[0]:_.p.v[0]*B),"a"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),ot+=B.length?_.a.v[0]*B[0]:_.a.v[0]*B);for(S=!0;S;)w+C>=P+ot||!A?(x=(P+ot-w)/c.partialLength,X=k.point[0]+(c.point[0]-k.point[0])*x,q=k.point[1]+(c.point[1]-k.point[1])*x,a.translate(-R.m.a.v[0]*o[s].an/200,-(R.m.a.v[1]*V/100)),S=!1):A&&(w+=c.partialLength,E+=1,E>=A.length&&(E=0,M+=1,F[M]?A=F[M].bezierData.points:p.v.c?(E=0,M=0,A=F[M].bezierData.points):(w-=c.partialLength,A=null)),A&&(k=c,c=A[E],C=c.partialLength));G=o[s].an/2-o[s].add,a.translate(-G,0,0)}else G=o[s].an/2-o[s].add,a.translate(-G,0,0),a.translate(-R.m.a.v[0]*o[s].an/200,-R.m.a.v[1]*V/100,0);for(ht+=o[s].l/2,I=0;L>I;I+=1)_=R.a[I].a,"t"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),this.maskPath?P+=B.length?_.t*B[0]:_.t*B:t+=B.length?_.t.v*B[0]:_.t.v*B);for(ht+=o[s].l/2,h.strokeWidthAnim&&(H=h.sw||0),h.strokeColorAnim&&(W=h.sc?[h.sc[0],h.sc[1],h.sc[2]]:[0,0,0]),h.fillColorAnim&&(U=[h.fc[0],h.fc[1],h.fc[2]]),I=0;L>I;I+=1)_=R.a[I].a,"a"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),B.length?a.translate(-_.a.v[0]*B[0],-_.a.v[1]*B[1],_.a.v[2]*B[2]):a.translate(-_.a.v[0]*B,-_.a.v[1]*B,_.a.v[2]*B));for(I=0;L>I;I+=1)_=R.a[I].a,"s"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),B.length?a.scale(1+(_.s.v[0]-1)*B[0],1+(_.s.v[1]-1)*B[1],1):a.scale(1+(_.s.v[0]-1)*B,1+(_.s.v[1]-1)*B,1));for(I=0;L>I;I+=1){if(_=R.a[I].a,T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),"sk"in _&&(B.length?a.skewFromAxis(-_.sk.v*B[0],_.sa.v*B[1]):a.skewFromAxis(-_.sk.v*B,_.sa.v*B)),"r"in _&&a.rotateZ(B.length?-_.r.v*B[2]:-_.r.v*B),"ry"in _&&a.rotateY(B.length?_.ry.v*B[1]:_.ry.v*B),"rx"in _&&a.rotateX(B.length?_.rx.v*B[0]:_.rx.v*B),"o"in _&&(Y+=B.length?(_.o.v*B[0]-Y)*B[0]:(_.o.v*B-Y)*B),h.strokeWidthAnim&&"sw"in _&&(H+=B.length?_.sw.v*B[0]:_.sw.v*B),h.strokeColorAnim&&"sc"in _)for(Z=0;3>Z;Z+=1)W[Z]=Math.round(B.length?255*(W[Z]+(_.sc.v[Z]-W[Z])*B[0]):255*(W[Z]+(_.sc.v[Z]-W[Z])*B));if(h.fillColorAnim){if("fc"in _)for(Z=0;3>Z;Z+=1)U[Z]=B.length?U[Z]+(_.fc.v[Z]-U[Z])*B[0]:U[Z]+(_.fc.v[Z]-U[Z])*B;"fh"in _&&(U=B.length?v(U,_.fh.v*B[0]):v(U,_.fh.v*B)),"fs"in _&&(U=B.length?u(U,_.fs.v*B[0]):u(U,_.fs.v*B)),"fb"in _&&(U=B.length?g(U,_.fb.v*B[0]):g(U,_.fb.v*B))}}for(I=0;L>I;I+=1)_=R.a[I].a,"p"in _&&(T=R.a[I].s,B=T.getMult(o[s].anIndexes[I],n.t.a[I].s.totalChars),this.maskPath?B.length?a.translate(0,_.p.v[1]*B[0],-_.p.v[2]*B[1]):a.translate(0,_.p.v[1]*B,-_.p.v[2]*B):B.length?a.translate(_.p.v[0]*B[0],_.p.v[1]*B[1],-_.p.v[2]*B[2]):a.translate(_.p.v[0]*B,_.p.v[1]*B,-_.p.v[2]*B));if(h.strokeWidthAnim&&(J=0>H?0:H),h.strokeColorAnim&&(K="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),h.fillColorAnim&&(Q="rgb("+Math.round(255*U[0])+","+Math.round(255*U[1])+","+Math.round(255*U[2])+")"),this.maskPath){if(a.translate(0,-h.ls),a.translate(0,R.m.a.v[1]*V/100+e,0),n.t.p.p){D=(c.point[1]-k.point[1])/(c.point[0]-k.point[0]);var pt=180*Math.atan(D)/Math.PI;c.point[0]<k.point[0]&&(pt+=180),a.rotate(-pt*Math.PI/180)}a.translate(X,q,0),P-=R.m.a.v[0]*o[s].an/200,o[s+1]&&st!==o[s+1].ind&&(P+=o[s].an/2,P+=h.tr/1e3*h.s)}else{switch(a.translate(t,e,0),h.ps&&a.translate(h.ps[0],h.ps[1]+h.ascent,0),h.j){case 1:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line]),0,0);break;case 2:a.translate(h.justifyOffset+(h.boxWidth-h.lineWidths[o[s].line])/2,0,0)}a.translate(0,-h.ls),a.translate(G,0,0),a.translate(R.m.a.v[0]*o[s].an/200,R.m.a.v[1]*V/100,0),t+=o[s].l+h.tr/1e3*h.s}"html"===r?$=a.toCSS():"svg"===r?$=a.to2dCSS():tt=[a.props[0],a.props[1],a.props[2],a.props[3],a.props[4],a.props[5],a.props[6],a.props[7],a.props[8],a.props[9],a.props[10],a.props[11],a.props[12],a.props[13],a.props[14],a.props[15]],et=Y,j=this.renderedLetters[s],!j||j.o===et&&j.sw===J&&j.sc===K&&j.fc===Q?"svg"!==r&&"html"!==r||j&&j.m===$?"canvas"!==r||j&&j.props[0]===tt[0]&&j.props[1]===tt[1]&&j.props[4]===tt[4]&&j.props[5]===tt[5]&&j.props[12]===tt[12]&&j.props[13]===tt[13]?N=j:(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,null,tt)):(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,$)):(this.lettersChangedFlag=!0,N=new y(et,J,K,Q,$,tt)),this.renderedLetters[s]=N}},z.prototype.buildShapeString=V.prototype.buildShapeString,z.prototype.emptyProp=new y,A(N,R),R.prototype.init=z.prototype.init,R.prototype.createPathShape=z.prototype.createPathShape,R.prototype.getMeasures=z.prototype.getMeasures,R.prototype.prepareFrame=z.prototype.prepareFrame,R.prototype.buildShapeString=z.prototype.buildShapeString,R.prototype.createElements=function(){this._parent.createElements.call(this),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},R.prototype.buildNewText=function(){var t,e,s=this.currentTextDocumentData;this.renderedLetters=Array.apply(null,{length:this.currentTextDocumentData.l?this.currentTextDocumentData.l.length:0}),s.fc?this.layerElement.setAttribute("fill","rgb("+Math.round(255*s.fc[0])+","+Math.round(255*s.fc[1])+","+Math.round(255*s.fc[2])+")"):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),s.sc&&(this.layerElement.setAttribute("stroke","rgb("+Math.round(255*s.sc[0])+","+Math.round(255*s.sc[1])+","+Math.round(255*s.sc[2])+")"),this.layerElement.setAttribute("stroke-width",s.sw)),this.layerElement.setAttribute("font-size",s.s);var i=this.globalData.fontManager.getFontByName(s.f);if(i.fClass)this.layerElement.setAttribute("class",i.fClass);else{this.layerElement.setAttribute("font-family",i.fFamily);var a=s.fWeight,r=s.fStyle;this.layerElement.setAttribute("font-style",r),this.layerElement.setAttribute("font-weight",a)}var n=s.l||[];if(e=n.length){var h,o,p=this.mHelper,l="",f=this.data.singleShape;if(f)var m=0,d=0,c=s.lineWidths,u=s.boxWidth,g=!0;var v=0;for(t=0;e>t;t+=1){if(this.globalData.fontManager.chars?f&&0!==t||(h=this.textSpans[v]?this.textSpans[v]:document.createElementNS(vt,"path")):h=this.textSpans[v]?this.textSpans[v]:document.createElementNS(vt,"text"),h.style.display="inherit",h.setAttribute("stroke-linecap","butt"),h.setAttribute("stroke-linejoin","round"),h.setAttribute("stroke-miterlimit","4"),f&&n[t].n&&(m=0,d+=s.yOffset,d+=g?1:0,g=!1),p.reset(),this.globalData.fontManager.chars&&p.scale(s.s/100,s.s/100),f){switch(s.ps&&p.translate(s.ps[0],s.ps[1]+s.ascent,0),p.translate(0,-s.ls,0),s.j){case 1:p.translate(s.justifyOffset+(u-c[n[t].line]),0,0);break;case 2:p.translate(s.justifyOffset+(u-c[n[t].line])/2,0,0)}p.translate(m,d,0)}if(this.globalData.fontManager.chars){var y,b=this.globalData.fontManager.getCharData(s.t.charAt(t),i.fStyle,this.globalData.fontManager.getFontByName(s.f).fFamily);y=b?b.data:null,y&&y.shapes&&(o=y.shapes[0].it,f||(l=""),l+=this.createPathShape(p,o),f||h.setAttribute("d",l)),f||this.layerElement.appendChild(h)}else h.textContent=n[t].val,h.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.layerElement.appendChild(h),f&&h.setAttribute("transform",p.to2dCSS());f&&(m+=n[t].l||0,m+=s.tr/1e3*s.s),this.textSpans[v]=h,v+=1}if(!f)for(;v<this.textSpans.length;)this.textSpans[v].style.display="none",v+=1;f&&this.globalData.fontManager.chars&&(h.setAttribute("d",l),this.layerElement.appendChild(h))}},R.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&this.show(),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,i,a=this.renderedLetters,r=this.currentTextDocumentData.l;i=r.length;var n;for(s=0;i>s;s+=1)r[s].n||(n=a[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},R.prototype.destroy=function(){this._parent.destroy.call(this._parent)},O.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},j.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,s=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},B.prototype.initialize=function(){var t,e,s,i,a=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(i=this.elem.maskManager.masksProperties.length,s=0):(s=this.filterManager.effectElements[0].p.v-1,i=s+1),e=document.createElementNS(vt,"g"),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1),s;i>s;s+=1)t=document.createElementNS(vt,"path"),e.appendChild(t),this.paths.push({p:t,m:s});if(3===this.filterManager.effectElements[10].p.v){var r=document.createElementNS(vt,"mask"),n="stms_"+m(10);r.setAttribute("id",n),r.setAttribute("mask-type","alpha"),r.appendChild(e),this.elem.globalData.defs.appendChild(r);var h=document.createElementNS(vt,"g");h.setAttribute("mask","url(#"+n+")"),a[0]&&h.appendChild(a[0]),this.elem.layerElement.appendChild(h),this.masker=r,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(var a=this.elem.layerElement.children||this.elem.layerElement.childNodes;a.length;)this.elem.layerElement.removeChild(a[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},B.prototype.renderFrame=function(t){this.initialized||this.initialize();var e,s,i,a=this.paths.length;for(e=0;a>e;e+=1)if(s=this.elem.maskManager.viewData[this.paths[e].m],i=this.paths[e].p,(t||this.filterManager.mdf||s.prop.mdf)&&i.setAttribute("d",s.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||s.prop.mdf){var r;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=i.getTotalLength();r="0 0 0 "+o*n+" ";var p,l=o*(h-n),f=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,m=Math.floor(l/f);for(p=0;m>p;p+=1)r+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";r+="0 "+10*o+" 0 0"}else r="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;i.setAttribute("stroke-dasharray",r)}if((t||this.filterManager.effectElements[4].p.mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p.mdf)){var d=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+Pt(255*d[0])+","+Pt(255*d[1])+","+Pt(255*d[2])+")")}},G.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v,a=i[0]+" "+s[0]+" "+e[0],r=i[1]+" "+s[1]+" "+e[1],n=i[2]+" "+s[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",a),this.feFuncG.setAttribute("tableValues",r),this.feFuncB.setAttribute("tableValues",n)}},X.prototype.createFeFunc=function(t,e){var s=document.createElementNS(vt,t);return s.setAttribute("type","table"),e.appendChild(s),s},X.prototype.getTableValue=function(t,e,s,i,a){for(var r,n,h=0,o=256,p=Math.min(t,e),l=Math.max(t,e),f=Array.call(null,{length:o}),m=0,d=a-i,c=e-t;256>=h;)r=h/256,n=p>=r?0>c?a:i:r>=l?0>c?i:a:i+d*Math.pow((r-t)/c,1/s),f[m++]=n,h+=256/(o-1);return f.join(" ")},X.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e,s=this.filterManager.effectElements;this.feFuncRComposed&&(t||s[2].p.mdf||s[3].p.mdf||s[4].p.mdf||s[5].p.mdf||s[6].p.mdf)&&(e=this.getTableValue(s[2].p.v,s[3].p.v,s[4].p.v,s[5].p.v,s[6].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||s[9].p.mdf||s[10].p.mdf||s[11].p.mdf||s[12].p.mdf||s[13].p.mdf)&&(e=this.getTableValue(s[9].p.v,s[10].p.v,s[11].p.v,s[12].p.v,s[13].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||s[16].p.mdf||s[17].p.mdf||s[18].p.mdf||s[19].p.mdf||s[20].p.mdf)&&(e=this.getTableValue(s[16].p.v,s[17].p.v,s[18].p.v,s[19].p.v,s[20].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||s[23].p.mdf||s[24].p.mdf||s[25].p.mdf||s[26].p.mdf||s[27].p.mdf)&&(e=this.getTableValue(s[23].p.v,s[24].p.v,s[25].p.v,s[26].p.v,s[27].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||s[30].p.mdf||s[31].p.mdf||s[32].p.mdf||s[33].p.mdf||s[34].p.mdf)&&(e=this.getTableValue(s[30].p.v,s[31].p.v,s[32].p.v,s[33].p.v,s[34].p.v),this.feFuncA.setAttribute("tableValues",e))}},q.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){if((t||this.filterManager.effectElements[4].p.mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p.mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",xt(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p.mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p.mdf||this.filterManager.effectElements[3].p.mdf){var s=this.filterManager.effectElements[3].p.v,i=(this.filterManager.effectElements[2].p.v-90)*St,a=s*Math.cos(i),r=s*Math.sin(i);this.feOffset.setAttribute("dx",a),this.feOffset.setAttribute("dy",r)}}},Y.prototype.renderFrame=function(t){var e,s=this.filters.length;for(e=0;s>e;e+=1)this.filters[e].renderFrame(t)},A(N,W),W.prototype.hide=function(){if(!this.hidden){this._parent.hide.call(this);var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].hide()}},W.prototype.prepareFrame=function(t){if(this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){if(this.tm){var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}else this.renderedFrame=t/this.data.sr;var s,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=0;i>s;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st)}},W.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),i=this.layers.length;if(s===!1)return void this.hide();for(this.hidden&&this.show(),e=0;i>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},W.prototype.setElements=function(t){this.elements=t},W.prototype.getElements=function(){return this.elements},W.prototype.destroy=function(){this._parent.destroy.call(this._parent);var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].destroy()},W.prototype.checkLayers=T.prototype.checkLayers,W.prototype.buildItem=T.prototype.buildItem,W.prototype.buildAllItems=T.prototype.buildAllItems,W.prototype.buildElementParenting=T.prototype.buildElementParenting,W.prototype.createItem=T.prototype.createItem,W.prototype.createImage=T.prototype.createImage,W.prototype.createComp=T.prototype.createComp,W.prototype.createSolid=T.prototype.createSolid,W.prototype.createShape=T.prototype.createShape,W.prototype.createText=T.prototype.createText,W.prototype.createBase=T.prototype.createBase,W.prototype.appendElementInPos=T.prototype.appendElementInPos,W.prototype.checkPendingElements=T.prototype.checkPendingElements,W.prototype.addPendingElement=T.prototype.addPendingElement,A(N,H),H.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData);this._parent.createElements.call(this),this.innerElem=document.createElementNS(vt,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio","xMidYMid slice"),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.maskedElement=this.innerElem,this.layerElement.appendChild(this.innerElem),this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},H.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&this.show(),void(this.firstFrame&&(this.firstFrame=!1)))},H.prototype.destroy=function(){this._parent.destroy.call(this._parent),this.innerElem=null},A(N,U),U.prototype.createElements=function(){this._parent.createElements.call(this);var t=document.createElementNS(vt,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t),this.innerElem=t,this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)},U.prototype.renderFrame=H.prototype.renderFrame,U.prototype.destroy=H.prototype.destroy;var Xt=function(){function t(t){for(var e=0,s=t.target;E>e;)P[e].animation===s&&(P.splice(e,1),e-=1,E-=1,s.isPaused||i()),e+=1}function e(t,e){if(!t)return null;for(var s=0;E>s;){if(P[s].elem==t&&null!==P[s].elem)return P[s].animation;s+=1}var i=new qt;return a(i,t),i.setData(t,e),i}function s(){S+=1,k()}function i(){S-=1,0===S&&(w=!0)}function a(e,a){e.addEventListener("destroy",t),e.addEventListener("_active",s),e.addEventListener("_idle",i),P.push({elem:a,animation:e}),E+=1}function r(t){var e=new qt;return a(e,null),e.setParams(t),e}function n(t,e){var s;for(s=0;E>s;s+=1)P[s].animation.setSpeed(t,e)}function h(t,e){var s;for(s=0;E>s;s+=1)P[s].animation.setDirection(t,e)}function o(t){var e;for(e=0;E>e;e+=1)P[e].animation.play(t)}function p(t,e){M=Date.now();var s;for(s=0;E>s;s+=1)P[s].animation.moveFrame(t,e)}function l(t){var e,s=t-M;for(e=0;E>e;e+=1)P[e].animation.advanceTime(s);M=t,w||requestAnimationFrame(l)}function f(t){M=t,requestAnimationFrame(l)}function m(t){var e;for(e=0;E>e;e+=1)P[e].animation.pause(t)}function d(t,e,s){var i;for(i=0;E>i;i+=1)P[i].animation.goToAndStop(t,e,s)}function c(t){var e;for(e=0;E>e;e+=1)P[e].animation.stop(t)}function u(t){var e;for(e=0;E>e;e+=1)P[e].animation.togglePause(t)}function g(t){var e;for(e=E-1;e>=0;e-=1)P[e].animation.destroy(t)}function v(t,s,i){var a,r=document.getElementsByClassName("bodymovin"),n=r.length;for(a=0;n>a;a+=1)i&&r[a].setAttribute("data-bm-type",i),e(r[a],t);if(s&&0===n){i||(i="svg");var h=document.getElementsByTagName("body")[0];h.innerHTML="";var o=document.createElement("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",i),h.appendChild(o),e(o,t)}}function y(){var t;for(t=0;E>t;t+=1)P[t].animation.resize()}function b(){requestAnimationFrame(f)}function k(){w&&(w=!1,requestAnimationFrame(f))}var A={},P=[],M=0,E=0,w=!0,S=0;return setTimeout(b,0),A.registerAnimation=e,A.loadAnimation=r,A.setSpeed=n,A.setDirection=h,A.play=o,A.moveFrame=p,A.pause=m,A.stop=c,A.togglePause=u,A.searchAnimations=v,A.resize=y,A.start=b,A.goToAndStop=d,A.destroy=g,A}(),qt=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=m(10),this.scaleMode="fit",this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=yt,this.segments=[],this.pendingSegment=!1,this._idle=!0,this.projectInterface=t()};qt.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new T(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var i=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),i.open("GET",t.path,!0),i.send(),i.onreadystatechange=function(){if(4==i.readyState)if(200==i.status)e.configAnimation(JSON.parse(i.responseText));else try{var t=JSON.parse(i.responseText);e.configAnimation(t)}catch(s){}}}},qt.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;s.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",s.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";
+
+var a=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===a||(s.loop="false"===a?!1:"true"===a?!0:parseInt(a));var r=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:i.getNamedItem("bm-autoplay")?i.getNamedItem("bm-autoplay").value:!0;s.autoplay="false"!==r,s.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"";var n=i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},qt.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,i=this.animationData.layers,a=i.length,r=t.layers,n=r.length;for(s=0;n>s;s+=1)for(e=0;a>e;){if(i[e].id==r[s].id){i[e]=r[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(a=t.assets.length,e=0;a>e;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),ut&&ut.initExpressions(this),this.renderer.renderFrame(null),this.loadNextSegment()},qt.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,i=this,a=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",a,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)i.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);i.includeLayers(t)}catch(e){}}},qt.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},qt.prototype.configAnimation=function(t){this.renderer&&this.renderer.destroyed||(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new Vt,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets),this.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()))},qt.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(_t.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),qt.prototype.addPendingElement=function(){this.pendingElements+=1},qt.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},qt.prototype.checkLoaded=function(){0===this.pendingElements&&(ut&&ut.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},qt.prototype.resize=function(){this.renderer.updateContainerSize()},qt.prototype.setSubframe=function(t){this.subframeEnabled=t?!0:!1},qt.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:Math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},qt.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},qt.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},qt.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0,this.pendingSegment||(this._idle=!0,this.trigger("_idle")))},qt.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?this.play():this.pause())},qt.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},qt.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.pause())},qt.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},qt.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},qt.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},qt.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},qt.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.01)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(0)),this.trigger("segmentStart")},qt.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t-.01)),this.firstFrame=t,this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},qt.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,i=t.length;for(s=0;i>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},qt.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},qt.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},qt.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},qt.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null)},qt.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.checkSegments(),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");this.currentRawFrame=this.currentRawFrame%this.totalFrames}else if(this.currentRawFrame<0)return this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames,void this.gotoFrame());this.gotoFrame()},qt.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},qt.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},qt.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},qt.prototype.getPath=function(){return this.path},qt.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},qt.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},qt.prototype.hide=function(){this.renderer.hide()},qt.prototype.show=function(){this.renderer.show()},qt.prototype.getAssets=function(){return this.assets},qt.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new a(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new n(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new r(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new h(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new o(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new a(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new n(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new r(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new h(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new o(t,this))},qt.prototype.addEventListener=p,qt.prototype.removeEventListener=l,qt.prototype.triggerEvent=f;var Yt={};Yt.play=Z,Yt.pause=J,Yt.togglePause=K,Yt.setSpeed=Q,Yt.setDirection=$,Yt.stop=tt,Yt.moveFrame=et,Yt.searchAnimations=st,Yt.registerAnimation=it,Yt.loadAnimation=ot,Yt.setSubframeRendering=ht,Yt.resize=at,Yt.start=rt,Yt.goToAndStop=nt,Yt.destroy=pt,Yt.setQuality=lt,Yt.installPlugin=ft,Yt.__getFactory=mt,Yt.version="4.8.0";var Wt="__[STANDALONE]__",Ht="__[ANIMATIONDATA]__",Ut="";if(Wt){var Zt=document.getElementsByTagName("script"),Jt=Zt.length-1,Kt=Zt[Jt]||{src:""},Qt=Kt.src.replace(/^[^\?]+\??/,"");Ut=ct("renderer")}var $t=setInterval(dt,100);return Yt});
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index 0b37ee3..b2f407e 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -17,7 +17,7 @@
 var eventstream = require("event-stream");
 var jslint = require('gulp-jslint');
 
-var bm_version = '4.6.11';
+var bm_version = '4.8.0';
 
 var files = [
     {
@@ -27,7 +27,7 @@
 ]
 
                   //(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {<%= contents %>var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type==='expressions'){ expressionsPlugin = plugin; } } function getFactory(name){ if(name === 'propertyFactory'){ return PropertyFactory; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = '4.1.9'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index]; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));
-  var moduleWrap = '(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {<%= contents %>var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === \'string\'){ switch(value){ case \'high\': defaultCurveSegments = 200; break; case \'medium\': defaultCurveSegments = 50; break; case \'low\': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type===\'expressions\'){ expressionsPlugin = plugin; } } function getFactory(name){ switch(name){ case "propertyFactory": return PropertyFactory;case "shapePropertyFactory": return ShapePropertyFactory; case "matrix": return Matrix; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = \''+bm_version+'\'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split(\'&\'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split(\'=\'); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = \'__[STANDALONE]__\'; var animationData = \'__[ANIMATIONDATA]__\'; var renderer = \'\'; if(standalone) { var scripts = document.getElementsByTagName(\'script\'); var index = scripts.length - 1; var myScript = scripts[index] || { src: \'\' }; var queryString = myScript.src.replace(/^[^\\?]+\\??/,\'\'); renderer = getQueryVariable(\'renderer\'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));  ';
+  var moduleWrap = 'var window=(typeof window === "undefined")?{}:window;(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {<%= contents %>var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === \'string\'){ switch(value){ case \'high\': defaultCurveSegments = 200; break; case \'medium\': defaultCurveSegments = 50; break; case \'low\': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type===\'expressions\'){ expressionsPlugin = plugin; } } function getFactory(name){ switch(name){ case "propertyFactory": return PropertyFactory;case "shapePropertyFactory": return ShapePropertyFactory; case "matrix": return Matrix; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = \''+bm_version+'\'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split(\'&\'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split(\'=\'); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = \'__[STANDALONE]__\'; var animationData = \'__[ANIMATIONDATA]__\'; var renderer = \'\'; if(standalone) { var scripts = document.getElementsByTagName(\'script\'); var index = scripts.length - 1; var myScript = scripts[index] || { src: \'\' }; var queryString = myScript.src.replace(/^[^\\?]+\\??/,\'\'); renderer = getQueryVariable(\'renderer\'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));  ';
 //var moduleWrap = '(function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {<%= contents %>var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === \'string\'){ switch(value){ case \'high\': defaultCurveSegments = 200; break; case \'medium\': defaultCurveSegments = 50; break; case \'low\': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.version = \''+bm_version+'\'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split(\'&\'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split(\'=\'); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = \'__[STANDALONE]__\'; var animationData = \'__[ANIMATIONDATA]__\'; var renderer = \'\'; if(standalone) { var scripts = document.getElementsByTagName(\'script\'); var index = scripts.length - 1; var myScript = scripts[index]; var queryString = myScript.src.replace(/^[^\\?]+\\??/,\'\'); renderer = getQueryVariable(\'renderer\'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; })); ';
 gulp.task('gzipFile', function(){
   gulp.src('build/player/bodymovin.min.js')
diff --git a/package.json b/package.json
index e3b9c03..d76c504 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "bodymovin",
-  "version": "4.6.11",
+  "version": "4.8.0",
   "description": "After Effects plugin for exporting animations to SVG + JavaScript or canvas + JavaScript",
   "main": "./build/player/bodymovin.js",
   "repository": {
@@ -19,18 +19,19 @@
     "event-stream": "^3.3.4",
     "events-stream": "^0.2.0",
     "gulp": "^3.9.0",
+    "gulp-cheerio": "^0.6.2",
     "gulp-concat": "^2.6.0",
     "gulp-gzip": "^1.2.0",
     "gulp-html-replace": "^1.6.1",
     "gulp-jshint": "^1.11.2",
+    "gulp-jslint": "^1.0.10",
     "gulp-jsoncombine": "^1.0.3",
     "gulp-rename": "^1.2.2",
     "gulp-replace": "^0.5.4",
     "gulp-uglify": "^1.4.1",
     "gulp-usemin": "^0.3.14",
     "gulp-watch": "^4.3.5",
-    "gulp-wrap": "^0.11.0",
-    "gulp-cheerio": "^0.6.2"
+    "gulp-wrap": "^0.11.0"
   },
   "license": "MIT"
 }
diff --git a/player/index.html b/player/index.html
index fed55d3..9c0b10a 100644
--- a/player/index.html
+++ b/player/index.html
@@ -61,6 +61,7 @@
     <script src="js/mask.js"></script>
     <script src="js/elements/BaseElement.js"></script>
     <script src="js/elements/svgElements/SVGBaseElement.js"></script>
+    <script src="js/elements/ShapeElement.js"></script>
     <script src="js/elements/TextElement.js"></script>
     <script src="js/elements/svgElements/SVGTextElement.js"></script>
     <script src="js/elements/svgElements/effects/SVGTintEffect.js"></script>
@@ -72,7 +73,6 @@
     <script src="js/elements/svgElements/SVGEffects.js"></script>
     <script src="js/elements/CompElement.js"></script>
     <script src="js/elements/ImageElement.js"></script>
-    <script src="js/elements/ShapeElement.js"></script>
     <script src="js/elements/SolidElement.js"></script>
     <script src="js/elements/canvasElements/CVBaseElement.js" data-light-skip="true"></script>
     <script src="js/elements/canvasElements/CVCompElement.js" data-light-skip="true"></script>
diff --git a/player/js/3rd_party/transformation-matrix.js b/player/js/3rd_party/transformation-matrix.js
index d1045eb..6ad47ac 100644
--- a/player/js/3rd_party/transformation-matrix.js
+++ b/player/js/3rd_party/transformation-matrix.js
@@ -169,6 +169,7 @@
                 this.props[14] = this.props[12] * c2 + this.props[13] * g2 + this.props[14] * k2 + this.props[15] * o2 ;
                 this.props[15] = this.props[12] * d2 + this.props[13] * h2 + this.props[14] * l2 + this.props[15] * p2 ;
             }
+            this._identityCalculated = false;
             return this;
         }
 
@@ -214,9 +215,21 @@
         this.props[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2 ;
         this.props[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2 ;
 
+        this._identityCalculated = false;
         return this;
     }
 
+    function isIdentity() {
+        if(!this._identityCalculated){
+            this._identity = !(this.props[0] !== 1 || this.props[1] !== 0 || this.props[2] !== 0 || this.props[3] !== 0
+                || this.props[4] !== 0 || this.props[5] !== 1 || this.props[6] !== 0 || this.props[7] !== 0
+                || this.props[8] !== 0 || this.props[9] !== 0 || this.props[10] !== 1 || this.props[11] !== 0
+                || this.props[12] !== 0 || this.props[13] !== 0 || this.props[14] !== 0 || this.props[15] !== 1);
+            this._identityCalculated = true;
+        }
+        return this._identity;
+    }
+
     function clone(matr){
         var i;
         for(i=0;i<16;i+=1){
@@ -282,6 +295,9 @@
         return [x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12],x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13],x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]];
     }
     function applyToPointStringified(x, y) {
+        if(this.isIdentity()) {
+            return x + ',' + y;
+        }
         return (bm_rnd(x * this.props[0] + y * this.props[4] + this.props[12]))+','+(bm_rnd(x * this.props[1] + y * this.props[5] + this.props[13]));
     }
 
@@ -334,6 +350,9 @@
         this.inversePoints = inversePoints;
         this.inversePoint = inversePoint;
         this._t = this.transform;
+        this.isIdentity = isIdentity;
+        this._identity = true;
+        this._identityCalculated = false;
 
         this.props = [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];
 
diff --git a/player/js/elements/CompElement.js b/player/js/elements/CompElement.js
index df83753..dbc15de 100644
--- a/player/js/elements/CompElement.js
+++ b/player/js/elements/CompElement.js
@@ -19,13 +19,13 @@
 
 ICompElement.prototype.hide = function(){
     if(!this.hidden){
+        this._parent.hide.call(this);
         var i,len = this.elements.length;
         for( i = 0; i < len; i+=1 ){
             if(this.elements[i]){
                 this.elements[i].hide();
             }
         }
-        this.hidden = true;
     }
 };
 
@@ -63,7 +63,9 @@
         return;
     }
 
-    this.hidden = false;
+    if(this.hidden) {
+        this.show();
+    }
     for( i = 0; i < len; i+=1 ){
         if(this.completeLayers || this.elements[i]){
             this.elements[i].renderFrame();
diff --git a/player/js/elements/ImageElement.js b/player/js/elements/ImageElement.js
index a391222..4f3287a 100644
--- a/player/js/elements/ImageElement.js
+++ b/player/js/elements/ImageElement.js
@@ -26,13 +26,6 @@
 
 };
 
-IImageElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        this.hidden = true;
-    }
-};
-
 IImageElement.prototype.renderFrame = function(parentMatrix){
     var renderParent = this._parent.renderFrame.call(this,parentMatrix);
     if(renderParent===false){
@@ -40,8 +33,7 @@
         return;
     }
     if(this.hidden){
-        this.hidden = false;
-        this.layerElement.style.display = 'block';
+        this.show();
     }
     if(this.firstFrame){
         this.firstFrame = false;
diff --git a/player/js/elements/ShapeElement.js b/player/js/elements/ShapeElement.js
index 0f0d64a..51cc575 100644
--- a/player/js/elements/ShapeElement.js
+++ b/player/js/elements/ShapeElement.js
@@ -10,6 +10,8 @@
 }
 createElement(SVGBaseElement, IShapeElement);
 
+IShapeElement.prototype.identityMatrix = new Matrix();
+
 IShapeElement.prototype.lcEnum = {
     '1': 'butt',
     '2': 'round',
@@ -466,6 +468,24 @@
 
 };
 
+IShapeElement.prototype.buildShapeString = function(pathNodes, length, closed, mat) {
+    var i, shapeString = '';
+    for(i = 1; i < length; i += 1) {
+        if (i === 1) {
+            shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+        }
+        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
+    }
+    if (length === 1) {
+        shapeString += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+    }
+    if (closed && length) {
+        shapeString += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
+        shapeString += 'z';
+    }
+    return shapeString;
+};
+
 IShapeElement.prototype.renderPath = function(pathData,itemData){
     var len, i, j, jLen,pathStringTransformed,redraw,pathNodes,l, lLen = itemData.elements.length;
     var lvl = itemData.lvl;
@@ -493,20 +513,7 @@
                     for(j=0;j<jLen;j+=1){
                         pathNodes = paths.shapes[j];
                         if(pathNodes && pathNodes._length){
-                            len = pathNodes._length;
-                            for (i = 1; i < len; i += 1) {
-                                if (i == 1) {
-                                    pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                                }
-                                pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-                            }
-                            if (len == 1) {
-                                pathStringTransformed += " M" + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                            }
-                            if (pathNodes.c) {
-                                pathStringTransformed += " C" + mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                                pathStringTransformed += 'z';
-                            }
+                            pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat);
                         }
                     }
                     itemData.caches[l] = pathStringTransformed;
@@ -518,24 +525,7 @@
                     for(j=0;j<jLen;j+=1){
                         pathNodes = paths.shapes[j];
                         if(pathNodes && pathNodes._length){
-                            len = pathNodes._length;
-                            for (i = 1; i < len; i += 1) {
-                                if (i == 1) {
-                                    //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                                    pathStringTransformed += " M" + pathNodes.v[0].join(',');
-                                }
-                                //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[i][0], pathNodes.i[i][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[i][0], pathNodes.v[i][1]);
-                                pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[i].join(',') + " " + pathNodes.v[i].join(',');
-                            }
-                            if (len == 1) {
-                                //pathStringTransformed += " M" + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                                pathStringTransformed += " M" + pathNodes.v[0].join(',');
-                            }
-                            if (pathNodes.c && len) {
-                                //pathStringTransformed += " C" + groupTransform.mat.applyToPointStringified(pathNodes.o[i - 1][0], pathNodes.o[i - 1][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.i[0][0], pathNodes.i[0][1]) + " " + groupTransform.mat.applyToPointStringified(pathNodes.v[0][0], pathNodes.v[0][1]);
-                                pathStringTransformed += " C" + pathNodes.o[i - 1].join(',') + " " + pathNodes.i[0].join(',') + " " + pathNodes.v[0].join(',');
-                                pathStringTransformed += 'z';
-                            }
+                            pathStringTransformed += this.buildShapeString(pathNodes, pathNodes._length, pathNodes.c, this.identityMatrix);
                         }
                     }
                     itemData.caches[l] = pathStringTransformed;
@@ -549,7 +539,6 @@
             itemData.elements[l].mdf = true;
         }
     }
-
 };
 
 IShapeElement.prototype.renderFill = function(styleData,itemData){
diff --git a/player/js/elements/SolidElement.js b/player/js/elements/SolidElement.js
index 40e335b..7330be6 100644
--- a/player/js/elements/SolidElement.js
+++ b/player/js/elements/SolidElement.js
@@ -23,6 +23,5 @@
     }
 };
 
-ISolidElement.prototype.hide = IImageElement.prototype.hide;
 ISolidElement.prototype.renderFrame = IImageElement.prototype.renderFrame;
 ISolidElement.prototype.destroy = IImageElement.prototype.destroy;
diff --git a/player/js/elements/TextElement.js b/player/js/elements/TextElement.js
index e39239e..e7fba20 100644
--- a/player/js/elements/TextElement.js
+++ b/player/js/elements/TextElement.js
@@ -113,8 +113,9 @@
     var k, kLen, pathNodes;
     var shapeStr = '';
     for(j=0;j<jLen;j+=1){
-        kLen = shapes[j].ks.k.i.length;
         pathNodes = shapes[j].ks.k;
+        shapeStr += this.buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper);
+        /*kLen = pathNodes.i.length;
         for(k=1;k<kLen;k+=1){
             if(k==1){
                 shapeStr += " M"+matrixHelper.applyToPointStringified(pathNodes.v[0][0],pathNodes.v[0][1]);
@@ -122,7 +123,7 @@
             shapeStr += " C"+matrixHelper.applyToPointStringified(pathNodes.o[k-1][0],pathNodes.o[k-1][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.i[k][0],pathNodes.i[k][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.v[k][0],pathNodes.v[k][1]);
         }
         shapeStr += " C"+matrixHelper.applyToPointStringified(pathNodes.o[k-1][0],pathNodes.o[k-1][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.i[0][0],pathNodes.i[0][1]) + " "+matrixHelper.applyToPointStringified(pathNodes.v[0][0],pathNodes.v[0][1]);
-        shapeStr += 'z';
+        shapeStr += 'z';*/
     }
     return shapeStr;
 };
@@ -586,4 +587,6 @@
     }
 };
 
+ITextElement.prototype.buildShapeString = IShapeElement.prototype.buildShapeString;
+
 ITextElement.prototype.emptyProp = new LetterProps();
diff --git a/player/js/elements/htmlElements/HSolidElement.js b/player/js/elements/htmlElements/HSolidElement.js
index dded87e..c2a0fe7 100644
--- a/player/js/elements/htmlElements/HSolidElement.js
+++ b/player/js/elements/htmlElements/HSolidElement.js
@@ -35,6 +35,7 @@
 
 
 
-HSolidElement.prototype.hide = IImageElement.prototype.hide;
+HSolidElement.prototype.hide = SVGBaseElement.prototype.hide;
+HSolidElement.prototype.show = SVGBaseElement.prototype.show;
 HSolidElement.prototype.renderFrame = IImageElement.prototype.renderFrame;
 HSolidElement.prototype.destroy = IImageElement.prototype.destroy;
\ No newline at end of file
diff --git a/player/js/elements/svgElements/SVGBaseElement.js b/player/js/elements/svgElements/SVGBaseElement.js
index aaa344f..e0de310 100644
--- a/player/js/elements/svgElements/SVGBaseElement.js
+++ b/player/js/elements/svgElements/SVGBaseElement.js
@@ -4,6 +4,7 @@
     this.data = data;
     this.matteElement = null;
     this.transformedElement = null;
+    this.isTransparent = false;
     this.parentContainer = parentContainer;
     this.layerId = placeholder ? placeholder.layerId : 'ly_'+randomString(10);
     this.placeholder = placeholder;
@@ -251,6 +252,15 @@
         this.transformedElement.setAttribute('transform',finalMat.to2dCSS());
     }
     if(this.finalTransform.opMdf && this.layerElement){
+        if(this.finalTransform.op.v <= 0) {
+            if(!this.isTransparent && this.globalData.renderConfig.hideOnTransparent){
+                this.isTransparent = true;
+                this.hide();
+            }
+        } else if(this.hidden && this.isTransparent){
+            this.isTransparent = false;
+            this.show();
+        }
         this.transformedElement.setAttribute('opacity',this.finalTransform.op.v);
     }
 
@@ -296,5 +306,15 @@
 };
 
 SVGBaseElement.prototype.hide = function(){
+    if(!this.hidden){
+        this.layerElement.style.display = 'none';
+        this.hidden = true;
+    }
+};
 
+SVGBaseElement.prototype.show = function(){
+    if(this.isVisible && !this.isTransparent){
+        this.hidden = false;
+        this.layerElement.style.display = 'block';
+    }
 };
diff --git a/player/js/elements/svgElements/SVGTextElement.js b/player/js/elements/svgElements/SVGTextElement.js
index 8b3c408..bebb0f5 100644
--- a/player/js/elements/svgElements/SVGTextElement.js
+++ b/player/js/elements/svgElements/SVGTextElement.js
@@ -9,6 +9,7 @@
 SVGTextElement.prototype.createPathShape = ITextElement.prototype.createPathShape;
 SVGTextElement.prototype.getMeasures = ITextElement.prototype.getMeasures;
 SVGTextElement.prototype.prepareFrame = ITextElement.prototype.prepareFrame;
+SVGTextElement.prototype.buildShapeString = ITextElement.prototype.buildShapeString;
 
 SVGTextElement.prototype.createElements = function(){
 
@@ -131,7 +132,7 @@
             }
         }
         if(singleShape) {
-            xPos += letters[i].l;
+            xPos += letters[i].l || 0;
             xPos += documentData.tr/1000*documentData.s;
         }
         //
@@ -150,13 +151,6 @@
     }
 }
 
-SVGTextElement.prototype.hide = function(){
-    if(!this.hidden){
-        this.layerElement.style.display = 'none';
-        this.hidden = true;
-    }
-};
-
 SVGTextElement.prototype.renderFrame = function(parentMatrix){
 
     var renderParent = this._parent.renderFrame.call(this,parentMatrix);
@@ -165,8 +159,7 @@
         return;
     }
     if(this.hidden){
-        this.hidden = false;
-        this.layerElement.style.display = 'block';
+        this.show();
     }
 
     if(this.data.singleShape){
diff --git a/player/js/module.js b/player/js/module.js
index 99cae5b..a70d47b 100644
--- a/player/js/module.js
+++ b/player/js/module.js
@@ -119,7 +119,7 @@
     bodymovinjs.setQuality = setQuality;
     bodymovinjs.installPlugin = installPlugin;
     bodymovinjs.__getFactory = getFactory;
-    bodymovinjs.version = '4.1.9';
+    bodymovinjs.version = '4.8.0';
 
     function checkReady(){
         if (document.readyState === "complete") {
diff --git a/player/js/renderers/SVGRenderer.js b/player/js/renderers/SVGRenderer.js
index 5b6bacd..5f6760f 100644
--- a/player/js/renderers/SVGRenderer.js
+++ b/player/js/renderers/SVGRenderer.js
@@ -7,8 +7,10 @@
     };
     this.renderConfig = {
         preserveAspectRatio: (config && config.preserveAspectRatio) || 'xMidYMid meet',
-        progressiveLoad: (config && config.progressiveLoad) || false
+        progressiveLoad: (config && config.progressiveLoad) || false,
+        hideOnTransparent: (config && config.hideOnTransparent === false) ? false : true
     };
+    this.globalData.renderConfig = this.renderConfig;
     this.elements = [];
     this.pendingElements = [];
     this.destroyed = false;
diff --git a/player/js/utils/DataManager.js b/player/js/utils/DataManager.js
index a2765fa..5b3375b 100644
--- a/player/js/utils/DataManager.js
+++ b/player/js/utils/DataManager.js
@@ -169,6 +169,28 @@
         }
     }())
 
+    var checkChars = (function() {
+        var minimumVersion = [4,7,99];
+        return function (animationData){
+            if(animationData.chars && !checkVersion(minimumVersion,animationData.v)){
+                var i, len = animationData.chars.length, j, jLen, k, kLen;
+                var pathData, paths;
+                for(i = 0; i < len; i += 1) {
+                    if(animationData.chars[i].data && animationData.chars[i].data.shapes) {
+                        paths = animationData.chars[i].data.shapes[0].it;
+                        jLen = paths.length;
+
+                        for(j = 0; j < jLen; j += 1) {
+                            pathData = paths[j].ks.k;
+                            convertPathsToAbsoluteValues(paths[j].ks.k);
+                        }
+                    }
+                }
+            }
+        }
+
+    }())
+
     var checkColors = (function(){
         var minimumVersion = [4,1,9];
 
@@ -465,6 +487,7 @@
         }
         checkColors(animationData);
         checkText(animationData);
+        checkChars(animationData);
         checkShapes(animationData);
         completeLayers(animationData.layers, animationData.assets, fontManager);
         animationData.__complete = true;
diff --git a/player/js/utils/PropertyFactory.js b/player/js/utils/PropertyFactory.js
index 40ba8fa..b3a110d 100644
--- a/player/js/utils/PropertyFactory.js
+++ b/player/js/utils/PropertyFactory.js
@@ -265,7 +265,11 @@
 
     var TransformProperty = (function() {
         function positionGetter() {
-            return ExpressionValue(this.p);
+            if(this.p) {
+                return ExpressionValue(this.p);
+            } else {
+                return [this.px.v, this.py.v, this.pz ? this.pz.v : 0];
+            }
         }
         function xPositionGetter() {
             return ExpressionValue(this.px);
@@ -283,7 +287,11 @@
             return ExpressionValue(this.or);
         }
         function rotationGetter() {
-            return ExpressionValue(this.r, 1/degToRads);
+            if(this.r) {
+                return ExpressionValue(this.r, 1/degToRads);
+            } else {
+                return ExpressionValue(this.rz, 1/degToRads);
+            }
         }
         function scaleGetter() {
             return ExpressionValue(this.s, 100);
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
index 8dc7392..4ab966d 100644
--- a/player/js/utils/bez.js
+++ b/player/js/utils/bez.js
@@ -9,6 +9,9 @@
     }
 
     function pointOnLine3D(x1,y1,z1, x2,y2,z2, x3,y3,z3){
+        if(z1 === 0 && z2 === 0 && z3 === 0) {
+            return pointOnLine2D(x1,y1, x2,y2, x3,y3);
+        }
         var dist1 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2) + Math.pow(z2 - z1, 2));
         var dist2 = Math.sqrt(Math.pow(x3 - x1, 2) + Math.pow(y3 - y1, 2) + Math.pow(z3 - z1, 2));
         var dist3 = Math.sqrt(Math.pow(x3 - x2, 2) + Math.pow(y3 - y2, 2) + Math.pow(z3 - z2, 2));
diff --git a/player/js/utils/expressions/ExpressionManager.js b/player/js/utils/expressions/ExpressionManager.js
index d415103..41ea8ec 100644
--- a/player/js/utils/expressions/ExpressionManager.js
+++ b/player/js/utils/expressions/ExpressionManager.js
@@ -327,6 +327,7 @@
         var fn = new Function();
         //var fnStr = 'var fn = function(){'+val+';this.v = $bm_rt;}';
         //eval(fnStr);
+
         var fn = eval('[function(){' + val+';this.v = $bm_rt;}' + ']')[0];
         var bindedFn = fn.bind(this);
         var numKeys = property.kf ? data.k.length : 0;
@@ -626,13 +627,13 @@
             if(!thisLayer){
                 thisLayer = elem.layerInterface;
                 thisComp = elem.comp.compInterface;
-                 toWorld = thisLayer.toWorld.bind(thisLayer);
-                 fromWorld = thisLayer.fromWorld.bind(thisLayer);
+                toWorld = thisLayer.toWorld.bind(thisLayer);
+                fromWorld = thisLayer.fromWorld.bind(thisLayer);
             }
             if(!transform){
                 transform = elem.layerInterface("ADBE Transform Group");
+                anchorPoint = transform.anchorPoint;
             }
-            anchorPoint = transform.anchorPoint
             
             if(elemType === 4 && !content){
                 content = thisLayer("ADBE Root Vectors Group");
@@ -653,7 +654,6 @@
             if(needsVelocity){
                 velocity = velocityAtTime(time);
             }
-
             bindedFn();
             this.frameExpressionId = elem.globalData.frameId;
             var i,len;
diff --git a/player/js/utils/expressions/ExpressionValue.js b/player/js/utils/expressions/ExpressionValue.js
index 4cdbf33..25ba1a3 100644
--- a/player/js/utils/expressions/ExpressionValue.js
+++ b/player/js/utils/expressions/ExpressionValue.js
@@ -1,6 +1,7 @@
 var ExpressionValue = (function() {
 	return function(elementProp, mult, type) {
         var expressionValue, arrayValue;
+
 		if (elementProp.k) {
             elementProp.getValue();
         }
diff --git a/player/js/utils/expressions/LayerInterface.js b/player/js/utils/expressions/LayerInterface.js
index 335437f..59fb53f 100644
--- a/player/js/utils/expressions/LayerInterface.js
+++ b/player/js/utils/expressions/LayerInterface.js
@@ -74,6 +74,7 @@
                 case 2:
                     return _thisLayerFunction.shapeInterface;
                 case 1:
+                case 6:
                 case "Transform":
                 case "transform":
                 case "ADBE Transform Group":
diff --git a/player/js/utils/expressions/ShapeInterface.js b/player/js/utils/expressions/ShapeInterface.js
index a3b01db..ceaf41f 100644
--- a/player/js/utils/expressions/ShapeInterface.js
+++ b/player/js/utils/expressions/ShapeInterface.js
@@ -617,20 +617,8 @@
                 if(shape.r.ix === value){
                     return interfaceFunction.rotation;
                 }
-                if(shape.pt.ix === value){
-                    return interfaceFunction.points;
-                }
-                if(shape.or.ix === value || 'ADBE Vector Star Outer Radius' === value){
-                    return interfaceFunction.outerRadius;
-                }
-                if(shape.os.ix === value){
-                    return interfaceFunction.outerRoundness;
-                }
-                if(shape.ir && (shape.ir.ix === value || 'ADBE Vector Star Inner Radius' === value)){
-                    return interfaceFunction.innerRadius;
-                }
-                if(shape.is && shape.is.ix === value){
-                    return interfaceFunction.innerRoundness;
+                if(shape.s.ix === value || value === 'Size'){
+                    return interfaceFunction.size;
                 }
 
             }
diff --git a/player/js/utils/expressions/TransformInterface.js b/player/js/utils/expressions/TransformInterface.js
index 71c6e88..dc549b2 100644
--- a/player/js/utils/expressions/TransformInterface.js
+++ b/player/js/utils/expressions/TransformInterface.js
@@ -5,23 +5,28 @@
                 case "scale":
                 case "Scale":
                 case "ADBE Scale":
+                case 6:
                     return _thisFunction.scale;
                 case "rotation":
                 case "Rotation":
                 case "ADBE Rotation":
                 case "ADBE Rotate Z":
+                case 10:
                     return _thisFunction.rotation;
                 case "position":
                 case "Position":
                 case "ADBE Position":
+                case 2:
                     return transform.position;
                 case "anchorPoint":
                 case "AnchorPoint":
                 case "Anchor Point":
                 case "ADBE AnchorPoint":
+                case 1:
                     return _thisFunction.anchorPoint;
                 case "opacity":
                 case "Opacity":
+                case 11:
                     return _thisFunction.opacity;
             }
         }
