(typeof navigator !== "undefined") && (function(root, factory) {
    if (typeof define === "function" && define.amd) {
        define(function() {
            return factory(root);
        });
    } else if (typeof module === "object" && module.exports) {
        module.exports = factory(root);
    } else {
        root.lottie = factory(root);
        root.bodymovin = root.lottie;
    }
}((window || {}), function(window) {
	"use strict";var h,k="",s=-999999,e=!0,n=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),_=Math.pow,C=Math.sqrt,f=Math.floor,m=(Math.max,Math.min),i={};!function(){var t,e=["abs","acos","acosh","asin","asinh","atan","atanh","atan2","ceil","cbrt","expm1","clz32","cos","cosh","exp","floor","fround","hypot","imul","log","log1p","log2","log10","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc","E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"],s=e.length;for(t=0;t<s;t+=1)i[e[t]]=Math[e[t]]}(),i.random=Math.random,i.abs=function(t){if("object"===typeof t&&t.length){var e,s=x(t.length),i=t.length;for(e=0;e<i;e+=1)s[e]=Math.abs(t[e]);return s}return Math.abs(t)};var D=150,B=Math.PI/180,v=.5519;function a(t){t?Math.round:function(t){return t}}function r(t,e,s,i){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=i<0?-1:1}function o(t,e){this.type=t,this.direction=e<0?-1:1}function l(t,e,s,i){this.type=t,this.currentLoop=s,this.totalLoops=e,this.direction=i<0?-1:1}function p(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function d(t,e){this.type=t,this.target=e}function c(t,e){this.type="renderFrameError",this.nativeError=t,this.currentTime=e}function u(t){this.type="configError",this.nativeError=t}a(!1);var t,S=(t=0,function(){return"__lottie_element_"+(t+=1)});function g(t,e,s){var i,a,r,n,h,o,l,p;switch(o=s*(1-e),l=s*(1-(h=6*t-(n=Math.floor(6*t)))*e),p=s*(1-(1-h)*e),n%6){case 0:i=s,a=p,r=o;break;case 1:i=l,a=s,r=o;break;case 2:i=o,a=s,r=p;break;case 3:i=o,a=l,r=s;break;case 4:i=p,a=o,r=s;break;case 5:i=s,a=o,r=l}return[i,a,r]}function y(t,e,s){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*(e<s?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 lt(t,e){var s=y(255*t[0],255*t[1],255*t[2]);return s[1]+=e,1<s[1]?s[1]=1:s[1]<=0&&(s[1]=0),g(s[0],s[1],s[2])}function pt(t,e){var s=y(255*t[0],255*t[1],255*t[2]);return s[2]+=e,1<s[2]?s[2]=1:s[2]<0&&(s[2]=0),g(s[0],s[1],s[2])}function ft(t,e){var s=y(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,1<s[0]?s[0]-=1:s[0]<0&&(s[0]+=1),g(s[0],s[1],s[2])}!function(){var t,e,s=[];for(t=0;t<256;t+=1)e=t.toString(16),s[t]=1===e.length?"0"+e:e}();function b(){}b.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,i=0;i<s;i+=1)this._cbs[t][i](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var s=0,i=this._cbs[t].length;s<i;)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}};var j=function(){function s(t,e){var s,i=0,a=[];switch(t){case"int16":case"uint8c":s=1;break;default:s=1.1}for(i=0;i<e;i+=1)a.push(s);return a}return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):s(t,e)}:s}();function x(t){return Array.apply(null,{length:t})}function P(t){return document.createElement(t)}function w(){}w.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){var t;this._mdf=!1;var e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var T,A=(T={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},function(t){return T[t]||""}),E=function(){var a=Math.cos,r=Math.sin,n=Math.tan,i=Math.round;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=a(t),s=r(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=a(t),s=r(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function h(t){if(0===t)return this;var e=a(t),s=r(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function o(t){if(0===t)return this;var e=a(t),s=r(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function l(t,e){return this._t(1,e,t,1,0,0)}function p(t,e){return this.shear(n(t),n(e))}function f(t,e){var s=a(e),i=r(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,n(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 m(t,e,s){return s||0===s||(s=1),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 d(t,e,s,i,a,r,n,h,o,l,p,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]=l,this.props[10]=p,this.props[11]=f,this.props[12]=m,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function c(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 u(t,e,s,i,a,r,n,h,o,l,p,f,m,d,c,u){var g=this.props;if(1===t&&0===e&&0===s&&0===i&&0===a&&1===r&&0===n&&0===h&&0===o&&0===l&&1===p&&0===f)return g[12]=g[12]*t+g[15]*m,g[13]=g[13]*r+g[15]*d,g[14]=g[14]*p+g[15]*c,g[15]*=u,this._identityCalculated=!1,this;var y=g[0],v=g[1],b=g[2],_=g[3],C=g[4],k=g[5],D=g[6],S=g[7],x=g[8],P=g[9],w=g[10],T=g[11],A=g[12],F=g[13],M=g[14],I=g[15];return g[0]=y*t+v*a+b*o+_*m,g[1]=y*e+v*r+b*l+_*d,g[2]=y*s+v*n+b*p+_*c,g[3]=y*i+v*h+b*f+_*u,g[4]=C*t+k*a+D*o+S*m,g[5]=C*e+k*r+D*l+S*d,g[6]=C*s+k*n+D*p+S*c,g[7]=C*i+k*h+D*f+S*u,g[8]=x*t+P*a+w*o+T*m,g[9]=x*e+P*r+w*l+T*d,g[10]=x*s+P*n+w*p+T*c,g[11]=x*i+P*h+w*f+T*u,g[12]=A*t+F*a+M*o+I*m,g[13]=A*e+F*r+M*l+I*d,g[14]=A*s+F*n+M*p+I*c,g[15]=A*i+F*h+M*f+I*u,this._identityCalculated=!1,this}function g(){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 y(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function v(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e];return t}function b(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function _(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 C(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function k(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function D(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function S(){var t=this.props[0]*this.props[5]-this.props[1]*this.props[4],e=this.props[5]/t,s=-this.props[1]/t,i=-this.props[4]/t,a=this.props[0]/t,r=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/t,n=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/t,h=new E;return h.props[0]=e,h.props[1]=s,h.props[4]=i,h.props[5]=a,h.props[12]=r,h.props[13]=n,h}function x(t){return this.getInverseMatrix().applyToPointArray(t[0],t[1],t[2]||0)}function P(t){var e,s=t.length,i=[];for(e=0;e<s;e+=1)i[e]=x(t[e]);return i}function w(t,e,s){var i=j("float32",6);if(this.isIdentity())i[0]=t[0],i[1]=t[1],i[2]=e[0],i[3]=e[1],i[4]=s[0],i[5]=s[1];else{var a=this.props[0],r=this.props[1],n=this.props[4],h=this.props[5],o=this.props[12],l=this.props[13];i[0]=t[0]*a+t[1]*n+o,i[1]=t[0]*r+t[1]*h+l,i[2]=e[0]*a+e[1]*n+o,i[3]=e[0]*r+e[1]*h+l,i[4]=s[0]*a+s[1]*n+o,i[5]=s[0]*r+s[1]*h+l}return i}function T(t,e,s){return this.isIdentity()?[t,e,s]:[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){if(this.isIdentity())return t+","+e;var s=this.props;return Math.round(100*(t*s[0]+e*s[4]+s[12]))/100+","+Math.round(100*(t*s[1]+e*s[5]+s[13]))/100}function F(){for(var t=0,e=this.props,s="matrix3d(";t<16;)s+=i(1e4*e[t])/1e4,s+=15===t?")":",",t+=1;return s}function M(t){return t<1e-6&&0<t||-1e-6<t&&t<0?i(1e4*t)/1e4:t}function I(){var t=this.props;return"matrix("+M(t[0])+","+M(t[1])+","+M(t[4])+","+M(t[5])+","+M(t[12])+","+M(t[13])+")"}return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=h,this.rotateZ=o,this.skew=p,this.skewFromAxis=f,this.shear=l,this.scale=m,this.setTransform=d,this.translate=c,this.transform=u,this.applyToPoint=_,this.applyToX=C,this.applyToY=k,this.applyToZ=D,this.applyToPointArray=T,this.applyToTriplePoints=w,this.applyToPointStringified=A,this.toCSS=F,this.to2dCSS=I,this.clone=v,this.cloneFromProps=b,this.equals=y,this.inversePoints=P,this.inversePoint=x,this.getInverseMatrix=S,this._t=this.transform,this.isIdentity=g,this._identity=!0,this._identityCalculated=!1,this.props=j("float32",16),this.reset()}}();!function(h,o){var l,p=this,f=256,m=6,d="random",c=o.pow(f,m),u=o.pow(2,52),g=2*u,y=f-1;function v(t){var e,s=t.length,n=this,i=0,a=n.i=n.j=0,r=n.S=[];for(s||(t=[s++]);i<f;)r[i]=i++;for(i=0;i<f;i++)r[i]=r[a=y&a+t[i%s]+(e=r[i])],r[a]=e;n.g=function(t){for(var e,s=0,i=n.i,a=n.j,r=n.S;t--;)e=r[i=y&i+1],s=s*f+r[y&(r[i]=r[a=y&a+e])+(r[a]=e)];return n.i=i,n.j=a,s}}function b(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function _(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 C(e)}function C(t){return String.fromCharCode.apply(0,t)}o["seed"+d]=function(t,e,s){var i=[],a=_(function t(e,s){var i,a=[],r=typeof e;if(s&&"object"==r)for(i in e)try{a.push(t(e[i],s-1))}catch(t){}return a.length?a:"string"==r?e:e+"\0"}((e=!0===e?{entropy:!0}:e||{}).entropy?[t,C(h)]:null===t?function(){try{if(l)return C(l.randomBytes(f));var t=new Uint8Array(f);return(p.crypto||p.msCrypto).getRandomValues(t),C(t)}catch(t){var e=p.navigator,s=e&&e.plugins;return[+new Date,p,s,p.screen,C(h)]}}():t,3),i),r=new v(i),n=function(){for(var t=r.g(m),e=c,s=0;t<u;)t=(t+s)*f,e*=f,s=r.g(1);for(;g<=t;)t/=2,e/=2,s>>>=1;return(t+s)/e};return n.int32=function(){return 0|r.g(4)},n.quick=function(){return r.g(4)/4294967296},n.double=n,_(C(r.S),h),(e.pass||s||function(t,e,s,i){return i&&(i.S&&b(i,r),t.state=function(){return b(r,{})}),s?(o[d]=t,e):t})(n,a,"global"in e?e.global:this==o,e.state)},_(o.random(),h)}([],i);var W=function(){var t={getBezierEasing:function(t,e,s,i,a){var r=a||("bez_"+t+"_"+e+"_"+s+"_"+i).replace(/\./g,"p");if(h[r])return h[r];var n=new o([t,e,s,i]);return h[r]=n}},h={};var l=11,p=1/(l-1),e="function"==typeof Float32Array;function i(t,e){return 1-3*e+3*t}function a(t,e){return 3*e-6*t}function r(t){return 3*t}function f(t,e,s){return((i(e,s)*t+a(e,s))*t+r(e))*t}function m(t,e,s){return 3*i(e,s)*t*t+2*a(e,s)*t+r(e)}function o(t){this._p=t,this._mSampleValues=e?new Float32Array(l):new Array(l),this._precomputed=!1,this.get=this.get.bind(this)}return o.prototype={get:function(t){var e=this._p[0],s=this._p[1],i=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===s&&i===a?t:0===t?0:1===t?1:f(this._getTForX(t),s,a)},_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;s<l;++s)this._mSampleValues[s]=f(s*p,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],i=this._mSampleValues,a=0,r=1,n=l-1;r!==n&&i[r]<=t;++r)a+=p;var h=a+(t-i[--r])/(i[r+1]-i[r])*p,o=m(h,e,s);return.001<=o?function(t,e,s,i){for(var a=0;a<4;++a){var r=m(e,s,i);if(0===r)return e;e-=(f(e,s,i)-t)/r}return e}(t,h,e,s):0===o?h:function(t,e,s,i,a){for(var r,n,h=0;0<(r=f(n=e+(s-e)/2,i,a)-t)?s=n:e=n,1e-7<Math.abs(r)&&++h<10;);return n}(t,a,a+p,e,s)}},t}();function F(t,e){var s,i,a=t.length;for(s=0;s<a;s+=1)for(var r in i=t[s].prototype)Object.prototype.hasOwnProperty.call(i,r)&&(e.prototype[r]=i[r])}!function(){for(var a=0,t=["ms","moz","webkit","o"],e=0;e<t.length&&!window.requestAnimationFrame;++e)window.requestAnimationFrame=window[t[e]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[t[e]+"CancelAnimationFrame"]||window[t[e]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(t){var e=(new Date).getTime(),s=Math.max(0,16-(e-a)),i=setTimeout(function(){t(e+s)},s);return a=e+s,i}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var mt=function(){var A=Math;function g(t,e,s,i,a,r){var n=t*i+e*a+s*r-a*i-r*t-s*e;return-.001<n&&n<.001}var p=function(t,e,s,i){var a,r,n,h,o,l,p=D,f=0,m=[],d=[],c=wt.newElement();for(n=s.length,a=0;a<p;a+=1){for(o=a/(p-1),r=l=0;r<n;r+=1)h=_(1-o,3)*t[r]+3*_(1-o,2)*o*s[r]+3*(1-o)*_(o,2)*i[r]+_(o,3)*e[r],m[r]=h,null!==d[r]&&(l+=_(m[r]-d[r],2)),d[r]=m[r];l&&(f+=l=C(l)),c.percents[a]=o,c.lengths[a]=f}return c.addedLength=f,c};function y(t){this.segmentLength=0,this.points=new Array(t)}function v(t,e){this.partialLength=t,this.point=e}var b,t=(b={},function(t,e,s,i){var a=(t[0]+"_"+t[1]+"_"+e[0]+"_"+e[1]+"_"+s[0]+"_"+s[1]+"_"+i[0]+"_"+i[1]).replace(/\./g,"p");if(!b[a]){var r,n,h,o,l,p,f,m=D,d=0,c=null;2===t.length&&(t[0]!==e[0]||t[1]!==e[1])&&g(t[0],t[1],e[0],e[1],t[0]+s[0],t[1]+s[1])&&g(t[0],t[1],e[0],e[1],e[0]+i[0],e[1]+i[1])&&(m=2);var u=new y(m);for(h=s.length,r=0;r<m;r+=1){for(f=x(h),l=r/(m-1),n=p=0;n<h;n+=1)o=_(1-l,3)*t[n]+3*_(1-l,2)*l*(t[n]+s[n])+3*(1-l)*_(l,2)*(e[n]+i[n])+_(l,3)*e[n],f[n]=o,null!==c&&(p+=_(f[n]-c[n],2));d+=p=C(p),u.points[r]=new v(p,f),c=f}u.segmentLength=d,b[a]=u}return b[a]});function F(t,e){var s=e.percents,i=e.lengths,a=s.length,r=f((a-1)*t),n=t*e.addedLength,h=0;if(r===a-1||0===r||n===i[r])return s[r];for(var o=i[r]>n?-1:1,l=!0;l;)if(i[r]<=n&&i[r+1]>n?(h=(n-i[r])/(i[r+1]-i[r]),l=!1):r+=o,r<0||a-1<=r){if(r===a-1)return s[r];l=!1}return s[r]+(s[r+1]-s[r])*h}var M=j("float32",8);return{getSegmentsLength:function(t){var e,s=Pt.newElement(),i=t.c,a=t.v,r=t.o,n=t.i,h=t._length,o=s.lengths,l=0;for(e=0;e<h-1;e+=1)o[e]=p(a[e],a[e+1],r[e],n[e+1]),l+=o[e].addedLength;return i&&h&&(o[e]=p(a[e],a[0],r[e],n[0]),l+=o[e].addedLength),s.totalLength=l,s},getNewSegment:function(t,e,s,i,a,r,n){a<0?a=0:1<a&&(a=1);var h,o=F(a,n),l=F(r=1<r?1:r,n),p=t.length,f=1-o,m=1-l,d=f*f*f,c=o*f*f*3,u=o*o*f*3,g=o*o*o,y=f*f*m,v=o*f*m+f*o*m+f*f*l,b=o*o*m+f*o*l+o*f*l,_=o*o*l,C=f*m*m,k=o*m*m+f*l*m+f*m*l,D=o*l*m+f*l*l+o*m*l,S=o*l*l,x=m*m*m,P=l*m*m+m*l*m+m*m*l,w=l*l*m+m*l*l+l*m*l,T=l*l*l;for(h=0;h<p;h+=1)M[4*h]=A.round(1e3*(d*t[h]+c*s[h]+u*i[h]+g*e[h]))/1e3,M[4*h+1]=A.round(1e3*(y*t[h]+v*s[h]+b*i[h]+_*e[h]))/1e3,M[4*h+2]=A.round(1e3*(C*t[h]+k*s[h]+D*i[h]+S*e[h]))/1e3,M[4*h+3]=A.round(1e3*(x*t[h]+P*s[h]+w*i[h]+T*e[h]))/1e3;return M},getPointInSegment:function(t,e,s,i,a,r){var n=F(a,r),h=1-n;return[A.round(1e3*(h*h*h*t[0]+(n*h*h+h*n*h+h*h*n)*s[0]+(n*n*h+h*n*n+n*h*n)*i[0]+n*n*n*e[0]))/1e3,A.round(1e3*(h*h*h*t[1]+(n*h*h+h*n*h+h*h*n)*s[1]+(n*n*h+h*n*n+n*h*n)*i[1]+n*n*n*e[1]))/1e3]},buildBezierData:t,pointOnLine2D:g,pointOnLine3D:function(t,e,s,i,a,r,n,h,o){if(0===s&&0===r&&0===o)return g(t,e,i,a,n,h);var l,p=A.sqrt(A.pow(i-t,2)+A.pow(a-e,2)+A.pow(r-s,2)),f=A.sqrt(A.pow(n-t,2)+A.pow(h-e,2)+A.pow(o-s,2)),m=A.sqrt(A.pow(n-i,2)+A.pow(h-a,2)+A.pow(o-r,2));return-1e-4<(l=f<p?m<p?p-f-m:m-f-p:f<m?m-f-p:f-p-m)&&l<1e-4}}}();var M=function(){function m(t,e,s){var i,a,r,n,h,o,l,p=t.length;for(a=0;a<p;a+=1)if("ks"in(i=t[a])&&!i.completed){if(i.completed=!0,i.tt&&(t[a-1].td=i.tt),i.hasMask){var f=i.masksProperties;for(n=f.length,r=0;r<n;r+=1)if(f[r].pt.k.i)u(f[r].pt.k);else for(o=f[r].pt.k.length,h=0;h<o;h+=1)f[r].pt.k[h].s&&u(f[r].pt.k[h].s[0]),f[r].pt.k[h].e&&u(f[r].pt.k[h].e[0])}0===i.ty?(i.layers=d(i.refId,e),m(i.layers,e,s)):4===i.ty?c(i.shapes):5===i.ty&&(0!==(l=i).t.a.length||"m"in l.t.p||(l.singleShape=!0))}}function d(t,e){for(var s=0,i=e.length;s<i;){if(e[s].id===t)return e[s].layers.__used?JSON.parse(JSON.stringify(e[s].layers)):(e[s].layers.__used=!0,e[s].layers);s+=1}return null}function c(t){var e,s,i;for(e=t.length-1;0<=e;e-=1)if("sh"===t[e].ty)if(t[e].ks.k.i)u(t[e].ks.k);else for(i=t[e].ks.k.length,s=0;s<i;s+=1)t[e].ks.k[s].s&&u(t[e].ks.k[s].s[0]),t[e].ks.k[s].e&&u(t[e].ks.k[s].e[0]);else"gr"===t[e].ty&&c(t[e].it)}function u(t){var e,s=t.i.length;for(e=0;e<s;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 h(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]||!(s[0]>t[0])&&(t[1]>s[1]||!(s[1]>t[1])&&(t[2]>s[2]||!(s[2]>t[2])&&null))}var o,s=function(){var i=[4,4,14];function a(t){var e,s,i,a=t.length;for(e=0;e<a;e+=1)5===t[e].ty&&(s=t[e],i=s.t.d,s.t.d={k:[{s:i,t:0}]})}return function(t){if(h(i,t.v)&&(a(t.layers),t.assets)){var e,s=t.assets.length;for(e=0;e<s;e+=1)t.assets[e].layers&&a(t.assets[e].layers)}}}(),i=(o=[4,7,99],function(t){if(t.chars&&!h(o,t.v)){var e,s,i,a,r,n=t.chars.length;for(e=0;e<n;e+=1)if(t.chars[e].data&&t.chars[e].data.shapes)for(i=(r=t.chars[e].data.shapes[0].it).length,s=0;s<i;s+=1)(a=r[s].ks.k).__converted||(u(r[s].ks.k),a.__converted=!0)}}),a=function(){var i=[4,1,9];function r(t){var e,s,i,a=t.length;for(e=0;e<a;e+=1)if("gr"===t[e].ty)r(t[e].it);else if("fl"===t[e].ty||"st"===t[e].ty)if(t[e].c.k&&t[e].c.k[0].i)for(i=t[e].c.k.length,s=0;s<i;s+=1)t[e].c.k[s].s&&(t[e].c.k[s].s[0]/=255,t[e].c.k[s].s[1]/=255,t[e].c.k[s].s[2]/=255,t[e].c.k[s].s[3]/=255),t[e].c.k[s].e&&(t[e].c.k[s].e[0]/=255,t[e].c.k[s].e[1]/=255,t[e].c.k[s].e[2]/=255,t[e].c.k[s].e[3]/=255);else t[e].c.k[0]/=255,t[e].c.k[1]/=255,t[e].c.k[2]/=255,t[e].c.k[3]/=255}function a(t){var e,s=t.length;for(e=0;e<s;e+=1)4===t[e].ty&&r(t[e].shapes)}return function(t){if(h(i,t.v)&&(a(t.layers),t.assets)){var e,s=t.assets.length;for(e=0;e<s;e+=1)t.assets[e].layers&&a(t.assets[e].layers)}}}(),r=function(){var i=[4,4,18];function l(t){var e,s,i;for(e=t.length-1;0<=e;e-=1)if("sh"===t[e].ty)if(t[e].ks.k.i)t[e].ks.k.c=t[e].closed;else for(i=t[e].ks.k.length,s=0;s<i;s+=1)t[e].ks.k[s].s&&(t[e].ks.k[s].s[0].c=t[e].closed),t[e].ks.k[s].e&&(t[e].ks.k[s].e[0].c=t[e].closed);else"gr"===t[e].ty&&l(t[e].it)}function a(t){var e,s,i,a,r,n,h=t.length;for(s=0;s<h;s+=1){if((e=t[s]).hasMask){var o=e.masksProperties;for(a=o.length,i=0;i<a;i+=1)if(o[i].pt.k.i)o[i].pt.k.c=o[i].cl;else for(n=o[i].pt.k.length,r=0;r<n;r+=1)o[i].pt.k[r].s&&(o[i].pt.k[r].s[0].c=o[i].cl),o[i].pt.k[r].e&&(o[i].pt.k[r].e[0].c=o[i].cl)}4===e.ty&&l(e.shapes)}}return function(t){if(h(i,t.v)&&(a(t.layers),t.assets)){var e,s=t.assets.length;for(e=0;e<s;e+=1)t.assets[e].layers&&a(t.assets[e].layers)}}}();var t={completeData:function(t,e){t.__complete||(a(t),s(t),i(t),r(t),m(t.layers,t.assets,e),t.__complete=!0)}};return t.checkColors=a,t.checkChars=i,t.checkShapes=r,t.completeLayers=m,t}();function q(t){for(var e=t.fStyle?t.fStyle.split(" "):[],s="normal",i="normal",a=e.length,r=0;r<a;r+=1)switch(e[r].toLowerCase()){case"italic":i="italic";break;case"bold":s="700";break;case"black":s="900";break;case"medium":s="500";break;case"regular":case"normal":s="400";break;case"light":case"thin":s="200"}return{style:i,weight:t.fWeight||s}}var I=function(){var r={w:0,size:0,shapes:[]},t=[];function m(t,e){var s=P("span");s.style.fontFamily=e;var i=P("span");i.innerText="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=function(t){var e,s=t.split(","),i=s.length,a=[];for(e=0;e<i;e+=1)"sans-serif"!==s[e]&&"monospace"!==s[e]&&a.push(s[e]);return a.join(",")}(t)+", "+e,{node:i,w:a,parent:s}}function d(t,e){var s=createNS("text");s.style.fontSize="100px";var i=q(e);return s.setAttribute("font-family",e.fFamily),s.setAttribute("font-style",i.style),s.setAttribute("font-weight",i.weight),s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.setAttribute("class",e.fClass)):s.style.fontFamily=e.fFamily,t.appendChild(s),P("canvas").getContext("2d").font=e.fWeight+" "+e.fStyle+" 100px "+e.fFamily,s}t=t.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var e=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this._warned=!1,this.initTime=Date.now(),this.setIsLoadedBinded=this.setIsLoaded.bind(this),this.checkLoadedFontsBinded=this.checkLoadedFonts.bind(this)};return e.getCombinedCharacterCodes=function(){return t},e.prototype={addChars:function(t){if(t){var e;this.chars||(this.chars=[]);var s,i,a=t.length,r=this.chars.length;for(e=0;e<a;e+=1){for(s=0,i=!1;s<r;)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)}}},addFonts:function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);var s,i=t.list,a=i.length,r=a;for(s=0;s<a;s+=1){var n,h,o=!0;if(i[s].loaded=!1,i[s].monoCase=m(i[s].fFamily,"monospace"),i[s].sansCase=m(i[s].fFamily,"sans-serif"),i[s].fPath){if("p"===i[s].fOrigin||3===i[s].origin){if(0<(n=document.querySelectorAll('style[f-forigin="p"][f-family="'+i[s].fFamily+'"], style[f-origin="3"][f-family="'+i[s].fFamily+'"]')).length&&(o=!1),o){var l=P("style");l.setAttribute("f-forigin",i[s].fOrigin),l.setAttribute("f-origin",i[s].origin),l.setAttribute("f-family",i[s].fFamily),l.type="text/css",l.innerText="@font-face {font-family: "+i[s].fFamily+"; font-style: normal; src: url('"+i[s].fPath+"');}",e.appendChild(l)}}else if("g"===i[s].fOrigin||1===i[s].origin){for(n=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),h=0;h<n.length;h+=1)-1!==n[h].href.indexOf(i[s].fPath)&&(o=!1);if(o){var p=P("link");p.setAttribute("f-forigin",i[s].fOrigin),p.setAttribute("f-origin",i[s].origin),p.type="text/css",p.rel="stylesheet",p.href=i[s].fPath,document.body.appendChild(p)}}else if("t"===i[s].fOrigin||2===i[s].origin){for(n=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),h=0;h<n.length;h+=1)i[s].fPath===n[h].src&&(o=!1);if(o){var f=P("link");f.setAttribute("f-forigin",i[s].fOrigin),f.setAttribute("f-origin",i[s].origin),f.setAttribute("rel","stylesheet"),f.setAttribute("href",i[s].fPath),e.appendChild(f)}}}else i[s].loaded=!0,r-=1;i[s].helper=d(e,i[s]),i[s].cache={},this.fonts.push(i[s])}0===r?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},getCharData:function(t,e,s){for(var i=0,a=this.chars.length;i<a;){if(this.chars[i].ch===t&&this.chars[i].style===e&&this.chars[i].fFamily===s)return this.chars[i];i+=1}return("string"==typeof t&&13!==t.charCodeAt(0)||!t)&&console&&console.warn&&!this._warned&&(this._warned=!0,console.warn("Missing character from exported characters list: ",t,e,s)),r},getFontByName:function(t){for(var e=0,s=this.fonts.length;e<s;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},measureText:function(t,e,s){var i=this.getFontByName(e),a=t.charCodeAt(0);if(!i.cache[a+1]){var r=i.helper;if(" "===t){r.textContent="|"+t+"|";var n=r.getComputedTextLength();r.textContent="||";var h=r.getComputedTextLength();i.cache[a+1]=(n-h)/100}else r.textContent=t,i.cache[a+1]=r.getComputedTextLength()/100}return i.cache[a+1]*s},checkLoadedFonts:function(){var t,e,s,i=this.fonts.length,a=i;for(t=0;t<i;t+=1)this.fonts[t].loaded?a-=1:"n"===this.fonts[t].fOrigin||0===this.fonts[t].origin?this.fonts[t].loaded=!0:(e=this.fonts[t].monoCase.node,s=this.fonts[t].monoCase.w,e.offsetWidth!==s?(a-=1,this.fonts[t].loaded=!0):(e=this.fonts[t].sansCase.node,s=this.fonts[t].sansCase.w,e.offsetWidth!==s&&(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<5e3?setTimeout(this.checkLoadedFontsBinded,20):setTimeout(this.setIsLoadedBinded,10)},setIsLoaded:function(){this.isLoaded=!0}},e}(),L=function(){var f=s,a=Math.abs;function m(t,e){var s,i=this.offsetTime;"multidimensional"===this.propType&&(s=j("float32",this.pv.length));for(var a,r,n,h,o,l,p,f,m=e.lastIndex,d=m,c=this.keyframes.length-1,u=!0;u;){if(a=this.keyframes[d],r=this.keyframes[d+1],d===c-1&&t>=r.t-i){a.h&&(a=r),m=0;break}if(r.t-i>t){m=d;break}d<c-1?d+=1:(m=0,u=!1)}var g,y,v,b,_,C,k,D,S,x,P=r.t-i,w=a.t-i;if(a.to){a.bezierData||(a.bezierData=mt.buildBezierData(a.s,r.s||a.e,a.to,a.ti));var T=a.bezierData;if(P<=t||t<w){var A=P<=t?T.points.length-1:0;for(h=T.points[A].point.length,n=0;n<h;n+=1)s[n]=T.points[A].point[n]}else{a.__fnct?f=a.__fnct:(f=W.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,a.__fnct=f),o=f((t-w)/(P-w));var F,M=T.segmentLength*o,I=e.lastFrame<t&&e._lastKeyframeIndex===d?e._lastAddedLength:0;for(p=e.lastFrame<t&&e._lastKeyframeIndex===d?e._lastPoint:0,u=!0,l=T.points.length;u;){if(I+=T.points[p].partialLength,0===M||0===o||p===T.points.length-1){for(h=T.points[p].point.length,n=0;n<h;n+=1)s[n]=T.points[p].point[n];break}if(I<=M&&M<I+T.points[p+1].partialLength){for(F=(M-I)/T.points[p+1].partialLength,h=T.points[p].point.length,n=0;n<h;n+=1)s[n]=T.points[p].point[n]+(T.points[p+1].point[n]-T.points[p].point[n])*F;break}p<l-1?p+=1:u=!1}e._lastPoint=p,e._lastAddedLength=I-T.points[p].partialLength,e._lastKeyframeIndex=d}}else{var E,L,R,V,N;if(c=a.s.length,g=r.s||a.e,this.sh&&1!==a.h)if(P<=t)s[0]=g[0],s[1]=g[1],s[2]=g[2];else if(t<=w)s[0]=a.s[0],s[1]=a.s[1],s[2]=a.s[2];else{var z=q(a.s),O=q(g);y=s,v=function(t,e,s){var i,a,r,n,h,o=[],l=t[0],p=t[1],f=t[2],m=t[3],d=e[0],c=e[1],u=e[2],g=e[3];(a=l*d+p*c+f*u+m*g)<0&&(a=-a,d=-d,c=-c,u=-u,g=-g);h=1e-6<1-a?(i=Math.acos(a),r=Math.sin(i),n=Math.sin((1-s)*i)/r,Math.sin(s*i)/r):(n=1-s,s);return o[0]=n*l+h*d,o[1]=n*p+h*c,o[2]=n*f+h*u,o[3]=n*m+h*g,o}(z,O,(t-w)/(P-w)),b=v[0],_=v[1],C=v[2],k=v[3],D=Math.atan2(2*_*k-2*b*C,1-2*_*_-2*C*C),S=Math.asin(2*b*_+2*C*k),x=Math.atan2(2*b*k-2*_*C,1-2*b*b-2*C*C),y[0]=D/B,y[1]=S/B,y[2]=x/B}else for(d=0;d<c;d+=1)1!==a.h&&(o=P<=t?1:t<w?0:(a.o.x.constructor===Array?(a.__fnct||(a.__fnct=[]),a.__fnct[d]?f=a.__fnct[d]:(E=void 0===a.o.x[d]?a.o.x[0]:a.o.x[d],L=void 0===a.o.y[d]?a.o.y[0]:a.o.y[d],R=void 0===a.i.x[d]?a.i.x[0]:a.i.x[d],V=void 0===a.i.y[d]?a.i.y[0]:a.i.y[d],f=W.getBezierEasing(E,L,R,V).get,a.__fnct[d]=f)):a.__fnct?f=a.__fnct:(E=a.o.x,L=a.o.y,R=a.i.x,V=a.i.y,f=W.getBezierEasing(E,L,R,V).get,a.__fnct=f),f((t-w)/(P-w)))),g=r.s||a.e,N=1===a.h?a.s[d]:a.s[d]+(g[d]-a.s[d])*o,"multidimensional"===this.propType?s[d]=N:s=N}return e.lastIndex=m,s}function q(t){var e=t[0]*B,s=t[1]*B,i=t[2]*B,a=Math.cos(e/2),r=Math.cos(s/2),n=Math.cos(i/2),h=Math.sin(e/2),o=Math.sin(s/2),l=Math.sin(i/2);return[h*o*n+a*r*l,h*r*n+a*o*l,a*o*n-h*r*l,a*r*n-h*o*l]}function d(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(t===this._caching.lastFrame||this._caching.lastFrame!==f&&(this._caching.lastFrame>=s&&s<=t||this._caching.lastFrame<e&&t<e))){this._caching.lastFrame>=t&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var i=this.interpolateValue(t,this._caching);this.pv=i}return this._caching.lastFrame=t,this.pv}function c(t){var e;if("unidimensional"===this.propType)e=t*this.mult,1e-5<a(this.v-e)&&(this.v=e,this._mdf=!0);else for(var s=0,i=this.v.length;s<i;)e=t[s]*this.mult,1e-5<a(this.v[s]-e)&&(this.v[s]=e,this._mdf=!0),s+=1}function u(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t;this.lock=!0,this._mdf=this._isFirstFrame;var e=this.effectsSequence.length,s=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)s=this.effectsSequence[t](s);this.setVValue(s),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function g(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function n(t,e,s,i){this.propType="unidimensional",this.mult=s||1,this.data=e,this.v=s?e.k*s:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=u,this.setVValue=c,this.addEffect=g}function h(t,e,s,i){var a;this.propType="multidimensional",this.mult=s||1,this.data=e,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var r=e.k.length;for(this.v=j("float32",r),this.pv=j("float32",r),this.vel=j("float32",r),a=0;a<r;a+=1)this.v[a]=e.k[a]*this.mult,this.pv[a]=e.k[a];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=u,this.setVValue=c,this.addEffect=g}function o(t,e,s,i){this.propType="unidimensional",this.keyframes=e.k,this.offsetTime=t.data.st,this.frameId=-1,this._caching={lastFrame:f,lastIndex:0,value:0,_lastKeyframeIndex:-1},this.k=!0,this.kf=!0,this.data=e,this.mult=s||1,this.elem=t,this.container=i,this.comp=t.comp,this.v=f,this.pv=f,this._isFirstFrame=!0,this.getValue=u,this.setVValue=c,this.interpolateValue=m,this.effectsSequence=[d.bind(this)],this.addEffect=g}function l(t,e,s,i){var a;this.propType="multidimensional";var r,n,h,o,l=e.k.length;for(a=0;a<l-1;a+=1)e.k[a].to&&e.k[a].s&&e.k[a+1]&&e.k[a+1].s&&(r=e.k[a].s,n=e.k[a+1].s,h=e.k[a].to,o=e.k[a].ti,(2===r.length&&(r[0]!==n[0]||r[1]!==n[1])&&mt.pointOnLine2D(r[0],r[1],n[0],n[1],r[0]+h[0],r[1]+h[1])&&mt.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])&&mt.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])&&mt.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]))&&(e.k[a].to=null,e.k[a].ti=null),r[0]===n[0]&&r[1]===n[1]&&0===h[0]&&0===h[1]&&0===o[0]&&0===o[1]&&(2===r.length||r[2]===n[2]&&0===h[2]&&0===o[2])&&(e.k[a].to=null,e.k[a].ti=null));this.effectsSequence=[d.bind(this)],this.data=e,this.keyframes=e.k,this.offsetTime=t.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=s||1,this.elem=t,this.container=i,this.comp=t.comp,this.getValue=u,this.setVValue=c,this.interpolateValue=m,this.frameId=-1;var p=e.k[0].s.length;for(this.v=j("float32",p),this.pv=j("float32",p),a=0;a<p;a+=1)this.v[a]=f,this.pv[a]=f;this._caching={lastFrame:f,lastIndex:0,value:j("float32",p)},this.addEffect=g}return{getProp:function(t,e,s,i,a){var r;if(e.k.length)if("number"==typeof e.k[0])r=new h(t,e,i,a);else switch(s){case 0:r=new o(t,e,i,a);break;case 1:r=new l(t,e,i,a)}else r=new n(t,e,i,a);return r.effectsSequence.length&&a.addDynamicProperty(r),r}}}(),R=function(){var n=[0,0];function i(t,e,s){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new E,this.pre=new E,this.appliedTransformations=0,this.initDynamicPropertyContainer(s||t),e.p&&e.p.s?(this.px=L.getProp(t,e.p.x,0,0,this),this.py=L.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=L.getProp(t,e.p.z,0,0,this))):this.p=L.getProp(t,e.p||{k:[0,0,0]},1,0,this),e.rx){if(this.rx=L.getProp(t,e.rx,0,B,this),this.ry=L.getProp(t,e.ry,0,B,this),this.rz=L.getProp(t,e.rz,0,B,this),e.or.k[0].ti){var i,a=e.or.k.length;for(i=0;i<a;i+=1)e.or.k[i].to=null,e.or.k[i].ti=null}this.or=L.getProp(t,e.or,1,B,this),this.or.sh=!0}else this.r=L.getProp(t,e.r||{k:0},0,B,this);e.sk&&(this.sk=L.getProp(t,e.sk,0,B,this),this.sa=L.getProp(t,e.sa,0,B,this)),this.a=L.getProp(t,e.a||{k:[0,0,0]},1,0,this),this.s=L.getProp(t,e.s||{k:[100,100,100]},1,.01,this),e.o?this.o=L.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}return i.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,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.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),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])},getValue:function(t){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||t){var e;if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&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){var s,i;if(e=this.elem.globalData.frameRate,this.p&&this.p.keyframes&&this.p.getValueAtTime)i=this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(s=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/e,0),this.p.getValueAtTime(this.p.keyframes[0].t/e,0)):this.p._caching.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/e,0),this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.05)/e,0)):(s=this.p.pv,this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/e,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){s=[],i=[];var a=this.px,r=this.py;a._caching.lastFrame+a.offsetTime<=a.keyframes[0].t?(s[0]=a.getValueAtTime((a.keyframes[0].t+.01)/e,0),s[1]=r.getValueAtTime((r.keyframes[0].t+.01)/e,0),i[0]=a.getValueAtTime(a.keyframes[0].t/e,0),i[1]=r.getValueAtTime(r.keyframes[0].t/e,0)):a._caching.lastFrame+a.offsetTime>=a.keyframes[a.keyframes.length-1].t?(s[0]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/e,0),s[1]=r.getValueAtTime(r.keyframes[r.keyframes.length-1].t/e,0),i[0]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/e,0),i[1]=r.getValueAtTime((r.keyframes[r.keyframes.length-1].t-.01)/e,0)):(s=[a.pv,r.pv],i[0]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/e,a.offsetTime),i[1]=r.getValueAtTime((r._caching.lastFrame+r.offsetTime-.01)/e,r.offsetTime))}else s=i=n;this.v.rotate(-Math.atan2(s[1]-i[1],s[0]-i[0]))}this.data.p&&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}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}this.r?this.r.effectsSequence.length||(this.pre.rotate(-this.r.v),this.appliedTransformations=4):this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.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.appliedTransformations=4)}},autoOrient:function(){}},F([w],i),i.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},i.prototype._addDynamicProperty=w.prototype.addDynamicProperty,{getTransformProperty:function(t,e,s){return new i(t,e,s)}}}();function V(){this.c=!1,this._length=0,this._maxLength=8,this.v=x(this._maxLength),this.o=x(this._maxLength),this.i=x(this._maxLength)}V.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var s=0;s<e;)this.v[s]=Dt.newElement(),this.o[s]=Dt.newElement(),this.i[s]=Dt.newElement(),s+=1},V.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},V.prototype.doubleArrayLength=function(){this.v=this.v.concat(x(this._maxLength)),this.i=this.i.concat(x(this._maxLength)),this.o=this.o.concat(x(this._maxLength)),this._maxLength*=2},V.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;break;default:r=[]}(!r[i]||r[i]&&!a)&&(r[i]=Dt.newElement()),r[i][0]=t,r[i][1]=e},V.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)},V.prototype.reverse=function(){var t=new V;t.setPathData(this.c,this._length);var e=this.v,s=this.o,i=this.i,a=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],i[0][0],i[0][1],s[0][0],s[0][1],0,!1),a=1);var r,n=this._length-1,h=this._length;for(r=a;r<h;r+=1)t.setTripleAt(e[n][0],e[n][1],i[n][0],i[n][1],s[n][0],s[n][1],r,!1),n-=1;return t};var N,z,O=function(){var a=-999999;function t(t,e,s){var i,a,r,n,h,o,l,p,f,m=s.lastIndex,d=this.keyframes;if(t<d[0].t-this.offsetTime)i=d[0].s[0],r=!0,m=0;else if(t>=d[d.length-1].t-this.offsetTime)i=d[d.length-1].s?d[d.length-1].s[0]:d[d.length-2].e[0],r=!0;else{for(var c,u,g=m,y=d.length-1,v=!0;v&&(c=d[g],!((u=d[g+1]).t-this.offsetTime>t));)g<y-1?g+=1:v=!1;if(m=g,!(r=1===c.h)){if(t>=u.t-this.offsetTime)p=1;else if(t<c.t-this.offsetTime)p=0;else{var b;c.__fnct?b=c.__fnct:(b=W.getBezierEasing(c.o.x,c.o.y,c.i.x,c.i.y).get,c.__fnct=b),p=b((t-(c.t-this.offsetTime))/(u.t-this.offsetTime-(c.t-this.offsetTime)))}a=u.s?u.s[0]:c.e[0]}i=c.s[0]}for(o=e._length,l=i.i[0].length,s.lastIndex=m,n=0;n<o;n+=1)for(h=0;h<l;h+=1)f=r?i.i[n][h]:i.i[n][h]+(a.i[n][h]-i.i[n][h])*p,e.i[n][h]=f,f=r?i.o[n][h]:i.o[n][h]+(a.o[n][h]-i.o[n][h])*p,e.o[n][h]=f,f=r?i.v[n][h]:i.v[n][h]+(a.v[n][h]-i.v[n][h])*p,e.v[n][h]=f}function r(){this.paths=this.localShapeCollection}function e(t){(function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var s,i=t._length;for(s=0;s<i;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})(this.v,t)||(this.v=St.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function s(){if(this.elem.globalData.frameId!==this.frameId)if(this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{var t,e;this.lock=!0,this._mdf=!1,t=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k;var s=this.effectsSequence.length;for(e=0;e<s;e+=1)t=this.effectsSequence[e](t);this.setVValue(t),this.lock=!1,this.frameId=this.elem.globalData.frameId}else this._mdf=!1}function n(t,e,s){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var i=3===s?e.pt.k:e.ks.k;this.v=St.clone(i),this.pv=St.clone(this.v),this.localShapeCollection=xt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=r,this.effectsSequence=[]}function i(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function h(t,e,s){this.propType="shape",this.comp=t.comp,this.elem=t,this.container=t,this.offsetTime=t.data.st,this.keyframes=3===s?e.pt.k:e.ks.k,this.k=!0,this.kf=!0;var i=this.keyframes[0].s[0].i.length;this.v=St.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,i),this.pv=St.clone(this.v),this.localShapeCollection=xt.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=a,this.reset=r,this._caching={lastFrame:a,lastIndex:0},this.effectsSequence=[function(){var t=this.comp.renderedFrame-this.offsetTime,e=this.keyframes[0].t-this.offsetTime,s=this.keyframes[this.keyframes.length-1].t-this.offsetTime,i=this._caching.lastFrame;return i!==a&&(i<e&&t<e||s<i&&s<t)||(this._caching.lastIndex=i<t?this._caching.lastIndex:0,this.interpolateShape(t,this.pv,this._caching)),this._caching.lastFrame=t,this.pv}.bind(this)]}n.prototype.interpolateShape=t,n.prototype.getValue=s,n.prototype.setVValue=e,n.prototype.addEffect=i,h.prototype.getValue=s,h.prototype.interpolateShape=t,h.prototype.setVValue=e,h.prototype.addEffect=i;var o=function(){var n=v;function t(t,e){this.v=St.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=xt.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=L.getProp(t,e.p,1,0,this),this.s=L.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}return t.prototype={reset:r,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=3!==this.d,r=this.v;r.v[0][0]=t,r.v[0][1]=e-i,r.v[1][0]=a?t+s:t-s,r.v[1][1]=e,r.v[2][0]=t,r.v[2][1]=e+i,r.v[3][0]=a?t-s:t+s,r.v[3][1]=e,r.i[0][0]=a?t-s*n:t+s*n,r.i[0][1]=e-i,r.i[1][0]=a?t+s:t-s,r.i[1][1]=e-i*n,r.i[2][0]=a?t+s*n:t-s*n,r.i[2][1]=e+i,r.i[3][0]=a?t-s:t+s,r.i[3][1]=e+i*n,r.o[0][0]=a?t+s*n:t-s*n,r.o[0][1]=e-i,r.o[1][0]=a?t+s:t-s,r.o[1][1]=e+i*n,r.o[2][0]=a?t-s*n:t+s*n,r.o[2][1]=e+i,r.o[3][0]=a?t-s:t+s,r.o[3][1]=e-i*n}},F([w],t),t}(),l=function(){function t(t,e){this.v=St.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=L.getProp(t,e.ir,0,0,this),this.is=L.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=L.getProp(t,e.pt,0,0,this),this.p=L.getProp(t,e.p,1,0,this),this.r=L.getProp(t,e.r,0,B,this),this.or=L.getProp(t,e.or,0,0,this),this.os=L.getProp(t,e.os,0,.01,this),this.localShapeCollection=xt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}return t.prototype={reset:r,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){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,l=this.os.v,p=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(t=this.v._length=0;t<a;t+=1){s=n?l:p,i=n?f:m;var u=(e=n?h:o)*Math.cos(d),g=e*Math.sin(d),y=0===u&&0===g?0:g/Math.sqrt(u*u+g*g),v=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-y*i*s*c,g-v*i*s*c,u+y*i*s*c,g+v*i*s*c,t,!0),n=!n,d+=r*c}},convertPolygonToPath:function(){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=.5*-Math.PI,h=3===this.data.d?-1:1;for(n+=this.r.v,t=this.v._length=0;t<e;t+=1){var o=i*Math.cos(n),l=i*Math.sin(n),p=0===o&&0===l?0:l/Math.sqrt(o*o+l*l),f=0===o&&0===l?0:-o/Math.sqrt(o*o+l*l);o+=+this.p.v[0],l+=+this.p.v[1],this.v.setTripleAt(o,l,o-p*r*a*h,l-f*r*a*h,o+p*r*a*h,l+f*r*a*h,t,!0),n+=s*h}this.paths.length=0,this.paths[0]=this.v}},F([w],t),t}(),p=function(){function t(t,e){this.v=St.newElement(),this.v.c=!0,this.localShapeCollection=xt.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=L.getProp(t,e.p,1,0,this),this.s=L.getProp(t,e.s,1,0,this),this.r=L.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}return t.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2,a=m(s,i,this.r.v),r=a*(1-v);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)))},getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:r},F([w],t),t}();var f={getShapeProp:function(t,e,s){var i;return 3===s||4===s?i=(3===s?e.pt:e.ks).k.length?new h(t,e,s):new n(t,e,s):5===s?i=new p(t,e):6===s?i=new o(t,e):7===s&&(i=new l(t,e)),i.k&&t.addDynamicProperty(i),i},getConstructorFunction:function(){return n},getKeyframedConstructorFunction:function(){return h}};return f}(),Y=(z={},(N={}).registerModifier=function(t,e){z[t]||(z[t]=e)},N.getModifier=function(t,e,s){return new z[t](e,s)},N);function G(){}function X(){}function H(){}function K(){}function J(){}function Z(){this._length=0,this._maxLength=4,this.shapes=x(this._maxLength)}function U(t,e,s,i){var a;this.elem=t,this.frameId=-1,this.dataProps=x(e.length),this.renderer=s,this.k=!1,this.dashStr="",this.dashArray=j("float32",e.length?e.length-1:0),this.dashoffset=j("float32",1),this.initDynamicPropertyContainer(i);var r,n=e.length||0;for(a=0;a<n;a+=1)r=L.getProp(t,e[a].v,0,0,this),this.k=r.k||this.k,this.dataProps[a]={n:e[a].n,p:r};this.k||this.getValue(!0),this._isAnimated=this.k}function Q(t,e,s){this.data=e,this.c=j("uint8c",4*e.p);var i=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=j("float32",i),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=i,this.initDynamicPropertyContainer(s),this.prop=L.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}G.prototype.initModifierProperties=function(){},G.prototype.addShapeToModifier=function(){},G.prototype.addShape=function(t){if(!this.closed){t.sh.container.addDynamicProperty(t.sh);var e={shape:t.sh,data:t,localShapeCollection:xt.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},G.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=s,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},G.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},F([w],G),F([G],X),X.prototype.initModifierProperties=function(t,e){this.s=L.getProp(t,e.s,0,.01,this),this.e=L.getProp(t,e.e,0,.01,this),this.o=L.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},X.prototype.addShapeToModifier=function(t){t.pathsData=[]},X.prototype.calculateShapeEdges=function(t,e,s,i,a){var r=[];e<=1?r.push({s:t,e:e}):1<=t?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=[],l=r.length;for(n=0;n<l;n+=1){var p,f;if(!((h=r[n]).e*a<i||h.s*a>i+s))p=h.s*a<=i?0:(h.s*a-i)/s,f=h.e*a>=i+s?1:(h.e*a-i)/s,o.push([p,f])}return o.length||o.push([0,0]),o},X.prototype.releasePathsData=function(t){var e,s=t.length;for(e=0;e<s;e+=1)Pt.release(t[e]);return t.length=0,t},X.prototype.processShapes=function(t){var e,s,i,a;if(this._mdf||t){var r=this.o.v%360/360;if(r<0&&(r+=1),e=1<this.s.v?1+r:this.s.v<0?0+r:this.s.v+r,(s=1<this.e.v?1+r:this.e.v<0?0+r:this.e.v+r)<e){var n=e;e=s,s=n}e=1e-4*Math.round(1e4*e),s=1e-4*Math.round(1e4*s),this.sValue=e,this.eValue=s}else e=this.sValue,s=this.eValue;var h,o,l,p,f,m=this.shapes.length,d=0;if(s===e)for(a=0;a<m;a+=1)this.shapes[a].localShapeCollection.releaseShapes(),this.shapes[a].shape._mdf=!0,this.shapes[a].shape.paths=this.shapes[a].localShapeCollection,this._mdf&&(this.shapes[a].pathsData.length=0);else if(1===s&&0===e||0===s&&1===e){if(this._mdf)for(a=0;a<m;a+=1)this.shapes[a].pathsData.length=0,this.shapes[a].shape._mdf=!0}else{var c,u,g=[];for(a=0;a<m;a+=1)if((c=this.shapes[a]).shape._mdf||this._mdf||t||2===this.m){if(o=(i=c.shape.paths)._length,f=0,!c.shape._mdf&&c.pathsData.length)f=c.totalShapeLength;else{for(l=this.releasePathsData(c.pathsData),h=0;h<o;h+=1)p=mt.getSegmentsLength(i.shapes[h]),l.push(p),f+=p.totalLength;c.totalShapeLength=f,c.pathsData=l}d+=f,c.shape._mdf=!0}else c.shape.paths=c.localShapeCollection;var y,v=e,b=s,_=0;for(a=m-1;0<=a;a-=1)if((c=this.shapes[a]).shape._mdf){for((u=c.localShapeCollection).releaseShapes(),2===this.m&&1<m?(y=this.calculateShapeEdges(e,s,c.totalShapeLength,_,d),_+=c.totalShapeLength):y=[[v,b]],o=y.length,h=0;h<o;h+=1){v=y[h][0],b=y[h][1],g.length=0,b<=1?g.push({s:c.totalShapeLength*v,e:c.totalShapeLength*b}):1<=v?g.push({s:c.totalShapeLength*(v-1),e:c.totalShapeLength*(b-1)}):(g.push({s:c.totalShapeLength*v,e:c.totalShapeLength}),g.push({s:0,e:c.totalShapeLength*(b-1)}));var C=this.addShapes(c,g[0]);if(g[0].s!==g[0].e){if(1<g.length)if(c.shape.paths.shapes[c.shape.paths._length-1].c){var k=C.pop();this.addPaths(C,u),C=this.addShapes(c,g[1],k)}else this.addPaths(C,u),C=this.addShapes(c,g[1]);this.addPaths(C,u)}}c.shape.paths=u}}},X.prototype.addPaths=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)e.addShape(t[s])},X.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)},X.prototype.addSegmentFromArray=function(t,e,s,i){e.setXYAt(t[1],t[5],"o",s),e.setXYAt(t[2],t[6],"i",s+1),i&&e.setXYAt(t[0],t[4],"v",s),e.setXYAt(t[3],t[7],"v",s+1)},X.prototype.addShapes=function(t,e,s){var i,a,r,n,h,o,l,p,f=t.pathsData,m=t.shape.paths.shapes,d=t.shape.paths._length,c=0,u=[],g=!0;for(p=s?(h=s._length,s._length):(s=St.newElement(),h=0),u.push(s),i=0;i<d;i+=1){for(o=f[i].lengths,s.c=m[i].c,r=m[i].c?o.length:o.length+1,a=1;a<r;a+=1)if(c+(n=o[a-1]).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):(l=mt.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.addSegmentFromArray(l,s,h,g),g=!1,s.c=!1),c+=n.addedLength,h+=1}if(m[i].c&&o.length){if(n=o[a-1],c<=e.e){var y=o[a-1].addedLength;e.s<=c&&e.e>=c+y?(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):(l=mt.getNewSegment(m[i].v[a-1],m[i].v[0],m[i].o[a-1],m[i].i[0],(e.s-c)/y,(e.e-c)/y,o[a-1]),this.addSegmentFromArray(l,s,h,g),g=!1,s.c=!1)}else s.c=!1;c+=n.addedLength,h+=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)),c>e.e)break;i<d-1&&(s=St.newElement(),g=!0,u.push(s),h=0)}return u},Y.registerModifier("tm",X),F([G],H),H.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=L.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},H.prototype.processPath=function(t,e){var s,i=St.newElement();i.c=t.c;var a,r,n,h,o,l,p,f,m,d,c,u,g=t._length,y=0;for(s=0;s<g;s+=1)a=t.v[s],n=t.o[s],r=t.i[s],a[0]===n[0]&&a[1]===n[1]&&a[0]===r[0]&&a[1]===r[1]?0!==s&&s!==g-1||t.c?(h=0===s?t.v[g-1]:t.v[s-1],l=(o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)))?Math.min(o/2,e)/o:0,p=c=a[0]+(h[0]-a[0])*l,f=u=a[1]-(a[1]-h[1])*l,m=p-(p-a[0])*v,d=f-(f-a[1])*v,i.setTripleAt(p,f,m,d,c,u,y),y+=1,h=s===g-1?t.v[0]:t.v[s+1],l=(o=Math.sqrt(Math.pow(a[0]-h[0],2)+Math.pow(a[1]-h[1],2)))?Math.min(o/2,e)/o:0,p=m=a[0]+(h[0]-a[0])*l,f=d=a[1]+(h[1]-a[1])*l,c=p-(p-a[0])*v,u=f-(f-a[1])*v,i.setTripleAt(p,f,m,d,c,u,y)):i.setTripleAt(a[0],a[1],n[0],n[1],r[0],r[1],y):i.setTripleAt(t.v[s][0],t.v[s][1],t.o[s][0],t.o[s][1],t.i[s][0],t.i[s][1],y),y+=1;return i},H.prototype.processShapes=function(t){var e,s,i,a,r,n,h=this.shapes.length,o=this.rd.v;if(0!==o)for(s=0;s<h;s+=1){if(n=(r=this.shapes[s]).localShapeCollection,r.shape._mdf||this._mdf||t)for(n.releaseShapes(),r.shape._mdf=!0,e=r.shape.paths.shapes,a=r.shape.paths._length,i=0;i<a;i+=1)n.addShape(this.processPath(e[i],o));r.shape.paths=r.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},Y.registerModifier("rd",H),F([G],K),K.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.amount=L.getProp(t,e.a,0,null,this),this._isAnimated=!!this.amount.effectsSequence.length},K.prototype.processPath=function(t,e){var s=e/100,i=[0,0],a=t._length,r=0;for(r=0;r<a;r+=1)i[0]+=t.v[r][0],i[1]+=t.v[r][1];i[0]/=a,i[1]/=a;var n,h,o,l,p,f,m=St.newElement();for(m.c=t.c,r=0;r<a;r+=1)n=t.v[r][0]+(i[0]-t.v[r][0])*s,h=t.v[r][1]+(i[1]-t.v[r][1])*s,o=t.o[r][0]+(i[0]-t.o[r][0])*-s,l=t.o[r][1]+(i[1]-t.o[r][1])*-s,p=t.i[r][0]+(i[0]-t.i[r][0])*-s,f=t.i[r][1]+(i[1]-t.i[r][1])*-s,m.setTripleAt(n,h,o,l,p,f,r);return m},K.prototype.processShapes=function(t){var e,s,i,a,r,n,h=this.shapes.length,o=this.amount.v;if(0!==o)for(s=0;s<h;s+=1){if(n=(r=this.shapes[s]).localShapeCollection,r.shape._mdf||this._mdf||t)for(n.releaseShapes(),r.shape._mdf=!0,e=r.shape.paths.shapes,a=r.shape.paths._length,i=0;i<a;i+=1)n.addShape(this.processPath(e[i],o));r.shape.paths=r.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},Y.registerModifier("pb",K),F([G],J),J.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=L.getProp(t,e.c,0,null,this),this.o=L.getProp(t,e.o,0,null,this),this.tr=R.getTransformProperty(t,e.tr,this),this.so=L.getProp(t,e.tr.so,0,.01,this),this.eo=L.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new E,this.rMatrix=new E,this.sMatrix=new E,this.tMatrix=new E,this.matrix=new E},J.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])},J.prototype.init=function(t,e,s,i){for(this.elem=t,this.arr=e,this.pos=s,this.elemsData=i,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[s]);0<s;)s-=1,this._elements.unshift(e[s]);this.dynamicProperties.length?this.k=!0:this.getValue(!0)},J.prototype.resetElements=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},J.prototype.cloneElements=function(t){var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},J.prototype.changeGroupRender=function(t,e){var s,i=t.length;for(s=0;s<i;s+=1)t[s]._render=e,"gr"===t[s].ty&&this.changeGroupRender(t[s].it,e)},J.prototype.processShapes=function(t){var e,s,i,a,r;if(this._mdf||t){var n,h=Math.ceil(this.c.v);if(this._groups.length<h){for(;this._groups.length<h;){var o={it:this.cloneElements(this._elements),ty:"gr"};o.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,o),this._groups.splice(0,0,o),this._currentCopies+=1}this.elem.reloadShapes()}for(i=r=0;i<=this._groups.length-1;i+=1)n=r<h,this._groups[i]._render=n,this.changeGroupRender(this._groups[i].it,n),r+=1;this._currentCopies=h;var l=this.o.v,p=l%1,f=0<l?Math.floor(l):Math.ceil(l),m=this.pMatrix.props,d=this.rMatrix.props,c=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var u,g,y=0;if(0<l){for(;y<f;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),y+=1;p&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,p,!1),y+=p)}else if(l<0){for(;f<y;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),y-=1;p&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-p,!0),y-=p)}for(i=1===this.data.m?0:this._currentCopies-1,a=1===this.data.m?1:-1,r=this._currentCopies;r;){if(g=(s=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=this.so.v+(this.eo.v-this.so.v)*(i/(this._currentCopies-1)),0!==y){for((0!==i&&1===a||i!==this._currentCopies-1&&-1===a)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.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]),this.matrix.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]),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]),u=0;u<g;u+=1)s[u]=this.matrix.props[u];this.matrix.reset()}else for(this.matrix.reset(),u=0;u<g;u+=1)s[u]=this.matrix.props[u];y+=1,r-=1,i+=a}}else for(r=this._currentCopies,i=0,a=1;r;)s=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,r-=1,i+=a},J.prototype.addShape=function(){},Y.registerModifier("rp",J),Z.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(x(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},Z.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)St.release(this.shapes[t]);this._length=0},U.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,s=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<s;e+=1)"o"!==this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},F([w],U),Q.prototype.comparePoints=function(t,e){for(var s=0,i=this.o.length/2;s<i;){if(.01<Math.abs(t[4*s]-t[4*e+2*s]))return!1;s+=1}return!0},Q.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},Q.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,s,i,a=4*this.data.p;for(e=0;e<a;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=!t);if(this.o.length)for(a=this.prop.v.length,e=4*this.data.p;e<a;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=!t);this._mdf=!t}},F([w],Q);var $,tt,et=function(t,e,s,i){if(0===e)return"";var a,r=t.o,n=t.i,h=t.v,o=" M"+i.applyToPointStringified(h[0][0],h[0][1]);for(a=1;a<e;a+=1)o+=" C"+i.applyToPointStringified(r[a-1][0],r[a-1][1])+" "+i.applyToPointStringified(n[a][0],n[a][1])+" "+i.applyToPointStringified(h[a][0],h[a][1]);return s&&e&&(o+=" C"+i.applyToPointStringified(r[a-1][0],r[a-1][1])+" "+i.applyToPointStringified(n[0][0],n[0][1])+" "+i.applyToPointStringified(h[0][0],h[0][1]),o+="z"),o},st=function(){function t(t){this.audios=[],this.audioFactory=t,this._volume=1,this._isMuted=!1}return t.prototype={addAudio:function(t){this.audios.push(t)},pause:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].pause()},resume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].resume()},setRate:function(t){var e,s=this.audios.length;for(e=0;e<s;e+=1)this.audios[e].setRate(t)},createAudio:function(t){return this.audioFactory?this.audioFactory(t):Howl?new Howl({src:[t]}):{isPlaying:!1,play:function(){this.isPlaying=!0},seek:function(){this.isPlaying=!1},playing:function(){},rate:function(){},setVolume:function(){}}},setAudioFactory:function(t){this.audioFactory=t},setVolume:function(t){this._volume=t,this._updateVolume()},mute:function(){this._isMuted=!0,this._updateVolume()},unmute:function(){this._isMuted=!1,this._updateVolume()},getVolume:function(){return this._volume},_updateVolume:function(){var t,e=this.audios.length;for(t=0;t<e;t+=1)this.audios[t].volume(this._volume*(this._isMuted?0:1))}},function(){return new t}}(),it=function(){var a=function(){var t=P("canvas");t.width=1,t.height=1;var e=t.getContext("2d");return e.fillStyle="rgba(0,0,0,0)",e.fillRect(0,0,1,1),t}();function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function r(t,e,s){var i="";if(t.e)i=t.p;else if(e){var a=t.p;-1!==a.indexOf("images/")&&(a=a.split("/")[1]),i=e+a}else i=s,i+=t.u?t.u:"",i+=t.p;return i}function e(){this._imageLoaded=t.bind(this),this.testImageLoaded=function(t){var e=0,s=setInterval(function(){(t.getBBox().width||500<e)&&(this._imageLoaded(),clearInterval(s)),e+=1}.bind(this),50)}.bind(this),this.assetsPath="",this.path="",this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null,this.images=[]}return e.prototype={loadAssets:function(t,e){var s;this.imagesLoadedCb=e;var i=t.length;for(s=0;s<i;s+=1)t[s].layers||(this.totalImages+=1,this.images.push(this._createImageData(t[s])))},setAssetsPath:function(t){this.assetsPath=t||""},setPath:function(t){this.path=t||""},loaded:function(){return this.totalImages===this.loadedAssets},destroy:function(){this.imagesLoadedCb=null,this.images.length=0},getImage:function(t){for(var e=0,s=this.images.length;e<s;){if(this.images[e].assetData===t)return this.images[e].img;e+=1}return null},createImgData:function(t){var e=r(t,this.assetsPath,this.path),s=P("img");s.crossOrigin="anonymous",s.addEventListener("load",this._imageLoaded,!1),s.addEventListener("error",function(){i.img=a,this._imageLoaded()}.bind(this),!1),s.src=e;var i={img:s,assetData:t};return i},createImageData:function(t){var e=r(t,this.assetsPath,this.path),s=createNS("image");n?this.testImageLoaded(s):s.addEventListener("load",this._imageLoaded,!1),s.addEventListener("error",function(){i.img=a,this._imageLoaded()}.bind(this),!1),s.setAttributeNS("http://www.w3.org/1999/xlink","href",e),this._elementHelper.append(s);var i={img:s,assetData:t};return i},imageLoaded:t,setCacheType:function(t,e){this._createImageData="svg"===t?(this._elementHelper=e,this.createImageData.bind(this)):this.createImgData.bind(this)}},e}(),at=($={maskType:!0},(/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))&&($.maskType=!1),$),rt=((tt={}).createFilter=function(t){var e=createNS("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},tt.createAlphaToLuminanceFilter=function(){var t=createNS("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 1 1"),t},tt),nt=function(){function r(t){return t.response&&"object"==typeof t.response?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):null}return{load:function(t,e,s){var i,a=new XMLHttpRequest;a.open("GET",t,!0);try{a.responseType="json"}catch(t){}a.send(),a.onreadystatechange=function(){if(4===a.readyState)if(200===a.status)i=r(a),e(i);else try{i=r(a),e(i)}catch(t){s&&s(t)}}}}}();function ht(t,e,s){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=s,this._animatorsData=x(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(s)}function ot(t,e,s){var i={propType:!1},a=L.getProp,r=e.a;this.a={r:r.r?a(t,r.r,0,B,s):i,rx:r.rx?a(t,r.rx,0,B,s):i,ry:r.ry?a(t,r.ry,0,B,s):i,sk:r.sk?a(t,r.sk,0,B,s):i,sa:r.sa?a(t,r.sa,0,B,s):i,s:r.s?a(t,r.s,1,.01,s):i,a:r.a?a(t,r.a,1,0,s):i,o:r.o?a(t,r.o,0,.01,s):i,p:r.p?a(t,r.p,1,0,s):i,sw:r.sw?a(t,r.sw,0,0,s):i,sc:r.sc?a(t,r.sc,1,0,s):i,fc:r.fc?a(t,r.fc,1,0,s):i,fh:r.fh?a(t,r.fh,0,0,s):i,fs:r.fs?a(t,r.fs,0,.01,s):i,fb:r.fb?a(t,r.fb,0,.01,s):i,t:r.t?a(t,r.t,0,0,s):i},this.s=_t.getTextSelectorProp(t,e.s,s),this.s.t=e.s.t}function dt(t,e,s,i,a,r){this.o=t,this.sw=e,this.sc=s,this.fc=i,this.m=a,this.p=r,this._mdf={o:!0,sw:!!e,sc:!!s,fc:!!i,m:!0,p:!0}}function ct(t,e){this._frameId=s,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}ht.prototype.searchProperties=function(){var t,e,s=this._textData.a.length,i=L.getProp;for(t=0;t<s;t+=1)e=this._textData.a[t],this._animatorsData[t]=new ot(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this),l:i(this._elem,this._textData.p.l,0,0,this),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this)},ht.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var s,i,a,r,n,h,o,l,p,f,m,d,c,u,g,y,v,b,_,C=this._moreOptions.alignment.v,k=this._animatorsData,D=this._textData,S=this.mHelper,x=this._renderType,P=this.renderedLetters.length,w=t.l;if(this._hasMaskedPath){if(_=this._pathData.m,!this._pathData.n||this._pathData._mdf){var T,A=_.v;for(this._pathData.r&&(A=A.reverse()),n={tLength:0,segments:[]},r=A._length-1,a=y=0;a<r;a+=1)T=mt.buildBezierData(A.v[a],A.v[a+1],[A.o[a][0]-A.v[a][0],A.o[a][1]-A.v[a][1]],[A.i[a+1][0]-A.v[a+1][0],A.i[a+1][1]-A.v[a+1][1]]),n.tLength+=T.segmentLength,n.segments.push(T),y+=T.segmentLength;a=r,_.v.c&&(T=mt.buildBezierData(A.v[a],A.v[0],[A.o[a][0]-A.v[a][0],A.o[a][1]-A.v[a][1]],[A.i[0][0]-A.v[0][0],A.i[0][1]-A.v[0][1]]),n.tLength+=T.segmentLength,n.segments.push(T),y+=T.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,h=this._pathData.f.v,f=1,p=!(l=m=0),u=n.segments,h<0&&_.v.c)for(n.tLength<Math.abs(h)&&(h=-Math.abs(h)%n.tLength),f=(c=u[m=u.length-1].points).length-1;h<0;)h+=c[f].partialLength,(f-=1)<0&&(f=(c=u[m-=1].points).length-1);d=(c=u[m].points)[f-1],g=(o=c[f]).partialLength}r=w.length,i=s=0;var F,M,I,E,L,R=1.2*t.finalSize*.714,V=!0;I=k.length;var N,z,O,q,B,j,W,Y,G,X,H,K,J=-1,Z=h,U=m,Q=f,$=-1,tt="",et=this.defaultPropsArray;if(2===t.j||1===t.j){var st=0,it=0,at=2===t.j?-.5:-1,rt=0,nt=!0;for(a=0;a<r;a+=1)if(w[a].n){for(st&&(st+=it);rt<a;)w[rt].animatorJustifyOffset=st,rt+=1;nt=!(st=0)}else{for(M=0;M<I;M+=1)(F=k[M].a).t.propType&&(nt&&2===t.j&&(it+=F.t.v*at),(L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars)).length?st+=F.t.v*L[0]*at:st+=F.t.v*L*at);nt=!1}for(st&&(st+=it);rt<a;)w[rt].animatorJustifyOffset=st,rt+=1}for(a=0;a<r;a+=1){if(S.reset(),q=1,w[a].n)s=0,i+=t.yOffset,i+=V?1:0,h=Z,V=!1,this._hasMaskedPath&&(f=Q,d=(c=u[m=U].points)[f-1],g=(o=c[f]).partialLength,l=0),K=G=H=tt="",et=this.defaultPropsArray;else{if(this._hasMaskedPath){if($!==w[a].line){switch(t.j){case 1:h+=y-t.lineWidths[w[a].line];break;case 2:h+=(y-t.lineWidths[w[a].line])/2}$=w[a].line}J!==w[a].ind&&(w[J]&&(h+=w[J].extra),h+=w[a].an/2,J=w[a].ind),h+=C[0]*w[a].an*.005;var ht=0;for(M=0;M<I;M+=1)(F=k[M].a).p.propType&&((L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars)).length?ht+=F.p.v[0]*L[0]:ht+=F.p.v[0]*L),F.a.propType&&((L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars)).length?ht+=F.a.v[0]*L[0]:ht+=F.a.v[0]*L);for(p=!0;p;)h+ht<=l+g||!c?(v=(h+ht-l)/o.partialLength,z=d.point[0]+(o.point[0]-d.point[0])*v,O=d.point[1]+(o.point[1]-d.point[1])*v,S.translate(-C[0]*w[a].an*.005,-C[1]*R*.01),p=!1):c&&(l+=o.partialLength,(f+=1)>=c.length&&(f=0,c=u[m+=1]?u[m].points:_.v.c?u[m=f=0].points:(l-=o.partialLength,null)),c&&(d=o,g=(o=c[f]).partialLength));N=w[a].an/2-w[a].add,S.translate(-N,0,0)}else N=w[a].an/2-w[a].add,S.translate(-N,0,0),S.translate(-C[0]*w[a].an*.005,-C[1]*R*.01,0);for(M=0;M<I;M+=1)(F=k[M].a).t.propType&&(L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars),0===s&&0===t.j||(this._hasMaskedPath?L.length?h+=F.t.v*L[0]:h+=F.t.v*L:L.length?s+=F.t.v*L[0]:s+=F.t.v*L));for(t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(B=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(W=[t.fc[0],t.fc[1],t.fc[2]]),M=0;M<I;M+=1)(F=k[M].a).a.propType&&((L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars)).length?S.translate(-F.a.v[0]*L[0],-F.a.v[1]*L[1],F.a.v[2]*L[2]):S.translate(-F.a.v[0]*L,-F.a.v[1]*L,F.a.v[2]*L));for(M=0;M<I;M+=1)(F=k[M].a).s.propType&&((L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars)).length?S.scale(1+(F.s.v[0]-1)*L[0],1+(F.s.v[1]-1)*L[1],1):S.scale(1+(F.s.v[0]-1)*L,1+(F.s.v[1]-1)*L,1));for(M=0;M<I;M+=1){if(F=k[M].a,L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars),F.sk.propType&&(L.length?S.skewFromAxis(-F.sk.v*L[0],F.sa.v*L[1]):S.skewFromAxis(-F.sk.v*L,F.sa.v*L)),F.r.propType&&(L.length?S.rotateZ(-F.r.v*L[2]):S.rotateZ(-F.r.v*L)),F.ry.propType&&(L.length?S.rotateY(F.ry.v*L[1]):S.rotateY(F.ry.v*L)),F.rx.propType&&(L.length?S.rotateX(F.rx.v*L[0]):S.rotateX(F.rx.v*L)),F.o.propType&&(L.length?q+=(F.o.v*L[0]-q)*L[0]:q+=(F.o.v*L-q)*L),t.strokeWidthAnim&&F.sw.propType&&(L.length?j+=F.sw.v*L[0]:j+=F.sw.v*L),t.strokeColorAnim&&F.sc.propType)for(Y=0;Y<3;Y+=1)L.length?B[Y]+=(F.sc.v[Y]-B[Y])*L[0]:B[Y]+=(F.sc.v[Y]-B[Y])*L;if(t.fillColorAnim&&t.fc){if(F.fc.propType)for(Y=0;Y<3;Y+=1)L.length?W[Y]+=(F.fc.v[Y]-W[Y])*L[0]:W[Y]+=(F.fc.v[Y]-W[Y])*L;F.fh.propType&&(W=L.length?ft(W,F.fh.v*L[0]):ft(W,F.fh.v*L)),F.fs.propType&&(W=L.length?lt(W,F.fs.v*L[0]):lt(W,F.fs.v*L)),F.fb.propType&&(W=L.length?pt(W,F.fb.v*L[0]):pt(W,F.fb.v*L))}}for(M=0;M<I;M+=1)(F=k[M].a).p.propType&&(L=k[M].s.getMult(w[a].anIndexes[M],D.a[M].s.totalChars),this._hasMaskedPath?L.length?S.translate(0,F.p.v[1]*L[0],-F.p.v[2]*L[1]):S.translate(0,F.p.v[1]*L,-F.p.v[2]*L):L.length?S.translate(F.p.v[0]*L[0],F.p.v[1]*L[1],-F.p.v[2]*L[2]):S.translate(F.p.v[0]*L,F.p.v[1]*L,-F.p.v[2]*L));if(t.strokeWidthAnim&&(G=j<0?0:j),t.strokeColorAnim&&(X="rgb("+Math.round(255*B[0])+","+Math.round(255*B[1])+","+Math.round(255*B[2])+")"),t.fillColorAnim&&t.fc&&(H="rgb("+Math.round(255*W[0])+","+Math.round(255*W[1])+","+Math.round(255*W[2])+")"),this._hasMaskedPath){if(S.translate(0,-t.ls),S.translate(0,C[1]*R*.01+i,0),D.p.p){b=(o.point[1]-d.point[1])/(o.point[0]-d.point[0]);var ot=180*Math.atan(b)/Math.PI;o.point[0]<d.point[0]&&(ot+=180),S.rotate(-ot*Math.PI/180)}S.translate(z,O,0),h-=C[0]*w[a].an*.005,w[a+1]&&J!==w[a+1].ind&&(h+=w[a].an/2,h+=.001*t.tr*t.finalSize)}else{switch(S.translate(s,i,0),t.ps&&S.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:S.translate(w[a].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[w[a].line]),0,0);break;case 2:S.translate(w[a].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[w[a].line])/2,0,0)}S.translate(0,-t.ls),S.translate(N,0,0),S.translate(C[0]*w[a].an*.005,C[1]*R*.01,0),s+=w[a].l+.001*t.tr*t.finalSize}"html"===x?tt=S.toCSS():"svg"===x?tt=S.to2dCSS():et=[S.props[0],S.props[1],S.props[2],S.props[3],S.props[4],S.props[5],S.props[6],S.props[7],S.props[8],S.props[9],S.props[10],S.props[11],S.props[12],S.props[13],S.props[14],S.props[15]],K=q}this.lettersChangedFlag=P<=a?(E=new dt(K,G,X,H,tt,et),this.renderedLetters.push(E),P+=1,!0):(E=this.renderedLetters[a]).update(K,G,X,H,tt,et)||this.lettersChangedFlag}}},ht.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},ht.prototype.mHelper=new E,ht.prototype.defaultPropsArray=[],F([w],ht),dt.prototype.update=function(t,e,s,i,a,r){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1;var n=this._mdf.p=!1;return this.o!==t&&(this.o=t,n=this._mdf.o=!0),this.sw!==e&&(this.sw=e,n=this._mdf.sw=!0),this.sc!==s&&(this.sc=s,n=this._mdf.sc=!0),this.fc!==i&&(this.fc=i,n=this._mdf.fc=!0),this.m!==a&&(this.m=a,n=this._mdf.m=!0),!r.length||this.p[0]===r[0]&&this.p[1]===r[1]&&this.p[4]===r[4]&&this.p[5]===r[5]&&this.p[12]===r[12]&&this.p[13]===r[13]||(this.p=r,n=this._mdf.p=!0),n},ct.prototype.defaultBoxWidth=[0,0],ct.prototype.copyData=function(t,e){for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(t[s]=e[s]);return t},ct.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},ct.prototype.searchProperty=function(){return this.searchKeyframes()},ct.prototype.searchKeyframes=function(){return this.kf=1<this.data.d.k.length,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},ct.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},ct.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,s=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{var i;this.lock=!0,this._mdf=!1;var a=this.effectsSequence.length,r=t||this.data.d.k[this.keysIndex].s;for(i=0;i<a;i+=1)r=s!==this.keysIndex?this.effectsSequence[i](r,r.t):this.effectsSequence[i](this.currentData,r.t);e!==r&&this.setCurrentData(r),this.v=this.currentData,this.pv=this.v,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},ct.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,s=0,i=t.length;s<=i-1&&!(s===i-1||t[s+1].t>e);)s+=1;return this.keysIndex!==s&&(this.keysIndex=s),this.data.d.k[this.keysIndex].s},ct.prototype.buildFinalText=function(t){for(var e,s=I.getCombinedCharacterCodes(),i=[],a=0,r=t.length;a<r;)e=t.charCodeAt(a),-1!==s.indexOf(e)?i[i.length-1]+=t.charAt(a):55296<=e&&e<=56319&&56320<=(e=t.charCodeAt(a+1))&&e<=57343?(i.push(t.substr(a,2)),a+=1):i.push(t.charAt(a)),a+=1;return i},ct.prototype.completeTextData=function(t){t.__complete=!0;var e,s,i,a,r,n,h,o=this.elem.globalData.fontManager,l=this.data,p=[],f=0,m=l.m.g,d=0,c=0,u=0,g=[],y=0,v=0,b=o.getFontByName(t.f),_=0,C=q(b);t.fWeight=C.weight,t.fStyle=C.style,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),s=t.finalText.length,t.finalLineHeight=t.lh;var k,D=t.tr/1e3*t.finalSize;if(t.sz)for(var S,x,P=!0,w=t.sz[0],T=t.sz[1];P;){y=S=0,s=(x=this.buildFinalText(t.t)).length,D=t.tr/1e3*t.finalSize;var A=-1;for(e=0;e<s;e+=1)k=x[e].charCodeAt(0),i=!1," "===x[e]?A=e:13!==k&&3!==k||(i=!(y=0),S+=t.finalLineHeight||1.2*t.finalSize),w<y+(_=o.chars?(h=o.getCharData(x[e],b.fStyle,b.fFamily),i?0:h.w*t.finalSize/100):o.measureText(x[e],t.f,t.finalSize))&&" "!==x[e]?(-1===A?s+=1:e=A,S+=t.finalLineHeight||1.2*t.finalSize,x.splice(e,A===e?1:0,"\r"),A=-1,y=0):(y+=_,y+=D);S+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&T<S?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=x,s=t.finalText.length,P=!1)}y=-D;var F,M=_=0;for(e=0;e<s;e+=1)if(i=!1,13===(k=(F=t.finalText[e]).charCodeAt(0))||3===k?(M=0,g.push(y),v=v<y?y:v,y=-2*D,i=!(a=""),u+=1):a=F,_=o.chars?(h=o.getCharData(F,b.fStyle,o.getFontByName(t.f).fFamily),i?0:h.w*t.finalSize/100):o.measureText(a,t.f,t.finalSize)," "===F?M+=_+D:(y+=_+D+M,M=0),p.push({l:_,an:_,add:d,n:i,anIndexes:[],val:a,line:u,animatorJustifyOffset:0}),2==m){if(d+=_,""===a||" "===a||e===s-1){for(""!==a&&" "!==a||(d-=_);c<=e;)p[c].an=d,p[c].ind=f,p[c].extra=_,c+=1;f+=1,d=0}}else if(3==m){if(d+=_,""===a||e===s-1){for(""===a&&(d-=_);c<=e;)p[c].an=d,p[c].ind=f,p[c].extra=_,c+=1;d=0,f+=1}}else p[f].ind=f,p[f].extra=0,f+=1;if(t.l=p,v=v<y?y:v,g.push(y),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=g;var I,E,L,R,V=l.a;n=V.length;var N=[];for(r=0;r<n;r+=1){for((I=V[r]).a.sc&&(t.strokeColorAnim=!0),I.a.sw&&(t.strokeWidthAnim=!0),(I.a.fc||I.a.fh||I.a.fs||I.a.fb)&&(t.fillColorAnim=!0),R=0,L=I.s.b,e=0;e<s;e+=1)(E=p[e]).anIndexes[r]=R,(1==L&&""!==E.val||2==L&&""!==E.val&&" "!==E.val||3==L&&(E.n||" "==E.val||e==s-1)||4==L&&(E.n||e==s-1))&&(1===I.s.rn&&N.push(R),R+=1);l.a[r].s.totalChars=R;var z,O=-1;if(1===I.s.rn)for(e=0;e<s;e+=1)O!=(E=p[e]).anIndexes[r]&&(O=E.anIndexes[r],z=N.splice(Math.floor(Math.random()*N.length),1)[0]),E.anIndexes[r]=z}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=b.ascent*t.finalSize/100},ct.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var s=this.copyData({},this.data.d.k[e].s);s=this.copyData(s,t),this.data.d.k[e].s=s,this.recalculate(e),this.elem.addDynamicProperty(this)},ct.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},ct.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},ct.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var ut,gt,yt,vt,bt,_t=function(){var d=Math.max,c=Math.min,u=Math.floor;function i(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=L.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?L.getProp(t,e.e,0,0,this):{v:100},this.o=L.getProp(t,e.o||{k:0},0,0,this),this.xe=L.getProp(t,e.xe||{k:0},0,0,this),this.ne=L.getProp(t,e.ne||{k:0},0,0,this),this.a=L.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}return i.prototype={getMult:function(t){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var e=0,s=0,i=1,a=1;0<this.ne.v?e=this.ne.v/100:s=-this.ne.v/100,0<this.xe.v?i=1-this.xe.v/100:a=1+this.xe.v/100;var r=W.getBezierEasing(e,s,i,a).get,n=0,h=this.finalS,o=this.finalE,l=this.data.sh;if(2===l)n=r(n=o===h?o<=t?1:0:d(0,c(.5/(o-h)+(t-h)/(o-h),1)));else if(3===l)n=r(n=o===h?o<=t?0:1:1-d(0,c(.5/(o-h)+(t-h)/(o-h),1)));else if(4===l)o===h?n=0:(n=d(0,c(.5/(o-h)+(t-h)/(o-h),1)))<.5?n*=2:n=1-2*(n-.5),n=r(n);else if(5===l){if(o===h)n=0;else{var p=o-h,f=-p/2+(t=c(d(0,t+.5-h),o-h)),m=p/2;n=Math.sqrt(1-f*f/(m*m))}n=r(n)}else n=6===l?r(n=o===h?0:(t=c(d(0,t+.5-h),o-h),(1+Math.cos(Math.PI+2*Math.PI*t/(o-h)))/2)):(t>=u(h)&&(n=d(0,c(t-h<0?c(o,1)-(h-t):o-t,1))),r(n));return n*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,s=this.o.v/e,i=this.s.v/e+s,a=this.e.v/e+s;if(a<i){var r=i;i=a,a=r}this.finalS=i,this.finalE=a}},F([w],i),{getTextSelectorProp:function(t,e,s){return new i(t,e,s)}}}(),Ct=function(t,e,s){var i=0,a=t,r=x(a);return{newElement:function(){return i?r[i-=1]:e()},release:function(t){i===a&&(r=kt.double(r),a*=2),s&&s(t),r[i]=t,i+=1}}},kt={double:function(t){return t.concat(x(t.length))}},Dt=Ct(8,function(){return j("float32",2)}),St=((ut=Ct(4,function(){return new V},function(t){var e,s=t._length;for(e=0;e<s;e+=1)Dt.release(t.v[e]),Dt.release(t.i[e]),Dt.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1})).clone=function(t){var e,s=ut.newElement(),i=void 0===t._length?t.v.length:t._length;for(s.setLength(i),s.c=t.c,e=0;e<i;e+=1)s.setTripleAt(t.v[e][0],t.v[e][1],t.o[e][0],t.o[e][1],t.i[e][0],t.i[e][1],e);return s},ut),xt=(gt={newShapeCollection:function(){var t;t=yt?bt[yt-=1]:new Z;return t},release:function(t){var e,s=t._length;for(e=0;e<s;e+=1)St.release(t.shapes[e]);t._length=0,yt===vt&&(bt=kt.double(bt),vt*=2);bt[yt]=t,yt+=1}},yt=0,bt=x(vt=4),gt),Pt=Ct(8,function(){return{lengths:[],totalLength:0}},function(t){var e,s=t.lengths.length;for(e=0;e<s;e+=1)wt.release(t.lengths[e]);t.lengths.length=0}),wt=Ct(8,function(){return{addedLength:0,percents:j("float32",D),lengths:j("float32",D)}});function Tt(){}function At(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=createNS("svg");var s="";if(e&&e.title){var i=createNS("title"),a=S();i.setAttribute("id",a),i.textContent=e.title,this.svgElement.appendChild(i),s+=a}if(e&&e.description){var r=createNS("desc"),n=S();r.setAttribute("id",n),r.textContent=e.description,this.svgElement.appendChild(r),s+=" "+n}s&&this.svgElement.setAttribute("aria-labelledby",s);var h=createNS("defs");this.svgElement.appendChild(h);var o=createNS("g");this.svgElement.appendChild(o),this.layerElement=o,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!(e&&!1===e.hideOnTransparent),viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||"",id:e&&e.id||"",focusable:e&&e.focusable,filterSize:{width:e&&e.filterSize&&e.filterSize.width||"100%",height:e&&e.filterSize&&e.filterSize.height||"100%",x:e&&e.filterSize&&e.filterSize.x||"0%",y:e&&e.filterSize&&e.filterSize.y||"0%"}},this.globalData={_mdf:!1,frameNum:-1,defs:h,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}function Ft(t,e){this.animationItem=t,this.renderConfig={clearCanvas:!e||void 0===e.clearCanvas||e.clearCanvas,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",className:e&&e.className||"",id:e&&e.id||""},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,_mdf:!1,renderConfig:this.renderConfig,currentGlobalAlpha:-1},this.contextData=new Qt,this.elements=[],this.pendingElements=[],this.transformMat=new E,this.completeLayers=!1,this.rendererType="canvas"}function Mt(t,e,s){this.data=t,this.element=e,this.globalData=s,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var i,a,r=this.globalData.defs,n=this.masksProperties?this.masksProperties.length:0;this.viewData=x(n),this.solidPath="";var h,o,l,p,f,m,d=this.masksProperties,c=0,u=[],g=S(),y="clipPath",v="clip-path";for(i=0;i<n;i+=1)if(("a"!==d[i].mode&&"n"!==d[i].mode||d[i].inv||100!==d[i].o.k||d[i].o.x)&&(v=y="mask"),"s"!==d[i].mode&&"i"!==d[i].mode||0!==c?l=null:((l=createNS("rect")).setAttribute("fill","#ffffff"),l.setAttribute("width",this.element.comp.data.w||0),l.setAttribute("height",this.element.comp.data.h||0),u.push(l)),a=createNS("path"),"n"===d[i].mode)this.viewData[i]={op:L.getProp(this.element,d[i].o,0,.01,this.element),prop:O.getShapeProp(this.element,d[i],3),elem:a,lastPath:""},r.appendChild(a);else{var b;if(c+=1,a.setAttribute("fill","s"===d[i].mode?"#000000":"#ffffff"),a.setAttribute("clip-rule","nonzero"),0!==d[i].x.k?(v=y="mask",m=L.getProp(this.element,d[i].x,0,null,this.element),b=S(),(p=createNS("filter")).setAttribute("id",b),(f=createNS("feMorphology")).setAttribute("operator","erode"),f.setAttribute("in","SourceGraphic"),f.setAttribute("radius","0"),p.appendChild(f),r.appendChild(p),a.setAttribute("stroke","s"===d[i].mode?"#000000":"#ffffff")):m=f=null,this.storedData[i]={elem:a,x:m,expan:f,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"===d[i].mode){o=u.length;var _=createNS("g");for(h=0;h<o;h+=1)_.appendChild(u[h]);var C=createNS("mask");C.setAttribute("mask-type","alpha"),C.setAttribute("id",g+"_"+c),C.appendChild(a),r.appendChild(C),_.setAttribute("mask","url("+k+"#"+g+"_"+c+")"),u.length=0,u.push(_)}else u.push(a);d[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:a,lastPath:"",op:L.getProp(this.element,d[i].o,0,.01,this.element),prop:O.getShapeProp(this.element,d[i],3),invRect:l},this.viewData[i].prop.k||this.drawPath(d[i],this.viewData[i].prop.v,this.viewData[i])}for(this.maskElement=createNS(y),n=u.length,i=0;i<n;i+=1)this.maskElement.appendChild(u[i]);0<c&&(this.maskElement.setAttribute("id",g),this.element.maskedElement.setAttribute(v,"url("+k+"#"+g+")"),r.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}function It(){}function Et(){}function Lt(){}function Rt(){}function Vt(){}function Nt(t,e){this.elem=t,this.pos=e}function zt(t,e,s){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=s,this.lvl=e,this._isAnimated=!!s.k;for(var i=0,a=t.length;i<a;){if(t[i].mProps.dynamicProperties.length){this._isAnimated=!0;break}i+=1}}function Ot(){this.it=[],this.prevViewData=[],this.gr=createNS("g")}function qt(){this.sequences={},this.sequenceList=[],this.transform_key_count=0}function Bt(t,e,s,i){this.styledShapes=[],this.tr=[0,0,0,0,0,0];var a,r=4;"rc"===e.ty?r=5:"el"===e.ty?r=6:"sr"===e.ty&&(r=7),this.sh=O.getShapeProp(t,e,r,t);var n,h=s.length;for(a=0;a<h;a+=1)s[a].closed||(n={transforms:i.addTransformSequence(s[a].transforms),trNodes:[]},this.styledShapes.push(n),s[a].elements.push(n))}function jt(){}function Wt(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initFrame(),this.initTransform(t,e,s),this.initHierarchy()}function Yt(){}function Gt(){}function Xt(){}function Ht(){}function Kt(t,e,s){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,s),this.sourceRect={top:0,left:0,width:this.assetData.w,height:this.assetData.h}}function Jt(t,e,s){this.initElement(t,e,s)}function Zt(t,e,s){this.initFrame(),this.initRenderable(),this.assetData=e.getAssetData(t.refId),this.initBaseData(t,e,s),this._isPlaying=!1,this._canPlay=!1;var i=this.globalData.getAssetsPath(this.assetData);this.audio=this.globalData.audioController.createAudio(i),this._currentTime=0,this.globalData.audioController.addAudio(this),this.tm=t.tm?L.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function Ut(t,e,s){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,s),this.prevViewData=[]}function Qt(){var t;this.saved=[],this.cArrPos=0,this.cTr=new E,this.cO=1;for(this.savedOp=j("float32",15),t=0;t<15;t+=1)this.saved[t]=j("float32",16);this._length=15}function $t(){}function te(t,e,s){this.assetData=e.getAssetData(t.refId),this.img=e.imageLoader.getImage(this.assetData),this.initElement(t,e,s)}function ee(t,e,s){this.completeLayers=!1,this.layers=t.layers,this.pendingElements=[],this.elements=x(this.layers.length),this.initElement(t,e,s),this.tm=t.tm?L.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function se(t,e){var s;this.data=t,this.element=e,this.masksProperties=this.data.masksProperties||[],this.viewData=x(this.masksProperties.length);var i=this.masksProperties.length,a=!1;for(s=0;s<i;s+=1)"n"!==this.masksProperties[s].mode&&(a=!0),this.viewData[s]=O.getShapeProp(this.element,this.masksProperties[s],3);(this.hasMasks=a)&&this.element.addRenderableComponent(this)}function ie(t,e,s){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.itemsData=[],this.prevViewData=[],this.shapeModifiers=[],this.processedElements=[],this.transformsManager=new qt,this.initElement(t,e,s)}function ae(t,e,s){this.initElement(t,e,s)}function re(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.initElement(t,e,s)}function ne(){}Tt.prototype.checkLayers=function(t){var e,s,i=this.layers.length;for(this.completeLayers=!0,e=i-1;0<=e;e-=1)this.elements[e]||(s=this.layers[e]).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;this.checkPendingElements()},Tt.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 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 6:return this.createAudio(t);case 13:return this.createCamera(t);default:return this.createNull(t)}},Tt.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},Tt.prototype.createAudio=function(t){return new Zt(t,this.globalData,this)},Tt.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},Tt.prototype.includeLayers=function(t){var e;this.completeLayers=!1;var s,i=t.length,a=this.layers.length;for(e=0;e<i;e+=1)for(s=0;s<a;){if(this.layers[s].id===t[e].id){this.layers[s]=t[e];break}s+=1}},Tt.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},Tt.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},Tt.prototype.buildElementParenting=function(t,e,s){for(var i=this.elements,a=this.layers,r=0,n=a.length;r<n;)a[r].ind==e&&(i[r]&&!0!==i[r]?(s.push(i[r]),i[r].setAsParent(),void 0!==a[r].parent?this.buildElementParenting(t,a[r].parent,s):t.setHierarchy(s)):(this.buildItem(r),this.addPendingElement(t))),r+=1},Tt.prototype.addPendingElement=function(t){this.pendingElements.push(t)},Tt.prototype.searchExtraCompositions=function(t){var e,s=t.length;for(e=0;e<s;e+=1)if(t[e].xt){var i=this.createComp(t[e]);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},Tt.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new I,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.audioController=this.animationItem.audioController,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}},F([Tt],At),At.prototype.createNull=function(t){return new Wt(t,this.globalData,this)},At.prototype.createShape=function(t){return new Ut(t,this.globalData,this)},At.prototype.createText=function(t){return new SVGTextLottieElement(t,this.globalData,this)},At.prototype.createImage=function(t){return new Kt(t,this.globalData,this)},At.prototype.createComp=function(t){return new SVGCompElement(t,this.globalData,this)},At.prototype.createSolid=function(t){return new Jt(t,this.globalData,this)},At.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)"),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.svgElement.setAttribute("id",this.renderConfig.id),void 0!==this.renderConfig.focusable&&this.svgElement.setAttribute("focusable",this.renderConfig.focusable),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var s=createNS("clipPath"),i=createNS("rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var a=S();s.setAttribute("id",a),s.appendChild(i),this.layerElement.setAttribute("clip-path","url("+k+"#"+a+")"),e.appendChild(s),this.layers=t.layers,this.elements=x(t.layers.length)},At.prototype.destroy=function(){var t;this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),this.layerElement=null,this.globalData.defs=null;var e=this.layers?this.layers.length:0;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},At.prototype.updateContainerSize=function(){},At.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,h&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.elements[t-1]&&!0!==this.elements[t-1]?s.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(s)))}},At.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;e<s;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},At.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){var e;null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;0<=e;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<s;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},At.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var i,a=0;a<e;)this.elements[a]&&!0!==this.elements[a]&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?this.layerElement.insertBefore(s,i):this.layerElement.appendChild(s)}},At.prototype.hide=function(){this.layerElement.style.display="none"},At.prototype.show=function(){this.layerElement.style.display="block"},F([Tt],Ft),Ft.prototype.createShape=function(t){return new ie(t,this.globalData,this)},Ft.prototype.createText=function(t){return new re(t,this.globalData,this)},Ft.prototype.createImage=function(t){return new te(t,this.globalData,this)},Ft.prototype.createComp=function(t){return new ee(t,this.globalData,this)},Ft.prototype.createSolid=function(t){return new ae(t,this.globalData,this)},Ft.prototype.createNull=At.prototype.createNull,Ft.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){this.transformMat.cloneFromProps(t);var e=this.contextData.cTr.props;this.transformMat.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.contextData.cTr.cloneFromProps(this.transformMat.props);var s=this.contextData.cTr.props;this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13])}else this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13])},Ft.prototype.ctxOpacity=function(t){if(!this.renderConfig.clearCanvas)return this.canvasContext.globalAlpha*=t<0?0:t,void(this.globalData.currentGlobalAlpha=this.contextData.cO);this.contextData.cO*=t<0?0:t,this.globalData.currentGlobalAlpha!==this.contextData.cO&&(this.canvasContext.globalAlpha=this.contextData.cO,this.globalData.currentGlobalAlpha=this.contextData.cO)},Ft.prototype.reset=function(){this.renderConfig.clearCanvas?this.contextData.reset():this.canvasContext.restore()},Ft.prototype.save=function(t){if(this.renderConfig.clearCanvas){t&&this.canvasContext.save();var e,s=this.contextData.cTr.props;this.contextData._length<=this.contextData.cArrPos&&this.contextData.duplicate();var i=this.contextData.saved[this.contextData.cArrPos];for(e=0;e<16;e+=1)i[e]=s[e];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1}else this.canvasContext.save()},Ft.prototype.restore=function(t){if(this.renderConfig.clearCanvas){t&&(this.canvasContext.restore(),this.globalData.blendMode="source-over"),this.contextData.cArrPos-=1;var e,s=this.contextData.saved[this.contextData.cArrPos],i=this.contextData.cTr.props;for(e=0;e<16;e+=1)i[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.globalData.currentGlobalAlpha!==s&&(this.canvasContext.globalAlpha=s,this.globalData.currentGlobalAlpha=s)}else this.canvasContext.restore()},Ft.prototype.configAnimation=function(t){if(this.animationItem.wrapper){this.animationItem.container=P("canvas");var e=this.animationItem.container.style;e.width="100%",e.height="100%";var s="0px 0px 0px";e.transformOrigin=s,e.mozTransformOrigin=s,e.webkitTransformOrigin=s,e["-webkit-transform"]=s,this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d"),this.renderConfig.className&&this.animationItem.container.setAttribute("class",this.renderConfig.className),this.renderConfig.id&&this.animationItem.container.setAttribute("id",this.renderConfig.id)}else this.canvasContext=this.renderConfig.context;this.data=t,this.layers=t.layers,this.transformCanvas={w:t.w,h:t.h,sx:0,sy:0,tx:0,ty:0},this.setupGlobalData(t,document.body),this.globalData.canvasContext=this.canvasContext,(this.globalData.renderer=this).globalData.isDashed=!1,this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.transformCanvas=this.transformCanvas,this.elements=x(t.layers.length),this.updateContainerSize()},Ft.prototype.updateContainerSize=function(){var t,e,s,i;if(this.reset(),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),-1!==this.renderConfig.preserveAspectRatio.indexOf("meet")||-1!==this.renderConfig.preserveAspectRatio.indexOf("slice")){var a=this.renderConfig.preserveAspectRatio.split(" "),r=a[1]||"meet",n=a[0]||"xMidYMid",h=n.substr(0,4),o=n.substr(4);s=t/e,i=this.transformCanvas.w/this.transformCanvas.h,this.transformCanvas.sy=s<i&&"meet"===r||i<s&&"slice"===r?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),e/(this.transformCanvas.h/this.renderConfig.dpr)),this.transformCanvas.tx="xMid"===h&&(i<s&&"meet"===r||s<i&&"slice"===r)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===h&&(i<s&&"meet"===r||s<i&&"slice"===r)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===o&&(s<i&&"meet"===r||i<s&&"slice"===r)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===o&&(s<i&&"meet"===r||i<s&&"slice"===r)?(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.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],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(),this.renderFrame(this.renderedFrame,!0)},Ft.prototype.destroy=function(){var t;for(this.renderConfig.clearCanvas&&this.animationItem.wrapper&&(this.animationItem.wrapper.innerText=""),t=(this.layers?this.layers.length:0)-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},Ft.prototype.renderFrame=function(t,e){if((this.renderedFrame!==t||!0!==this.renderConfig.clearCanvas||e)&&!this.destroyed&&-1!==t){var s;this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem._isFirstFrame,this.globalData.frameId+=1,this.globalData._mdf=!this.renderConfig.clearCanvas||e,this.globalData.projectInterface.currentFrame=t;var i=this.layers.length;for(this.completeLayers||this.checkLayers(t),s=0;s<i;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(t-this.layers[s].st);if(this.globalData._mdf){for(!0===this.renderConfig.clearCanvas?this.canvasContext.clearRect(0,0,this.transformCanvas.w,this.transformCanvas.h):this.save(),s=i-1;0<=s;s-=1)(this.completeLayers||this.elements[s])&&this.elements[s].renderFrame();!0!==this.renderConfig.clearCanvas&&this.restore()}}},Ft.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).initExpressions()}},Ft.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){this.pendingElements.pop().checkParenting()}},Ft.prototype.hide=function(){this.animationItem.container.style.display="none"},Ft.prototype.show=function(){this.animationItem.container.style.display="block"},Mt.prototype.getMaskProperty=function(t){return this.viewData[t].prop},Mt.prototype.renderFrame=function(t){var e,s=this.element.finalTransform.mat,i=this.masksProperties.length;for(e=0;e<i;e+=1)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&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||t)&&this.viewData[e].invRect.setAttribute("transform",s.getInverseMatrix().to2dCSS()),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var a=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("+k+"#"+this.storedData[e].filterId+")")),a.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))}},Mt.prototype.getMaskelement=function(){return this.maskElement},Mt.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+" "},Mt.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;i<a;i+=1)r+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];if(e.c&&1<a&&(r+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),s.lastPath!==r){var n="";s.elem&&(e.c&&(n=t.inv?this.solidPath+r:r),s.elem.setAttribute("d",n)),s.lastPath=r}},Mt.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null},It.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},Et.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var s,i=this.dynamicProperties.length;for(s=0;s<i;s+=1)(e||this._isParent&&"transform"===this.dynamicProperties[s].propType)&&(this.dynamicProperties[s].getValue(),this.dynamicProperties[s]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}},Lt.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?R.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new E},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,s=0,i=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;s<i;){if(this.hierarchy[s].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}s+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),s=0;s<i;s+=1)t=this.hierarchy[s].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var s,i=!0,a=this.comp;i;)a.finalTransform?(a.data.hasMask&&e.splice(0,0,a.finalTransform),a=a.comp):i=!1;var r,n=e.length;for(s=0;s<n;s+=1)r=e[s].mat.applyToPointArray(0,0,0),t=[t[0]-r[0],t[1]-r[1],0];return t},mHelper:new E},Rt.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},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}}},F([Rt,function(t){function e(){}return e.prototype=t,e}({initElement:function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],Vt),zt.prototype.setAsAnimated=function(){this._isAnimated=!0},qt.prototype={addTransformSequence:function(t){var e,s=t.length,i="_";for(e=0;e<s;e+=1)i+=t[e].transform.key+"_";var a=this.sequences[i];return a||(a={transforms:[].concat(t),finalTransform:new E,_mdf:!1},this.sequences[i]=a,this.sequenceList.push(a)),a},processSequence:function(t,e){for(var s,i=0,a=t.transforms.length,r=e;i<a&&!e;){if(t.transforms[i].transform.mProps._mdf){r=!0;break}i+=1}if(r)for(t.finalTransform.reset(),i=a-1;0<=i;i-=1)s=t.transforms[i].transform.mProps.v.props,t.finalTransform.transform(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15]);t._mdf=r},processSequences:function(t){var e,s=this.sequenceList.length;for(e=0;e<s;e+=1)this.processSequence(this.sequenceList[e],t)},getNewKey:function(){return this.transform_key_count+=1,"_"+this.transform_key_count}},Bt.prototype.setAsAnimated=zt.prototype.setAsAnimated,jt.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&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(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var t=A(this.data.bm);(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,s){this.globalData=e,this.comp=s,this.data=t,this.layerId=S(),this.data.sr||(this.data.sr=1),this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},Wt.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},Wt.prototype.renderFrame=function(){},Wt.prototype.getBaseElement=function(){return null},Wt.prototype.destroy=function(){},Wt.prototype.sourceRectAtTime=function(){},Wt.prototype.hide=function(){},F([jt,Lt,It,Et],Wt),Yt.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t,e,s,i=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var a=createNS("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),a.appendChild(this.layerElement),i=a,this.globalData.defs.appendChild(a),at.maskType||1!=this.data.td||(a.setAttribute("mask-type","luminance"),t=S(),e=rt.createFilter(t),this.globalData.defs.appendChild(e),e.appendChild(rt.createAlphaToLuminanceFilter()),(s=createNS("g")).appendChild(this.layerElement),i=s,a.appendChild(s),s.setAttribute("filter","url("+k+"#"+t+")"))}else if(2==this.data.td){var r=createNS("mask");r.setAttribute("id",this.layerId),r.setAttribute("mask-type","alpha");var n=createNS("g");r.appendChild(n),t=S(),e=rt.createFilter(t);var h=createNS("feComponentTransfer");h.setAttribute("in","SourceGraphic"),e.appendChild(h);var o=createNS("feFuncA");o.setAttribute("type","table"),o.setAttribute("tableValues","1.0 0.0"),h.appendChild(o),this.globalData.defs.appendChild(e);var l=createNS("rect");l.setAttribute("width",this.comp.data.w),l.setAttribute("height",this.comp.data.h),l.setAttribute("x","0"),l.setAttribute("y","0"),l.setAttribute("fill","#ffffff"),l.setAttribute("opacity","0"),n.setAttribute("filter","url("+k+"#"+t+")"),n.appendChild(l),n.appendChild(this.layerElement),i=n,at.maskType||(r.setAttribute("mask-type","luminance"),e.appendChild(rt.createAlphaToLuminanceFilter()),s=createNS("g"),n.appendChild(l),s.appendChild(this.layerElement),i=s,n.appendChild(s)),this.globalData.defs.appendChild(r)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),i=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var p=createNS("clipPath"),f=createNS("path");f.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m=S();if(p.setAttribute("id",m),p.appendChild(f),this.globalData.defs.appendChild(p),this.checkMasks()){var d=createNS("g");d.setAttribute("clip-path","url("+k+"#"+m+")"),d.appendChild(this.layerElement),this.transformedElement=d,i?i.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+k+"#"+m+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new Mt(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+k+"#"+t+")")}},Gt.prototype={addShapeToModifiers:function(t){var e,s=this.shapeModifiers.length;for(e=0;e<s;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;0<=t;t-=1)this.shapeModifiers[t].processShapes(this._isFirstFrame)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"bevel"},searchProcessedElement:function(t){for(var e=this.processedElements,s=0,i=e.length;s<i;){if(e[s].elem===t)return e[s].pos;s+=1}return 0},addProcessedElement:function(t,e){for(var s=this.processedElements,i=s.length;i;)if(s[i-=1].elem===t)return void(s[i].pos=e);s.push(new Nt(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}},Xt.prototype.initElement=function(t,e,s){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,s),this.textProperty=new ct(this,t.t,this.dynamicProperties),this.textAnimator=new ht(t.t,this.renderType,this),this.initTransform(t,e,s),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},Xt.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},Xt.prototype.createPathShape=function(t,e){var s,i,a=e.length,r="";for(s=0;s<a;s+=1)i=e[s].ks.k,r+=et(i,i.i.length,!0,t);return r},Xt.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},Xt.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},Xt.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},Xt.prototype.applyTextPropertiesToMatrix=function(t,e,s,i,a){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[s])/2,0,0)}e.translate(i,a,0)},Xt.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},Xt.prototype.emptyProp=new dt,Xt.prototype.destroy=function(){},F([jt,Lt,It,Et,Vt],Ht),Ht.prototype.initElement=function(t,e,s){this.initFrame(),this.initBaseData(t,e,s),this.initTransform(t,e,s),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},Ht.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var s,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=i-1;0<=s;s-=1)(this.completeLayers||this.elements[s])&&(this.elements[s].prepareFrame(this.renderedFrame-this.layers[s].st),this.elements[s]._mdf&&(this._mdf=!0))}},Ht.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},Ht.prototype.setElements=function(t){this.elements=t},Ht.prototype.getElements=function(){return this.elements},Ht.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},Ht.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},F([jt,Lt,Yt,It,Et,Vt],Kt),Kt.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},Kt.prototype.sourceRectAtTime=function(){return this.sourceRect},F([Kt],Jt),Jt.prototype.createContent=function(){var t=createNS("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},Zt.prototype.prepareFrame=function(t){if(this.prepareRenderableFrame(t,!0),this.prepareProperties(t,!0),this.tm._placeholder)this._currentTime=t/this.data.sr;else{var e=this.tm.v;this._currentTime=e}},F([Rt,jt,Et],Zt),Zt.prototype.renderFrame=function(){this.isInRange&&this._canPlay&&(this._isPlaying?(!this.audio.playing()||.1<Math.abs(this._currentTime/this.globalData.frameRate-this.audio.seek()))&&this.audio.seek(this._currentTime/this.globalData.frameRate):(this.audio.play(),this.audio.seek(this._currentTime/this.globalData.frameRate),this._isPlaying=!0))},Zt.prototype.show=function(){},Zt.prototype.hide=function(){this.audio.pause(),this._isPlaying=!1},Zt.prototype.pause=function(){this.audio.pause(),this._isPlaying=!1,this._canPlay=!1},Zt.prototype.resume=function(){this._canPlay=!0},Zt.prototype.setRate=function(t){this.audio.rate(t)},Zt.prototype.volume=function(t){this.audio.volume(t)},Zt.prototype.getBaseElement=function(){return null},Zt.prototype.destroy=function(){},Zt.prototype.sourceRectAtTime=function(){},Zt.prototype.initExpressions=function(){},F([jt,Lt,Yt,Gt,It,Et,Vt],Ut),Ut.prototype.initSecondaryElement=function(){},Ut.prototype.identityMatrix=new E,Ut.prototype.buildExpressionInterface=function(){},Ut.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},Ut.prototype.filterUniqueShapes=function(){var t,e,s,i,a=this.shapes.length,r=this.stylesList.length,n=[],h=!1;for(s=0;s<r;s+=1){for(i=this.stylesList[s],h=!1,t=n.length=0;t<a;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(i)&&(n.push(e),h=e._isAnimated||h);1<n.length&&h&&this.setShapesAsAnimated(n)}},Ut.prototype.setShapesAsAnimated=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e].setAsAnimated()},Ut.prototype.createStyleElement=function(t,e){var s,i=new SVGStyleData(t,e),a=i.pElem;if("st"===t.ty)s=new SVGStrokeStyleData(this,t,i);else if("fl"===t.ty)s=new SVGFillStyleData(this,t,i);else if("gf"===t.ty||"gs"===t.ty){s=new("gf"===t.ty?SVGGradientFillStyleData:SVGGradientStrokeStyleData)(this,t,i),this.globalData.defs.appendChild(s.gf),s.maskId&&(this.globalData.defs.appendChild(s.ms),this.globalData.defs.appendChild(s.of),a.setAttribute("mask","url("+k+"#"+s.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(a.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),a.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),a.setAttribute("fill-opacity","0"),1===t.lj&&a.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&a.setAttribute("fill-rule","evenodd"),t.ln&&a.setAttribute("id",t.ln),t.cl&&a.setAttribute("class",t.cl),t.bm&&(a.style["mix-blend-mode"]=A(t.bm)),this.stylesList.push(i),this.addToAnimatedContents(t,s),s},Ut.prototype.createGroupElement=function(t){var e=new Ot;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),t.bm&&(e.gr.style["mix-blend-mode"]=A(t.bm)),e},Ut.prototype.createTransformElement=function(t,e){var s=R.getTransformProperty(this,t,this),i=new SVGTransformData(s,s.o,e);return this.addToAnimatedContents(t,i),i},Ut.prototype.createShapeElement=function(t,e,s){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var a=new zt(e,s,O.getShapeProp(this,t,i,this));return this.shapes.push(a),this.addShapeToModifiers(a),this.addToAnimatedContents(t,a),a},Ut.prototype.addToAnimatedContents=function(t,e){for(var s=0,i=this.animatedContents.length;s<i;){if(this.animatedContents[s].element===e)return;s+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(t),element:e,data:t})},Ut.prototype.setElementStyles=function(t){var e,s=t.styles,i=this.stylesList.length;for(e=0;e<i;e+=1)this.stylesList[e].closed||s.push(this.stylesList[e])},Ut.prototype.reloadShapes=function(){var t;this._isFirstFrame=!0;var e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},Ut.prototype.searchShapes=function(t,e,s,i,a,r,n){var h,o,l,p,f,m,d=[].concat(r),c=t.length-1,u=[],g=[];for(h=c;0<=h;h-=1){if((m=this.searchProcessedElement(t[h]))?e[h]=s[m-1]:t[h]._render=n,"fl"===t[h].ty||"st"===t[h].ty||"gf"===t[h].ty||"gs"===t[h].ty)m?e[h].style.closed=!1:e[h]=this.createStyleElement(t[h],a),t[h]._render&&i.appendChild(e[h].style.pElem),u.push(e[h].style);else if("gr"===t[h].ty){if(m)for(l=e[h].it.length,o=0;o<l;o+=1)e[h].prevViewData[o]=e[h].it[o];else e[h]=this.createGroupElement(t[h]);this.searchShapes(t[h].it,e[h].it,e[h].prevViewData,e[h].gr,a+1,d,n),t[h]._render&&i.appendChild(e[h].gr)}else"tr"===t[h].ty?(m||(e[h]=this.createTransformElement(t[h],i)),p=e[h].transform,d.push(p)):"sh"===t[h].ty||"rc"===t[h].ty||"el"===t[h].ty||"sr"===t[h].ty?(m||(e[h]=this.createShapeElement(t[h],d,a)),this.setElementStyles(e[h])):"tm"===t[h].ty||"rd"===t[h].ty||"ms"===t[h].ty||"pb"===t[h].ty?(m?(f=e[h]).closed=!1:((f=Y.getModifier(t[h].ty)).init(this,t[h]),e[h]=f,this.shapeModifiers.push(f)),g.push(f)):"rp"===t[h].ty&&(m?(f=e[h]).closed=!0:(f=Y.getModifier(t[h].ty),(e[h]=f).init(this,t,h,e),this.shapeModifiers.push(f),n=!1),g.push(f));this.addProcessedElement(t[h],h+1)}for(c=u.length,h=0;h<c;h+=1)u[h].closed=!0;for(c=g.length,h=0;h<c;h+=1)g[h].closed=!0},Ut.prototype.renderInnerContent=function(){var t;this.renderModifiers();var e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},Ut.prototype.renderShape=function(){var t,e,s=this.animatedContents.length;for(t=0;t<s;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},Ut.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},Qt.prototype.duplicate=function(){var t=2*this._length,e=this.savedOp;this.savedOp=j("float32",t),this.savedOp.set(e);var s=0;for(s=this._length;s<t;s+=1)this.saved[s]=j("float32",16);this._length=t},Qt.prototype.reset=function(){this.cArrPos=0,this.cTr.reset(),this.cO=1},($t.prototype={createElements:function(){},initRendererElement:function(){},createContainerElements:function(){this.canvasContext=this.globalData.canvasContext,this.renderableEffectsManager=new ne(this)},createContent:function(){},setBlendMode:function(){var t=this.globalData;if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e=A(this.data.bm);t.canvasContext.globalCompositeOperation=e}},createRenderableComponents:function(){this.maskManager=new se(this.data,this)},hideElement:function(){this.hidden||this.isInRange&&!this.isTransparent||(this.hidden=!0)},showElement:function(){this.isInRange&&!this.isTransparent&&(this.hidden=!1,this._isFirstFrame=!0,this.maskManager._isFirstFrame=!0)},renderFrame:function(){if(!this.hidden&&!this.data.hd){this.renderTransform(),this.renderRenderable(),this.setBlendMode();var t=0===this.data.ty;this.globalData.renderer.save(t),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v),this.renderInnerContent(),this.globalData.renderer.restore(t),this.maskManager.hasMasks&&this.globalData.renderer.restore(!0),this._isFirstFrame&&(this._isFirstFrame=!1)}},destroy:function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager.destroy()},mHelper:new E}).hide=$t.prototype.hideElement,$t.prototype.show=$t.prototype.showElement,F([jt,Lt,$t,It,Et,Rt],te),te.prototype.initElement=Ut.prototype.initElement,te.prototype.prepareFrame=Kt.prototype.prepareFrame,te.prototype.createContent=function(){if(this.img.width&&(this.assetData.w!==this.img.width||this.assetData.h!==this.img.height)){var t=P("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,s,i=t.getContext("2d"),a=this.img.width,r=this.img.height,n=a/r,h=this.assetData.w/this.assetData.h,o=this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio;h<n&&"xMidYMid slice"===o||n<h&&"xMidYMid slice"!==o?e=(s=r)*h:s=(e=a)/h,i.drawImage(this.img,(a-e)/2,(r-s)/2,e,s,0,0,this.assetData.w,this.assetData.h),this.img=t}},te.prototype.renderInnerContent=function(){this.canvasContext.drawImage(this.img,0,0)},te.prototype.destroy=function(){this.img=null},F([Ft,Ht,$t],ee),ee.prototype.renderInnerContent=function(){var t,e=this.canvasContext;for(e.beginPath(),e.moveTo(0,0),e.lineTo(this.data.w,0),e.lineTo(this.data.w,this.data.h),e.lineTo(0,this.data.h),e.lineTo(0,0),e.clip(),t=this.layers.length-1;0<=t;t-=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},ee.prototype.destroy=function(){var t;for(t=this.layers.length-1;0<=t;t-=1)this.elements[t]&&this.elements[t].destroy();this.layers=null,this.elements=null},se.prototype.renderFrame=function(){if(this.hasMasks){var t,e,s,i,a=this.element.finalTransform.mat,r=this.element.canvasContext,n=this.masksProperties.length;for(r.beginPath(),t=0;t<n;t+=1)if("n"!==this.masksProperties[t].mode){var h;this.masksProperties[t].inv&&(r.moveTo(0,0),r.lineTo(this.element.globalData.compSize.w,0),r.lineTo(this.element.globalData.compSize.w,this.element.globalData.compSize.h),r.lineTo(0,this.element.globalData.compSize.h),r.lineTo(0,0)),i=this.viewData[t].v,e=a.applyToPointArray(i.v[0][0],i.v[0][1],0),r.moveTo(e[0],e[1]);var o=i._length;for(h=1;h<o;h+=1)s=a.applyToTriplePoints(i.o[h-1],i.i[h],i.v[h]),r.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);s=a.applyToTriplePoints(i.o[h-1],i.i[0],i.v[0]),r.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5])}this.element.globalData.renderer.save(!0),r.clip()}},se.prototype.getMaskProperty=Mt.prototype.getMaskProperty,se.prototype.destroy=function(){this.element=null},F([jt,Lt,$t,Gt,It,Et,Rt],ie),ie.prototype.initElement=Vt.prototype.initElement,ie.prototype.transformHelper={opacity:1,_opMdf:!1},ie.prototype.dashResetter=[],ie.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[])},ie.prototype.createStyleElement=function(t,e){var s={data:t,type:t.ty,preTransforms:this.transformsManager.addTransformSequence(e),transforms:[],elements:[],closed:!0===t.hd},i={};if("fl"===t.ty||"st"===t.ty?(i.c=L.getProp(this,t.c,1,255,this),i.c.k||(s.co="rgb("+f(i.c.v[0])+","+f(i.c.v[1])+","+f(i.c.v[2])+")")):"gf"!==t.ty&&"gs"!==t.ty||(i.s=L.getProp(this,t.s,1,null,this),i.e=L.getProp(this,t.e,1,null,this),i.h=L.getProp(this,t.h||{k:0},0,.01,this),i.a=L.getProp(this,t.a||{k:0},0,B,this),i.g=new Q(this,t.g,this)),i.o=L.getProp(this,t.o,0,.01,this),"st"===t.ty||"gs"===t.ty){if(s.lc=this.lcEnum[t.lc]||"round",s.lj=this.ljEnum[t.lj]||"round",1==t.lj&&(s.ml=t.ml),i.w=L.getProp(this,t.w,0,null,this),i.w.k||(s.wi=i.w.v),t.d){var a=new U(this,t.d,"canvas",this);i.d=a,i.d.k||(s.da=i.d.dashArray,s.do=i.d.dashoffset[0])}}else s.r=2===t.r?"evenodd":"nonzero";return this.stylesList.push(s),i.style=s,i},ie.prototype.createGroupElement=function(){return{it:[],prevViewData:[]}},ie.prototype.createTransformElement=function(t){return{transform:{opacity:1,_opMdf:!1,key:this.transformsManager.getNewKey(),op:L.getProp(this,t.o,0,.01,this),mProps:R.getTransformProperty(this,t,this)}}},ie.prototype.createShapeElement=function(t){var e=new Bt(this,t,this.stylesList,this.transformsManager);return this.shapes.push(e),this.addShapeToModifiers(e),e},ie.prototype.reloadShapes=function(){var t;this._isFirstFrame=!0;var e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,!0,[]),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame)},ie.prototype.addTransformToStyleList=function(t){var e,s=this.stylesList.length;for(e=0;e<s;e+=1)this.stylesList[e].closed||this.stylesList[e].transforms.push(t)},ie.prototype.removeTransformFromStyleList=function(){var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].closed||this.stylesList[t].transforms.pop()},ie.prototype.closeStyles=function(t){var e,s=t.length;for(e=0;e<s;e+=1)t[e].closed=!0},ie.prototype.searchShapes=function(t,e,s,i,a){var r,n,h,o,l,p,f=t.length-1,m=[],d=[],c=[].concat(a);for(r=f;0<=r;r-=1){if((o=this.searchProcessedElement(t[r]))?e[r]=s[o-1]:t[r]._shouldRender=i,"fl"===t[r].ty||"st"===t[r].ty||"gf"===t[r].ty||"gs"===t[r].ty)o?e[r].style.closed=!1:e[r]=this.createStyleElement(t[r],c),m.push(e[r].style);else if("gr"===t[r].ty){if(o)for(h=e[r].it.length,n=0;n<h;n+=1)e[r].prevViewData[n]=e[r].it[n];else e[r]=this.createGroupElement(t[r]);this.searchShapes(t[r].it,e[r].it,e[r].prevViewData,i,c)}else"tr"===t[r].ty?(o||(p=this.createTransformElement(t[r]),e[r]=p),c.push(e[r]),this.addTransformToStyleList(e[r])):"sh"===t[r].ty||"rc"===t[r].ty||"el"===t[r].ty||"sr"===t[r].ty?o||(e[r]=this.createShapeElement(t[r])):"tm"===t[r].ty||"rd"===t[r].ty||"pb"===t[r].ty?(o?(l=e[r]).closed=!1:((l=Y.getModifier(t[r].ty)).init(this,t[r]),e[r]=l,this.shapeModifiers.push(l)),d.push(l)):"rp"===t[r].ty&&(o?(l=e[r]).closed=!0:(l=Y.getModifier(t[r].ty),(e[r]=l).init(this,t,r,e),this.shapeModifiers.push(l),i=!1),d.push(l));this.addProcessedElement(t[r],r+1)}for(this.removeTransformFromStyleList(),this.closeStyles(m),f=d.length,r=0;r<f;r+=1)d[r].closed=!0},ie.prototype.renderInnerContent=function(){this.transformHelper.opacity=1,this.transformHelper._opMdf=!1,this.renderModifiers(),this.transformsManager.processSequences(this._isFirstFrame),this.renderShape(this.transformHelper,this.shapesData,this.itemsData,!0)},ie.prototype.renderShapeTransform=function(t,e){(t._opMdf||e.op._mdf||this._isFirstFrame)&&(e.opacity=t.opacity,e.opacity*=e.op.v,e._opMdf=!0)},ie.prototype.drawLayer=function(){var t,e,s,i,a,r,n,h,o,l=this.stylesList.length,p=this.globalData.renderer,f=this.globalData.canvasContext;for(t=0;t<l;t+=1)if(("st"!==(h=(o=this.stylesList[t]).type)&&"gs"!==h||0!==o.wi)&&o.data._shouldRender&&0!==o.coOp&&0!==this.globalData.currentGlobalAlpha){for(p.save(),r=o.elements,"st"===h||"gs"===h?(f.strokeStyle="st"===h?o.co:o.grd,f.lineWidth=o.wi,f.lineCap=o.lc,f.lineJoin=o.lj,f.miterLimit=o.ml||0):f.fillStyle="fl"===h?o.co:o.grd,p.ctxOpacity(o.coOp),"st"!==h&&"gs"!==h&&f.beginPath(),p.ctxTransform(o.preTransforms.finalTransform.props),s=r.length,e=0;e<s;e+=1){for("st"!==h&&"gs"!==h||(f.beginPath(),o.da&&(f.setLineDash(o.da),f.lineDashOffset=o.do)),a=(n=r[e].trNodes).length,i=0;i<a;i+=1)"m"===n[i].t?f.moveTo(n[i].p[0],n[i].p[1]):"c"===n[i].t?f.bezierCurveTo(n[i].pts[0],n[i].pts[1],n[i].pts[2],n[i].pts[3],n[i].pts[4],n[i].pts[5]):f.closePath();"st"!==h&&"gs"!==h||(f.stroke(),o.da&&f.setLineDash(this.dashResetter))}"st"!==h&&"gs"!==h&&f.fill(o.r),p.restore()}},ie.prototype.renderShape=function(t,e,s,i){var a,r;for(r=t,a=e.length-1;0<=a;a-=1)"tr"===e[a].ty?(r=s[a].transform,this.renderShapeTransform(t,r)):"sh"===e[a].ty||"el"===e[a].ty||"rc"===e[a].ty||"sr"===e[a].ty?this.renderPath(e[a],s[a]):"fl"===e[a].ty?this.renderFill(e[a],s[a],r):"st"===e[a].ty?this.renderStroke(e[a],s[a],r):"gf"===e[a].ty||"gs"===e[a].ty?this.renderGradientFill(e[a],s[a],r):"gr"===e[a].ty?this.renderShape(r,e[a].it,s[a].it):e[a].ty;i&&this.drawLayer()},ie.prototype.renderStyledShape=function(t,e){if(this._isFirstFrame||e._mdf||t.transforms._mdf){var s,i,a,r=t.trNodes,n=e.paths,h=n._length;r.length=0;var o=t.transforms.finalTransform;for(a=0;a<h;a+=1){var l=n.shapes[a];if(l&&l.v){for(i=l._length,s=1;s<i;s+=1)1===s&&r.push({t:"m",p:o.applyToPointArray(l.v[0][0],l.v[0][1],0)}),r.push({t:"c",pts:o.applyToTriplePoints(l.o[s-1],l.i[s],l.v[s])});1===i&&r.push({t:"m",p:o.applyToPointArray(l.v[0][0],l.v[0][1],0)}),l.c&&i&&(r.push({t:"c",pts:o.applyToTriplePoints(l.o[s-1],l.i[0],l.v[0])}),r.push({t:"z"}))}}t.trNodes=r}},ie.prototype.renderPath=function(t,e){if(!0!==t.hd&&t._shouldRender){var s,i=e.styledShapes.length;for(s=0;s<i;s+=1)this.renderStyledShape(e.styledShapes[s],e.sh)}},ie.prototype.renderFill=function(t,e,s){var i=e.style;(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+f(e.c.v[0])+","+f(e.c.v[1])+","+f(e.c.v[2])+")"),(e.o._mdf||s._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*s.opacity)},ie.prototype.renderGradientFill=function(t,e,s){var i,a=e.style;if(!a.grd||e.g._mdf||e.s._mdf||e.e._mdf||1!==t.t&&(e.h._mdf||e.a._mdf)){var r,n=this.globalData.canvasContext,h=e.s.v,o=e.e.v;if(1===t.t)i=n.createLinearGradient(h[0],h[1],o[0],o[1]);else{var l=Math.sqrt(Math.pow(h[0]-o[0],2)+Math.pow(h[1]-o[1],2)),p=Math.atan2(o[1]-h[1],o[0]-h[0]),f=e.h.v;1<=f?f=.99:f<=-1&&(f=-.99);var m=l*f,d=Math.cos(p+e.a.v)*m+h[0],c=Math.sin(p+e.a.v)*m+h[1];i=n.createRadialGradient(d,c,0,h[0],h[1],l)}var u=t.g.p,g=e.g.c,y=1;for(r=0;r<u;r+=1)e.g._hasOpacity&&e.g._collapsable&&(y=e.g.o[2*r+1]),i.addColorStop(g[4*r]/100,"rgba("+g[4*r+1]+","+g[4*r+2]+","+g[4*r+3]+","+y+")");a.grd=i}a.coOp=e.o.v*s.opacity},ie.prototype.renderStroke=function(t,e,s){var i=e.style,a=e.d;a&&(a._mdf||this._isFirstFrame)&&(i.da=a.dashArray,i.do=a.dashoffset[0]),(e.c._mdf||this._isFirstFrame)&&(i.co="rgb("+f(e.c.v[0])+","+f(e.c.v[1])+","+f(e.c.v[2])+")"),(e.o._mdf||s._opMdf||this._isFirstFrame)&&(i.coOp=e.o.v*s.opacity),(e.w._mdf||this._isFirstFrame)&&(i.wi=e.w.v)},ie.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.itemsData.length=0},F([jt,Lt,$t,It,Et,Rt],ae),ae.prototype.initElement=Ut.prototype.initElement,ae.prototype.prepareFrame=Kt.prototype.prepareFrame,ae.prototype.renderInnerContent=function(){var t=this.canvasContext;t.fillStyle=this.data.sc,t.fillRect(0,0,this.data.sw,this.data.sh)},F([jt,Lt,$t,It,Et,Rt,Xt],re),re.prototype.tHelper=P("canvas").getContext("2d"),re.prototype.buildNewText=function(){var t=this.textProperty.currentData;this.renderedLetters=x(t.l?t.l.length:0);var e=!1;t.fc?(e=!0,this.values.fill=this.buildColor(t.fc)):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;t.sc&&(s=!0,this.values.stroke=this.buildColor(t.sc),this.values.sWidth=t.sw);var i,a,r,n,h,o,l,p,f,m,d,c,u=this.globalData.fontManager.getFontByName(t.f),g=t.l,y=this.mHelper;this.stroke=s,this.values.fValue=t.finalSize+"px "+this.globalData.fontManager.getFontByName(t.f).fFamily,a=t.finalText.length;var v=this.data.singleShape,b=.001*t.tr*t.finalSize,_=0,C=0,k=!0,D=0;for(i=0;i<a;i+=1){for(n=(r=this.globalData.fontManager.getCharData(t.finalText[i],u.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily))&&r.data||{},y.reset(),v&&g[i].n&&(_=-b,C+=t.yOffset,C+=k?1:0,k=!1),f=(l=n.shapes?n.shapes[0].it:[]).length,y.scale(t.finalSize/100,t.finalSize/100),v&&this.applyTextPropertiesToMatrix(t,y,g[i].line,_,C),d=x(f),p=0;p<f;p+=1){for(o=l[p].ks.k.i.length,m=l[p].ks.k,c=[],h=1;h<o;h+=1)1===h&&c.push(y.applyToX(m.v[0][0],m.v[0][1],0),y.applyToY(m.v[0][0],m.v[0][1],0)),c.push(y.applyToX(m.o[h-1][0],m.o[h-1][1],0),y.applyToY(m.o[h-1][0],m.o[h-1][1],0),y.applyToX(m.i[h][0],m.i[h][1],0),y.applyToY(m.i[h][0],m.i[h][1],0),y.applyToX(m.v[h][0],m.v[h][1],0),y.applyToY(m.v[h][0],m.v[h][1],0));c.push(y.applyToX(m.o[h-1][0],m.o[h-1][1],0),y.applyToY(m.o[h-1][0],m.o[h-1][1],0),y.applyToX(m.i[0][0],m.i[0][1],0),y.applyToY(m.i[0][0],m.i[0][1],0),y.applyToX(m.v[0][0],m.v[0][1],0),y.applyToY(m.v[0][0],m.v[0][1],0)),d[p]=c}v&&(_+=g[i].l,_+=b),this.textSpans[D]?this.textSpans[D].elem=d:this.textSpans[D]={elem:d},D+=1}},re.prototype.renderInnerContent=function(){var t,e,s,i,a,r,n=this.canvasContext;n.font=this.values.fValue,n.lineCap="butt",n.lineJoin="miter",n.miterLimit=4,this.data.singleShape||this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag);var h,o=this.textAnimator.renderedLetters,l=this.textProperty.currentData.l;e=l.length;var p,f,m=null,d=null,c=null;for(t=0;t<e;t+=1)if(!l[t].n){if((h=o[t])&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(h.p),this.globalData.renderer.ctxOpacity(h.o)),this.fill){for(h&&h.fc?m!==h.fc&&(m=h.fc,n.fillStyle=h.fc):m!==this.values.fill&&(m=this.values.fill,n.fillStyle=this.values.fill),i=(p=this.textSpans[t].elem).length,this.globalData.canvasContext.beginPath(),s=0;s<i;s+=1)for(r=(f=p[s]).length,this.globalData.canvasContext.moveTo(f[0],f[1]),a=2;a<r;a+=6)this.globalData.canvasContext.bezierCurveTo(f[a],f[a+1],f[a+2],f[a+3],f[a+4],f[a+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(h&&h.sw?c!==h.sw&&(c=h.sw,n.lineWidth=h.sw):c!==this.values.sWidth&&(c=this.values.sWidth,n.lineWidth=this.values.sWidth),h&&h.sc?d!==h.sc&&(d=h.sc,n.strokeStyle=h.sc):d!==this.values.stroke&&(d=this.values.stroke,n.strokeStyle=this.values.stroke),i=(p=this.textSpans[t].elem).length,this.globalData.canvasContext.beginPath(),s=0;s<i;s+=1)for(r=(f=p[s]).length,this.globalData.canvasContext.moveTo(f[0],f[1]),a=2;a<r;a+=6)this.globalData.canvasContext.bezierCurveTo(f[a],f[a+1],f[a+2],f[a+3],f[a+4],f[a+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}h&&this.globalData.renderer.restore()}},ne.prototype.renderFrame=function(){};var he=function(){var t={},a=[],i=0,r=0,n=0,h=!0,o=!1;function s(t){for(var e=0,s=t.target;e<r;)a[e].animation===s&&(a.splice(e,1),e-=1,r-=1,s.isPaused||f()),e+=1}function l(t,e){if(!t)return null;for(var s=0;s<r;){if(a[s].elem===t&&null!==a[s].elem)return a[s].animation;s+=1}var i=new oe;return m(i,t),i.setData(t,e),i}function p(){n+=1,c()}function f(){n-=1}function m(t,e){t.addEventListener("destroy",s),t.addEventListener("_active",p),t.addEventListener("_idle",f),a.push({elem:e,animation:t}),r+=1}function d(t){var e,s=t-i;for(e=0;e<r;e+=1)a[e].animation.advanceTime(s);i=t,n&&!o?window.requestAnimationFrame(d):h=!0}function e(t){i=t,window.requestAnimationFrame(d)}function c(){!o&&n&&h&&(window.requestAnimationFrame(e),h=!1)}return t.registerAnimation=l,t.loadAnimation=function(t){var e=new oe;return m(e,null),e.setParams(t),e},t.setSpeed=function(t,e){var s;for(s=0;s<r;s+=1)a[s].animation.setSpeed(t,e)},t.setDirection=function(t,e){var s;for(s=0;s<r;s+=1)a[s].animation.setDirection(t,e)},t.play=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.play(t)},t.pause=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.pause(t)},t.stop=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.stop(t)},t.togglePause=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.togglePause(t)},t.searchAnimations=function(t,e,s){var i,a=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),r=a.length;for(i=0;i<r;i+=1)s&&a[i].setAttribute("data-bm-type",s),l(a[i],t);if(e&&0===r){s||(s="svg");var n=document.getElementsByTagName("body")[0];n.innerText="";var h=P("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",s),n.appendChild(h),l(h,t)}},t.resize=function(){var t;for(t=0;t<r;t+=1)a[t].animation.resize()},t.goToAndStop=function(t,e,s){var i;for(i=0;i<r;i+=1)a[i].animation.goToAndStop(t,e,s)},t.destroy=function(t){var e;for(e=r-1;0<=e;e-=1)a[e].animation.destroy(t)},t.freeze=function(){o=!0},t.unfreeze=function(){o=!1,c()},t.setVolume=function(t,e){var s;for(s=0;s<r;s+=1)a[s].animation.setVolume(t,e)},t.mute=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.mute(t)},t.unmute=function(t){var e;for(e=0;e<r;e+=1)a[e].animation.unmute(t)},t.getRegisteredAnimations=function(){var t,e=a.length,s=[];for(t=0;t<e;t+=1)s.push(a[t].animation);return s},t}(),oe=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.firstFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=S(),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.isSubframeEnabled=e,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface={},this.imagePreloader=new it,this.audioController=st()};F([b],oe),oe.prototype.setParams=function(t){(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e="svg";switch(t.animType?e=t.animType:t.renderer&&(e=t.renderer),e){case"canvas":this.renderer=new Ft(this,t.rendererSettings);break;case"svg":this.renderer=new At(this,t.rendererSettings);break;default:this.renderer=new HybridRenderer(this,t.rendererSettings)}this.imagePreloader.setCacheType(e,this.renderer.globalData.defs),this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||void 0===t.loop||!0===t.loop?this.loop=!0:!1===t.loop?this.loop=!1:this.loop=parseInt(t.loop,10),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!Object.prototype.hasOwnProperty.call(t,"autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,this.initialSegment=t.initialSegment,t.audioFactory&&this.audioController.setAudioFactory(t.audioFactory),t.animationData?this.configAnimation(t.animationData):t.path&&(-1!==t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),nt.load(t.path,this.configAnimation.bind(this),function(){this.trigger("data_failed")}.bind(this)))},oe.prototype.setData=function(t,e){e&&"object"!=typeof e&&(e=JSON.parse(e));var s={wrapper:t,animationData:e},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:"";"false"===a?s.loop=!1:"true"===a?s.loop=!0:""!==a&&(s.loop=parseInt(a,10));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;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:"","false"===(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:"")&&(s.prerender=!1),this.setParams(s)},oe.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,s,i=this.animationData.layers,a=i.length,r=t.layers,n=r.length;for(s=0;s<n;s+=1)for(e=0;e<a;){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;e<a;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,M.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),h&&h.initExpressions(this),this.loadNextSegment()},oe.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,nt.load(s,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},oe.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},oe.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},oe.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},oe.prototype.configAnimation=function(t){if(this.renderer)try{this.animationData=t,this.initialSegment?(this.totalFrames=Math.floor(this.initialSegment[1]-this.initialSegment[0]),this.firstFrame=Math.round(this.initialSegment[0])):(this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.firstFrame=Math.round(this.animationData.ip)),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.frameMult=this.animationData.fr/1e3,this.renderer.searchExtraCompositions(t.assets),this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded(),this.isPaused&&this.audioController.pause()}catch(t){this.triggerConfigError(t)}},oe.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.isLoaded?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},oe.prototype.checkLoaded=function(){this.isLoaded||!this.renderer.globalData.fontManager.isLoaded||!this.imagePreloader.loaded()&&"canvas"===this.renderer.rendererType||(this.isLoaded=!0,M.completeData(this.animationData,this.renderer.globalData.fontManager),h&&h.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play())},oe.prototype.resize=function(){this.renderer.updateContainerSize()},oe.prototype.setSubframe=function(t){this.isSubframeEnabled=!!t},oe.prototype.gotoFrame=function(){this.currentFrame=this.isSubframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},oe.prototype.renderFrame=function(){if(!1!==this.isLoaded)try{this.renderer.renderFrame(this.currentFrame+this.firstFrame)}catch(t){this.triggerRenderFrameError(t)}},oe.prototype.play=function(t){t&&this.name!==t||!0===this.isPaused&&(this.isPaused=!1,this.audioController.resume(),this._idle&&(this._idle=!1,this.trigger("_active")))},oe.prototype.pause=function(t){t&&this.name!==t||!1===this.isPaused&&(this.isPaused=!0,this._idle=!0,this.trigger("_idle"),this.audioController.pause())},oe.prototype.togglePause=function(t){t&&this.name!==t||(!0===this.isPaused?this.play():this.pause())},oe.prototype.stop=function(t){t&&this.name!==t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},oe.prototype.goToAndStop=function(t,e,s){s&&this.name!==s||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},oe.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},oe.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,s=!1;e>=this.totalFrames-1&&0<this.frameModifier?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(s=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(s=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),s&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},oe.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(0<this.frameModifier&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.timeCompleted=this.totalFrames,this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.timeCompleted=this.totalFrames,this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},oe.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)),this.firstFrame=t,this.totalFrames=e-t,this.timeCompleted=this.totalFrames,-1!==s&&this.goToAndStop(s,!0)},oe.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"==typeof t[0]){var s,i=t.length;for(s=0;s<i;s+=1)this.segments.push(t[s])}else this.segments.push(t);this.segments.length&&e&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},oe.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},oe.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},oe.prototype.destroy=function(t){t&&this.name!==t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=null,this.onLoopComplete=null,this.onComplete=null,this.onSegmentStart=null,this.onDestroy=null,this.renderer=null,this.renderer=null,this.imagePreloader=null,this.projectInterface=null)},oe.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},oe.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},oe.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},oe.prototype.setVolume=function(t,e){e&&this.name!==e||this.audioController.setVolume(t)},oe.prototype.getVolume=function(){return this.audioController.getVolume()},oe.prototype.mute=function(t){t&&this.name!==t||this.audioController.mute()},oe.prototype.unmute=function(t){t&&this.name!==t||this.audioController.unmute()},oe.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection,this.audioController.setRate(this.playSpeed*this.playDirection)},oe.prototype.getPath=function(){return this.path},oe.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else 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},oe.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;e<s;){if(t===this.assets[e].id)return this.assets[e];e+=1}return null},oe.prototype.hide=function(){this.renderer.hide()},oe.prototype.show=function(){this.renderer.show()},oe.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate},oe.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new r(t,this.currentFrame,this.totalFrames,this.frameModifier));break;case"loopComplete":this.triggerEvent(t,new l(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new o(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new p(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new d(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new r(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new l(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new o(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new p(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new d(t,this))},oe.prototype.triggerRenderFrameError=function(t){var e=new c(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)},oe.prototype.triggerConfigError=function(t){var e=new u(t,this.currentFrame);this.triggerEvent("error",e),this.onError&&this.onError.call(this,e)};var lottie={};function le(){!0===fe?he.searchAnimations(me,fe,de):he.searchAnimations()}lottie.play=he.play,lottie.pause=he.pause,lottie.setLocationHref=function(t){k=t},lottie.togglePause=he.togglePause,lottie.setSpeed=he.setSpeed,lottie.setDirection=he.setDirection,lottie.stop=he.stop,lottie.searchAnimations=le,lottie.registerAnimation=he.registerAnimation,lottie.loadAnimation=function(t){return!0===fe&&(t.animationData=JSON.parse(me)),he.loadAnimation(t)},lottie.setSubframeRendering=function(t){e=t},lottie.resize=he.resize,lottie.goToAndStop=he.goToAndStop,lottie.destroy=he.destroy,lottie.setQuality=function(t){if("string"==typeof t)switch(t){case"high":D=200;break;default:case"medium":D=50;break;case"low":D=10}else!isNaN(t)&&1<t&&(D=t);a(!(50<=D))},lottie.inBrowser=function(){return"undefined"!=typeof navigator},lottie.installPlugin=function(t,e){"expressions"===t&&(h=e)},lottie.freeze=he.freeze,lottie.unfreeze=he.unfreeze,lottie.setVolume=he.setVolume,lottie.mute=he.mute,lottie.unmute=he.unmute,lottie.getRegisteredAnimations=he.getRegisteredAnimations,lottie.__getFactory=function(t){switch(t){case"propertyFactory":return L;case"shapePropertyFactory":return O;case"matrix":return E;default:return null}},lottie.version="5.7.6";var pe,fe="__[STANDALONE]__",me="__[ANIMATIONDATA]__",de="";if(fe){var ce=document.getElementsByTagName("script"),ue=ce[ce.length-1]||{src:""};pe=ue.src.replace(/^[^\?]+\??/,""),de=function(t){for(var e=pe.split("&"),s=0;s<e.length;s+=1){var i=e[s].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}return null}("renderer")}var ge=setInterval(function(){"complete"===document.readyState&&(clearInterval(ge),le())},100);
return lottie;
}));