<html xmlns="http://www.w3.org/1999/xhtml">
<meta charset="UTF-8">
<head>
    <style>
        body{
            background-color:#fff;
            margin: 0px;
            height: 100%;
            overflow: hidden;
        }
        #bodymovin{
            background-color:#fff;
            width:90%;
            height:90%;
            display:block;
            overflow: hidden;
            transform: translate3d(0,0,0);
            text-align: center;
            opacity: 1;
        }

    </style>
</head>
<body>
<script>
    (function (root, factory) { if(typeof define === "function" && define.amd) { define( factory); } else if(typeof module === "object" && module.exports) { module.exports = factory(); } else { root.bodymovin = factory(); } }(window, function() {function ProjectInterface(){return{}}function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function roundTo2Decimals(t){return Math.round(1e4*t)/1e4}function roundTo3Decimals(t){return Math.round(100*t)/100}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function styleUnselectableDiv(t){t.style.userSelect="none",t.style.MozUserSelect="none",t.style.webkitUserSelect="none",t.style.oUserSelect="none"}function BMEnterFrameEvent(t,e,s,r){this.type=t,this.currentTime=e,this.totalTime=s,this.direction=0>r?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=0>e?-1:1}function BMCompleteLoopEvent(t,e,s,r){this.type=t,this.currentLoop=e,this.totalLoops=s,this.direction=0>r?-1:1}function BMSegmentStartEvent(t,e,s){this.type=t,this.firstFrame=e,this.totalFrames=s}function BMDestroyEvent(t,e){this.type=t,this.target=e}function _addEventListener(t,e){this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e)}function _removeEventListener(t,e){if(e){if(this._cbs[t]){for(var s=0,r=this._cbs[t].length;r>s;)this._cbs[t][s]===e&&(this._cbs[t].splice(s,1),s-=1,r-=1),s+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}function _triggerEvent(t,e){if(this._cbs[t])for(var s=this._cbs[t].length,r=0;s>r;r++)this._cbs[t][r](e)}function randomString(t,e){void 0===e&&(e="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");var s,r="";for(s=t;s>0;--s)r+=e[Math.round(Math.random()*(e.length-1))];return r}function HSVtoRGB(t,e,s){var r,i,a,n,o,h,l,p;switch(1===arguments.length&&(e=t.s,s=t.v,t=t.h),n=Math.floor(6*t),o=6*t-n,h=s*(1-e),l=s*(1-o*e),p=s*(1-(1-o)*e),n%6){case 0:r=s,i=p,a=h;break;case 1:r=l,i=s,a=h;break;case 2:r=h,i=s,a=p;break;case 3:r=h,i=l,a=s;break;case 4:r=p,i=h,a=s;break;case 5:r=s,i=h,a=l}return[r,i,a]}function RGBtoHSV(t,e,s){1===arguments.length&&(e=t.g,s=t.b,t=t.r);var r,i=Math.max(t,e,s),a=Math.min(t,e,s),n=i-a,o=0===i?0:n/i,h=i/255;switch(i){case a:r=0;break;case t:r=e-s+n*(s>e?6:0),r/=6*n;break;case e:r=s-t+2*n,r/=6*n;break;case s:r=t-e+4*n,r/=6*n}return[r,o,h]}function addSaturationToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[1]+=e,s[1]>1?s[1]=1:s[1]<=0&&(s[1]=0),HSVtoRGB(s[0],s[1],s[2])}function addBrightnessToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[2]+=e,s[2]>1?s[2]=1:s[2]<0&&(s[2]=0),HSVtoRGB(s[0],s[1],s[2])}function addHueToRGB(t,e){var s=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return s[0]+=e/360,s[0]>1?s[0]-=1:s[0]<0&&(s[0]+=1),HSVtoRGB(s[0],s[1],s[2])}function componentToHex(t){var e=t.toString(16);return 1==e.length?"0"+e:e}function fillToRgba(t,e){if(!cachedColors[t]){var s=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);cachedColors[t]=parseInt(s[1],16)+","+parseInt(s[2],16)+","+parseInt(s[3],16)}return"rgba("+cachedColors[t]+","+e+")"}function RenderedFrame(t,e){this.tr=t,this.o=e}function LetterProps(t,e,s,r,i,a){this.o=t,this.sw=e,this.sc=s,this.fc=r,this.m=i,this.props=a}function iterateDynamicProperties(t){var e,s=this.dynamicProperties;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t)}function reversePath(t,e){var s,r,i=[],a=[],n=[],o={},h=0;e&&(i[0]=t.o[0],a[0]=t.i[0],n[0]=t.v[0],h=1),r=t.i.length;var l=r-1;for(s=h;r>s;s+=1)i.push(t.o[l]),a.push(t.i[l]),n.push(t.v[l]),l-=1;return o.i=i,o.o=a,o.v=n,o}function Matrix(){}function matrixManagerFunction(){var t=new Matrix,e=function(e,s,r,i,a){return t.reset().translate(i,a).rotate(e).scale(s,r).toCSS()},s=function(t){return e(t.tr.r[2],t.tr.s[0],t.tr.s[1],t.tr.p[0],t.tr.p[1])};return{getMatrix:s}}function createElement(t,e,s){if(!e){var r=Object.create(t.prototype,s),i={};return r&&"[object Function]"===i.toString.call(r.init)&&r.init(),r}e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.prototype._parent=t.prototype}function extendPrototype(t,e){for(var s in t.prototype)t.prototype.hasOwnProperty(s)&&(e.prototype[s]=t.prototype[s])}function bezFunction(){function t(t,e,s,r,i,a){var n=t*r+e*i+s*a-i*r-a*t-s*e;return n>-1e-4&&1e-4>n}function e(e,s,r,i,a,n,o,h,l){return t(e,s,i,a,o,h)&&t(e,r,i,n,o,l)}function s(t){this.segmentLength=0,this.points=new Array(t)}function r(t,e){this.partialLength=t,this.point=e}function i(t,e){var s=e.segments,r=s.length,i=bm_floor((r-1)*t),a=t*e.addedLength,n=0;if(a==s[i].l)return s[i].p;for(var o=s[i].l>a?-1:1,h=!0;h;)s[i].l<=a&&s[i+1].l>a?(n=(a-s[i].l)/(s[i+1].l-s[i].l),h=!1):i+=o,(0>i||i>=r-1)&&(h=!1);return s[i].p+(s[i+1].p-s[i].p)*n}function a(){this.pt1=new Array(2),this.pt2=new Array(2),this.pt3=new Array(2),this.pt4=new Array(2)}function n(t,e,s,r,n,o,h){var l=new a;n=0>n?0:n>1?1:n;var p=i(n,h);o=o>1?1:o;var m,f=i(o,h),d=t.length,c=1-p,u=1-f;for(m=0;d>m;m+=1)l.pt1[m]=Math.round(1e3*(c*c*c*t[m]+(p*c*c+c*p*c+c*c*p)*s[m]+(p*p*c+c*p*p+p*c*p)*r[m]+p*p*p*e[m]))/1e3,l.pt3[m]=Math.round(1e3*(c*c*u*t[m]+(p*c*u+c*p*u+c*c*f)*s[m]+(p*p*u+c*p*f+p*c*f)*r[m]+p*p*f*e[m]))/1e3,l.pt4[m]=Math.round(1e3*(c*u*u*t[m]+(p*u*u+c*f*u+c*u*f)*s[m]+(p*f*u+c*f*f+p*u*f)*r[m]+p*f*f*e[m]))/1e3,l.pt2[m]=Math.round(1e3*(u*u*u*t[m]+(f*u*u+u*f*u+u*u*f)*s[m]+(f*f*u+u*f*f+f*u*f)*r[m]+f*f*f*e[m]))/1e3;return l}var o=(Math,function(){function t(t,e){this.l=t,this.p=e}return function(e,s,r,i){var a,n,o,h,l,p,m=defaultCurveSegments,f=0,d=[],c=[],u={addedLength:0,segments:[]};for(o=r.length,a=0;m>a;a+=1){for(l=a/(m-1),p=0,n=0;o>n;n+=1)h=bm_pow(1-l,3)*e[n]+3*bm_pow(1-l,2)*l*r[n]+3*(1-l)*bm_pow(l,2)*i[n]+bm_pow(l,3)*s[n],d[n]=h,null!==c[n]&&(p+=bm_pow(d[n]-c[n],2)),c[n]=d[n];p&&(p=bm_sqrt(p),f+=p),u.segments.push(new t(f,l))}return u.addedLength=f,u}}()),h=function(){var e={};return function(i){var a=i.s,n=i.e,o=i.to,h=i.ti,l=(a.join("_")+"_"+n.join("_")+"_"+o.join("_")+"_"+h.join("_")).replace(/\./g,"p");if(e[l])return void(i.bezierData=e[l]);var p,m,f,d,c,u,y,g=defaultCurveSegments,v=0,b=null;2===a.length&&(a[0]!=n[0]||a[1]!=n[1])&&t(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&t(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])&&(g=2);var E=new s(g);for(f=o.length,p=0;g>p;p+=1){for(y=new Array(f),c=p/(g-1),u=0,m=0;f>m;m+=1)d=bm_pow(1-c,3)*a[m]+3*bm_pow(1-c,2)*c*(a[m]+o[m])+3*(1-c)*bm_pow(c,2)*(n[m]+h[m])+bm_pow(c,3)*n[m],y[m]=d,null!==b&&(u+=bm_pow(y[m]-b[m],2));u=bm_sqrt(u),v+=u,E.points[p]=new r(u,y),b=y}E.segmentLength=v,i.bezierData=E,e[l]=E}}();return{getBezierLength:o,getNewSegment:n,buildBezierData:h,pointOnLine2D:t,pointOnLine3D:e}}function dataFunctionManager(){function t(i,a,o){var h,l,p,m,f,d,c,u,y=i.length;for(m=0;y>m;m+=1)if(h=i[m],"ks"in h&&!h.completed){if(h.completed=!0,h.tt&&(i[m-1].td=h.tt),l=[],p=-1,h.hasMask){var g=h.masksProperties;for(d=g.length,f=0;d>f;f+=1)if(g[f].pt.k.i)r(g[f].pt.k);else for(u=g[f].pt.k.length,c=0;u>c;c+=1)g[f].pt.k[c].s&&r(g[f].pt.k[c].s[0]),g[f].pt.k[c].e&&r(g[f].pt.k[c].e[0])}0===h.ty?(h.layers=e(h.refId,a),t(h.layers,a,o)):4===h.ty?s(h.shapes):5==h.ty&&n(h,o)}}function e(t,e){for(var s=0,r=e.length;r>s;){if(e[s].id===t)return e[s].layers;s+=1}}function s(t){var e,i,a,n=t.length,o=!1;for(e=n-1;e>=0;e-=1)if("sh"==t[e].ty){if(t[e].ks.k.i)r(t[e].ks.k);else for(a=t[e].ks.k.length,i=0;a>i;i+=1)t[e].ks.k[i].s&&r(t[e].ks.k[i].s[0]),t[e].ks.k[i].e&&r(t[e].ks.k[i].e[0]);o=!0}else"gr"==t[e].ty&&s(t[e].it)}function r(t){var e,s=t.i.length;for(e=0;s>e;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function i(t,e){var s=e?e.split("."):[100,100,100];return t[0]>s[0]?!0:s[0]>t[0]?!1:t[1]>s[1]?!0:s[1]>t[1]?!1:t[2]>s[2]?!0:s[2]>t[2]?!1:void 0}function a(e,s){e.__complete||(o(e),t(e.layers,e.assets,s),e.__complete=!0)}function n(t,e){var s,r,i,a,n,o,h,l=[],p=t.t.d,m=0,f=t.t.m.g,d=0,c=0,u=0,y=[],g=0,v=0,b=e.getFontByName(p.f),E=0,P=b.fStyle.split(" "),k="normal",S="normal";for(r=P.length,s=0;r>s;s+=1)"italic"===P[s].toLowerCase()?S="italic":"bold"===P[s].toLowerCase()?k="700":"black"===P[s].toLowerCase()?k="900":"medium"===P[s].toLowerCase()?k="500":"regular"===P[s].toLowerCase()||"normal"===P[s].toLowerCase()?k="400":("light"===P[s].toLowerCase()||"thin"===P[s].toLowerCase())&&(k="200");if(p.fWeight=k,p.fStyle=S,r=p.t.length,p.sz){var C=!1,x=p.sz[0],M=p.sz[1],D=p.s,A=p.lh||1.2*D,w=D;p.mf=p.mf||20;for(var T=Math.min(p.mf,D),I=A/D;!C;){g=0,v=0,w+=1;var F=-1,V=0,B=p.t;for(r=B.length,s=0;r>s;s+=1)if(i=!1," "===B.charAt(s)?F=s:13===B.charCodeAt(s)&&(g=0,i=!0,V+=D*I),e.chars?(h=e.getCharData(B.charAt(s),b.fStyle,b.fFamily),E=i?0:h.w*D/100):E=e.measureText(B.charAt(s),p.f,D),g+E>x){if(D===T&&V+D*I>M){var R=1,_="…",N=e.getCharData("…",b.fStyle,b.fFamily);N||(N=e.getCharData(".",b.fStyle,b.fFamily),R=3,_="...");var L=N?R*N.w*D/100:0;_=N?_:"";for(var z=s;g+L>x;)h=e.getCharData(B.charAt(z),b.fStyle,b.fFamily),E=h.w*D/100,g-=E,z-=1;B=B.substr(0,z)+_;break}-1===F?(B=B.substr(0,s)+"\r"+B.substr(s),r+=1):(s=F,B=B.substr(0,s)+"\r"+B.substr(s+1)),F=-1,g=0,V+=D*I}else g+=E;V+=D,M>V||T>=D?C=!0:(B=p.t,D-=1)}p.s=D,p.lh=D*I,p.t=B,r=p.t.length}for(g=0,E=0,s=0;r>s;s+=1)if(i=!1," "===p.t.charAt(s)?a=" ":13===p.t.charCodeAt(s)?(y.push(g),v=g>v?g:v,g=0,a="",i=!0,u+=1):a=p.t.charAt(s),e.chars?(h=e.getCharData(p.t.charAt(s),b.fStyle,e.getFontByName(p.f).fFamily),E=i?0:h.w*p.s/100):E=e.measureText(a,p.f,p.s),g+=E,l.push({l:E,an:E,add:d,n:i,anIndexes:[],val:a,line:u}),2==f){if(d+=E,""==a||" "==a||s==r-1){for((""==a||" "==a)&&(d-=E);s>=c;)l[c].an=d,l[c].ind=m,l[c].extra=E,c+=1;m+=1,d=0}}else if(3==f){if(d+=E,""==a||s==r-1){for(""==a&&(d-=E);s>=c;)l[c].an=d,l[c].ind=m,l[c].extra=E,c+=1;d=0,m+=1}}else l[m].ind=m,l[m].extra=0,m+=1;if(p.l=l,v=g>v?g:v,y.push(g),p.sz)p.boxWidth=p.sz[0],t.t.d.justifyOffset=0;else switch(p.boxWidth=v,p.j){case 1:t.t.d.justifyOffset=-p.boxWidth;break;case 2:t.t.d.justifyOffset=-p.boxWidth/2;break;default:t.t.d.justifyOffset=0}p.lineWidths=y;var O=t.t.a;o=O.length;var G,H,j=[];for(n=0;o>n;n+=1){for(O[n].a.sc&&(p.strokeColorAnim=!0),O[n].a.sw&&(p.strokeWidthAnim=!0),(O[n].a.fc||O[n].a.fh||O[n].a.fs||O[n].a.fb)&&(p.fillColorAnim=!0),H=0,G=O[n].s.b,s=0;r>s;s+=1)l[s].anIndexes[n]=H,(1==G&&""!=l[s].val||2==G&&""!=l[s].val&&" "!=l[s].val||3==G&&(l[s].n||" "==l[s].val||s==r-1)||4==G&&(l[s].n||s==r-1))&&(1===O[n].s.rn&&j.push(H),H+=1);t.t.a[n].s.totalChars=H;var W,q=-1;if(1===O[n].s.rn)for(s=0;r>s;s+=1)q!=l[s].anIndexes[n]&&(q=l[s].anIndexes[n],W=j.splice(Math.floor(Math.random()*j.length),1)[0]),l[s].anIndexes[n]=W}0!==o||"m"in t.t.p||(t.singleShape=!0),p.yOffset=p.lh||1.2*p.s,p.ascent=b.ascent*p.s/100}var o=function(){function t(e){var s,r,i,a=e.length;for(s=0;a>s;s+=1)if("gr"===e[s].ty)t(e[s].it);else if("fl"===e[s].ty||"st"===e[s].ty)if(e[s].c.k&&e[s].c.k[0].i)for(i=e[s].c.k.length,r=0;i>r;r+=1)e[s].c.k[r].s&&(e[s].c.k[r].s[0]/=255,e[s].c.k[r].s[1]/=255,e[s].c.k[r].s[2]/=255,e[s].c.k[r].s[3]/=255),e[s].c.k[r].e&&(e[s].c.k[r].e[0]/=255,e[s].c.k[r].e[1]/=255,e[s].c.k[r].e[2]/=255,e[s].c.k[r].e[3]/=255);else e[s].c.k[0]/=255,e[s].c.k[1]/=255,e[s].c.k[2]/=255,e[s].c.k[3]/=255}function e(e){var s,r=e.length;for(s=0;r>s;s+=1)4===e[s].ty&&t(e[s].shapes)}var s=[4,1,9];return function(t){if(i(s,t.v)&&(e(t.layers),t.assets)){var r,a=t.assets.length;for(r=0;a>r;r+=1)t.assets[r].layers&&e(t.assets[r].layers)}}}(),h={};return h.completeData=a,h}function ShapeModifier(){}function TrimModifier(){}function RoundCornersModifier(){}function BaseRenderer(){}function SVGRenderer(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",progressiveLoad:e&&e.progressiveLoad||!1},this.elements=[],this.destroyed=!1}function CanvasRenderer(t,e){this.animationItem=t,this.renderConfig={clearCanvas:e&&void 0!==e.clearCanvas?e.clearCanvas:!0,context:e&&e.context||null,progressiveLoad:e&&e.progressiveLoad||!1,preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet"},this.renderConfig.dpr=e&&e.dpr||1,this.animationItem.wrapper&&(this.renderConfig.dpr=e&&e.dpr||window.devicePixelRatio||1),this.renderedFrame=-1,this.globalData={frameNum:-1},this.contextData={saved:Array.apply(null,{length:15}),savedOp:Array.apply(null,{length:15}),cArrPos:0,cTr:new Matrix,cO:1};var s,r=15;for(s=0;r>s;s+=1)this.contextData.saved[s]=Array.apply(null,{length:16});this.elements=[],this.transformMat=new Matrix,this.completeLayers=!1}function HybridRenderer(t){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.globalData={frameNum:-1},this.elements=[],this.threeDElements=[],this.destroyed=!1,this.camera=null,this.supports3d=!0}function MaskElement(t,e,s){this.dynamicProperties=[],this.data=t,this.element=e,this.globalData=s,this.paths=[],this.storedData=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length),this.maskElement=null,this.firstFrame=!0;var r,i,a,n,o,h,l,p,m=this.globalData.defs,f=this.masksProperties.length,d=this.masksProperties,c=0,u=[],y=randomString(10),g="clipPath",v="clip-path";for(r=0;f>r;r++)if(("a"!==d[r].mode&&"n"!==d[r].mode||d[r].inv)&&(g="mask",v="mask"),"s"!=d[r].mode&&"i"!=d[r].mode||0!=c?o=null:(o=document.createElementNS(svgNS,"rect"),o.setAttribute("fill","#ffffff"),o.setAttribute("width",this.element.comp.data?this.element.comp.data.w:this.element.globalData.compSize.w),o.setAttribute("height",this.element.comp.data?this.element.comp.data.h:this.element.globalData.compSize.h),u.push(o)),i=document.createElementNS(svgNS,"path"),"n"!=d[r].mode&&d[r].cl!==!1){if(c+=1,d[r].cl?"s"==d[r].mode?i.setAttribute("fill","#000000"):i.setAttribute("fill","#ffffff"):(i.setAttribute("fill","none"),"s"==d[r].mode?i.setAttribute("fill","#000000"):i.setAttribute("fill","#ffffff"),i.setAttribute("stroke-width","1"),i.setAttribute("stroke-miterlimit","10")),i.setAttribute("clip-rule","nonzero"),0!==d[r].x.k){g="mask",v="mask",p=PropertyFactory.getProp(this.element,d[r].x,0,null,this.dynamicProperties);var b="fi_"+randomString(10);h=document.createElementNS(svgNS,"filter"),h.setAttribute("id",b),l=document.createElementNS(svgNS,"feMorphology"),l.setAttribute("operator","dilate"),l.setAttribute("in","SourceGraphic"),l.setAttribute("radius","0"),h.appendChild(l),m.appendChild(h),"s"==d[r].mode?i.setAttribute("stroke","#000000"):i.setAttribute("stroke","#ffffff")}else l=null,p=null;if(this.storedData[r]={elem:i,x:p,expan:l,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==d[r].mode){n=u.length;var E=document.createElementNS(svgNS,"g");for(a=0;n>a;a+=1)E.appendChild(u[a]);var P=document.createElementNS(svgNS,"mask");P.setAttribute("mask-type","alpha"),P.setAttribute("id",y+"_"+c),P.appendChild(i),m.appendChild(P),E.setAttribute("mask","url(#"+y+"_"+c+")"),u.length=0,u.push(E)}else u.push(i);d[r].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[r]={elem:i,lastPath:"",prop:ShapePropertyFactory.getShapeProp(this.element,d[r],3,this.dynamicProperties,null)},o&&(this.viewData[r].invRect=o),this.viewData[r].prop.k||this.drawPath(d[r],this.viewData[r].prop.v,this.viewData[r])}else this.viewData[r]={prop:ShapePropertyFactory.getShapeProp(this.element,d[r],3,this.dynamicProperties,null),elem:i},m.appendChild(i);for(this.maskElement=document.createElementNS(svgNS,g),f=u.length,r=0;f>r;r+=1)this.maskElement.appendChild(u[r]);this.maskElement.setAttribute("id",y),c>0&&this.element.maskedElement.setAttribute(v,"url(#"+y+")"),m.appendChild(this.maskElement)}function BaseElement(){}function SVGBaseElement(t,e,s,r,i){this.globalData=s,this.comp=r,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=i?i.layerId:"ly_"+randomString(10),this.placeholder=i,this.init()}function ITextElement(t,e,s,r){}function SVGTextElement(t,e,s,r,i){this.textSpans=[],this.renderType="svg",this._parent.constructor.call(this,t,e,s,r,i)}function SVGEffects(t){var e,s=t.data.ef.length,r=document.createElementNS(svgNS,"filter"),i=0;this.filters=[];var a;for(e=0;s>e;e+=1)20===t.data.ef[e].ty?(i+=1,a=new SVGTintFilter(r,t.effects.effectElements[e]),this.filters.push(a)):21===t.data.ef[e].ty?(i+=1,a=new SVGFillFilter(r,t.effects.effectElements[e]),this.filters.push(a)):22===t.data.ef[e].ty&&(a=new SVGStrokeEffect(t,t.effects.effectElements[e]),this.filters.push(a));if(i){var n=randomString(10);r.setAttribute("id",n),r.setAttribute("filterUnits","objectBoundingBox"),r.setAttribute("x","0%"),r.setAttribute("y","0%"),r.setAttribute("width","100%"),r.setAttribute("height","100%"),t.globalData.defs.appendChild(r),t.layerElement.setAttribute("filter","url(#"+n+")")}}function SVGTintFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");if(s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","linearRGB"),s.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),s.setAttribute("result","f1"),t.appendChild(s),s=document.createElementNS(svgNS,"feColorMatrix"),s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),s.setAttribute("result","f2"),t.appendChild(s),this.matrixFilter=s,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var r=document.createElementNS(svgNS,"feMerge");t.appendChild(r);var i;i=document.createElementNS(svgNS,"feMergeNode"),i.setAttribute("in","SourceGraphic"),r.appendChild(i),i=document.createElementNS(svgNS,"feMergeNode"),i.setAttribute("in","f2"),r.appendChild(i)}}function SVGFillFilter(t,e){this.filterManager=e;var s=document.createElementNS(svgNS,"feColorMatrix");s.setAttribute("type","matrix"),s.setAttribute("color-interpolation-filters","sRGB"),s.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(s),this.matrixFilter=s}function SVGStrokeEffect(t,e){this.initialized=!1,this.filterManager=e,this.elem=t}function ICompElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.elements=Array.apply(null,{length:this.layers.length}),this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.xt?(this.layerElement=document.createElementNS(svgNS,"g"),this.buildAllItems()):s.progressiveLoad||this.buildAllItems()}function IImageElement(t,e,s,r,i){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,r,i)}function IShapeElement(t,e,s,r,i){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this._parent.constructor.call(this,t,e,s,r,i)}function ISolidElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i)}function CVBaseElement(t,e,s){this.globalData=s,this.data=t,this.comp=e,this.canvasContext=s.canvasContext,this.init()}function CVCompElement(t,e,s){this._parent.constructor.call(this,t,e,s);var r={};for(var i in s)s.hasOwnProperty(i)&&(r[i]=s[i]);r.renderer=this,r.compHeight=this.data.h,r.compWidth=this.data.w,this.renderConfig={clearCanvas:!0},this.contextData={saved:Array.apply(null,{length:15}),savedOp:Array.apply(null,{length:15}),cArrPos:0,cTr:new Matrix,cO:1},this.completeLayers=!1;var a,n=15;for(a=0;n>a;a+=1)this.contextData.saved[a]=Array.apply(null,{length:16});this.transformMat=new Matrix,this.parentGlobalData=this.globalData;var o=document.createElement("canvas");r.canvasContext=o.getContext("2d"),this.canvasContext=r.canvasContext,o.width=this.data.w,o.height=this.data.h,this.canvas=o,this.globalData=r,this.layers=t.layers,this.elements=Array.apply(null,{length:this.layers.length}),this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),(this.data.xt||!s.progressiveLoad)&&this.buildAllItems()}function CVImageElement(t,e,s){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s),this.globalData.addPendingElement()}function CVMaskElement(t,e){this.data=t,this.element=e,this.dynamicProperties=[],this.masksProperties=this.data.masksProperties,this.viewData=new Array(this.masksProperties.length);var s,r=this.masksProperties.length;for(s=0;r>s;s++)this.viewData[s]=ShapePropertyFactory.getShapeProp(this.element,this.masksProperties[s],3,this.dynamicProperties,null)}function CVShapeElement(t,e,s){this.shapes=[],this.stylesList=[],this.viewData=[],this.shapeModifiers=[],this.shapesData=t.shapes,this.firstFrame=!0,this._parent.constructor.call(this,t,e,s)}function CVSolidElement(t,e,s){this._parent.constructor.call(this,t,e,s)}function CVTextElement(t,e,s){this.textSpans=[],this.yOffset=0,this.fillColorAnim=!1,this.strokeColorAnim=!1,this.strokeWidthAnim=!1,this.stroke=!1,this.fill=!1,this.justifyOffset=0,this.currentRender=null,this.renderType="canvas",this.values={fill:"rgba(0,0,0,0)",stroke:"rgba(0,0,0,0)",sWidth:0,fValue:""},this._parent.constructor.call(this,t,e,s)}function HBaseElement(t,e,s,r,i){this.globalData=s,this.comp=r,this.data=t,this.matteElement=null,this.parentContainer=e,this.layerId=i?i.layerId:"ly_"+randomString(10),this.placeholder=i,this.init()}function HSolidElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i)}function HCompElement(t,e,s,r,i){this._parent.constructor.call(this,t,e,s,r,i),this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.elements=Array.apply(null,{length:this.layers.length}),this.data.tm&&(this.tm=PropertyFactory.getProp(this,this.data.tm,0,s.frameRate,this.dynamicProperties)),this.data.hasMask&&(this.supports3d=!1),this.data.xt&&(this.layerElement=document.createElement("div")),this.buildAllItems()}function HShapeElement(t,e,s,r,i){this.shapes=[],this.shapeModifiers=[],this.shapesData=t.shapes,this.stylesList=[],this.viewData=[],this._parent.constructor.call(this,t,e,s,r,i),this.addedTransforms={mdf:!1,mats:[this.finalTransform.mat]},this.currentBBox={x:999999,y:-999999,h:0,w:0}}function HTextElement(t,e,s,r,i){this.textSpans=[],this.textPaths=[],this.currentBBox={x:999999,y:-999999,h:0,w:0},this.renderType="svg",this.isMasked=!1,this._parent.constructor.call(this,t,e,s,r,i)}function HImageElement(t,e,s,r,i){this.assetData=s.getAssetData(t.refId),this._parent.constructor.call(this,t,e,s,r,i)}function HCameraElement(t,e,s,r,i){if(this._parent.constructor.call(this,t,e,s,r,i),this.pe=PropertyFactory.getProp(this,t.pe,0,0,this.dynamicProperties),t.ks.p.s?(this.px=PropertyFactory.getProp(this,t.ks.p.x,1,0,this.dynamicProperties),this.py=PropertyFactory.getProp(this,t.ks.p.y,1,0,this.dynamicProperties),this.pz=PropertyFactory.getProp(this,t.ks.p.z,1,0,this.dynamicProperties)):this.p=PropertyFactory.getProp(this,t.ks.p,1,0,this.dynamicProperties),t.ks.a&&(this.a=PropertyFactory.getProp(this,t.ks.a,1,0,this.dynamicProperties)),t.ks.or.k.length){var a,n=t.ks.or.k.length;for(a=0;n>a;a+=1)t.ks.or.k[a].to=null,t.ks.or.k[a].ti=null}this.or=PropertyFactory.getProp(this,t.ks.or,1,degToRads,this.dynamicProperties),this.or.sh=!0,this.rx=PropertyFactory.getProp(this,t.ks.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(this,t.ks.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(this,t.ks.rz,0,degToRads,this.dynamicProperties),this.mat=new Matrix}function SliderEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function AngleEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,0,0,s)}function ColorEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function PointEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function CheckboxEffect(t,e,s){this.p=PropertyFactory.getProp(e,t.v,1,0,s)}function NoValueEffect(){this.p={}}function EffectsManager(t,e,s){var r=t.ef;this.effectElements=[];var i,a,n=r.length;for(i=0;n>i;i++)a=new GroupEffect(r[i],e,s),this.effectElements.push(a)}function GroupEffect(t,e,s){this.dynamicProperties=[],this.init(t,e,this.dynamicProperties),this.dynamicProperties.length&&s.push(this)}var svgNS="http://www.w3.org/2000/svg",subframeEnabled=!0,expressionsPlugin,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,blitter=10,BMMath={};!function(){var t,e=Object.getOwnPropertyNames(Math),s=e.length;for(t=0;s>t;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){var e=typeof t;if("object"===e&&t.length){var s,r=Array.apply(null,{length:t.length}),i=t.length;for(s=0;i>s;s+=1)r[s]=Math.abs(t[s]);return r}return t};var defaultCurveSegments=75,degToRads=Math.PI/180,roundCorner=.5519;roundValues(!1);var rgbToHex=function(){var t,e,s=[];for(t=0;256>t;t+=1)e=t.toString(16),s[t]=1==e.length?"0"+e:e;return function(t,e,r){return 0>t&&(t=0),0>e&&(e=0),0>r&&(r=0),"#"+s[t]+s[e]+s[r]}}(),fillColorToString=function(){var t=[];return function(e,s){return void 0!==s&&(e[3]=s),t[e[0]]||(t[e[0]]={}),t[e[0]][e[1]]||(t[e[0]][e[1]]={}),t[e[0]][e[1]][e[2]]||(t[e[0]][e[1]][e[2]]={}),t[e[0]][e[1]][e[2]][e[3]]||(t[e[0]][e[1]][e[2]][e[3]]="rgba("+e.join(",")+")"),t[e[0]][e[1]][e[2]][e[3]]}}(),Matrix=function(){function t(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function e(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function s(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(1,0,0,0,0,e,-s,0,0,s,e,0,0,0,0,1)}function r(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,0,s,0,0,1,0,0,-s,0,e,0,0,0,0,1)}function i(t){if(0===t)return this;var e=Math.cos(t),s=Math.sin(t);return this._t(e,-s,0,0,s,e,0,0,0,0,1,0,0,0,0,1)}function a(t,e){return this._t(1,e,t,1,0,0)}function n(t,e){return this.shear(Math.tan(t),Math.tan(e))}function o(t,e){var s=Math.cos(e),r=Math.sin(e);return this._t(s,r,0,0,-r,s,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1)._t(s,-r,0,0,r,s,0,0,0,0,1,0,0,0,0,1)}function h(t,e,s){return s=isNaN(s)?1:s,1==t&&1==e&&1==s?this:this._t(t,0,0,0,0,e,0,0,0,0,s,0,0,0,0,1)}function l(t,e,s,r,i,a,n,o,h,l,p,m,f,d,c,u){return this.props[0]=t,this.props[1]=e,this.props[2]=s,this.props[3]=r,this.props[4]=i,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=l,this.props[10]=p,this.props[11]=m,this.props[12]=f,this.props[13]=d,this.props[14]=c,this.props[15]=u,this}function p(t,e,s){return s=s||0,0!==t||0!==e||0!==s?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,s,1):this}function m(t,e,s,r,i,a,n,o,h,l,p,m,f,d,c,u){if(1===t&&0===e&&0===s&&0===r&&0===i&&1===a&&0===n&&0===o&&0===h&&0===l&&1===p&&0===m)return(0!==f||0!==d||0!==c)&&(this.props[12]=this.props[12]*t+this.props[13]*i+this.props[14]*h+this.props[15]*f,this.props[13]=this.props[12]*e+this.props[13]*a+this.props[14]*l+this.props[15]*d,this.props[14]=this.props[12]*s+this.props[13]*n+this.props[14]*p+this.props[15]*c,this.props[15]=this.props[12]*r+this.props[13]*o+this.props[14]*m+this.props[15]*u),this;var y=this.props[0],g=this.props[1],v=this.props[2],b=this.props[3],E=this.props[4],P=this.props[5],k=this.props[6],S=this.props[7],C=this.props[8],x=this.props[9],M=this.props[10],D=this.props[11],A=this.props[12],w=this.props[13],T=this.props[14],I=this.props[15];return this.props[0]=y*t+g*i+v*h+b*f,this.props[1]=y*e+g*a+v*l+b*d,this.props[2]=y*s+g*n+v*p+b*c,this.props[3]=y*r+g*o+v*m+b*u,this.props[4]=E*t+P*i+k*h+S*f,this.props[5]=E*e+P*a+k*l+S*d,this.props[6]=E*s+P*n+k*p+S*c,this.props[7]=E*r+P*o+k*m+S*u,this.props[8]=C*t+x*i+M*h+D*f,this.props[9]=C*e+x*a+M*l+D*d,this.props[10]=C*s+x*n+M*p+D*c,this.props[11]=C*r+x*o+M*m+D*u,this.props[12]=A*t+w*i+T*h+I*f,this.props[13]=A*e+w*a+T*l+I*d,this.props[14]=A*s+w*n+T*p+I*c,this.props[15]=A*r+w*o+T*m+I*u,this}function f(t){var e;for(e=0;16>e;e+=1)t.props[e]=this.props[e]}function d(t){var e;for(e=0;16>e;e+=1)this.props[e]=t[e]}function c(t,e,s){return{x:t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}}function u(t,e,s){return t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12]}function y(t,e,s){return t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13]}function g(t,e,s){return t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]}function v(t){var e,s=this.props[0]*this.props[5]-this.props[1]*this.props[4],r=this.props[5]/s,i=-this.props[1]/s,a=-this.props[4]/s,n=this.props[0]/s,o=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/s,h=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/s,l=t.length,p=[];for(e=0;l>e;e+=1)p[e]=[t[e][0]*r+t[e][1]*a+o,t[e][0]*i+t[e][1]*n+h,0];return p}function b(t,e,s){return[t*this.props[0]+e*this.props[4]+s*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+s*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+s*this.props[10]+this.props[14]]}function E(t,e){return bm_rnd(t*this.props[0]+e*this.props[4]+this.props[12])+","+bm_rnd(t*this.props[1]+e*this.props[5]+this.props[13])}function P(){return[this.props[0],this.props[1],this.props[2],this.props[3],this.props[4],this.props[5],this.props[6],this.props[7],this.props[8],this.props[9],this.props[10],this.props[11],this.props[12],this.props[13],this.props[14],this.props[15]]}function k(){return isSafari?"matrix3d("+roundTo2Decimals(this.props[0])+","+roundTo2Decimals(this.props[1])+","+roundTo2Decimals(this.props[2])+","+roundTo2Decimals(this.props[3])+","+roundTo2Decimals(this.props[4])+","+roundTo2Decimals(this.props[5])+","+roundTo2Decimals(this.props[6])+","+roundTo2Decimals(this.props[7])+","+roundTo2Decimals(this.props[8])+","+roundTo2Decimals(this.props[9])+","+roundTo2Decimals(this.props[10])+","+roundTo2Decimals(this.props[11])+","+roundTo2Decimals(this.props[12])+","+roundTo2Decimals(this.props[13])+","+roundTo2Decimals(this.props[14])+","+roundTo2Decimals(this.props[15])+")":(this.cssParts[1]=this.props.join(","),this.cssParts.join(""))}function S(){return"matrix("+this.props[0]+","+this.props[1]+","+this.props[4]+","+this.props[5]+","+this.props[12]+","+this.props[13]+")"}function C(){return""+this.toArray()}return function(){this.reset=t,this.rotate=e,this.rotateX=s,this.rotateY=r,this.rotateZ=i,this.skew=n,this.skewFromAxis=o,this.shear=a,this.scale=h,this.setTransform=l,this.translate=p,this.transform=m,this.applyToPoint=c,this.applyToX=u,this.applyToY=y,this.applyToZ=g,this.applyToPointArray=b,this.applyToPointStringified=E,this.toArray=P,this.toCSS=k,this.to2dCSS=S,this.toString=C,this.clone=f,this.cloneFromProps=d,this.inversePoints=v,this._t=this.transform,this.props=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],this.cssParts=["matrix3d(","",")"]}}();!function(t,e){function s(s,l,p){var d=[];l=1==l?{entropy:!0}:l||{};var v=n(a(l.entropy?[s,h(t)]:null==s?o():s,3),d),b=new r(d),E=function(){for(var t=b.g(f),e=u,s=0;y>t;)t=(t+s)*m,e*=m,s=b.g(1);for(;t>=g;)t/=2,e/=2,s>>>=1;return(t+s)/e};return E.int32=function(){return 0|b.g(4)},E.quick=function(){return b.g(4)/4294967296},E["double"]=E,n(h(b.S),t),(l.pass||p||function(t,s,r,a){return a&&(a.S&&i(a,b),t.state=function(){return i(b,{})}),r?(e[c]=t,s):t})(E,v,"global"in l?l.global:this==e,l.state)}function r(t){var e,s=t.length,r=this,i=0,a=r.i=r.j=0,n=r.S=[];for(s||(t=[s++]);m>i;)n[i]=i++;for(i=0;m>i;i++)n[i]=n[a=v&a+t[i%s]+(e=n[i])],n[a]=e;(r.g=function(t){for(var e,s=0,i=r.i,a=r.j,n=r.S;t--;)e=n[i=v&i+1],s=s*m+n[v&(n[i]=n[a=v&a+e])+(n[a]=e)];return r.i=i,r.j=a,s})(m)}function i(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function a(t,e){var s,r=[],i=typeof t;if(e&&"object"==i)for(s in t)try{r.push(a(t[s],e-1))}catch(n){}return r.length?r:"string"==i?t:t+"\x00"}function n(t,e){for(var s,r=t+"",i=0;i<r.length;)e[v&i]=v&(s^=19*e[v&i])+r.charCodeAt(i++);

        return h(e)}function o(){try{if(l)return h(l.randomBytes(m));var e=new Uint8Array(m);return(p.crypto||p.msCrypto).getRandomValues(e),h(e)}catch(s){var r=p.navigator,i=r&&r.plugins;return[+new Date,p,i,p.screen,h(t)]}}function h(t){return String.fromCharCode.apply(0,t)}var l,p=this,m=256,f=6,d=52,c="random",u=e.pow(m,f),y=e.pow(2,d),g=2*y,v=m-1;e["seed"+c]=s,n(e.random(),t)}([],BMMath);var BezierFactory=function(){function t(t,e,s,r,i){var a=i||("bez_"+t+"_"+e+"_"+s+"_"+r).replace(/\./g,"p");if(p[a])return p[a];var n=new h([t,e,s,r]);return p[a]=n,n}function e(t,e){return 1-3*e+3*t}function s(t,e){return 3*e-6*t}function r(t){return 3*t}function i(t,i,a){return((e(i,a)*t+s(i,a))*t+r(i))*t}function a(t,i,a){return 3*e(i,a)*t*t+2*s(i,a)*t+r(i)}function n(t,e,s,r,a){var n,o,h=0;do o=e+(s-e)/2,n=i(o,r,a)-t,n>0?s=o:e=o;while(Math.abs(n)>d&&++h<c);return o}function o(t,e,s,r){for(var n=0;m>n;++n){var o=a(e,s,r);if(0===o)return e;var h=i(e,s,r)-t;e-=h/o}return e}function h(t){this._p=t,this._mSampleValues=g?new Float32Array(u):new Array(u),this._precomputed=!1,this.get=this.get.bind(this)}var l={};l.getBezierEasing=t;var p={},m=4,f=.001,d=1e-7,c=10,u=11,y=1/(u-1),g="function"==typeof Float32Array;return h.prototype={get:function(t){var e=this._p[0],s=this._p[1],r=this._p[2],a=this._p[3];return this._precomputed||this._precompute(),e===s&&r===a?t:0===t?0:1===t?1:i(this._getTForX(t),s,a)},_precompute:function(){var t=this._p[0],e=this._p[1],s=this._p[2],r=this._p[3];this._precomputed=!0,(t!==e||s!==r)&&this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],s=0;u>s;++s)this._mSampleValues[s]=i(s*y,t,e)},_getTForX:function(t){for(var e=this._p[0],s=this._p[2],r=this._mSampleValues,i=0,h=1,l=u-1;h!==l&&r[h]<=t;++h)i+=y;--h;var p=(t-r[h])/(r[h+1]-r[h]),m=i+p*y,d=a(m,e,s);return d>=f?o(t,m,e,s):0===d?m:n(t,i,i+y,e,s)}},l}(),MatrixManager=matrixManagerFunction;!function(){for(var t=0,e=["ms","moz","webkit","o"],s=0;s<e.length&&!window.requestAnimationFrame;++s)window.requestAnimationFrame=window[e[s]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[s]+"CancelAnimationFrame"]||window[e[s]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,s){var r=(new Date).getTime(),i=Math.max(0,16-(r-t)),a=window.setTimeout(function(){e(r+i)},i);return t=r+i,a}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction(),dataManager=dataFunctionManager(),FontManager=function(){function t(t,e){var s=document.createElement("span");s.style.fontFamily=e;var r=document.createElement("span");r.innerHTML="giItT1WQy@!-/#",s.style.position="absolute",s.style.left="-10000px",s.style.top="-10000px",s.style.fontSize="300px",s.style.fontVariant="normal",s.style.fontStyle="normal",s.style.fontWeight="normal",s.style.letterSpacing="0",s.appendChild(r),document.body.appendChild(s);var i=r.offsetWidth;return r.style.fontFamily=t+", "+e,{node:r,w:i,parent:s}}function e(){var t,s,r,i=this.fonts.length,a=i;for(t=0;i>t;t+=1)if(this.fonts[t].loaded)a-=1;else if("t"===this.fonts[t].fOrigin){if(window.Typekit&&window.Typekit.load&&0===this.typekitLoaded){this.typekitLoaded=1;try{Typekit.load({async:!0,active:function(){this.typekitLoaded=2}.bind(this)})}catch(n){}}2===this.typekitLoaded&&(this.fonts[t].loaded=!0)}else"n"===this.fonts[t].fOrigin?this.fonts[t].loaded=!0:(s=this.fonts[t].monoCase.node,r=this.fonts[t].monoCase.w,s.offsetWidth!==r?(a-=1,this.fonts[t].loaded=!0):(s=this.fonts[t].sansCase.node,r=this.fonts[t].sansCase.w,s.offsetWidth!==r&&(a-=1,this.fonts[t].loaded=!0)),this.fonts[t].loaded&&(this.fonts[t].sansCase.parent.parentNode.removeChild(this.fonts[t].sansCase.parent),this.fonts[t].monoCase.parent.parentNode.removeChild(this.fonts[t].monoCase.parent)));0!==a&&Date.now()-this.initTime<h?setTimeout(e.bind(this),20):setTimeout(function(){this.loaded=!0}.bind(this),0)}function s(t,e){var s=document.createElementNS(svgNS,"text");s.style.fontSize="100px",s.style.fontFamily=e.fFamily,s.textContent="1",e.fClass?(s.style.fontFamily="inherit",s.className=e.fClass):s.style.fontFamily=e.fFamily,t.appendChild(s);var r=document.createElement("canvas").getContext("2d");return r.font="100px "+e.fFamily,r}function r(r,i){if(!r)return void(this.loaded=!0);if(this.chars)return this.loaded=!0,void(this.fonts=r.list);var a,n=r.list,o=n.length;for(a=0;o>a;a+=1){if(n[a].loaded=!1,n[a].monoCase=t(n[a].fFamily,"monospace"),n[a].sansCase=t(n[a].fFamily,"sans-serif"),n[a].fPath){if("p"===n[a].fOrigin){var h=document.createElement("style");h.type="text/css",h.innerHTML="@font-face {font-family: "+n[a].fFamily+"; font-style: normal; src: url('"+n[a].fPath+"');}",i.appendChild(h)}else if("g"===n[a].fOrigin){var l=document.createElement("link");l.type="text/css",l.rel="stylesheet",l.href=n[a].fPath,i.appendChild(l)}else if("t"===n[a].fOrigin){var p=document.createElement("script");p.setAttribute("src",n[a].fPath),i.appendChild(p)}}else n[a].loaded=!0;n[a].helper=s(i,n[a]),this.fonts.push(n[a])}e.bind(this)()}function i(t){if(t){this.chars||(this.chars=[]);var e,s,r,i=t.length,a=this.chars.length;for(e=0;i>e;e+=1){for(s=0,r=!1;a>s;)this.chars[s].style===t[e].style&&this.chars[s].fFamily===t[e].fFamily&&this.chars[s].ch===t[e].ch&&(r=!0),s+=1;r||(this.chars.push(t[e]),a+=1)}}}function a(t,e,s){for(var r=0,i=this.chars.length;i>r;){if(this.chars[r].ch===t&&this.chars[r].style===e&&this.chars[r].fFamily===s)return this.chars[r];r+=1}}function n(t,e,s){var r=this.getFontByName(e),i=r.helper;return i.measureText(t).width*s/100}function o(t){for(var e=0,s=this.fonts.length;s>e;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return"sans-serif"}var h=5e3,l=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.loaded=!1,this.initTime=Date.now()};return l.prototype.addChars=i,l.prototype.addFonts=r,l.prototype.getCharData=a,l.prototype.getFontByName=o,l.prototype.measureText=n,l}(),PropertyFactory=function(){function t(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(t===this.lastFrame||this.lastFrame!==l&&(this.lastFrame>=this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>=this.keyframes[this.keyframes.length-1].t-this.offsetTime||this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime));else{for(var e,s,r=0,i=this.keyframes.length-1,a=1,n=!0;n;){if(e=this.keyframes[r],s=this.keyframes[r+1],r==i-1&&t>=s.t-this.offsetTime){e.h&&(e=s);break}if(s.t-this.offsetTime>t)break;i-1>r?r+=a:n=!1}var o,h,p,m,f,d=0;if(e.to){e.bezierData||bez.buildBezierData(e);var c=e.bezierData;if(t>=s.t-this.offsetTime||t<e.t-this.offsetTime){var u=t>=s.t-this.offsetTime?c.points.length-1:0;for(h=c.points[u].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?c.points[u].point[o]*this.mult:c.points[u].point[o],this.pv[o]=c.points[u].point[o],this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o])}else{e.__fnct?f=e.__fnct:(f=BezierFactory.getBezierEasing(e.o.x,e.o.y,e.i.x,e.i.y,e.n).get,e.__fnct=f),p=f((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)));var y,g=c.segmentLength*p,v=0;for(a=1,n=!0,m=c.points.length;n;){if(v+=c.points[d].partialLength*a,0===g||0===p||d==c.points.length-1){for(h=c.points[d].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?c.points[d].point[o]*this.mult:c.points[d].point[o],this.pv[o]=c.points[d].point[o],this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o]);break}if(g>=v&&g<v+c.points[d+1].partialLength){for(y=(g-v)/c.points[d+1].partialLength,h=c.points[d].point.length,o=0;h>o;o+=1)this.v[o]=this.mult?(c.points[d].point[o]+(c.points[d+1].point[o]-c.points[d].point[o])*y)*this.mult:c.points[d].point[o]+(c.points[d+1].point[o]-c.points[d].point[o])*y,this.pv[o]=c.points[d].point[o]+(c.points[d+1].point[o]-c.points[d].point[o])*y,this.lastPValue[o]!==this.pv[o]&&(this.mdf=!0,this.lastPValue[o]=this.pv[o]);break}m-1>d&&1==a||d>0&&-1==a?d+=a:n=!1}}}else{var b,E,P,k,S,C=!1;for(i=e.s.length,r=0;i>r;r+=1){if(1!==e.h&&(e.o.x instanceof Array?(C=!0,e.__fnct||(e.__fnct=[]),e.__fnct[r]||(b=e.o.x[r]||e.o.x[0],E=e.o.y[r]||e.o.y[0],P=e.i.x[r]||e.i.x[0],k=e.i.y[r]||e.i.y[0])):(C=!1,e.__fnct||(b=e.o.x,E=e.o.y,P=e.i.x,k=e.i.y)),C?e.__fnct[r]?f=e.__fnct[r]:(f=BezierFactory.getBezierEasing(b,E,P,k).get,e.__fnct[r]=f):e.__fnct?f=e.__fnct:(f=BezierFactory.getBezierEasing(b,E,P,k).get,e.__fnct=f),p=t>=s.t-this.offsetTime?1:t<e.t-this.offsetTime?0:f((t-(e.t-this.offsetTime))/(s.t-this.offsetTime-(e.t-this.offsetTime)))),this.sh&&1!==e.h){var x=e.s[r],M=e.e[r];-180>x-M?x+=360:x-M>180&&(x-=360),S=x+(M-x)*p}else S=1===e.h?e.s[r]:e.s[r]+(e.e[r]-e.s[r])*p;1===i?(this.v=this.mult?S*this.mult:S,this.pv=S,this.lastPValue!=this.pv&&(this.mdf=!0,this.lastPValue=this.pv)):(this.v[r]=this.mult?S*this.mult:S,this.pv[r]=S,this.lastPValue[r]!==this.pv[r]&&(this.mdf=!0,this.lastPValue[r]=this.pv[r]))}}}this.lastFrame=t,this.frameId=this.elem.globalData.frameId}}function e(){}function s(t,s,r){this.mult=r,this.v=r?s.k*r:s.k,this.pv=s.k,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.getValue=e}function r(t,s,r){this.mult=r,this.data=s,this.mdf=!1,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1,this.v=new Array(s.k.length),this.pv=new Array(s.k.length),this.lastValue=new Array(s.k.length);var i=Array.apply(null,{length:s.k.length});this.vel=i.map(function(){return 0});var a,n=s.k.length;for(a=0;n>a;a+=1)this.v[a]=r?s.k[a]*r:s.k[a],this.pv[a]=s.k[a];this.getValue=e}function i(e,s,r){this.keyframes=s.k,this.offsetTime=e.data.st,this.lastValue=-99999,this.lastPValue=-99999,this.frameId=-1,this.k=!0,this.kf=!0,this.data=s,this.mult=r,this.elem=e,this.comp=e.comp,this.lastFrame=l,this.v=r?s.k[0].s[0]*r:s.k[0].s[0],this.pv=s.k[0].s[0],this.getValue=t}function a(e,s,r){var i,a,n,o,h,p=s.k.length;for(i=0;p-1>i;i+=1)s.k[i].to&&s.k[i].s&&s.k[i].e&&(a=s.k[i].s,n=s.k[i].e,o=s.k[i].to,h=s.k[i].ti,(2===a.length&&(a[0]!==n[0]||a[1]!==n[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],a[0]+o[0],a[1]+o[1])&&bez.pointOnLine2D(a[0],a[1],n[0],n[1],n[0]+h[0],n[1]+h[1])||3===a.length&&(a[0]!==n[0]||a[1]!==n[1]||a[2]!==n[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],a[0]+o[0],a[1]+o[1],a[2]+o[2])&&bez.pointOnLine3D(a[0],a[1],a[2],n[0],n[1],n[2],n[0]+h[0],n[1]+h[1],n[2]+h[2]))&&(s.k[i].to=null,s.k[i].ti=null));this.keyframes=s.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this.mult=r,this.elem=e,this.comp=e.comp,this.getValue=t,this.frameId=-1,this.v=new Array(s.k[0].s.length),this.pv=new Array(s.k[0].s.length),this.lastValue=new Array(s.k[0].s.length),this.lastPValue=new Array(s.k[0].s.length),this.lastFrame=l}function n(t,e,n,o,h){var l;if(2===n)l=new p(t,e,h);else if(7===n)l=new TrimProperty(t,e,h);else if(e.k.length)if("number"==typeof e.k[0])l=new r(t,e,o);else switch(n){case 0:l=new i(t,e,o);break;case 1:l=new a(t,e,o)}else l=new s(t,e,o);return l.k&&h.push(l),l}function o(t,e,s,r){return new f(t,e,s,r)}function h(t,e,s){return new d(t,e,s)}var l=-999999,p=function(){function t(){return this.p.k&&this.p.getValue(),this.p.v.key||(this.p.v.key=function(t){return this.p.v.numKeys?this.p.keyframes[t-1].t:0}.bind(this)),this.p.v.numKeys||(this.p.v.numKeys=this.p.keyframes?this.p.keyframes.length:0),this.p.v.valueAtTime||(this.p.v.valueAtTime=this.p.getValueAtTime.bind(this.p)),this.p.v}function e(){return this.px.k&&this.px.getValue(),this.px.v}function s(){return this.py.k&&this.py.getValue(),this.py.v}function r(){return this.a.k&&this.a.getValue(),this.a.v}function i(){return this.or.k&&this.or.getValue(),this.or.v}function a(){return this.r.k&&this.r.getValue(),this.r.v/degToRads}function n(){return this.s.k&&this.s.getValue(),this.s.v}function o(){return this.o.k&&this.o.getValue(),this.o.v}function h(){return this.sk.k&&this.sk.getValue(),this.sk.v}function l(){return this.sa.k&&this.sa.getValue(),this.sa.v}function p(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}function m(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);if(this.mdf){if(this.v.reset(),this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented&&this.p.keyframes&&this.p.getValueAtTime){var s,r;this.p.lastFrame+this.p.offsetTime<this.p.keyframes[0].t?(s=this.p.getValueAtTime(this.p.keyframes[0].t-this.p.offsetTime+.01,this.p.offsetTime),r=this.p.getValueAtTime(this.p.keyframes[0].t-this.p.offsetTime,this.p.offsetTime)):this.p.lastFrame+this.p.offsetTime>this.p.keyframes[this.p.keyframes.length-1].t?(s=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t-this.p.offsetTime,this.p.offsetTime),r=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t-this.p.offsetTime-.01,this.p.offsetTime)):(s=this.p.pv,r=this.p.getValueAtTime(this.p.lastFrame-.01,this.p.offsetTime)),this.v.rotate(-Math.atan2(s[1]-r[1],s[0]-r[0]))}this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}}function f(){this.inverted=!0,this.iv=new Matrix,this.k||(this.data.p.s?this.iv.translate(this.px.v,this.py.v,-this.pz.v):this.iv.translate(this.p.v[0],this.p.v[1],-this.p.v[2]),this.r?this.iv.rotate(-this.r.v):this.iv.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.s&&this.iv.scale(this.s.v[0],this.s.v[1],1),this.a&&this.iv.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]))}function d(){}return function(c,u,y){this.elem=c,this.frameId=-1,this.dynamicProperties=[],this.mdf=!1,this.data=u,this.getValue=m,this.applyToMatrix=p,this.setInverted=f,this.autoOrient=d,this.v=new Matrix,u.p.s?(this.px=PropertyFactory.getProp(c,u.p.x,0,0,this.dynamicProperties),this.py=PropertyFactory.getProp(c,u.p.y,0,0,this.dynamicProperties),u.p.z&&(this.pz=PropertyFactory.getProp(c,u.p.z,0,0,this.dynamicProperties))):this.p=PropertyFactory.getProp(c,u.p,1,0,this.dynamicProperties),u.r?this.r=PropertyFactory.getProp(c,u.r,0,degToRads,this.dynamicProperties):u.rx&&(this.rx=PropertyFactory.getProp(c,u.rx,0,degToRads,this.dynamicProperties),this.ry=PropertyFactory.getProp(c,u.ry,0,degToRads,this.dynamicProperties),this.rz=PropertyFactory.getProp(c,u.rz,0,degToRads,this.dynamicProperties),this.or=PropertyFactory.getProp(c,u.or,0,degToRads,this.dynamicProperties)),u.sk&&(this.sk=PropertyFactory.getProp(c,u.sk,0,degToRads,this.dynamicProperties),this.sa=PropertyFactory.getProp(c,u.sa,0,degToRads,this.dynamicProperties)),u.a&&(this.a=PropertyFactory.getProp(c,u.a,1,0,this.dynamicProperties)),u.s&&(this.s=PropertyFactory.getProp(c,u.s,1,.01,this.dynamicProperties)),this.o=u.o?PropertyFactory.getProp(c,u.o,0,.01,y):{mdf:!1,v:1},this.dynamicProperties.length?y.push(this):(this.a&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r?this.v.rotate(-this.r.v):this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?u.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])),Object.defineProperty(this,"position",{get:t}),Object.defineProperty(this,"xPosition",{get:e}),Object.defineProperty(this,"yPosition",{get:s}),Object.defineProperty(this,"orientation",{get:i}),Object.defineProperty(this,"anchorPoint",{get:r}),Object.defineProperty(this,"rotation",{get:a}),Object.defineProperty(this,"scale",{get:n}),Object.defineProperty(this,"opacity",{get:o}),Object.defineProperty(this,"skew",{get:h}),Object.defineProperty(this,"skewAxis",{get:l})}}(),m=function(){function t(t){if(this.prop.getValue(),this.cmdf=!1,this.omdf=!1,this.prop.mdf||t){var e,s,r,i=4*this.data.p;for(e=0;i>e;e+=1)s=e%4===0?100:255,r=Math.round(this.prop.v[e]*s),this.c[e]!==r&&(this.c[e]=r,this.cmdf=!0);if(this.o.length)for(i=this.prop.v.length,e=4*this.data.p;i>e;e+=1)s=e%2===0?100:1,r=e%2===0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==r&&(this.o[e-4*this.data.p]=r,this.omdf=!0)}}function e(e,s,r){this.prop=n(e,s.k,1,null,[]),this.data=s,this.k=this.prop.k,this.c=Array.apply(null,{length:4*s.p});var i=s.k.k[0].s?s.k.k[0].s.length-4*s.p:s.k.k.length-4*s.p;this.o=Array.apply(null,{length:i}),this.cmdf=!1,this.omdf=!1,this.getValue=t,this.prop.k&&r.push(this),this.getValue(!0)}return function(t,s,r){return new e(t,s,r)}}(),f=function(){function t(t){var e=0,s=this.dataProps.length;if(this.elem.globalData.frameId!==this.frameId||t){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId;s>e;){if(this.dataProps[e].p.mdf){this.mdf=!0;break}e+=1}if(this.mdf||t)for("svg"===this.renderer&&(this.dasharray=""),e=0;s>e;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dasharray+=" "+this.dataProps[e].p.v:this.dasharray[e]=this.dataProps[e].p.v:this.dashoffset=this.dataProps[e].p.v}}return function(e,s,r,i){this.elem=e,this.frameId=-1,this.dataProps=new Array(s.length),this.renderer=r,this.mdf=!1,this.k=!1,this.dasharray="svg"===this.renderer?"":new Array(s.length-1),this.dashoffset=0;var a,n,o=s.length;for(a=0;o>a;a+=1)n=PropertyFactory.getProp(e,s[a].v,0,0,i),this.k=n.k?!0:this.k,this.dataProps[a]={n:s[a].n,p:n};this.getValue=t,this.k?i.push(this):this.getValue(!0)}}(),d=function(){function t(){if(this.dynamicProperties.length){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0)}var s=this.data.totalChars,r=2===this.data.r?1:100/s,i=this.o.v/r,a=this.s.v/r+i,n=this.e.v/r+i;if(a>n){var o=a;a=n,n=o}this.finalS=a,this.finalE=n}function e(t){var e=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,a=0,n=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)a=o===n?t>=o?1:0:s(0,r(.5/(o-n)+(t-n)/(o-n),1)),a=e(a);else if(3==h)a=o===n?t>=o?0:1:1-s(0,r(.5/(o-n)+(t-n)/(o-n),1)),a=e(a);else if(4==h)o===n?a=t>=o?0:1:(a=s(0,r(.5/(o-n)+(t-n)/(o-n),1)),.5>a?a*=2:a=1-a);else if(5==h)if(o===n)a=t>=o?0:1;else{var l=o-n;a=-4/(l*l)*t*t+4/l*t}else 6==h?a=o===n?t>=o?0:1:(1+(Math.cos(Math.PI+2*Math.PI*(t-n)/(o-n))+0))/2:t>=i(n)&&(a=0>t-n?1-(n-t):s(0,r(o-t,1)));return a*this.a.v}var s=Math.max,r=Math.min,i=Math.floor;return this.mdf=!1,function(s,r,i){this.mdf=!1,this.k=!1,this.data=r,this.dynamicProperties=[],this.getValue=t,this.getMult=e,this.comp=s.comp,this.finalS=0,this.finalE=0,this.s=PropertyFactory.getProp(s,r.s||{k:0},0,0,this.dynamicProperties),this.e="e"in r?PropertyFactory.getProp(s,r.e,0,0,this.dynamicProperties):{v:2===r.r?r.totalChars:100},this.o=PropertyFactory.getProp(s,r.o||{k:0},0,0,this.dynamicProperties),this.xe=PropertyFactory.getProp(s,r.xe||{k:0},0,0,this.dynamicProperties),this.ne=PropertyFactory.getProp(s,r.ne||{k:0},0,0,this.dynamicProperties),this.a=PropertyFactory.getProp(s,r.a,0,.01,this.dynamicProperties),this.dynamicProperties.length?i.push(this):this.getValue()}}(),c={};return c.getProp=n,c.getDashProp=o,c.getTextSelectorProp=h,c.getGradientProp=m,c}(),ShapePropertyFactory=function(){function t(){this.mdf=!1;var t=this.comp.renderedFrame-this.offsetTime;if(this.lastFrame!==n&&(this.lastFrame<this.keyframes[0].t-this.offsetTime&&t<this.keyframes[0].t-this.offsetTime||this.lastFrame>this.keyframes[this.keyframes.length-1].t-this.offsetTime&&t>this.keyframes[this.keyframes.length-1].t-this.offsetTime));else{var e,s,r;if(t<this.keyframes[0].t-this.offsetTime)e=this.keyframes[0].s[0],r=!0;else if(t>this.keyframes[this.keyframes.length-1].t-this.offsetTime)e=1===this.keyframes[this.keyframes.length-2].h?this.keyframes[this.keyframes.length-1].s[0]:this.keyframes[this.keyframes.length-2].e[0],r=!0;else{for(var i,a,o,h,l,p,m=0,f=this.keyframes.length-1,d=!0;d&&(i=this.keyframes[m],a=this.keyframes[m+1],!(a.t-this.offsetTime>t));)f-1>m?m+=1:d=!1;r=1===i.h,r&&m===f&&(i=a);var c;if(!r){var u;i.__fnct?u=i.__fnct:(u=BezierFactory.getBezierEasing(i.o.x,i.o.y,i.i.x,i.i.y).get,i.__fnct=u),c=t>=a.t-this.offsetTime?1:t<i.t-this.offsetTime?0:u((t-(i.t-this.offsetTime))/(a.t-this.offsetTime-(i.t-this.offsetTime))),s=i.e[0]}e=i.s[0]}h=this.v.i.length,p=e.i[0].length;var y,g=!1;for(o=0;h>o;o+=1)for(l=0;p>l;l+=1)r?(y=e.i[o][l],this.v.i[o][l]!==y&&(this.v.i[o][l]=y,this.pv.i[o][l]=y,g=!0),y=e.o[o][l],this.v.o[o][l]!==y&&(this.v.o[o][l]=y,this.pv.o[o][l]=y,g=!0),y=e.v[o][l],this.v.v[o][l]!==y&&(this.v.v[o][l]=y,this.pv.v[o][l]=y,g=!0)):(y=e.i[o][l]+(s.i[o][l]-e.i[o][l])*c,this.v.i[o][l]!==y&&(this.v.i[o][l]=y,this.pv.i[o][l]=y,g=!0),y=e.o[o][l]+(s.o[o][l]-e.o[o][l])*c,this.v.o[o][l]!==y&&(this.v.o[o][l]=y,this.pv.o[o][l]=y,g=!0),y=e.v[o][l]+(s.v[o][l]-e.v[o][l])*c,this.v.v[o][l]!==y&&(this.v.v[o][l]=y,this.pv.v[o][l]=y,g=!0));this.mdf=g,this.paths.length=0,this.paths[0]=this.v}this.lastFrame=t}function e(){return this.v}function s(){this.paths.length?(this.paths.length=1,this.paths[0]=this.v):this.paths=[this.v]}function r(t,r,i){this.comp=t.comp,this.k=!1,this.mdf=!1,this.closed=3===i?r.cl:r.closed,this.numNodes=3===i?r.pt.k.v.length:r.ks.k.v.length,this.v=3===i?r.pt.k:r.ks.k,this.getValue=e,this.pv=this.v,this.v.c=this.closed,this.paths=[this.v],this.reset=s}function i(e,r,i){this.comp=e.comp,this.offsetTime=e.data.st,this.getValue=t,this.keyframes=3===i?r.pt.k:r.ks.k,this.k=!0,this.closed=3===i?r.cl:r.closed;var a,o=this.keyframes[0].s[0].i.length,h=this.keyframes[0].s[0].i[0].length;for(this.numNodes=o,this.v={i:Array.apply(null,{length:o}),o:Array.apply(null,{length:o}),v:Array.apply(null,{length:o}),c:this.closed},this.pv={i:Array.apply(null,{length:o}),o:Array.apply(null,{length:o}),v:Array.apply(null,{length:o})},a=0;o>a;a+=1)this.v.i[a]=Array.apply(null,{length:h}),this.v.o[a]=Array.apply(null,{length:h}),this.v.v[a]=Array.apply(null,{length:h}),this.pv.i[a]=Array.apply(null,{length:h}),this.pv.o[a]=Array.apply(null,{length:h}),this.pv.v[a]=Array.apply(null,{length:h});this.paths=[],this.lastFrame=n,this.reset=s}function a(t,e,s,a){var n;if(3===s||4===s){var p=3===s?e.pt.k:e.ks.k;n=p.length?new i(t,e,s):new r(t,e,s)}else 5===s?n=new l(t,e):6===s?n=new o(t,e):7===s&&(n=new h(t,e));return n.k&&a.push(n),n}var n=-999999,o=function(){function t(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,i=this.s.v[1]/2;2!==this.d&&3!==this.d?(this.v.v[0]=[t,e-i],this.v.i[0]=[t-s*r,e-i],this.v.o[0]=[t+s*r,e-i],this.v.v[1]=[t+s,e],this.v.i[1]=[t+s,e-i*r],this.v.o[1]=[t+s,e+i*r],this.v.v[2]=[t,e+i],this.v.i[2]=[t+s*r,e+i],this.v.o[2]=[t-s*r,e+i],this.v.v[3]=[t-s,e],this.v.i[3]=[t-s,e+i*r],this.v.o[3]=[t-s,e-i*r]):(this.v.v[0]=[t,e-i],this.v.o[0]=[t-s*r,e-i],this.v.i[0]=[t+s*r,e-i],this.v.v[1]=[t-s,e],this.v.o[1]=[t-s,e+i*r],this.v.i[1]=[t-s,e-i*r],this.v.v[2]=[t,e+i],this.v.o[2]=[t+s*r,e+i],this.v.i[2]=[t-s*r,e+i],this.v.v[3]=[t+s,e],this.v.o[3]=[t+s,e-i*r],this.v.i[3]=[t+s,e+i*r]),this.paths.length=0,this.paths[0]=this.v}function e(t){var e,s=this.dynamicProperties.length;if(this.elem.globalData.frameId!==this.frameId){for(this.mdf=!1,this.frameId=this.elem.globalData.frameId,e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&(this.convertEllToPath(),this.paths.length=0,this.paths[0]=this.v)}}var r=roundCorner;return function(r,i){this.v={v:Array.apply(null,{length:4}),i:Array.apply(null,{length:4}),o:Array.apply(null,{length:4}),c:!0},this.numNodes=4,this.d=i.d,this.dynamicProperties=[],this.paths=[],i.closed=!0,this.closed=!0,this.elem=r,this.comp=r.comp,this.frameId=-1,this.mdf=!1,this.getValue=e,this.convertEllToPath=t,this.reset=s,this.p=PropertyFactory.getProp(r,i.p,1,0,this.dynamicProperties),this.s=PropertyFactory.getProp(r,i.s,1,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertEllToPath()}}(),h=function(){function t(){var t=Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,r=this.or.v,i=this.os.v,a=2*Math.PI*r/(4*t),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,s=0;t>s;s+=1){var h=r*Math.cos(n),l=r*Math.sin(n),p=0===h&&0===l?0:l/Math.sqrt(h*h+l*l),m=0===h&&0===l?0:-h/Math.sqrt(h*h+l*l);h+=+this.p.v[0],l+=+this.p.v[1],this.v.v[s]=[h,l],this.v.i[s]=[h+p*a*i*o,l+m*a*i*o],this.v.o[s]=[h-p*a*i*o,l-m*a*i*o],n+=e*o}this.numNodes=t,this.paths.length=0,this.paths[0]=this.v}function e(){var t=2*Math.floor(this.pt.v),e=2*Math.PI/t;this.v.v.length=t,this.v.i.length=t,this.v.o.length=t;var s,r,i,a,n=!0,o=this.or.v,h=this.ir.v,l=this.os.v,p=this.is.v,m=2*Math.PI*o/(2*t),f=2*Math.PI*h/(2*t),d=-Math.PI/2;d+=this.r.v;var c=3===this.data.d?-1:1;for(s=0;t>s;s+=1){r=n?o:h,i=n?l:p,a=n?m:f;var u=r*Math.cos(d),y=r*Math.sin(d),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.v[s]=[u,y],this.v.i[s]=[u+g*a*i*c,y+v*a*i*c],this.v.o[s]=[u-g*a*i*c,y-v*a*i*c],n=!n,d+=e*c}this.numNodes=t,this.paths.length=0,this.paths[0]=this.v}function r(){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t].mdf&&(this.mdf=!0);this.mdf&&this.convertToPath()}}return function(i,a){this.v={v:[],i:[],o:[],c:!0},this.elem=i,this.comp=i.comp,this.data=a,this.frameId=-1,this.d=a.d,this.dynamicProperties=[],this.mdf=!1,a.closed=!0,this.closed=!0,this.getValue=r,this.reset=s,1===a.sy?(this.ir=PropertyFactory.getProp(i,a.ir,0,0,this.dynamicProperties),this.is=PropertyFactory.getProp(i,a.is,0,.01,this.dynamicProperties),this.convertToPath=e):this.convertToPath=t,this.pt=PropertyFactory.getProp(i,a.pt,0,0,this.dynamicProperties),this.p=PropertyFactory.getProp(i,a.p,1,0,this.dynamicProperties),this.r=PropertyFactory.getProp(i,a.r,0,degToRads,this.dynamicProperties),this.or=PropertyFactory.getProp(i,a.or,0,0,this.dynamicProperties),this.os=PropertyFactory.getProp(i,a.os,0,.01,this.dynamicProperties),this.paths=[],this.dynamicProperties.length?this.k=!0:this.convertToPath()}}(),l=function(){function t(t){if(this.elem.globalData.frameId!==this.frameId){this.mdf=!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.mdf=!0);this.mdf&&this.convertRectToPath()}}function e(){var t=this.p.v[0],e=this.p.v[1],s=this.s.v[0]/2,r=this.s.v[1]/2,i=bm_min(s,r,this.r.v),a=i*(1-roundCorner);2===this.d||1===this.d?(this.v.v[0]=[t+s,e-r+i],this.v.o[0]=this.v.v[0],this.v.i[0]=[t+s,e-r+a],this.v.v[1]=[t+s,e+r-i],this.v.o[1]=[t+s,e+r-a],this.v.i[1]=this.v.v[1],this.v.v[2]=[t+s-i,e+r],this.v.o[2]=this.v.v[2],this.v.i[2]=[t+s-a,e+r],this.v.v[3]=[t-s+i,e+r],this.v.o[3]=[t-s+a,e+r],this.v.i[3]=this.v.v[3],this.v.v[4]=[t-s,e+r-i],this.v.o[4]=this.v.v[4],this.v.i[4]=[t-s,e+r-a],this.v.v[5]=[t-s,e-r+i],this.v.o[5]=[t-s,e-r+a],this.v.i[5]=this.v.v[5],this.v.v[6]=[t-s+i,e-r],this.v.o[6]=this.v.v[6],this.v.i[6]=[t-s+a,e-r],this.v.v[7]=[t+s-i,e-r],this.v.o[7]=[t+s-a,e-r],this.v.i[7]=this.v.v[7]):(this.v.v[0]=[t+s,e-r+i],this.v.o[0]=[t+s,e-r+a],this.v.i[0]=this.v.v[0],this.v.v[1]=[t+s-i,e-r],this.v.o[1]=this.v.v[1],this.v.i[1]=[t+s-a,e-r],this.v.v[2]=[t-s+i,e-r],this.v.o[2]=[t-s+a,e-r],this.v.i[2]=this.v.v[2],this.v.v[3]=[t-s,e-r+i],this.v.o[3]=this.v.v[3],this.v.i[3]=[t-s,e-r+a],this.v.v[4]=[t-s,e+r-i],this.v.o[4]=[t-s,e+r-a],this.v.i[4]=this.v.v[4],this.v.v[5]=[t-s+i,e+r],this.v.o[5]=this.v.v[5],this.v.i[5]=[t-s+a,e+r],this.v.v[6]=[t+s-i,e+r],this.v.o[6]=[t+s-a,e+r],this.v.i[6]=this.v.v[6],this.v.v[7]=[t+s,e+r-i],this.v.o[7]=this.v.v[7],this.v.i[7]=[t+s,e+r-a]),this.paths.length=0,this.paths[0]=this.v}return function(r,i){this.v={v:Array.apply(null,{length:8}),i:Array.apply(null,{length:8}),o:Array.apply(null,{length:8}),c:!0},this.paths=[],this.numNodes=8,this.elem=r,this.comp=r.comp,this.frameId=-1,this.d=i.d,this.dynamicProperties=[],this.mdf=!1,i.closed=!0,this.closed=!0,this.getValue=t,this.convertRectToPath=e,this.reset=s,this.p=PropertyFactory.getProp(r,i.p,1,0,this.dynamicProperties),this.s=PropertyFactory.getProp(r,i.s,1,0,this.dynamicProperties),this.r=PropertyFactory.getProp(r,i.r,0,0,this.dynamicProperties),this.dynamicProperties.length?this.k=!0:this.convertRectToPath()}}(),p={};return p.getShapeProp=a,p}(),ShapeModifiers=function(){function t(t,e){r[t]||(r[t]=e)}function e(t,e,s,i){return new r[t](e,s,i)}var s={},r={};return s.registerModifier=t,s.getModifier=e,s}();ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(t){this.closed||(this.shapes.push({shape:t,last:[]}),this.addShapeToModifier(t))},ShapeModifier.prototype.init=function(t,e,s){this.elem=t,this.frameId=-1,this.shapes=[],this.dynamicProperties=[],this.mdf=!1,this.closed=!1,this.k=!1,this.isTrimming=!1,this.comp=t.comp,this.initModifierProperties(t,e),this.dynamicProperties.length?(this.k=!0,s.push(this)):this.getValue(!0)},extendPrototype(ShapeModifier,TrimModifier),TrimModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0);if(this.mdf||t){var r=this.o.v%360/360;0>r&&(r+=1);var i=this.s.v+r,a=this.e.v+r;if(i>a){var n=i;i=a,a=n}this.sValue=i,this.eValue=a,this.oValue=r}}},TrimModifier.prototype.initModifierProperties=function(t,e){this.sValue=0,this.eValue=0,this.oValue=0,this.getValue=this.processKeys,this.s=PropertyFactory.getProp(t,e.s,0,.01,this.dynamicProperties),this.e=PropertyFactory.getProp(t,e.e,0,.01,this.dynamicProperties),this.o=PropertyFactory.getProp(t,e.o,0,0,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},TrimModifier.prototype.getSegmentsLength=function(t){var e,s=t.c,r=t.v,i=t.o,a=t.i,n=r.length,o=[],h=0;for(e=0;n-1>e;e+=1)o[e]=bez.getBezierLength(r[e],r[e+1],i[e],a[e+1]),h+=o[e].addedLength;return s&&(o[e]=bez.getBezierLength(r[e],r[0],i[e],a[0]),h+=o[e].addedLength),{lengths:o,totalLength:h}},TrimModifier.prototype.processShapes=function(t){var e,s,r,i,a,n,o,h=this.shapes.length,l=this.sValue,p=this.eValue,m=0;if(p===l)for(s=0;h>s;s+=1)this.shapes[s].shape.paths=[],this.shapes[s].shape.mdf=!0;else{var f,d,c=[];for(s=0;h>s;s+=1){if(f=this.shapes[s],f.shape.mdf||this.mdf||t){if(e=f.shape.paths,i=e.length,o=0,!f.shape.mdf&&f.pathsData)o=f.totalShapeLength;else{for(a=[],r=0;i>r;r+=1)n=this.getSegmentsLength(e[r]),a.push(n),o+=n.totalLength;f.totalShapeLength=o,f.pathsData=a}m+=o}else f.shape.paths=f.last;f.shape.mdf=!0}for(s=0;h>s;s+=1)if(d=[],f=this.shapes[s],f.shape.mdf){c.length=0,1>=p?c.push({s:f.totalShapeLength*l,e:f.totalShapeLength*p}):l>=1?c.push({s:f.totalShapeLength*(l-1),e:f.totalShapeLength*(p-1)}):(c.push({s:f.totalShapeLength*l,e:f.totalShapeLength}),c.push({s:0,e:f.totalShapeLength*(p-1)}));var u,y=this.addShapes(f,c[0]);

        d.push(y),c.length>1&&(f.shape.closed?this.addShapes(f,c[1],y):(y.i[0]=[y.v[0][0],y.v[0][1]],u=y.v.length-1,y.o[u]=[y.v[u][0],y.v[u][1]],y=this.addShapes(f,c[1]),d.push(y))),y.i[0]=[y.v[0][0],y.v[0][1]],u=y.v.length-1,y.o[u]=[y.v[u][0],y.v[u][1]],f.last=d,f.shape.paths=d}}this.dynamicProperties.length||(this.mdf=!1)},TrimModifier.prototype.addSegment=function(t,e,s,r,i,a){i.o[a]=e,i.i[a+1]=s,i.v[a+1]=r,i.v[a]=t},TrimModifier.prototype.addShapes=function(t,e,s){var r,i,a,n,o,h,l,p=t.pathsData,m=t.shape.paths,f=m.length,d=0;for(s?o=s.v.length-1:(s={c:!1,v:[],i:[],o:[]},o=0),r=0;f>r;r+=1){for(h=p[r].lengths,a=m[r].c?h.length:h.length+1,i=1;a>i;i+=1)if(n=h[i-1],d+n.addedLength<e.s)d+=n.addedLength;else{if(d>e.e)break;e.s<=d&&e.e>=d+n.addedLength?this.addSegment(m[r].v[i-1],m[r].o[i-1],m[r].i[i],m[r].v[i],s,o):(l=bez.getNewSegment(m[r].v[i-1],m[r].v[i],m[r].o[i-1],m[r].i[i],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[i-1]),this.addSegment(l.pt1,l.pt3,l.pt4,l.pt2,s,o)),d+=n.addedLength,o+=1}if(m[r].c&&d<=e.e){var c=h[i-1].addedLength;e.s<=d&&e.e>=d+c?this.addSegment(m[r].v[i-1],m[r].o[i-1],m[r].i[0],m[r].v[0],s,o):(l=bez.getNewSegment(m[r].v[i-1],m[r].v[0],m[r].o[i-1],m[r].i[0],(e.s-d)/c,(e.e-d)/c,h[i-1]),this.addSegment(l.pt1,l.pt3,l.pt4,l.pt2,s,o))}}return s},ShapeModifiers.registerModifier("tm",TrimModifier),extendPrototype(ShapeModifier,RoundCornersModifier),RoundCornersModifier.prototype.processKeys=function(t){if(this.elem.globalData.frameId!==this.frameId||t){this.mdf=t?!0:!1,this.frameId=this.elem.globalData.frameId;var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.mdf=!0)}},RoundCornersModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(t,e.r,0,null,this.dynamicProperties),this.dynamicProperties.length||this.getValue(!0)},RoundCornersModifier.prototype.processPath=function(t,e){var s,r,i,a,n,o,h,l,p,m,f=t.v.length,d=[],c=[],u=[];for(s=0;f>s;s+=1)r=t.v[s],a=t.o[s],i=t.i[s],r[0]===a[0]&&r[1]===a[1]&&r[0]===i[0]&&r[1]===i[1]?0!==s&&s!==f-1||t.c?(n=0===s?t.v[f-1]:t.v[s-1],p=Math.sqrt(Math.pow(r[0]-n[0],2)+Math.pow(r[1]-n[1],2)),m=p?Math.min(p/2,e)/p:0,o=[r[0]+(n[0]-r[0])*m,r[1]-(r[1]-n[1])*m],l=o,h=[o[0]-(o[0]-r[0])*roundCorner,o[1]-(o[1]-r[1])*roundCorner],d.push(o),c.push(h),u.push(l),n=s===f-1?t.v[0]:t.v[s+1],p=Math.sqrt(Math.pow(r[0]-n[0],2)+Math.pow(r[1]-n[1],2)),m=p?Math.min(p/2,e)/p:0,o=[r[0]+(n[0]-r[0])*m,r[1]+(n[1]-r[1])*m],l=[o[0]-(o[0]-r[0])*roundCorner,o[1]-(o[1]-r[1])*roundCorner],h=o,d.push(o),c.push(h),u.push(l)):(d.push(r),c.push(a),u.push(i)):(d.push(t.v[s]),c.push(t.o[s]),u.push(t.i[s]));return{v:d,o:c,i:u,c:t.c}},RoundCornersModifier.prototype.processShapes=function(){var t,e,s,r,i=this.shapes.length,a=this.rd.v;if(0!==a){var n,o=[];for(e=0;i>e;e+=1)if(n=this.shapes[e],n.shape.mdf||this.mdf){for(n.shape.mdf=!0,t=n.shape.paths,r=t.length,s=0;r>s;s+=1)o.push(this.processPath(t[s],a));n.shape.paths=o,n.last=o}else n.shape.paths=n.last}this.dynamicProperties.length||(this.mdf=!1)},ShapeModifiers.registerModifier("rd",RoundCornersModifier);var ImagePreloader=function(){function t(){this.loadedAssets+=1,this.loadedAssets===this.totalImages}function e(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e}function s(e){var s=document.createElement("img");s.addEventListener("load",t.bind(this),!1),s.addEventListener("error",t.bind(this),!1),s.src=e}function r(t){this.totalAssets=t.length;var r;for(r=0;r<this.totalAssets;r+=1)t[r].layers||(s.bind(this)(e.bind(this)(t[r])),this.totalImages+=1)}function i(t){this.path=t||""}function a(t){this.assetsPath=t||""}return function(){this.loadAssets=r,this.setAssetsPath=a,this.setPath=i,this.assetsPath="",this.path="",this.totalAssets=0,this.totalImages=0,this.loadedAssets=0}}();BaseRenderer.prototype.checkLayers=function(t){var e,s,r=this.layers.length;for(this.completeLayers=!0,e=r-1;e>=0;e--)this.elements[e]||(s=this.layers[e],s.ip-s.st<=t-this.layers[e].st&&s.op-s.st>t-this.layers[e].st&&this.buildItem(e)),this.completeLayers=this.elements[e]?this.completeLayers:!1},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 99:return null}return this.createBase(t)},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;e>t;t+=1)this.buildItem(t)},BaseRenderer.prototype.includeLayers=function(t){this.completeLayers=!1;var e,s,r=t.length,i=this.layers.length;for(e=0;r>e;e+=1)for(s=0;i>s;){if(this.layers[s].id==t[e].id){this.layers[s]=t[e];break}s+=1}},BaseRenderer.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(t,e){for(var s=this.elements,r=this.layers,i=0,a=r.length;a>i;)r[i].ind==e&&(s[i]||this.buildItem(i),t.getHierarchy().push(s[i]),void 0!==r[i].parent&&this.buildElementParenting(t,r[i].parent)),i+=1},extendPrototype(BaseRenderer,SVGRenderer),SVGRenderer.prototype.createBase=function(t){return new SVGBaseElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createShape=function(t){return new IShapeElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createText=function(t){return new SVGTextElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createImage=function(t){return new IImageElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createComp=function(t){return new ICompElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.createSolid=function(t){return new ISolidElement(t,this.layerElement,this.globalData,this)},SVGRenderer.prototype.configAnimation=function(t){this.layerElement=document.createElementNS(svgNS,"svg"),this.layerElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.layerElement.setAttribute("width",t.w),this.layerElement.setAttribute("height",t.h),this.layerElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.layerElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.layerElement.style.width="100%",this.layerElement.style.height="100%",this.layerElement.style.transform="translate3d(0,0,0)",this.layerElement.style.transformOrigin=this.layerElement.style.mozTransformOrigin=this.layerElement.style.webkitTransformOrigin=this.layerElement.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.layerElement);var e=document.createElementNS(svgNS,"defs");this.globalData.defs=e,this.layerElement.appendChild(e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr;var s=document.createElementNS(svgNS,"clipPath"),r=document.createElementNS(svgNS,"rect");r.setAttribute("width",t.w),r.setAttribute("height",t.h),r.setAttribute("x",0),r.setAttribute("y",0);var i="animationMask_"+randomString(10);s.setAttribute("id",i),s.appendChild(r);var a=document.createElementNS(svgNS,"g");a.setAttribute("clip-path","url(#"+i+")"),this.layerElement.appendChild(a),e.appendChild(s),this.layerElement=a,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.elements=Array.apply(null,{length:t.layers.length})},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){var s=this.createItem(this.layers[t]);e[t]=s,expressionsPlugin&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(s),s.initExpressions()),this.appendElementInPos(s,t),this.layers[t].tt&&(this.buildItem(t-1),s.setMatte(e[t-1].layerId))}},SVGRenderer.prototype.renderFrame=function(t){if(this.renderedFrame!=t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t;var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},SVGRenderer.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){for(var r,i=0;e>i;)this.elements[i]&&this.elements[i].getBaseElement()&&(r=this.elements[i].getBaseElement()),i+=1;r?this.layerElement.insertBefore(s,r):this.layerElement.appendChild(s)}},SVGRenderer.prototype.hide=function(){this.layerElement.style.display="none"},SVGRenderer.prototype.show=function(){this.layerElement.style.display="block"},SVGRenderer.prototype.searchExtraCompositions=function(t){var e,s=t.length,r=document.createElementNS(svgNS,"g");for(e=0;s>e;e+=1)if(t[e].xt){var i=this.createComp(t[e],r,this.globalData.comp,null);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},extendPrototype(BaseRenderer,CanvasRenderer),CanvasRenderer.prototype.createBase=function(t){return new CVBaseElement(t,this,this.globalData)},CanvasRenderer.prototype.createShape=function(t){return new CVShapeElement(t,this,this.globalData)},CanvasRenderer.prototype.createText=function(t){return new CVTextElement(t,this,this.globalData)},CanvasRenderer.prototype.createImage=function(t){return new CVImageElement(t,this,this.globalData)},CanvasRenderer.prototype.createComp=function(t){return new CVCompElement(t,this,this.globalData)},CanvasRenderer.prototype.createSolid=function(t){return new CVSolidElement(t,this,this.globalData)},CanvasRenderer.prototype.ctxTransform=function(t){if(1!==t[0]||0!==t[1]||0!==t[4]||1!==t[5]||0!==t[12]||0!==t[13]){if(!this.renderConfig.clearCanvas)return void this.canvasContext.transform(t[0],t[1],t[4],t[5],t[12],t[13]);this.transformMat.cloneFromProps(t),this.transformMat.transform(this.contextData.cTr.props[0],this.contextData.cTr.props[1],this.contextData.cTr.props[2],this.contextData.cTr.props[3],this.contextData.cTr.props[4],this.contextData.cTr.props[5],this.contextData.cTr.props[6],this.contextData.cTr.props[7],this.contextData.cTr.props[8],this.contextData.cTr.props[9],this.contextData.cTr.props[10],this.contextData.cTr.props[11],this.contextData.cTr.props[12],this.contextData.cTr.props[13],this.contextData.cTr.props[14],this.contextData.cTr.props[15]),this.contextData.cTr.cloneFromProps(this.transformMat.props);var e=this.contextData.cTr.props;this.canvasContext.setTransform(e[0],e[1],e[4],e[5],e[12],e[13])}},CanvasRenderer.prototype.ctxOpacity=function(t){if(1!==t){if(!this.renderConfig.clearCanvas)return void(this.canvasContext.globalAlpha*=0>t?0:t);this.contextData.cO*=0>t?0:t,this.canvasContext.globalAlpha=this.contextData.cO}},CanvasRenderer.prototype.reset=function(){return this.renderConfig.clearCanvas?(this.contextData.cArrPos=0,this.contextData.cTr.reset(),void(this.contextData.cO=1)):void this.canvasContext.restore()},CanvasRenderer.prototype.save=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.save();t&&this.canvasContext.save();var e=this.contextData.cTr.props;(null===this.contextData.saved[this.contextData.cArrPos]||void 0===this.contextData.saved[this.contextData.cArrPos])&&(this.contextData.saved[this.contextData.cArrPos]=new Array(16));var s,r=this.contextData.saved[this.contextData.cArrPos];for(s=0;16>s;s+=1)r[s]=e[s];this.contextData.savedOp[this.contextData.cArrPos]=this.contextData.cO,this.contextData.cArrPos+=1},CanvasRenderer.prototype.restore=function(t){if(!this.renderConfig.clearCanvas)return void this.canvasContext.restore();t&&this.canvasContext.restore(),this.contextData.cArrPos-=1;var e,s=this.contextData.saved[this.contextData.cArrPos],r=this.contextData.cTr.props;for(e=0;16>e;e+=1)r[e]=s[e];this.canvasContext.setTransform(s[0],s[1],s[4],s[5],s[12],s[13]),s=this.contextData.savedOp[this.contextData.cArrPos],this.contextData.cO=s,this.canvasContext.globalAlpha=s},CanvasRenderer.prototype.configAnimation=function(t){this.animationItem.wrapper?(this.animationItem.container=document.createElement("canvas"),this.animationItem.container.style.width="100%",this.animationItem.container.style.height="100%",this.animationItem.container.style.transformOrigin=this.animationItem.container.style.mozTransformOrigin=this.animationItem.container.style.webkitTransformOrigin=this.animationItem.container.style["-webkit-transform"]="0px 0px 0px",this.animationItem.wrapper.appendChild(this.animationItem.container),this.canvasContext=this.animationItem.container.getContext("2d")):this.canvasContext=this.renderConfig.context,this.globalData.canvasContext=this.canvasContext,this.globalData.renderer=this,this.globalData.isDashed=!1,this.globalData.totalFrames=Math.floor(t.tf),this.globalData.compWidth=t.w,this.globalData.compHeight=t.h,this.globalData.frameRate=t.fr,this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.layers=t.layers,this.transformCanvas={},this.transformCanvas.w=t.w,this.transformCanvas.h=t.h,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,document.body),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.addPendingElement=this.animationItem.addPendingElement.bind(this.animationItem),this.globalData.transformCanvas=this.transformCanvas,this.elements=Array.apply(null,{length:t.layers.length}),this.updateContainerSize()},CanvasRenderer.prototype.updateContainerSize=function(){var t,e;this.animationItem.wrapper&&this.animationItem.container?(t=this.animationItem.wrapper.offsetWidth,e=this.animationItem.wrapper.offsetHeight,this.animationItem.container.setAttribute("width",t*this.renderConfig.dpr),this.animationItem.container.setAttribute("height",e*this.renderConfig.dpr)):(t=this.canvasContext.canvas.width*this.renderConfig.dpr,e=this.canvasContext.canvas.height*this.renderConfig.dpr);var s,r;if(-1!==this.renderConfig.preserveAspectRatio.indexOf("meet")||-1!==this.renderConfig.preserveAspectRatio.indexOf("slice")){var i=this.renderConfig.preserveAspectRatio.split(" "),a=i[1]||"meet",n=i[0]||"xMidYMid",o=n.substr(0,4),h=n.substr(4);s=t/e,r=this.transformCanvas.w/this.transformCanvas.h,r>s&&"meet"===a||s>r&&"slice"===a?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=t/(this.transformCanvas.w/this.renderConfig.dpr)):(this.transformCanvas.sx=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr)),this.transformCanvas.tx="xMid"===o&&(s>r&&"meet"===a||r>s&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))/2*this.renderConfig.dpr:"xMax"===o&&(s>r&&"meet"===a||r>s&&"slice"===a)?(t-this.transformCanvas.w*(e/this.transformCanvas.h))*this.renderConfig.dpr:0,this.transformCanvas.ty="YMid"===h&&(r>s&&"meet"===a||s>r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))/2*this.renderConfig.dpr:"YMax"===h&&(r>s&&"meet"===a||s>r&&"slice"===a)?(e-this.transformCanvas.h*(t/this.transformCanvas.w))*this.renderConfig.dpr:0}else"none"==this.renderConfig.preserveAspectRatio?(this.transformCanvas.sx=t/(this.transformCanvas.w/this.renderConfig.dpr),this.transformCanvas.sy=e/(this.transformCanvas.h/this.renderConfig.dpr),this.transformCanvas.tx=0,this.transformCanvas.ty=0):(this.transformCanvas.sx=this.renderConfig.dpr,this.transformCanvas.sy=this.renderConfig.dpr,this.transformCanvas.tx=0,this.transformCanvas.ty=0);this.transformCanvas.props=[this.transformCanvas.sx,0,0,0,0,this.transformCanvas.sy,0,0,0,0,1,0,this.transformCanvas.tx,this.transformCanvas.ty,0,1];var l,p=this.elements.length;for(l=0;p>l;l+=1)this.elements[l]&&0===this.elements[l].data.ty&&this.elements[l].resize(this.globalData.transformCanvas)},CanvasRenderer.prototype.destroy=function(){this.renderConfig.clearCanvas&&(this.animationItem.wrapper.innerHTML="");var t,e=this.layers?this.layers.length:0;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.elements.length=0,this.globalData.canvasContext=null,this.animationItem.container=null,this.destroyed=!0},CanvasRenderer.prototype.renderFrame=function(t){if(!(this.renderedFrame==t&&this.renderConfig.clearCanvas===!0||this.destroyed||null===t)){this.renderedFrame=t,this.globalData.frameNum=t-this.animationItem.firstFrame,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.renderConfig.clearCanvas===!0?(this.reset(),this.canvasContext.save(),this.canvasContext.clearRect(this.transformCanvas.tx,this.transformCanvas.ty,this.transformCanvas.w*this.transformCanvas.sx,this.transformCanvas.h*this.transformCanvas.sy)):this.save(),this.ctxTransform(this.transformCanvas.props),this.canvasContext.beginPath(),this.canvasContext.rect(0,0,this.transformCanvas.w,this.transformCanvas.h),this.canvasContext.closePath(),this.canvasContext.clip();var e,s=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=0;s>e;e++)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);for(e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.renderConfig.clearCanvas!==!0?this.restore():this.canvasContext.restore()}},CanvasRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){var s=this.createItem(this.layers[t],this,this.globalData);e[t]=s,s.initExpressions(),0===this.layers[t].ty&&s.resize(this.globalData.transformCanvas)}},CanvasRenderer.prototype.hide=function(){this.animationItem.container.style.display="none"},CanvasRenderer.prototype.show=function(){this.animationItem.container.style.display="block"},CanvasRenderer.prototype.searchExtraCompositions=function(t){{var e,s=t.length;document.createElementNS(svgNS,"g")}for(e=0;s>e;e+=1)if(t[e].xt){var r=this.createComp(t[e],this.globalData.comp,this.globalData);r.initExpressions(),this.globalData.projectInterface.registerComposition(r)}},extendPrototype(BaseRenderer,HybridRenderer),HybridRenderer.prototype.buildItem=SVGRenderer.prototype.buildItem,HybridRenderer.prototype.appendElementInPos=function(t,e){var s=t.getBaseElement();if(s){var r=this.layers[e];if(r.ddd&&this.supports3d)this.addTo3dContainer(s,e);else{for(var i,a=0;e>a;)this.elements[a]&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?r.ddd&&this.supports3d||this.layerElement.insertBefore(s,i):r.ddd&&this.supports3d||this.layerElement.appendChild(s)}}},HybridRenderer.prototype.createBase=function(t){return new SVGBaseElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createShape=function(t){return this.supports3d?new HShapeElement(t,this.layerElement,this.globalData,this):new IShapeElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createText=function(t){return this.supports3d?new HTextElement(t,this.layerElement,this.globalData,this):new SVGTextElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createCamera=function(t){return this.camera=new HCameraElement(t,this.layerElement,this.globalData,this),this.camera},HybridRenderer.prototype.createImage=function(t){return this.supports3d?new HImageElement(t,this.layerElement,this.globalData,this):new IImageElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createComp=function(t){return this.supports3d?new HCompElement(t,this.layerElement,this.globalData,this):new ICompElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.createSolid=function(t){return this.supports3d?new HSolidElement(t,this.layerElement,this.globalData,this):new ISolidElement(t,this.layerElement,this.globalData,this)},HybridRenderer.prototype.getThreeDContainer=function(t){var e=document.createElement("div");styleDiv(e),e.style.width=this.globalData.compSize.w+"px",e.style.height=this.globalData.compSize.h+"px",e.style.transformOrigin=e.style.mozTransformOrigin=e.style.webkitTransformOrigin="50% 50%";var s=document.createElement("div");styleDiv(s),s.style.transform=s.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)",e.appendChild(s),this.resizerElem.appendChild(e);var r={container:s,perspectiveElem:e,startPos:t,endPos:t};return this.threeDElements.push(r),r},HybridRenderer.prototype.build3dContainers=function(){var t,e,s=this.layers.length;for(t=0;s>t;t+=1)this.layers[t].ddd?(e||(e=this.getThreeDContainer(t)),e.endPos=Math.max(e.endPos,t)):e=null},HybridRenderer.prototype.addTo3dContainer=function(t,e){for(var s=0,r=this.threeDElements.length;r>s;){if(e<=this.threeDElements[s].endPos){for(var i,a=this.threeDElements[s].startPos;e>a;)this.elements[a]&&this.elements[a].getBaseElement()&&(i=this.elements[a].getBaseElement()),a+=1;i?this.threeDElements[s].container.insertBefore(t,i):this.threeDElements[s].container.appendChild(t);break}s+=1}},HybridRenderer.prototype.configAnimation=function(t){var e=document.createElement("div"),s=this.animationItem.wrapper;e.style.width=t.w+"px",e.style.height=t.h+"px",this.resizerElem=e,styleDiv(e),e.style.transformStyle=e.style.webkitTransformStyle=e.style.mozTransformStyle="flat",s.appendChild(e),e.style.overflow="hidden";var r=document.createElementNS(svgNS,"svg");r.setAttribute("width","1"),r.setAttribute("height","1"),styleDiv(r),this.resizerElem.appendChild(r);var i=document.createElementNS(svgNS,"defs");r.appendChild(i),this.globalData.defs=i,this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.elementLoaded=this.animationItem.elementLoaded.bind(this.animationItem),this.globalData.frameId=0,this.globalData.compSize={w:t.w,h:t.h},this.globalData.frameRate=t.fr,this.layers=t.layers,this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,r),this.layerElement=this.resizerElem,this.build3dContainers(),this.updateContainerSize()},HybridRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.animationItem.container=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;e>t;t++)this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},HybridRenderer.prototype.updateContainerSize=function(){var t,e,s,r,i=this.animationItem.wrapper.offsetWidth,a=this.animationItem.wrapper.offsetHeight,n=i/a,o=this.globalData.compSize.w/this.globalData.compSize.h;o>n?(t=i/this.globalData.compSize.w,e=i/this.globalData.compSize.w,s=0,r=(a-this.globalData.compSize.h*(i/this.globalData.compSize.w))/2):(t=a/this.globalData.compSize.h,e=a/this.globalData.compSize.h,s=(i-this.globalData.compSize.w*(a/this.globalData.compSize.h))/2,r=0),this.resizerElem.style.transform=this.resizerElem.style.webkitTransform="matrix3d("+t+",0,0,0,0,"+e+",0,0,0,0,1,0,"+s+","+r+",0,1)"},HybridRenderer.prototype.renderFrame=SVGRenderer.prototype.renderFrame,HybridRenderer.prototype.hide=function(){this.resizerElem.style.display="none"},HybridRenderer.prototype.show=function(){this.resizerElem.style.display="block"},HybridRenderer.prototype.initItems=function(){if(this.buildAllItems(),this.camera)this.camera.setup();else{var t,e=this.globalData.compSize.w,s=this.globalData.compSize.h,r=this.threeDElements.length;for(t=0;r>t;t+=1)this.threeDElements[t].perspectiveElem.style.perspective=this.threeDElements[t].perspectiveElem.style.webkitPerspective=Math.sqrt(Math.pow(e,2)+Math.pow(s,2))+"px"}},HybridRenderer.prototype.searchExtraCompositions=function(t){var e,s=t.length,r=document.createElement("div");for(e=0;s>e;e+=1)if(t[e].xt){var i=this.createComp(t[e],r,this.globalData.comp,null);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.prepareFrame=function(){var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue()},MaskElement.prototype.renderFrame=function(t){var e,s=this.masksProperties.length;for(e=0;s>e;e++)if((this.viewData[e].prop.mdf||this.firstFrame)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),"n"!==this.masksProperties[e].mode&&this.masksProperties[e].cl!==!1&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp.mdf||this.firstFrame)&&(this.viewData[e].invRect.setAttribute("x",-t.props[12]),this.viewData[e].invRect.setAttribute("y",-t.props[13])),this.storedData[e].x&&(this.storedData[e].x.mdf||this.firstFrame))){var r=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url(#"+this.storedData[e].filterId+")")),r.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}this.firstFrame=!1},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,s){var r,i,a="";for(i=e.v.length,r=1;i>r;r+=1)1==r&&(a+=" M"+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),a+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[r][0])+","+bm_rnd(e.i[r][1])+" "+bm_rnd(e.v[r][0])+","+bm_rnd(e.v[r][1]);t.cl&&(a+=" C"+bm_rnd(e.o[r-1][0])+","+bm_rnd(e.o[r-1][1])+" "+bm_rnd(e.i[0][0])+","+bm_rnd(e.i[0][1])+" "+bm_rnd(e.v[0][0])+","+bm_rnd(e.v[0][1])),s.lastPath!==a&&(s.elem&&(t.inv?s.elem.setAttribute("d",this.solidPath+a):s.elem.setAttribute("d",a)),s.lastPath=a)},MaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].prop.pv};e+=1}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.paths=null,this.masksProperties=null},BaseElement.prototype.checkMasks=function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;e>t;){if("n"!==this.data.masksProperties[t].mode&&this.data.masksProperties[t].cl!==!1)return!0;t+=1}return!1},BaseElement.prototype.checkParenting=function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent)},BaseElement.prototype.prepareFrame=function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?this.isVisible!==!0&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!0,this.firstFrame=!0,this.data.hasMask&&(this.maskManager.firstFrame=!0)):this.isVisible!==!1&&(this.elemMdf=!0,this.globalData.mdf=!0,this.isVisible=!1);var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(),this.dynamicProperties[e].mdf&&(this.elemMdf=!0,this.globalData.mdf=!0);return this.data.hasMask&&this.maskManager.prepareFrame(t*this.data.sr),this.currentFrameNum=t*this.data.sr,this.isVisible},BaseElement.prototype.globalToLocal=function(t){var e=[];e.push(this.finalTransform);for(var s=!0,r=this.comp;s;)r.finalTransform?(r.data.hasMask&&e.splice(0,0,r.finalTransform),r=r.comp):s=!1;var i,a,n=e.length;for(i=0;n>i;i+=1)a=e[i].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},BaseElement.prototype.initExpressions=function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty&&(this.layerInterface.shapeInterface=ShapeExpressionInterface.createShapeInterface(this.shapesData,this.viewData,this.layerInterface))},BaseElement.prototype.setBlendMode=function(){var t="";switch(this.data.bm){case 1:t="multiply";break;case 2:t="screen";break;case 3:t="overlay";break;case 4:t="darken";break;case 5:t="lighten";break;case 6:t="color-dodge";break;case 7:t="color-burn";break;case 8:t="hard-light";break;case 9:t="soft-light";break;case 10:t="difference";break;case 11:t="exclusion";break;case 12:t="hue";break;case 13:t="saturation";break;case 14:t="color";break;case 15:t="luminosity"}this.layerElement.style["mix-blend-mode"]=t},BaseElement.prototype.init=function(){this.data.sr||(this.data.sr=1),this.dynamicProperties=[],this.data.ef&&(this.effects=new EffectsManager(this.data,this,this.dynamicProperties)),this.hidden=!1,this.firstFrame=!0,this.isVisible=!1,this.currentFrameNum=-99999,this.lastNum=-99999,this.data.ks&&(this.finalTransform={mProp:PropertyFactory.getProp(this,this.data.ks,2,null,this.dynamicProperties),matMdf:!1,opMdf:!1,mat:new Matrix,opacity:1},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.finalTransform.op=this.finalTransform.mProp.o,this.transform=this.finalTransform.mProp,11!==this.data.ty&&this.createElements(),this.data.hasMask&&this.addMasks(this.data)),this.elemMdf=!1},BaseElement.prototype.getType=function(){return this.type},BaseElement.prototype.resetHierarchy=function(){this.hierarchy?this.hierarchy.length=0:this.hierarchy=[]},BaseElement.prototype.getHierarchy=function(){return this.hierarchy||(this.hierarchy=[]),this.hierarchy},BaseElement.prototype.getLayerSize=function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}},BaseElement.prototype.hide=function(){},BaseElement.prototype.mHelper=new Matrix,createElement(BaseElement,SVGBaseElement),SVGBaseElement.prototype.createElements=function(){if(this.data.td){if(3==this.data.td)this.layerElement=document.createElementNS(svgNS,"mask"),this.layerElement.setAttribute("id",this.layerId),this.layerElement.setAttribute("mask-type","luminance"),this.globalData.defs.appendChild(this.layerElement);else if(2==this.data.td){var t=document.createElementNS(svgNS,"mask");t.setAttribute("id",this.layerId),t.setAttribute("mask-type","alpha");var e=document.createElementNS(svgNS,"g");t.appendChild(e),this.layerElement=document.createElementNS(svgNS,"g");var s=document.createElementNS(svgNS,"filter"),r=randomString(10);s.setAttribute("id",r),s.setAttribute("filterUnits","objectBoundingBox"),s.setAttribute("x","0%"),s.setAttribute("y","0%"),s.setAttribute("width","100%"),s.setAttribute("height","100%");var i=document.createElementNS(svgNS,"feComponentTransfer");i.setAttribute("in","SourceGraphic"),s.appendChild(i);var a=document.createElementNS(svgNS,"feFuncA");

        a.setAttribute("type","table"),a.setAttribute("tableValues","1.0 0.0"),i.appendChild(a),this.globalData.defs.appendChild(s);var n=document.createElementNS(svgNS,"rect");n.setAttribute("width",this.comp.data?this.comp.data.w:this.globalData.compSize.w),n.setAttribute("height",this.comp.data?this.comp.data.h:this.globalData.compSize.h),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("fill","#ffffff"),n.setAttribute("opacity","0"),e.setAttribute("filter","url(#"+r+")"),e.appendChild(n),e.appendChild(this.layerElement),this.globalData.defs.appendChild(t)}else{this.layerElement=document.createElementNS(svgNS,"g");var o=document.createElementNS(svgNS,"mask");o.setAttribute("id",this.layerId),o.setAttribute("mask-type","alpha"),o.appendChild(this.layerElement),this.globalData.defs.appendChild(o)}this.data.hasMask&&(this.maskedElement=this.layerElement)}else this.data.hasMask||this.data.tt?(this.layerElement=document.createElementNS(svgNS,"g"),this.data.tt?(this.matteElement=document.createElementNS(svgNS,"g"),this.matteElement.appendChild(this.layerElement),this.baseElement=this.matteElement):this.baseElement=this.layerElement,this.data.hasMask&&(this.maskedElement=this.layerElement)):(this.layerElement=document.createElementNS(svgNS,"g"),this.baseElement=this.layerElement);if(!this.data.ln&&!this.data.cl||4!==this.data.ty&&0!==this.data.ty||(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl)),0===this.data.ty&&!this.checkMasks()){var h=document.createElementNS(svgNS,"clipPath"),l=document.createElementNS(svgNS,"path");l.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var p="cp_"+randomString(8);h.setAttribute("id",p),this.layerElement.setAttribute("clip-path","url(#"+p+")"),h.appendChild(l),this.globalData.defs.appendChild(h)}0!==this.data.bm&&this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.data.ef&&(this.effectsManager=new SVGEffects(this)),this.checkParenting()},SVGBaseElement.prototype.setBlendMode=BaseElement.prototype.setBlendMode,SVGBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty||this.data.hd)return!1;if(!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var r,i=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)this.finalTransform.matMdf=this.hierarchy[r].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&s.cloneFromProps(this.finalTransform.mProp.v.props);return t&&(e=t.mat.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.finalTransform.matMdf&&this.layerElement&&this.layerElement.setAttribute("transform",s.to2dCSS()),this.finalTransform.opMdf&&this.layerElement&&this.layerElement.setAttribute("opacity",this.finalTransform.opacity),this.data.hasMask&&this.maskManager.renderFrame(s),this.effectsManager&&this.effectsManager.renderFrame(this.firstFrame),this.isVisible},SVGBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&this.maskManager.destroy()},SVGBaseElement.prototype.getBaseElement=function(){return this.baseElement},SVGBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.setMatte=function(t){this.matteElement&&this.matteElement.setAttribute("mask","url(#"+t+")")},SVGBaseElement.prototype.hide=function(){},ITextElement.prototype.init=function(){this._parent.init.call(this),this.lettersChangedFlag=!1;var t=this.data;this.renderedLetters=Array.apply(null,{length:t.t.d.l?t.t.d.l.length:0}),this.viewData={m:{a:PropertyFactory.getProp(this,t.t.m.a,1,0,this.dynamicProperties)}};var e=this.data.t;if(e.a.length){this.viewData.a=Array.apply(null,{length:e.a.length});var s,r,i,a=e.a.length;for(s=0;a>s;s+=1)i=e.a[s],r={a:{},s:{}},"r"in i.a&&(r.a.r=PropertyFactory.getProp(this,i.a.r,0,degToRads,this.dynamicProperties)),"rx"in i.a&&(r.a.rx=PropertyFactory.getProp(this,i.a.rx,0,degToRads,this.dynamicProperties)),"ry"in i.a&&(r.a.ry=PropertyFactory.getProp(this,i.a.ry,0,degToRads,this.dynamicProperties)),"sk"in i.a&&(r.a.sk=PropertyFactory.getProp(this,i.a.sk,0,degToRads,this.dynamicProperties)),"sa"in i.a&&(r.a.sa=PropertyFactory.getProp(this,i.a.sa,0,degToRads,this.dynamicProperties)),"s"in i.a&&(r.a.s=PropertyFactory.getProp(this,i.a.s,1,.01,this.dynamicProperties)),"a"in i.a&&(r.a.a=PropertyFactory.getProp(this,i.a.a,1,0,this.dynamicProperties)),"o"in i.a&&(r.a.o=PropertyFactory.getProp(this,i.a.o,0,.01,this.dynamicProperties)),"p"in i.a&&(r.a.p=PropertyFactory.getProp(this,i.a.p,1,0,this.dynamicProperties)),"sw"in i.a&&(r.a.sw=PropertyFactory.getProp(this,i.a.sw,0,0,this.dynamicProperties)),"sc"in i.a&&(r.a.sc=PropertyFactory.getProp(this,i.a.sc,1,0,this.dynamicProperties)),"fc"in i.a&&(r.a.fc=PropertyFactory.getProp(this,i.a.fc,1,0,this.dynamicProperties)),"fh"in i.a&&(r.a.fh=PropertyFactory.getProp(this,i.a.fh,0,0,this.dynamicProperties)),"fs"in i.a&&(r.a.fs=PropertyFactory.getProp(this,i.a.fs,0,.01,this.dynamicProperties)),"fb"in i.a&&(r.a.fb=PropertyFactory.getProp(this,i.a.fb,0,.01,this.dynamicProperties)),"t"in i.a&&(r.a.t=PropertyFactory.getProp(this,i.a.t,0,0,this.dynamicProperties)),r.s=PropertyFactory.getTextSelectorProp(this,i.s,this.dynamicProperties),r.s.t=i.s.t,this.viewData.a[s]=r}else this.viewData.a=[];e.p&&"m"in e.p?(this.viewData.p={f:PropertyFactory.getProp(this,e.p.f,0,0,this.dynamicProperties),l:PropertyFactory.getProp(this,e.p.l,0,0,this.dynamicProperties),r:e.p.r,m:this.maskManager.getMaskProperty(e.p.m)},this.maskPath=!0):this.maskPath=!1},ITextElement.prototype.createPathShape=function(t,e){var s,r,i,a,n=e.length,o="";for(s=0;n>s;s+=1){for(i=e[s].ks.k.i.length,a=e[s].ks.k,r=1;i>r;r+=1)1==r&&(o+=" M"+t.applyToPointStringified(a.v[0][0],a.v[0][1])),o+=" C"+t.applyToPointStringified(a.o[r-1][0],a.o[r-1][1])+" "+t.applyToPointStringified(a.i[r][0],a.i[r][1])+" "+t.applyToPointStringified(a.v[r][0],a.v[r][1]);o+=" C"+t.applyToPointStringified(a.o[r-1][0],a.o[r-1][1])+" "+t.applyToPointStringified(a.i[0][0],a.i[0][1])+" "+t.applyToPointStringified(a.v[0][0],a.v[0][1]),o+="z"}return o},ITextElement.prototype.getMeasures=function(){var t,e,s,r,i=this.mHelper,a=this.renderType,n=this.data,o=n.t.d,h=o.l;if(this.maskPath){var l=this.viewData.p.m;if(!this.viewData.p.n||this.viewData.p.mdf){var p=l.v;this.viewData.p.r&&(p=reversePath(p,l.closed));var m={tLength:0,segments:[]};r=p.v.length-1;var f,d=0;for(s=0;r>s;s+=1)f={s:p.v[s],e:p.v[s+1],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[s+1][0]-p.v[s+1][0],p.i[s+1][1]-p.v[s+1][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),d+=f.bezierData.segmentLength;s=r,l.closed&&(f={s:p.v[s],e:p.v[0],to:[p.o[s][0]-p.v[s][0],p.o[s][1]-p.v[s][1]],ti:[p.i[0][0]-p.v[0][0],p.i[0][1]-p.v[0][1]]},bez.buildBezierData(f),m.tLength+=f.bezierData.segmentLength,m.segments.push(f),d+=f.bezierData.segmentLength),this.viewData.p.pi=m}var c,u,y,m=this.viewData.p.pi,g=this.viewData.p.f.v,v=0,b=1,E=0,P=!0,k=m.segments;if(0>g&&l.closed)for(m.tLength<Math.abs(g)&&(g=-Math.abs(g)%m.tLength),v=k.length-1,y=k[v].bezierData.points,b=y.length-1;0>g;)g+=y[b].partialLength,b-=1,0>b&&(v-=1,y=k[v].bezierData.points,b=y.length-1);y=k[v].bezierData.points,u=y[b-1],c=y[b];var S,C,x=c.partialLength}r=h.length,t=0,e=0;var M,D,A,w,T,I=1.2*n.t.d.s*.714,F=!0,V=this.viewData,B=Array.apply(null,{length:r});this.lettersChangedFlag=!1,w=V.a.length;var R,_,N,L,z,O,G,H,j,W,q,X,Y,U,Z,J,K=-1,$=g,Q=v,tt=b,et=-1,st=0;for(s=0;r>s;s+=1)if(i.reset(),O=1,h[s].n)t=0,e+=o.yOffset,e+=F?1:0,g=$,F=!1,st=0,this.maskPath&&(v=Q,b=tt,y=k[v].bezierData.points,u=y[b-1],c=y[b],x=c.partialLength,E=0),B[s]=this.emptyProp;else{if(this.maskPath){if(et!==h[s].line){switch(o.j){case 1:g+=d-o.lineWidths[h[s].line];break;case 2:g+=(d-o.lineWidths[h[s].line])/2}et=h[s].line}K!==h[s].ind&&(h[K]&&(g+=h[K].extra),g+=h[s].an/2,K=h[s].ind),g+=V.m.a.v[0]*h[s].an/200;var rt=0;for(A=0;w>A;A+=1)M=V.a[A].a,"p"in M&&(D=V.a[A].s,_=D.getMult(h[s].anIndexes[A],n.t.a[A].s.totalChars),rt+=_.length?M.p.v[0]*_[0]:M.p.v[0]*_);for(P=!0;P;)E+x>=g+rt||!y?(S=(g+rt-E)/c.partialLength,L=u.point[0]+(c.point[0]-u.point[0])*S,z=u.point[1]+(c.point[1]-u.point[1])*S,i.translate(0,-(V.m.a.v[1]*I/100)+e),P=!1):y&&(E+=c.partialLength,b+=1,b>=y.length&&(b=0,v+=1,k[v]?y=k[v].bezierData.points:l.closed?(b=0,v=0,y=k[v].bezierData.points):(E-=c.partialLength,y=null)),y&&(u=c,c=y[b],x=c.partialLength));N=h[s].an/2-h[s].add,i.translate(-N,0,0)}else N=h[s].an/2-h[s].add,i.translate(-N,0,0),i.translate(-V.m.a.v[0]*h[s].an/200,-V.m.a.v[1]*I/100,0);for(st+=h[s].l/2,A=0;w>A;A+=1)M=V.a[A].a,"t"in M&&(D=V.a[A].s,_=D.getMult(h[s].anIndexes[A],n.t.a[A].s.totalChars),this.maskPath?g+=_.length?M.t*_[0]:M.t*_:t+=_.length?M.t.v*_[0]:M.t.v*_);for(st+=h[s].l/2,o.strokeWidthAnim&&(H=n.t.d.sw||0),o.strokeColorAnim&&(G=n.t.d.sc?[n.t.d.sc[0],n.t.d.sc[1],n.t.d.sc[2]]:[0,0,0]),o.fillColorAnim&&(j=[n.t.d.fc[0],n.t.d.fc[1],n.t.d.fc[2]]),A=0;w>A;A+=1)M=V.a[A].a,"a"in M&&(D=V.a[A].s,_=D.getMult(h[s].anIndexes[A],n.t.a[A].s.totalChars),_.length?i.translate(-M.a.v[0]*_[0],-M.a.v[1]*_[1],M.a.v[2]*_[2]):i.translate(-M.a.v[0]*_,-M.a.v[1]*_,M.a.v[2]*_));for(A=0;w>A;A+=1)M=V.a[A].a,"s"in M&&(D=V.a[A].s,_=D.getMult(h[s].anIndexes[A],n.t.a[A].s.totalChars),_.length?i.scale(1+(M.s.v[0]-1)*_[0],1+(M.s.v[1]-1)*_[1],1):i.scale(1+(M.s.v[0]-1)*_,1+(M.s.v[1]-1)*_,1));for(A=0;w>A;A+=1){if(M=V.a[A].a,D=V.a[A].s,_=D.getMult(h[s].anIndexes[A],n.t.a[A].s.totalChars),"sk"in M&&(_.length?i.skewFromAxis(-M.sk.v*_[0],M.sa.v*_[1]):i.skewFromAxis(-M.sk.v*_,M.sa.v*_)),"r"in M&&i.rotateZ(_.length?-M.r.v*_[2]:-M.r.v*_),"ry"in M&&i.rotateY(_.length?M.ry.v*_[1]:M.ry.v*_),"rx"in M&&i.rotateX(_.length?M.rx.v*_[0]:M.rx.v*_),"o"in M&&(O+=_.length?(M.o.v*_[0]-O)*_[0]:(M.o.v*_-O)*_),o.strokeWidthAnim&&"sw"in M&&(H+=_.length?M.sw.v*_[0]:M.sw.v*_),o.strokeColorAnim&&"sc"in M)for(W=0;3>W;W+=1)G[W]=Math.round(_.length?255*(G[W]+(M.sc.v[W]-G[W])*_[0]):255*(G[W]+(M.sc.v[W]-G[W])*_));if(o.fillColorAnim){if("fc"in M)for(W=0;3>W;W+=1)j[W]=_.length?j[W]+(M.fc.v[W]-j[W])*_[0]:j[W]+(M.fc.v[W]-j[W])*_;"fh"in M&&(j=_.length?addHueToRGB(j,M.fh.v*_[0]):addHueToRGB(j,M.fh.v*_)),"fs"in M&&(j=_.length?addSaturationToRGB(j,M.fs.v*_[0]):addSaturationToRGB(j,M.fs.v*_)),"fb"in M&&(j=_.length?addBrightnessToRGB(j,M.fb.v*_[0]):addBrightnessToRGB(j,M.fb.v*_))}}for(A=0;w>A;A+=1)M=V.a[A].a,"p"in M&&(D=V.a[A].s,_=D.getMult(h[s].anIndexes[A],n.t.a[A].s.totalChars),this.maskPath?_.length?i.translate(0,M.p.v[1]*_[0],-M.p.v[2]*_[1]):i.translate(0,M.p.v[1]*_,-M.p.v[2]*_):_.length?i.translate(M.p.v[0]*_[0],M.p.v[1]*_[1],-M.p.v[2]*_[2]):i.translate(M.p.v[0]*_,M.p.v[1]*_,-M.p.v[2]*_));if(o.strokeWidthAnim&&(q=0>H?0:H),o.strokeColorAnim&&(X="rgb("+Math.round(255*G[0])+","+Math.round(255*G[1])+","+Math.round(255*G[2])+")"),o.fillColorAnim&&(Y="rgb("+Math.round(255*j[0])+","+Math.round(255*j[1])+","+Math.round(255*j[2])+")"),this.maskPath){if(n.t.p.p){C=(c.point[1]-u.point[1])/(c.point[0]-u.point[0]);var it=180*Math.atan(C)/Math.PI;c.point[0]<u.point[0]&&(it+=180),i.rotate(-it*Math.PI/180)}i.translate(L,z,0),i.translate(V.m.a.v[0]*h[s].an/200,V.m.a.v[1]*I/100,0),g-=V.m.a.v[0]*h[s].an/200,h[s+1]&&K!==h[s+1].ind&&(g+=h[s].an/2,g+=o.tr/1e3*n.t.d.s)}else{switch(i.translate(t,e,0),o.ps&&i.translate(o.ps[0],o.ps[1]+o.ascent,0),o.j){case 1:i.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line]),0,0);break;case 2:i.translate(o.justifyOffset+(o.boxWidth-o.lineWidths[h[s].line])/2,0,0)}i.translate(N,0,0),i.translate(V.m.a.v[0]*h[s].an/200,V.m.a.v[1]*I/100,0),t+=h[s].l+o.tr/1e3*n.t.d.s}"html"===a?U=i.toCSS():"svg"===a?U=i.to2dCSS():Z=[i.props[0],i.props[1],i.props[2],i.props[3],i.props[4],i.props[5],i.props[6],i.props[7],i.props[8],i.props[9],i.props[10],i.props[11],i.props[12],i.props[13],i.props[14],i.props[15]],J=O,R=this.renderedLetters[s],!R||R.o===J&&R.sw===q&&R.sc===X&&R.fc===Y?"svg"!==a&&"html"!==a||R&&R.m===U?"canvas"!==a||R&&R.props[0]===Z[0]&&R.props[1]===Z[1]&&R.props[4]===Z[4]&&R.props[5]===Z[5]&&R.props[12]===Z[12]&&R.props[13]===Z[13]?T=R:(this.lettersChangedFlag=!0,T=new LetterProps(J,q,X,Y,null,Z)):(this.lettersChangedFlag=!0,T=new LetterProps(J,q,X,Y,U)):(this.lettersChangedFlag=!0,T=new LetterProps(J,q,X,Y,U,Z)),this.renderedLetters[s]=T}},ITextElement.prototype.emptyProp=new LetterProps,createElement(SVGBaseElement,SVGTextElement),SVGTextElement.prototype.init=ITextElement.prototype.init,SVGTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,SVGTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,SVGTextElement.prototype.createElements=function(){this._parent.createElements.call(this);var t=this.data.t.d;t.fc?this.layerElement.setAttribute("fill","rgb("+Math.round(255*t.fc[0])+","+Math.round(255*t.fc[1])+","+Math.round(255*t.fc[2])+")"):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),t.sc&&(this.layerElement.setAttribute("stroke","rgb("+Math.round(255*t.sc[0])+","+Math.round(255*t.sc[1])+","+Math.round(255*t.sc[2])+")"),this.layerElement.setAttribute("stroke-width",t.sw)),this.layerElement.setAttribute("font-size",t.s);var e=this.globalData.fontManager.getFontByName(t.f);if(e.fClass)this.layerElement.setAttribute("class",e.fClass);else{this.layerElement.setAttribute("font-family",e.fFamily);var s=t.fWeight,r=t.fStyle;this.layerElement.setAttribute("font-style",r),this.layerElement.setAttribute("font-weight",s)}var i,a,n=t.l||[];if(a=n.length){var o,h,l=this.mHelper,p="",m=this.data.singleShape;if(m)var f=0,d=0,c=t.lineWidths,u=t.boxWidth,y=!0;for(i=0;a>i;i+=1){if(this.globalData.fontManager.chars?m&&0!==i||(o=document.createElementNS(svgNS,"path")):o=document.createElementNS(svgNS,"text"),o.setAttribute("stroke-linecap","butt"),o.setAttribute("stroke-linejoin","round"),o.setAttribute("stroke-miterlimit","4"),m&&n[i].n&&(f=0,d+=t.yOffset,d+=y?1:0,y=!1),l.reset(),this.globalData.fontManager.chars&&l.scale(t.s/100,t.s/100),m){switch(t.ps&&l.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:l.translate(t.justifyOffset+(u-c[n[i].line]),0,0);break;case 2:l.translate(t.justifyOffset+(u-c[n[i].line])/2,0,0)}l.translate(f,d,0)}if(this.globalData.fontManager.chars){var g,v=this.globalData.fontManager.getCharData(t.t.charAt(i),e.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);g=v?v.data:null,g&&g.shapes&&(h=g.shapes[0].it,m||(p=""),p+=this.createPathShape(l,h),m||o.setAttribute("d",p)),m||this.layerElement.appendChild(o)}else o.textContent=n[i].val,o.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.layerElement.appendChild(o),m&&o.setAttribute("transform",l.to2dCSS());m&&(f+=n[i].l),this.textSpans.push(o)}this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),m&&this.globalData.fontManager.chars&&(o.setAttribute("d",p),this.layerElement.appendChild(o))}},SVGTextElement.prototype.hide=function(){this.hidden||(this.layerElement.style.display="none",this.hidden=!0)},SVGTextElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.layerElement.style.display="block"),!this.data.singleShape&&(this.getMeasures(),this.lettersChangedFlag)){var s,r,i=this.renderedLetters,a=this.data.t.d.l;r=a.length;var n;for(s=0;r>s;s+=1)a[s].n||(n=i[s],this.textSpans[s].setAttribute("transform",n.m),this.textSpans[s].setAttribute("opacity",n.o),n.sw&&this.textSpans[s].setAttribute("stroke-width",n.sw),n.sc&&this.textSpans[s].setAttribute("stroke",n.sc),n.fc&&this.textSpans[s].setAttribute("fill",n.fc));this.firstFrame&&(this.firstFrame=!1)}},SVGTextElement.prototype.destroy=function(){this._parent.destroy.call()},SVGEffects.prototype.renderFrame=function(t){var e,s=this.filters.length;for(e=0;s>e;e+=1)this.filters[e].renderFrame(t)},SVGTintFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[0].p.v,s=this.filterManager.effectElements[1].p.v,r=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",s[0]-e[0]+" 0 0 0 "+e[0]+" "+(s[1]-e[1])+" 0 0 0 "+e[1]+" "+(s[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},SVGFillFilter.prototype.renderFrame=function(t){if(t||this.filterManager.mdf){var e=this.filterManager.effectElements[2].p.v,s=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+s+" 0")}},SVGStrokeEffect.prototype.initialize=function(){var t=this.elem.layerElement.children||this.elem.layerElement.childNodes,e=document.createElementNS(svgNS,"mask"),s="stms_"+randomString(10);e.setAttribute("id",s),e.setAttribute("mask-type","alpha");var r=document.createElementNS(svgNS,"path");r.setAttribute("fill","none"),r.setAttribute("stroke-linecap","round"),r.setAttribute("stroke-dashoffset",1),e.appendChild(r),this.elem.globalData.defs.appendChild(e);var i=document.createElementNS(svgNS,"g");i.setAttribute("mask","url(#"+s+")"),i.appendChild(t[0]),this.elem.layerElement.appendChild(i),this.initialized=!0,this.masker=e,this.pathMasker=r,r.setAttribute("stroke","#fff")},SVGStrokeEffect.prototype.renderFrame=function(t){this.initialized||this.initialize();var e=this.elem.maskManager.viewData[Math.max(this.filterManager.effectElements[0].p.v,1)-1];if((t||this.filterManager.mdf||e.prop.mdf)&&this.pathMasker.setAttribute("d",e.lastPath),t||this.filterManager.effectElements[9].p.mdf||this.filterManager.effectElements[4].p.mdf||this.filterManager.effectElements[7].p.mdf||this.filterManager.effectElements[8].p.mdf||e.prop.mdf){var s;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var r=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,i=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,a=e.elem.getTotalLength();s="0 0 0 "+a*r+" ";var n,o=a*(i-r),h=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,l=Math.floor(o/h);for(n=0;l>n;n+=1)s+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";s+="0 "+10*a+" 0 0"}else s="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),this.pathMasker.setAttribute("stroke-dasharray",s)}(t||this.filterManager.effectElements[6].p.mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v)},createElement(SVGBaseElement,ICompElement),ICompElement.prototype.hide=function(){if(!this.hidden){var t,e=this.elements.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].hide();this.hidden=!0}},ICompElement.prototype.prepareFrame=function(t){if(this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e/this.data.sr;var s,r=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),s=0;r>s;s+=1)(this.completeLayers||this.elements[s])&&this.elements[s].prepareFrame(e/this.data.sr-this.layers[s].st)}},ICompElement.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),r=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;r>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroy=function(){this._parent.destroy.call();var t,e=this.layers.length;for(t=0;e>t;t+=1)this.elements[t]&&this.elements[t].destroy()},ICompElement.prototype.checkLayers=SVGRenderer.prototype.checkLayers,ICompElement.prototype.buildItem=SVGRenderer.prototype.buildItem,ICompElement.prototype.buildAllItems=SVGRenderer.prototype.buildAllItems,ICompElement.prototype.buildElementParenting=SVGRenderer.prototype.buildElementParenting,ICompElement.prototype.createItem=SVGRenderer.prototype.createItem,ICompElement.prototype.createImage=SVGRenderer.prototype.createImage,ICompElement.prototype.createComp=SVGRenderer.prototype.createComp,ICompElement.prototype.createSolid=SVGRenderer.prototype.createSolid,ICompElement.prototype.createShape=SVGRenderer.prototype.createShape,ICompElement.prototype.createText=SVGRenderer.prototype.createText,ICompElement.prototype.createBase=SVGRenderer.prototype.createBase,ICompElement.prototype.appendElementInPos=SVGRenderer.prototype.appendElementInPos,createElement(SVGBaseElement,IImageElement),IImageElement.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData);this._parent.createElements.call(this),this.innerElem=document.createElementNS(svgNS,"image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio","xMidYMid slice"),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.maskedElement=this.innerElem,this.layerElement.appendChild(this.innerElem),this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.data.cl&&this.innerElem.setAttribute("class",this.data.cl)},IImageElement.prototype.hide=function(){this.hidden||(this.innerElem.style.display="none",this.hidden=!0)},IImageElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block"),void(this.firstFrame&&(this.firstFrame=!1)))},IImageElement.prototype.destroy=function(){this._parent.destroy.call(),this.innerElem=null},createElement(SVGBaseElement,IShapeElement),IShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},IShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},IShapeElement.prototype.buildExpressionInterface=function(){},IShapeElement.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),(!this.data.hd||this.data.td)&&styleUnselectableDiv(this.layerElement)},IShapeElement.prototype.setGradientData=function(t,e,s){var r,i="gr_"+randomString(10);r=1===e.t?document.createElementNS(svgNS,"linearGradient"):document.createElementNS(svgNS,"radialGradient"),r.setAttribute("id",i),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse");var a,n,o,h=[];for(o=4*e.g.p,n=0;o>n;n+=4)a=document.createElementNS(svgNS,"stop"),r.appendChild(a),h.push(a);t.setAttribute("gf"===e.ty?"fill":"stroke","url(#"+i+")"),this.globalData.defs.appendChild(r),s.gf=r,s.cst=h},IShapeElement.prototype.setGradientOpacity=function(t,e,s){if(t.g.k.k[0].s&&t.g.k.k[0].s.length>4*t.g.p||t.g.k.k.length>4*t.g.p){var r,i,a,n,o=document.createElementNS(svgNS,"mask"),h=document.createElementNS(svgNS,"path");o.appendChild(h);var l="op_"+randomString(10),p="mk_"+randomString(10);o.setAttribute("id",p),r=1===t.t?document.createElementNS(svgNS,"linearGradient"):document.createElementNS(svgNS,"radialGradient"),r.setAttribute("id",l),r.setAttribute("spreadMethod","pad"),r.setAttribute("gradientUnits","userSpaceOnUse"),n=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var m=[];for(a=4*t.g.p;n>a;a+=2)i=document.createElementNS(svgNS,"stop"),i.setAttribute("stop-color","rgb(255,255,255)"),r.appendChild(i),m.push(i);return h.setAttribute("gf"===t.ty?"fill":"stroke","url(#"+l+")"),this.globalData.defs.appendChild(r),this.globalData.defs.appendChild(o),e.of=r,e.ost=m,s.msElem=h,p}},IShapeElement.prototype.searchShapes=function(t,e,s,r,i){var a,n,o,h,l,p=t.length-1,m=[],f=[];for(a=p;a>=0;a-=1)if("fl"==t[a].ty||"st"==t[a].ty||"gf"==t[a].ty||"gs"==t[a].ty){e[a]={},h={type:t[a].ty,d:"",ld:"",lvl:i,transformers:[],mdf:!1};var d=document.createElementNS(svgNS,"path");if(e[a].o=PropertyFactory.getProp(this,t[a].o,0,.01,r),("st"==t[a].ty||"gs"==t[a].ty)&&(d.setAttribute("stroke-linecap",this.lcEnum[t[a].lc]||"round"),d.setAttribute("stroke-linejoin",this.ljEnum[t[a].lj]||"round"),d.setAttribute("fill-opacity","0"),1==t[a].lj&&d.setAttribute("stroke-miterlimit",t[a].ml),e[a].w=PropertyFactory.getProp(this,t[a].w,0,null,r),t[a].d)){var c=PropertyFactory.getDashProp(this,t[a].d,"svg",r);c.k||(d.setAttribute("stroke-dasharray",c.dasharray),d.setAttribute("stroke-dashoffset",c.dashoffset)),e[a].d=c}if("fl"==t[a].ty||"st"==t[a].ty)e[a].c=PropertyFactory.getProp(this,t[a].c,1,255,r),s.appendChild(d);else{e[a].g=PropertyFactory.getGradientProp(this,t[a].g,r),2==t[a].t&&(e[a].h=PropertyFactory.getProp(this,t[a].h,1,.01,r),e[a].a=PropertyFactory.getProp(this,t[a].a,1,degToRads,r)),e[a].s=PropertyFactory.getProp(this,t[a].s,1,null,r),e[a].e=PropertyFactory.getProp(this,t[a].e,1,null,r),this.setGradientData(d,t[a],e[a],h);var u=this.setGradientOpacity(t[a],e[a],h);u&&d.setAttribute("mask","url(#"+u+")"),e[a].elem=d,s.appendChild(d)}t[a].ln&&d.setAttribute("id",t[a].ln),t[a].cl&&d.setAttribute("class",t[a].cl),h.pElem=d,this.stylesList.push(h),e[a].style=h,m.push(h)}else if("gr"==t[a].ty){e[a]={it:[]};var y=document.createElementNS(svgNS,"g");s.appendChild(y),e[a].gr=y,this.searchShapes(t[a].it,e[a].it,y,r,i+1)}else if("tr"==t[a].ty)for(e[a]={transform:{op:PropertyFactory.getProp(this,t[a].o,0,.01,r),mProps:PropertyFactory.getProp(this,t[a],2,null,r)},elements:[]},l=e[a].transform,o=this.stylesList.length,n=0;o>n;n+=1)this.stylesList[n].closed||this.stylesList[n].transformers.push(l);else if("sh"==t[a].ty||"rc"==t[a].ty||"el"==t[a].ty||"sr"==t[a].ty){e[a]={elements:[],caches:[],styles:[],lStr:""};var g=4;for("rc"==t[a].ty?g=5:"el"==t[a].ty?g=6:"sr"==t[a].ty&&(g=7),e[a].sh=ShapePropertyFactory.getShapeProp(this,t[a],g,r),e[a].lvl=i,this.shapes.push(e[a].sh),this.addShapeToModifiers(e[a].sh),o=this.stylesList.length,n=0;o>n;n+=1)this.stylesList[n].closed||e[a].elements.push({ty:this.stylesList[n].type,st:this.stylesList[n]})}else if("tm"==t[a].ty||"rd"==t[a].ty||"ms"==t[a].ty){var v=ShapeModifiers.getModifier(t[a].ty);v.init(this,t[a],r),this.shapeModifiers.push(v),f.push(v),e[a]=v}for(p=m.length,a=0;p>a;a+=1)m[a].closed=!0;for(p=f.length,a=0;p>a;a+=1)f[a].closed=!0},IShapeElement.prototype.addShapeToModifiers=function(t){var e,s=this.shapeModifiers.length;for(e=0;s>e;e+=1)this.shapeModifiers[e].addShape(t)},IShapeElement.prototype.renderModifiers=function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;e>t;t+=1)this.shapes[t].reset();for(e=this.shapeModifiers.length,t=e-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this.firstFrame)}},IShapeElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);return e===!1?void this.hide():(this.globalToLocal([0,0,0]),this.hidden=!1,this.renderModifiers(),void this.renderShape(null,null,!0,null))},IShapeElement.prototype.hide=function(){if(!this.hidden){var t,e=this.stylesList.length;for(t=e-1;t>=0;t-=1)"0"!==this.stylesList[t].ld&&(this.stylesList[t].ld="0",this.stylesList[t].pElem.style.display="none",this.stylesList[t].pElem.parentNode&&(this.stylesList[t].parent=this.stylesList[t].pElem.parentNode));this.hidden=!0}},IShapeElement.prototype.renderShape=function(t,e,s,r){var i,a;if(!t)for(t=this.shapesData,a=this.stylesList.length,i=0;a>i;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;e||(e=this.viewData),a=t.length-1;var n;for(i=a;i>=0;i-=1)n=t[i].ty,"tr"==n?((this.firstFrame||e[i].transform.op.mdf&&r)&&r.setAttribute("opacity",e[i].transform.op.v),(this.firstFrame||e[i].transform.mProps.mdf&&r)&&r.setAttribute("transform",e[i].transform.mProps.v.to2dCSS())):"sh"==n||"el"==n||"rc"==n||"sr"==n?this.renderPath(t[i],e[i]):"fl"==n?this.renderFill(t[i],e[i]):"gf"==n?this.renderGradient(t[i],e[i]):"gs"==n?(this.renderGradient(t[i],e[i]),this.renderStroke(t[i],e[i])):"st"==n?this.renderStroke(t[i],e[i]):"gr"==n&&this.renderShape(t[i].it,e[i].it,!1,e[i].gr);if(s){for(a=this.stylesList.length,i=0;a>i;i+=1)"0"===this.stylesList[i].ld&&(this.stylesList[i].ld="1",this.stylesList[i].pElem.style.display="block"),(this.stylesList[i].mdf||this.firstFrame)&&(this.stylesList[i].pElem.setAttribute("d",this.stylesList[i].d),this.stylesList[i].msElem&&this.stylesList[i].msElem.setAttribute("d",this.stylesList[i].d));this.firstFrame&&(this.firstFrame=!1)}},IShapeElement.prototype.renderPath=function(t,e){var s,r,i,a,n,o,h,l,p=e.elements.length,m=e.lvl;for(l=0;p>l;l+=1){o=e.sh.mdf||this.firstFrame,n="";var f=e.sh.paths;if(a=f.length,e.elements[l].st.lvl<m){var d,c,u=this.mHelper.reset(),y=e.elements[l].st.lvl;for(c=m-1;c>=y;c-=1)o=e.elements[l].st.transformers[c-y].mProps.mdf||o,d=e.elements[l].st.transformers[c-y].mProps.v.props,u.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]);if(o){for(i=0;a>i;i+=1)if(h=f[i],h&&h.v){for(s=h.v.length,r=1;s>r;r+=1)1==r&&(n+=" M"+u.applyToPointStringified(h.v[0][0],h.v[0][1])),n+=" C"+u.applyToPointStringified(h.o[r-1][0],h.o[r-1][1])+" "+u.applyToPointStringified(h.i[r][0],h.i[r][1])+" "+u.applyToPointStringified(h.v[r][0],h.v[r][1]);1==s&&(n+=" M"+u.applyToPointStringified(h.v[0][0],h.v[0][1])),h.c&&(n+=" C"+u.applyToPointStringified(h.o[r-1][0],h.o[r-1][1])+" "+u.applyToPointStringified(h.i[0][0],h.i[0][1])+" "+u.applyToPointStringified(h.v[0][0],h.v[0][1]),n+="z")}e.caches[l]=n}else n=e.caches[l]}else if(o){for(i=0;a>i;i+=1)if(h=f[i],h&&h.v){for(s=h.v.length,r=1;s>r;r+=1)1==r&&(n+=" M"+h.v[0].join(",")),n+=" C"+h.o[r-1].join(",")+" "+h.i[r].join(",")+" "+h.v[r].join(",");1==s&&(n+=" M"+h.v[0].join(",")),h.c&&(n+=" C"+h.o[r-1].join(",")+" "+h.i[0].join(",")+" "+h.v[0].join(","),n+="z")}e.caches[l]=n}else n=e.caches[l];e.elements[l].st.d+=n,e.elements[l].st.mdf=o||e.elements[l].st.mdf}},IShapeElement.prototype.renderFill=function(t,e){var s=e.style;(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("fill","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("fill-opacity",e.o.v)},IShapeElement.prototype.renderGradient=function(t,e){var s=e.gf,r=e.of,i=e.s.v,a=e.e.v;if(e.o.mdf||this.firstFrame){var n="gf"===t.ty?"fill-opacity":"stroke-opacity";e.elem.setAttribute(n,e.o.v)}if(e.s.mdf||this.firstFrame){var o=1===t.t?"x1":"cx",h="x1"===o?"y1":"cy";s.setAttribute(o,i[0]),s.setAttribute(h,i[1]),r&&(r.setAttribute(o,i[0]),r.setAttribute(h,i[1]))}var l,p,m,f;if(e.g.cmdf||this.firstFrame){l=e.cst;var d=e.g.c;for(m=l.length,p=0;m>p;p+=1)f=l[p],f.setAttribute("offset",d[4*p]+"%"),f.setAttribute("stop-color","rgb("+d[4*p+1]+","+d[4*p+2]+","+d[4*p+3]+")")}if(r&&(e.g.omdf||this.firstFrame)){l=e.ost;var c=e.g.o;for(m=l.length,p=0;m>p;p+=1)f=l[p],f.setAttribute("offset",c[2*p]+"%"),f.setAttribute("stop-opacity",c[2*p+1])}if(1===t.t)(e.e.mdf||this.firstFrame)&&(s.setAttribute("x2",a[0]),s.setAttribute("y2",a[1]),r&&(r.setAttribute("x2",a[0]),r.setAttribute("y2",a[1])));
    else{var u;if((e.s.mdf||e.e.mdf||this.firstFrame)&&(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)),s.setAttribute("r",u),r&&r.setAttribute("r",u)),e.e.mdf||e.h.mdf||e.a.mdf||this.firstFrame){u||(u=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)));var y=Math.atan2(a[1]-i[1],a[0]-i[0]),g=e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v,v=u*g,b=Math.cos(y+e.a.v)*v+i[0],E=Math.sin(y+e.a.v)*v+i[1];s.setAttribute("fx",b),s.setAttribute("fy",E),r&&(r.setAttribute("fx",b),r.setAttribute("fy",E))}}},IShapeElement.prototype.renderStroke=function(t,e){var s=e.style,r=e.d;r&&r.k&&(r.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-dasharray",r.dasharray),s.pElem.setAttribute("stroke-dashoffset",r.dashoffset)),e.c&&(e.c.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||this.firstFrame)&&s.pElem.setAttribute("stroke-opacity",e.o.v),(e.w.mdf||this.firstFrame)&&(s.pElem.setAttribute("stroke-width",e.w.v),s.msElem&&s.msElem.setAttribute("stroke-width",e.w.v))},IShapeElement.prototype.destroy=function(){this._parent.destroy.call(),this.shapeData=null,this.viewData=null,this.parentContainer=null,this.placeholder=null},createElement(SVGBaseElement,ISolidElement),ISolidElement.prototype.createElements=function(){this._parent.createElements.call(this);var t=document.createElementNS(svgNS,"rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.data.cl&&this.innerElem.setAttribute("class",this.data.cl)},ISolidElement.prototype.hide=IImageElement.prototype.hide,ISolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,ISolidElement.prototype.destroy=IImageElement.prototype.destroy,createElement(BaseElement,CVBaseElement),CVBaseElement.prototype.createElements=function(){this.checkParenting()},CVBaseElement.prototype.checkBlendMode=function(t){if(t.blendMode!==this.data.bm){t.blendMode=this.data.bm;var e="";switch(this.data.bm){case 0:e="normal";break;case 1:e="multiply";break;case 2:e="screen";break;case 3:e="overlay";break;case 4:e="darken";break;case 5:e="lighten";break;case 6:e="color-dodge";break;case 7:e="color-burn";break;case 8:e="hard-light";break;case 9:e="soft-light";break;case 10:e="difference";break;case 11:e="exclusion";break;case 12:e="hue";break;case 13:e="saturation";break;case 14:e="color";break;case 15:e="luminosity"}t.canvasContext.globalCompositeOperation=e}},CVBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.checkBlendMode(0===this.data.ty?this.parentGlobalData:this.globalData),!this.isVisible)return this.isVisible;this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v;var e,s=this.finalTransform.mat;if(this.hierarchy){var r,i=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)this.finalTransform.matMdf=this.hierarchy[r].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props);return t&&(e=t.mat.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15]),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.data.hasMask&&(this.globalData.renderer.save(!0),this.maskManager.renderFrame(0===this.data.ty?null:s)),this.data.hd&&(this.isVisible=!1),this.isVisible},CVBaseElement.prototype.addMasks=function(t){this.maskManager=new CVMaskElement(t,this,this.globalData)},CVBaseElement.prototype.destroy=function(){this.canvasContext=null,this.data=null,this.globalData=null,this.maskManager&&this.maskManager.destroy()},CVBaseElement.prototype.mHelper=new Matrix,createElement(CVBaseElement,CVCompElement),CVCompElement.prototype.ctxTransform=CanvasRenderer.prototype.ctxTransform,CVCompElement.prototype.ctxOpacity=CanvasRenderer.prototype.ctxOpacity,CVCompElement.prototype.save=CanvasRenderer.prototype.save,CVCompElement.prototype.restore=CanvasRenderer.prototype.restore,CVCompElement.prototype.reset=function(){this.contextData.cArrPos=0,this.contextData.cTr.reset(),this.contextData.cO=1},CVCompElement.prototype.resize=function(t){var e=Math.max(t.sx,t.sy);this.canvas.width=this.data.w*e,this.canvas.height=this.data.h*e,this.transformCanvas={sc:e,w:this.data.w*e,h:this.data.h*e,props:[e,0,0,0,0,e,0,0,0,0,1,0,0,0,0,1]};var s,r=this.elements.length;for(s=0;r>s;s+=1)this.elements[s]&&0===this.elements[s].data.ty&&this.elements[s].resize(t)},CVCompElement.prototype.prepareFrame=function(t){if(this.globalData.frameId=this.parentGlobalData.frameId,this.globalData.mdf=!1,this._parent.prepareFrame.call(this,t),this.isVisible!==!1||this.data.xt){var e=t;this.tm&&(e=this.tm.v,e===this.data.op&&(e=this.data.op-1)),this.renderedFrame=e/this.data.sr;var s,r=this.elements.length;for(this.completeLayers||this.checkLayers(t),s=0;r>s;s+=1)(this.completeLayers||this.elements[s])&&(this.elements[s].prepareFrame(e/this.data.sr-this.layers[s].st),0===this.elements[s].data.ty&&this.elements[s].globalData.mdf&&(this.globalData.mdf=!0));this.globalData.mdf&&!this.data.xt&&(this.canvasContext.clearRect(0,0,this.data.w,this.data.h),this.ctxTransform(this.transformCanvas.props))}},CVCompElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){if(this.globalData.mdf){var e,s=this.layers.length;for(e=s-1;e>=0;e-=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}this.data.hasMask&&this.globalData.renderer.restore(!0),this.firstFrame&&(this.firstFrame=!1),this.parentGlobalData.renderer.save(),this.parentGlobalData.renderer.ctxTransform(this.finalTransform.mat.props),this.parentGlobalData.renderer.ctxOpacity(this.finalTransform.opacity),this.parentGlobalData.renderer.canvasContext.drawImage(this.canvas,0,0,this.data.w,this.data.h),this.parentGlobalData.renderer.restore(),this.globalData.mdf&&this.reset()}},CVCompElement.prototype.setElements=function(t){this.elements=t},CVCompElement.prototype.getElements=function(){return this.elements},CVCompElement.prototype.destroy=function(){var t,e=this.layers.length;for(t=e-1;t>=0;t-=1)this.elements[t].destroy();this.layers=null,this.elements=null,this._parent.destroy.call()},CVCompElement.prototype.checkLayers=CanvasRenderer.prototype.checkLayers,CVCompElement.prototype.buildItem=CanvasRenderer.prototype.buildItem,CVCompElement.prototype.buildAllItems=CanvasRenderer.prototype.buildAllItems,CVCompElement.prototype.createItem=CanvasRenderer.prototype.createItem,CVCompElement.prototype.createImage=CanvasRenderer.prototype.createImage,CVCompElement.prototype.createComp=CanvasRenderer.prototype.createComp,CVCompElement.prototype.createSolid=CanvasRenderer.prototype.createSolid,CVCompElement.prototype.createShape=CanvasRenderer.prototype.createShape,CVCompElement.prototype.createText=CanvasRenderer.prototype.createText,CVCompElement.prototype.createBase=CanvasRenderer.prototype.createBase,CVCompElement.prototype.buildElementParenting=CanvasRenderer.prototype.buildElementParenting,createElement(CVBaseElement,CVImageElement),CVImageElement.prototype.createElements=function(){var t=function(){if(this.globalData.elementLoaded(),this.assetData.w!==this.img.width||this.assetData.h!==this.img.height){var t=document.createElement("canvas");t.width=this.assetData.w,t.height=this.assetData.h;var e,s,r=t.getContext("2d"),i=this.img.width,a=this.img.height,n=i/a,o=this.assetData.w/this.assetData.h;n>o?(s=a,e=s*o):(e=i,s=e/o),r.drawImage(this.img,(i-e)/2,(a-s)/2,e,s,0,0,this.assetData.w,this.assetData.h),this.img=t}}.bind(this),e=function(){this.failed=!0,this.globalData.elementLoaded()}.bind(this);this.img=new Image,this.img.addEventListener("load",t,!1),this.img.addEventListener("error",e,!1);var s=this.globalData.getAssetsPath(this.assetData);this.img.src=s,this._parent.createElements.call(this)},CVImageElement.prototype.renderFrame=function(t){if(!this.failed&&this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save();var s=this.finalTransform.mat.props;this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.drawImage(this.img,0,0),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},CVImageElement.prototype.destroy=function(){this.img=null,this._parent.destroy.call()},CVMaskElement.prototype.getMaskProperty=function(t){return this.viewData[t]},CVMaskElement.prototype.prepareFrame=function(t){var e,s=this.dynamicProperties.length;for(e=0;s>e;e+=1)this.dynamicProperties[e].getValue(t),this.dynamicProperties[e].mdf&&(this.element.globalData.mdf=!0)},CVMaskElement.prototype.renderFrame=function(t){var e,s,r,i,a,n=this.element.canvasContext,o=this.data.masksProperties.length,h=!1;for(e=0;o>e;e++)if("n"!==this.masksProperties[e].mode){h===!1&&(n.beginPath(),h=!0),this.masksProperties[e].inv&&(n.moveTo(0,0),n.lineTo(this.element.globalData.compWidth,0),n.lineTo(this.element.globalData.compWidth,this.element.globalData.compHeight),n.lineTo(0,this.element.globalData.compHeight),n.lineTo(0,0)),a=this.viewData[e].v,s=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.moveTo(s[0],s[1]);var l,p=a.v.length;for(l=1;p>l;l++)s=t?t.applyToPointArray(a.o[l-1][0],a.o[l-1][1],0):a.o[l-1],r=t?t.applyToPointArray(a.i[l][0],a.i[l][1],0):a.i[l],i=t?t.applyToPointArray(a.v[l][0],a.v[l][1],0):a.v[l],n.bezierCurveTo(s[0],s[1],r[0],r[1],i[0],i[1]);s=t?t.applyToPointArray(a.o[l-1][0],a.o[l-1][1],0):a.o[l-1],r=t?t.applyToPointArray(a.i[0][0],a.i[0][1],0):a.i[0],i=t?t.applyToPointArray(a.v[0][0],a.v[0][1],0):a.v[0],n.bezierCurveTo(s[0],s[1],r[0],r[1],i[0],i[1])}h&&n.clip()},CVMaskElement.prototype.getMask=function(t){for(var e=0,s=this.masksProperties.length;s>e;){if(this.masksProperties[e].nm===t)return{maskPath:this.viewData[e].pv};e+=1}},CVMaskElement.prototype.destroy=function(){this.element=null},createElement(CVBaseElement,CVShapeElement),CVShapeElement.prototype.lcEnum={1:"butt",2:"round",3:"butt"},CVShapeElement.prototype.ljEnum={1:"miter",2:"round",3:"butt"},CVShapeElement.prototype.transformHelper={opacity:1,mat:new Matrix,matMdf:!1,opMdf:!1},CVShapeElement.prototype.dashResetter=[],CVShapeElement.prototype.createElements=function(){this._parent.createElements.call(this),this.searchShapes(this.shapesData,this.viewData,this.dynamicProperties)},CVShapeElement.prototype.searchShapes=function(t,e,s){var r,i,a,n,o=t.length-1,h=[],l=[];for(r=o;r>=0;r-=1)if("fl"==t[r].ty||"st"==t[r].ty){if(n={type:t[r].ty,elements:[]},e[r]={},("fl"==t[r].ty||"st"==t[r].ty)&&(e[r].c=PropertyFactory.getProp(this,t[r].c,1,255,s),e[r].c.k||(n.co="rgb("+bm_floor(e[r].c.v[0])+","+bm_floor(e[r].c.v[1])+","+bm_floor(e[r].c.v[2])+")")),e[r].o=PropertyFactory.getProp(this,t[r].o,0,.01,s),"st"==t[r].ty&&(n.lc=this.lcEnum[t[r].lc]||"round",n.lj=this.ljEnum[t[r].lj]||"round",1==t[r].lj&&(n.ml=t[r].ml),e[r].w=PropertyFactory.getProp(this,t[r].w,0,null,s),e[r].w.k||(n.wi=e[r].w.v),t[r].d)){var p=PropertyFactory.getDashProp(this,t[r].d,"canvas",s);e[r].d=p,e[r].d.k||(n.da=e[r].d.dasharray,n["do"]=e[r].d.dashoffset)}this.stylesList.push(n),e[r].style=n,h.push(e[r].style)}else if("gr"==t[r].ty)e[r]={it:[]},this.searchShapes(t[r].it,e[r].it,s);else if("tr"==t[r].ty)e[r]={transform:{mat:new Matrix,opacity:1,matMdf:!1,opMdf:!1,op:PropertyFactory.getProp(this,t[r].o,0,.01,s),mProps:PropertyFactory.getProp(this,t[r],2,null,s)},elements:[]};else if("sh"==t[r].ty||"rc"==t[r].ty||"el"==t[r].ty||"sr"==t[r].ty){e[r]={nodes:[],trNodes:[],tr:[0,0,0,0,0,0]};var m=4;"rc"==t[r].ty?m=5:"el"==t[r].ty?m=6:"sr"==t[r].ty&&(m=7),e[r].sh=ShapePropertyFactory.getShapeProp(this,t[r],m,s),this.shapes.push(e[r].sh),this.addShapeToModifiers(e[r].sh),a=this.stylesList.length;var f=!1,d=!1;for(i=0;a>i;i+=1)this.stylesList[i].closed||(this.stylesList[i].elements.push(e[r]),"st"===this.stylesList[i].type?f=!0:d=!0);e[r].st=f,e[r].fl=d}else if("tm"==t[r].ty||"rd"==t[r].ty){var c=ShapeModifiers.getModifier(t[r].ty);c.init(this,t[r],s),this.shapeModifiers.push(c),l.push(c),e[r]=c}for(o=h.length,r=0;o>r;r+=1)h[r].closed=!0;for(o=l.length,r=0;o>r;r+=1)l[r].closed=!0},CVShapeElement.prototype.addShapeToModifiers=IShapeElement.prototype.addShapeToModifiers,CVShapeElement.prototype.renderModifiers=IShapeElement.prototype.renderModifiers,CVShapeElement.prototype.renderFrame=function(t){this._parent.renderFrame.call(this,t)!==!1&&(this.transformHelper.mat.reset(),this.transformHelper.opacity=this.finalTransform.opacity,this.transformHelper.matMdf=!1,this.transformHelper.opMdf=this.finalTransform.opMdf,this.renderModifiers(),this.renderShape(this.transformHelper,null,null,!0),this.data.hasMask&&this.globalData.renderer.restore(!0))},CVShapeElement.prototype.renderShape=function(t,e,s,r){var i,a;if(!e)for(e=this.shapesData,a=this.stylesList.length,i=0;a>i;i+=1)this.stylesList[i].d="",this.stylesList[i].mdf=!1;s||(s=this.viewData),a=e.length-1;var n,o;for(n=t,i=a;i>=0;i-=1)if("tr"==e[i].ty){n=s[i].transform;var h=s[i].transform.mProps.v.props;if(n.matMdf=n.mProps.mdf,n.opMdf=n.op.mdf,o=n.mat,o.cloneFromProps(h),t){var l=t.mat.props;n.opacity=t.opacity,n.opacity*=s[i].transform.op.v,n.matMdf=t.matMdf?!0:n.matMdf,n.opMdf=t.opMdf?!0:n.opMdf,o.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],l[12],l[13],l[14],l[15])}else n.opacity=n.op.o}else"sh"==e[i].ty||"el"==e[i].ty||"rc"==e[i].ty||"sr"==e[i].ty?this.renderPath(e[i],s[i],n):"fl"==e[i].ty?this.renderFill(e[i],s[i],n):"st"==e[i].ty?this.renderStroke(e[i],s[i],n):"gr"==e[i].ty?this.renderShape(n,e[i].it,s[i].it):"tm"==e[i].ty;if(r){a=this.stylesList.length;var p,m,f,d,c,u,y,g=this.globalData.renderer,v=this.globalData.canvasContext;for(g.save(),g.ctxTransform(this.finalTransform.mat.props),i=0;a>i;i+=1)if(y=this.stylesList[i].type,"st"!==y||0!==this.stylesList[i].wi){for(g.save(),c=this.stylesList[i].elements,"st"===y?(v.strokeStyle=this.stylesList[i].co,v.lineWidth=this.stylesList[i].wi,v.lineCap=this.stylesList[i].lc,v.lineJoin=this.stylesList[i].lj,v.miterLimit=this.stylesList[i].ml||0):v.fillStyle=this.stylesList[i].co,g.ctxOpacity(this.stylesList[i].coOp),"st"!==y&&v.beginPath(),m=c.length,p=0;m>p;p+=1){for("st"===y&&(v.beginPath(),this.stylesList[i].da?(v.setLineDash(this.stylesList[i].da),v.lineDashOffset=this.stylesList[i]["do"],this.globalData.isDashed=!0):this.globalData.isDashed&&(v.setLineDash(this.dashResetter),this.globalData.isDashed=!1)),u=c[p].trNodes,d=u.length,f=0;d>f;f+=1)"m"==u[f].t?v.moveTo(u[f].p[0],u[f].p[1]):"c"==u[f].t?v.bezierCurveTo(u[f].p1[0],u[f].p1[1],u[f].p2[0],u[f].p2[1],u[f].p3[0],u[f].p3[1]):v.closePath();"st"===y&&v.stroke()}"st"!==y&&v.fill(),g.restore()}g.restore(),this.firstFrame&&(this.firstFrame=!1)}},CVShapeElement.prototype.renderPath=function(t,e,s){var r,i,a,n,o=s.matMdf||e.sh.mdf||this.firstFrame;if(o){var h=e.sh.paths;n=h.length;var l=e.trNodes;for(l.length=0,a=0;n>a;a+=1){var p=h[a];if(p&&p.v){for(r=p.v.length,i=1;r>i;i+=1)1==i&&l.push({t:"m",p:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),l.push({t:"c",p1:s.mat.applyToPointArray(p.o[i-1][0],p.o[i-1][1],0),p2:s.mat.applyToPointArray(p.i[i][0],p.i[i][1],0),p3:s.mat.applyToPointArray(p.v[i][0],p.v[i][1],0)});1==r&&l.push({t:"m",p:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),p.c&&(l.push({t:"c",p1:s.mat.applyToPointArray(p.o[i-1][0],p.o[i-1][1],0),p2:s.mat.applyToPointArray(p.i[0][0],p.i[0][1],0),p3:s.mat.applyToPointArray(p.v[0][0],p.v[0][1],0)}),l.push({t:"z"})),e.lStr=l}}if(e.st)for(i=0;16>i;i+=1)e.tr[i]=s.mat.props[i];e.trNodes=l}},CVShapeElement.prototype.renderFill=function(t,e,s){var r=e.style;(e.c.mdf||this.firstFrame)&&(r.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(r.coOp=e.o.v*s.opacity)},CVShapeElement.prototype.renderStroke=function(t,e,s){var r=e.style,i=e.d;i&&(i.mdf||this.firstFrame)&&(r.da=i.dasharray,r["do"]=i.dashoffset),(e.c.mdf||this.firstFrame)&&(r.co="rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o.mdf||s.opMdf||this.firstFrame)&&(r.coOp=e.o.v*s.opacity),(e.w.mdf||this.firstFrame)&&(r.wi=e.w.v)},CVShapeElement.prototype.destroy=function(){this.shapesData=null,this.globalData=null,this.canvasContext=null,this.stylesList.length=0,this.viewData.length=0,this._parent.destroy.call()},createElement(CVBaseElement,CVSolidElement),CVSolidElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(this.finalTransform.mat.props),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.fillStyle=this.data.sc,e.fillRect(0,0,this.data.sw,this.data.sh),this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(CVBaseElement,CVTextElement),CVTextElement.prototype.init=ITextElement.prototype.init,CVTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,CVTextElement.prototype.getMult=ITextElement.prototype.getMult,CVTextElement.prototype.tHelper=document.createElement("canvas").getContext("2d"),CVTextElement.prototype.createElements=function(){this._parent.createElements.call(this);var t=this.data.t.d,e=!1;t.fc?(e=!0,this.values.fill="rgb("+Math.round(255*t.fc[0])+","+Math.round(255*t.fc[1])+","+Math.round(255*t.fc[2])+")"):this.values.fill="rgba(0,0,0,0)",this.fill=e;var s=!1;t.sc&&(s=!0,this.values.stroke="rgb("+Math.round(255*t.sc[0])+","+Math.round(255*t.sc[1])+","+Math.round(255*t.sc[2])+")",this.values.sWidth=t.sw);var r,i,a=this.globalData.fontManager.getFontByName(t.f),n=t.l,o=this.mHelper;this.stroke=s,this.values.fValue=t.s+"px "+this.globalData.fontManager.getFontByName(t.f).fFamily,i=t.t.length,this.tHelper.font=this.values.fValue;var h,l,p,m,f,d,c,u,y,g,v=this.data.singleShape;if(v)var b=0,E=0,P=t.lineWidths,k=t.boxWidth,S=!0;for(r=0;i>r;r+=1){h=this.globalData.fontManager.getCharData(t.t.charAt(r),a.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);var l;if(l=h?h.data:null,o.reset(),v&&n[r].n&&(b=0,E+=t.yOffset,E+=S?1:0,S=!1),l&&l.shapes){if(f=l.shapes[0].it,c=f.length,o.scale(t.s/100,t.s/100),v){switch(t.ps&&o.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:o.translate(t.justifyOffset+(k-P[n[r].line]),0,0);break;case 2:o.translate(t.justifyOffset+(k-P[n[r].line])/2,0,0)}o.translate(b,E,0)}for(y=new Array(c),d=0;c>d;d+=1){for(m=f[d].ks.k.i.length,u=f[d].ks.k,g=[],p=1;m>p;p+=1)1==p&&g.push(o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),g.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[p][0],u.i[p][1],0),o.applyToY(u.i[p][0],u.i[p][1],0),o.applyToX(u.v[p][0],u.v[p][1],0),o.applyToY(u.v[p][0],u.v[p][1],0));g.push(o.applyToX(u.o[p-1][0],u.o[p-1][1],0),o.applyToY(u.o[p-1][0],u.o[p-1][1],0),o.applyToX(u.i[0][0],u.i[0][1],0),o.applyToY(u.i[0][0],u.i[0][1],0),o.applyToX(u.v[0][0],u.v[0][1],0),o.applyToY(u.v[0][0],u.v[0][1],0)),y[d]=g}}else y=[];v&&(b+=n[r].l),this.textSpans.push({elem:y})}},CVTextElement.prototype.renderFrame=function(t){if(this._parent.renderFrame.call(this,t)!==!1){var e=this.canvasContext,s=this.finalTransform.mat.props;this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(s),this.globalData.renderer.ctxOpacity(this.finalTransform.opacity),e.font=this.values.fValue,e.lineCap="butt",e.lineJoin="miter",e.miterLimit=4,this.data.singleShape||this.getMeasures();var r,i,a,n,o,h,l=this.renderedLetters,p=this.data.t.d.l;i=p.length;var m,f,d,c=null,u=null,y=null;for(r=0;i>r;r+=1)if(!p[r].n){if(m=l[r],m&&(this.globalData.renderer.save(),this.globalData.renderer.ctxTransform(m.props),this.globalData.renderer.ctxOpacity(m.o)),this.fill){for(m&&m.fc?c!==m.fc&&(c=m.fc,e.fillStyle=m.fc):c!==this.values.fill&&(c=this.values.fill,e.fillStyle=this.values.fill),f=this.textSpans[r].elem,n=f.length,this.globalData.canvasContext.beginPath(),a=0;n>a;a+=1)for(d=f[a],h=d.length,this.globalData.canvasContext.moveTo(d[0],d[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(d[o],d[o+1],d[o+2],d[o+3],d[o+4],d[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.fill()}if(this.stroke){for(m&&m.sw?y!==m.sw&&(y=m.sw,e.lineWidth=m.sw):y!==this.values.sWidth&&(y=this.values.sWidth,e.lineWidth=this.values.sWidth),m&&m.sc?u!==m.sc&&(u=m.sc,e.strokeStyle=m.sc):u!==this.values.stroke&&(u=this.values.stroke,e.strokeStyle=this.values.stroke),f=this.textSpans[r].elem,n=f.length,this.globalData.canvasContext.beginPath(),a=0;n>a;a+=1)for(d=f[a],h=d.length,this.globalData.canvasContext.moveTo(d[0],d[1]),o=2;h>o;o+=6)this.globalData.canvasContext.bezierCurveTo(d[o],d[o+1],d[o+2],d[o+3],d[o+4],d[o+5]);this.globalData.canvasContext.closePath(),this.globalData.canvasContext.stroke()}m&&this.globalData.renderer.restore()}this.globalData.renderer.restore(this.data.hasMask),this.firstFrame&&(this.firstFrame=!1)}},createElement(BaseElement,HBaseElement),HBaseElement.prototype.checkBlendMode=function(){},HBaseElement.prototype.setBlendMode=BaseElement.prototype.setBlendMode,HBaseElement.prototype.getBaseElement=function(){return this.baseElement},HBaseElement.prototype.createElements=function(){this.data.hasMask?(this.layerElement=document.createElementNS(svgNS,"svg"),this.baseElement=this.layerElement,this.maskedElement=this.layerElement):this.layerElement=this.parentContainer,!this.data.ln||4!==this.data.ty&&0!==this.data.ty||(this.layerElement===this.parentContainer&&(this.layerElement=document.createElementNS(svgNS,"g"),this.baseElement=this.layerElement),this.layerElement.setAttribute("id",this.data.ln)),this.setBlendMode(),this.layerElement!==this.parentContainer&&(this.placeholder=null),this.checkParenting()},HBaseElement.prototype.renderFrame=function(t){if(3===this.data.ty)return!1;if(this.currentFrameNum===this.lastNum||!this.isVisible)return this.isVisible;this.lastNum=this.currentFrameNum,this.data.hasMask&&this.maskManager.renderFrame(),this.finalTransform.opMdf=this.finalTransform.op.mdf,this.finalTransform.matMdf=this.finalTransform.mProp.mdf,this.finalTransform.opacity=this.finalTransform.op.v,this.firstFrame&&(this.finalTransform.opMdf=!0,this.finalTransform.matMdf=!0);var e,s=this.finalTransform.mat;if(this.hierarchy){var r,i=this.hierarchy.length;for(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e),r=0;i>r;r+=1)this.finalTransform.matMdf=this.hierarchy[r].finalTransform.mProp.mdf?!0:this.finalTransform.matMdf,e=this.hierarchy[r].finalTransform.mProp.v.props,s.transform(e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}else this.isVisible&&this.finalTransform.matMdf&&(t?(e=this.finalTransform.mProp.v.props,s.cloneFromProps(e)):s.cloneFromProps(this.finalTransform.mProp.v.props));return t&&(e=t.mat.props,s.cloneFromProps(e),this.finalTransform.opacity*=t.opacity,this.finalTransform.opMdf=t.opMdf?!0:this.finalTransform.opMdf,this.finalTransform.matMdf=t.matMdf?!0:this.finalTransform.matMdf),this.finalTransform.matMdf&&(this.layerElement.style.transform=this.layerElement.style.webkitTransform=s.toCSS(),this.finalMat=s),this.finalTransform.opMdf&&(this.layerElement.style.opacity=this.finalTransform.opacity),this.isVisible},HBaseElement.prototype.destroy=function(){this.layerElement=null,this.parentContainer=null,this.matteElement&&(this.matteElement=null),this.maskManager&&(this.maskManager.destroy(),this.maskManager=null)},HBaseElement.prototype.getDomElement=function(){return this.layerElement},HBaseElement.prototype.addMasks=function(t){this.maskManager=new MaskElement(t,this,this.globalData)},HBaseElement.prototype.hide=function(){},HBaseElement.prototype.setMatte=function(){},HBaseElement.prototype.buildElementParenting=HybridRenderer.prototype.buildElementParenting,createElement(HBaseElement,HSolidElement),HSolidElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg");e.setAttribute("width",this.data.sw),e.setAttribute("height",this.data.sh),t.appendChild(e),this.layerElement=t,this.baseElement=t,this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),0!==this.data.bm&&this.setBlendMode();var s=document.createElementNS(svgNS,"rect");s.setAttribute("width",this.data.sw),s.setAttribute("height",this.data.sh),s.setAttribute("fill",this.data.sc),e.appendChild(s),this.data.hasMask&&(this.maskedElement=s),this.checkParenting()},HSolidElement.prototype.hide=IImageElement.prototype.hide,HSolidElement.prototype.renderFrame=IImageElement.prototype.renderFrame,HSolidElement.prototype.destroy=IImageElement.prototype.destroy,createElement(HBaseElement,HCompElement),HCompElement.prototype.createElements=function(){var t=document.createElement("div");if(styleDiv(t),this.data.ln&&t.setAttribute("id",this.data.ln),t.style.clip="rect(0px, "+this.data.w+"px, "+this.data.h+"px, 0px)",this.data.hasMask){var e=document.createElementNS(svgNS,"svg");e.setAttribute("width",this.data.w),e.setAttribute("height",this.data.h);var s=document.createElementNS(svgNS,"g");e.appendChild(s),t.appendChild(e),this.maskedElement=s,this.baseElement=t,this.layerElement=s}else this.layerElement=t,this.baseElement=this.layerElement;this.checkParenting()},HCompElement.prototype.hide=ICompElement.prototype.hide,HCompElement.prototype.prepareFrame=ICompElement.prototype.prepareFrame,HCompElement.prototype.setElements=ICompElement.prototype.setElements,HCompElement.prototype.getElements=ICompElement.prototype.getElements,HCompElement.prototype.destroy=ICompElement.prototype.destroy,HCompElement.prototype.renderFrame=function(t){var e,s=this._parent.renderFrame.call(this,t),r=this.layers.length;if(s===!1)return void this.hide();for(this.hidden=!1,e=0;r>e;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame();this.firstFrame&&(this.firstFrame=!1)},HCompElement.prototype.checkLayers=BaseRenderer.prototype.checkLayers,HCompElement.prototype.buildItem=HybridRenderer.prototype.buildItem,HCompElement.prototype.buildAllItems=BaseRenderer.prototype.buildAllItems,HCompElement.prototype.createItem=HybridRenderer.prototype.createItem,HCompElement.prototype.buildElementParenting=HybridRenderer.prototype.buildElementParenting,HCompElement.prototype.createImage=HybridRenderer.prototype.createImage,HCompElement.prototype.createComp=HybridRenderer.prototype.createComp,HCompElement.prototype.createSolid=HybridRenderer.prototype.createSolid,HCompElement.prototype.createShape=HybridRenderer.prototype.createShape,HCompElement.prototype.createText=HybridRenderer.prototype.createText,HCompElement.prototype.createBase=HybridRenderer.prototype.createBase,HCompElement.prototype.appendElementInPos=HybridRenderer.prototype.appendElementInPos,createElement(HBaseElement,HShapeElement);var parent=HShapeElement.prototype._parent;extendPrototype(IShapeElement,HShapeElement),HShapeElement.prototype._parent=parent,HShapeElement.prototype.createElements=function(){var t=document.createElement("div");styleDiv(t);var e=document.createElementNS(svgNS,"svg"),s=this.comp.data?this.comp.data:this.globalData.compSize;if(e.setAttribute("width",s.w),e.setAttribute("height",s.h),this.data.hasMask){var r=document.createElementNS(svgNS,"g");t.appendChild(e),e.appendChild(r),this.maskedElement=r,this.layerElement=r,this.shapesContainer=r}else t.appendChild(e),this.layerElement=e,this.shapesContainer=document.createElementNS(svgNS,"g"),this.layerElement.appendChild(this.shapesContainer);this.data.hd||(this.baseElement=t),this.innerElem=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.searchShapes(this.shapesData,this.viewData,this.layerElement,this.dynamicProperties,0),this.buildExpressionInterface(),this.layerElement=t,this.shapeCont=e,0!==this.data.bm&&this.setBlendMode(),this.checkParenting()},HShapeElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden=!1,this.renderModifiers(),this.addedTransforms.mdf=this.finalTransform.matMdf,this.addedTransforms.mats.length=1,this.addedTransforms.mats[0]=this.finalTransform.mat,this.renderShape(null,null,!0,null),this.isVisible&&(this.elemMdf||this.firstFrame)){var s=this.shapeCont.getBBox();this.currentBBox.w!==s.width&&(this.currentBBox.w=s.width,this.shapeCont.setAttribute("width",s.width)),this.currentBBox.h!==s.height&&(this.currentBBox.h=s.height,this.shapeCont.setAttribute("height",s.height)),(this.currentBBox.w!==s.width||this.currentBBox.h!==s.height||this.currentBBox.x!==s.x||this.currentBBox.y!==s.y)&&(this.currentBBox.w=s.width,this.currentBBox.h=s.height,this.currentBBox.x=s.x,this.currentBBox.y=s.y,this.shapeCont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.shapeCont.style.transform=this.shapeCont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}},createElement(HBaseElement,HTextElement),HTextElement.prototype.init=ITextElement.prototype.init,HTextElement.prototype.getMeasures=ITextElement.prototype.getMeasures,HTextElement.prototype.createPathShape=ITextElement.prototype.createPathShape,HTextElement.prototype.createElements=function(){this.isMasked=this.checkMasks();var t=this.data.t.d,e=document.createElement("div");if(styleDiv(e),this.layerElement=e,this.isMasked){this.renderType="svg";var s=document.createElementNS(svgNS,"svg");this.cont=s,this.compW=this.comp.data?this.comp.data.w:this.globalData.compSize.w,this.compH=this.comp.data?this.comp.data.h:this.globalData.compSize.h,s.setAttribute("width",this.compW),s.setAttribute("height",this.compH);var r=document.createElementNS(svgNS,"g");s.appendChild(r),e.appendChild(s),this.maskedElement=r,this.innerElem=r}else this.renderType="html",this.innerElem=e;this.baseElement=e,this.innerElem.style.color=this.innerElem.style.fill=t.fc?"rgb("+Math.round(255*t.fc[0])+","+Math.round(255*t.fc[1])+","+Math.round(255*t.fc[2])+")":"rgba(0,0,0,0)",t.sc&&(this.innerElem.style.stroke="rgb("+Math.round(255*t.sc[0])+","+Math.round(255*t.sc[1])+","+Math.round(255*t.sc[2])+")",this.innerElem.style.strokeWidth=t.sw+"px");var i=this.globalData.fontManager.getFontByName(t.f);if(!this.globalData.fontManager.chars)if(this.innerElem.style.fontSize=t.s+"px",this.innerElem.style.lineHeight=t.s+"px",i.fClass)this.innerElem.className=i.fClass;else{this.innerElem.style.fontFamily=i.fFamily;var a=t.fWeight,n=t.fStyle;this.innerElem.style.fontStyle=n,this.innerElem.style.fontWeight=a}var o,h,l=t.l;h=l.length;var p,m,f,d,c=this.mHelper,u="";for(o=0;h>o;o+=1){if(this.globalData.fontManager.chars?(p=document.createElementNS(svgNS,"path"),this.isMasked||(m=document.createElement("div"),f=document.createElementNS(svgNS,"svg"),f.appendChild(p),styleDiv(m)),p.setAttribute("stroke-linecap","butt"),p.setAttribute("stroke-linejoin","round"),p.setAttribute("stroke-miterlimit","4")):this.isMasked?p=document.createElementNS(svgNS,"text"):(m=document.createElement("span"),styleDiv(m),p=document.createElement("span"),styleDiv(p),m.appendChild(p)),this.globalData.fontManager.chars){var y,g=this.globalData.fontManager.getCharData(t.t.charAt(o),i.fStyle,this.globalData.fontManager.getFontByName(t.f).fFamily);if(y=g?g.data:null,c.reset(),y&&y.shapes&&(d=y.shapes[0].it,c.scale(t.s/100,t.s/100),u=this.createPathShape(c,d),p.setAttribute("d",u)),this.isMasked)this.innerElem.appendChild(p);else if(this.innerElem.appendChild(m),
            y&&y.shapes){document.body.appendChild(f);var v=f.getBBox();f.setAttribute("width",v.width),f.setAttribute("height",v.height),f.setAttribute("viewBox",v.x+" "+v.y+" "+v.width+" "+v.height),f.style.transform=f.style.webkitTransform="translate("+v.x+"px,"+v.y+"px)",l[o].yOffset=v.y,m.appendChild(f)}else f.setAttribute("width",1),f.setAttribute("height",1)}else p.textContent=l[o].val,p.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),this.isMasked?this.innerElem.appendChild(p):(this.innerElem.appendChild(m),p.style.transform=p.style.webkitTransform="translate3d(0,"+-t.s/1.2+"px,0)");this.textSpans.push(this.isMasked?p:m),this.textPaths.push(p)}},HTextElement.prototype.hide=SVGTextElement.prototype.hide,HTextElement.prototype.renderFrame=function(t){var e=this._parent.renderFrame.call(this,t);if(e===!1)return void this.hide();if(this.hidden&&(this.hidden=!1,this.innerElem.style.display="block"),this.data.singleShape){if(!this.firstFrame)return;this.isMasked&&this.finalTransform.matMdf&&(this.cont.setAttribute("viewBox",-this.finalTransform.mProp.p.v[0]+" "+-this.finalTransform.mProp.p.v[1]+" "+this.compW+" "+this.compH),this.cont.style.transform=this.cont.style.webkitTransform="translate("+-this.finalTransform.mProp.p.v[0]+"px,"+-this.finalTransform.mProp.p.v[1]+"px)")}if(this.getMeasures(),this.lettersChangedFlag){var s,r,i=this.renderedLetters,a=this.data.t.d.l;r=a.length;var n;for(s=0;r>s;s+=1)a[s].n||(n=i[s],this.isMasked?this.textSpans[s].setAttribute("transform",n.m):this.textSpans[s].style.transform=this.textSpans[s].style.webkitTransform=n.m,this.textSpans[s].style.opacity=n.o,n.sw&&this.textPaths[s].setAttribute("stroke-width",n.sw),n.sc&&this.textPaths[s].setAttribute("stroke",n.sc),n.fc&&(this.textPaths[s].setAttribute("fill",n.fc),this.textPaths[s].style.color=n.fc));if(this.isVisible&&(this.elemMdf||this.firstFrame)&&this.innerElem.getBBox){var o=this.innerElem.getBBox();this.currentBBox.w!==o.width&&(this.currentBBox.w=o.width,this.cont.setAttribute("width",o.width)),this.currentBBox.h!==o.height&&(this.currentBBox.h=o.height,this.cont.setAttribute("height",o.height)),(this.currentBBox.w!==o.width||this.currentBBox.h!==o.height||this.currentBBox.x!==o.x||this.currentBBox.y!==o.y)&&(this.currentBBox.w=o.width,this.currentBBox.h=o.height,this.currentBBox.x=o.x,this.currentBBox.y=o.y,this.cont.setAttribute("viewBox",this.currentBBox.x+" "+this.currentBBox.y+" "+this.currentBBox.w+" "+this.currentBBox.h),this.cont.style.transform=this.cont.style.webkitTransform="translate("+this.currentBBox.x+"px,"+this.currentBBox.y+"px)")}this.firstFrame&&(this.firstFrame=!1)}},HTextElement.prototype.destroy=SVGTextElement.prototype.destroy,createElement(HBaseElement,HImageElement),HImageElement.prototype.createElements=function(){var t=this.globalData.getAssetsPath(this.assetData),e=new Image;if(this.data.hasMask){var s=document.createElement("div");styleDiv(s);var r=document.createElementNS(svgNS,"svg");r.setAttribute("width",this.assetData.w),r.setAttribute("height",this.assetData.h),s.appendChild(r),this.imageElem=document.createElementNS(svgNS,"image"),this.imageElem.setAttribute("width",this.assetData.w+"px"),this.imageElem.setAttribute("height",this.assetData.h+"px"),this.imageElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),r.appendChild(this.imageElem),this.layerElement=s,this.baseElement=s,this.innerElem=s,this.maskedElement=this.imageElem}else styleDiv(e),this.layerElement=e,this.baseElement=e,this.innerElem=e;e.src=t,this.data.ln&&this.innerElem.setAttribute("id",this.data.ln),this.checkParenting()},HImageElement.prototype.hide=HSolidElement.prototype.hide,HImageElement.prototype.renderFrame=HSolidElement.prototype.renderFrame,HImageElement.prototype.destroy=HSolidElement.prototype.destroy,createElement(HBaseElement,HCameraElement),HCameraElement.prototype.setup=function(){var t,e,s=this.comp.threeDElements.length;for(t=0;s>t;t+=1)e=this.comp.threeDElements[t],e.perspectiveElem.style.perspective=e.perspectiveElem.style.webkitPerspective=this.pe.v+"px",e.container.style.transformOrigin=e.container.style.mozTransformOrigin=e.container.style.webkitTransformOrigin="0px 0px 0px",e.perspectiveElem.style.transform=e.perspectiveElem.style.webkitTransform="matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)"},HCameraElement.prototype.createElements=function(){},HCameraElement.prototype.hide=function(){},HCameraElement.prototype.renderFrame=function(){var t,e,s=this.firstFrame;if(this.hierarchy)for(e=this.hierarchy.length,t=0;e>t;t+=1)s=this.hierarchy[t].finalTransform.mProp.mdf?!0:s;if(s||this.p&&this.p.mdf||this.px&&(this.px.mdf||this.py.mdf||this.pz.mdf)||this.rx.mdf||this.ry.mdf||this.rz.mdf||this.or.mdf||this.a&&this.a.mdf){if(this.mat.reset(),this.p?this.mat.translate(-this.p.v[0],-this.p.v[1],this.p.v[2]):this.mat.translate(-this.px.v,-this.py.v,this.pz.v),this.a){var r=[this.p.v[0]-this.a.v[0],this.p.v[1]-this.a.v[1],this.p.v[2]-this.a.v[2]],i=Math.sqrt(Math.pow(r[0],2)+Math.pow(r[1],2)+Math.pow(r[2],2)),a=[r[0]/i,r[1]/i,r[2]/i],n=Math.sqrt(a[2]*a[2]+a[0]*a[0]),o=Math.atan2(a[1],n),h=Math.atan2(a[0],-a[2]);this.mat.rotateY(h).rotateX(-o)}if(this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v),this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]),this.mat.translate(this.globalData.compSize.w/2,this.globalData.compSize.h/2,0),this.mat.translate(0,0,this.pe.v),this.hierarchy){var l;for(e=this.hierarchy.length,t=0;e>t;t+=1)l=this.hierarchy[t].finalTransform.mProp.iv.props,this.mat.transform(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9],l[10],l[11],-l[12],-l[13],l[14],l[15])}e=this.comp.threeDElements.length;var p;for(t=0;e>t;t+=1)p=this.comp.threeDElements[t],p.container.style.transform=p.container.style.webkitTransform=this.mat.toCSS()}this.firstFrame=!1},HCameraElement.prototype.destroy=function(){};var animationManager=function(){function t(e){var s=0,r=e.target;for(r.removeEventListener("destroy",t);P>s;)v[s].animation===r&&(v.splice(s,1),s-=1,P-=1),s+=1}function e(e,s){if(!e)return null;for(var r=0;P>r;){if(v[r].elem==e&&null!==v[r].elem)return v[r].animation;r+=1}var i=new AnimationItem;return i.setData(e,s),i.addEventListener("destroy",t),v.push({elem:e,animation:i}),P+=1,i}function s(e){var s=new AnimationItem;return s.setParams(e),s.addEventListener("destroy",t),v.push({elem:null,animation:s}),P+=1,s}function r(t,e){var s;for(s=0;P>s;s+=1)v[s].animation.setSpeed(t,e)}function i(t,e){var s;for(s=0;P>s;s+=1)v[s].animation.setDirection(t,e)}function a(t){var e;for(e=0;P>e;e+=1)v[e].animation.play(t)}function n(t,e){E=!1,b=Date.now();var s;for(s=0;P>s;s+=1)v[s].animation.moveFrame(t,e)}function o(t){var e,s=t-b;for(e=0;P>e;e+=1)v[e].animation.advanceTime(s);b=t,requestAnimationFrame(o)}function h(t){b=t,requestAnimationFrame(o)}function l(t){var e;for(e=0;P>e;e+=1)v[e].animation.pause(t)}function p(t,e,s){var r;for(r=0;P>r;r+=1)v[r].animation.goToAndStop(t,e,s)}function m(t){var e;for(e=0;P>e;e+=1)v[e].animation.stop(t)}function f(t){var e;for(e=0;P>e;e+=1)v[e].animation.togglePause(t)}function d(t){var e;for(e=0;P>e;e+=1)v[e].animation.destroy(t)}function c(t,s,r){var i,a=document.getElementsByClassName("bodymovin"),n=a.length;for(i=0;n>i;i+=1)r&&a[i].setAttribute("data-bm-type",r),e(a[i],t);if(s&&0===n){r||(r="svg");var o=document.getElementsByTagName("body")[0];o.innerHTML="";var h=document.createElement("div");h.style.width="100%",h.style.height="100%",h.setAttribute("data-bm-type",r),o.appendChild(h),e(h,t)}}function u(){var t;for(t=0;P>t;t+=1)v[t].animation.resize()}function y(){requestAnimationFrame(h)}var g={},v=[],b=0,E=!0,P=0;return setTimeout(y,0),g.registerAnimation=e,g.loadAnimation=s,g.setSpeed=r,g.setDirection=i,g.play=a,g.moveFrame=n,g.pause=l,g.stop=m,g.togglePause=f,g.searchAnimations=c,g.resize=u,g.start=y,g.goToAndStop=p,g.destroy=d,g}(),AnimationItem=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.pendingElements=0,this.playCount=0,this.prerenderFramesFlag=!0,this.animationData={},this.layers=[],this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=randomString(10),this.scaleMode="fit",this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this.pendingSegment=!1,this.projectInterface=ProjectInterface()};AnimationItem.prototype.setParams=function(t){var e=this;t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var s=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(s){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;case"hybrid":case"html":default:this.renderer=new HybridRenderer(this,t.rendererSettings)}if(this.renderer.setProjectInterface(this.projectInterface),this.animType=s,""===t.loop||null===t.loop||(this.loop=t.loop===!1?!1:t.loop===!0?!0:parseInt(t.loop)),this.autoplay="autoplay"in t?t.autoplay:!0,this.name=t.name?t.name:"",this.prerenderFramesFlag="prerender"in t?t.prerender:!0,this.autoloadSegments=t.hasOwnProperty("autoloadSegments")?t.autoloadSegments:!0,t.animationData)e.configAnimation(t.animationData);else if(t.path){"json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json");var r=new XMLHttpRequest;this.path=-1!=t.path.lastIndexOf("\\")?t.path.substr(0,t.path.lastIndexOf("\\")+1):t.path.substr(0,t.path.lastIndexOf("/")+1),this.assetsPath=t.assetsPath,this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),r.open("GET",t.path,!0),r.send(),r.onreadystatechange=function(){if(4==r.readyState)if(200==r.status)e.configAnimation(JSON.parse(r.responseText));else try{var t=JSON.parse(r.responseText);e.configAnimation(t)}catch(s){}}}},AnimationItem.prototype.setData=function(t,e){var s={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},r=t.attributes;s.path=r.getNamedItem("data-animation-path")?r.getNamedItem("data-animation-path").value:r.getNamedItem("data-bm-path")?r.getNamedItem("data-bm-path").value:r.getNamedItem("bm-path")?r.getNamedItem("bm-path").value:"",s.animType=r.getNamedItem("data-anim-type")?r.getNamedItem("data-anim-type").value:r.getNamedItem("data-bm-type")?r.getNamedItem("data-bm-type").value:r.getNamedItem("bm-type")?r.getNamedItem("bm-type").value:r.getNamedItem("data-bm-renderer")?r.getNamedItem("data-bm-renderer").value:r.getNamedItem("bm-renderer")?r.getNamedItem("bm-renderer").value:"canvas";var i=r.getNamedItem("data-anim-loop")?r.getNamedItem("data-anim-loop").value:r.getNamedItem("data-bm-loop")?r.getNamedItem("data-bm-loop").value:r.getNamedItem("bm-loop")?r.getNamedItem("bm-loop").value:"";""===i||(s.loop="false"===i?!1:"true"===i?!0:parseInt(i));var a=r.getNamedItem("data-anim-autoplay")?r.getNamedItem("data-anim-autoplay").value:r.getNamedItem("data-bm-autoplay")?r.getNamedItem("data-bm-autoplay").value:r.getNamedItem("bm-autoplay")?r.getNamedItem("bm-autoplay").value:!0;s.autoplay="false"!==a,s.name=r.getNamedItem("data-name")?r.getNamedItem("data-name").value:r.getNamedItem("data-bm-name")?r.getNamedItem("data-bm-name").value:r.getNamedItem("bm-name")?r.getNamedItem("bm-name").value:"";var n=r.getNamedItem("data-anim-prerender")?r.getNamedItem("data-anim-prerender").value:r.getNamedItem("data-bm-prerender")?r.getNamedItem("data-bm-prerender").value:r.getNamedItem("bm-prerender")?r.getNamedItem("bm-prerender").value:"";"false"===n&&(s.prerender=!1),this.setParams(s)},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip),this.animationData.tf=this.totalFrames);var e,s,r=this.animationData.layers,i=r.length,a=t.layers,n=a.length;for(s=0;n>s;s+=1)for(e=0;i>e;){if(r[e].id==a[s].id){r[e]=a[s];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(i=t.assets.length,e=0;i>e;e+=1)this.animationData.assets.push(t.assets[e]);dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.renderFrame(null),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.animationData.tf);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var s=new XMLHttpRequest,r=this,i=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,s.open("GET",i,!0),s.send(),s.onreadystatechange=function(){if(4==s.readyState)if(200==s.status)r.includeLayers(JSON.parse(s.responseText));else try{var t=JSON.parse(s.responseText);r.includeLayers(t)}catch(e){}}},AnimationItem.prototype.loadSegments=function(){var t=this.animationData.segments;t||(this.timeCompleted=this.animationData.tf),this.loadNextSegment()},AnimationItem.prototype.configAnimation=function(t){this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.animationData.tf=this.totalFrames,this.renderer.configAnimation(t),t.assets||(t.assets=[]),t.comps&&(t.assets=t.assets.concat(t.comps),t.comps=null),this.renderer.searchExtraCompositions(t.assets),this.layers=this.animationData.layers,this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.imagePreloader=new ImagePreloader,this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(t.assets),this.loadSegments(),this.updaFrameModifier(),this.renderer.globalData.fontManager?this.waitForFontsLoaded():(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded())},AnimationItem.prototype.waitForFontsLoaded=function(){function t(){this.renderer.globalData.fontManager.loaded?(dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.checkLoaded()):setTimeout(t.bind(this),20)}return function(){t.bind(this)()}}(),AnimationItem.prototype.addPendingElement=function(){this.pendingElements+=1},AnimationItem.prototype.elementLoaded=function(){this.pendingElements--,this.checkLoaded()},AnimationItem.prototype.checkLoaded=function(){0===this.pendingElements&&(expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.isLoaded=!0,this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.setSubframe=function(t){this.subframeEnabled=t?!0:!1},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:Math.floor(this.currentRawFrame),this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){this.isLoaded!==!1&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||this.isPaused===!0&&(this.isPaused=!1)},AnimationItem.prototype.pause=function(t){t&&this.name!=t||this.isPaused===!1&&(this.isPaused=!0)},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(this.isPaused===!0?(this.isPaused=!1,this.play()):(this.isPaused=!0,this.pause()))},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.isPaused=!0,this.currentFrame=this.currentRawFrame=0,this.playCount=0,this.gotoFrame())},AnimationItem.prototype.goToAndStop=function(t,e,s){s&&this.name!=s||(this.setCurrentRawFrameValue(e?t:t*this.frameModifier),this.isPaused=!0)},AnimationItem.prototype.goToAndPlay=function(t,e,s){this.goToAndStop(t,e,s),this.play()},AnimationItem.prototype.advanceTime=function(t){return this.pendingSegment?(this.pendingSegment=!1,this.adjustSegment(this.segments.shift()),void(this.isPaused&&this.play())):void(this.isPaused!==!0&&this.isLoaded!==!1&&this.setCurrentRawFrameValue(this.currentRawFrame+t*this.frameModifier))},AnimationItem.prototype.updateAnimation=function(t){this.setCurrentRawFrameValue(this.totalFrames*t)},AnimationItem.prototype.moveFrame=function(t,e){e&&this.name!=e||this.setCurrentRawFrameValue(this.currentRawFrame+t)},AnimationItem.prototype.adjustSegment=function(t){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.01)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(0)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var s=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?s=t:this.currentRawFrame+this.firstFrame>e&&(s=e-t-.01)),this.firstFrame=t,this.totalFrames=e-t,-1!==s&&this.goToAndStop(s,!0)},AnimationItem.prototype.playSegments=function(t,e){if("object"==typeof t[0]){var s,r=t.length;for(s=0;r>s;s+=1)this.segments.push(t[s])}else this.segments.push(t);e&&this.adjustSegment(this.segments.shift()),this.isPaused&&this.play()},AnimationItem.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip*this.frameRate,Math.floor(this.animationData.op-this.animationData.ip+this.animationData.ip*this.frameRate)]),t&&this.adjustSegment(this.segments.shift())},AnimationItem.prototype.checkSegments=function(){this.segments.length&&(this.pendingSegment=!0)},AnimationItem.prototype.remove=function(t){t&&this.name!=t||this.renderer.destroy()},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||this.renderer&&this.renderer.destroyed||(this.renderer.destroy(),this.trigger("destroy"),this._cbs=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){if(this.currentRawFrame=t,this.currentRawFrame>=this.totalFrames){if(this.checkSegments(),this.loop===!1)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");if(this.trigger("loopComplete"),this.playCount+=1,this.loop!==!0&&this.playCount==this.loop||this.pendingSegment)return this.currentRawFrame=this.totalFrames-.01,this.gotoFrame(),this.pause(),void this.trigger("complete");this.currentRawFrame=this.currentRawFrame%this.totalFrames}else if(this.currentRawFrame<0)return this.checkSegments(),this.playCount-=1,this.playCount<0&&(this.playCount=0),this.loop===!1||this.pendingSegment?(this.currentRawFrame=0,this.gotoFrame(),this.pause(),void this.trigger("complete")):(this.trigger("loopComplete"),this.currentRawFrame=(this.totalFrames+this.currentRawFrame)%this.totalFrames,void this.gotoFrame());this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=0>t?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetsPath=function(t){var e="";if(this.assetsPath){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),e=this.assetsPath+s}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},AnimationItem.prototype.getAssetData=function(t){for(var e=0,s=this.assets.length;s>e;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getAssets=function(){return this.assets},AnimationItem.prototype.trigger=function(t){if(this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))},AnimationItem.prototype.addEventListener=_addEventListener,AnimationItem.prototype.removeEventListener=_removeEventListener,AnimationItem.prototype.triggerEvent=_triggerEvent;var Expressions=function(){function t(t){t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer.globalData.projectInterface.registerComposition(t.renderer)}var e={};return e.initExpressions=t,e}();expressionsPlugin=Expressions,function(){function t(){return this.pv}function e(t,e){var s,r,i=0,a=this.keyframes.length-1,n=1,o=!0;e=this.offsetTime||0;for(var h="object"==typeof this.pv?[this.pv.length]:0;o;){if(s=this.keyframes[i],r=this.keyframes[i+1],i==a-1&&t>=r.t-e){s.h&&(s=r);break}if(r.t-e>t)break;a-1>i?i+=n:o=!1}var l,p,m,f,d,c=0;if(s.to){s.bezierData||bez.buildBezierData(s);var u=s.bezierData;if(t>=r.t-e||t<s.t-e){var y=t>=r.t-e?u.points.length-1:0;for(p=u.points[y].point.length,l=0;p>l;l+=1)h[l]=u.points[y].point[l]}else{s.__fnct?d=s.__fnct:(d=BezierFactory.getBezierEasing(s.o.x,s.o.y,s.i.x,s.i.y,s.n).get,s.__fnct=d),m=d((t-(s.t-e))/(r.t-e-(s.t-e)));var g,v=u.segmentLength*m,b=0;for(n=1,o=!0,f=u.points.length;o;){if(b+=u.points[c].partialLength*n,0===v||0===m||c==u.points.length-1){for(p=u.points[c].point.length,l=0;p>l;l+=1)h[l]=u.points[c].point[l];break}if(v>=b&&v<b+u.points[c+1].partialLength){for(g=(v-b)/u.points[c+1].partialLength,p=u.points[c].point.length,l=0;p>l;l+=1)h[l]=u.points[c].point[l]+(u.points[c+1].point[l]-u.points[c].point[l])*g;break}f-1>c&&1==n||c>0&&-1==n?c+=n:o=!1}}}else{var E,P,k,S,C,x=!1;for(a=s.s.length,i=0;a>i;i+=1){if(1!==s.h&&(s.o.x instanceof Array?(x=!0,s.__fnct||(s.__fnct=[]),s.__fnct[i]||(E=s.o.x[i]||s.o.x[0],P=s.o.y[i]||s.o.y[0],k=s.i.x[i]||s.i.x[0],S=s.i.y[i]||s.i.y[0])):(x=!1,s.__fnct||(E=s.o.x,P=s.o.y,k=s.i.x,S=s.i.y)),x?s.__fnct[i]?d=s.__fnct[i]:(d=BezierFactory.getBezierEasing(E,P,k,S).get,s.__fnct[i]=d):s.__fnct?d=s.__fnct:(d=BezierFactory.getBezierEasing(E,P,k,S).get,s.__fnct=d),m=t>=r.t-e?1:t<s.t-e?0:d((t-(s.t-e))/(r.t-e-(s.t-e)))),this.sh&&1!==s.h){var M=s.s[i],D=s.e[i];-180>M-D?M+=360:M-D>180&&(M-=360),C=M+(D-M)*m}else C=1===s.h?s.s[i]:s.s[i]+(s.e[i]-s.s[i])*m;1===a?h=C:h[i]=C}}return h}function s(t){if(void 0!==this.vel)return this.vel;var e=.01;t*=this.elem.globalData.frameRate;var s,r=this.getValueAtTime(t),i=this.getValueAtTime(t+e);if(r.length){s=Array.apply(null,{length:r.length});var a;for(a=0;a<r.length;a+=1)s[a]=this.elem.globalData.frameRate*((i[a]-r[a])/e)}else s=(i-r)/e;return s}function r(t){this.propertyGroup=t}function i(t,e,s){e.x&&(s.k=!0,s.x=!0,s.getValue&&(s.getPreValue=s.getValue),s.getValue=ExpressionManager.initiateExpression.bind(s)(t,e,s))}var a=function(){function a(t,e){return this.textIndex=t+1,this.textTotal=e,this.getValue(),this.v}return function(n,o){this.pv=1,this.comp=n.comp,this.elem=n,this.mult=.01,this.type="textSelector",this.textTotal=o.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],i.bind(this)(n,o,this),this.getMult=a,this.getVelocityAtTime=s,this.getValueAtTime=this.kf?e:t,this.setGroupProperty=r}}(),n=PropertyFactory.getProp;PropertyFactory.getProp=function(a,o,h,l,p){var m=n(a,o,h,l,p);m.getVelocityAtTime=s,m.getValueAtTime=m.kf?e:t,m.setGroupProperty=r;var f=m.k;return void 0!==o.ix&&Object.defineProperty(m,"propertyIndex",{get:function(){return o.ix}}),i(a,o,m),!f&&m.x&&p.push(m),m};var o=ShapePropertyFactory.getShapeProp;ShapePropertyFactory.getShapeProp=function(t,e,s,i,a){var n=o(t,e,s,i,a),h="tm"===n.ty?n.prop:n;return h.setGroupProperty=r,void 0!==e.ix&&Object.defineProperty(h,"propertyIndex",{get:function(){return e.ix}}),n};var h=PropertyFactory.getTextSelectorProp;PropertyFactory.getTextSelectorProp=function(t,e,s){return 1===e.t?new a(t,e,s):h(t,e,s)}}();var ExpressionManager=function(){function duplicatePropertyValue(t){if("number"==typeof t)return t;if(t.i)return JSON.parse(JSON.stringify(t));var e,s=Array.apply(null,{length:t.length}),r=t.length;for(e=0;r>e;e+=1)s[e]=t[e];return s}function $bm_neg(t){var e=typeof t;if("number"===e||"boolean"===e)return-t;if("object"===e){var s,r=t.length,i=[];for(s=0;r>s;s+=1)i[s]=-t[s];return i}}function sum(t,e){var s=typeof t,r=typeof e;if("string"===s||"string"===r)return t+e;if(!("number"!==s&&"boolean"!==s||"number"!==r&&"boolean"!==r))return t+e;if("object"===s&&("number"===r||"boolean"===r))return t[0]=t[0]+e,t;if(("number"===s||"boolean"===s)&&"object"===r)return e[0]=t+e[0],e;if("object"===s&&"object"===r){for(var i=0,a=t.length,n=e.length,o=[];a>i||n>i;)o[i]="number"==typeof t[i]&&"number"==typeof e[i]?t[i]+e[i]:void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function sub(t,e){var s=typeof t,r=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==r&&"boolean"!==r))return t-e;if("object"===s&&("number"===r||"boolean"===r))return t[0]=t[0]-e,t;if(("number"===s||"boolean"===s)&&"object"===r)return e[0]=t-e[0],e;if("object"===s&&"object"===r){for(var i=0,a=t.length,n=e.length,o=[];a>i||n>i;)o[i]="number"==typeof t[i]&&"number"==typeof e[i]?t[i]-e[i]:void 0==e[i]?t[i]:t[i]||e[i],i+=1;return o}return 0}function mul(t,e){var s=typeof t,r=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==r&&"boolean"!==r))return t*e;var i,a;if("object"===s&&("number"===r||"boolean"===r)){for(a=t.length,arr=Array.apply(null,{length:a}),i=0;a>i;i+=1)arr[i]=t[i]*e;return arr}if(("number"===s||"boolean"===s)&&"object"===r){for(a=e.length,arr=Array.apply(null,{length:a}),i=0;a>i;i+=1)arr[i]=t*e[i];return arr}return 0}function div(t,e){var s=typeof t,r=typeof e;if(!("number"!==s&&"boolean"!==s||"number"!==r&&"boolean"!==r))return t/e;var i,a;if("object"===s&&("number"===r||"boolean"===r)){for(a=t.length,arr=Array.apply(null,{length:a}),i=0;a>i;i+=1)arr[i]=t[i]/e;return arr}if(("number"===s||"boolean"===s)&&"object"===r){for(a=e.length,arr=Array.apply(null,{length:a}),i=0;a>i;i+=1)arr[i]=t/e[i];return arr}return 0}function clamp(t,e,s){if(e>s){var r=s;s=e,e=r}return Math.min(Math.max(t,e),s)}function radiansToDegrees(t){return t/degToRads}function degreesToRadians(t){return t*degToRads}function length(t,e){e||(e=helperLengthArray);var s,r=Math.min(t.length,e.length),i=0;for(s=0;r>s;s+=1)i+=Math.pow(e[s]-t[s],2);return Math.sqrt(i)}function rgbToHsl(t){var e,s,r=t[0],i=t[1],a=t[2],n=Math.max(r,i,a),o=Math.min(r,i,a),h=(n+o)/2;if(n==o)e=s=0;else{var l=n-o;switch(s=h>.5?l/(2-n-o):l/(n+o),n){case r:e=(i-a)/l+(a>i?6:0);break;case i:e=(a-r)/l+2;break;case a:e=(r-i)/l+4}e/=6}return[e,s,h,t[3]]}function hslToRgb(t){function e(t,e,s){return 0>s&&(s+=1),s>1&&(s-=1),1/6>s?t+6*(e-t)*s:.5>s?e:2/3>s?t+(e-t)*(2/3-s)*6:t}var s,r,i,a=t[0],n=t[1],o=t[2];if(0==n)s=r=i=o;else{var h=.5>o?o*(1+n):o+n-o*n,l=2*o-h;s=e(l,h,a+1/3),r=e(l,h,a),i=e(l,h,a-1/3)}return[s,r,i,t[3]]}function linear(t,e,s,r,i){if(void 0===r||void 0===i)return linear(t,0,1,e,s);if(e>=t)return r;if(t>=s)return i;var a=s===e?0:t/(s-e);if(!r.length)return r+(i-r)*a;var n,o=r.length,h=Array.apply(null,{length:o});for(n=0;o>n;n+=1)h[n]=r[n]+(i[n]-r[n])*a;return h}function seedRandom(t){BMMath.seedrandom(t)}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var s,r=e.length;t||(t=Array.apply(null,{length:r}));var i=Array.apply(null,{length:r}),a=BMMath.random();for(s=0;r>s;s+=1)i[s]=t[s]+a*(e[s]-t[s]);return i}void 0===t&&(t=0);var n=BMMath.random();return t+n*(e-t)}function initiateExpression(elem,data,property){function lookAt(t,e){var s=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],r=Math.atan2(s[0],Math.sqrt(s[1]*s[1]+s[2]*s[2]))/degToRads,i=-Math.atan2(s[1],s[2])/degToRads;return[i,r,0]}function easeOut(t,e,s){return-(s-e)*t*(t-2)+e}function nearestKey(t){var e,s,r,i=data.k.length;if(data.k.length&&"number"!=typeof data.k[0]){for(s=-1,t*=elem.comp.globalData.frameRate,e=0;i-1>e;e+=1){if(t===data.k[e].t){s=e+1,r=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){t-data.k[e].t>data.k[e+1].t-t?(s=e+2,r=data.k[e+1].t):(s=e+1,r=data.k[e].t);break}}-1===s&&(s=e+1,r=data.k[e].t)}else s=0,r=0;var a={};return a.index=s,a.time=r/elem.comp.globalData.frameRate,a}function key(t){if(!data.k.length||"number"==typeof data.k[0])return{time:0};t-=1;var e,s={time:data.k[t].t/elem.comp.globalData.frameRate};e=t===data.k.length-1?data.k[t-1].e:data.k[t].s;var r,i=e.length;for(r=0;i>r;r+=1)s[r]=e[r];return s}function framesToTime(t,e){return e||(e=elem.comp.globalData.frameRate),t/e}function timeToFrames(t,e){return t||(t=time),e||(e=elem.comp.globalData.frameRate),t*e}function execute(){if(this.frameExpressionId!==elem.globalData.frameId||"textSelector"===this.type){if(this.lock)return this.v=duplicatePropertyValue(this.pv),!0;"textSelector"===this.type&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),transform||(transform=elem.transform),thisLayer||(thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),hasParent=!(!elem.hierarchy||!elem.hierarchy.length),hasParent&&!parent&&(parent=elem.hierarchy[elem.hierarchy.length-1].layerInterface),this.lock=!0,this.getPreValue&&this.getPreValue(),value=this.pv,time=this.comp.renderedFrame/this.comp.globalData.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),bindedFn(),this.frameExpressionId=elem.globalData.frameId;var t,e;if(this.mult)if("number"==typeof this.v)this.v*=this.mult;else for(e=this.v.length,value===this.v&&(this.v=2===e?[value[0],value[1]]:[value[0],value[1],value[2]]),t=0;e>t;t+=1)this.v[t]*=this.mult;if("number"==typeof this.v)this.lastValue!==this.v&&(this.lastValue=this.v,this.mdf=!0);else if(this.v.i)this.mdf=!0;else for(e=this.v.length,t=0;e>t;t+=1)this.v[t]!==this.lastValue[t]&&(this.lastValue[t]=this.v[t],this.mdf=!0);this.lock=!1}}var val=data.x,needsVelocity=-1!==val.indexOf("velocity"),elemType=elem.data.ty,transform,content,effect,thisComp=elem.comp,thisProperty=property;elem.comp.frameDuration=1/elem.comp.globalData.frameRate;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,thisLayer,thisComp,fnStr="var fn = function(){"+val+";this.v = $bm_rt;}";eval(fnStr);var bindedFn=fn.bind(this),numKeys=data.k?data.k.length:0,wiggle=function(t,e){var s,r,i=this.pv.length?this.pv.length:1,a=Array.apply(null,{len:i});for(r=0;i>r;r+=1)a[r]=0;t=5;var n=Math.floor(time*t);for(s=0,r=0;n>s;){for(r=0;i>r;r+=1)a[r]+=-e+2*e*BMMath.random();s+=1}var o=time*t,h=o-Math.floor(o),l=Array.apply({length:i});for(r=0;i>r;r+=1)l[r]=this.pv[r]+a[r]+(-e+2*e*BMMath.random())*h;return l}.bind(this),loopIn=function(t,e,s){if(!this.k)return this.pv;

        var r=time*elem.comp.globalData.frameRate,i=this.keyframes,a=i[0].t;if(r>=a)return this.pv;var n,o;s?(n=e?Math.abs(elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-a),o=a+n):((!e||e>i.length-1)&&(e=i.length-1),o=i[e].t,n=o-a);var h,l,p;if("pingpong"===t){var m=Math.floor((a-r)/n);if(m%2===0)return this.getValueAtTime((a-r)%n+a)}else{if("offset"===t){var f=this.getValueAtTime(a),d=this.getValueAtTime(o),c=this.getValueAtTime(n-(a-r)%n+a),u=Math.floor((a-r)/n)+1;if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=c[h]-(d[h]-f[h])*u;return p}return c-(d-f)*u}if("continue"===t){var y=this.getValueAtTime(a),g=this.getValueAtTime(a+.001);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-g[h])*(a-r)/5e-4;return p}return y+(y-g)*(a-r)/5e-4}}return this.getValueAtTime(n-(a-r)%n+a)}.bind(this),loopInDuration=function(t,e){return loopIn(t,e,!0)}.bind(this),loopOut=function(t,e,s){if(!this.k)return this.pv;var r=time*elem.comp.globalData.frameRate,i=this.keyframes,a=i[i.length-1].t;if(a>=r)return this.pv;var n,o;s?(n=e?Math.abs(a-elem.comp.globalData.frameRate*e):Math.max(0,a-this.elem.data.ip),o=a-n):((!e||e>i.length-1)&&(e=i.length-1),o=i[i.length-1-e].t,n=a-o);var h,l,p;if("pingpong"===t){var m=Math.floor((r-o)/n);if(m%2!==0)return this.getValueAtTime(n-(r-o)%n+o)}else{if("offset"===t){var f=this.getValueAtTime(o),d=this.getValueAtTime(a),c=this.getValueAtTime((r-o)%n+o),u=Math.floor((r-o)/n);if(this.pv.length){for(p=new Array(f.length),l=p.length,h=0;l>h;h+=1)p[h]=(d[h]-f[h])*u+c[h];return p}return(d-f)*u+c}if("continue"===t){var y=this.getValueAtTime(a),g=this.getValueAtTime(a-.001);if(this.pv.length){for(p=new Array(y.length),l=p.length,h=0;l>h;h+=1)p[h]=y[h]+(y[h]-g[h])*(r-a)/5e-4;return p}return y+(y-g)*(r-a)/5e-4}}return this.getValueAtTime((r-o)%n+o)}.bind(this),loop_out=loopOut,loopOutDuration=function(t,e){return loopOut(t,e,!0)}.bind(this),valueAtTime=function(t){return this.getValueAtTime(t*elem.comp.globalData.frameRate)}.bind(this),velocityAtTime=function(t){return this.getVelocityAtTime(t)}.bind(this),comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface),time,velocity,value,textIndex,textTotal,selectorValue,index=elem.data.ind+1,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent;return execute}var ob={},Math=BMMath,radians_to_degrees=radiansToDegrees,degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];return ob.initiateExpression=initiateExpression,ob}(),ShapeExpressionInterface=function(){function t(t,e,s){return m(t,e,s)}function e(t,e,s){return d(t,e,s)}function s(t,e,s){return c(t,e,s)}function r(t,e,s){return u(t,e,s)}function i(t,e,s){return y(t,e,s)}function a(t,e,s){return g(t,e,s)}function n(t,e,s){return v(t,e,s)}function o(t,e,s){return b(t,e,s)}function h(t,e,s){return E(t,e,s)}function l(t,e,s){var r,i=[],a=t?t.length:0;for(r=0;a>r;r+=1)"gr"==t[r].ty?i.push(ShapeExpressionInterface.createGroupInterface(t[r],e[r],s)):"fl"==t[r].ty?i.push(ShapeExpressionInterface.createFillInterface(t[r],e[r],s)):"st"==t[r].ty?i.push(ShapeExpressionInterface.createStrokeInterface(t[r],e[r],s)):"tm"==t[r].ty?i.push(ShapeExpressionInterface.createTrimInterface(t[r],e[r],s)):"tr"==t[r].ty||("el"==t[r].ty?i.push(ShapeExpressionInterface.createEllipseInterface(t[r],e[r],s)):"sr"==t[r].ty?i.push(ShapeExpressionInterface.createStarInterface(t[r],e[r],s)):"sh"==t[r].ty&&i.push(ShapeExpressionInterface.createPathInterface(t[r],e[r],s)));return i}var p={createShapeInterface:t,createGroupInterface:e,createTrimInterface:i,createStrokeInterface:r,createTransformInterface:a,createEllipseInterface:n,createStarInterface:o,createPathInterface:h,createFillInterface:s},m=function(){return function(t,e,s){function r(t){if("number"==typeof t)return i[t-1];for(var e=0,s=i.length;s>e;){if(i[e]._name===t)return i[e];e+=1}}var i;return r.propertyGroup=s,i=l(t,e,r),r}}(),f=function(){return function(t,e,s){var r,i=function(t){if("number"==typeof t)return r[t-1];for(var e=0,s=r.length;s>e;){if(r[e]._name===t)return r[e];e+=1}};return i.propertyGroup=function(t){return 1===t?i:s(t-1)},r=l(t.it,e.it,i.propertyGroup),i}}(),d=function(){return function(t,e,s){var r=function(t){switch(t){case"ADBE Vectors Group":case 2:return r.content;case"ADBE Vector Transform Group":case 3:default:return r.transform}};r.propertyGroup=function(t){return 1===t?r:s(t-1)};var i=f(t,e,r.propertyGroup),a=ShapeExpressionInterface.createTransformInterface(t.it[t.it.length-1],e.it[e.it.length-1],r.propertyGroup);return r.content=i,r.transform=a,Object.defineProperty(r,"_name",{get:function(){return t.nm}}),r.nm=t.nm,r}}(),c=function(){return function(t,e,s){e.c.setGroupProperty(s),e.o.setGroupProperty(s);var r={get color(){return e.c.k&&e.c.getValue(),[e.c.v[0]/e.c.mult,e.c.v[1]/e.c.mult,e.c.v[2]/e.c.mult,1]},get opacity(){return e.o.k&&e.o.getValue(),e.o.v},_name:t.nm};return r}}(),u=function(){return function(t,e,s){function r(t){return 1===t?i:s(t-1)}e.c.setGroupProperty(r),e.o.setGroupProperty(r),e.w.setGroupProperty(r);var i={get color(){return e.c.k&&e.c.getValue(),[e.c.v[0]/e.c.mult,e.c.v[1]/e.c.mult,e.c.v[2]/e.c.mult,1]},get opacity(){return e.o.k&&e.o.getValue(),e.o.v},get strokeWidth(){return e.w.k&&e.w.getValue(),e.w.v},dashOb:{},get dash(){var r,i=e.d,a=t.d,n=a.length;for(r=0;n>r;r+=1)i.dataProps[r].p.k&&i.dataProps[r].p.getValue(),i.dataProps[r].p.setGroupProperty(s),this.dashOb[a[r].nm]=i.dataProps[r].p.v;return this.dashOb},_name:t.nm};return i}}(),y=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return e===t.e.ix?i.end:e===t.s.ix?i.start:e===t.o.ix?i.offset:void 0}return r.propertyIndex=t.ix,e.s.setGroupProperty(r),e.e.setGroupProperty(r),e.o.setGroupProperty(r),i.propertyIndex=t.ix,Object.defineProperty(i,"start",{get:function(){return e.s.k&&e.s.getValue(),e.s.v/e.s.mult}}),Object.defineProperty(i,"end",{get:function(){return e.e.k&&e.e.getValue(),e.e.v/e.e.mult}}),Object.defineProperty(i,"offset",{get:function(){return e.o.k&&e.o.getValue(),e.o.v}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i}}(),g=function(){return function(t,e,s){function r(t){return 1==t?i:s(--t)}function i(e){return t.a.ix===e?i.anchorPoint:t.o.ix===e?i.opacity:t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.s.ix===e?i.scale:t.sk&&t.sk.ix===e?i.skew:t.sa&&t.sa.ix===e?i.skewAxis:void 0}e.transform.mProps.o.setGroupProperty(r),e.transform.mProps.p.setGroupProperty(r),e.transform.mProps.a.setGroupProperty(r),e.transform.mProps.s.setGroupProperty(r),e.transform.mProps.r.setGroupProperty(r),e.transform.mProps.sk&&(e.transform.mProps.sk.setGroupProperty(r),e.transform.mProps.sa.setGroupProperty(r)),e.transform.op.setGroupProperty(r),Object.defineProperty(i,"opacity",{get:function(){return e.transform.mProps.o.k&&e.transform.mProps.o.getValue(),e.transform.mProps.o.v/e.transform.mProps.o.mult}}),Object.defineProperty(i,"position",{get:function(){return e.transform.mProps.p.k&&e.transform.mProps.p.getValue(),[e.transform.mProps.p.v[0],e.transform.mProps.p.v[1]]}}),Object.defineProperty(i,"anchorPoint",{get:function(){return e.transform.mProps.a.k&&e.transform.mProps.a.getValue(),[e.transform.mProps.a.v[0],e.transform.mProps.a.v[1]]}});var a=[];return Object.defineProperty(i,"scale",{get:function(){return e.transform.mProps.s.k&&e.transform.mProps.s.getValue(),a[0]=e.transform.mProps.s.v[0]/e.transform.mProps.s.mult,a[1]=e.transform.mProps.s.v[1]/e.transform.mProps.s.mult,a}}),Object.defineProperty(i,"rotation",{get:function(){return e.transform.mProps.r.k&&e.transform.mProps.r.getValue(),e.transform.mProps.r.v/e.transform.mProps.r.mult}}),Object.defineProperty(i,"skew",{get:function(){return e.transform.mProps.sk.k&&e.transform.mProps.sk.getValue(),e.transform.mProps.sk.v}}),Object.defineProperty(i,"skewAxis",{get:function(){return e.transform.mProps.sa.k&&e.transform.mProps.sa.getValue(),e.transform.mProps.sa.v}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i.ty="tr",i}}(),v=function(){return function(t,e,s){function r(t){return 1==t?r:s(--t)}function i(e){return t.p.ix===e?i.position:t.s.ix===e?i.size:void 0}r.propertyIndex=t.ix;var a="tm"===e.sh.ty?e.sh.prop:e.sh;return a.s.setGroupProperty(r),a.p.setGroupProperty(r),Object.defineProperty(i,"size",{get:function(){return a.s.k&&a.s.getValue(),[a.s.v[0],a.s.v[1]]}}),Object.defineProperty(i,"position",{get:function(){return a.p.k&&a.p.getValue(),[a.p.v[0],a.p.v[1]]}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i}}(),b=function(){return function(t,e,s){function r(t){return 1==t?r:s(--t)}function i(e){return t.p.ix===e?i.position:t.r.ix===e?i.rotation:t.pt.ix===e?i.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?i.outerRadius:t.os.ix===e?i.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?i.innerRoundness:void 0:i.innerRadius}var a="tm"===e.sh.ty?e.sh.prop:e.sh;return r.propertyIndex=t.ix,a.or.setGroupProperty(r),a.os.setGroupProperty(r),a.pt.setGroupProperty(r),a.p.setGroupProperty(r),a.r.setGroupProperty(r),t.ir&&(a.ir.setGroupProperty(r),a.is.setGroupProperty(r)),Object.defineProperty(i,"position",{get:function(){return a.p.k&&a.p.getValue(),a.p.v}}),Object.defineProperty(i,"rotation",{get:function(){return a.r.k&&a.r.getValue(),a.r.v/a.r.mult}}),Object.defineProperty(i,"points",{get:function(){return a.pt.k&&a.pt.getValue(),a.pt.v}}),Object.defineProperty(i,"outerRadius",{get:function(){return a.or.k&&a.or.getValue(),a.or.v}}),Object.defineProperty(i,"outerRoundness",{get:function(){return a.os.k&&a.os.getValue(),a.os.v/a.os.mult}}),Object.defineProperty(i,"innerRadius",{get:function(){return a.ir?(a.ir.k&&a.ir.getValue(),a.ir.v):0}}),Object.defineProperty(i,"innerRoundness",{get:function(){return a.is?(a.is.k&&a.is.getValue(),a.is.v/a.is.mult):0}}),Object.defineProperty(i,"_name",{get:function(){return t.nm}}),i}}(),E=function(){return function(t,e,s){var r="tm"===e.sh.ty?e.sh.prop:e.sh;r.setGroupProperty(s);var i={get shape(){return r.k&&r.getValue(),r.v},get path(){return r.k&&r.getValue(),r.v},_name:t.nm};return i}}();return p}(),LayerExpressionInterface=function(){function t(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var s,r=this._elem.hierarchy.length;for(s=0;r>s;s+=1)this._elem.hierarchy[s].finalTransform.mProp.applyToMatrix(e);return e.applyToPointArray(t[0],t[1],t[2]||0)}return e.applyToPointArray(t[0],t[1],t[2]||0)}return function(e){function s(t){i.mask=t.getMask.bind(t)}function r(t){i.effect=t}function i(t){switch(t){case"ADBE Root Vectors Group":case 2:return i.shapeInterface;case"Transform":case"transform":case"ADBE Transform Group":return a;case 4:return i.effect}}var a=TransformExpressionInterface(e.transform);return i.toWorld=t,i.toComp=t,i._elem=e,Object.defineProperty(i,"hasParent",{get:function(){return!!e.hierarchy}}),Object.defineProperty(i,"parent",{get:function(){return e.hierarchy[0].layerInterface}}),Object.defineProperty(i,"rotation",{get:function(){return a.rotation}}),Object.defineProperty(i,"scale",{get:function(){return a.scale}}),Object.defineProperty(i,"position",{get:function(){return a.position}}),Object.defineProperty(i,"anchorPoint",{get:function(){return a.anchorPoint}}),Object.defineProperty(i,"transform",{get:function(){return a}}),Object.defineProperty(i,"_name",{value:e.data.nm}),Object.defineProperty(i,"content",{get:function(){return i.shapeInterface}}),i.active=!0,i.registerMaskInterface=s,i.registerEffectsInterface=r,i}}(),CompExpressionInterface=function(){return function(t){function e(e){for(var s=0,r=t.layers.length;r>s;){if(t.layers[s].nm===e)return t.elements[s].layerInterface;s+=1}}return e.layer=e,e.pixelAspect=1,e.height=t.globalData.compSize.h,e.width=t.globalData.compSize.w,e.pixelAspect=1,e.frameDuration=1/t.globalData.frameRate,e}}(),TransformExpressionInterface=function(){return function(t){function e(s){switch(s){case"scale":case"Scale":case"ADBE Scale":return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":return e.rotation;case"position":case"Position":case"ADBE Position":return t.position;case"anchorPoint":case"AnchorPoint":case"ADBE AnchorPoint":return e.anchorPoint}}return Object.defineProperty(e,"rotation",{get:function(){return t.rotation}}),Object.defineProperty(e,"scale",{get:function(){var e,s=t.scale,r=s.length,i=Array.apply(null,{length:r});for(e=0;r>e;e+=1)i[e]=100*s[e];return i}}),Object.defineProperty(e,"position",{get:function(){return t.position}}),Object.defineProperty(e,"anchorPoint",{get:function(){return t.anchorPoint}}),e}}(),ProjectInterface=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,s=this.compositions.length;s>e;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),EffectsExpressionInterface=function(){function t(t,s){if(t.effects){var r,i=[],a=t.data.ef,n=t.effects.effectElements.length;for(r=0;n>r;r+=1)i.push(e(a[r],t.effects.effectElements[r],s));return function(e){for(var s=t.data.ef,r=0,a=s.length;a>r;){if(e===s[r].nm||e===s[r].ix)return i[r];r+=1}}}}function e(t,r,i){var a,n=[],o=t.ef.length;for(a=0;o>a;a+=1)n.push(5===t.ef.ty?e(t.ef[a],r.effectElements[a],i):s(r.effectElements[a]));return function(e){for(var s=t.ef,r=0,i=s.length;i>r;){if(e===s[r].nm||e===s[r].mn||e===s[r].ix)return 5===s[r].ty?n[r]:n[r]();r+=1}return n[0]()}}function s(t){return function(){if(t.p.k&&t.p.getValue(),"number"==typeof t.p.v)return t.p.v;var e,s=t.p.v.length,r=Array.apply(null,{length:s});for(e=0;s>e;e+=1)r[e]=t.p.v[e];return r}}var r={createEffectsInterface:t};return r}();GroupEffect.prototype.getValue=function(){this.mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;e>t;t+=1)this.dynamicProperties[t].getValue(),this.mdf=this.dynamicProperties[t].mdf?!0:this.mdf},GroupEffect.prototype.init=function(t,e,s){this.data=t,this.mdf=!1,this.effectElements=[];var r,i,a=this.data.ef.length,n=this.data.ef;for(r=0;a>r;r+=1)switch(n[r].ty){case 0:i=new SliderEffect(n[r],e,s),this.effectElements.push(i);break;case 1:i=new AngleEffect(n[r],e,s),this.effectElements.push(i);break;case 2:i=new ColorEffect(n[r],e,s),this.effectElements.push(i);break;case 3:i=new PointEffect(n[r],e,s),this.effectElements.push(i);break;case 4:case 7:i=new CheckboxEffect(n[r],e,s),this.effectElements.push(i);break;case 5:i=new EffectsManager(n[r],e,s),this.effectElements.push(i);break;case 6:i=new NoValueEffect(n[r],e,s),this.effectElements.push(i)}};var bodymovinjs = {}; function play(animation){ animationManager.play(animation); } function pause(animation){ animationManager.pause(animation); } function togglePause(animation){ animationManager.togglePause(animation); } function setSpeed(value,animation){ animationManager.setSpeed(value, animation); } function setDirection(value,animation){ animationManager.setDirection(value, animation); } function stop(animation){ animationManager.stop(animation); } function moveFrame(value){ animationManager.moveFrame(value); } function searchAnimations(){ if(standalone === true){ animationManager.searchAnimations(animationData,standalone, renderer); }else{ animationManager.searchAnimations(); } } function registerAnimation(elem){ return animationManager.registerAnimation(elem); } function resize(){ animationManager.resize(); } function start(){ animationManager.start(); } function goToAndStop(val,isFrame, animation){ animationManager.goToAndStop(val,isFrame, animation); } function setSubframeRendering(flag){ subframeEnabled = flag; } function loadAnimation(params){ if(standalone === true){ params.animationData = JSON.parse(animationData); } return animationManager.loadAnimation(params); } function destroy(animation){ return animationManager.destroy(animation); } function setQuality(value){ if(typeof value === 'string'){ switch(value){ case 'high': defaultCurveSegments = 200; break; case 'medium': defaultCurveSegments = 50; break; case 'low': defaultCurveSegments = 10; break; } }else if(!isNaN(value) && value > 1){ defaultCurveSegments = value; } if(defaultCurveSegments >= 50){ roundValues(false); }else{ roundValues(true); } } function installPlugin(type,plugin){ if(type==='expressions'){ expressionsPlugin = plugin; } } function getFactory(name){ switch(name){ case "propertyFactory": return PropertyFactory;case "shapePropertyFactory": return ShapePropertyFactory; case "matrix": return Matrix; } } bodymovinjs.play = play; bodymovinjs.pause = pause; bodymovinjs.togglePause = togglePause; bodymovinjs.setSpeed = setSpeed; bodymovinjs.setDirection = setDirection; bodymovinjs.stop = stop; bodymovinjs.moveFrame = moveFrame; bodymovinjs.searchAnimations = searchAnimations; bodymovinjs.registerAnimation = registerAnimation; bodymovinjs.loadAnimation = loadAnimation; bodymovinjs.setSubframeRendering = setSubframeRendering; bodymovinjs.resize = resize; bodymovinjs.start = start; bodymovinjs.goToAndStop = goToAndStop; bodymovinjs.destroy = destroy; bodymovinjs.setQuality = setQuality; bodymovinjs.installPlugin = installPlugin; bodymovinjs.__getFactory = getFactory; bodymovinjs.version = '4.4.14'; function checkReady(){ if (document.readyState === "complete") { clearInterval(readyStateCheckInterval); searchAnimations(); } } function getQueryVariable(variable) { var vars = queryString.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); if (decodeURIComponent(pair[0]) == variable) { return decodeURIComponent(pair[1]); } } } var standalone = '__[STANDALONE]__'; var animationData = '__[ANIMATIONDATA]__'; var renderer = ''; if(standalone) { var scripts = document.getElementsByTagName('script'); var index = scripts.length - 1; var myScript = scripts[index]; var queryString = myScript.src.replace(/^[^\?]+\??/,''); renderer = getQueryVariable('renderer'); } var readyStateCheckInterval = setInterval(checkReady, 100); return bodymovinjs; }));
</script>
<div id="bodymovin"></div>

<script>
    var animationData = "__[[ANIMATIONDATA]]__";
    var params = {
        container: document.getElementById('bodymovin'),
        renderer: '__[[RENDERER]]__',
        loop: true,
        autoplay: true,
        animationData: animationData
    };

    var anim;

    anim = bodymovin.loadAnimation(params);

</script>
</body>
</html>
